quickshell: unlock login keyring on lockscreen unlock
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
c93d908cfa
commit
bdefae41bc
1 changed files with 31 additions and 2 deletions
|
|
@ -635,6 +635,31 @@ in
|
||||||
onExited: code => { if (code === 0) lock.locked = true; }
|
onExited: code => { if (code === 0) lock.locked = true; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Chromium/Electron apps ask the Secret Service for their
|
||||||
|
// credentials as soon as they launch — spotify autostarts, so
|
||||||
|
// it hit gcr's unlock dialog every boot. The login keyring is
|
||||||
|
// still locked at that point: greetd's autologin gave
|
||||||
|
// pam_gnome_keyring no password to stash, and PamContext only
|
||||||
|
// runs pam_authenticate, never the session phase that
|
||||||
|
// auto_start unlocks from. So feed the daemon the password
|
||||||
|
// ourselves once PAM has accepted it.
|
||||||
|
//
|
||||||
|
// --unlock without --replace reaches the daemon already
|
||||||
|
// running over its control socket; --replace would kill it and
|
||||||
|
// drop the clients that connected first. No trailing newline:
|
||||||
|
// the daemon reads stdin to EOF and doesn't strip one.
|
||||||
|
Process {
|
||||||
|
id: keyringUnlock
|
||||||
|
property string secret: ""
|
||||||
|
command: [ "${pkgs.gnome-keyring}/bin/gnome-keyring-daemon", "--unlock" ]
|
||||||
|
onStarted: {
|
||||||
|
write(secret);
|
||||||
|
secret = "";
|
||||||
|
// EOF, or the daemon blocks on that read forever.
|
||||||
|
stdinEnabled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PamContext {
|
PamContext {
|
||||||
id: pam
|
id: pam
|
||||||
// NixOS ships a "login" pam service; pam_unix verifies the
|
// NixOS ships a "login" pam service; pam_unix verifies the
|
||||||
|
|
@ -644,9 +669,13 @@ in
|
||||||
if (this.responseRequired) this.respond(root.password);
|
if (this.responseRequired) this.respond(root.password);
|
||||||
}
|
}
|
||||||
onCompleted: result => {
|
onCompleted: result => {
|
||||||
|
if (result === PamResult.Success) {
|
||||||
|
keyringUnlock.secret = root.password;
|
||||||
|
keyringUnlock.stdinEnabled = true;
|
||||||
|
keyringUnlock.running = true;
|
||||||
|
lock.locked = false;
|
||||||
|
} else root.failed = true;
|
||||||
root.password = "";
|
root.password = "";
|
||||||
if (result === PamResult.Success) lock.locked = false;
|
|
||||||
else root.failed = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue