GNU bug report logs - #76323
30.0.93; auth-source-pass: Annoying error when ~/.password-store doesn't exist

Previous Next

Package: emacs;

Reported by: Naofumi Yasufuku <naofumi <at> yasufuku.dev>

Date: Sun, 16 Feb 2025 05:31:02 UTC

Severity: minor

Found in version 30.0.93

Full log


View this message in rfc822 format

From: Naofumi Yasufuku <naofumi <at> yasufuku.dev>
To: "Basil L. Contovounesios" <basil <at> contovou.net>
Cc: 76323 <at> debbugs.gnu.org
Subject: bug#76323: 30.0.93; auth-source-pass: Annoying error when ~/.password-store doesn't exist
Date: Sun, 16 Feb 2025 22:57:01 +0900
[Message part 1 (text/plain, inline)]
Hi, Basil,

"Basil L. Contovounesios" <basil <at> contovou.net> writes:

> Naofumi Yasufuku [2025-02-16 14:30 +0900] wrote:
>
>> @@ -236,9 +236,10 @@ auth-source-pass--do-debug
>>  (defun auth-source-pass-entries ()
>>    "Return a list of all password store entries."
>>    (let ((store-dir (expand-file-name auth-source-pass-filename)))
>> -    (mapcar
>> -     (lambda (file) (file-name-sans-extension (file-relative-name file store-dir)))
>> -     (directory-files-recursively store-dir "\\.gpg\\'"))))
>> +    (when (file-directory-p store-dir)
>> +      (mapcar
>> +       (lambda (file) (file-name-sans-extension (file-relative-name file store-dir)))
>> +       (directory-files-recursively store-dir "\\.gpg\\'")))))
>
> Would it be any better to have the filesystem read and error check in a
> single atomic step?  For example:
>
> diff --git a/lisp/auth-source-pass.el b/lisp/auth-source-pass.el
> index b0b32ca263b..80e412e1697 100644
> --- a/lisp/auth-source-pass.el
> +++ b/lisp/auth-source-pass.el
> @@ -243,7 +243,8 @@ auth-source-pass-entries
>    (let ((store-dir (expand-file-name auth-source-pass-filename)))
>      (mapcar
>       (lambda (file) (file-name-sans-extension (file-relative-name file store-dir)))
> -     (directory-files-recursively store-dir "\\.gpg\\'"))))
> +     (ignore-error file-missing
> +       (directory-files-recursively store-dir "\\.gpg\\'")))))
>  
>  (defun auth-source-pass--find-match (hosts user port)
>    "Return password-store entry data matching HOSTS, USER and PORT.
>

Certainly.  I noticed that auth-source-pass-entries is called many times
for each search pattern, so as you mentioned, additional filesystem read
should be avoided as much as possible.

- Error-1: No ~/.password-store/

  rmdir ~/.password-store
  ./src/emacs -Q

  (setq auth-source-debug t)       ; enable debugging
  (require 'auth-source-pass)
  (add-to-list 'auth-sources 'password-store)
  (auth-source-search :host "host.example.com" :user "user")

-----------------------------------------------
diff --git a/lisp/auth-source-pass.el b/lisp/auth-source-pass.el
index 33786a14a87..64774739f09 100644
--- a/lisp/auth-source-pass.el
+++ b/lisp/auth-source-pass.el
@@ -241,7 +241,8 @@ auth-source-pass-entries
   (let ((store-dir (expand-file-name auth-source-pass-filename)))
     (mapcar
      (lambda (file) (file-name-sans-extension (file-relative-name file store-dir)))
-     (directory-files-recursively store-dir "\\.gpg\\'"))))
+     (with-demoted-errors "auth-source-pass: %S"
+       (directory-files-recursively store-dir "\\.gpg\\'")))))
 
 (defun auth-source-pass--find-match (hosts user port)
   "Return password-store entry data matching HOSTS, USER and PORT.
-----------------------------------------------

*Messages*
-----------------------------------------------
auth-source-pass: (file-missing "Opening directory" "No such file or directory" "/Users/naofumi/.password-store")
auth-source-pass: searching for entries matching hostname="host.example.com", user="user", port="443"
auth-source-pass: corresponding suffixes to search for: ("user <at> host.example.com:443" "host.example.com:443/user" "user <at> host.example.com" "host.example.com/user" "host.example.com:443" "host.example.com" "user <at> example.com:443" "example.com:443/user" "user <at> example.com" "example.com/user" "example.com:443" "example.com" "user <at> com:443" "com:443/user" "user <at> com" "com/user" "com:443" "com")
auth-source-pass: (file-missing "Opening directory" "No such file or directory" "/Users/naofumi/.password-store")
auth-source-pass: found no entries matching "user <at> host.example.com:443"
auth-source-pass: (file-missing "Opening directory" "No such file or directory" "/Users/naofumi/.password-store")
auth-source-pass: found no entries matching "host.example.com:443/user"
auth-source-pass: (file-missing "Opening directory" "No such file or directory" "/Users/naofumi/.password-store")
auth-source-pass: found no entries matching "user <at> host.example.com"
auth-source-pass: (file-missing "Opening directory" "No such file or directory" "/Users/naofumi/.password-store")
auth-source-pass: found no entries matching "host.example.com/user"
auth-source-pass: (file-missing "Opening directory" "No such file or directory" "/Users/naofumi/.password-store")
auth-source-pass: found no entries matching "host.example.com:443"
auth-source-pass: (file-missing "Opening directory" "No such file or directory" "/Users/naofumi/.password-store")
auth-source-pass: found no entries matching "host.example.com"
auth-source-pass: (file-missing "Opening directory" "No such file or directory" "/Users/naofumi/.password-store")
auth-source-pass: found no entries matching "user <at> example.com:443"
auth-source-pass: (file-missing "Opening directory" "No such file or directory" "/Users/naofumi/.password-store")
auth-source-pass: found no entries matching "example.com:443/user"
auth-source-pass: (file-missing "Opening directory" "No such file or directory" "/Users/naofumi/.password-store")
auth-source-pass: found no entries matching "user <at> example.com"
auth-source-pass: (file-missing "Opening directory" "No such file or directory" "/Users/naofumi/.password-store")
auth-source-pass: found no entries matching "example.com/user"
auth-source-pass: (file-missing "Opening directory" "No such file or directory" "/Users/naofumi/.password-store")
auth-source-pass: found no entries matching "example.com:443"
auth-source-pass: (file-missing "Opening directory" "No such file or directory" "/Users/naofumi/.password-store")
auth-source-pass: found no entries matching "example.com"
auth-source-pass: (file-missing "Opening directory" "No such file or directory" "/Users/naofumi/.password-store")
auth-source-pass: found no entries matching "user <at> com:443"
auth-source-pass: (file-missing "Opening directory" "No such file or directory" "/Users/naofumi/.password-store")
auth-source-pass: found no entries matching "com:443/user"
auth-source-pass: (file-missing "Opening directory" "No such file or directory" "/Users/naofumi/.password-store")
auth-source-pass: found no entries matching "user <at> com"
auth-source-pass: (file-missing "Opening directory" "No such file or directory" "/Users/naofumi/.password-store")
auth-source-pass: found no entries matching "com/user"
auth-source-pass: (file-missing "Opening directory" "No such file or directory" "/Users/naofumi/.password-store")
auth-source-pass: found no entries matching "com:443"
auth-source-pass: (file-missing "Opening directory" "No such file or directory" "/Users/naofumi/.password-store")
auth-source-pass: found no entries matching "com"
auth-source-search: found 0 results (max 1) matching (:host "host.example.com" :user "user")
-----------------------------------------------


I think it would be better to have just one additional dir check on
auth-source-pass-search instead of auth-source-pass-entries.
auth-source-pass backend just does nothing if password-store dir is not
available.  Could it be relatively reasonable cost?

-----------------------------------------------
diff --git a/lisp/auth-source-pass.el b/lisp/auth-source-pass.el
index 80ddb38fa88..33786a14a87 100644
--- a/lisp/auth-source-pass.el
+++ b/lisp/auth-source-pass.el
@@ -85,6 +85,9 @@ auth-source-pass-search
         ((null host)
          ;; Do not build a result, as none will match when HOST is nil
          nil)
+        ((not (file-directory-p (expand-file-name auth-source-pass-filename)))
+         ;; Do nothing if the password-store folder doesn't exist.
+         nil)
         (auth-source-pass-extra-query-keywords
          (auth-source-pass--build-result-many host port user require max))
         (t
-----------------------------------------------

*Messages*
-----------------------------------------------
auth-source-search: found 0 results (max 1) matching (:host "host.example.com" :user "user")
-----------------------------------------------

New patch file is also attached.

Best regards,
  Naofumi

[0001-auth-source-pass-Don-t-raise-errors-if-.password-sto.patch (text/x-patch, attachment)]

This bug report was last modified 96 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.