emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] /srv/bzr/emacs/trunk r111818: lisp/gnus/mml2015.el (mml201


From: Katsumi Yamaoka
Subject: [Emacs-diffs] /srv/bzr/emacs/trunk r111818: lisp/gnus/mml2015.el (mml2015-epg-find-usable-key): handle revoked user-id
Date: Sun, 17 Feb 2013 12:46:28 +0000
User-agent: Bazaar (2.5.0)

------------------------------------------------------------
revno: 111818
author: Daiki Ueno <address@hidden>
committer: Katsumi Yamaoka <address@hidden>
branch nick: trunk
timestamp: Sun 2013-02-17 12:46:28 +0000
message:
  lisp/gnus/mml2015.el (mml2015-epg-find-usable-key): handle revoked user-id
modified:
  lisp/gnus/ChangeLog
  lisp/gnus/mml2015.el
=== modified file 'lisp/gnus/ChangeLog'
--- a/lisp/gnus/ChangeLog       2013-02-17 00:38:03 +0000
+++ b/lisp/gnus/ChangeLog       2013-02-17 12:46:28 +0000
@@ -1,3 +1,14 @@
+2013-02-17  Daiki Ueno  <address@hidden>
+
+       * mml2015.el (epg-key-user-id-list, epg-user-id-string)
+       (epg-user-id-validity): Autoload.
+       (mml2015-epg-check-user-id): New function.
+       (mml2015-epg-check-sub-key): New function split from
+       mml2015-epg-find-usable-key.
+       (mml2015-epg-find-usable-key): Accept context, name, usage, and
+       optional name-is-key-id, to handle the case when user-id is unusable.
+       Reported by Ɓukasz Stelmach <address@hidden>.
+
 2013-02-17  Glenn Morris  <address@hidden>
 
        * shr.el (shr-put-image): Use image-multi-frame-p if available.

=== modified file 'lisp/gnus/mml2015.el'
--- a/lisp/gnus/mml2015.el      2013-01-02 16:13:04 +0000
+++ b/lisp/gnus/mml2015.el      2013-02-17 12:46:28 +0000
@@ -757,6 +757,9 @@
 (autoload 'epg-sub-key-fingerprint "epg")
 (autoload 'epg-signature-key-id "epg")
 (autoload 'epg-signature-to-string "epg")
+(autoload 'epg-key-user-id-list "epg")
+(autoload 'epg-user-id-string "epg")
+(autoload 'epg-user-id-validity "epg")
 (autoload 'epg-configuration "epg-config")
 (autoload 'epg-expand-group "epg-config")
 (autoload 'epa-select-keys "epa")
@@ -786,21 +789,53 @@
              (cons password-cache-key-id mml2015-epg-secret-key-id-list))
        (copy-sequence passphrase)))))
 
-(defun mml2015-epg-find-usable-key (keys usage)
-  (catch 'found
+(defun mml2015-epg-check-user-id (key recipient)
+  (let ((pointer (epg-key-user-id-list key))
+       result)
+    (while pointer
+      (if (and (equal (car (mail-header-parse-address
+                           (epg-user-id-string (car pointer))))
+                     (car (mail-header-parse-address
+                           recipient)))
+              (not (memq (epg-user-id-validity (car pointer))
+                         '(revoked expired))))
+         (setq result t
+               pointer nil)
+       (setq pointer (cdr pointer))))
+    result))
+
+(defun mml2015-epg-check-sub-key (key usage)
+  (let ((pointer (epg-key-sub-key-list key))
+       result)
+    ;; The primary key will be marked as disabled, when the entire
+    ;; key is disabled (see 12 Field, Format of colon listings, in
+    ;; gnupg/doc/DETAILS)
+    (unless (memq 'disabled (epg-sub-key-capability (car pointer)))
+      (while pointer
+       (if (and (memq usage (epg-sub-key-capability (car pointer)))
+                (not (memq (epg-sub-key-validity (car pointer))
+                           '(revoked expired))))
+           (setq result t
+                 pointer nil)
+         (setq pointer (cdr pointer)))))
+    result))
+
+(defun mml2015-epg-find-usable-key (context name usage
+                                           &optional name-is-key-id)
+  (let ((keys (epg-list-keys context name))
+       key)
     (while keys
-      (let ((pointer (epg-key-sub-key-list (car keys))))
-       ;; The primary key will be marked as disabled, when the entire
-       ;; key is disabled (see 12 Field, Format of colon listings, in
-       ;; gnupg/doc/DETAILS)
-       (unless (memq 'disabled (epg-sub-key-capability (car pointer)))
-         (while pointer
-           (if (and (memq usage (epg-sub-key-capability (car pointer)))
-                    (not (memq (epg-sub-key-validity (car pointer))
-                               '(revoked expired))))
-               (throw 'found (car keys)))
-           (setq pointer (cdr pointer)))))
-      (setq keys (cdr keys)))))
+      (if (and (or name-is-key-id
+                  ;; Non email user-id can be supplied through
+                  ;; mml2015-signers if mml2015-encrypt-to-self is set.
+                  ;; Treat it as valid, as it is user's intention.
+                  (not (string-match "\\`<" name))
+                  (mml2015-epg-check-user-id (car keys) name))
+              (mml2015-epg-check-sub-key (car keys) usage))
+         (setq key (car keys)
+               keys nil)
+       (setq keys (cdr keys))))
+    key))
 
 ;; XXX: since gpg --list-secret-keys does not return validity of each
 ;; key, `mml2015-epg-find-usable-key' defined above is not enough for
@@ -811,10 +846,12 @@
        secret-key)
     (while (and (not secret-key) secret-keys)
       (if (mml2015-epg-find-usable-key
-          (epg-list-keys context (epg-sub-key-fingerprint
-                                  (car (epg-key-sub-key-list
-                                        (car secret-keys)))))
-          usage)
+          context
+          (epg-sub-key-fingerprint
+           (car (epg-key-sub-key-list
+                 (car secret-keys))))
+          usage
+          t)
          (setq secret-key (car secret-keys)
                secret-keys nil)
        (setq secret-keys (cdr secret-keys))))
@@ -1115,8 +1152,7 @@
                    (mapcar
                     (lambda (recipient)
                       (setq recipient-key (mml2015-epg-find-usable-key
-                                           (epg-list-keys context recipient)
-                                           'encrypt))
+                                           context recipient 'encrypt))
                       (unless (or recipient-key
                                   (y-or-n-p
                                    (format "No public key for %s; skip it? "


reply via email to

[Prev in Thread] Current Thread [Next in Thread]