soroban_cli/signer/
secure_store.rs

1use sep5::SeedPhrase;
2
3use crate::{
4    config::{
5        address::KeyName,
6        locator,
7        secret::{self, Secret},
8    },
9    print::Print,
10    signer::keyring::{self, StellarEntry},
11};
12
13#[derive(thiserror::Error, Debug)]
14pub enum Error {
15    #[error(transparent)]
16    Config(#[from] locator::Error),
17
18    #[error(transparent)]
19    Secret(#[from] secret::Error),
20
21    #[error(transparent)]
22    Keyring(#[from] keyring::Error),
23
24    #[error("Storing an existing private key in Secure Store is not supported")]
25    DoesNotSupportPrivateKey,
26
27    #[error(transparent)]
28    SeedPhrase(#[from] sep5::Error),
29}
30
31pub fn save_secret(
32    print: &Print,
33    entry_name: &KeyName,
34    seed_phrase: SeedPhrase,
35) -> Result<Secret, Error> {
36    // secure_store:org.stellar.cli:<key name>
37    let entry_name_with_prefix = format!(
38        "{}{}-{}",
39        keyring::SECURE_STORE_ENTRY_PREFIX,
40        keyring::SECURE_STORE_ENTRY_SERVICE,
41        entry_name
42    );
43
44    //checking that the entry name is valid before writing to the secure store
45    let secret: Secret = entry_name_with_prefix.parse()?;
46
47    if let Secret::SecureStore { entry_name } = &secret {
48        write_to_secure_store(entry_name, seed_phrase, print)?;
49    }
50
51    Ok(secret)
52}
53
54fn write_to_secure_store(
55    entry_name: &str,
56    seed_phrase: SeedPhrase,
57    print: &Print,
58) -> Result<(), Error> {
59    print.infoln(format!("Writing to secure store: {entry_name}"));
60    let entry = StellarEntry::new(entry_name)?;
61    if let Ok(key) = entry.get_public_key(None) {
62        print.warnln(format!(
63            "A key for {entry_name} already exists in your operating system's secure store: {key}"
64        ));
65    } else {
66        print.infoln(format!(
67            "Saving a new key to your operating system's secure store: {entry_name}"
68        ));
69        entry.set_seed_phrase(seed_phrase)?;
70    };
71    Ok(())
72}