(gnus-string-equal): Revert last change.
[gnus] / lisp / pgg.el
index 9d1d46d..8fffe88 100644 (file)
@@ -33,6 +33,7 @@
 (require 'pgg-parse)
 
 (eval-when-compile
+  (require 'cl)
   (ignore-errors
     (require 'w3)
     (require 'url)))
        (set-buffer standard-output)
        (insert-buffer-substring pgg-errors-buffer)))))
 
-(defvar pgg-passphrase-cache-expiry 16)
 (defvar pgg-passphrase-cache (make-vector 7 0))
 
-(defvar pgg-read-passphrase nil)
 (defun pgg-read-passphrase (prompt &optional key)
-  (if (not pgg-read-passphrase)
-      (if (functionp 'read-passwd)
-         (setq pgg-read-passphrase 'read-passwd)
-       (if (load "passwd" t)
-           (setq pgg-read-passphrase 'read-passwd)
-         (autoload 'ange-ftp-read-passwd "ange-ftp")
-         (setq pgg-read-passphrase 'ange-ftp-read-passwd))))
   (or (and pgg-cache-passphrase
           key (setq key (pgg-truncate-key-identifier key))
           (symbol-value (intern-soft key pgg-passphrase-cache)))
-      (funcall pgg-read-passphrase prompt)))
+      (read-passwd prompt)))
 
 (defun pgg-add-passphrase-cache (key passphrase)
   (setq key (pgg-truncate-key-identifier key))
@@ -168,14 +160,51 @@ If optional argument SIGN is non-nil, do a combined sign and encrypt."
       (pgg-display-output-buffer start end status))
     status))
 
+;;;###autoload
+(defun pgg-encrypt (rcpts &optional sign start end)
+  "Encrypt the current buffer for RCPTS.
+If optional argument SIGN is non-nil, do a combined sign and encrypt.
+If optional arguments START and END are specified, only encrypt within
+the region."
+  (interactive (list (split-string (read-string "Recipients: ") "[ \t,]+")))
+  (let* ((start (or start (point-min)))
+        (end (or end (point-max)))
+        (status (pgg-encrypt-region start end rcpts sign)))
+    (when (interactive-p)
+      (pgg-display-output-buffer start end status))
+    status))
+
 ;;;###autoload
 (defun pgg-decrypt-region (start end)
   "Decrypt the current region between START and END."
   (interactive "r")
-  (let ((status
-        (pgg-save-coding-system start end
-          (pgg-invoke "decrypt-region" (or pgg-scheme pgg-default-scheme)
-                      (point-min) (point-max)))))
+  (let* ((buf (current-buffer))
+        (packet (cdr (assq 1 (with-temp-buffer
+                               (insert-buffer-substring buf)
+                               (pgg-decode-armor-region
+                                (point-min) (point-max))))))
+        (key (cdr (assq 'key-identifier packet)))
+        (pgg-default-user-id 
+         (if key
+             (concat "0x" (pgg-truncate-key-identifier key))
+           pgg-default-user-id))
+        (status
+         (pgg-save-coding-system start end
+           (pgg-invoke "decrypt-region" (or pgg-scheme pgg-default-scheme)
+                       (point-min) (point-max)))))
+    (when (interactive-p)
+      (pgg-display-output-buffer start end status))
+    status))
+
+;;;###autoload
+(defun pgg-decrypt (&optional start end)
+  "Decrypt the current buffer.
+If optional arguments START and END are specified, only decrypt within
+the region."
+  (interactive "")
+  (let* ((start (or start (point-min)))
+        (end (or end (point-max)))
+        (status (pgg-decrypt-region start end)))
     (when (interactive-p)
       (pgg-display-output-buffer start end status))
     status))
@@ -184,7 +213,9 @@ If optional argument SIGN is non-nil, do a combined sign and encrypt."
 (defun pgg-sign-region (start end &optional cleartext)
   "Make the signature from text between START and END.
 If the optional 3rd argument CLEARTEXT is non-nil, it does not create
-a detached signature."
+a detached signature.
+If this function is called interactively, CLEARTEXT is enabled
+and the the output is displayed."
   (interactive "r")
   (let ((status (pgg-save-coding-system start end
                  (pgg-invoke "sign-region" (or pgg-scheme pgg-default-scheme)
@@ -194,6 +225,23 @@ a detached signature."
       (pgg-display-output-buffer start end status))
     status))
 
+;;;###autoload
+(defun pgg-sign (&optional cleartext start end)
+  "Sign the current buffer.
+If the optional argument CLEARTEXT is non-nil, it does not create a
+detached signature.
+If optional arguments START and END are specified, only sign data
+within the region.
+If this function is called interactively, CLEARTEXT is enabled
+and the the output is displayed."
+  (interactive "")
+  (let* ((start (or start (point-min)))
+        (end (or end (point-max)))
+        (status (pgg-sign-region start end (or (interactive-p) cleartext))))
+    (when (interactive-p)
+      (pgg-display-output-buffer start end status))
+    status))
+  
 ;;;###autoload
 (defun pgg-verify-region (start end &optional signature fetch)
   "Verify the current region between START and END.
@@ -215,6 +263,7 @@ signer's public key from `pgg-default-keyserver-address'."
         (key (cdr (assq 'key-identifier packet)))
         status keyserver)
     (and (stringp key)
+        pgg-query-keyserver
         (setq key (concat "0x" (pgg-truncate-key-identifier key)))
         (null (pgg-lookup-key key))
         (or fetch (interactive-p))
@@ -236,6 +285,27 @@ signer's public key from `pgg-default-keyserver-address'."
                                     pgg-errors-buffer)))))
     status))
 
+;;;###autoload
+(defun pgg-verify (&optional signature fetch start end)
+  "Verify the current buffer.
+If the optional argument SIGNATURE is non-nil, it is treated as
+the detached signature of the current region.
+If the optional argument FETCH is non-nil, we attempt to fetch the
+signer's public key from `pgg-default-keyserver-address'.
+If optional arguments START and END are specified, only verify data
+within the region."
+  (interactive "")
+  (let* ((start (or start (point-min)))
+        (end (or end (point-max)))
+        (status (pgg-verify-region start end signature fetch)))
+    (when (interactive-p)
+      (let ((temp-buffer-show-function
+            (function pgg-temp-buffer-show-function)))
+       (with-output-to-temp-buffer pgg-echo-buffer
+         (set-buffer standard-output)
+         (insert-buffer-substring (if status pgg-output-buffer
+                                    pgg-errors-buffer)))))))
+
 ;;;###autoload
 (defun pgg-insert-key ()
   "Insert the ASCII armored public key."
@@ -250,6 +320,12 @@ signer's public key from `pgg-default-keyserver-address'."
     (pgg-invoke "snarf-keys-region" (or pgg-scheme pgg-default-scheme)
                start end)))
 
+;;;###autoload
+(defun pgg-snarf-keys ()
+  "Import public keys in the current buffer."
+  (interactive "")
+  (pgg-snarf-keys-region (point-min) (point-max)))
+
 (defun pgg-lookup-key (string &optional type)
   (pgg-invoke "lookup-key" (or pgg-scheme pgg-default-scheme) string type))