OK, I think I figured out what's going on. The closure used in `auth-source-secrets-create` relies on lexical binding, which is present in `auth-source.el` because of the `lexical-binding: t` at the top of the file. It isn't present in my init file, which is where I had copied the new version of `auth-source-secrets-create`. So, yes, it was user error and had to do with how I patched things. I think everything works now, thanks again for humoring me!
Ethan On Fri, Jun 21, 2024 at 10:10 AM Michael Albinus <michael.albi...@gmx.de> wrote: > Ethan Glasser-Camp <ethan.glasser.c...@gmail.com> writes: > > > Hi Michael, > > Hi Ethan, > > > this patch makes more sense to me, thanks! I guess this > > means that the entries with `root@black-diamond` are sort of > > deprecated and I should be trying to move to `ethan@black-diamond` > > entries instead. > > You could keep them or you could remove them. They should simply be > ignored, because "root@..." does not match your use case. > > > I was able to use this patch successfully once, with a moved-aside . > > emacs.d. I was asked for a password for `ethan@black-diamond` , then I > > was asked for a label, and then I was asked whether I wanted to save > > it to my keyring. > > And then? Was it added to your "Login" keyring? > > > However, at first, with my normal .emacs.d and without the > > `ethan@black-diamond` entry being present, I was asked for a password > > for `ethan@black-diamond`, and then I was asked for a label, and then > > I was asked again for a password. It didn't seem to create an entry in > > my "Login" keyring. > > Are you sure you gave the proper password? This scenario looks rather > like there was a wrong password, and auth-source has asked, again. But > in this case it doesn't save the password, IIRC. > > > I got kinda sucked in to trying to debug this (even removing the > > `ethan@black-diamond` entry even though it did get created > > successfully once). I deleted the `ethan@black-diamond` entry from my > > keyring, and then tried again with the moved-aside .emacs.d, but.. I > > couldn't get it to work properly again! > > > > It looks like tramp is trying to get the secret from auth-source, then > > hitting an error condition, and then falling back to the > > `password-read` function. > > Yes. This is the fallback. > > > By adding a bunch of debugging output, and removing the > > `ignore-errors` call in `tramp-read-passwd`, I was able to retrieve > > the error message `Symbol’s value as variable is void: data`. As best > > as I can tell, it seems to be the closure around the secret in > > `auth-source-secrets-create`: > > > > ``` > > (when data > > (setq artificial (plist-put artificial > > (auth-source--symbol-keyword r) > > (if (eq r 'secret) > > (let ((data data)) > > (lambda () data)) > > data)))) > > ``` > > > > I'm not really clear why this wouldn't work. Maybe it's user error? > > I'm not sure if I'm supposed to byte-compile the function or > > something. > > I cannot reproduce this. However, I don't know how you did patch and > recompile auth-source.el. Perhaps we should agree to test with the same > codebase, see below. > > > (My current debugging setup is to `rm -rf .emacs.d', then `emacs`, > > then open up a file called `tmp.el` that starts with: > > > > ``` > > (require 'secrets) > > (require 'tramp) > > (require 'auth-source) > > > > (setq auth-sources '("secrets:Login")) > > (setq auth-source-debug t > > auth-source-save-behavior 'ask > > tramp-verbose 7 > > secrets-debug t) > > ``` > > This still keeps the contents of your .emacs active, which I don't > know. What I do is > > - Move .emacs to .emacs.sv > > - Create a new .emacs with the same contents as you have, plus (at the end) > > (auth-source-forget-all-cached) > > - Start 'emacs /sudo::' > > 1st run: secrets:Login does not contain root@gandalf or > albinus@gandalf. I'm asked for the label and whether to create the > entry. The directory is opened, and the entry albinus@gandalf is > contained in the "login" keyring. *Messages* contains > > --8<---------------cut here---------------start------------->8--- > Tramp: Opening connection nil for root@gandalf using sudo... > auth-source-search: found 0 results (max 1) matching (:max 1 :user > "albinus" :host "gandalf" :port "sudo" :require (:secret :user) :create t) > auth-source-search: found 0 results (max 1) matching (:max 1 :host > "gandalf" :user "albinus" :port "sudo") > auth-source-search: CREATED 1 results (max 1) matching (:max 1 :user > "albinus" :host "gandalf" :port "sudo" :require (:secret :user) :create t) > Save auth info to secrets collection Login? [y/n/N/?] y > secrets-create-item: wrote 1 new item to Login > Saved new authentication information to Login > Tramp: Opening connection nil for root@gandalf using sudo...done > --8<---------------cut here---------------end--------------->8--- > > Fine. Close Emacs. > > 2nd run: secrets:Login contains albinus@gandalf. The directory opens w/o > asking for a password. *Messages* contains > > --8<---------------cut here---------------start------------->8--- > Tramp: Opening connection nil for root@gandalf using sudo... > auth-source-search: found 1 results (max 1) matching (:max 1 :user > "albinus" :host "gandalf" :port "sudo" :require (:secret :user) :create t) > Tramp: Opening connection nil for root@gandalf using sudo...done > --8<---------------cut here---------------end--------------->8--- > > Everything as it should. > > 3rd run: Delete "albinus@gandalf" in keyring "Login", and add (manually) > "root@password". The same dialogue about creation like in 1st run, and > *Messages* contains > > --8<---------------cut here---------------start------------->8--- > Tramp: Opening connection nil for root@gandalf using sudo... > auth-source-search: found 0 results (max 1) matching (:max 1 :user > "albinus" :host "gandalf" :port "sudo" :require (:secret :user) :create t) > auth-source-search: found 0 results (max 1) matching (:max 1 :host > "gandalf" :user "albinus" :port "sudo") > auth-source-search: CREATED 1 results (max 1) matching (:max 1 :user > "albinus" :host "gandalf" :port "sudo" :require (:secret :user) :create t) > Save auth info to secrets collection Login? [y/n/N/?] y > secrets-create-item: wrote 1 new item to Login > Saved new authentication information to Login > Tramp: Opening connection nil for root@gandalf using sudo...done > --8<---------------cut here---------------end--------------->8--- > > Everything as expected. The "Login" keyring contains both > "albinus@gandalf" and "root@gandalf". > > 4th run: Keep both entries in the "Login" keyring. Exactly the same > behavior as in the 2nd run (no question about the password, the > directory opens). *Messages* contains > > --8<---------------cut here---------------start------------->8--- > Tramp: Opening connection nil for root@gandalf using sudo... > auth-source-search: found 1 results (max 1) matching (:max 1 :user > "albinus" :host "gandalf" :port "sudo" :require (:secret :user) :create t) > Tramp: Opening connection nil for root@gandalf using sudo...done > --8<---------------cut here---------------end--------------->8--- > > So all 4 scenarios behave like expected. > > > ... and then continues with versions of functions like > > `auth-source-secrets-create`, `auth-source-search`, > > `auth-source-secrets-search`, `auth-source-secrets-saver`, > > `tramp-read-passwd`, some of which I have hacked up to add debugging > > output. I M-x eval-buffer this file and then C-x C-f /sudo:: RET.) > > > > By the way, since I started this thread, I updated NixOS and now I'm > > using emacs 29.3, although I don't think that much has changed in this > > version. > > Well, perhaps you shouldn't patch Tramp or auth-source.el in your Emacs > 29.3 directory. Please download auth-source.el from the Emacs git > (branch emacs-29), replace it in your lisp/ directory, and byte-compile > this new file. Then you have almost the same versions I have used for > testing. No other patch is needed. > > The recent file is located at < > https://git.savannah.gnu.org/cgit/emacs.git/plain/lisp/auth-source.el?h=emacs-29 > >. > > > Ethan > > Best regards, Michael. >