coven_crypto/custody/
store_custody.rs1use super::{KeyError, KeySession, StoreKeychain};
4use crate::{CryptoError, MemberIdentity, StoreKeyring};
5use coven_foundation::id_source::MemberId;
6use std::sync::Arc;
7
8#[derive(Debug, thiserror::Error)]
10pub enum IdentityError {
11 #[error("member identity already initialized")]
13 AlreadyInitialized,
14 #[error(transparent)]
16 Crypto(#[from] CryptoError),
17 #[error(transparent)]
19 Custody(KeyError),
20 #[error(transparent)]
23 Bug(#[from] coven_foundation::task::Bug),
24}
25
26impl From<KeyError> for IdentityError {
27 fn from(error: KeyError) -> Self {
28 match error {
29 KeyError::Bug(bug) => Self::Bug(bug),
30 error => Self::Custody(error),
31 }
32 }
33}
34
35impl coven_foundation::task::CarriesBug for IdentityError {
36 fn bug(&self) -> Option<&coven_foundation::task::Bug> {
37 match self {
38 Self::Bug(bug) => Some(bug),
39 Self::Custody(error) => error.bug(),
40 Self::AlreadyInitialized | Self::Crypto(_) => None,
41 }
42 }
43}
44
45pub struct StoreCustody {
48 identity: Arc<KeySession<MemberIdentity>>,
49 keys: Arc<KeySession<StoreKeyring>>,
50 keychain: Arc<StoreKeychain>,
51}
52
53impl StoreCustody {
54 pub fn new(
56 keys: Arc<KeySession<StoreKeyring>>,
57 identity: Arc<KeySession<MemberIdentity>>,
58 keychain: Arc<StoreKeychain>,
59 ) -> Self {
60 Self { keys, identity, keychain }
61 }
62
63 pub fn close(&self) {
65 self.keys.close();
66 self.identity.close();
67 }
68
69 pub fn new_identity(&self, member: MemberId) -> Result<MemberIdentity, IdentityError> {
76 if self.identity.read()?.is_some() {
77 return Err(IdentityError::AlreadyInitialized);
78 }
79 Ok(MemberIdentity::generate(member)?)
80 }
81
82 pub fn set_host_secret(&self, name: &str, value: &str) -> Result<(), KeyError> {
86 self.keychain.set_host_secret(name, value)
87 }
88
89 pub fn host_secret(&self, name: &str) -> Result<Option<String>, KeyError> {
91 self.keychain.host_secret(name)
92 }
93
94 pub fn delete_host_secret(&self, name: &str) -> Result<(), KeyError> {
97 self.keychain.delete_host_secret(name)
98 }
99}
100
101#[cfg(test)]
102#[path = "store_custody_tests.rs"]
103mod tests;