Fixed.
[elisp/epg.git] / pgg-epg.el
index a1705f5..6963113 100644 (file)
 
 (defvar pgg-epg-secret-key-id-list nil)
 
 
 (defvar pgg-epg-secret-key-id-list nil)
 
-(defun pgg-epg-passphrase-callback (key-id ignore)
+(defun pgg-epg-passphrase-callback (context key-id ignore)
   (if (eq key-id 'SYM)
   (if (eq key-id 'SYM)
-      (pgg-read-passphrase "GnuPG passphrase for symmetric encryption: ")
-    (let ((passphrase
-          (pgg-read-passphrase
-           (format "GnuPG passphrase for %s: "
-                   (if entry
-                       (cdr entry)
-                     pgg-gpg-key-id))
-           (if (eq pgg-gpg-key-id 'PIN)
-               "PIN"
-             pgg-gpg-key-id))))
+      (epg-passphrase-callback-function context key-id nil)
+    (let* ((entry (assoc key-id epg-user-id-alist))
+          (passphrase
+           (pgg-read-passphrase
+            (format "GnuPG passphrase for %s: "
+                    (if entry
+                        (cdr entry)
+                      key-id))
+            (if (eq key-id 'PIN)
+                "PIN"
+              key-id))))
       (when passphrase
        (pgg-add-passphrase-to-cache key-id passphrase)
       (when passphrase
        (pgg-add-passphrase-to-cache key-id passphrase)
-       (copy-sequence passphrase)
        (setq pgg-epg-secret-key-id-list
        (setq pgg-epg-secret-key-id-list
-             (cons key-id pgg-epg-secret-key-id-list))))))
+             (cons key-id pgg-epg-secret-key-id-list))
+       (copy-sequence passphrase)))))
 
 (defun pgg-epg-encrypt-region (start end recipients &optional sign passphrase)
   "This function is for internal use only.
 
 (defun pgg-epg-encrypt-region (start end recipients &optional sign passphrase)
   "This function is for internal use only.
@@ -58,18 +59,25 @@ If optional argument SIGN is non-nil, do a combined sign and encrypt.
 If optional PASSPHRASE is not specified, it will be obtained from the
 passphrase cache or user."
   (let ((context (epg-make-context))
 If optional PASSPHRASE is not specified, it will be obtained from the
 passphrase cache or user."
   (let ((context (epg-make-context))
+       (inhibit-redisplay t)           ;Some Gnus users hate flickering
        cipher)
     (epg-context-set-armor context t)
     (epg-context-set-textmode context pgg-text-mode)
     (epg-context-set-passphrase-callback context #'pgg-epg-passphrase-callback)
        cipher)
     (epg-context-set-armor context t)
     (epg-context-set-textmode context pgg-text-mode)
     (epg-context-set-passphrase-callback context #'pgg-epg-passphrase-callback)
+    (get-buffer-create pgg-output-buffer)
+    (get-buffer-create pgg-errors-buffer)
     (condition-case error
        (setq cipher
              (epg-encrypt-string context
                                  (buffer-substring start end)
     (condition-case error
        (setq cipher
              (epg-encrypt-string context
                                  (buffer-substring start end)
-                                 (if pgg-encrypt-for-me
-                                     (cons pgg-default-user-id recipients)
-                                   recipients)
-                                 sign t))
+                                 (mapcar
+                                  (lambda (recipient)
+                                    (car (epg-list-keys recipient)))
+                                  (if pgg-encrypt-for-me
+                                      (cons pgg-default-user-id recipients)
+                                    recipients))
+                                 sign t)
+             pgg-epg-secret-key-id-list nil)
       (error
        (while pgg-epg-secret-key-id-list
         (pgg-remove-passphrase-from-cache (car pgg-epg-secret-key-id-list))
       (error
        (while pgg-epg-secret-key-id-list
         (pgg-remove-passphrase-from-cache (car pgg-epg-secret-key-id-list))
@@ -98,12 +106,16 @@ Decrypt the current region between START and END.
 If optional PASSPHRASE is not specified, it will be obtained from the
 passphrase cache or user."
   (let ((context (epg-make-context))
 If optional PASSPHRASE is not specified, it will be obtained from the
 passphrase cache or user."
   (let ((context (epg-make-context))
+       (inhibit-redisplay t)           ;Some Gnus users hate flickering
        plain)
     (epg-context-set-armor context t)
     (epg-context-set-textmode context pgg-text-mode)
     (epg-context-set-passphrase-callback context #'pgg-epg-passphrase-callback)
        plain)
     (epg-context-set-armor context t)
     (epg-context-set-textmode context pgg-text-mode)
     (epg-context-set-passphrase-callback context #'pgg-epg-passphrase-callback)
+    (get-buffer-create pgg-output-buffer)
+    (get-buffer-create pgg-errors-buffer)
     (condition-case error
     (condition-case error
-       (setq plain (epg-decrypt-string context (buffer-substring start end)))
+       (setq plain (epg-decrypt-string context (buffer-substring start end))
+             pgg-epg-secret-key-id-list nil)
       (error
        (while pgg-epg-secret-key-id-list
         (pgg-remove-passphrase-from-cache (car pgg-epg-secret-key-id-list))
       (error
        (while pgg-epg-secret-key-id-list
         (pgg-remove-passphrase-from-cache (car pgg-epg-secret-key-id-list))
@@ -123,17 +135,21 @@ Make detached signature from text between START and END.
 If optional PASSPHRASE is not specified, it will be obtained from the
 passphrase cache or user."
   (let ((context (epg-make-context))
 If optional PASSPHRASE is not specified, it will be obtained from the
 passphrase cache or user."
   (let ((context (epg-make-context))
+       (inhibit-redisplay t)           ;Some Gnus users hate flickering
        signature)
     (epg-context-set-armor context t)
     (epg-context-set-textmode context pgg-text-mode)
     (epg-context-set-passphrase-callback context #'pgg-epg-passphrase-callback)
        signature)
     (epg-context-set-armor context t)
     (epg-context-set-textmode context pgg-text-mode)
     (epg-context-set-passphrase-callback context #'pgg-epg-passphrase-callback)
+    (get-buffer-create pgg-output-buffer)
+    (get-buffer-create pgg-errors-buffer)
     (condition-case error
        (setq signature
              (epg-sign-string context
                               (buffer-substring start end)
                               (if cleartext
                                   'clearsign
     (condition-case error
        (setq signature
              (epg-sign-string context
                               (buffer-substring start end)
                               (if cleartext
                                   'clearsign
-                                'detached)))
+                                'detached))
+             pgg-epg-secret-key-id-list nil)
       (error
        (while pgg-epg-secret-key-id-list
         (pgg-remove-passphrase-from-cache (car pgg-epg-secret-key-id-list))
       (error
        (while pgg-epg-secret-key-id-list
         (pgg-remove-passphrase-from-cache (car pgg-epg-secret-key-id-list))
@@ -151,9 +167,12 @@ passphrase cache or user."
   "This function is for internal use only.
 
 Verify region between START and END as the detached signature SIGNATURE."
   "This function is for internal use only.
 
 Verify region between START and END as the detached signature SIGNATURE."
-  (let ((context (epg-make-context)))
+  (let ((context (epg-make-context))
+       (inhibit-redisplay t))          ;Some Gnus users hate flickering
     (epg-context-set-armor context t)
     (epg-context-set-textmode context pgg-text-mode)
     (epg-context-set-armor context t)
     (epg-context-set-textmode context pgg-text-mode)
+    (get-buffer-create pgg-output-buffer)
+    (get-buffer-create pgg-errors-buffer)
     (if signature
        (epg-verify-string context
                           (with-temp-buffer
     (if signature
        (epg-verify-string context
                           (with-temp-buffer
@@ -174,6 +193,7 @@ Verify region between START and END as the detached signature SIGNATURE."
 
 Insert public key at point."
   (let ((context (epg-make-context))
 
 Insert public key at point."
   (let ((context (epg-make-context))
+       (inhibit-redisplay t)           ;Some Gnus users hate flickering
        pointer)
     (epg-context-set-armor context t)
     (epg-context-set-textmode context pgg-text-mode)
        pointer)
     (epg-context-set-armor context t)
     (epg-context-set-textmode context pgg-text-mode)
@@ -184,6 +204,7 @@ Insert public key at point."
 
 Add all public keys in region between START and END to the keyring."
   (let ((context (epg-make-context))
 
 Add all public keys in region between START and END to the keyring."
   (let ((context (epg-make-context))
+       (inhibit-redisplay t)           ;Some Gnus users hate flickering
        pointer)
     (epg-context-set-armor context t)
     (epg-context-set-textmode context pgg-text-mode)
        pointer)
     (epg-context-set-armor context t)
     (epg-context-set-textmode context pgg-text-mode)