X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=epg.el;h=85bb3fa52c92ba4066f2a4192b53fa0a030f1d2d;hb=c1babcf7986279159bdb80e02726adf8c96cae83;hp=1f16e707903a4faeb4e96b6c2f17ed9e8e11b3e5;hpb=62b17db4ee729066028fe0bb17fe46580d45f95e;p=elisp%2Fepg.git diff --git a/epg.el b/epg.el index 1f16e70..85bb3fa 100644 --- a/epg.el +++ b/epg.el @@ -186,7 +186,7 @@ (vector (or protocol 'OpenPGP) armor textmode include-certs cipher-algorithm digest-algorithm compress-algorithm #'epg-passphrase-callback-function - #'epg-progress-callback-function + nil nil nil nil nil nil))) (defun epg-context-protocol (context) @@ -787,8 +787,9 @@ This function is for internal use only." epg-gpg-program))) (let* ((args (append (list "--no-tty" "--status-fd" "1" - "--yes" - "--enable-progress-filter") + "--yes") + (if (epg-context-progress-callback context) + (list "--enable-progress-filter")) (if epg-gpg-home-directory (list "--homedir" epg-gpg-home-directory)) (unless (eq (epg-context-protocol context) 'CMS) @@ -929,53 +930,55 @@ This function is for internal use only." (setq epg-key-id 'PIN)) (defun epg--status-GET_HIDDEN (context string) - (if (and epg-key-id - (string-match "\\`passphrase\\." string)) - (let (inhibit-quit - passphrase - passphrase-with-new-line - encoded-passphrase-with-new-line) - (unwind-protect - (condition-case nil - (progn - (setq passphrase - (funcall - (if (consp (epg-context-passphrase-callback context)) - (car (epg-context-passphrase-callback context)) - (epg-context-passphrase-callback context)) - context - epg-key-id - (if (consp (epg-context-passphrase-callback context)) - (cdr (epg-context-passphrase-callback context))))) - (when passphrase - (setq passphrase-with-new-line (concat passphrase "\n")) - (epg--clear-string passphrase) - (setq passphrase nil) - (if epg-locale-coding-system - (progn - (setq encoded-passphrase-with-new-line - (encode-coding-string - passphrase-with-new-line - epg-locale-coding-system)) - (epg--clear-string passphrase-with-new-line) - (setq passphrase-with-new-line nil)) - (setq encoded-passphrase-with-new-line - passphrase-with-new-line - passphrase-with-new-line nil)) - (process-send-string (epg-context-process context) - encoded-passphrase-with-new-line))) - (quit - (epg-context-set-result-for - context 'error - (cons '(quit) - (epg-context-result-for context 'error))) - (delete-process (epg-context-process context)))) - (if passphrase - (epg--clear-string passphrase)) - (if passphrase-with-new-line - (epg--clear-string passphrase-with-new-line)) - (if encoded-passphrase-with-new-line - (epg--clear-string encoded-passphrase-with-new-line)))))) + (when (and epg-key-id + (string-match "\\`passphrase\\." string)) + (unless (epg-context-passphrase-callback context) + (error "passphrase-callback not set")) + (let (inhibit-quit + passphrase + passphrase-with-new-line + encoded-passphrase-with-new-line) + (unwind-protect + (condition-case nil + (progn + (setq passphrase + (funcall + (if (consp (epg-context-passphrase-callback context)) + (car (epg-context-passphrase-callback context)) + (epg-context-passphrase-callback context)) + context + epg-key-id + (if (consp (epg-context-passphrase-callback context)) + (cdr (epg-context-passphrase-callback context))))) + (when passphrase + (setq passphrase-with-new-line (concat passphrase "\n")) + (epg--clear-string passphrase) + (setq passphrase nil) + (if epg-passphrase-coding-system + (progn + (setq encoded-passphrase-with-new-line + (encode-coding-string + passphrase-with-new-line + epg-passphrase-coding-system)) + (epg--clear-string passphrase-with-new-line) + (setq passphrase-with-new-line nil)) + (setq encoded-passphrase-with-new-line + passphrase-with-new-line + passphrase-with-new-line nil)) + (process-send-string (epg-context-process context) + encoded-passphrase-with-new-line))) + (quit + (epg-context-set-result-for + context 'error + (cons '(quit) + (epg-context-result-for context 'error))) + (delete-process (epg-context-process context)))) + (if passphrase + (epg--clear-string passphrase)) + (if passphrase-with-new-line + (epg--clear-string passphrase-with-new-line)) + (if encoded-passphrase-with-new-line + (epg--clear-string encoded-passphrase-with-new-line)))))) (defun epg--status-GET_BOOL (context string) (let ((entry (assoc string epg-prompt-alist)) @@ -1305,7 +1308,9 @@ This function is for internal use only." (defun epg-progress-callback-function (context what char current total handback) - (message "%s: %d/%d" what current total)) + (message "%s: %d%% (%d/%d)" what + (if (> total 0) (floor (* (/ current (float total)) 100)) 0) + current total)) (defun epg--list-keys-1 (context name mode) (let ((args (append (if epg-gpg-home-directory @@ -1507,7 +1512,7 @@ You can then use `write-region' to write new data into the file." ;;;###autoload (defun epg-start-decrypt (context cipher) "Initiate a decrypt operation on CIPHER. -CIPHER is a data object. +CIPHER must be a file data object. If you use this function, you will need to wait for the completion of `epg-gpg-program' by using `epg-wait-for-completion' and call @@ -1518,7 +1523,7 @@ If you are unsure, use synchronous version of this function (error "Not a file")) (epg-context-set-operation context 'decrypt) (epg-context-set-result context nil) - (epg--start context (list "--decrypt" (epg-data-file cipher))) + (epg--start context (list "--decrypt" "--" (epg-data-file cipher))) ;; `gpgsm' does not read passphrase from stdin, so waiting is not needed. (unless (eq (epg-context-protocol context) 'CMS) (epg-wait-for-status context '("BEGIN_DECRYPTION")))) @@ -1583,9 +1588,10 @@ If you are unsure, use synchronous version of this function (if signed-text ;; Detached signature. (if (epg-data-file signed-text) - (epg--start context (list "--verify" (epg-data-file signature) + (epg--start context (list "--verify" "--" (epg-data-file signature) (epg-data-file signed-text))) - (epg--start context (list "--verify" (epg-data-file signature) "-")) + (epg--start context (list "--verify" "--" (epg-data-file signature) + "-")) (if (eq (process-status (epg-context-process context)) 'run) (process-send-string (epg-context-process context) (epg-data-string signed-text))) @@ -1593,7 +1599,7 @@ If you are unsure, use synchronous version of this function (process-send-eof (epg-context-process context)))) ;; Normal (or cleartext) signature. (if (epg-data-file signature) - (epg--start context (list "--verify" (epg-data-file signature))) + (epg--start context (list "--verify" "--" (epg-data-file signature))) (epg--start context (list "--verify")) (if (eq (process-status (epg-context-process context)) 'run) (process-send-string (epg-context-process context) @@ -1692,7 +1698,7 @@ If you are unsure, use synchronous version of this function (car (epg-key-sub-key-list signer))))) (epg-context-signers context))) (if (epg-data-file plain) - (list (epg-data-file plain))))) + (list "--" (epg-data-file plain))))) ;; `gpgsm' does not read passphrase from stdin, so waiting is not needed. (unless (eq (epg-context-protocol context) 'CMS) (epg-wait-for-status context '("BEGIN_SIGNING"))) @@ -1785,7 +1791,7 @@ If you are unsure, use synchronous version of this function (car (epg-key-sub-key-list recipient))))) recipients)) (if (epg-data-file plain) - (list (epg-data-file plain))))) + (list "--" (epg-data-file plain))))) ;; `gpgsm' does not read passphrase from stdin, so waiting is not needed. (unless (eq (epg-context-protocol context) 'CMS) (if sign @@ -1909,7 +1915,7 @@ If you are unsure, use synchronous version of this function (epg-context-set-operation context 'import-keys) (epg-context-set-result context nil) (epg--start context (if (epg-data-file keys) - (list "--import" (epg-data-file keys)) + (list "--import" "--" (epg-data-file keys)) (list "--import"))) (when (epg-data-string keys) (if (eq (process-status (epg-context-process context)) 'run) @@ -2045,7 +2051,7 @@ If you are unsure, use synchronous version of this function (epg-context-set-operation context 'generate-key) (epg-context-set-result context nil) (if (epg-data-file parameters) - (epg--start context (list "--batch" "--genkey" + (epg--start context (list "--batch" "--genkey" "--" (epg-data-file parameters))) (epg--start context '("--batch" "--genkey")) (if (eq (process-status (epg-context-process context)) 'run)