Update copyright header.
[elisp/semi.git] / pgg-gpg.el
index 191c90b..404eae0 100644 (file)
@@ -20,8 +20,8 @@
 
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
 
 ;;; Code:
 
@@ -51,6 +51,9 @@
 (defvar pgg-gpg-messages-coding-system pgg-messages-coding-system
   "Coding system used when reading from a GnuPG external process.")
 
+(defvar pgg-gpg-messages-locale pgg-messages-locale
+  "Locale set before running a GnuPG external process.")
+
 (defvar pgg-scheme-gpg-instance nil)
 
 ;;;###autoload
            (luna-make-entity 'pgg-scheme-gpg))))
 
 (defun pgg-gpg-process-region (start end passphrase program args)
-  (let* ((output-file-name (make-temp-name
+  (let* ((output-file-name (make-temp-file
                            (expand-file-name "pgg-output"
                                              temporary-file-directory)))
         (args
          `("--status-fd" "2"
            ,@(if passphrase '("--passphrase-fd" "0"))
+           "--yes" ; overwrite
            "--output" ,output-file-name
            ,@pgg-gpg-extra-args ,@args))
         (output-buffer pgg-output-buffer)
         (errors-buffer pgg-errors-buffer)
-        (orig-mode (default-file-modes))
         (process-connection-type nil)
+        (process-environment process-environment)
         process status exit-status)
+    (when pgg-gpg-messages-locale
+      (setq process-environment (copy-sequence process-environment))
+      (setenv "LC_ALL" pgg-gpg-messages-locale)
+      (setenv "LANGUAGE" pgg-gpg-messages-locale))
     (with-current-buffer (get-buffer-create errors-buffer)
       (buffer-disable-undo)
       (erase-buffer))
     (unwind-protect
        (progn
-         (set-default-file-modes 448)
          (setq process
                (apply #'binary-to-text-funcall
                       pgg-gpg-messages-coding-system
       (if (and process (eq 'run (process-status process)))
          (interrupt-process process))
       (if (file-exists-p output-file-name)
-         (delete-file output-file-name))
-      (set-default-file-modes orig-mode))))
+         (delete-file output-file-name)))))
 
 (defun pgg-gpg-possibly-cache-passphrase (passphrase)
   (if (and pgg-cache-passphrase
     (with-temp-buffer
       (apply #'call-process pgg-gpg-program nil t nil args)
       (goto-char (point-min))
-      (if (re-search-forward "^\\(sec\\|pub\\):"  nil t)
-         (substring
-          (nth 3 (split-string
-                  (buffer-substring (match-end 0)
-                                    (progn (end-of-line)(point)))
-                  ":")) 8)))))
+      (if (re-search-forward "^\\(sec\\|pub\\):[^:]*:[^:]*:[^:]*:\\([^:]*\\)"
+                            nil t)
+         (substring (match-string 2) 8)))))
 
 (luna-define-method pgg-scheme-encrypt-region ((scheme pgg-scheme-gpg)
                                               start end recipients)
       (goto-char (point-min))
       (prog1 (re-search-forward "^\\[GNUPG:] GOODSIG\\>" nil t)
        (goto-char (point-min))
-       (delete-matching-lines "^warning\\|\\[GNUPG:]")
-       (set-buffer pgg-output-buffer)
-       (insert-buffer-substring pgg-errors-buffer)))))
+       (delete-matching-lines "^\\[GNUPG:] ")
+       ;; XXX: copy contents of pgg-errors-buffer into
+       ;; pgg-output-buffer for backward compatibility.
+       (with-current-buffer pgg-output-buffer
+         (set-buffer-multibyte t)
+         (insert-buffer-substring pgg-errors-buffer))))))
 
 (luna-define-method pgg-scheme-insert-key ((scheme pgg-scheme-gpg))
   (let* ((pgg-gpg-user-id (or pgg-gpg-user-id pgg-default-user-id))
                         (aref status 11)))
              (if (zerop (aref status 9))
                  ""
-               "\tSecret keys are imported.\n")))
-    (append-to-buffer pgg-output-buffer (point-min)(point-max))
-    (pgg-process-when-success)))
+               "\tSecret keys are imported.\n"))
+      ;; XXX: copy contents of pgg-errors-buffer into
+      ;; pgg-output-buffer for backward compatibility.
+      (with-current-buffer pgg-output-buffer
+       (set-buffer-multibyte t)
+       (insert-buffer-substring pgg-errors-buffer))
+      t)))
 
 (provide 'pgg-gpg)