Skip to content

Commit cf7b9a9

Browse files
authored
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.
1 parent aacc712 commit cf7b9a9

2 files changed

Lines changed: 28 additions & 12 deletions

File tree

server/src/service/mod.rs

Lines changed: 25 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,32 @@ 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() {
720+
"locked"
721+
} else {
722+
"unlocked"
723+
};
710724
discovered_keyrings.push((
711725
"Login".to_owned(),
712726
oo7::dbus::Service::DEFAULT_COLLECTION.to_owned(),
713-
Keyring::Locked(locked_keyring),
727+
keyring,
714728
));
715729

716-
tracing::info!("Created default 'Login' collection (locked)");
730+
tracing::info!("Created default 'Login' collection ({})", is_locked);
717731
}
718732

719733
// Set up discovered collections

server/src/tests.rs

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

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

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

0 commit comments

Comments
 (0)