tm 7.69.
[elisp/tm.git] / tm-pgp.el
index 33cdda5..6cc7378 100644 (file)
--- a/tm-pgp.el
+++ b/tm-pgp.el
@@ -2,13 +2,13 @@
 ;;; tm-pgp.el --- tm-view internal methods for PGP.
 ;;;
 ;;; Copyright (C) 1995 Free Software Foundation, Inc.
-;;; Copyright (C) 1995 MORIOKA Tomohiko
+;;; Copyright (C) 1995,1996 MORIOKA Tomohiko
 ;;;
 ;;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
 ;;; Maintainer: MORIOKA Tomohiko <morioka@jaist.ac.jp>
 ;;; Created: 1995/12/7
 ;;; Version:
-;;;    $Id: tm-pgp.el,v 7.4 1995/12/19 18:06:49 morioka Exp $
+;;;    $Id: tm-pgp.el,v 7.16 1996/06/27 14:26:56 morioka Exp $
 ;;; Keywords: mail, news, MIME, multimedia, PGP, security
 ;;;
 ;;; This file is part of tm (Tools for MIME).
         (cur-buf (current-buffer))
         (new-name (format "%s-%s" (buffer-name) cnum))
         (mother mime::article/preview-buffer)
-        (code-converter
-         (or (cdr (assq major-mode mime-viewer/code-converter-alist))
-             'mime-viewer/default-code-convert-region))
-        str)
+        (mode major-mode)
+        code-converter str)
     (setq str (buffer-substring beg end))
     (switch-to-buffer new-name)
     (erase-buffer)
           (while (re-search-forward "^- -" nil t)
             (replace-match "-")
             )
+          (setq code-converter
+                (or
+                 (cdr (assq mode mime-viewer/code-converter-alist))
+                 (function mime-viewer/default-code-convert-region)))
           )
          ((progn
             (goto-char (point-min))
             (re-search-forward "^-+BEGIN PGP MESSAGE-+$" nil t)
             )
-          (mc-decrypt)
+          (as-binary-process (mc-decrypt))
           (goto-char (point-min))
           (delete-region (point-min)
                          (and
                           (search-forward "\n\n")
                           (match-end 0)))
+          (setq code-converter (function mime-charset-decode-region))
           ))
     (setq major-mode 'mime/show-message-mode)
     (setq mime::article/code-converter code-converter)
 
 ;;; @ Internal method for application/pgp-signature
 ;;;
-;;; It is based on draft-elkins-pem-pgp-01.txt
+;;; It is based on draft-elkins-pem-pgp-02.txt
+
+(defvar tm-pgp::good-signature-regexp "Good signature from user.*$")
+
+(defvar tm-pgp::key-expected-regexp
+  "Key matching expected Key ID \\(\\S +\\) not found")
+
+(defun mime::article/call-pgp-to-check-signature (output-buffer orig-file)
+  (save-excursion
+    (set-buffer output-buffer)
+    (erase-buffer)
+    )
+  (let ((status
+        (call-process-region (point-min)(point-max)
+                             "pgp" nil output-buffer nil orig-file)))
+    (if (= status 0)
+       (save-excursion
+         (set-buffer output-buffer)
+         (goto-char (point-min))
+         (message
+          (if (re-search-forward tm-pgp::good-signature-regexp nil t)
+              (buffer-substring (match-beginning 0) (match-end 0))
+            "Bad signature"
+            ))
+         ))))
 
 (defun mime-article/check-pgp-signature (beg end cal)
   (let* ((encoding (cdr (assq 'encoding cal)))
       (while (re-search-forward "\n" nil t)
        (replace-match "\r\n")
        )
-      (write-file orig-file)
+      (let ((mc-flag nil)                   ; for Mule
+           (file-coding-system
+            (if (featurep 'mule) *noconv*))
+           kanji-flag                      ; for NEmacs
+           (emx-binary-mode t)             ; for OS/2
+           jka-compr-compression-info-list ; for jka-compr
+           jam-zcat-filename-list          ; for jam-zcat
+           require-final-newline)
+       (write-file orig-file)
+       )
       (kill-buffer (current-buffer))
       )
     (save-excursion
                 end))
       (set-buffer (setq kbuf (get-buffer-create mime/temp-buffer-name)))
       (insert str)
-      (mime/decode-region encoding (point-min)(point-max))
+      (mime-decode-region (point-min)(point-max) encoding)
       (let ((mc-flag nil)                   ; for Mule
            (file-coding-system
             (if (featurep 'mule) *noconv*))
        )
       ;;(define-program-coding-system (current-buffer) "pgp" *noconv*)
       (mime-article/show-output-buffer)
-      (setq status
-           (call-process-region (point-min)(point-max)
-                                "pgp"
-                                nil mime/output-buffer-name nil
-                                orig-file))
-      (kill-buffer kbuf)
+      ;;(get-buffer-create mime/output-buffer-name)
+      (or (mime::article/call-pgp-to-check-signature
+          mime/output-buffer-name orig-file)
+         (let (pgp-id)
+           (save-excursion
+             (set-buffer mime/output-buffer-name)
+             (goto-char (point-min))
+             (if (re-search-forward tm-pgp::key-expected-regexp nil t)
+                 (setq pgp-id
+                       (concat "0x" (buffer-substring-no-properties
+                                     (match-beginning 1)
+                                     (match-end 1))))
+               ))
+           (y-or-n-p
+            (format "Key %s not found; attempt to fetch? " pgp-id))
+           (mc-pgp-fetch-key (cons nil pgp-id))
+           (mime::article/call-pgp-to-check-signature
+            mime/output-buffer-name orig-file)
+           ))
       (let ((other-window-scroll-buffer mime/output-buffer-name))
        (scroll-other-window 8)
        )
-      ;; (if (= status 0)
-      ;;     (message "Good signature!")
-      ;;   (message "Bad signature!")
-      ;;   )
+      (kill-buffer kbuf)
       (delete-file orig-file)
       (delete-file sig-file)
       )))
 
 ;;; @ Internal method for application/pgp-encrypted
 ;;;
-;;; It is based on draft-elkins-pem-pgp-01.txt
+;;; It is based on draft-elkins-pem-pgp-02.txt
 
 (defun mime-article/decrypt-pgp (beg end cal)
   (let* ((cnum (mime-article/point-content-number beg))
 
 ;;; @ Internal method for application/pgp-keys
 ;;;
-;;; It is based on draft-elkins-pem-pgp-01.txt
+;;; It is based on draft-elkins-pem-pgp-02.txt
 
 (autoload 'mc-snarf-keys "mc-toplev")
 
     (if (re-search-forward "^\n" nil t)
        (delete-region (point-min) (match-end 0))
       )
-    (mime/decode-region encoding (point-min)(point-max))
+    (mime-decode-region (point-min)(point-max) encoding)
     (mc-snarf-keys)
     (kill-buffer (current-buffer))
     ))
 ;;;
 
 (provide 'tm-pgp)
+
+;;; tm-pgp.el ends here