mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-21 18:38:08 +01:00
emacs: check drafts for encryption tags before saving
In general the user may not want to save plaintext copies of messages that they are sending encrypted, so give them a chance to abort.
This commit is contained in:
parent
d820b97477
commit
90248f862b
3 changed files with 52 additions and 0 deletions
|
@ -71,6 +71,21 @@ postponing and resuming a message."
|
||||||
:type '(repeat string)
|
:type '(repeat string)
|
||||||
:group 'notmuch-send)
|
:group 'notmuch-send)
|
||||||
|
|
||||||
|
(defcustom notmuch-draft-save-plaintext 'ask
|
||||||
|
"Should notmuch save/postpone in plaintext messages that seem
|
||||||
|
like they are intended to be sent encrypted
|
||||||
|
(i.e with an mml encryption tag in it)."
|
||||||
|
:type '(radio
|
||||||
|
(const :tag "Never" nil)
|
||||||
|
(const :tag "Ask every time" ask)
|
||||||
|
(const :tag "Always" t))
|
||||||
|
:group 'notmuch-draft
|
||||||
|
:group 'notmuch-crypto)
|
||||||
|
|
||||||
|
(defvar notmuch-draft-encryption-tag-regex
|
||||||
|
"<#\\(part encrypt\\|secure.*mode=.*encrypt>\\)"
|
||||||
|
"Regular expression matching mml tags indicating encryption of part or message")
|
||||||
|
|
||||||
(defvar notmuch-draft-id nil
|
(defvar notmuch-draft-id nil
|
||||||
"Message-id of the most recent saved draft of this message")
|
"Message-id of the most recent saved draft of this message")
|
||||||
(make-variable-buffer-local 'notmuch-draft-id)
|
(make-variable-buffer-local 'notmuch-draft-id)
|
||||||
|
@ -103,6 +118,27 @@ Used when a new version is saved, or the message is sent."
|
||||||
(goto-char (+ (match-beginning 0) 2))
|
(goto-char (+ (match-beginning 0) 2))
|
||||||
(insert "!"))))))
|
(insert "!"))))))
|
||||||
|
|
||||||
|
(defun notmuch-draft--has-encryption-tag ()
|
||||||
|
"Returns t if there is an mml secure tag."
|
||||||
|
(save-excursion
|
||||||
|
(message-goto-body)
|
||||||
|
(re-search-forward notmuch-draft-encryption-tag-regex nil 't)))
|
||||||
|
|
||||||
|
(defun notmuch-draft--query-encryption ()
|
||||||
|
"Checks if we should save a message that should be encrypted.
|
||||||
|
|
||||||
|
`notmuch-draft-save-plaintext' controls the behaviour."
|
||||||
|
(case notmuch-draft-save-plaintext
|
||||||
|
((ask)
|
||||||
|
(unless (yes-or-no-p "(Customize `notmuch-draft-save-plaintext' to avoid this warning)
|
||||||
|
This message contains mml tags that suggest it is intended to be encrypted.
|
||||||
|
Really save and index an unencrypted copy? ")
|
||||||
|
(error "Save aborted")))
|
||||||
|
((nil)
|
||||||
|
(error "Refusing to save draft with encryption tags (see `notmuch-draft-save-plaintext')"))
|
||||||
|
((t)
|
||||||
|
(ignore))))
|
||||||
|
|
||||||
(defun notmuch-draft--make-message-id ()
|
(defun notmuch-draft--make-message-id ()
|
||||||
;; message-make-message-id gives the id inside a "<" ">" pair,
|
;; message-make-message-id gives the id inside a "<" ">" pair,
|
||||||
;; but notmuch doesn't want that form, so remove them.
|
;; but notmuch doesn't want that form, so remove them.
|
||||||
|
@ -115,6 +151,8 @@ This saves the current message in the database with tags
|
||||||
`notmuch-draft-tags` (in addition to any default tags
|
`notmuch-draft-tags` (in addition to any default tags
|
||||||
applied to newly inserted messages)."
|
applied to newly inserted messages)."
|
||||||
(interactive)
|
(interactive)
|
||||||
|
(when (notmuch-draft--has-encryption-tag)
|
||||||
|
(notmuch-draft--query-encryption))
|
||||||
(let ((id (notmuch-draft--make-message-id)))
|
(let ((id (notmuch-draft--make-message-id)))
|
||||||
(with-temporary-notmuch-message-buffer
|
(with-temporary-notmuch-message-buffer
|
||||||
;; We insert a Date header and a Message-ID header, the former
|
;; We insert a Date header and a Message-ID header, the former
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
(require 'notmuch-lib)
|
(require 'notmuch-lib)
|
||||||
(require 'notmuch-address)
|
(require 'notmuch-address)
|
||||||
|
(require 'notmuch-draft)
|
||||||
|
|
||||||
(eval-when-compile (require 'cl))
|
(eval-when-compile (require 'cl))
|
||||||
|
|
||||||
|
|
|
@ -39,4 +39,17 @@ header_count=$(notmuch show --format=raw subject:draft-test-0003 | grep -c ^X-No
|
||||||
body_count=$(notmuch notmuch show --format=raw subject:draft-test-0003 | grep -c '^\<#secure')
|
body_count=$(notmuch notmuch show --format=raw subject:draft-test-0003 | grep -c '^\<#secure')
|
||||||
test_expect_equal "$header_count,$body_count" "1,0"
|
test_expect_equal "$header_count,$body_count" "1,0"
|
||||||
|
|
||||||
|
test_begin_subtest "Refusing to save an encrypted draft"
|
||||||
|
test_emacs '(notmuch-mua-mail)
|
||||||
|
(message-goto-subject)
|
||||||
|
(insert "draft-test-0004")
|
||||||
|
(mml-secure-message-sign-encrypt)
|
||||||
|
(let ((notmuch-draft-save-plaintext nil))
|
||||||
|
(notmuch-draft-save))
|
||||||
|
(test-output)'
|
||||||
|
count1=$(notmuch count tag:draft)
|
||||||
|
count2=$(notmuch count subject:draft-test-0004)
|
||||||
|
|
||||||
|
test_expect_equal "$count1,$count2" "3,0"
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
|
Loading…
Reference in a new issue