mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-12-03 08:30:09 +00:00
Extract user from host when searching for entries in auth-source-pass
* lisp/auth-source-pass.el (auth-source-pass--user): New function. (auth-source-pass--find-match): Use it. When the user is not explicitly specified and no entry is found, extract the user from the host and then search again. (Bug#29045) * test/lisp/auth-source-pass-tests.el (auth-source-pass-find-match-matching-extracting-user-from-host): Add a new test case. Copyright-paperwork-exempt: yes
This commit is contained in:
parent
5ea5b2536e
commit
e973c5f5f4
@ -139,11 +139,6 @@ CONTENTS is the contents of a password-store formatted file."
|
||||
(mapconcat #'identity (cdr pair) ":")))))
|
||||
(cdr lines)))))
|
||||
|
||||
(defun auth-source-pass--user-match-p (entry user)
|
||||
"Return true iff ENTRY match USER."
|
||||
(or (null user)
|
||||
(string= user (auth-source-pass-get "user" entry))))
|
||||
|
||||
(defun auth-source-pass--hostname (host)
|
||||
"Extract hostname from HOST."
|
||||
(let ((url (url-generic-parse-url host)))
|
||||
@ -159,6 +154,11 @@ CONTENTS is the contents of a password-store formatted file."
|
||||
(hostname hostname)
|
||||
(t host))))
|
||||
|
||||
(defun auth-source-pass--user (host)
|
||||
"Extract user from HOST and return it.
|
||||
Return nil if no match was found."
|
||||
(url-user (url-generic-parse-url host)))
|
||||
|
||||
(defun auth-source-pass--do-debug (&rest msg)
|
||||
"Call `auth-source-do-debug` with MSG and a prefix."
|
||||
(apply #'auth-source-do-debug
|
||||
@ -235,14 +235,17 @@ matching USER."
|
||||
If many matches are found, return the first one. If no match is
|
||||
found, return nil."
|
||||
(or
|
||||
(if (url-user (url-generic-parse-url host))
|
||||
(if (auth-source-pass--user host)
|
||||
;; if HOST contains a user (e.g., "user@host.com"), <HOST>
|
||||
(auth-source-pass--find-one-by-entry-name (auth-source-pass--hostname-with-user host) user)
|
||||
;; otherwise, if USER is provided, search for <USER>@<HOST>
|
||||
(when (stringp user)
|
||||
(auth-source-pass--find-one-by-entry-name (concat user "@" (auth-source-pass--hostname host)) user)))
|
||||
;; if that didn't work, search for HOST without it's user component if any
|
||||
;; if that didn't work, search for HOST without its user component, if any
|
||||
(auth-source-pass--find-one-by-entry-name (auth-source-pass--hostname host) user)
|
||||
;; if that didn't work, search for HOST with user extracted from it
|
||||
(auth-source-pass--find-one-by-entry-name
|
||||
(auth-source-pass--hostname host) (auth-source-pass--user host))
|
||||
;; if that didn't work, remove subdomain: foo.bar.com -> bar.com
|
||||
(let ((components (split-string host "\\.")))
|
||||
(when (= (length components) 3)
|
||||
|
@ -128,6 +128,11 @@ This function is intended to be set to `auth-source-debug`."
|
||||
(should (equal (auth-source-pass--find-match "foo.bar.com" nil)
|
||||
nil))))
|
||||
|
||||
(ert-deftest auth-source-pass-find-match-matching-extracting-user-from-host ()
|
||||
(auth-source-pass--with-store '(("foo.com/bar"))
|
||||
(should (equal (auth-source-pass--find-match "https://bar@foo.com" nil)
|
||||
"foo.com/bar"))))
|
||||
|
||||
(ert-deftest auth-source-pass-search-with-user-first ()
|
||||
(auth-source-pass--with-store '(("foo") ("user@foo"))
|
||||
(should (equal (auth-source-pass--find-match "foo" "user")
|
||||
|
Loading…
Reference in New Issue
Block a user