aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/contrib
diff options
context:
space:
mode:
Diffstat (limited to 'contrib')
-rw-r--r--contrib/dmenu/README.md7
-rwxr-xr-xcontrib/dmenu/passmenu16
-rw-r--r--contrib/emacs/CHANGELOG.md31
-rw-r--r--contrib/emacs/Cask4
-rw-r--r--contrib/emacs/README.md8
-rw-r--r--contrib/emacs/password-store.el164
-rw-r--r--contrib/vim/redact_pass.vim7
7 files changed, 171 insertions, 66 deletions
diff --git a/contrib/dmenu/README.md b/contrib/dmenu/README.md
index 9d54fb4..8a196cb 100644
--- a/contrib/dmenu/README.md
+++ b/contrib/dmenu/README.md
@@ -4,6 +4,10 @@ clipboard without having to open up a terminal window if you don't already have
one open. If `--type` is specified, the password is typed using [xdotool][]
instead of copied to the clipboard.
+On wayland [dmenu-wl][] is used to replace dmenu and [ydotool][] to replace xdotool.
+Note that the latter requires access to the [uinput][] device, so you'll probably
+need to add an extra udev rule or similar to give certain non-root users permission.
+
# Usage
passmenu [--type] [dmenu arguments...]
@@ -11,3 +15,6 @@ instead of copied to the clipboard.
[dmenu]: http://tools.suckless.org/dmenu/
[xdotool]: http://www.semicomplete.com/projects/xdotool/
[pass]: http://www.zx2c4.com/projects/password-store/
+[dmenu-wl]: https://github.com/nyyManni/dmenu-wayland
+[ydotool]: https://github.com/ReimuNotMoe/ydotool
+[uinput]: https://www.kernel.org/doc/html/v4.12/input/uinput.html
diff --git a/contrib/dmenu/passmenu b/contrib/dmenu/passmenu
index 83268bc..76d92ab 100755
--- a/contrib/dmenu/passmenu
+++ b/contrib/dmenu/passmenu
@@ -8,18 +8,28 @@ if [[ $1 == "--type" ]]; then
shift
fi
+if [[ -n $WAYLAND_DISPLAY ]]; then
+ dmenu=dmenu-wl
+ xdotool="ydotool type --file -"
+elif [[ -n $DISPLAY ]]; then
+ dmenu=dmenu
+ xdotool="xdotool type --clearmodifiers --file -"
+else
+ echo "Error: No Wayland or X11 display detected" >&2
+ exit 1
+fi
+
prefix=${PASSWORD_STORE_DIR-~/.password-store}
password_files=( "$prefix"/**/*.gpg )
password_files=( "${password_files[@]#"$prefix"/}" )
password_files=( "${password_files[@]%.gpg}" )
-password=$(printf '%s\n' "${password_files[@]}" | dmenu "$@")
+password=$(printf '%s\n' "${password_files[@]}" | "$dmenu" "$@")
[[ -n $password ]] || exit
if [[ $typeit -eq 0 ]]; then
pass show -c "$password" 2>/dev/null
else
- pass show "$password" | { IFS= read -r pass; printf %s "$pass"; } |
- xdotool type --clearmodifiers --file -
+ pass show "$password" | { IFS= read -r pass; printf %s "$pass"; } | $xdotool
fi
diff --git a/contrib/emacs/CHANGELOG.md b/contrib/emacs/CHANGELOG.md
index 3217015..e15414f 100644
--- a/contrib/emacs/CHANGELOG.md
+++ b/contrib/emacs/CHANGELOG.md
@@ -1,3 +1,34 @@
+# 2.3.2
+
+* (bugfix) Ensure the system clipboard is cleared after
+ the timeout expired.
+
+# 2.3.1
+
+* (bug) Drop dependency on s library.
+
+# 2.3.0
+
+* (bug) Drop auth-source-pass dependency.
+ Bump Emacs minor version requirement to emacs 26.
+
+# 2.2.0
+
+* (feature) Add command password-store-generate-no-symbols
+
+# 2.1.5
+
+* (bugfix) Fix an infloop on Windows enviroments.
+
+# 2.1.4
+
+* Drop dependency on f library.
+
+# 2.1.3
+
+* Update password-store-clear docstring; clarify that the
+ optional argument is only used in the print out message.
+
# 2.1.2
* Make argument optional in password-store-clear to preserve
diff --git a/contrib/emacs/Cask b/contrib/emacs/Cask
index f46b166..1d8ce9f 100644
--- a/contrib/emacs/Cask
+++ b/contrib/emacs/Cask
@@ -4,9 +4,7 @@
(package-file "password-store.el")
(development
- (depends-on "f")
(depends-on "with-editor")
(depends-on "ecukes")
(depends-on "ert-runner")
- (depends-on "el-mock")
- (depends-on "auth-source-pass"))
+ (depends-on "el-mock"))
diff --git a/contrib/emacs/README.md b/contrib/emacs/README.md
index d3679e9..8269c35 100644
--- a/contrib/emacs/README.md
+++ b/contrib/emacs/README.md
@@ -19,6 +19,14 @@ Interactive:
Password: ........
Confirm password: ........
+ ;; Generate a random password.
+ M-x password-store-generate
+ Password entry: bar-account
+
+ ;; Generate a random password without symbols.
+ M-x password-store-generate-no-symbols
+ Password entry: qux-account
+
M-x password-store-copy
Password entry: foo-account
Copied password for foo-account to the kill ring. Will clear in 45 seconds.
diff --git a/contrib/emacs/password-store.el b/contrib/emacs/password-store.el
index 313f81b..c7cc991 100644
--- a/contrib/emacs/password-store.el
+++ b/contrib/emacs/password-store.el
@@ -4,43 +4,52 @@
;; Author: Svend Sorensen <svend@svends.net>
;; Maintainer: Tino Calancha <tino.calancha@gmail.com>
-;; Version: 2.1.2
+;; Version: 2.3.2
;; URL: https://www.passwordstore.org/
-;; Package-Requires: ((emacs "25") (f "0.11.0") (s "1.9.0") (with-editor "2.5.11") (auth-source-pass "5.0.0"))
-;; Keywords: tools pass password password-store
+;; Package-Requires: ((emacs "26.1") (with-editor "2.5.11"))
+;; SPDX-License-Identifier: GPL-3.0-or-later
+;; Keywords: tools pass password password-store gpg
;; This file is not part of GNU Emacs.
-;; This program is free software: you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
+;; This program is free software: you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation, either version 3 of
+;; the License, or (at your option) any later version.
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
+;; This program is distributed in the hope that it will be
+;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+;; PURPOSE. See the GNU General Public License for more details.
-;; You should have received a copy of the GNU General Public License
-;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+;; You should have received a copy of the GNU General Public
+;; License along with this program. If not, see
+;; <http://www.gnu.org/licenses/>.
;;; Commentary:
-;; This package provides functions for working with pass ("the
-;; standard Unix password manager").
-;;
-;; http://www.passwordstore.org/
+;; This package provides and Emacs interface for working with
+;; pass ("the standard Unix password manager").
+
+;; https://www.passwordstore.org/
;;; Code:
-(require 'f)
(require 'with-editor)
(require 'auth-source-pass)
(defgroup password-store '()
- "Emacs mode for password-store."
+ "Emacs mode for password-store.
+The standard Unix password manager"
:prefix "password-store-"
- :group 'password-store)
+ :group 'password-store
+ :link '(url-link :tag "Description" "https://www.passwordstore.org/")
+ :link '(url-link :tag "Download" "https://melpa.org/#/password-store")
+ :link `(url-link :tag "Send Bug Report"
+ ,(concat "mailto:" "password-store" "@" "lists.zx2c4" ".com?subject=
+password-store.el bug: \
+&body=Describe bug here, starting with `emacs -q'. \
+Don't forget to mention your Emacs and library versions.")))
(defcustom password-store-password-length 25
"Default password length."
@@ -56,7 +65,7 @@
:type 'number)
(defcustom password-store-url-field "url"
- "Field name used in the files to indicate an url."
+ "Field name used in the files to indicate a URL."
:group 'password-store
:type 'string)
@@ -68,17 +77,20 @@
"Timer for clearing clipboard.")
(defun password-store-timeout ()
- "Number of seconds to wait before clearing the password.
+ "Number of seconds to wait before restoring the clipboard.
-This function just returns `password-store-time-before-clipboard-restore'.
-Kept for backward compatibility with other libraries."
- password-store-time-before-clipboard-restore)
+This function just returns
+`password-store-time-before-clipboard-restore'. Kept for
+backward compatibility with other libraries."
+password-store-time-before-clipboard-restore)
+
+(make-obsolete 'password-store-timeout 'password-store-time-before-clipboard-restore "2.0.4")
(defun password-store--run-1 (callback &rest args)
"Run pass with ARGS.
-Nil arguments are ignored. Calls CALLBACK with the output on success,
-or outputs error message on failure."
+Nil arguments are ignored. Calls CALLBACK with the output on
+success, or outputs error message on failure."
(let ((output ""))
(make-process
:name "password-store-gpg"
@@ -89,9 +101,10 @@ or outputs error message on failure."
(setq output (concat output text)))
:sentinel (lambda (process state)
(cond
- ((string= state "finished\n")
+ ((and (eq (process-status process) 'exit)
+ (zerop (process-exit-status process)))
(funcall callback output))
- ((string= state "open\n") (accept-process-output process))
+ ((eq (process-status process) 'run) (accept-process-output process))
(t (error (concat "password-store: " state))))))))
(defun password-store--run (&rest args)
@@ -118,9 +131,9 @@ Nil arguments are ignored. Output is discarded."
(cons password-store-executable
(delq nil args)) " "))))
-(defun password-store--run-init (gpg-ids &optional folder)
+(defun password-store--run-init (gpg-ids &optional subdir)
(apply 'password-store--run "init"
- (if folder (format "--path=%s" folder))
+ (if subdir (format "--path=%s" subdir))
gpg-ids))
(defun password-store--run-list (&optional subdir)
@@ -187,11 +200,11 @@ Nil arguments are ignored. Output is discarded."
(defun password-store--entry-to-file (entry)
"Return file name corresponding to ENTRY."
- (concat (f-join (password-store-dir) entry) ".gpg"))
+ (concat (expand-file-name entry (password-store-dir)) ".gpg"))
(defun password-store--file-to-entry (file)
"Return entry name corresponding to FILE."
- (f-no-ext (f-relative file (password-store-dir))))
+ (file-name-sans-extension (file-relative-name file (password-store-dir))))
(defun password-store--completing-read (&optional require-match)
"Read a password entry in the minibuffer, with completion.
@@ -214,11 +227,11 @@ ENTRY is the name of a password-store entry."
(defun password-store-list (&optional subdir)
"List password entries under SUBDIR."
(unless subdir (setq subdir ""))
- (let ((dir (f-join (password-store-dir) subdir)))
- (if (f-directory? dir)
+ (let ((dir (expand-file-name subdir (password-store-dir))))
+ (if (file-directory-p dir)
(delete-dups
(mapcar 'password-store--file-to-entry
- (f-files dir (lambda (file) (equal (f-ext file) "gpg")) t))))))
+ (directory-files-recursively dir ".+\\.gpg\\'"))))))
;;;###autoload
(defun password-store-edit (entry)
@@ -230,8 +243,8 @@ ENTRY is the name of a password-store entry."
(defun password-store-get (entry &optional callback)
"Return password for ENTRY.
-Returns the first line of the password data.
-When CALLBACK is non-`NIL', call CALLBACK with the first line instead."
+Returns the first line of the password data. When CALLBACK is
+non-`NIL', call CALLBACK with the first line instead."
(let* ((inhibit-message t)
(secret (auth-source-pass-get 'secret entry)))
(if (not callback) secret
@@ -242,9 +255,10 @@ When CALLBACK is non-`NIL', call CALLBACK with the first line instead."
;;;###autoload
(defun password-store-get-field (entry field &optional callback)
"Return FIELD for ENTRY.
-FIELD is a string, for instance \"url\".
-When CALLBACK is non-`NIL', call it with the line associated to FIELD instead.
-If FIELD equals to symbol secret, then this function reduces to `password-store-get'."
+FIELD is a string, for instance \"url\". When CALLBACK is
+non-`NIL', call it with the line associated to FIELD instead. If
+FIELD equals to symbol secret, then this function reduces to
+`password-store-get'."
(let* ((inhibit-message t)
(secret (auth-source-pass-get field entry)))
(if (not callback) secret
@@ -255,7 +269,14 @@ If FIELD equals to symbol secret, then this function reduces to `password-store-
;;;###autoload
(defun password-store-clear (&optional field)
- "Clear FIELD in kill ring."
+ "Clear secret in the kill ring.
+
+Optional argument FIELD, a symbol or a string, describes the
+stored secret to clear; if nil, then set it to 'secret. Note,
+FIELD does not affect the function logic; it is only used to
+display the message:
+
+\(message \"Field %s cleared from kill ring and system clipboard.\" field)."
(interactive "i")
(unless field (setq field 'secret))
(when password-store-timeout-timer
@@ -263,14 +284,15 @@ If FIELD equals to symbol secret, then this function reduces to `password-store-
(setq password-store-timeout-timer nil))
(when password-store-kill-ring-pointer
(setcar password-store-kill-ring-pointer "")
+ (kill-new "")
(setq password-store-kill-ring-pointer nil)
- (message "Field %s cleared." field)))
+ (message "Field %s cleared from kill ring and system clipboard." field)))
(defun password-store--save-field-in-kill-ring (entry secret field)
(password-store-clear field)
(kill-new secret)
(setq password-store-kill-ring-pointer kill-ring-yank-pointer)
- (message "Copied %s for %s to the kill ring. Will clear in %s seconds."
+ (message "Copied %s for %s to the kill ring and system clipboard. Will clear in %s seconds."
field entry password-store-time-before-clipboard-restore)
(setq password-store-timeout-timer
(run-at-time password-store-time-before-clipboard-restore nil
@@ -280,9 +302,10 @@ If FIELD equals to symbol secret, then this function reduces to `password-store-
(defun password-store-copy (entry)
"Add password for ENTRY into the kill ring.
-Clear previous password from the kill ring. Pointer to the kill ring
-is stored in `password-store-kill-ring-pointer'. Password is cleared
-after `password-store-time-before-clipboard-restore' seconds."
+Clear previous password from the kill ring. Pointer to the kill
+ring is stored in `password-store-kill-ring-pointer'. Password
+is cleared after `password-store-time-before-clipboard-restore'
+seconds."
(interactive (list (password-store--completing-read t)))
(password-store-get
entry
@@ -293,10 +316,12 @@ after `password-store-time-before-clipboard-restore' seconds."
(defun password-store-copy-field (entry field)
"Add FIELD for ENTRY into the kill ring.
-Clear previous secret from the kill ring. Pointer to the kill ring is
-stored in `password-store-kill-ring-pointer'. Secret field is cleared
-after `password-store-timeout' seconds.
-If FIELD equals to symbol secret, then this function reduces to `password-store-copy'."
+Clear previous secret from the kill ring. Pointer to the kill
+ring is stored in `password-store-kill-ring-pointer'. Secret
+field is cleared after
+`password-store-time-before-clipboard-restore' seconds. If FIELD
+equals to symbol secret, then this function reduces to
+`password-store-copy'."
(interactive
(let ((entry (password-store--completing-read)))
(list entry (password-store-read-field entry))))
@@ -335,17 +360,36 @@ Separate multiple IDs with spaces."
Default PASSWORD-LENGTH is `password-store-password-length'."
(interactive (list (password-store--completing-read)
- (when current-prefix-arg
- (abs (prefix-numeric-value current-prefix-arg)))))
- (unless password-length (setq password-length password-store-password-length))
- ;; A message with the output of the command is not printed because
- ;; the output contains the password.
- (password-store--run-generate entry password-length t)
+ (and current-prefix-arg
+ (abs (prefix-numeric-value current-prefix-arg)))))
+ ;; A message with the output of the command is not printed
+ ;; because the output contains the password.
+ (password-store--run-generate
+ entry
+ (or password-length password-store-password-length)
+ 'force)
+ nil)
+
+;;;###autoload
+(defun password-store-generate-no-symbols (entry &optional password-length)
+ "Generate a new password without symbols for ENTRY with PASSWORD-LENGTH.
+
+Default PASSWORD-LENGTH is `password-store-password-length'."
+ (interactive (list (password-store--completing-read)
+ (and current-prefix-arg
+ (abs (prefix-numeric-value current-prefix-arg)))))
+
+ ;; A message with the output of the command is not printed
+ ;; because the output contains the password.
+ (password-store--run-generate
+ entry
+ (or password-length password-store-password-length)
+ 'force 'no-symbols)
nil)
;;;###autoload
(defun password-store-remove (entry)
- "Remove existing password for ENTRY."
+ "Remove ENTRY."
(interactive (list (password-store--completing-read t)))
(message "%s" (password-store--run-remove entry t)))
@@ -358,13 +402,13 @@ Default PASSWORD-LENGTH is `password-store-password-length'."
;;;###autoload
(defun password-store-version ()
- "Show version of pass executable."
+ "Show version of `password-store-executable'."
(interactive)
(message "%s" (password-store--run-version)))
;;;###autoload
(defun password-store-url (entry)
- "Browse URL stored in ENTRY."
+ "Load URL for ENTRY."
(interactive (list (password-store--completing-read t)))
(let ((url (password-store-get-field entry password-store-url-field)))
(if url (browse-url url)
diff --git a/contrib/vim/redact_pass.vim b/contrib/vim/redact_pass.vim
index a3d67e8..2e752fe 100644
--- a/contrib/vim/redact_pass.vim
+++ b/contrib/vim/redact_pass.vim
@@ -35,6 +35,7 @@ function! s:CheckArgsRedact()
" Tell the user what we're doing so they know this worked, via a message and
" a global variable they can check
+ redraw
echomsg 'Editing password file--disabled leaky options!'
let g:redact_pass_redacted = 1
@@ -48,4 +49,10 @@ augroup redact_pass
\,$TMPDIR/pass.?*/?*.txt
\,/tmp/pass.?*/?*.txt
\ call s:CheckArgsRedact()
+ " Work around macOS' dynamic symlink structure for temporary directories
+ if has('mac')
+ autocmd VimEnter
+ \ /private/var/?*/pass.?*/?*.txt
+ \ call s:CheckArgsRedact()
+ endif
augroup END