X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=epg.el;h=330e7c46926c58c809d3bb1d6de8d2b1b20a02ba;hb=b1d05ceee17137266c8a4729bb0180fe265baae4;hp=cd5ecb63b02f62507d1e2f7906da7e5a884ecc05;hpb=b4b57c9f5289d2699225fa15fdf8074e22622c0b;p=elisp%2Fepg.git diff --git a/epg.el b/epg.el index cd5ecb6..330e7c4 100644 --- a/epg.el +++ b/epg.el @@ -260,7 +260,8 @@ This function is for internal use only." (defun epg-read-output (context) (with-temp-buffer - (set-buffer-multibyte nil) + (if (fboundp 'set-buffer-multibyte) + (set-buffer-multibyte nil)) (if (file-exists-p (epg-context-output-file context)) (let ((coding-system-for-read (if (epg-context-textmode context) 'raw-text @@ -276,7 +277,8 @@ This function is for internal use only." (accept-process-output (epg-context-process context) 1)))) (defun epg-wait-for-completion (context) - (process-send-eof (epg-context-process context)) + (if (eq (process-status (epg-context-process context)) 'run) + (process-send-eof (epg-context-process context))) (while (eq (process-status (epg-context-process context)) 'run) ;; We can't use accept-process-output instead of sit-for here ;; because it may cause an interrupt during the sentinel execution. @@ -378,7 +380,7 @@ This function is for internal use only." (epg-context-result-for epg-context 'verify))))) (defun epg-status-TRUST_UNDEFINED (process string) - (let ((signature (car (epg-context-result-for-for epg-context 'verify)))) + (let ((signature (car (epg-context-result-for epg-context 'verify)))) (if (and signature (eq (epg-signature-status signature) 'good)) (epg-signature-set-validity signature 'unknown)))) @@ -407,9 +409,6 @@ This function is for internal use only." (eq (epg-signature-status signature) 'good)) (epg-signature-set-validity signature 'full)))) -(defun epg-status-DECRYPTION_FAILED (process string) - (epg-context-set-result-for epg-context 'decrypt 'failed)) - (defun epg-status-PROGRESS (process string) (if (string-match "\\`\\([^ ]+\\) \\([^ ]\\) \\([0-9]+\\) \\([0-9]+\\)" string) @@ -420,6 +419,42 @@ This function is for internal use only." (string-to-number (match-string 4 string)) (cdr (epg-context-progress-callback-info epg-context))))) +(defun epg-status-DECRYPTION_FAILED (process string) + (epg-context-set-result-for + epg-context 'error + (cons 'decryption-failed + (epg-context-result-for epg-context 'error)))) + +(defun epg-status-NODATA (process string) + (epg-context-set-result-for + epg-context 'error + (cons (cons 'no-data (string-to-number string)) + (epg-context-result-for epg-context 'error)))) + +(defun epg-status-UNEXPECTED (process string) + (epg-context-set-result-for + epg-context 'error + (cons (cons 'unexpected (string-to-number string)) + (epg-context-result-for epg-context 'error)))) + +(defun epg-status-KEYEXPIRED (process string) + (epg-context-set-result-for + epg-context 'error + (cons (cons 'key-expired string) + (epg-context-result-for epg-context 'error)))) + +(defun epg-status-KEYREVOKED (process string) + (epg-context-set-result-for + epg-context 'error + (cons 'key-revoked + (epg-context-result-for epg-context 'error)))) + +(defun epg-status-BADARMOR (process string) + (epg-context-set-result-for + epg-context 'error + (cons 'bad-armor + (epg-context-result-for epg-context 'error)))) + (defun epg-passphrase-callback-function (key-id handback) (read-passwd (if (eq key-id 'SYM) @@ -488,7 +523,54 @@ This function is for internal use only." (setq alist (cdr alist))) (nreverse result))) -(defalias 'epg-make-temp-file 'make-temp-file) +(if (fboundp 'make-temp-file) + (defalias 'epg-make-temp-file 'make-temp-file) + ;; stolen from poe.el. + (defun epg-make-temp-file (prefix) + "Create a temporary file. +The returned file name (created by appending some random characters at the end +of PREFIX, and expanding against `temporary-file-directory' if necessary), +is guaranteed to point to a newly created empty file. +You can then use `write-region' to write new data into the file." + (let (tempdir tempfile) + (unwind-protect + (let (file) + ;; First, create a temporary directory. + (while (condition-case () + (progn + (setq tempdir (make-temp-name + (concat + (file-name-directory prefix) + "DIR"))) + ;; return nil or signal an error. + (make-directory tempdir)) + ;; let's try again. + (file-already-exists t))) + (set-file-modes tempdir 448) + ;; Second, create a temporary file in the tempdir. + ;; There *is* a race condition between `make-temp-name' + ;; and `write-region', but we don't care it since we are + ;; in a private directory now. + (setq tempfile (make-temp-name (concat tempdir "/EMU"))) + (write-region "" nil tempfile nil 'silent) + (set-file-modes tempfile 384) + ;; Finally, make a hard-link from the tempfile. + (while (condition-case () + (progn + (setq file (make-temp-name prefix)) + ;; return nil or signal an error. + (add-name-to-file tempfile file)) + ;; let's try again. + (file-already-exists t))) + file) + ;; Cleanup the tempfile. + (and tempfile + (file-exists-p tempfile) + (delete-file tempfile)) + ;; Cleanup the tempdir. + (and tempdir + (file-directory-p tempdir) + (delete-directory tempdir)))))) ;;;###autoload (defun epg-decrypt-start (context input-file) @@ -511,11 +593,10 @@ If you are unsure, use synchronous version of this function (progn (epg-decrypt-start context input-file) (epg-wait-for-completion context) - (unless (epg-context-result-for context 'decrypt) - (epg-read-output context))) - (epg-reset context) - (if (file-exists-p input-file) - (delete-file input-file)))) + (if (epg-context-result-for context 'error) + (error "Decryption failed")) + (epg-read-output context)) + (epg-reset context))) ;;;###autoload (defun epg-decrypt-string (context string) @@ -589,7 +670,7 @@ If you are unsure, use synchronous version of this function `epg-sign-string' instead." (epg-context-set-output-file context (epg-make-temp-file "epg-output")) (epg-start context - (append (list (if (eq 'clearsign) + (append (list (if (eq mode 'clearsign) "--clearsign" (if (or (eq mode t) (eq mode 'detached)) "--detach-sign" @@ -612,6 +693,8 @@ Otherwise, it makes a normal signature." (progn (epg-sign-start context string mode) (epg-wait-for-completion context) + (if (epg-context-result-for context 'error) + (error "Sign failed")) (epg-read-output context)) (epg-reset context))) @@ -656,6 +739,8 @@ If RECIPIENTS is nil, it performs symmetric encryption." (progn (epg-encrypt-start context string recipients sign always-trust) (epg-wait-for-completion context) + (if (epg-context-result-for context 'error) + (error "Encrypt failed")) (epg-read-output context)) (epg-reset context)))