From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Stefan Monnier Newsgroups: gmane.emacs.bugs Subject: bug#26699: 26.0.50; Allow non-string keys in password-cache Date: Fri, 28 Apr 2017 12:42:40 -0400 Message-ID: NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: blaine.gmane.org 1493397795 23874 195.159.176.226 (28 Apr 2017 16:43:15 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Fri, 28 Apr 2017 16:43:15 +0000 (UTC) To: 26699@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Fri Apr 28 18:43:11 2017 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1d48z8-00065j-1C for geb-bug-gnu-emacs@m.gmane.org; Fri, 28 Apr 2017 18:43:10 +0200 Original-Received: from localhost ([::1]:37978 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d48zD-0000Hx-ST for geb-bug-gnu-emacs@m.gmane.org; Fri, 28 Apr 2017 12:43:15 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:55868) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d48z3-0000G4-Mb for bug-gnu-emacs@gnu.org; Fri, 28 Apr 2017 12:43:06 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d48z0-0000TU-JA for bug-gnu-emacs@gnu.org; Fri, 28 Apr 2017 12:43:05 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:46746) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1d48z0-0000Sv-DS for bug-gnu-emacs@gnu.org; Fri, 28 Apr 2017 12:43:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1d48z0-0003qm-7c for bug-gnu-emacs@gnu.org; Fri, 28 Apr 2017 12:43:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Stefan Monnier Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 28 Apr 2017 16:43:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 26699 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.149339777914789 (code B ref -1); Fri, 28 Apr 2017 16:43:02 +0000 Original-Received: (at submit) by debbugs.gnu.org; 28 Apr 2017 16:42:59 +0000 Original-Received: from localhost ([127.0.0.1]:44945 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1d48yx-0003qT-2S for submit@debbugs.gnu.org; Fri, 28 Apr 2017 12:42:59 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:36613) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1d48yv-0003qH-EY for submit@debbugs.gnu.org; Fri, 28 Apr 2017 12:42:58 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d48ym-0000Dp-8M for submit@debbugs.gnu.org; Fri, 28 Apr 2017 12:42:52 -0400 Original-Received: from lists.gnu.org ([2001:4830:134:3::11]:38559) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d48ym-0000Dk-4W for submit@debbugs.gnu.org; Fri, 28 Apr 2017 12:42:48 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:55811) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d48yk-0008V0-K7 for bug-gnu-emacs@gnu.org; Fri, 28 Apr 2017 12:42:47 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d48yh-0000BQ-Et for bug-gnu-emacs@gnu.org; Fri, 28 Apr 2017 12:42:46 -0400 Original-Received: from ironport2-out.teksavvy.com ([206.248.154.181]:53982) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d48yh-0000Af-86 for bug-gnu-emacs@gnu.org; Fri, 28 Apr 2017 12:42:43 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A0CNAgCcbwNZ/93gSC1ehAWFB4tZkQUBRoF0iguIfIIPHIYCBIQ5QBgBAgEBAQEBAQFrKIVyXw8EIQEcDYpWnxmSMos7iD2CZoFwAYJ+coF/gxgFkA+GLocUlRCIaTOBH4UhlCkfOIEKLiAILoRlAQtDDRCBfySFZII9AQEB X-IPAS-Result: A0CNAgCcbwNZ/93gSC1ehAWFB4tZkQUBRoF0iguIfIIPHIYCBIQ5QBgBAgEBAQEBAQFrKIVyXw8EIQEcDYpWnxmSMos7iD2CZoFwAYJ+coF/gxgFkA+GLocUlRCIaTOBH4UhlCkfOIEKLiAILoRlAQtDDRCBfySFZII9AQEB X-IronPort-AV: E=Sophos;i="5.37,388,1488862800"; d="scan'208";a="309597912" Original-Received: from 45-72-224-221.cpe.teksavvy.com (HELO ceviche.home) ([45.72.224.221]) by smtp.teksavvy.com with ESMTP/TLS/DHE-RSA-AES256-SHA; 28 Apr 2017 12:42:41 -0400 Original-Received: by ceviche.home (Postfix, from userid 20848) id D3891662CE; Fri, 28 Apr 2017 12:42:40 -0400 (EDT) X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:132081 Archived-At: Package: Emacs Version: 26.0.50 I suggest the patch below to make password-cache use a hash-table rather than an obarray and at the same occasion allow non-string keys, which simplifies auth-source's code. Any objection? Should I add a `password-map` function while I'm at it (alias to `maphash`) so as to avoid auth-source depending on those internals of password-cache? Stefan diff --git a/lisp/auth-source.el b/lisp/auth-source.el index 01d12c2614..798011e6ff 100644 --- a/lisp/auth-source.el +++ b/lisp/auth-source.el @@ -200,8 +200,6 @@ auth-source-netrc-use-gpg-tokens (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 @@ auth-source-netrc-cache (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." @@ -824,16 +822,15 @@ auth-source-forget+ 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))) + (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 7be3c6fdb6..cbc248b9ec 100644 --- a/lisp/password-cache.el +++ b/lisp/password-cache.el @@ -66,7 +66,7 @@ password-cache-expiry :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 @@ password-read-from-cache 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 @@ password-cache-remove 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)