impl linux credential storage

Signed-off-by: kernelkind <kernelkind@gmail.com>
This commit is contained in:
kernelkind
2024-06-26 16:01:19 -04:00
parent 26c4d90be3
commit 2a47a66bbb
8 changed files with 314 additions and 30 deletions

View File

@@ -5,7 +5,7 @@ use enostr::{Keypair, Pubkey, SecretKey};
use security_framework::item::{ItemClass, ItemSearchOptions, Limit, SearchResult};
use security_framework::passwords::{delete_generic_password, set_generic_password};
use crate::key_storage::KeyStorageError;
use crate::key_storage::{KeyStorage, KeyStorageError, KeyStorageResponse};
pub struct MacOSKeyStorage<'a> {
pub service_name: &'a str,
@@ -16,7 +16,7 @@ impl<'a> MacOSKeyStorage<'a> {
MacOSKeyStorage { service_name }
}
pub fn add_key(&self, key: &Keypair) -> Result<(), KeyStorageError> {
fn add_key(&self, key: &Keypair) -> Result<(), KeyStorageError> {
match set_generic_password(
self.service_name,
key.pubkey.hex().as_str(),
@@ -52,7 +52,7 @@ impl<'a> MacOSKeyStorage<'a> {
accounts
}
pub fn get_pubkeys(&self) -> Vec<Pubkey> {
fn get_pubkeys(&self) -> Vec<Pubkey> {
self.get_pubkey_strings()
.iter_mut()
.filter_map(|pubkey_str| Pubkey::from_hex(pubkey_str.as_str()).ok())
@@ -84,7 +84,7 @@ impl<'a> MacOSKeyStorage<'a> {
}
}
pub fn get_all_keypairs(&self) -> Vec<Keypair> {
fn get_all_keypairs(&self) -> Vec<Keypair> {
self.get_pubkeys()
.iter()
.map(|pubkey| {
@@ -94,7 +94,7 @@ impl<'a> MacOSKeyStorage<'a> {
.collect()
}
pub fn delete_key(&self, pubkey: &Pubkey) -> Result<(), KeyStorageError> {
fn delete_key(&self, pubkey: &Pubkey) -> Result<(), KeyStorageError> {
match delete_generic_password(self.service_name, pubkey.hex().as_str()) {
Ok(_) => Ok(()),
Err(e) => {
@@ -105,6 +105,20 @@ impl<'a> MacOSKeyStorage<'a> {
}
}
impl<'a> KeyStorage for MacOSKeyStorage<'a> {
fn add_key(&self, key: &Keypair) -> KeyStorageResponse<()> {
KeyStorageResponse::ReceivedResult(self.add_key(key))
}
fn get_keys(&self) -> KeyStorageResponse<Vec<Keypair>> {
KeyStorageResponse::ReceivedResult(Ok(self.get_all_keypairs()))
}
fn remove_key(&self, key: &Keypair) -> KeyStorageResponse<()> {
KeyStorageResponse::ReceivedResult(self.delete_key(&key.pubkey))
}
}
#[cfg(test)]
mod tests {
use super::*;