aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaiki Ueno2013-02-17 12:46:28 +0000
committerKatsumi Yamaoka2013-02-17 12:46:28 +0000
commita801007559f0235ce28fe868f44a9a055a9d3f32 (patch)
tree3905e56292ae8553279d39b6bee34d72f7628d29
parentfd9547e88bc8796141a3cd82076d071add2fd64e (diff)
downloademacs-a801007559f0235ce28fe868f44a9a055a9d3f32.tar.gz
emacs-a801007559f0235ce28fe868f44a9a055a9d3f32.zip
lisp/gnus/mml2015.el (mml2015-epg-find-usable-key): handle revoked user-id
-rw-r--r--lisp/gnus/ChangeLog11
-rw-r--r--lisp/gnus/mml2015.el76
2 files changed, 67 insertions, 20 deletions
diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog
index dd6d20969ff..8de9e89a23d 100644
--- a/lisp/gnus/ChangeLog
+++ b/lisp/gnus/ChangeLog
@@ -1,3 +1,14 @@
12013-02-17 Daiki Ueno <ueno@gnu.org>
2
3 * mml2015.el (epg-key-user-id-list, epg-user-id-string)
4 (epg-user-id-validity): Autoload.
5 (mml2015-epg-check-user-id): New function.
6 (mml2015-epg-check-sub-key): New function split from
7 mml2015-epg-find-usable-key.
8 (mml2015-epg-find-usable-key): Accept context, name, usage, and
9 optional name-is-key-id, to handle the case when user-id is unusable.
10 Reported by Ɓukasz Stelmach <stlman@poczta.fm>.
11
12013-02-17 Glenn Morris <rgm@gnu.org> 122013-02-17 Glenn Morris <rgm@gnu.org>
2 13
3 * shr.el (shr-put-image): Use image-multi-frame-p if available. 14 * shr.el (shr-put-image): Use image-multi-frame-p if available.
diff --git a/lisp/gnus/mml2015.el b/lisp/gnus/mml2015.el
index 275a4867e85..b20c02aa26f 100644
--- a/lisp/gnus/mml2015.el
+++ b/lisp/gnus/mml2015.el
@@ -757,6 +757,9 @@ If set, it overrides the setting of `mml2015-sign-with-sender'."
757(autoload 'epg-sub-key-fingerprint "epg") 757(autoload 'epg-sub-key-fingerprint "epg")
758(autoload 'epg-signature-key-id "epg") 758(autoload 'epg-signature-key-id "epg")
759(autoload 'epg-signature-to-string "epg") 759(autoload 'epg-signature-to-string "epg")
760(autoload 'epg-key-user-id-list "epg")
761(autoload 'epg-user-id-string "epg")
762(autoload 'epg-user-id-validity "epg")
760(autoload 'epg-configuration "epg-config") 763(autoload 'epg-configuration "epg-config")
761(autoload 'epg-expand-group "epg-config") 764(autoload 'epg-expand-group "epg-config")
762(autoload 'epa-select-keys "epa") 765(autoload 'epa-select-keys "epa")
@@ -786,21 +789,53 @@ If set, it overrides the setting of `mml2015-sign-with-sender'."
786 (cons password-cache-key-id mml2015-epg-secret-key-id-list)) 789 (cons password-cache-key-id mml2015-epg-secret-key-id-list))
787 (copy-sequence passphrase))))) 790 (copy-sequence passphrase)))))
788 791
789(defun mml2015-epg-find-usable-key (keys usage) 792(defun mml2015-epg-check-user-id (key recipient)
790 (catch 'found 793 (let ((pointer (epg-key-user-id-list key))
794 result)
795 (while pointer
796 (if (and (equal (car (mail-header-parse-address
797 (epg-user-id-string (car pointer))))
798 (car (mail-header-parse-address
799 recipient)))
800 (not (memq (epg-user-id-validity (car pointer))
801 '(revoked expired))))
802 (setq result t
803 pointer nil)
804 (setq pointer (cdr pointer))))
805 result))
806
807(defun mml2015-epg-check-sub-key (key usage)
808 (let ((pointer (epg-key-sub-key-list key))
809 result)
810 ;; The primary key will be marked as disabled, when the entire
811 ;; key is disabled (see 12 Field, Format of colon listings, in
812 ;; gnupg/doc/DETAILS)
813 (unless (memq 'disabled (epg-sub-key-capability (car pointer)))
814 (while pointer
815 (if (and (memq usage (epg-sub-key-capability (car pointer)))
816 (not (memq (epg-sub-key-validity (car pointer))
817 '(revoked expired))))
818 (setq result t
819 pointer nil)
820 (setq pointer (cdr pointer)))))
821 result))
822
823(defun mml2015-epg-find-usable-key (context name usage
824 &optional name-is-key-id)
825 (let ((keys (epg-list-keys context name))
826 key)
791 (while keys 827 (while keys
792 (let ((pointer (epg-key-sub-key-list (car keys)))) 828 (if (and (or name-is-key-id
793 ;; The primary key will be marked as disabled, when the entire 829 ;; Non email user-id can be supplied through
794 ;; key is disabled (see 12 Field, Format of colon listings, in 830 ;; mml2015-signers if mml2015-encrypt-to-self is set.
795 ;; gnupg/doc/DETAILS) 831 ;; Treat it as valid, as it is user's intention.
796 (unless (memq 'disabled (epg-sub-key-capability (car pointer))) 832 (not (string-match "\\`<" name))
797 (while pointer 833 (mml2015-epg-check-user-id (car keys) name))
798 (if (and (memq usage (epg-sub-key-capability (car pointer))) 834 (mml2015-epg-check-sub-key (car keys) usage))
799 (not (memq (epg-sub-key-validity (car pointer)) 835 (setq key (car keys)
800 '(revoked expired)))) 836 keys nil)
801 (throw 'found (car keys))) 837 (setq keys (cdr keys))))
802 (setq pointer (cdr pointer))))) 838 key))
803 (setq keys (cdr keys)))))
804 839
805;; XXX: since gpg --list-secret-keys does not return validity of each 840;; XXX: since gpg --list-secret-keys does not return validity of each
806;; key, `mml2015-epg-find-usable-key' defined above is not enough for 841;; key, `mml2015-epg-find-usable-key' defined above is not enough for
@@ -811,10 +846,12 @@ If set, it overrides the setting of `mml2015-sign-with-sender'."
811 secret-key) 846 secret-key)
812 (while (and (not secret-key) secret-keys) 847 (while (and (not secret-key) secret-keys)
813 (if (mml2015-epg-find-usable-key 848 (if (mml2015-epg-find-usable-key
814 (epg-list-keys context (epg-sub-key-fingerprint 849 context
815 (car (epg-key-sub-key-list 850 (epg-sub-key-fingerprint
816 (car secret-keys))))) 851 (car (epg-key-sub-key-list
817 usage) 852 (car secret-keys))))
853 usage
854 t)
818 (setq secret-key (car secret-keys) 855 (setq secret-key (car secret-keys)
819 secret-keys nil) 856 secret-keys nil)
820 (setq secret-keys (cdr secret-keys)))) 857 (setq secret-keys (cdr secret-keys))))
@@ -1115,8 +1152,7 @@ If no one is selected, symmetric encryption will be performed. "
1115 (mapcar 1152 (mapcar
1116 (lambda (recipient) 1153 (lambda (recipient)
1117 (setq recipient-key (mml2015-epg-find-usable-key 1154 (setq recipient-key (mml2015-epg-find-usable-key
1118 (epg-list-keys context recipient) 1155 context recipient 'encrypt))
1119 'encrypt))
1120 (unless (or recipient-key 1156 (unless (or recipient-key
1121 (y-or-n-p 1157 (y-or-n-p
1122 (format "No public key for %s; skip it? " 1158 (format "No public key for %s; skip it? "