(defvar epg-user-id-alist nil
"An alist mapping from key ID to user ID.")
+(defvar epg-last-status nil)
(defvar epg-read-point nil)
(defvar epg-process-filter-running nil)
(defvar epg-pending-status-list nil)
(let* ((args (append (list "--no-tty"
"--status-fd" "1"
"--yes")
- (if (string-match ":" (or (getenv "GPG_AGENT_INFO") ""))
+ (if (and (not (eq (epg-context-protocol context) 'CMS))
+ (string-match ":" (or (getenv "GPG_AGENT_INFO")
+ "")))
'("--use-agent"))
(if (and (not (eq (epg-context-protocol context) 'CMS))
(epg-context-progress-callback context))
(list "--output" (epg-context-output-file context)))
args))
(coding-system-for-write 'binary)
+ (coding-system-for-read 'binary)
process-connection-type
(orig-mode (default-file-modes))
(buffer (generate-new-buffer " *epg*"))
epg-gpg-program)
(mapconcat #'identity args " ")))))
(with-current-buffer buffer
+ (if (fboundp 'set-buffer-multibyte)
+ (set-buffer-multibyte nil))
+ (make-local-variable 'epg-last-status)
+ (setq epg-last-status nil)
(make-local-variable 'epg-read-point)
(setq epg-read-point (point-min))
(make-local-variable 'epg-process-filter-running)
(setq epg-pending-status-list nil))
(if (and symbol
(fboundp symbol))
- (funcall symbol epg-context string))))
+ (funcall symbol epg-context string))
+ (setq epg-last-status (cons status string))))
(forward-line)
(setq epg-read-point (point))))
(setq epg-process-filter-running nil))))))
(let* ((key-id (match-string 1 string))
(user-id (match-string 2 string))
(entry (assoc key-id epg-user-id-alist)))
+ (condition-case nil
+ (if (eq (epg-context-protocol context) 'CMS)
+ (setq user-id (epg-dn-from-string user-id))
+ (setq user-id (epg--decode-coding-string user-id 'utf-8)))
+ (error))
(if entry
(setcdr entry user-id)
(setq epg-user-id-alist (cons (cons key-id user-id)
(if encoded-passphrase-with-new-line
(epg--clear-string encoded-passphrase-with-new-line))))))
+(defun epg--prompt-GET_BOOL (context string)
+ (let ((entry (assoc string epg-prompt-alist)))
+ (y-or-n-p (if entry (cdr entry) (concat string "? ")))))
+
+(defun epg--prompt-GET_BOOL-untrusted_key.override (context string)
+ (y-or-n-p (if (equal (car epg-last-status) "USERID_HINT")
+ (format "Untrusted key %s. Use anyway? "
+ (cdr epg-last-status))
+ "Use untrusted key anyway? ")))
+
(defun epg--status-GET_BOOL (context string)
- (let ((entry (assoc string epg-prompt-alist))
- inhibit-quit)
+ (let (inhibit-quit)
(condition-case nil
- (if (y-or-n-p (if entry (cdr entry) (concat string "? ")))
- (process-send-string (epg-context-process context) "y\n")
- (process-send-string (epg-context-process context) "n\n"))
+ (if (funcall (or (intern-soft (concat "epg--prompt-GET_BOOL-" string))
+ #'epg--prompt-GET_BOOL)
+ context string)
+ (process-send-string (epg-context-process context) "y\n")
+ (process-send-string (epg-context-process context) "n\n"))
(quit
(epg-context-set-result-for
context 'error
'verify
(cons (epg-make-signature status key-id)
(epg-context-result-for context 'verify)))
- (if (eq (epg-context-protocol context) 'CMS)
- (condition-case nil
+ (condition-case nil
+ (if (eq (epg-context-protocol context) 'CMS)
(setq user-id (epg-dn-from-string user-id))
- (error)))
+ (setq user-id (epg--decode-coding-string user-id 'utf-8)))
+ (error))
(if entry
(setcdr entry user-id)
(setq epg-user-id-alist
(epg-signature-set-creation-time
signature
(epg--time-from-seconds (match-string 2 string)))
- (epg-signature-set-expiration-time
- signature
- (epg--time-from-seconds (match-string 3 string)))
+ (unless (equal (match-string 3 string) "0")
+ (epg-signature-set-expiration-time
+ signature
+ (epg--time-from-seconds (match-string 3 string))))
(epg-signature-set-version
signature
(string-to-number (match-string 4 string)))
(let* ((key-id (match-string 1 string))
(user-id (match-string 2 string))
(entry (assoc key-id epg-user-id-alist)))
+ (condition-case nil
+ (if (eq (epg-context-protocol context) 'CMS)
+ (setq user-id (epg-dn-from-string user-id))
+ (setq user-id (epg--decode-coding-string user-id 'utf-8)))
+ (error))
(if entry
(setcdr entry user-id)
(setq epg-user-id-alist (cons (cons key-id user-id)
(string-to-number (aref line 2))
(aref line 4)
(epg--time-from-seconds (aref line 5))
- (epg--time-from-seconds (aref line 6))))
+ (if (aref line 6)
+ (epg--time-from-seconds (aref line 6)))))
;;;###autoload
(defun epg-list-keys (context &optional name mode)
(defalias 'epg--encode-coding-string 'encode-coding-string)
(defalias 'epg--encode-coding-string 'identity))
+(if (fboundp 'decode-coding-string)
+ (defalias 'epg--decode-coding-string 'decode-coding-string)
+ (defalias 'epg--decode-coding-string 'identity))
+
(defun epg--args-from-sig-notations (notations)
(apply #'nconc
(mapcar
(defun epg--decode-hexstring (string)
(let ((index 0))
(while (eq index (string-match "[0-9A-Fa-f][0-9A-Fa-f]" string index))
- (setq string (replace-match "\\x\\&" t nil string)
+ (setq string (replace-match "\\\\x\\&" t nil string)
index (+ index 4)))
(car (read-from-string (concat "\"" string "\"")))))
(setq string (replace-match "\\2" t nil string)
index (1+ index))
(if (match-beginning 3)
- (setq string (replace-match "\\x\\3" t nil string)
+ (setq string (replace-match "\\\\x\\3" t nil string)
index (+ index 4))
(setq string (replace-match "\\\\\\\\\\4" t nil string)
index (+ index 3)))))