* crypto/mu4e: support signature verification in mu4e (WIP)
This commit is contained in:
@ -526,8 +526,8 @@ process."
|
|||||||
|
|
||||||
(defun mu4e-error-handler (errcode errmsg)
|
(defun mu4e-error-handler (errcode errmsg)
|
||||||
"Handler function for showing an error."
|
"Handler function for showing an error."
|
||||||
(case errcode
|
(case errcode
|
||||||
(4 (mu4e-message "No matches for this search query."))
|
(4 (mu4e-error "No matches for this search query."))
|
||||||
(t (mu4e-error "Error %d: %s" errcode errmsg))))
|
(t (mu4e-error "Error %d: %s" errcode errmsg))))
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
|||||||
@ -122,6 +122,24 @@ else: don't split (show either headers or messages, not both) Also
|
|||||||
see `mu4e-headers-visible-lines' and
|
see `mu4e-headers-visible-lines' and
|
||||||
`mu4e-headers-visible-columns'.")
|
`mu4e-headers-visible-columns'.")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;; crypto
|
||||||
|
(defgroup mu4e-crypto nil
|
||||||
|
"Crypto-related settings."
|
||||||
|
:group 'mu4e)
|
||||||
|
|
||||||
|
(defcustom mu4e-auto-retrieve-keys nil
|
||||||
|
"Attempt to automatically retrieve public keys when needed."
|
||||||
|
:type 'boolean
|
||||||
|
:group 'mu4e-compose)
|
||||||
|
|
||||||
|
(defcustom mu4e-use-agent nil
|
||||||
|
"Attempt to use GPG-agent when it is available."
|
||||||
|
:type 'boolean
|
||||||
|
:group 'mu4e-compose)
|
||||||
|
|
||||||
;; completion; we put them here rather than in mu4e-compose, as mu4e-utils needs
|
;; completion; we put them here rather than in mu4e-compose, as mu4e-utils needs
|
||||||
;; the variables.
|
;; the variables.
|
||||||
|
|
||||||
@ -273,6 +291,7 @@ flag set)."
|
|||||||
"Face for special header values in the message view."
|
"Face for special header values in the message view."
|
||||||
:group 'mu4e-faces)
|
:group 'mu4e-faces)
|
||||||
|
|
||||||
|
|
||||||
(defface mu4e-view-link-face
|
(defface mu4e-view-link-face
|
||||||
'((t :inherit font-lock-type-face :underline t))
|
'((t :inherit font-lock-type-face :underline t))
|
||||||
"Face for showing URLs and attachments in the message view."
|
"Face for showing URLs and attachments in the message view."
|
||||||
@ -350,6 +369,17 @@ flag set)."
|
|||||||
headers)."
|
headers)."
|
||||||
:group 'mu4e-faces)
|
:group 'mu4e-faces)
|
||||||
|
|
||||||
|
(defface mu4e-ok-face
|
||||||
|
'((t :inherit font-lock-comment-face :bold t :slant normal))
|
||||||
|
"Face for things that are okay."
|
||||||
|
:group 'mu4e-faces)
|
||||||
|
|
||||||
|
(defface mu4e-warning-face
|
||||||
|
'((t :inherit font-lock-warning-face :bold t :slant normal))
|
||||||
|
"Face for warnings / error."
|
||||||
|
:group 'mu4e-faces)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;; headers info
|
;; headers info
|
||||||
(defconst mu4e-header-info
|
(defconst mu4e-header-info
|
||||||
|
|||||||
@ -37,6 +37,7 @@
|
|||||||
(require 'filladapt nil 'noerror)
|
(require 'filladapt nil 'noerror)
|
||||||
(require 'comint)
|
(require 'comint)
|
||||||
(require 'browse-url)
|
(require 'browse-url)
|
||||||
|
(require 'button)
|
||||||
|
|
||||||
(eval-when-compile (byte-compile-disable-warning 'cl-functions))
|
(eval-when-compile (byte-compile-disable-warning 'cl-functions))
|
||||||
(require 'cl)
|
(require 'cl)
|
||||||
@ -339,13 +340,19 @@ at POINT, or if nil, at (point)."
|
|||||||
(remove-if 'null
|
(remove-if 'null
|
||||||
(mapcar (lambda (part) (plist-get part :signature)) parts)))
|
(mapcar (lambda (part) (plist-get part :signature)) parts)))
|
||||||
(val (when verdicts
|
(val (when verdicts
|
||||||
(mapconcat (lambda (v) (symbol-name v)) verdicts ", ")))
|
(mapconcat
|
||||||
|
(lambda (v)
|
||||||
|
(propertize (symbol-name v)
|
||||||
|
'face (if (eq v 'good) 'mu4e-ok-face 'mu4e-warning-face)))
|
||||||
|
verdicts ", ")))
|
||||||
(btn (when val
|
(btn (when val
|
||||||
(with-temp-buffer
|
(with-temp-buffer
|
||||||
(insert-text-button "Details") (buffer-string))))
|
(insert-text-button "Details"
|
||||||
(val (when val
|
'msg msg
|
||||||
(concat (propertize val 'face 'mu4e-view-special-header-value-face)
|
'action (lambda (b)
|
||||||
" (" btn ")"))))
|
(mu4e-view-verify-msg-popup (button-get b 'msg))))
|
||||||
|
(buffer-string))))
|
||||||
|
(val (when val (concat val " (" btn ")"))))
|
||||||
(mu4e~view-construct-header :signature val t)))
|
(mu4e~view-construct-header :signature val t)))
|
||||||
|
|
||||||
(defun mu4e~view-open-save-attach-func (msg attachnum is-open)
|
(defun mu4e~view-open-save-attach-func (msg attachnum is-open)
|
||||||
@ -441,6 +448,8 @@ is nil, and otherwise open it."
|
|||||||
(define-key map "t" 'mu4e-view-mark-subthread)
|
(define-key map "t" 'mu4e-view-mark-subthread)
|
||||||
(define-key map "T" 'mu4e-view-mark-thread)
|
(define-key map "T" 'mu4e-view-mark-thread)
|
||||||
|
|
||||||
|
(define-key map "v" 'mu4e-view-verify-msg-popup)
|
||||||
|
|
||||||
(define-key map "j" 'mu4e~headers-jump-to-maildir)
|
(define-key map "j" 'mu4e~headers-jump-to-maildir)
|
||||||
|
|
||||||
(define-key map "g" 'mu4e-view-go-to-url)
|
(define-key map "g" 'mu4e-view-go-to-url)
|
||||||
@ -1113,6 +1122,32 @@ the results."
|
|||||||
(let ((path (mu4e-field-at-point :path)))
|
(let ((path (mu4e-field-at-point :path)))
|
||||||
(mu4e-process-file-through-pipe path cmd)))
|
(mu4e-process-file-through-pipe path cmd)))
|
||||||
|
|
||||||
|
(defconst mu4e~verify-buffer-name " *mu4e-verify*")
|
||||||
|
|
||||||
|
(defun mu4e-view-verify-msg-popup (&optional msg)
|
||||||
|
"Pop-up a little signature verification window for (optional) MSG
|
||||||
|
or message-at-point."
|
||||||
|
(interactive)
|
||||||
|
(let* ((path (if msg (plist-get msg :path) (mu4e-field-at-point :path)))
|
||||||
|
(cmd (format "%s verify --verbose %s"
|
||||||
|
mu4e-mu-binary
|
||||||
|
(shell-quote-argument path)))
|
||||||
|
(output (shell-command-to-string cmd))
|
||||||
|
;; create a new one
|
||||||
|
(buf (get-buffer-create mu4e~verify-buffer-name))
|
||||||
|
(win (or (get-buffer-window buf)
|
||||||
|
(split-window-vertically (- (window-height) 6)))))
|
||||||
|
(with-selected-window win
|
||||||
|
(let ((inhibit-read-only t))
|
||||||
|
;; (set-window-dedicated-p win t)
|
||||||
|
(switch-to-buffer buf)
|
||||||
|
(erase-buffer)
|
||||||
|
(insert output)
|
||||||
|
(goto-char (point-min))
|
||||||
|
(local-set-key "q" 'kill-buffer-and-window)))
|
||||||
|
(select-window win)))
|
||||||
|
|
||||||
|
|
||||||
(defun mu4e~view-quit-buffer ()
|
(defun mu4e~view-quit-buffer ()
|
||||||
"Quit the mu4e-view buffer. This is a rather complex function, to
|
"Quit the mu4e-view buffer. This is a rather complex function, to
|
||||||
ensure we don't disturb other windows."
|
ensure we don't disturb other windows."
|
||||||
|
|||||||
@ -828,6 +828,8 @@ misc
|
|||||||
w toggle line wrapping
|
w toggle line wrapping
|
||||||
h toggle showing cited parts
|
h toggle showing cited parts
|
||||||
|
|
||||||
|
v show details about the cryptographic signature
|
||||||
|
|
||||||
. show the raw message view. 'q' takes you back.
|
. show the raw message view. 'q' takes you back.
|
||||||
C-+,C-- increase / decrease the number of headers shown
|
C-+,C-- increase / decrease the number of headers shown
|
||||||
H get help
|
H get help
|
||||||
@ -941,6 +943,28 @@ As mentioned, by default @t{mu4e} prefers the text-version of an e-mail
|
|||||||
message over the html version. You can change this by setting
|
message over the html version. You can change this by setting
|
||||||
@code{mu4e-view-prefer-html} to @t{t}.
|
@code{mu4e-view-prefer-html} to @t{t}.
|
||||||
|
|
||||||
|
@subsection Verifying signatures
|
||||||
|
|
||||||
|
Some e-mail messages are cryptographically signed, and @t{mu4e} can check the
|
||||||
|
validity of the signatures@footnote{Signature-verification is only available
|
||||||
|
if @t{mu} was built with crypto-support; this requires at least @t{mu} version 0.9.9
|
||||||
|
and @t{GMime 2.6}, and the @t{gpg} program}.
|
||||||
|
|
||||||
|
If a message has a signature, the message view shows an extra header
|
||||||
|
@t{Signature:} (assuming it is part of your @code{mu4e-view-fields}), and one
|
||||||
|
or more 'verdicts' of the signatures found; either @t{good}, @t{bad} or
|
||||||
|
@t{error}. For instance:
|
||||||
|
|
||||||
|
@verbatim
|
||||||
|
Signature: good, error (Details)
|
||||||
|
@end verbatim
|
||||||
|
|
||||||
|
You can see the details of the signature verification by activating the
|
||||||
|
@t{Details} or pressing @key{v}. This will pop-up a little window with the
|
||||||
|
details of the signatures found and whether they could be verified or not.
|
||||||
|
|
||||||
|
For more information, see the @t{mu-verify} manual page.
|
||||||
|
|
||||||
@node Editor view
|
@node Editor view
|
||||||
@section Editor view
|
@section Editor view
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user