linkspace/commons/
identity.rs

1/** A convention for storing and referencing identities inside linkspace
2open (or generate) the key `name` which is also accessible as \[@:name:local\].
3empty name defaults to ( i.e. \[@:me:local\] )
4 **/
5use crate::*;
6
7/// open (or create) a identity using an lns name like me:local.
8pub 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}