* gnus-art.el (gnus-use-idna): Don't directly refer to the value of
[gnus] / lisp / mm-uu.el
index 23df12a..bc182be 100644 (file)
@@ -1,7 +1,7 @@
 ;;; mm-uu.el --- Return uu stuff as mm handles
 
 ;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-;;   2005, 2006 Free Software Foundation, Inc.
+;;   2005, 2006, 2007 Free Software Foundation, Inc.
 
 ;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
 ;; Keywords: postscript uudecode binhex shar forward gnatsweb pgp
@@ -10,7 +10,7 @@
 
 ;; GNU Emacs is free software; you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
+;; the Free Software Foundation; either version 3, or (at your option)
 ;; any later version.
 ;;
 ;; GNU Emacs is distributed in the hope that it will be useful,
@@ -68,9 +68,6 @@ decoder, such as hexbin."
 
 (defvar mm-uu-yenc-decode-function 'yenc-decode-region)
 
-(defvar mm-uu-pgp-beginning-signature
-     "^-----BEGIN PGP SIGNATURE-----")
-
 (defvar mm-uu-beginning-regexp nil)
 
 (defvar mm-dissect-disposition "inline"
@@ -184,10 +181,10 @@ This can be either \"inline\" or \"attachment\".")
      ;; http://www.slrn.org/manual/slrn-manual-6.html#ss6.81
      "^#v\\+"
      "^#v\\-$"
-     (lambda () (mm-uu-verbatim-marks-extract 0 0 1 -1))
+     (lambda () (mm-uu-verbatim-marks-extract 0 0))
      nil)
     (LaTeX
-     "^\\(\\\\[^\n]+\n\\)*\\\\documentclass"
+     "^\\([\\\\%][^\n]+\n\\)*\\\\documentclass.*[[{%]"
      "^\\\\end{document}"
      mm-uu-latex-extract
      nil
@@ -196,7 +193,10 @@ This can be either \"inline\" or \"attachment\".")
 Each element consist of the following entries: label,
 start-regexp, end-regexp, extract-function, test-function.
 
-After modifying this list you must run \\[mm-uu-configure].")
+After modifying this list you must run \\[mm-uu-configure].
+
+You can disable elements from this list by customizing
+`mm-uu-configure-list'.")
 
 (defcustom mm-uu-configure-list '((shar . disabled))
   "A list of mm-uu configuration.
@@ -236,7 +236,7 @@ To disable dissecting shar codes, for instance, add
 ;; 21 and XEmacs don't support it.
 (defcustom mm-uu-hide-markers
   (< 16 (or (and (fboundp 'defined-colors)
-                (length (defined-colors)))
+                (length (eval '(defined-colors))))
            (and (fboundp 'device-color-cells)
                 (device-color-cells))
            0))
@@ -272,7 +272,7 @@ If PROPERTIES is non-nil, PROPERTIES are applied to the buffer,
 see `set-text-properties'.  If PROPERTIES equals t, this means to
 apply the face `mm-uu-extract'."
   (let ((obuf (current-buffer))
-        (coding-system
+       (coding-system
          ;; Might not exist in non-MULE XEmacs
          (when (boundp 'buffer-file-coding-system)
            buffer-file-coding-system)))
@@ -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
@@ -430,7 +430,12 @@ apply the face `mm-uu-extract'."
                            (cons 'filename file-name)))))
 
 (defun mm-uu-yenc-extract ()
-  (mm-make-handle (mm-uu-copy-to-buffer start-point end-point)
+  ;; This might not be exactly correct, but we sure can't get the
+  ;; binary data from the article buffer, since that's already in a
+  ;; non-binary charset.  So get it from the original article buffer. 
+  (mm-make-handle (save-excursion
+                   (set-buffer gnus-original-article-buffer)
+                   (mm-uu-copy-to-buffer start-point end-point))
                  (list (or (and file-name
                                 (string-match "\\.[^\\.]+$" file-name)
                                 (mailcap-extension-to-mime
@@ -461,7 +466,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))
@@ -473,22 +480,16 @@ apply the face `mm-uu-extract'."
          (progn
            (mml2015-clean-buffer)
            (let ((coding-system-for-write (or gnus-newsgroup-charset
-                                              'iso-8859-1)))
+                                              'iso-8859-1))
+                 (coding-system-for-read (or gnus-newsgroup-charset
+                                             'iso-8859-1)))
              (funcall (mml2015-clear-verify-function))))
        (when (and mml2015-use (null (mml2015-clear-verify-function)))
          (mm-set-handle-multipart-parameter
           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)
-         (delete-region (point-min) (point)))
-      (if (re-search-forward mm-uu-pgp-beginning-signature nil t)
-         (delete-region (match-beginning 0) (point-max)))
-      (goto-char (point-min))
-      (while (re-search-forward "^- " nil t)
-       (replace-match "" t t)
-       (forward-line 1)))
-    (list (mm-make-handle buf mm-uu-text-plain-type))))
+          (format "Clear verification not supported by `%s'.\n" mml2015-use)))
+       (mml2015-extract-cleartext-signature))
+      (list (mm-make-handle buf mm-uu-text-plain-type)))))
 
 (defun mm-uu-pgp-signed-extract ()
   (let ((mm-security-handle (list (format "multipart/signed"))))
@@ -512,15 +513,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 +610,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)
@@ -644,6 +682,7 @@ Assume text has been decoded if DECODED is non-nil."
                                                (mm-handle-type handle)
                                                'charset))
                                 'gnus-decoded))
+                        (setq decoded t)
                         (mm-uu-dissect
                          t (cons type '((charset . gnus-decoded)))))
                        (charset