linkspace/commons/
identity.rs1use crate::*;
6
7pub fn lkc_id_open(
9 name: &str,
10 pass: &[u8],
11 create: bool,
12 scope: &dyn LkEnv,
13) -> LkResult<LkIdentity> {
14 use anyhow::ensure;
15 use identity::{lki_decrypt, lki_encrypt, lki_generate};
16 use linkspace_commons_internal::lns::{
17 name::LNSName,
18 rt::{lookup_enckey, setup_special_keyclaim},
19 };
20 use linkspace_system::thread_local::with_system;
21 use lkp::abe::convert::parse_and_eval;
22 let name = match name {
23 "" => LNSName::local(),
24 _ => parse_and_eval(name, scope.as_scope().as_dyn(), false)?,
25 };
26
27 let id = with_system(|lks| {
28 if let Some(enckey) = lookup_enckey(&lks, &name)? {
29 lki_decrypt(&enckey, pass)
30 } else {
31 ensure!(create, "not found - enable create to create it");
32 ensure!(
33 name.is_local(),
34 "only ':local' names can be created this way"
35 );
36 let id = lki_generate();
37 let enckey = lki_encrypt(&id, pass).parse().unwrap();
38 setup_special_keyclaim(&lks, name, enckey, false)?;
39 Ok(id)
40 }
41 })?;
42 let _ = linkspace_core::thread_local::set_key(Some(id.clone()), false);
43 Ok(id)
44}