diff options
author | Richard M. Stallman <rms@gnu.org> | 2015-03-22 03:51:55 -0400 |
---|---|---|
committer | Richard Stallman <rms@gnu.org> | 2015-03-22 03:51:55 -0400 |
commit | dca743f0941909a80e3f28c023977120b6203e20 (patch) | |
tree | 8954912fffde0024a980c03ea51f66b632e20723 /lisp/mail | |
parent | 1a80be15bb1974d454cf37bcd1bd1be64e2cb488 (diff) | |
download | emacs-dca743f0941909a80e3f28c023977120b6203e20.tar.gz |
Recognize more format variation. Automatically reshow decrypted text.
* mail/rmail.el (rmail-epa-decrypt): Disregard <pre> before armor.
Ignore more kinds of whitespace in mime headers.
Modify the decrypted mime part's mime type so it will be displayed
by default when visiting this message again.
* lisp/mail/rmail.el (rmail-show-message-1): When displaying a mime message,
indicate start and finish in the echo area.
Diffstat (limited to 'lisp/mail')
-rw-r--r-- | lisp/mail/rmail.el | 55 |
1 files changed, 41 insertions, 14 deletions
diff --git a/lisp/mail/rmail.el b/lisp/mail/rmail.el index 643b5f947c7..790254a6312 100644 --- a/lisp/mail/rmail.el +++ b/lisp/mail/rmail.el @@ -4532,17 +4532,22 @@ encoded string (and the same mask) will decode the string." (let ((coding-system-for-read coding-system-for-read) (case-fold-search t) unquote - armor-start armor-prefix armor-end after-end) + armor-start armor-prefix armor-end-regexp armor-end after-end) (setq armor-start (match-beginning 0) armor-prefix (buffer-substring (line-beginning-position) - armor-start) - armor-end (re-search-forward - (concat "^" - armor-prefix - "-----END PGP MESSAGE-----$") - nil t)) + armor-start)) + (if (string-match "<pre>\\'" armor-prefix) + (setq armor-prefix "")) + + (setq armor-end-regexp + (concat "^" + armor-prefix + "-----END PGP MESSAGE-----$")) + (setq armor-end (re-search-forward armor-end-regexp + nil t)) + (unless armor-end (error "Encryption armor beginning has no matching end")) (goto-char armor-start) @@ -4563,13 +4568,13 @@ encoded string (and the same mask) will decode the string." ;; Use the charset specified in the armor. (unless coding-system-for-read - (if (re-search-forward "^Charset: \\(.*\\)" nil t) + (if (re-search-forward "^[ \t]*Charset[ \t\n]*:[ \t\n]*\\(.*\\)" nil t) (setq coding-system-for-read (epa--find-coding-system-for-mime-charset (intern (downcase (match-string 1))))))) (goto-char (point-min)) - (if (re-search-forward "^[ \t]*Content-transfer-encoding[ \t]*:[ \t]*quoted-printable[ \t]*$" nil t) + (if (re-search-forward "^[ \t]*Content-transfer-encoding[ \t\n]*:[ \t\n]*quoted-printable[ \t]*$" nil t) (setq unquote t))))) (when unquote @@ -4587,7 +4592,8 @@ encoded string (and the same mask) will decode the string." (goto-char armor-start) (current-buffer)))) - (push (list armor-start (- (point-max) after-end)) + (push (list armor-start (- (point-max) after-end) mime + armor-end-regexp) decrypts))) (unless decrypts @@ -4603,14 +4609,35 @@ encoded string (and the same mask) will decode the string." (narrow-to-region beg end) (goto-char (point-min)) (dolist (d decrypts) + ;; Find, in the real Rmail buffer, the same armors + ;; that we found and decrypted in the view buffer. (if (re-search-forward "-----BEGIN PGP MESSAGE-----$" nil t) - (let (armor-start armor-end) + (let (armor-start armor-end armor-end-regexp) (setq armor-start (match-beginning 0) - armor-end (re-search-forward "^-----END PGP MESSAGE-----$" - nil t)) + armor-end-regexp (nth 3 d) + armor-end (re-search-forward + armor-end-regexp + nil t)) + + ;; Found as expected -- now replace it with the decrypt. (when armor-end (delete-region armor-start armor-end) - (insert-buffer-substring from-buffer (nth 0 d) (nth 1 d))))))))))))) + (insert-buffer-substring from-buffer (nth 0 d) (nth 1 d))) + + ;; Change the mime type (if this is in a mime part) + ;; so this part will display by default + ;; when the message is shown later. + (when (nth 2 d) + (goto-char armor-start) + (when (re-search-backward "^--" nil t) + (save-restriction + (narrow-to-region (point) armor-start) + (when (re-search-forward "^content-type[ \t\n]*:[ \t\n]*" nil t) + (when (looking-at "[^\n \t;]+") + (let ((value (match-string 0))) + (unless (member value '("text/plain" "text/html")) + (replace-match "text/plain")))))))) + )))))))))) ;;;; Desktop support |