diff options
Diffstat (limited to 'lisp/mail/rmail.el')
| -rw-r--r-- | lisp/mail/rmail.el | 73 |
1 files changed, 52 insertions, 21 deletions
diff --git a/lisp/mail/rmail.el b/lisp/mail/rmail.el index 7d50ecea744..74533f88fdf 100644 --- a/lisp/mail/rmail.el +++ b/lisp/mail/rmail.el @@ -1787,7 +1787,7 @@ not be a new one). It returns non-nil if it got any new messages." ;; Make sure we end with a blank line unless there are ;; no messages, as required by mbox format (Bug#9974). (unless (bobp) - (while (not (looking-back "\n\n")) + (while (not (looking-back "\n\n" (- (point) 2))) (insert "\n"))) (setq found (or (rmail-get-new-mail-1 file-name files delete-files) @@ -2092,7 +2092,7 @@ Value is the size of the newly read mail after conversion." ;; Make sure the read-in mbox data properly ends with a ;; blank line unless it is of size 0. (unless (zerop size) - (while (not (looking-back "\n\n")) + (while (not (looking-back "\n\n" (- (point) 2))) (insert "\n"))) (if (not (and rmail-preserve-inbox (string= file tofile))) (setq delete-files (cons tofile delete-files))))) @@ -2127,7 +2127,7 @@ Value is the size of the newly read mail after conversion." Call with point at the end of the message." (unless (bolp) (insert "\n")) - (unless (looking-back "\n\n") + (unless (looking-back "\n\n" (- (point 2))) (insert "\n"))) (defun rmail-add-mbox-headers () @@ -2762,7 +2762,8 @@ The current mail message becomes the message displayed." (let ((mbox-buf rmail-buffer) (view-buf rmail-view-buffer) blurb beg end body-start coding-system character-coding - is-text-message header-style) + is-text-message header-style + showing-message) (if (not msg) (setq msg rmail-current-message)) (unless (setq blurb (rmail-no-mail-p)) @@ -2788,7 +2789,8 @@ The current mail message becomes the message displayed." (setq beg (rmail-msgbeg msg) end (rmail-msgend msg)) (when (> (- end beg) rmail-show-message-verbose-min) - (message "Showing message %d" msg)) + (setq showing-message t) + (message "Showing message %d..." msg)) (narrow-to-region beg end) (goto-char beg) (with-current-buffer rmail-view-buffer @@ -2802,6 +2804,8 @@ The current mail message becomes the message displayed." (re-search-forward "mime-version: 1.0" nil t)) (let ((rmail-buffer mbox-buf) (rmail-view-buffer view-buf)) + (setq showing-message t) + (message "Showing message %d..." msg) (set (make-local-variable 'rmail-mime-decoded) t) (funcall rmail-show-mime-function)) (setq body-start (search-forward "\n\n" nil t)) @@ -2881,8 +2885,8 @@ The current mail message becomes the message displayed." (rmail-swap-buffers) (setq rmail-buffer-swapped t) (run-hooks 'rmail-show-message-hook) - (when (> (- end beg) rmail-show-message-verbose-min) - (message "Showing message %d...done" msg)))) + (when showing-message + (setq blurb (format "Showing message %d...done" msg))))) blurb)) (defun rmail-copy-headers (beg end &optional ignored-headers) @@ -4528,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) @@ -4559,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 @@ -4583,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 @@ -4599,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 |
