From 9e8da9d27928ba19bf0c383a080b2fd01ad9f157 Mon Sep 17 00:00:00 2001 From: Daiki Ueno Date: Tue, 18 Nov 2014 16:19:14 +0900 Subject: [PATCH] epg: Support key editing * epg.el (epg-context): New slot EDIT-CALLBACK. (epg--process-filter): Call EDIT-CALLBACK when editing a key. (epg-reset): Reset EDIT-CALLBACK of the context. (epg-start-edit-key): New function. (epg-edit-key): New function. --- lisp/ChangeLog | 8 +++++++ lisp/epg.el | 62 +++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 62 insertions(+), 8 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index feb93854eea..e885c924487 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,11 @@ +2014-11-18 Daiki Ueno + + * epg.el (epg-context): New slot EDIT-CALLBACK. + (epg--process-filter): Call EDIT-CALLBACK when editing a key. + (epg-reset): Reset EDIT-CALLBACK of the context. + (epg-start-edit-key): New function. + (epg-edit-key): New function. + 2014-11-18 Paul Eggert Port new time stamp handling to Emacs 23.2. diff --git a/lisp/epg.el b/lisp/epg.el index 20e67850693..520ff8d78b7 100644 --- a/lisp/epg.el +++ b/lisp/epg.el @@ -205,6 +205,7 @@ compress-algorithm (passphrase-callback (list #'epg-passphrase-callback-function)) progress-callback + edit-callback signers sig-notations process @@ -668,15 +669,27 @@ callback data (if any)." (beginning-of-line) (while (looking-at ".*\n") ;the input line finished (if (looking-at "\\[GNUPG:] \\([A-Z_]+\\) ?\\(.*\\)") - (let* ((status (match-string 1)) - (string (match-string 2)) - (symbol (intern-soft (concat "epg--status-" - status)))) + (let ((status (match-string 1)) + (string (match-string 2)) + symbol) (if (member status epg-pending-status-list) (setq epg-pending-status-list nil)) - (if (and symbol - (fboundp symbol)) - (funcall symbol epg-context string)) + ;; When editing a key, delegate all interaction + ;; to edit-callback. + (if (eq (epg-context-operation epg-context) 'edit-key) + (funcall (car (epg-context-edit-callback + epg-context)) + epg-context + status + string + (cdr (epg-context-edit-callback + epg-context))) + ;; Otherwise call epg--status-STATUS function. + (setq symbol (intern-soft (concat "epg--status-" + status))) + (if (and symbol + (fboundp symbol)) + (funcall symbol epg-context string))) (setq epg-last-status (cons status string))) ;; Record other lines sent to stderr. This assumes ;; that the process-filter receives output only from @@ -736,7 +749,8 @@ callback data (if any)." (if (and (epg-context-process context) (buffer-live-p (process-buffer (epg-context-process context)))) (kill-buffer (process-buffer (epg-context-process context)))) - (setf (epg-context-process context) nil)) + (setf (epg-context-process context) nil) + (setf (epg-context-edit-callback context) nil)) (defun epg-delete-output-file (context) "Delete the output file of CONTEXT." @@ -2084,6 +2098,38 @@ PARAMETERS is a string which tells how to create the key." (epg-errors-to-string errors)))))) (epg-reset context))) +(defun epg-start-edit-key (context key edit-callback handback) + "Initiate an edit operation on KEY. + +EDIT-CALLBACK is called from process filter and takes 3 +arguments: the context, a status, an argument string, and the +handback argument. + +If you use this function, you will need to wait for the completion of +`epg-gpg-program' by using `epg-wait-for-completion' and call +`epg-reset' to clear a temporary output file. +If you are unsure, use synchronous version of this function +`epg-edit-key' instead." + (setf (epg-context-operation context) 'edit-key) + (setf (epg-context-result context) nil) + (setf (epg-context-edit-callback context) (cons edit-callback handback)) + (epg--start context (list "--edit-key" + (epg-sub-key-id + (car (epg-key-sub-key-list key)))))) + +(defun epg-edit-key (context key edit-callback handback) + "Edit KEY in the keyring." + (unwind-protect + (progn + (epg-start-edit-key context key edit-callback handback) + (epg-wait-for-completion context) + (let ((errors (epg-context-result-for context 'error))) + (if errors + (signal 'epg-error + (list "Edit key failed" + (epg-errors-to-string errors)))))) + (epg-reset context))) + (defun epg--decode-percent-escape (string) (let ((index 0)) (while (string-match "%\\(\\(%\\)\\|\\([0-9A-Fa-f][0-9A-Fa-f]\\)\\)" -- 2.39.5