diff options
author | Thomas Mühlbacher <tmuehlbacher@posteo.net> | 2024-06-15 23:48:31 +0200 |
---|---|---|
committer | Thomas Mühlbacher <tmuehlbacher@posteo.net> | 2024-06-18 20:56:17 +0200 |
commit | f72ded6a4f80117b794236018ba301ae30e2d93d (patch) | |
tree | 677ec04625051cde8b445a899756a0850c99bccf /src/key.rs | |
parent | e4271d7a3e5c0197b2a71eb001b93c3d7601847f (diff) |
fix(key): search for key in all relevant keyrings
Previously, using `bcachefs unlock -k session` would still cause mount
to ask for a passphrase.
Signed-off-by: Thomas Mühlbacher <tmuehlbacher@posteo.net>
Diffstat (limited to 'src/key.rs')
-rw-r--r-- | src/key.rs | 25 |
1 files changed, 16 insertions, 9 deletions
@@ -110,25 +110,32 @@ impl KeyHandle { } } - pub fn new_from_search(uuid: &Uuid) -> Result<Self> { - let key_name = Self::format_key_name(uuid); - let key_name = CStr::as_ptr(&key_name); + fn search_keyring(keyring: i32, key_name: &CStr) -> Result<i64> { + let key_name = CStr::as_ptr(key_name); let key_type = c_str!("user"); - let key_id = - unsafe { keyctl_search(keyutils::KEY_SPEC_USER_KEYRING, key_type, key_name, 0) }; + let key_id = unsafe { keyctl_search(keyring, key_type, key_name, 0) }; if key_id > 0 { info!("Found key in keyring"); - Ok(Self { - _uuid: *uuid, - _id: key_id, - }) + Ok(key_id) } else { Err(ErrnoError(errno::errno()).into()) } } + pub fn new_from_search(uuid: &Uuid) -> Result<Self> { + let key_name = Self::format_key_name(uuid); + + Self::search_keyring(keyutils::KEY_SPEC_SESSION_KEYRING, &key_name) + .or_else(|_| Self::search_keyring(keyutils::KEY_SPEC_USER_KEYRING, &key_name)) + .or_else(|_| Self::search_keyring(keyutils::KEY_SPEC_USER_SESSION_KEYRING, &key_name)) + .map(|id| Self { + _uuid: *uuid, + _id: id, + }) + } + fn wait_for_unlock(uuid: &Uuid) -> Result<Self> { loop { match Self::new_from_search(uuid) { |