From 45fe3547458e0c403f7501bad89860afe2fa534a Mon Sep 17 00:00:00 2001 From: Jameson Graef Rollins Date: Wed, 25 May 2011 18:01:19 -0700 Subject: 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. --- emacs/notmuch-crypto.el | 104 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 emacs/notmuch-crypto.el (limited to 'emacs/notmuch-crypto.el') diff --git a/emacs/notmuch-crypto.el b/emacs/notmuch-crypto.el new file mode 100644 index 0000000..944452b --- /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 . +;; +;; Authors: Jameson Rollins + +(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) -- cgit v1.2.3