* epg.el (epg--start): Make the process-buffer unibyte.
[elisp/epg.git] / epa.el
diff --git a/epa.el b/epa.el
index e064e92..85421f2 100644 (file)
--- a/epa.el
+++ b/epa.el
@@ -27,7 +27,6 @@
 (require 'font-lock)
 (require 'widget)
 (eval-when-compile (require 'wid-edit))
 (require 'font-lock)
 (require 'widget)
 (eval-when-compile (require 'wid-edit))
-(require 'mail-utils)
 (require 'derived)
 
 (defgroup epa nil
 (require 'derived)
 
 (defgroup epa nil
@@ -61,11 +60,6 @@ the separate window."
   :type 'integer
   :group 'epa)
 
   :type 'integer
   :group 'epa)
 
-(defcustom epa-mail-modes '(mail-mode message-mode)
-  "List of major-modes to compose mails."
-  :type 'list
-  :group 'epa)
-
 (defgroup epa-faces nil
   "Faces for epa-mode."
   :group 'epa)
 (defgroup epa-faces nil
   "Faces for epa-mode."
   :group 'epa)
@@ -181,7 +175,7 @@ the separate window."
 (defvar epa-info-buffer nil)
 (defvar epa-last-coding-system-specified nil)
 
 (defvar epa-info-buffer nil)
 (defvar epa-last-coding-system-specified nil)
 
-(defvar epa-keys-mode-map
+(defvar epa-key-list-mode-map
   (let ((keymap (make-sparse-keymap)))
     (define-key keymap "m" 'epa-mark)
     (define-key keymap "u" 'epa-unmark)
   (let ((keymap (make-sparse-keymap)))
     (define-key keymap "m" 'epa-mark)
     (define-key keymap "u" 'epa-unmark)
@@ -260,22 +254,22 @@ the separate window."
     (defalias 'epa--decode-coding-string 'decode-coding-string)
   (defalias 'epa--decode-coding-string 'identity))
 
     (defalias 'epa--decode-coding-string 'decode-coding-string)
   (defalias 'epa--decode-coding-string 'identity))
 
-(defun epa-keys-mode ()
+(defun epa-key-list-mode ()
   "Major mode for `epa-list-keys'."
   (kill-all-local-variables)
   (buffer-disable-undo)
   "Major mode for `epa-list-keys'."
   (kill-all-local-variables)
   (buffer-disable-undo)
-  (setq major-mode 'epa-keys-mode
+  (setq major-mode 'epa-key-list-mode
        mode-name "Keys"
        truncate-lines t
        buffer-read-only t)
        mode-name "Keys"
        truncate-lines t
        buffer-read-only t)
-  (use-local-map epa-keys-mode-map)
+  (use-local-map epa-key-list-mode-map)
   (make-local-variable 'font-lock-defaults)
   (setq font-lock-defaults '(epa-font-lock-keywords t))
   ;; In XEmacs, auto-initialization of font-lock is not effective
   ;; if buffer-file-name is not set.
   (font-lock-set-defaults)
   (make-local-variable 'epa-exit-buffer-function)
   (make-local-variable 'font-lock-defaults)
   (setq font-lock-defaults '(epa-font-lock-keywords t))
   ;; In XEmacs, auto-initialization of font-lock is not effective
   ;; if buffer-file-name is not set.
   (font-lock-set-defaults)
   (make-local-variable 'epa-exit-buffer-function)
-  (run-hooks 'epa-keys-mode-hook))
+  (run-hooks 'epa-key-list-mode-hook))
 
 (defun epa-key-mode ()
   "Major mode for a key description."
 
 (defun epa-key-mode ()
   "Major mode for a key description."
@@ -353,6 +347,7 @@ reads the public keyring."
               (buffer-live-p epa-keys-buffer))
     (setq epa-keys-buffer (generate-new-buffer "*Keys*")))
   (set-buffer epa-keys-buffer)
               (buffer-live-p epa-keys-buffer))
     (setq epa-keys-buffer (generate-new-buffer "*Keys*")))
   (set-buffer epa-keys-buffer)
+  (epa-key-list-mode)
   (let ((inhibit-read-only t)
        buffer-read-only
        (point (point-min))
   (let ((inhibit-read-only t)
        buffer-read-only
        (point (point-min))
@@ -365,7 +360,6 @@ reads the public keyring."
                         (point-max)))
       (goto-char point))
     (epa--insert-keys context name mode)
                         (point-max)))
       (goto-char point))
     (epa--insert-keys context name mode)
-    (epa-keys-mode)
     (widget-setup)
     (set-keymap-parent (current-local-map) widget-keymap))
   (make-local-variable 'epa-list-keys-arguments)
     (widget-setup)
     (set-keymap-parent (current-local-map) widget-keymap))
   (make-local-variable 'epa-list-keys-arguments)
@@ -426,11 +420,15 @@ If SECRET is non-nil, list secret keys instead of public keys."
     (unless (and epa-keys-buffer
                 (buffer-live-p epa-keys-buffer))
       (setq epa-keys-buffer (generate-new-buffer "*Keys*")))
     (unless (and epa-keys-buffer
                 (buffer-live-p epa-keys-buffer))
       (setq epa-keys-buffer (generate-new-buffer "*Keys*")))
+    (set-buffer epa-keys-buffer)
+    (epa-key-list-mode)
     (let ((inhibit-read-only t)
          buffer-read-only)
     (let ((inhibit-read-only t)
          buffer-read-only)
-      (set-buffer epa-keys-buffer)
       (erase-buffer)
       (erase-buffer)
-      (insert prompt "\n")
+      (insert prompt "\n"
+             (substitute-command-keys "\
+- `\\[epa-mark]' to mark a key on the line
+- `\\[epa-unmark]' to unmark a key on the line\n"))
       (widget-create 'link
                     :notify (lambda (&rest ignore) (abort-recursive-edit))
                     :help-echo
       (widget-create 'link
                     :notify (lambda (&rest ignore) (abort-recursive-edit))
                     :help-echo
@@ -457,7 +455,6 @@ If SECRET is non-nil, list secret keys instead of public keys."
              (if (get-text-property (point) 'epa-list-keys)
                  (epa-mark)))
          (epa--insert-keys context nil nil)))
              (if (get-text-property (point) 'epa-list-keys)
                  (epa-mark)))
          (epa--insert-keys context nil nil)))
-      (epa-keys-mode)
       (widget-setup)
       (set-keymap-parent (current-local-map) widget-keymap)
       (setq epa-exit-buffer-function #'abort-recursive-edit)
       (widget-setup)
       (set-keymap-parent (current-local-map) widget-keymap)
       (setq epa-exit-buffer-function #'abort-recursive-edit)
@@ -506,6 +503,7 @@ If SECRET is non-nil, list secret keys instead of public keys."
       (setcdr entry (generate-new-buffer
                     (format "*Key*%s" (epg-sub-key-id primary-sub-key)))))
     (set-buffer (cdr entry))
       (setcdr entry (generate-new-buffer
                     (format "*Key*%s" (epg-sub-key-id primary-sub-key)))))
     (set-buffer (cdr entry))
+    (epa-key-mode)
     (make-local-variable 'epa-key)
     (setq epa-key key)
     (erase-buffer)
     (make-local-variable 'epa-key)
     (setq epa-key key)
     (erase-buffer)
@@ -558,8 +556,7 @@ If SECRET is non-nil, list secret keys instead of public keys."
              "\n")
       (setq pointer (cdr pointer)))
     (goto-char (point-min))
              "\n")
       (setq pointer (cdr pointer)))
     (goto-char (point-min))
-    (pop-to-buffer (current-buffer))
-    (epa-key-mode)))
+    (pop-to-buffer (current-buffer))))
 
 (defun epa-display-info (info)
   (if epa-popup-info-window
 
 (defun epa-display-info (info)
   (if epa-popup-info-window
@@ -682,15 +679,16 @@ d - Create a detached signature
 (defun epa-sign-file (file signers mode)
   "Sign FILE by SIGNERS keys selected."
   (interactive
 (defun epa-sign-file (file signers mode)
   "Sign FILE by SIGNERS keys selected."
   (interactive
-   (list (expand-file-name (read-file-name "File: "))
-        (if current-prefix-arg
-            (epa-select-keys (epg-make-context epa-protocol)
-                             "Select keys for signing.
+   (let ((verbose current-prefix-arg))
+     (list (expand-file-name (read-file-name "File: "))
+          (if verbose
+              (epa-select-keys (epg-make-context epa-protocol)
+                               "Select keys for signing.
 If no one is selected, default secret key is used.  "
 If no one is selected, default secret key is used.  "
-                             nil t))
-        (if current-prefix-arg
-            (epa--read-signature-type)
-          'clear)))
+                               nil t))
+          (if verbose
+              (epa--read-signature-type)
+            'clear))))
   (let ((signature (concat file
                           (if (eq epa-protocol 'OpenPGP)
                               (if (or epa-armor
   (let ((signature (concat file
                           (if (eq epa-protocol 'OpenPGP)
                               (if (or epa-armor
@@ -770,8 +768,10 @@ Don't use this command in Lisp programs!"
            (delete-region start end)
            (goto-char start)
            (insert plain))
            (delete-region start end)
            (goto-char start)
            (insert plain))
-       (let ((epa-popup-info-window t))
-         (epa-display-info plain)))
+       (with-output-to-temp-buffer "*Temp*"
+         (set-buffer standard-output)
+         (insert plain)
+         (epa-info-mode)))
       (if (epg-context-result-for context 'verify)
          (epa-display-info (epg-verify-result-to-string
                             (epg-context-result-for context 'verify)))))))
       (if (epg-context-result-for context 'verify)
          (epa-display-info (epg-verify-result-to-string
                             (epg-context-result-for context 'verify)))))))
@@ -810,22 +810,10 @@ Don't use this command in Lisp programs!"
                     (if (re-search-forward "^Charset: \\(.*\\)" armor-end t)
                         (epa--find-coding-system-for-mime-charset
                          (intern (downcase (match-string 1))))))))
                     (if (re-search-forward "^Charset: \\(.*\\)" armor-end t)
                         (epa--find-coding-system-for-mime-charset
                          (intern (downcase (match-string 1))))))))
+           (goto-char armor-end)
            (epa-decrypt-region armor-start armor-end)))))))
 
 ;;;###autoload
            (epa-decrypt-region armor-start armor-end)))))))
 
 ;;;###autoload
-(defun epa-decrypt ()
-  "Decrypt OpenPGP armors in the current buffer.
-
-Don't use this command in Lisp programs!"
-  (interactive)
-  (epa-decrypt-armor-in-region (point-min) (point-max)))
-
-(if (fboundp 'select-safe-coding-system)
-    (defalias 'epa--select-safe-coding-system 'select-safe-coding-system)
-  (defun epa--select-safe-coding-system (from to)
-    buffer-file-coding-system))
-
-;;;###autoload
 (defun epa-verify-region (start end)
   "Verify the current region between START and END.
 
 (defun epa-verify-region (start end)
   "Verify the current region between START and END.
 
@@ -870,13 +858,10 @@ Don't use this command in Lisp programs!"
            (error "No armor tail"))
          (epa-verify-region armor-start armor-end))))))
 
            (error "No armor tail"))
          (epa-verify-region armor-start armor-end))))))
 
-;;;###autoload
-(defun epa-verify ()
-  "Verify OpenPGP cleartext signed messages in the current buffer.
-
-Don't use this command in Lisp programs!"
-  (interactive)
-  (epa-verify-cleartext-in-region (point-min) (point-max)))
+(if (fboundp 'select-safe-coding-system)
+    (defalias 'epa--select-safe-coding-system 'select-safe-coding-system)
+  (defun epa--select-safe-coding-system (from to)
+    buffer-file-coding-system))
 
 ;;;###autoload
 (defun epa-sign-region (start end signers mode)
 
 ;;;###autoload
 (defun epa-sign-region (start end signers mode)
@@ -884,18 +869,18 @@ Don't use this command in Lisp programs!"
 
 Don't use this command in Lisp programs!"
   (interactive
 
 Don't use this command in Lisp programs!"
   (interactive
-   (progn
+   (let ((verbose current-prefix-arg))
      (setq epa-last-coding-system-specified
           (or coding-system-for-write
               (epa--select-safe-coding-system
                (region-beginning) (region-end))))
      (list (region-beginning) (region-end)
      (setq epa-last-coding-system-specified
           (or coding-system-for-write
               (epa--select-safe-coding-system
                (region-beginning) (region-end))))
      (list (region-beginning) (region-end)
-          (if current-prefix-arg
+          (if verbose
               (epa-select-keys (epg-make-context epa-protocol)
                                "Select keys for signing.
 If no one is selected, default secret key is used.  "
                                nil t))
               (epa-select-keys (epg-make-context epa-protocol)
                                "Select keys for signing.
 If no one is selected, default secret key is used.  "
                                nil t))
-          (if current-prefix-arg
+          (if verbose
               (epa--read-signature-type)
             'clear))))
   (save-excursion
               (epa--read-signature-type)
             'clear))))
   (save-excursion
@@ -944,55 +929,27 @@ Uses the `derived-mode-parent' property of the symbol to trace backwards."
                  (setq parent (get parent 'derived-mode-parent))))
       parent)))
 
                  (setq parent (get parent 'derived-mode-parent))))
       parent)))
 
-(defun epa--mail-mode-p ()
-  (let ((pointer epa-mail-modes))
-    (while (and pointer
-               (epa--derived-mode-p (car pointer)))
-      (setq pointer (cdr pointer)))
-    pointer))
-
-;;;###autoload
-(defun epa-sign (start end signers mode)
-  "Sign the current buffer.
-
-Don't use this command in Lisp programs!"
-  (interactive
-   (save-excursion
-     (goto-char (point-min))
-     (if (and (epa--mail-mode-p)
-             (search-forward mail-header-separator nil t))
-        (forward-line))
-     (setq epa-last-coding-system-specified
-          (or coding-system-for-write
-              (epa--select-safe-coding-system (point) (point-max))))
-     (list (point) (point-max)
-          (if current-prefix-arg
-              (epa-select-keys (epg-make-context epa-protocol)
-                               "Select keys for signing.
-If no one is selected, default secret key is used.  "
-                               nil t))
-          (if current-prefix-arg
-              (epa--read-signature-type)
-            'clear))))
-  (epa-sign-region start end signers mode))
-
 ;;;###autoload
 ;;;###autoload
-(defun epa-encrypt-region (start end recipients sign)
+(defun epa-encrypt-region (start end recipients sign signers)
   "Encrypt the current region between START and END for RECIPIENTS.
 
 Don't use this command in Lisp programs!"
   (interactive
   "Encrypt the current region between START and END for RECIPIENTS.
 
 Don't use this command in Lisp programs!"
   (interactive
-   (progn
+   (let ((verbose current-prefix-arg)
+        (context (epg-make-context epa-protocol))
+        sign)
      (setq epa-last-coding-system-specified
           (or coding-system-for-write
               (epa--select-safe-coding-system
                (region-beginning) (region-end))))
      (list (region-beginning) (region-end)
      (setq epa-last-coding-system-specified
           (or coding-system-for-write
               (epa--select-safe-coding-system
                (region-beginning) (region-end))))
      (list (region-beginning) (region-end)
-          (epa-select-keys (epg-make-context epa-protocol)
+          (epa-select-keys context
                            "Select recipients for encryption.
 If no one is selected, symmetric encryption will be performed.  ")
                            "Select recipients for encryption.
 If no one is selected, symmetric encryption will be performed.  ")
-          (if current-prefix-arg
-                (y-or-n-p "Sign? ")))))
+          (setq sign (if verbose (y-or-n-p "Sign? ")))
+          (if sign
+              (epa-select-keys context
+                               "Select keys for signing.  ")))))
   (save-excursion
     (let ((context (epg-make-context epa-protocol))
          cipher)
   (save-excursion
     (let ((context (epg-make-context epa-protocol))
          cipher)
@@ -1000,6 +957,8 @@ If no one is selected, symmetric encryption will be performed.  ")
       (epg-context-set-armor context t)
       ;;(epg-context-set-textmode context epa-textmode)
       (epg-context-set-textmode context t)
       (epg-context-set-armor context t)
       ;;(epg-context-set-textmode context epa-textmode)
       (epg-context-set-textmode context t)
+      (if sign
+         (epg-context-set-signers context signers))
       (epg-context-set-passphrase-callback context
                                           #'epa-passphrase-callback-function)
       (epg-context-set-progress-callback context
       (epg-context-set-passphrase-callback context
                                           #'epa-passphrase-callback-function)
       (epg-context-set-progress-callback context
@@ -1010,7 +969,8 @@ If no one is selected, symmetric encryption will be performed.  ")
                                       (epa--encode-coding-string
                                        (buffer-substring start end)
                                        epa-last-coding-system-specified)
                                       (epa--encode-coding-string
                                        (buffer-substring start end)
                                        epa-last-coding-system-specified)
-                                      recipients sign))
+                                      recipients
+                                      sign))
       (message "Encrypting...done")
       (delete-region start end)
       (goto-char start)
       (message "Encrypting...done")
       (delete-region start end)
       (goto-char start)
@@ -1026,57 +986,6 @@ If no one is selected, symmetric encryption will be performed.  ")
                                 'end-open t)))))
 
 ;;;###autoload
                                 'end-open t)))))
 
 ;;;###autoload
-(defun epa-encrypt (start end recipients sign)
-  "Encrypt the current buffer.
-
-Don't use this command in Lisp programs!"
-  (interactive
-   (save-excursion
-     (let (recipients)
-       (goto-char (point-min))
-       (when (epa--mail-mode-p)
-        (save-restriction
-          (narrow-to-region (point)
-                            (if (search-forward mail-header-separator nil 0)
-                                (match-beginning 0)
-                              (point)))
-          (setq recipients
-                (mail-strip-quoted-names
-                 (mapconcat #'identity
-                            (nconc (mail-fetch-field "to" nil nil t)
-                                   (mail-fetch-field "cc" nil nil t)
-                                   (mail-fetch-field "bcc" nil nil t))
-                            ","))))
-        (if recipients
-            (setq recipients (delete ""
-                                     (split-string recipients "[ \t\n]+"))))
-        (goto-char (point-min))
-        (if (search-forward mail-header-separator nil t)
-            (forward-line)))
-       (setq epa-last-coding-system-specified
-            (or coding-system-for-write
-                (epa--select-safe-coding-system (point) (point-max))))
-       (list (point) (point-max)
-            (if current-prefix-arg
-                (epa-select-keys
-                 (epg-make-context epa-protocol)
-                 "Select recipients for encryption.
-If no one is selected, symmetric encryption will be performed.  "
-                 recipients)
-              (if recipients
-                  (delq nil
-                        (apply #'nconc
-                               (mapcar
-                                (lambda (recipient)
-                                  (epg-list-keys
-                                   (epg-make-context epa-protocol)
-                                   (concat "<" recipient ">")))
-                                recipients)))))
-            (if current-prefix-arg
-                (y-or-n-p "Sign? "))))))
-  (epa-encrypt-region start end recipients sign))
-
-;;;###autoload
 (defun epa-delete-keys (keys &optional allow-secret)
   "Delete selected KEYS.
 
 (defun epa-delete-keys (keys &optional allow-secret)
   "Delete selected KEYS.
 
@@ -1111,7 +1020,7 @@ Don't use this command in Lisp programs!"
     (if (epg-context-result-for context 'import)
        (epa-display-info (epg-import-result-to-string
                           (epg-context-result-for context 'import))))
     (if (epg-context-result-for context 'import)
        (epa-display-info (epg-import-result-to-string
                           (epg-context-result-for context 'import))))
-    (if (eq major-mode 'epa-keys-mode)
+    (if (eq major-mode 'epa-key-list-mode)
        (apply #'epa-list-keys epa-list-keys-arguments))))
 
 ;;;###autoload
        (apply #'epa-list-keys epa-list-keys-arguments))))
 
 ;;;###autoload
@@ -1156,14 +1065,6 @@ Don't use this command in Lisp programs!"
          (epa-import-keys-region armor-start armor-end))))))
 
 ;;;###autoload
          (epa-import-keys-region armor-start armor-end))))))
 
 ;;;###autoload
-(defun epa-import ()
-  "Import keys in the OpenPGP armor format in the current buffer.
-
-Don't use this command in Lisp programs!"
-  (interactive)
-  (epa-import-armor-in-region (point-min) (point-max)))
-
-;;;###autoload
 (defun epa-export-keys (keys file)
   "Export selected KEYS to FILE.
 
 (defun epa-export-keys (keys file)
   "Export selected KEYS to FILE.