Discourage use of inline PGP messages.
[elisp/epg.git] / epg.el
diff --git a/epg.el b/epg.el
index b2b4bf1..7993b48 100644 (file)
--- a/epg.el
+++ b/epg.el
@@ -1662,19 +1662,25 @@ This function is for internal use only."
 (defun epg--list-keys-1 (context name mode)
   (let ((args (append (if epg-gpg-home-directory
                          (list "--homedir" epg-gpg-home-directory))
-                     (list "--with-colons" "--no-greeting" "--batch"
-                           "--with-fingerprint"
-                           "--with-fingerprint"
-                           (if (memq mode '(t secret))
-                               "--list-secret-keys"
-                             (if (memq mode '(nil public))
-                                 "--list-keys"
-                               "--list-sigs")))
+                     '("--with-colons" "--no-greeting" "--batch"
+                       "--with-fingerprint" "--with-fingerprint")
                      (unless (eq (epg-context-protocol context) 'CMS)
-                       '("--fixed-list-mode"))
-                     (if name (list name))))
+                       '("--fixed-list-mode"))))
+       (list-keys-option (if (memq mode '(t secret))
+                             "--list-secret-keys"
+                           (if (memq mode '(nil public))
+                               "--list-keys"
+                             "--list-sigs")))
        (coding-system-for-read 'binary)
        keys string field index)
+    (if name
+       (progn
+         (unless (listp name)
+           (setq name (list name)))
+         (while name
+           (setq args (append args (list list-keys-option (car name)))
+                 name (cdr name))))
+      (setq args (append args (list list-keys-option))))
     (with-temp-buffer
       (apply #'call-process
             (if (eq (epg-context-protocol context) 'CMS)
@@ -1715,7 +1721,8 @@ This function is for internal use only."
 If MODE is nil or 'public, only public keyring should be searched.
 If MODE is t or 'secret, only secret keyring should be searched. 
 Otherwise, only public keyring should be searched and the key
-signatures should be included."
+signatures should be included.
+NAME is either a string or a list of strings."
   (let ((lines (epg--list-keys-1 context name mode))
        keys cert pointer pointer-1 index string)
     (while lines
@@ -1737,7 +1744,10 @@ signatures should be included."
         (cons (epg--make-sub-key-1 (car lines))
               (epg-key-sub-key-list (car keys)))))
        ((equal (aref (car lines) 0) "uid")
-       (setq string (copy-sequence (aref (car lines) 9)))
+       ;; Decode the UID name as a backslash escaped UTF-8 string,
+       ;; generated by GnuPG/GpgSM.
+       (setq string (copy-sequence (aref (car lines) 9))
+             index 0)
        (while (string-match "\"" string index)
          (setq string (replace-match "\\\"" t t string)
                index (1+ (match-end 0))))
@@ -1754,7 +1764,9 @@ signatures should be included."
                    (cdr (assq (string-to-char (aref (car lines) 1))
                               epg-key-validity-alist)))
                (if cert
-                   (epg-dn-from-string string)
+                   (condition-case nil
+                       (epg-dn-from-string string)
+                     (error string))
                  string))
               (epg-key-user-id-list (car keys)))))
        ((equal (aref (car lines) 0) "fpr")
@@ -2554,7 +2566,7 @@ PARAMETERS is a string which tells how to create the key."
 \\([0-9A-Fa-f][0-9A-Fa-f]\\)\\)"
                         string index)
       (if (match-beginning 2)
-         (setq string (replace-match "\\2" t t string)
+         (setq string (replace-match "\\2" t nil string)
                index (1- (match-end 0)))
        (if (match-beginning 3)
            (setq string (replace-match (string (string-to-number