;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
;; 2005, 2006 Free Software Foundation, Inc.
-;; Author: Sascha LΓΌdecke <sascha@meta-x.de>,
+;; Author: Sascha Ldecke <sascha@meta-x.de>,
;; Simon Josefsson <simon@josefsson.org> (Mailcrypt interface, Gnus glue)
;; Keywords PGP
(require 'cl)
(require 'mm-util))
-(require 'password)
+(require 'mml-sec)
(defvar mc-pgp-always-sign)
mml1991-epg-encrypt))
"Alist of PGP functions.")
-(defvar mml1991-verbose nil
+(defvar mml1991-verbose mml-secure-verbose
"If non-nil, ask the user about the current operation more verbosely.")
-(defvar mml1991-cache-passphrase t
+(defvar mml1991-cache-passphrase mml-secure-cache-passphrase
"If t, cache passphrase.")
-(defvar mml1991-passphrase-cache-expiry 16
+(defvar mml1991-passphrase-cache-expiry mml-secure-passphrase-cache-expiry
"How many seconds the passphrase is cached.
Whether the passphrase is cached at all is controlled by
`mml1991-cache-passphrase'.")
+(defvar mml1991-signers nil
+ "A list of your own key ID which will be used to sign a message.")
+
+(defvar mml1991-encrypt-to-self nil
+ "If t, add your own key ID to recipient list when encryption.")
+
;;; mailcrypt wrapper
(eval-and-compile
(autoload 'epg-passphrase-callback-function "epg")
(autoload 'epa-select-keys "epa")
(autoload 'epg-list-keys "epg")
-
(autoload 'epg-context-set-armor "epg")
(autoload 'epg-context-set-textmode "epg")
-
(autoload 'epg-context-set-signers "epg")
(autoload 'epg-context-set-passphrase-callback "epg")
-
(autoload 'epg-sign-string "epg")
- (autoload 'epg-encrypt-string "epg"))
+ (autoload 'epg-encrypt-string "epg")
+ (autoload 'epg-configuration "epg-config")
+ (autoload 'epg-expand-group "epg-config"))
+
+(eval-when-compile
+ (defvar password-cache-expiry)
+ (autoload 'password-read "password")
+ (autoload 'password-cache-add "password")
+ (autoload 'password-cache-remove "password"))
(defvar mml1991-epg-secret-key-id-list nil)
(if mml1991-verbose
(setq signers (epa-select-keys context "Select keys for signing.
If no one is selected, default secret key is used. "
- nil t))
- (setq signers (list (car (epg-list-keys
- context
- (message-options-get 'mml-sender) t)))))
+ mml1991-signers t))
+ (if mml1991-signers
+ (setq signers (mapcar (lambda (name)
+ (car (epg-list-keys context name t)))
+ mml1991-signers))))
(epg-context-set-armor context t)
(epg-context-set-textmode context t)
(epg-context-set-signers context signers)
(when cte
(mm-decode-content-transfer-encoding (intern (downcase cte))))))
(let ((context (epg-make-context))
- recipients cipher)
- (if (or mml1991-verbose
- (null (message-options-get 'message-recipients)))
+ (recipients
+ (if (message-options-get 'message-recipients)
+ (split-string
+ (message-options-get 'message-recipients)
+ "[ \f\t\n\r\v,]+")))
+ cipher signers config)
+ ;; We should remove this check if epg-0.0.6 is released.
+ (if (and (condition-case nil
+ (require 'epg-config)
+ (error))
+ (functionp #'epg-expand-group))
+ (setq config (epg-configuration)
+ recipients
+ (apply #'nconc
+ (mapcar (lambda (recipient)
+ (or (epg-expand-group config recipient)
+ (list recipient)))
+ recipients))))
+ (if mml1991-verbose
(setq recipients
(epa-select-keys context "Select recipients for encryption.
If no one is selected, symmetric encryption will be performed. "
- (if (message-options-get 'message-recipients)
- (split-string
- (message-options-get 'message-recipients)
- "[ \f\t\n\r\v,]+"))))
+ recipients))
(setq recipients
- (mapcar (lambda (name)
- (car (epg-list-keys context name)))
- (split-string
- (message-options-get 'message-recipients)
- "[ \f\t\n\r\v,]+"))))
+ (delq nil (mapcar (lambda (name)
+ (car (epg-list-keys context name)))
+ recipients))))
+ (if mml1991-encrypt-to-self
+ (if mml1991-signers
+ (setq recipients
+ (nconc recipients
+ (mapcar (lambda (name)
+ (car (epg-list-keys context name)))
+ mml1991-signers)))
+ (error "mml1991-signers not set")))
+ (when sign
+ (if mml1991-verbose
+ (setq signers (epa-select-keys context "Select keys for signing.
+If no one is selected, default secret key is used. "
+ mml1991-signers t))
+ (if mml1991-signers
+ (setq signers (mapcar (lambda (name)
+ (car (epg-list-keys context name t)))
+ mml1991-signers))))
+ (epg-context-set-signers context signers))
(epg-context-set-armor context t)
(epg-context-set-textmode context t)
(if mml1991-cache-passphrase