summaryrefslogtreecommitdiff
path: root/src/key.rs
diff options
context:
space:
mode:
authorThomas Mühlbacher <tmuehlbacher@posteo.net>2024-06-15 23:48:31 +0200
committerThomas Mühlbacher <tmuehlbacher@posteo.net>2024-06-18 20:56:17 +0200
commitf72ded6a4f80117b794236018ba301ae30e2d93d (patch)
tree677ec04625051cde8b445a899756a0850c99bccf /src/key.rs
parente4271d7a3e5c0197b2a71eb001b93c3d7601847f (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.rs25
1 files changed, 16 insertions, 9 deletions
diff --git a/src/key.rs b/src/key.rs
index 44f2ad67..96eb491d 100644
--- a/src/key.rs
+++ b/src/key.rs
@@ -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) {