-;;; notmuch-crypto.el --- functions for handling display of cryptographic metadata.
+;;; notmuch-crypto.el --- functions for handling display of cryptographic metadata -*- lexical-binding: t -*-
;;
;; Copyright © Jameson Rollins
;;
(require 'epg)
(require 'notmuch-lib)
+(declare-function notmuch-show-get-message-id "notmuch-show" (&optional bare))
+
+;;; Options
+
(defcustom notmuch-crypto-process-mime t
- "Should cryptographic MIME parts be processed?
+ "Whether to process cryptographic MIME parts.
If this variable is non-nil signatures in multipart/signed
messages will be verified and multipart/encrypted parts will be
:group 'notmuch-crypto)
(defcustom notmuch-crypto-get-keys-asynchronously t
- "Retrieve gpg keys asynchronously."
+ "Whether to retrieve openpgp keys asynchronously."
:type 'boolean
:group 'notmuch-crypto)
:type 'string
:group 'notmuch-crypto)
+;;; Faces
+
(defface notmuch-crypto-part-header
'((((class color)
(background dark))
:group 'notmuch-crypto
:group 'notmuch-faces)
+;;; Functions
+
(define-button-type 'notmuch-crypto-status-button-type
- 'action (lambda (button) (message (button-get button 'help-echo)))
+ 'action (lambda (button) (message "%s" (button-get button 'help-echo)))
'follow-link t
'help-echo "Set notmuch-crypto-process-mime to process cryptographic mime parts."
:supertype 'notmuch-button-type)
(defun notmuch-crypto-insert-sigstatus-button (sigstatus from)
- "Insert a button describing the signature status SIGSTATUS sent
-by user FROM."
+ "Insert a button describing the signature status SIGSTATUS sent by user FROM."
(let* ((status (plist-get sigstatus :status))
(show-button t)
(face 'notmuch-crypto-signature-unknown)
(cond
((string= status "good")
(let ((fingerprint (concat "0x" (plist-get sigstatus :fingerprint)))
- (userid (plist-get sigstatus :userid)))
- ;; If userid is present it has full or greater validity.
- (if userid
- (setq label (concat "Good signature by: " userid)
- face 'notmuch-crypto-signature-good)
- (setq label (concat "Good signature by key: " fingerprint)
- face 'notmuch-crypto-signature-good-key))
- (setq button-action 'notmuch-crypto-sigstatus-good-callback
- help-msg (concat "Click to list key ID 0x" fingerprint "."))))
-
+ (email-or-userid (or (plist-get sigstatus :email)
+ (plist-get sigstatus :userid))))
+ ;; If email or userid are present, they have full or greater validity.
+ (setq label (concat "Good signature by key: " fingerprint))
+ (setq face 'notmuch-crypto-signature-good-key)
+ (when email-or-userid
+ (setq label (concat "Good signature by: " email-or-userid))
+ (setq face 'notmuch-crypto-signature-good))
+ (setq button-action 'notmuch-crypto-sigstatus-good-callback)
+ (setq help-msg (concat "Click to list key ID 0x" fingerprint "."))))
((string= status "error")
- (setq label (concat "Unknown key ID " keyid " or unsupported algorithm")
- button-action 'notmuch-crypto-sigstatus-error-callback
- help-msg (concat "Click to retrieve key ID " keyid
- " from keyserver.")))
-
+ (setq label (concat "Unknown key ID " keyid " or unsupported algorithm"))
+ (setq button-action 'notmuch-crypto-sigstatus-error-callback)
+ (setq help-msg (concat "Click to retrieve key ID " keyid
+ " from key server.")))
((string= status "bad")
- (setq label (concat "Bad signature (claimed key ID " keyid ")")
- face 'notmuch-crypto-signature-bad))
-
+ (setq label (concat "Bad signature (claimed key ID " keyid ")"))
+ (setq face 'notmuch-crypto-signature-bad))
(status
(setq label (concat "Unknown signature status: " status)))
(t
(goto-char (point-max))
(insert (format "-- Key %s in message %s:\n"
fingerprint id))
- (call-process notmuch-crypto-gpg-program nil t t "--batch" "--no-tty" "--list-keys" fingerprint))
+ (notmuch--call-process notmuch-crypto-gpg-program nil t t
+ "--batch" "--no-tty" "--list-keys" fingerprint))
(recenter -1))))
(declare-function notmuch-show-refresh-view "notmuch-show" (&optional reset-state))
+(declare-function notmuch-show-get-message-id "notmuch-show" (&optional bare))
-(defun notmuch-crypto--async-key-sentinel (process event)
+(defun notmuch-crypto--async-key-sentinel (process _event)
"When the user asks for a GPG key to be retrieved
asynchronously, handle completion of that task.
(with-current-buffer buffer
(goto-char (point-max))
(insert (format "--- Retrieving key %s:\n" keyid)))
- (let ((p (make-process :name "notmuch GPG key retrieval"
- :connection-type 'pipe
- :buffer buffer
- :stderr buffer
- :command (list notmuch-crypto-gpg-program "--recv-keys" keyid)
- :sentinel #'notmuch-crypto--async-key-sentinel)))
+ (let ((p (notmuch--make-process
+ :name "notmuch GPG key retrieval"
+ :connection-type 'pipe
+ :buffer buffer
+ :stderr buffer
+ :command (list notmuch-crypto-gpg-program "--recv-keys" keyid)
+ :sentinel #'notmuch-crypto--async-key-sentinel)))
(process-put p :gpg-key-id keyid)
(process-put p :notmuch-show-buffer (current-buffer))
(process-put p :notmuch-show-point (point))
(message "Getting the GPG key %s asynchronously..." keyid)))
-
(let ((window (display-buffer buffer)))
(with-selected-window window
(with-current-buffer buffer
(goto-char (point-max))
(insert (format "--- Retrieving key %s:\n" keyid))
- (call-process notmuch-crypto-gpg-program nil t t "--recv-keys" keyid)
+ (notmuch--call-process notmuch-crypto-gpg-program nil t t "--recv-keys" keyid)
(insert "\n")
- (call-process notmuch-crypto-gpg-program nil t t "--list-keys" keyid))
+ (notmuch--call-process notmuch-crypto-gpg-program nil t t "--list-keys" keyid))
(recenter -1))
(notmuch-show-refresh-view)))))
"Decryption error")
(t
(concat "Unknown encryption status"
- (if status (concat ": " status))))))
+ (and status (concat ": " status))))))
" ]")
:type 'notmuch-crypto-status-button-type
'face 'notmuch-crypto-decryption
'mouse-face 'notmuch-crypto-decryption)
(insert "\n"))
-;;
+;;; _
(provide 'notmuch-crypto)