X-Git-Url: https://cgit.sxemacs.org/?a=blobdiff_plain;f=contrib%2Fgpg.el;h=80c5d8a81e4215bbce3be5ced155738bd827c83a;hb=8b5af94e55ef83ee46b42d32d92fa1ce95dcacf5;hp=79b909106c30bf119ca2bcecc3f477e654af2282;hpb=eddd2351b9358758cd07f79c27e11d57a83b203f;p=gnus diff --git a/contrib/gpg.el b/contrib/gpg.el index 79b909106..80c5d8a81 100644 --- a/contrib/gpg.el +++ b/contrib/gpg.el @@ -7,13 +7,11 @@ ;; Keywords: crypto ;; Created: 2000-04-15 -;; $Id: gpg.el,v 1.5 2000/12/01 04:13:45 zsh Exp $ - ;; This file is NOT (yet?) part of GNU Emacs. ;; GNU Emacs 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) +;; the Free Software Foundation; either version 3, or (at your option) ;; any later version. ;; GNU Emacs is distributed in the hope that it will be useful, @@ -23,8 +21,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. ;;; Commentary: @@ -41,8 +39,8 @@ ;; * Customization for all flavors of PGP is possible. ;; * The main operations (verify, decrypt, sign, encrypt, sign & ;; encrypt) are implemented. -;; * Gero Treuner's gpg-2comp script is supported, and data which is is -;; compatible with PGP 2.6.3 is generated. +;; * Optionally, Gero Treuner's gpg-2comp script is supported, +;; to generate data which is compatible with PGP 2.6.3. ;; Customizing external programs ;; ============================= @@ -106,16 +104,33 @@ ;; function (bound to `C-h l' by default). -;;;; Code: - -(require 'timer) -(eval-when-compile - (require 'cl)) - -(defalias 'gpg-point-at-eol - (if (fboundp 'point-at-eol) - 'point-at-eol - 'line-end-position)) +;;; Code: + +(if (featurep 'xemacs) + (require 'timer-funcs) + (require 'timer)) +(eval-when-compile (require 'cl)) + +(eval-and-compile + (defalias 'gpg-point-at-eol + (if (fboundp 'point-at-eol) + 'point-at-eol + 'line-end-position))) + +;; itimer/timer compatibility +(eval-and-compile + (if (featurep 'xemacs) + (progn + (defalias 'gpg-cancel-timer 'delete-itimer) + (defalias 'gpg-timer-activate 'activate-itimer) + (defalias 'gpg-timer-create 'make-itimer) + (defalias 'gpg-timer-set-function 'set-itimer-function) + (defalias 'gpg-timer-set-time 'set-itimer-value)) + (defalias 'gpg-cancel-timer 'cancel-timer) + (defalias 'gpg-timer-activate 'timer-activate) + (defalias 'gpg-timer-create 'timer-create) + (defalias 'gpg-timer-set-function 'timer-set-function) + (defalias 'gpg-timer-set-time 'timer-set-time))) ;;;; Customization: @@ -143,12 +158,19 @@ ;;; Customization: Widgets: -(define-widget 'gpg-command-alist 'alist - "An association list for GnuPG command names." - :key-type '(symbol :tag "Abbreviation") - :value-type '(string :tag "Program name") - :convert-widget 'widget-alist-convert-widget - :tag "Alist") +(if (get 'alist 'widget-type) + (define-widget 'gpg-command-alist 'alist + "An association list for GnuPG command names." + :key-type '(symbol :tag "Abbreviation") + :value-type '(string :tag "Program name") + :convert-widget 'widget-alist-convert-widget + :tag "Alist") + (define-widget 'gpg-command-alist 'repeat + "An association list for GnuPG command names." + :args '((cons :format "%v" + (symbol :tag "Abbreviation") + (string :tag "Program name"))) + :tag "Alist")) (define-widget 'gpg-command-program 'choice "Widget for entering the name of a program (mostly the GnuPG binary)." @@ -220,16 +242,22 @@ If you are running Emacs 20, this directory must have mode 0700." (defcustom gpg-command-default-alist '((gpg . "gpg") - (gpg-2comp . "gpg-2comp")) + (gpg-2comp . "gpg")) "Default paths for some GnuPG-related programs. Modify this variable if you have to change the paths to the -executables required by the GnuPG interface. You can enter \"gpg\" -for `gpg-2comp' if you don't have this script, but you'll lose PGP -2.6.x compatibility." +executables required by the GnuPG interface. You can enter \"gpg-2comp\" +for `gpg-2comp' if you have obtained this script, in order to gain +PGP 2.6.x compatibility." :tag "GnuPG programs" :type 'gpg-command-alist :group 'gpg-options) +(defcustom gpg-command-all-arglist + nil + "List of arguments to add to all GPG commands." + :tag "All command args" + :group 'gpg-options) + (defcustom gpg-command-flag-textmode "--textmode" "The flag to indicate canonical text mode to GnuPG." :tag "Text mode flag" @@ -289,7 +317,7 @@ indicate that it should read the passphrase from standard input." ;;; Customization: Variables: GnuPG Commands: (defcustom gpg-command-verify - '(gpg . ("--batch" "--verbose" "--verify" signature-file message-file)) + '(gpg . ("--status-fd" "1" "--batch" "--verbose" "--verify" signature-file message-file)) "Command to verify a detached signature. The invoked program has to read the signed message and the signature from the given files. It should write human-readable information to @@ -310,7 +338,7 @@ charsets or line endings; the input data shall be treated as binary." :group 'gpg-commands) (defcustom gpg-command-verify-cleartext - '(gpg . ("--batch" "--verbose" "--verify" message-file)) + '(gpg . ("--status-fd" "1" "--batch" "--verbose" "--verify" message-file)) "Command to verify a message. The invoked program has to read the signed message from the given file. It should write human-readable information to standard output @@ -329,7 +357,7 @@ endings; the input data shall be treated as binary." :group 'gpg-commands) (defcustom gpg-command-decrypt - '(gpg . ("--decrypt" "--batch" "--passphrase-fd=0")) + '(gpg . ("--status-fd" "2" "--decrypt" "--batch" "--passphrase-fd=0")) "Command to decrypt a message. The invoked program has to read the passphrase from standard input, followed by the encrypted message. It writes the decrypted @@ -351,7 +379,7 @@ standard error." '(gpg-2comp . ("--batch" "--passphrase-fd=0" "--output=-" armor textmode "--clearsign" sign-with-key)) - "Command to create a create a \"clearsign\" text file. + "Command to create a \"clearsign\" text file. The invoked program has to read the passphrase from standard input, followed by the message to sign. It should write the ASCII-amored signed text message to standard output, and diagnostic messages to @@ -364,7 +392,7 @@ standard error." '(gpg-2comp . ("--batch" "--passphrase-fd=0" "--output=-" armor textmode "--detach-sign" sign-with-key)) - "Command to create a create a detached signature. + "Command to create a detached signature. The invoked program has to read the passphrase from standard input, followed by the message to sign. It should write the ASCII-amored detached signature to standard output, and diagnostic messages to @@ -536,7 +564,7 @@ it are replaced by SUBSTITUTIONS. SUBSTITIONS is a list of (SYMBOL . SEXP) pairs, where SEXP is either a string (which is inserted literally), a list of strings (which are inserted as well), or nil, which means to insert nothing." - (let (arglist) + (let ((arglist (copy-sequence gpg-command-all-arglist))) (while template (let* ((templ (pop template)) (repl (assoc templ substitutions)) @@ -616,8 +644,9 @@ adjust according to `gpg-command-passphrase-env'." ;; make-temp-name doesn't create the file, and an ordinary ;; write-file operation is prone to nasty symlink attacks if the ;; temporary file resides in a world-writable directory. - (unless (eq (file-modes gpg-temp-directory) 448) ; mode 0700 - (error "Directory for temporary files must have mode 0700.")) + (unless (or (memq system-type '(windows-nt cygwin32 win32 w32 mswindows)) + (eq (file-modes gpg-temp-directory) 448)) ; mode 0700 + (error "Directory for temporary files (%s) must have mode 0700" gpg-temp-directory)) (setq name (make-temp-name name)) (let ((mode (default-file-modes))) (unwind-protect @@ -749,7 +778,7 @@ Never set this variable directly, use `gpg-show-result' instead.") (save-window-excursion (display-buffer (current-buffer)) (unless (y-or-n-p "Continue? ") - (error "GnuPG operation aborted.")))))) + (error "GnuPG operation aborted")))))) (defmacro gpg-show-result (always-show &rest body) "Show GnuPG result to user for confirmation. @@ -767,7 +796,7 @@ evaluates BODY, like `progn'. If BODY evaluates to `nil' (or ;;; Passphrase handling: (defvar gpg-passphrase-timer - (timer-create) + (gpg-timer-create) "This timer will clear the passphrase cache periodically.") (defvar gpg-passphrase @@ -786,21 +815,25 @@ evaluates BODY, like `progn'. If BODY evaluates to `nil' (or (defun gpg-passphrase-forget () "Forget stored passphrase." (interactive) - (cancel-timer gpg-passphrase-timer) - (gpg-passphrase-clear-string gpg-passphrase) - (setq gpg-passphrase nil)) + (when gpg-passphrase + (gpg-cancel-timer gpg-passphrase-timer) + (setq gpg-passphrase-timer nil) + (gpg-passphrase-clear-string gpg-passphrase) + (setq gpg-passphrase nil))) (defun gpg-passphrase-store (passphrase) "Store PASSPHRASE in cache. Updates the timeout for clearing the cache to `gpg-passphrase-timeout'." (unless (equal gpg-passphrase-timeout 0) - (timer-set-time gpg-passphrase-timer - (timer-relative-time (current-time) - gpg-passphrase-timeout)) - (timer-set-function gpg-passphrase-timer 'gpg-passphrase-forget) + (if (null gpg-passphrase-timer) + (setq gpg-passphrase-timer (gpg-timer-create))) + (gpg-timer-set-time gpg-passphrase-timer + (timer-relative-time (current-time) + gpg-passphrase-timeout)) + (gpg-timer-set-function gpg-passphrase-timer 'gpg-passphrase-forget) (unless (and (fboundp 'itimer-live-p) (itimer-live-p gpg-passphrase-timer)) - (timer-activate gpg-passphrase-timer)) + (gpg-timer-activate gpg-passphrase-timer)) (setq gpg-passphrase passphrase)) passphrase) @@ -1161,6 +1194,14 @@ documentation for details)." (?u . trust-ultimate)) "Alist mapping GnuPG trust value short forms to long symbols.") +(defconst gpg-unabbrev-trust-alist + '(("TRUST_UNDEFINED" . trust-undefined) + ("TRUST_NEVER" . trust-none) + ("TRUST_MARGINAL" . trust-marginal) + ("TRUST_FULLY" . trust-full) + ("TRUST_ULTIMATE" . trust-ultimate)) + "Alist mapping capitalized GnuPG trust values to long symbols.") + (defmacro gpg-key-list-keys-in-buffer-store () '(when primary-user-id (sort user-id 'string-lessp) @@ -1295,4 +1336,5 @@ before point.") (provide 'gpg) +;;; arch-tag: c972455d-9bc5-4de1-9dc7-4f494d63053b ;;; gpg.el ends here