summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2017-07-28 12:27:00 -0400
committerStefan Monnier <monnier@iro.umontreal.ca>2017-07-28 12:27:00 -0400
commitd66dcde46a87ee8a9064db3d9b05da9b17036f5b (patch)
tree88a3069bbd7197989ca0ff36b154cc3c360f317a
parentbfb8d33fd18b1d9fd5868204d472cb19f5bcafbe (diff)
downloademacs-d66dcde46a87ee8a9064db3d9b05da9b17036f5b.tar.gz
* lisp/password-cache.el (password-data): Use a hash-table
* lisp/auth-source.el (auth-source-magic): Remove. (auth-source-forget+, auth-source-forget-all-cached): Adjust to new format of password-data. (auth-source-format-cache-entry): Just use a cons. (password-cache-remove, password-cache-add, password-reset) (password-read-from-cache, password-in-cache-p): Adjust accordingly. Fixes: bug#26699
-rw-r--r--etc/NEWS3
-rw-r--r--lisp/auth-source.el36
-rw-r--r--lisp/password-cache.el30
-rw-r--r--test/lisp/auth-source-tests.el2
4 files changed, 34 insertions, 37 deletions
diff --git a/etc/NEWS b/etc/NEWS
index ef4c125ab16..a785c6a86b2 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1084,6 +1084,9 @@ fontification, and commenting for embedded JavaScript and CSS.
* Incompatible Lisp Changes in Emacs 26.1
+*** password-data is now a hash-table
+so that `password-read' can use any object for the `key' argument.
+
+++
*** Command 'dired-mark-extension' now automatically prepends a '.' to the
extension when not present. The new command 'dired-mark-suffix' behaves
diff --git a/lisp/auth-source.el b/lisp/auth-source.el
index d1747bda3da..d4b44a59529 100644
--- a/lisp/auth-source.el
+++ b/lisp/auth-source.el
@@ -200,8 +200,6 @@ Note that if EPA/EPG is not available, this should NOT be used."
(const :tag "Save GPG-encrypted password tokens" gpg)
(const :tag "Don't encrypt tokens" never))))))
-(defvar auth-source-magic "auth-source-magic ")
-
(defcustom auth-source-do-cache t
"Whether auth-source should cache information with `password-cache'."
:group 'auth-source
@@ -782,16 +780,16 @@ Returns the deleted entries."
(defun auth-source-forget-all-cached ()
"Forget all cached auth-source data."
(interactive)
- (cl-do-symbols (sym password-data)
- ;; when the symbol name starts with auth-source-magic
- (when (string-match (concat "^" auth-source-magic) (symbol-name sym))
- ;; remove that key
- (password-cache-remove (symbol-name sym))))
+ (maphash (lambda (key _password)
+ (when (eq 'auth-source (car-safe key))
+ ;; remove that key
+ (password-cache-remove key)))
+ password-data)
(setq auth-source-netrc-cache nil))
(defun auth-source-format-cache-entry (spec)
"Format SPEC entry to put it in the password cache."
- (concat auth-source-magic (format "%S" spec)))
+ `(auth-source . ,spec))
(defun auth-source-remember (spec found)
"Remember FOUND search results for SPEC."
@@ -822,18 +820,16 @@ This is not a full `auth-source-search' spec but works similarly.
For instance, \(:host \"myhost\" \"yourhost\") would find all the
cached data that was found with a search for those two hosts,
while \(:host t) would find all host entries."
- (let ((count 0)
- sname)
- (cl-do-symbols (sym password-data)
- ;; when the symbol name matches with auth-source-magic
- (when (and (setq sname (symbol-name sym))
- (string-match (concat "^" auth-source-magic "\\(.+\\)")
- sname)
- ;; and the spec matches what was stored in the cache
- (auth-source-specmatchp spec (read (match-string 1 sname))))
- ;; remove that key
- (password-cache-remove sname)
- (cl-incf count)))
+ (let ((count 0))
+ (maphash
+ (lambda (key _password)
+ (when (and (eq 'auth-source (car-safe key))
+ ;; and the spec matches what was stored in the cache
+ (auth-source-specmatchp spec (cdr key)))
+ ;; remove that key
+ (password-cache-remove key)
+ (cl-incf count)))
+ password-data)
count))
(defun auth-source-specmatchp (spec stored)
diff --git a/lisp/password-cache.el b/lisp/password-cache.el
index 7be3c6fdb6f..cbc248b9ecf 100644
--- a/lisp/password-cache.el
+++ b/lisp/password-cache.el
@@ -66,7 +66,7 @@ Whether passwords are cached at all is controlled by `password-cache'."
:type '(choice (const :tag "Never" nil)
(integer :tag "Seconds")))
-(defvar password-data (make-vector 7 0))
+(defvar password-data (make-hash-table :test #'equal))
(defun password-read-from-cache (key)
"Obtain passphrase for KEY from time-limited passphrase cache.
@@ -74,20 +74,20 @@ Custom variables `password-cache' and `password-cache-expiry'
regulate cache behavior."
(and password-cache
key
- (symbol-value (intern-soft key password-data))))
+ (gethash key password-data)))
;;;###autoload
(defun password-in-cache-p (key)
"Check if KEY is in the cache."
(and password-cache
key
- (intern-soft key password-data)))
+ (gethash key password-data)))
(defun password-read (prompt &optional key)
"Read password, for use with KEY, from user, or from cache if wanted.
KEY indicate the purpose of the password, so the cache can
-separate passwords. The cache is not used if KEY is nil. It is
-typically a string.
+separate passwords. The cache is not used if KEY is nil.
+KEY is typically a string but can be anything (compared via `equal').
The variable `password-cache' control whether the cache is used."
(or (password-read-from-cache key)
(read-passwd prompt)))
@@ -115,29 +115,27 @@ but can be invoked at any time to forcefully remove passwords
from the cache. This may be useful when it has been detected
that a password is invalid, so that `password-read' query the
user again."
- (let ((sym (intern-soft key password-data)))
- (when sym
- (let ((password (symbol-value sym)))
- (when (stringp password)
- (if (fboundp 'clear-string)
- (clear-string password)
- (fillarray password ?_)))
- (unintern key password-data)))))
+ (let ((password (gethash key password-data)))
+ (when (stringp password)
+ (if (fboundp 'clear-string)
+ (clear-string password)
+ (fillarray password ?_)))
+ (remhash key password-data)))
(defun password-cache-add (key password)
"Add password to cache.
The password is removed by a timer after `password-cache-expiry' seconds."
- (when (and password-cache-expiry (null (intern-soft key password-data)))
+ (when (and password-cache-expiry (null (gethash key password-data)))
(run-at-time password-cache-expiry nil
#'password-cache-remove
key))
- (set (intern key password-data) password)
+ (puthash key password password-data)
nil)
(defun password-reset ()
"Clear the password cache."
(interactive)
- (fillarray password-data 0))
+ (clrhash password-data))
(provide 'password-cache)
diff --git a/test/lisp/auth-source-tests.el b/test/lisp/auth-source-tests.el
index 2634777c7db..9753029f198 100644
--- a/test/lisp/auth-source-tests.el
+++ b/test/lisp/auth-source-tests.el
@@ -215,7 +215,7 @@
(ert-deftest auth-source-test-remembrances-of-things-past ()
(let ((password-cache t)
- (password-data (make-vector 7 0)))
+ (password-data (copy-hash-table password-data)))
(auth-source-remember '(:host "wedd") '(4 5 6))
(should (auth-source-remembered-p '(:host "wedd")))
(should-not (auth-source-remembered-p '(:host "xedd")))