mirror of
https://github.com/koverstreet/bcachefs-tools.git
synced 2025-02-09 00:00:04 +03:00
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>
This commit is contained in:
parent
e4271d7a3e
commit
f72ded6a4f
25
src/key.rs
25
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) {
|
||||
|
Loading…
Reference in New Issue
Block a user