oo7-daemon: cherry-pick PR #443 to use credential on first run
oo7-server 0.6.0 only feeds the systemd / PAM secret to existing keyrings discovered on disk. On first run no keyring exists yet, the daemon creates an empty 'Login' collection via LockedKeyring::open, the credential is silently ignored, and any client Unlock() routes to a prompt that nothing on a niri desktop can satisfy. Patches/oo7-server/0001-... is upstream commit cf7b9a9 (PR #443) regenerated relative to the package's sourceRoot ('server/'). It switches the auto-created default-keyring path to UnlockedKeyring::open when a secret is available. The override threads the patch through pkgs.oo7-server.overrideAttrs in modules/desktop-oo7-daemon.nix and uses the patched derivation for both services.dbus.packages and systemd.packages so the user unit and D-Bus activation file land from the same store path. Cargo.lock is untouched, so the existing cargoDeps hash stays valid. Drop the override once nixpkgs ships an oo7-server release that includes the fix (anything past 0.6.0).
This commit is contained in:
@@ -22,11 +22,25 @@
|
|||||||
# fresh `systemd-run --user` scope).
|
# fresh `systemd-run --user` scope).
|
||||||
|
|
||||||
{ pkgs, ... }:
|
{ pkgs, ... }:
|
||||||
|
let
|
||||||
|
# 0.6.0 stops at LockedKeyring::open(login) when no keyring file exists,
|
||||||
|
# so on first run the auto-created default collection is locked and a
|
||||||
|
# client's Unlock() call routes to a prompt that never resolves (no
|
||||||
|
# gnome-shell / kwallet / gcr-prompter on a niri desktop). Cherry-pick
|
||||||
|
# upstream cf7b9a9 (PR #443) which uses the systemd credential / PAM
|
||||||
|
# secret to unlock the new keyring directly. Drop the override when
|
||||||
|
# nixpkgs ships an oo7-server release that includes the fix.
|
||||||
|
oo7-server = pkgs.oo7-server.overrideAttrs (old: {
|
||||||
|
patches = (old.patches or [ ]) ++ [
|
||||||
|
../patches/oo7-server/0001-server-Use-provided-secret-to-unlock-auto-created-de.patch
|
||||||
|
];
|
||||||
|
});
|
||||||
|
in
|
||||||
{
|
{
|
||||||
environment.systemPackages = [ pkgs.oo7-server ];
|
environment.systemPackages = [ oo7-server ];
|
||||||
|
|
||||||
services.dbus.packages = [ pkgs.oo7-server ];
|
services.dbus.packages = [ oo7-server ];
|
||||||
systemd.packages = [ pkgs.oo7-server ];
|
systemd.packages = [ oo7-server ];
|
||||||
|
|
||||||
systemd.user.services.oo7-daemon = {
|
systemd.user.services.oo7-daemon = {
|
||||||
wantedBy = [ "default.target" ];
|
wantedBy = [ "default.target" ];
|
||||||
|
|||||||
@@ -0,0 +1,115 @@
|
|||||||
|
From cf7b9a9fc53023cbaca5a128ece32d76cafe95d5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Oscar Cowdery Lack <oscar.cowderylack@gmail.com>
|
||||||
|
Date: Mon, 30 Mar 2026 00:05:49 +1100
|
||||||
|
Subject: [PATCH] server: Use provided secret to unlock auto-created default
|
||||||
|
keyring (#443)
|
||||||
|
|
||||||
|
If a secret is provided by PAM or systemd credentials, then it should be
|
||||||
|
used to unlock the default keyring when creating it for the first time,
|
||||||
|
not just when discovering existing keyrings.
|
||||||
|
---
|
||||||
|
src/service/mod.rs | 36 +++++++++++++++++++++++++-----------
|
||||||
|
src/tests.rs | 4 +++-
|
||||||
|
2 files changed, 28 insertions(+), 12 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/service/mod.rs b/src/service/mod.rs
|
||||||
|
index bfbe16d..44e55c2 100644
|
||||||
|
--- a/src/service/mod.rs
|
||||||
|
+++ b/src/service/mod.rs
|
||||||
|
@@ -415,10 +415,10 @@ impl Service {
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
// Discover existing keyrings
|
||||||
|
- let discovered_keyrings = service.discover_keyrings(secret).await?;
|
||||||
|
+ let discovered_keyrings = service.discover_keyrings(secret.clone()).await?;
|
||||||
|
|
||||||
|
service
|
||||||
|
- .initialize(connection, discovered_keyrings, true)
|
||||||
|
+ .initialize(connection, discovered_keyrings, secret, true)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
// Start PAM listener
|
||||||
|
@@ -458,7 +458,7 @@ impl Service {
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
- let default_keyring = if let Some(secret) = secret {
|
||||||
|
+ let default_keyring = if let Some(secret) = secret.clone() {
|
||||||
|
vec![(
|
||||||
|
"Login".to_owned(),
|
||||||
|
oo7::dbus::Service::DEFAULT_COLLECTION.to_owned(),
|
||||||
|
@@ -469,7 +469,7 @@ impl Service {
|
||||||
|
};
|
||||||
|
|
||||||
|
service
|
||||||
|
- .initialize(connection, default_keyring, false)
|
||||||
|
+ .initialize(connection, default_keyring, secret, false)
|
||||||
|
.await?;
|
||||||
|
Ok(service)
|
||||||
|
}
|
||||||
|
@@ -686,6 +686,7 @@ impl Service {
|
||||||
|
&self,
|
||||||
|
connection: zbus::Connection,
|
||||||
|
mut discovered_keyrings: Vec<(String, String, Keyring)>, // (name, alias, keyring)
|
||||||
|
+ secret: Option<Secret>,
|
||||||
|
auto_create_default: bool,
|
||||||
|
) -> Result<(), Error> {
|
||||||
|
self.connection.set(connection.clone()).unwrap();
|
||||||
|
@@ -701,19 +702,32 @@ impl Service {
|
||||||
|
if !has_default && auto_create_default {
|
||||||
|
tracing::info!("No default collection found, creating 'Login' keyring");
|
||||||
|
|
||||||
|
- let locked_keyring = LockedKeyring::open(Self::LOGIN_ALIAS)
|
||||||
|
- .await
|
||||||
|
- .inspect_err(|e| {
|
||||||
|
- tracing::error!("Failed to create default Login keyring: {}", e);
|
||||||
|
- })?;
|
||||||
|
+ let keyring = if let Some(secret) = secret {
|
||||||
|
+ UnlockedKeyring::open(Self::LOGIN_ALIAS, secret)
|
||||||
|
+ .await
|
||||||
|
+ .map(Keyring::Unlocked)
|
||||||
|
+ } else {
|
||||||
|
+ LockedKeyring::open(Self::LOGIN_ALIAS)
|
||||||
|
+ .await
|
||||||
|
+ .map(Keyring::Locked)
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ let keyring = keyring.inspect_err(|e| {
|
||||||
|
+ tracing::error!("Failed to create default Login keyring: {}", e);
|
||||||
|
+ })?;
|
||||||
|
|
||||||
|
+ let is_locked = if keyring.is_locked() {
|
||||||
|
+ "locked"
|
||||||
|
+ } else {
|
||||||
|
+ "unlocked"
|
||||||
|
+ };
|
||||||
|
discovered_keyrings.push((
|
||||||
|
"Login".to_owned(),
|
||||||
|
oo7::dbus::Service::DEFAULT_COLLECTION.to_owned(),
|
||||||
|
- Keyring::Locked(locked_keyring),
|
||||||
|
+ keyring,
|
||||||
|
));
|
||||||
|
|
||||||
|
- tracing::info!("Created default 'Login' collection (locked)");
|
||||||
|
+ tracing::info!("Created default 'Login' collection ({})", is_locked);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set up discovered collections
|
||||||
|
diff --git a/src/tests.rs b/src/tests.rs
|
||||||
|
index 16aa0bb..07fb27c 100644
|
||||||
|
--- a/src/tests.rs
|
||||||
|
+++ b/src/tests.rs
|
||||||
|
@@ -254,7 +254,9 @@ impl TestServiceSetup {
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
let discovered = service.discover_keyrings(secret.clone()).await?;
|
||||||
|
- service.initialize(server_conn, discovered, false).await?;
|
||||||
|
+ service
|
||||||
|
+ .initialize(server_conn, discovered, secret.clone(), false)
|
||||||
|
+ .await?;
|
||||||
|
|
||||||
|
#[cfg(any(feature = "gnome_native_crypto", feature = "gnome_openssl_crypto"))]
|
||||||
|
let mock_prompter = {
|
||||||
|
--
|
||||||
|
2.53.0
|
||||||
|
|
||||||
Reference in New Issue
Block a user