X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=epg.el;h=de72571a6423696f10a5b6b2fd10cb132bc0411c;hb=95ff40c9179c88308fe96e1adb0ef220b67f265c;hp=d689fba8c249ff4f4e2232023e3694fbf06c8a01;hpb=e8b1b9d766bc634c0f7fd60255e2f4301c1c97bf;p=elisp%2Fepg.git diff --git a/epg.el b/epg.el index d689fba..de72571 100644 --- a/epg.el +++ b/epg.el @@ -1,3 +1,30 @@ +;;; epg.el --- EasyPG, yet another GnuPG interface. +;; Copyright (C) 1999, 2000, 2002, 2003, 2004, +;; 2005, 2006 Free Software Foundation, Inc. +;; Copyright (C) 2006 Daiki Ueno + +;; Author: Daiki Ueno +;; Keywords: PGP, GnuPG + +;; This file is part of EasyPG. + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; 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., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. + +;;; Code: + (defgroup epg () "EasyPG, yet another GnuPG interface.") @@ -57,6 +84,8 @@ This is used by `epg-list-keys'.") (user-id "[^:]+")) "The schema of keylisting output whose type is \"uid\". This is used by `epg-list-keys'.") + +(defvar epg-prompt-alist nil) (defun epg-make-context (&optional protocol armor textmode include-certs) "Return a context object." @@ -153,7 +182,7 @@ This function is for internal use only." (defun epg-make-signature (status key-id user-id) "Return a signature object." - (vector status key-id user-id nil)) + (vector status key-id user-id nil nil)) (defun epg-signature-status (signature) "Return the status code of SIGNATURE." @@ -171,6 +200,10 @@ This function is for internal use only." "Return the validity of SIGNATURE." (aref signature 3)) +(defun epg-signature-fingerprint (signature) + "Return the fingerprint of SIGNATURE." + (aref signature 4)) + (defun epg-signature-set-status (signature status) "Set the status code of SIGNATURE." (aset signature 0 status)) @@ -187,6 +220,10 @@ This function is for internal use only." "Set the validity of SIGNATURE." (aset signature 3 validity)) +(defun epg-signature-set-fingerprint (signature fingerprint) + "Set the fingerprint of SIGNATURE." + (aset signature 4 fingerprint)) + (defun epg-context-result-for (context name) (cdr (assq name (epg-context-result context)))) @@ -290,8 +327,7 @@ This function is for internal use only." (kill-buffer (process-buffer (epg-context-process context)))) (epg-context-set-process context nil) (if (file-exists-p (epg-context-output-file context)) - (delete-file (epg-context-output-file context))) - (aset context 9 nil)) + (delete-file (epg-context-output-file context)))) (defun epg-status-USERID_HINT (process string) (if (string-match "\\`\\([^ ]+\\) \\(.*\\)" string) @@ -329,6 +365,17 @@ This function is for internal use only." (if string (fillarray string 0)))))) +(defun epg-status-GET_BOOL (process string) + (let ((entry (assoc string epg-prompt-alist))) + (if (y-or-n-p (if entry (cdr entry) (concat string "? "))) + (process-send-string process "y\n") + (process-send-string process "n\n")))) + +(defun epg-status-GET_LINE (process string) + (let* ((entry (assoc string epg-prompt-alist)) + (string (read-string (if entry (cdr entry) (concat string ": "))))) + (process-send-string process (concat string "\n"))))) + (defun epg-status-GOODSIG (process string) (if (string-match "\\`\\([^ ]+\\) \\(.*\\)" string) (epg-context-set-result-for @@ -379,11 +426,18 @@ This function is for internal use only." (match-string 2 string)) (epg-context-result-for epg-context 'verify))))) +(defun epg-status-VALIDSIG (process string) + (let ((signature (car (epg-context-result-for epg-context 'verify)))) + (if (and signature + (eq (epg-signature-status signature) 'good) + (string-match "\\`\\([^ ]+\\) " string)) + (epg-signature-set-fingerprint signature (match-string 1 string))))) + (defun epg-status-TRUST_UNDEFINED (process string) (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)))) + (epg-signature-set-validity signature 'undefined)))) (defun epg-status-TRUST_NEVER (process string) (let ((signature (car (epg-context-result-for epg-context 'verify)))) @@ -401,13 +455,13 @@ This function is for internal use only." (let ((signature (car (epg-context-result-for epg-context 'verify)))) (if (and signature (eq (epg-signature-status signature) 'good)) - (epg-signature-set-validity signature 'full)))) + (epg-signature-set-validity signature 'fully)))) (defun epg-status-TRUST_ULTIMATE (process string) (let ((signature (car (epg-context-result-for epg-context 'verify)))) (if (and signature (eq (epg-signature-status signature) 'good)) - (epg-signature-set-validity signature 'full)))) + (epg-signature-set-validity signature 'ultimate)))) (defun epg-status-PROGRESS (process string) (if (string-match "\\`\\([^ ]+\\) \\([^ ]\\) \\([0-9]+\\) \\([0-9]+\\)" @@ -580,6 +634,7 @@ If you use this function, you will need to wait for the completion of `epg-reset' to clear a temporaly output file. If you are unsure, use synchronous version of this function `epg-decrypt-string' instead." + (epg-context-set-result context nil) (epg-context-set-output-file context (epg-make-temp-file "epg-output")) (epg-start context (list "--decrypt" input-file)) @@ -621,6 +676,7 @@ If you use this function, you will need to wait for the completion of `epg-reset' to clear a temporaly output file. If you are unsure, use synchronous version of this function `epg-verify-string' instead." + (epg-context-set-result context nil) (epg-context-set-output-file context (epg-make-temp-file "epg-output")) (if string ;; Detached signature. @@ -636,6 +692,19 @@ If you are unsure, use synchronous version of this function (process-send-string (epg-context-process context) signature)))) ;;;###autoload +(defun epg-verify-file (context input-file &optional string) + "Verify INPUT-FILE. + +For a detached signature, both INPUT-FILE and STRING should be string. +For a normal or a clear text signature, STRING should be nil." + (unwind-protect + (progn + (epg-start-verify context input-file string) + (epg-wait-for-completion context) + (epg-context-result-for context 'verify)) + (epg-reset context))) + +;;;###autoload (defun epg-verify-string (context signature &optional string) "Verify SIGNATURE. @@ -652,19 +721,6 @@ For a normal or a clear text signature, STRING should be nil." (delete-file input-file))))) ;;;###autoload -(defun epg-verify-file (context input-file &optional string) - "Verify INPUT-FILE. - -For a detached signature, both INPUT-FILE and STRING should be string. -For a normal or a clear text signature, STRING should be nil." - (unwind-protect - (progn - (epg-start-verify context input-file string) - (epg-wait-for-completion context) - (epg-context-result-for context 'verify)) - (epg-reset context)))) - -;;;###autoload (defun epg-start-sign (context string &optional mode) "Initiate a sign operation on STRING. @@ -677,6 +733,7 @@ If you use this function, you will need to wait for the completion of `epg-reset' to clear a temporaly output file. If you are unsure, use synchronous version of this function `epg-sign-string' instead." + (epg-context-set-result context nil) (epg-context-set-output-file context (epg-make-temp-file "epg-output")) (epg-start context (append (list (if (eq mode 'clearsign) @@ -718,6 +775,7 @@ If you use this function, you will need to wait for the completion of `epg-reset' to clear a temporaly output file. If you are unsure, use synchronous version of this function `epg-encrypt-string' instead." + (epg-context-set-result context nil) (epg-context-set-output-file context (epg-make-temp-file "epg-output")) (epg-start context (append (if always-trust '("--always-trust")) @@ -762,6 +820,7 @@ If you use this function, you will need to wait for the completion of `epg-reset' to clear a temporaly output file. If you are unsure, use synchronous version of this function `epg-export-keys' instead." + (epg-context-set-result context nil) (epg-context-set-output-file context (epg-make-temp-file "epg-output")) (epg-start context (list "--export" pattern))) @@ -786,6 +845,7 @@ If you use this function, you will need to wait for the completion of `epg-reset' to clear a temporaly output file. If you are unsure, use synchronous version of this function `epg-import-keys' instead." + (epg-context-set-result context nil) (epg-context-set-output-file context (epg-make-temp-file "epg-output")) (epg-start context (list "--import")) (if (eq (process-status (epg-context-process context)) 'run)