]> git.notmuchmail.org Git - notmuch/blobdiff - emacs/notmuch-crypto.el
Merge branch 'release'
[notmuch] / emacs / notmuch-crypto.el
index f03266ffc4e54932a82ad16963e4ca65d86e28cc..4216f58327a9fb0bef08670fa88f0b6e4723874a 100644 (file)
@@ -1,4 +1,4 @@
-;; notmuch-crypto.el --- functions for handling display of cryptographic metadata.
+;;; notmuch-crypto.el --- functions for handling display of cryptographic metadata.
 ;;
 ;; Copyright © Jameson Rollins
 ;;
 ;;
 ;; Copyright © Jameson Rollins
 ;;
 ;; General Public License for more details.
 ;;
 ;; You should have received a copy of the GNU General Public License
 ;; General Public License for more details.
 ;;
 ;; You should have received a copy of the GNU General Public License
-;; along with Notmuch.  If not, see <http://www.gnu.org/licenses/>.
+;; along with Notmuch.  If not, see <https://www.gnu.org/licenses/>.
 ;;
 ;; Authors: Jameson Rollins <jrollins@finestructure.net>
 
 ;;
 ;; Authors: Jameson Rollins <jrollins@finestructure.net>
 
-(defcustom notmuch-crypto-process-mime nil
+;;; Code:
+
+(require 'epg)
+(require 'notmuch-lib)
+
+(defcustom notmuch-crypto-process-mime t
   "Should cryptographic MIME parts be processed?
 
 If this variable is non-nil signatures in multipart/signed
   "Should cryptographic MIME parts be processed?
 
 If this variable is non-nil signatures in multipart/signed
@@ -31,75 +36,131 @@ on the success or failure of the verification process and on the
 validity of user ID of the signer.
 
 The effect of setting this variable can be seen temporarily by
 validity of user ID of the signer.
 
 The effect of setting this variable can be seen temporarily by
-viewing a signed or encrypted message with M-RET in notmuch
-search."
-  :group 'notmuch
-  :type 'boolean)
+providing a prefix when viewing a signed or encrypted message, or
+by providing a prefix when reloading the message in notmuch-show
+mode."
+  :type 'boolean
+  :package-version '(notmuch . "0.25")
+  :group 'notmuch-crypto)
+
+(defface notmuch-crypto-part-header
+  '((((class color)
+      (background dark))
+     (:foreground "LightBlue1"))
+    (((class color)
+      (background light))
+     (:foreground "blue")))
+  "Face used for crypto parts headers."
+  :group 'notmuch-crypto
+  :group 'notmuch-faces)
 
 (defface notmuch-crypto-signature-good
   '((t (:background "green" :foreground "black")))
   "Face used for good signatures."
 
 (defface notmuch-crypto-signature-good
   '((t (:background "green" :foreground "black")))
   "Face used for good signatures."
-  :group 'notmuch)
+  :group 'notmuch-crypto
+  :group 'notmuch-faces)
 
 (defface notmuch-crypto-signature-good-key
   '((t (:background "orange" :foreground "black")))
   "Face used for good signatures."
 
 (defface notmuch-crypto-signature-good-key
   '((t (:background "orange" :foreground "black")))
   "Face used for good signatures."
-  :group 'notmuch)
+  :group 'notmuch-crypto
+  :group 'notmuch-faces)
 
 (defface notmuch-crypto-signature-bad
   '((t (:background "red" :foreground "black")))
   "Face used for bad signatures."
 
 (defface notmuch-crypto-signature-bad
   '((t (:background "red" :foreground "black")))
   "Face used for bad signatures."
-  :group 'notmuch)
+  :group 'notmuch-crypto
+  :group 'notmuch-faces)
 
 (defface notmuch-crypto-signature-unknown
   '((t (:background "red" :foreground "black")))
   "Face used for signatures of unknown status."
 
 (defface notmuch-crypto-signature-unknown
   '((t (:background "red" :foreground "black")))
   "Face used for signatures of unknown status."
-  :group 'notmuch)
+  :group 'notmuch-crypto
+  :group 'notmuch-faces)
 
 (defface notmuch-crypto-decryption
   '((t (:background "purple" :foreground "black")))
   "Face used for encryption/decryption status messages."
 
 (defface notmuch-crypto-decryption
   '((t (:background "purple" :foreground "black")))
   "Face used for encryption/decryption status messages."
-  :group 'notmuch)
+  :group 'notmuch-crypto
+  :group 'notmuch-faces)
 
 (define-button-type 'notmuch-crypto-status-button-type
 
 (define-button-type 'notmuch-crypto-status-button-type
-  'action '(lambda (button) (message (button-get button 'help-echo)))
+  'action (lambda (button) (message (button-get button 'help-echo)))
   'follow-link t
   'follow-link t
-  'help-echo "Set notmuch-crypto-process-mime to process cryptographic mime parts.")
+  'help-echo "Set notmuch-crypto-process-mime to process cryptographic mime parts."
+  :supertype 'notmuch-button-type)
 
 (defun notmuch-crypto-insert-sigstatus-button (sigstatus from)
   (let* ((status (plist-get sigstatus :status))
         (help-msg nil)
 
 (defun notmuch-crypto-insert-sigstatus-button (sigstatus from)
   (let* ((status (plist-get sigstatus :status))
         (help-msg nil)
-        (label "Signature not processed")
-        (face 'notmuch-crypto-signature-unknown))
+        (show-button t)
+        (label nil)
+        (face 'notmuch-crypto-signature-unknown)
+        (button-action (lambda (button) (message (button-get button 'help-echo)))))
     (cond
      ((string= status "good")
     (cond
      ((string= status "good")
-      ; if userid present, userid has full or greater validity
-      (if (plist-member sigstatus :userid)
-         (let ((userid (plist-get sigstatus :userid)))
-           (setq label (concat "Good signature by: " userid))
-           (setq face 'notmuch-crypto-signature-good))
-       (let ((fingerprint (concat "0x" (plist-get sigstatus :fingerprint))))
-         (setq label (concat "Good signature by key: " fingerprint))
-         (setq face 'notmuch-crypto-signature-good-key))))
+      (let ((fingerprint (concat "0x" (plist-get sigstatus :fingerprint))))
+       ;; if userid present, userid has full or greater validity
+       (if (plist-member sigstatus :userid)
+           (let ((userid (plist-get sigstatus :userid)))
+             (setq label (concat "Good signature by: " userid))
+             (setq face 'notmuch-crypto-signature-good))
+         (progn
+           (setq label (concat "Good signature by key: " fingerprint))
+           (setq face 'notmuch-crypto-signature-good-key)))
+       (setq button-action 'notmuch-crypto-sigstatus-good-callback)
+       (setq help-msg (concat "Click to list key ID 0x" fingerprint "."))))
      ((string= status "error")
       (let ((keyid (concat "0x" (plist-get sigstatus :keyid))))
      ((string= status "error")
       (let ((keyid (concat "0x" (plist-get sigstatus :keyid))))
-       (setq label (concat "Unknown key ID " keyid " or unsupported algorithm"))))
+       (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 keyserver and redisplay."))))
      ((string= status "bad")
       (let ((keyid (concat "0x" (plist-get sigstatus :keyid))))
        (setq label (concat "Bad signature (claimed key ID " keyid ")"))
        (setq face 'notmuch-crypto-signature-bad)))
      ((string= status "bad")
       (let ((keyid (concat "0x" (plist-get sigstatus :keyid))))
        (setq label (concat "Bad signature (claimed key ID " keyid ")"))
        (setq face 'notmuch-crypto-signature-bad)))
+     (status
+      (setq label (concat "Unknown signature status: " status)))
      (t
      (t
-      (setq label "Unknown signature status")
-      (if status (setq label (concat label " \"" status "\"")))))
-    (insert-button
-     (concat "[ " label " ]")
-     :type 'notmuch-crypto-status-button-type
-     'help-echo help-msg
-     'face face
-     'mouse-face face
-     :notmuch-sigstatus sigstatus
-     :notmuch-from from)
-    (insert "\n")))
+      (setq show-button nil)))
+    (when show-button
+      (insert-button
+       (concat "[ " label " ]")
+       :type 'notmuch-crypto-status-button-type
+       'help-echo help-msg
+       'face face
+       'mouse-face face
+       'action button-action
+       :notmuch-sigstatus sigstatus
+       :notmuch-from from)
+      (insert "\n"))))
+
+(declare-function notmuch-show-refresh-view "notmuch-show" (&optional reset-state))
+
+(defun notmuch-crypto-sigstatus-good-callback (button)
+  (let* ((sigstatus (button-get button :notmuch-sigstatus))
+        (fingerprint (concat "0x" (plist-get sigstatus :fingerprint)))
+        (buffer (get-buffer-create "*notmuch-crypto-gpg-out*"))
+        (window (display-buffer buffer t nil)))
+    (with-selected-window window
+      (with-current-buffer buffer
+       (goto-char (point-max))
+       (call-process epg-gpg-program nil t t "--batch" "--no-tty" "--list-keys" fingerprint))
+      (recenter -1))))
+
+(defun notmuch-crypto-sigstatus-error-callback (button)
+  (let* ((sigstatus (button-get button :notmuch-sigstatus))
+        (keyid (concat "0x" (plist-get sigstatus :keyid)))
+        (buffer (get-buffer-create "*notmuch-crypto-gpg-out*"))
+        (window (display-buffer buffer t nil)))
+    (with-selected-window window
+      (with-current-buffer buffer
+       (goto-char (point-max))
+       (call-process epg-gpg-program nil t t "--batch" "--no-tty" "--recv-keys" keyid)
+       (insert "\n")
+       (call-process epg-gpg-program nil t t "--batch" "--no-tty" "--list-keys" keyid))
+      (recenter -1))
+    (notmuch-show-refresh-view)))
 
 (defun notmuch-crypto-insert-encstatus-button (encstatus)
   (let* ((status (plist-get encstatus :status))
 
 (defun notmuch-crypto-insert-encstatus-button (encstatus)
   (let* ((status (plist-get encstatus :status))
@@ -112,7 +173,8 @@ search."
      ((string= status "bad")
       (setq label "Decryption error"))
      (t
      ((string= status "bad")
       (setq label "Decryption error"))
      (t
-      (setq label (concat "Unknown encstatus \"" status "\""))))
+      (setq label (concat "Unknown encryption status"
+                         (if status (concat ": " status))))))
     (insert-button
      (concat "[ " label " ]")
      :type 'notmuch-crypto-status-button-type
     (insert-button
      (concat "[ " label " ]")
      :type 'notmuch-crypto-status-button-type
@@ -124,3 +186,5 @@ search."
 ;;
 
 (provide 'notmuch-crypto)
 ;;
 
 (provide 'notmuch-crypto)
+
+;;; notmuch-crypto.el ends here