Mercurial > emacs
annotate lisp/password-cache.el @ 107427:ecbe0edc4f69
Stop message.el from loading about 40 libraries it doesn't always need.
The general approach is to autoload rather than require, and to
require in the specific functions rather than the file. (Bug#5642)
* url/url.el: Move mailcap require earlier in the file.
* gnus/gmm-utils.el: Don't require wid-edit.
(widget-create-child-value, widget-convert, widget-default-get):
Autoload.
* gnus/gnus-util.el: Don't require time-date, netrc.
(message-fetch-field, gnus-group-name-decode): Declare rather than
autoloading.
(gnus-fetch-field): Require message.
(gnus-decode-newsgroups): Require gnus-group.
* gnus/ietf-drums.el: Don't require time-date.
* gnus/message.el: Don't require hashcash, canlock, ecomplete.
Do require mail-utils. Require nnheader only when compiling.
(smtpmail-default-smtp-server): Remove declaration.
(message-send-mail-function): Check smtpmail-default-smtp-server
is bound rather than requiring smtpmail.
(message-auto-save-directory, message-insert-signature): Use
expand-file-name rather than nnheader-concat.
(nnheader-insert-file-contents): Autoload.
(hashcash-wait-async): Declare.
(message-send-mail): Only call gnus-setup-posting-charset if
gnus-group-posting-charset-alist is bound. Require hashcash if needed.
(message-send-mail-with-sendmail): Require sendmail.
(canlock-password, canlock-password-for-verify): Declare.
(message-canlock-password): Require canlock.
(nnheader-get-report): Autoload.
(gnus-setup-posting-charset): Declare.
(message-send-news): Require gnus-msg.
(message-make-references, message-make-in-reply-to): Use mail-header-id
rather than the alias mail-header-message-id.
(ecomplete-add-item, ecomplete-save): Declare.
(message-put-addresses-in-ecomplete): Require ecomplete.
(ecomplete-display-matches): Autoload.
* gnus/mm-decode.el: Don't require mailcap, gnus-util.
(gnus-map-function, gnus-replace-in-string, gnus-read-shell-command)
(message-fetch-field, mailcap-parse-mailcaps, mailcap-mime-info):
Autoload.
(mailcap-mime-extensions): Declare.
* gnus/mm-encode.el: Don't require mailcap.
(mailcap-extension-to-mime): Autoload.
* gnus/mml-sec.el: Don't require password-cache.
* gnus/mml.el (gnus-setup-posting-charset): Declare rather than autoload.
(mailcap-parse-mimetypes, mailcap-mime-types): Declare.
(mml-minibuffer-read-type): Require mailcap.
(mml-preview): Require gnus-msg.
* gnus/mml1991.el: Require password-cache.
(password-cache-expiry): Remove declaration.
* gnus/mml2015.el: Require password-cache.
(password-cache-expiry): Remove declaration.
* gnus/nneething.el (mailcap): Require mailcap.
* gnus/nnheader.el: (declare-function): Add compatibility stub.
(message-remove-header): Declare rather than autoload.
(nnheader-replace-header): Require message.
* gnus/nnimap.el (declare-function): Add compatibility stub.
(netrc-parse, netrc-machine-user-or-password): Declare.
(nnimap-open-connection): Require netrc.
* gnus/nntp.el (declare-function): Add compatibility stub.
(netrc-parse, netrc-machine, netrc-get): Declare.
(nntp-send-authinfo): Require netrc.
* gnus/rfc2047.el: Don't require qp.
(quoted-printable-encode-region, quoted-printable-decode-string):
Autoload.
* gnus/sieve-mode.el: Don't require easymenu.
(easy-menu-add-item): Autoload it.
* gnus/spam-stat.el (time-to-number-of-days): Autoload it.
* password-cache.el (password-cache, password-cache-expiry):
Autoload.
author | Glenn Morris <rgm@gnu.org> |
---|---|
date | Thu, 18 Mar 2010 19:55:37 -0700 |
parents | 1d1d5d9bd884 |
children | acad6349cba4 |
rev | line source |
---|---|
87036 | 1 ;;; password-cache.el --- Read passwords, possibly using a password cache. |
2 | |
107427
ecbe0edc4f69
Stop message.el from loading about 40 libraries it doesn't always need.
Glenn Morris <rgm@gnu.org>
parents:
106815
diff
changeset
|
3 ;; Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2008, 2009, |
ecbe0edc4f69
Stop message.el from loading about 40 libraries it doesn't always need.
Glenn Morris <rgm@gnu.org>
parents:
106815
diff
changeset
|
4 ;; 2010 Free Software Foundation, Inc. |
87036 | 5 |
6 ;; Author: Simon Josefsson <simon@josefsson.org> | |
7 ;; Created: 2003-12-21 | |
8 ;; Keywords: password cache passphrase key | |
9 | |
10 ;; This file is part of GNU Emacs. | |
11 | |
94678
ee5932bf781d
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
93975
diff
changeset
|
12 ;; GNU Emacs is free software: you can redistribute it and/or modify |
87036 | 13 ;; it under the terms of the GNU General Public License as published by |
94678
ee5932bf781d
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
93975
diff
changeset
|
14 ;; the Free Software Foundation, either version 3 of the License, or |
ee5932bf781d
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
93975
diff
changeset
|
15 ;; (at your option) any later version. |
87036 | 16 |
17 ;; GNU Emacs is distributed in the hope that it will be useful, | |
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
20 ;; GNU General Public License for more details. | |
21 | |
22 ;; You should have received a copy of the GNU General Public License | |
94678
ee5932bf781d
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
93975
diff
changeset
|
23 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. |
87036 | 24 |
25 ;;; Commentary: | |
26 | |
27 ;; Greatly influenced by pgg.el written by Daiki Ueno, with timer | |
28 ;; fixes for XEmacs by Katsumi Yamaoka. In fact, this is mostly just | |
29 ;; a rip-off. | |
30 ;; | |
31 ;; (password-read "Password? " "test") | |
32 ;; ;; Minibuffer prompt for password. | |
33 ;; => "foo" | |
34 ;; | |
35 ;; (password-cache-add "test" "foo") | |
36 ;; => nil | |
37 | |
38 ;; (password-read "Password? " "test") | |
39 ;; ;; No minibuffer prompt | |
40 ;; => "foo" | |
41 ;; | |
42 ;; (password-read "Password? " "test") | |
43 ;; ;; No minibuffer prompt | |
44 ;; => "foo" | |
45 ;; | |
46 ;; ;; Wait `password-cache-expiry' seconds. | |
47 ;; | |
48 ;; (password-read "Password? " "test") | |
49 ;; ;; Minibuffer prompt for password is back. | |
50 ;; => "foo" | |
51 | |
52 ;;; Code: | |
53 | |
107427
ecbe0edc4f69
Stop message.el from loading about 40 libraries it doesn't always need.
Glenn Morris <rgm@gnu.org>
parents:
106815
diff
changeset
|
54 ;; Options are autoloaded since they are used by eg mml-sec.el. |
ecbe0edc4f69
Stop message.el from loading about 40 libraries it doesn't always need.
Glenn Morris <rgm@gnu.org>
parents:
106815
diff
changeset
|
55 |
ecbe0edc4f69
Stop message.el from loading about 40 libraries it doesn't always need.
Glenn Morris <rgm@gnu.org>
parents:
106815
diff
changeset
|
56 ;;;###autoload |
87036 | 57 (defcustom password-cache t |
58 "Whether to cache passwords." | |
59 :group 'password | |
60 :type 'boolean) | |
61 | |
107427
ecbe0edc4f69
Stop message.el from loading about 40 libraries it doesn't always need.
Glenn Morris <rgm@gnu.org>
parents:
106815
diff
changeset
|
62 ;;;###autoload |
87036 | 63 (defcustom password-cache-expiry 16 |
64 "How many seconds passwords are cached, or nil to disable expiring. | |
65 Whether passwords are cached at all is controlled by `password-cache'." | |
66 :group 'password | |
67 :type '(choice (const :tag "Never" nil) | |
68 (integer :tag "Seconds"))) | |
69 | |
70 (defvar password-data (make-vector 7 0)) | |
71 | |
72 (defun password-read-from-cache (key) | |
73 "Obtain passphrase for KEY from time-limited passphrase cache. | |
74 Custom variables `password-cache' and `password-cache-expiry' | |
75 regulate cache behavior." | |
76 (and password-cache | |
77 key | |
78 (symbol-value (intern-soft key password-data)))) | |
79 | |
80 (defun password-read (prompt &optional key) | |
81 "Read password, for use with KEY, from user, or from cache if wanted. | |
82 KEY indicate the purpose of the password, so the cache can | |
83 separate passwords. The cache is not used if KEY is nil. It is | |
84 typically a string. | |
85 The variable `password-cache' control whether the cache is used." | |
86 (or (password-read-from-cache key) | |
87 (read-passwd prompt))) | |
88 | |
89 (defun password-read-and-add (prompt &optional key) | |
90 "Read password, for use with KEY, from user, or from cache if wanted. | |
91 Then store the password in the cache. Uses `password-read' and | |
87037
f2417ea1baac
(top-level): Don't require cl when compiling.
Glenn Morris <rgm@gnu.org>
parents:
87036
diff
changeset
|
92 `password-cache-add'. Custom variables `password-cache' and |
f2417ea1baac
(top-level): Don't require cl when compiling.
Glenn Morris <rgm@gnu.org>
parents:
87036
diff
changeset
|
93 `password-cache-expiry' regulate cache behavior. |
f2417ea1baac
(top-level): Don't require cl when compiling.
Glenn Morris <rgm@gnu.org>
parents:
87036
diff
changeset
|
94 |
f2417ea1baac
(top-level): Don't require cl when compiling.
Glenn Morris <rgm@gnu.org>
parents:
87036
diff
changeset
|
95 Warning: the password is cached without checking that it is |
f2417ea1baac
(top-level): Don't require cl when compiling.
Glenn Morris <rgm@gnu.org>
parents:
87036
diff
changeset
|
96 correct. It is better to check the password before caching. If |
f2417ea1baac
(top-level): Don't require cl when compiling.
Glenn Morris <rgm@gnu.org>
parents:
87036
diff
changeset
|
97 you must use this function, take care to check passwords and |
f2417ea1baac
(top-level): Don't require cl when compiling.
Glenn Morris <rgm@gnu.org>
parents:
87036
diff
changeset
|
98 remove incorrect ones from the cache." |
87036 | 99 (let ((password (password-read prompt key))) |
100 (when (and password key) | |
101 (password-cache-add key password)) | |
102 password)) | |
103 | |
87037
f2417ea1baac
(top-level): Don't require cl when compiling.
Glenn Morris <rgm@gnu.org>
parents:
87036
diff
changeset
|
104 (make-obsolete 'password-read-and-add 'password-read "23.1") |
f2417ea1baac
(top-level): Don't require cl when compiling.
Glenn Morris <rgm@gnu.org>
parents:
87036
diff
changeset
|
105 |
87036 | 106 (defun password-cache-remove (key) |
107 "Remove password indexed by KEY from password cache. | |
108 This is typically run be a timer setup from `password-cache-add', | |
109 but can be invoked at any time to forcefully remove passwords | |
110 from the cache. This may be useful when it has been detected | |
111 that a password is invalid, so that `password-read' query the | |
112 user again." | |
113 (let ((password (symbol-value (intern-soft key password-data)))) | |
114 (when password | |
115 (if (fboundp 'clear-string) | |
116 (clear-string password) | |
117 (fillarray password ?_)) | |
118 (unintern key password-data)))) | |
119 | |
120 (defun password-cache-add (key password) | |
121 "Add password to cache. | |
87037
f2417ea1baac
(top-level): Don't require cl when compiling.
Glenn Morris <rgm@gnu.org>
parents:
87036
diff
changeset
|
122 The password is removed by a timer after `password-cache-expiry' seconds." |
87036 | 123 (when (and password-cache-expiry (null (intern-soft key password-data))) |
124 (run-at-time password-cache-expiry nil | |
125 #'password-cache-remove | |
126 key)) | |
127 (set (intern key password-data) password) | |
128 nil) | |
129 | |
130 (defun password-reset () | |
131 "Clear the password cache." | |
132 (interactive) | |
133 (fillarray password-data 0)) | |
134 | |
135 (provide 'password-cache) | |
136 | |
93975
1e3a407766b9
Fix up comment convention on the arch-tag lines.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87665
diff
changeset
|
137 ;; arch-tag: ab160494-16c8-4c68-a4a1-73eebf6686e5 |
87036 | 138 ;;; password-cache.el ends here |