aboutsummaryrefslogtreecommitdiffhomepage
path: root/emacs/notmuch-crypto.el
diff options
context:
space:
mode:
authorGravatar Jameson Graef Rollins <jrollins@finestructure.net>2011-05-25 18:01:19 -0700
committerGravatar Carl Worth <cworth@cworth.org>2011-05-27 16:22:00 -0700
commit45fe3547458e0c403f7501bad89860afe2fa534a (patch)
tree0862259ff3ba05f0ea28ce984d47ec32b33895de /emacs/notmuch-crypto.el
parent2e653db38fc38dee92b2ee0564e27921132e7232 (diff)
emacs: Add support for PGP/MIME verification/decryption
A new emacs configuration variable "notmuch-crypto-process-mime" controls the processing of PGP/MIME signatures and encrypted parts. When this is set true, notmuch-query will use the notmuch show --decrypt flag to decrypt encrypted messages and/or calculate the sigstatus of signed messages. If sigstatus is available, notmuch-show will place a specially color-coded header at the begining of the signed message. Also included is the ability to switch decryption/verification on/off on the fly, which is bound to M-RET in notmuch-search-mode.
Diffstat (limited to 'emacs/notmuch-crypto.el')
-rw-r--r--emacs/notmuch-crypto.el104
1 files changed, 104 insertions, 0 deletions
diff --git a/emacs/notmuch-crypto.el b/emacs/notmuch-crypto.el
new file mode 100644
index 00000000..944452b9
--- /dev/null
+++ b/emacs/notmuch-crypto.el
@@ -0,0 +1,104 @@
+;; notmuch-crypto.el --- functions for handling display of cryptographic metadata.
+;;
+;; Copyright © Jameson Rollins
+;;
+;; This file is part of Notmuch.
+;;
+;; Notmuch is free software: you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+;;
+;; Notmuch is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; 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/>.
+;;
+;; Authors: Jameson Rollins <jrollins@finestructure.net>
+
+(defcustom notmuch-crypto-process-mime nil
+ "Should cryptographic MIME parts be processed?
+
+If this variable is non-nil signatures in multipart/signed
+messages will be verified and multipart/encrypted parts will be
+decrypted. The result of the crypto operation will be displayed
+in a specially colored header button at the top of the processed
+part. Signed parts will have variously colored headers depending
+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
+viewing a signed or encrypted message with M-RET in notmuch
+search."
+ :group 'notmuch
+ :type 'boolean)
+
+(define-button-type 'notmuch-crypto-status-button-type
+ 'action '(lambda (button) (message (button-get button 'help-echo)))
+ 'follow-link t
+ 'help-echo "Set notmuch-crypto-process-mime to process cryptographic mime parts."
+ 'face '(:foreground "blue")
+ 'mouse-face '(:foreground "blue"))
+
+(defun notmuch-crypto-insert-sigstatus-button (sigstatus from)
+ (let* ((status (plist-get sigstatus :status))
+ (help-msg nil)
+ (label "multipart/signed: signature not processed")
+ (face '(:background "red" :foreground "black")))
+ (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 '(:background "green" :foreground "black")))
+ (let ((fingerprint (concat "0x" (plist-get sigstatus :fingerprint))))
+ (setq label (concat "Good signature by key: " fingerprint))
+ (setq face '(:background "orange" :foreground "black")))))
+ ((string= status "error")
+ (let ((keyid (concat "0x" (plist-get sigstatus :keyid))))
+ (setq label (concat "Unknown key ID " keyid " or unsupported algorithm"))
+ (setq face '(:background "red" :foreground "black"))))
+ ((string= status "bad")
+ (let ((keyid (concat "0x" (plist-get sigstatus :keyid))))
+ (setq label (concat "Bad signature (claimed key ID " keyid ")"))
+ (setq face '(:background "red" :foreground "black"))))
+ (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")))
+
+(defun notmuch-crypto-insert-encstatus-button (encstatus)
+ (let* ((status (plist-get encstatus :status))
+ (help-msg nil)
+ (label "multipart/encrypted: decryption not attempted")
+ (face '(:background "purple" :foreground "black")))
+ (cond
+ ((string= status "good")
+ (setq label "decryption successful"))
+ ((string= status "bad")
+ (setq label "decryption error"))
+ (t
+ (setq label (concat "unknown encstatus \"" status "\""))))
+ (insert-button
+ (concat "[ multipart/encrypted: " label " ]")
+ :type 'notmuch-crypto-status-button-type
+ 'help-echo help-msg
+ 'face face
+ 'mouse-face face)
+ (insert "\n")))
+
+;;
+
+(provide 'notmuch-crypto)