]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix epg filtering out keys that contain revoked IDs
authorLars Ingebrigtsen <larsi@gnus.org>
Thu, 4 Feb 2021 08:25:28 +0000 (09:25 +0100)
committerLars Ingebrigtsen <larsi@gnus.org>
Thu, 4 Feb 2021 08:25:32 +0000 (09:25 +0100)
* lisp/epg.el (epg--filter-revoked-keys): Only filter out the
revoked user ids, not the entire key that contains revoked user
ids (bug#46138).

lisp/epg.el

index b1f37cbbdcf5b01f961fcc221e1e5a3a249b4fa7..36794d09a75f82e7b4cff5fa12c842633eb5ba6a 100644 (file)
@@ -332,7 +332,6 @@ callback data (if any)."
 (cl-defstruct (epg-key
                (:constructor nil)
                (:constructor epg-make-key (owner-trust))
-               (:copier nil)
                (:predicate nil))
   (owner-trust nil :read-only t)
   sub-key-list user-id-list)
@@ -1383,11 +1382,22 @@ NAME is either a string or a list of strings."
     keys))
 
 (defun epg--filter-revoked-keys (keys)
-  (seq-remove (lambda (key)
-                (seq-find (lambda (user)
-                            (eq (epg-user-id-validity user) 'revoked))
-                          (epg-key-user-id-list key)))
-              keys))
+  (mapcar
+   (lambda (key)
+     ;; We have something revoked, so copy the key and remove the
+     ;; revoked bits.
+     (if (seq-find (lambda (user)
+                     (eq (epg-user-id-validity user) 'revoked))
+                   (epg-key-user-id-list key))
+         (let ((copy (copy-epg-key key)))
+           (setf (epg-key-user-id-list copy)
+                 (seq-remove (lambda (user)
+                               (eq (epg-user-id-validity user) 'revoked))
+                             (epg-key-user-id-list copy)))
+           copy)
+       ;; Nothing to delete; return the key.
+       key))
+   keys))
 
 (defun epg--args-from-sig-notations (notations)
   (apply #'nconc