diff options
Diffstat (limited to 'contrib')
-rw-r--r-- | contrib/dmenu/README.md | 7 | ||||
-rwxr-xr-x | contrib/dmenu/passmenu | 16 | ||||
-rw-r--r-- | contrib/emacs/CHANGELOG.md | 22 | ||||
-rw-r--r-- | contrib/emacs/Cask | 3 | ||||
-rw-r--r-- | contrib/emacs/README.md | 8 | ||||
-rw-r--r-- | contrib/emacs/password-store.el | 154 | ||||
-rw-r--r-- | contrib/vim/redact_pass.vim | 7 |
7 files changed, 154 insertions, 63 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 7173f65..e15414f 100644 --- a/contrib/emacs/CHANGELOG.md +++ b/contrib/emacs/CHANGELOG.md @@ -1,3 +1,25 @@ +# 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. diff --git a/contrib/emacs/Cask b/contrib/emacs/Cask index 050e054..1d8ce9f 100644 --- a/contrib/emacs/Cask +++ b/contrib/emacs/Cask @@ -7,5 +7,4 @@ (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 61c339e..c7cc991 100644 --- a/contrib/emacs/password-store.el +++ b/contrib/emacs/password-store.el @@ -4,32 +4,34 @@ ;; Author: Svend Sorensen <svend@svends.net> ;; Maintainer: Tino Calancha <tino.calancha@gmail.com> -;; Version: 2.1.4 +;; Version: 2.3.2 ;; URL: https://www.passwordstore.org/ -;; Package-Requires: ((emacs "25") (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: @@ -37,9 +39,17 @@ (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." @@ -55,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) @@ -67,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" @@ -88,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) @@ -117,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) @@ -229,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 @@ -241,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 @@ -256,12 +271,12 @@ If FIELD equals to symbol secret, then this function reduces to `password-store- (defun password-store-clear (&optional field) "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: +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.\" field)." +\(message \"Field %s cleared from kill ring and system clipboard.\" field)." (interactive "i") (unless field (setq field 'secret)) (when password-store-timeout-timer @@ -269,14 +284,15 @@ to display the message: (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 @@ -286,9 +302,10 @@ to display the message: (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 @@ -299,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)))) @@ -341,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))) @@ -364,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 |