From 77298f3672adc87248f0abf7e75563a7fd1fa374 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Jun 2017 02:38:16 +0200 Subject: [PATCH] +pass/ivy: fix open-url; add +pass-get-field (#103) --- modules/tools/password-store/autoload.el | 63 ++++++++++++++---------- modules/tools/password-store/config.el | 3 ++ 2 files changed, 41 insertions(+), 25 deletions(-) diff --git a/modules/tools/password-store/autoload.el b/modules/tools/password-store/autoload.el index b7707aafa..8dab51d5f 100644 --- a/modules/tools/password-store/autoload.el +++ b/modules/tools/password-store/autoload.el @@ -11,36 +11,49 @@ (pass)))) +;;;###autoload +(defun +pass-get-field (entry fields) + (if-let (data (if (listp entry) entry (auth-pass-parse-entry entry))) + (cl-loop for key in (doom-enlist fields) + when (assoc key data) + return (cdr it)) + (error "Couldn't find entry: %s" entry))) + +(defun +pass-ivy-action--open-url (entry) + (if-let (url (+pass-get-field entry +pass-url-fields)) + (and (or (string-prefix-p "http://" url) + (string-prefix-p "https://" url) + (error "Field for %s doesn't look like an url" item)) + (browse-url url)) + (error "Username not found."))) + +(defun +pass-ivy-action--get-field (item) + (let* ((data (auth-pass-parse-entry item)) + (field (if data (completing-read "Field: " (mapcar #'car data) nil t)))) + (if data + (progn + (password-store-clear) + (message "Copied %s's %s field to clipboard. Will clear in %s seconds" + item field (password-store-timeout)) + (kill-new (+pass-get-field data field)) + (setq password-store-timeout-timer + (run-at-time (password-store-timeout) nil 'password-store-clear))) + (error "Couldn't find entry: %s" item)))) + +(defun +pass-ivy-action--copy-username (entry) + (if-let (user (+pass-get-field entry +pass-user-fields)) + (progn (password-store-clear) + (message "Copied username to the kill ring.") + (kill-new user)) + (error "Username not found."))) + (after! ivy - (defun +pass-ivy-action--get-field (item) - (let* ((data (auth-pass-parse-entry item)) - (field (if data (completing-read "Field: " (mapcar #'car data) nil t)))) - (if data - (progn - (password-store-clear) - (message "Copied %s's %s field to clipboard. Will clear in %s seconds" - item field (password-store-timeout)) - (kill-new (cdr (assoc field data))) - (setq password-store-timeout-timer - (run-at-time (password-store-timeout) nil 'password-store-clear))) - (error "Couldn't find entry: %s" item)))) - - (defun +pass-ivy-action--copy-username (item) - (if-let (user (cl-loop with data = (auth-pass-parse-entry item) - for key in +pass-user-fields - when (assoc key data) - return (cdr it))) - (progn (password-store-clear) - (message "Copied username to the kill ring.") - (kill-new user)) - (message "Username not found!"))) - (ivy-add-actions '+pass/ivy '(("o" password-store-copy "copy password") - ("u" +pass-ivy-action--copy-username "copy username") ("e" password-store-edit "edit entry") - ("b" password-store-url "open url in browser") + ("u" +pass-ivy-action--copy-username "copy username") + ("b" +pass-ivy-action--open-url "open url in browser") ("f" +pass-ivy-action--get-field "get field")))) ;;;###autoload diff --git a/modules/tools/password-store/config.el b/modules/tools/password-store/config.el index e20efc7ae..b30d09c3e 100644 --- a/modules/tools/password-store/config.el +++ b/modules/tools/password-store/config.el @@ -3,6 +3,9 @@ (defvar +pass-user-fields '("login" "user" "username" "email") "A list of fields for `+pass/ivy' to search for the username.") +(defvar +pass-url-fields '("url" "site" "location") + "A list of fields for `+pass/ivy' to search for the username.") + ;; ;; Plugins