(mml2015-epg-sign): Save the signing keys in
[gnus] / lisp / mm-uu.el
index 67abcf8..758b79a 100644 (file)
@@ -187,7 +187,7 @@ This can be either \"inline\" or \"attachment\".")
      (lambda () (mm-uu-verbatim-marks-extract 0 0 1 -1))
      nil)
     (LaTeX
-     "^\\(\\\\[^\n]+\n\\)*\\\\documentclass"
+     "^\\([\\\\%][^\n]+\n\\)*\\\\documentclass.*[[{%]"
      "^\\\\end{document}"
      mm-uu-latex-extract
      nil
@@ -370,7 +370,7 @@ apply the face `mm-uu-extract'."
 
 (defun mm-uu-emacs-sources-extract ()
   (mm-make-handle (mm-uu-copy-to-buffer start-point end-point)
-                 '("application/emacs-lisp")
+                 '("application/emacs-lisp" (charset . gnus-decoded))
                  nil nil
                  (list mm-dissect-disposition
                        (cons 'filename file-name))))
@@ -386,7 +386,7 @@ apply the face `mm-uu-extract'."
 
 (defun mm-uu-diff-extract ()
   (mm-make-handle (mm-uu-copy-to-buffer start-point end-point)
-                 '("text/x-patch")))
+                 '("text/x-patch" (charset . gnus-decoded))))
 
 (defun mm-uu-diff-test ()
   (and gnus-newsgroup-name
@@ -461,7 +461,9 @@ apply the face `mm-uu-extract'."
     ((eq mm-verify-option 'never) nil)
     ((eq mm-verify-option 'always) t)
     ((eq mm-verify-option 'known) t)
-    (t (y-or-n-p "Verify pgp signed part? ")))))
+    (t (prog1
+          (y-or-n-p "Verify pgp signed part? ")
+        (message ""))))))
 
 (eval-when-compile
   (defvar gnus-newsgroup-charset))
@@ -480,7 +482,7 @@ apply the face `mm-uu-extract'."
           mm-security-handle 'gnus-details
           (format "Clear verification not supported by `%s'.\n" mml2015-use))))
       (goto-char (point-min))
-      (if (search-forward "\n\n" nil t)
+      (if (re-search-forward "\n[\t ]*\n" nil t)
          (delete-region (point-min) (point)))
       (if (re-search-forward mm-uu-pgp-beginning-signature nil t)
          (delete-region (match-beginning 0) (point-max)))
@@ -512,15 +514,51 @@ apply the face `mm-uu-extract'."
     ((eq mm-decrypt-option 'never) nil)
     ((eq mm-decrypt-option 'always) t)
     ((eq mm-decrypt-option 'known) t)
-    (t (y-or-n-p "Decrypt pgp encrypted part? ")))))
+    (t (prog1
+          (y-or-n-p "Decrypt pgp encrypted part? ")
+        (message ""))))))
 
 (defun mm-uu-pgp-encrypted-extract-1 (handles ctl)
-  (let ((buf (mm-uu-copy-to-buffer (point-min) (point-max))))
-    (if (mm-uu-pgp-encrypted-test)
-       (with-current-buffer buf
-         (mml2015-clean-buffer)
-         (funcall (mml2015-clear-decrypt-function))))
-    (list (mm-make-handle buf mm-uu-text-plain-type))))
+  (let ((buf (mm-uu-copy-to-buffer (point-min) (point-max)))
+       (first t)
+       charset)
+    ;; Make sure there's a blank line between header and body.
+    (with-current-buffer buf
+      (goto-char (point-min))
+      (while (prog2
+                (forward-line 1)
+                (if first
+                    (looking-at "[^\t\n ]+:")
+                  (looking-at "[^\t\n ]+:\\|[\t ]"))
+              (setq first nil)))
+      (unless (memq (char-after) '(?\n nil))
+       (insert "\n"))
+      (save-restriction
+       (narrow-to-region (point-min) (point))
+       (setq charset (mail-fetch-field "charset")))
+      (if (and (mm-uu-pgp-encrypted-test)
+              (progn
+                (mml2015-clean-buffer)
+                (funcall (mml2015-clear-decrypt-function))
+                (equal (mm-handle-multipart-ctl-parameter mm-security-handle
+                                                          'gnus-info)
+                       "OK")))
+         (progn
+           ;; Decode charset.
+           (if (and (or charset
+                        (setq charset gnus-newsgroup-charset))
+                    (setq charset (mm-charset-to-coding-system charset))
+                    (not (eq charset 'ascii)))
+               ;; Assume that buffer's multibyteness is turned off.
+               ;; See `mml2015-pgg-clear-decrypt'.
+               (insert (mm-decode-coding-string (prog1
+                                                    (buffer-string)
+                                                  (erase-buffer)
+                                                  (mm-enable-multibyte))
+                                                charset))
+             (mm-enable-multibyte))
+           (list (mm-make-handle buf mm-uu-text-plain-type)))
+       (list (mm-make-handle buf '("application/pgp-encrypted")))))))
 
 (defun mm-uu-pgp-encrypted-extract ()
   (let ((mm-security-handle (list (format "multipart/encrypted"))))
@@ -573,7 +611,8 @@ value of `mm-uu-text-plain-type'."
        (t (goto-char (point-max))))
       (setq text-start (point))
       (while (re-search-forward mm-uu-beginning-regexp nil t)
-       (setq start-point (match-beginning 0))
+       (setq start-point (match-beginning 0)
+             entry nil)
        (let ((alist mm-uu-type-alist)
              (beginning-regexp (match-string 0)))
          (while (not entry)
@@ -618,52 +657,67 @@ value of `mm-uu-text-plain-type'."
        (setq result (cons "multipart/mixed" (nreverse result))))
       result)))
 
-(defcustom mm-uu-buttonize-original-text-parts nil
-  "Non-nil means that the originals of dissected parts get buttons.
-This variable is overridden by `gnus-inhibit-mime-unbuttonizing'."
-  :type 'boolean
-  :version "23.0"
-  :group 'gnus-article-mime)
-
-(defun mm-uu-dissect-text-parts (handle)
+;;;###autoload
+(defun mm-uu-dissect-text-parts (handle &optional decoded)
   "Dissect text parts and put uu handles into HANDLE.
-If `mm-uu-buttonize-original-text-parts' is non-nil, the part that HANDLE
-points will always get a button."
+Assume text has been decoded if DECODED is non-nil."
   (let ((buffer (mm-handle-buffer handle)))
     (cond ((stringp buffer)
-          (mapc 'mm-uu-dissect-text-parts (cdr handle)))
+          (dolist (elem (cdr handle))
+            (mm-uu-dissect-text-parts elem decoded)))
          ((bufferp buffer)
           (let ((type (mm-handle-media-type handle))
                 (case-fold-search t) ;; string-match
-                encoding children)
+                children charset encoding)
             (when (and
                    (stringp type)
                    ;; Mutt still uses application/pgp even though
                    ;; it has already been withdrawn.
                    (string-match "\\`text/\\|\\`application/pgp\\'" type)
-                   (setq children
-                         (with-current-buffer buffer
-                           (if (setq encoding (mm-handle-encoding handle))
-                               ;; Inherit the multibyteness of the `buffer'.
-                               (with-temp-buffer
-                                 (insert-buffer-substring buffer)
-                                 (mm-decode-content-transfer-encoding
-                                  encoding type)
-                                 (mm-uu-dissect t (mm-handle-type handle)))
-                             (mm-uu-dissect t (mm-handle-type handle))))))
-              (if (or mm-uu-buttonize-original-text-parts
-                      (and (boundp 'gnus-inhibit-mime-unbuttonizing)
-                           (symbol-value 'gnus-inhibit-mime-unbuttonizing)))
-                  (let ((parent (copy-sequence handle)))
-                    (mm-handle-set-disposition parent '("attachment"))
-                    (mm-handle-set-description parent "The original part of")
-                    (setcdr handle (cons parent (cdr children))))
+                   (setq
+                    children
+                    (with-current-buffer buffer
+                      (cond
+                       ((or decoded
+                            (eq (setq charset (mail-content-type-get
+                                               (mm-handle-type handle)
+                                               'charset))
+                                'gnus-decoded))
+                        (setq decoded t)
+                        (mm-uu-dissect
+                         t (cons type '((charset . gnus-decoded)))))
+                       (charset
+                        (setq decoded t)
+                        (mm-with-multibyte-buffer
+                          (insert (mm-decode-string (mm-get-part handle)
+                                                    charset))
+                          (mm-uu-dissect
+                           t (cons type '((charset . gnus-decoded))))))
+                       ((setq encoding (mm-handle-encoding handle))
+                        (setq decoded nil)
+                        ;; Inherit the multibyteness of the `buffer'.
+                        (with-temp-buffer
+                          (insert-buffer-substring buffer)
+                          (mm-decode-content-transfer-encoding
+                           encoding type)
+                          (mm-uu-dissect t (list type))))
+                       (t
+                        (setq decoded nil)
+                        (mm-uu-dissect t (list type)))))))
+              ;; Ignore it if a given part is dissected into a single
+              ;; part of which the type is the same as the given one.
+              (if (and (<= (length children) 2)
+                       (string-equal (mm-handle-media-type (cadr children))
+                                     type))
+                  (kill-buffer (mm-handle-buffer (cadr children)))
                 (kill-buffer buffer)
-                (setcdr handle (cdr children)))
-              (setcar handle (car children)) ;; "multipart/mixed"
-              (mapc 'mm-uu-dissect-text-parts (cdr children)))))
+                (setcdr handle (cdr children))
+                (setcar handle (car children)) ;; "multipart/mixed"
+                (dolist (elem (cdr children))
+                  (mm-uu-dissect-text-parts elem decoded))))))
          (t
-          (mapc 'mm-uu-dissect-text-parts handle)))))
+          (dolist (elem handle)
+            (mm-uu-dissect-text-parts elem decoded))))))
 
 (provide 'mm-uu)