Skip to content

Commit f6ed06b

Browse files
committed
server: Use provided secret to unlock auto-created default keyring
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.
1 parent aacc712 commit f6ed06b

2 files changed

Lines changed: 22 additions & 12 deletions

File tree

server/src/service/mod.rs

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -415,10 +415,10 @@ impl Service {
415415
.await?;
416416

417417
// Discover existing keyrings
418-
let discovered_keyrings = service.discover_keyrings(secret).await?;
418+
let discovered_keyrings = service.discover_keyrings(secret.clone()).await?;
419419

420420
service
421-
.initialize(connection, discovered_keyrings, true)
421+
.initialize(connection, discovered_keyrings, secret, true)
422422
.await?;
423423

424424
// Start PAM listener
@@ -458,7 +458,7 @@ impl Service {
458458
)
459459
.await?;
460460

461-
let default_keyring = if let Some(secret) = secret {
461+
let default_keyring = if let Some(secret) = secret.clone() {
462462
vec![(
463463
"Login".to_owned(),
464464
oo7::dbus::Service::DEFAULT_COLLECTION.to_owned(),
@@ -469,7 +469,7 @@ impl Service {
469469
};
470470

471471
service
472-
.initialize(connection, default_keyring, false)
472+
.initialize(connection, default_keyring, secret, false)
473473
.await?;
474474
Ok(service)
475475
}
@@ -686,6 +686,7 @@ impl Service {
686686
&self,
687687
connection: zbus::Connection,
688688
mut discovered_keyrings: Vec<(String, String, Keyring)>, // (name, alias, keyring)
689+
secret: Option<Secret>,
689690
auto_create_default: bool,
690691
) -> Result<(), Error> {
691692
self.connection.set(connection.clone()).unwrap();
@@ -701,19 +702,28 @@ impl Service {
701702
if !has_default && auto_create_default {
702703
tracing::info!("No default collection found, creating 'Login' keyring");
703704

704-
let locked_keyring = LockedKeyring::open(Self::LOGIN_ALIAS)
705-
.await
706-
.inspect_err(|e| {
707-
tracing::error!("Failed to create default Login keyring: {}", e);
708-
})?;
705+
let keyring = if let Some(secret) = secret {
706+
UnlockedKeyring::open(Self::LOGIN_ALIAS, secret)
707+
.await
708+
.map(Keyring::Unlocked)
709+
} else {
710+
LockedKeyring::open(Self::LOGIN_ALIAS)
711+
.await
712+
.map(Keyring::Locked)
713+
};
714+
715+
let keyring = keyring.inspect_err(|e| {
716+
tracing::error!("Failed to create default Login keyring: {}", e);
717+
})?;
709718

719+
let is_locked = if keyring.is_locked() { "locked" } else { "unlocked" };
710720
discovered_keyrings.push((
711721
"Login".to_owned(),
712722
oo7::dbus::Service::DEFAULT_COLLECTION.to_owned(),
713-
Keyring::Locked(locked_keyring),
723+
keyring,
714724
));
715725

716-
tracing::info!("Created default 'Login' collection (locked)");
726+
tracing::info!("Created default 'Login' collection ({})", is_locked);
717727
}
718728

719729
// Set up discovered collections

server/src/tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ impl TestServiceSetup {
254254
.await?;
255255

256256
let discovered = service.discover_keyrings(secret.clone()).await?;
257-
service.initialize(server_conn, discovered, false).await?;
257+
service.initialize(server_conn, discovered, secret.clone(), false).await?;
258258

259259
#[cfg(any(feature = "gnome_native_crypto", feature = "gnome_openssl_crypto"))]
260260
let mock_prompter = {

0 commit comments

Comments
 (0)