upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/src/bin/ngit/sub_commands/export_keys.rs
blob: 4a32a3aa2abb57cb889abb7f7beec6071e031db1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
use anyhow::{Context, Result};
use ngit::{
    cli_interactor::{Interactor, InteractorPrompt, PromptChoiceParms},
    login::{
        SignerInfo, SignerInfoSource,
        existing::{get_signer_info, load_existing_login},
        fresh::generate_qr,
    },
};

use crate::git::Repo;

pub async fn launch() -> Result<()> {
    let git_repo_result = Repo::discover().context("failed to find a git repository");
    let git_repo = { git_repo_result.ok() };

    if let Ok((signer_info, source)) = get_signer_info(&git_repo.as_ref(), &None, &None, &None) {
        if let Ok((_, user_ref, source)) = load_existing_login(
            &git_repo.as_ref(),
            &None,
            &None,
            &Some(source),
            None,
            true,
            false,
            false,
        )
        .await
        {
            let logged_in_msg = format!(
                "logged in {}as {}",
                if source == SignerInfoSource::GitLocal {
                    "to local git repository "
                } else {
                    ""
                },
                user_ref.metadata.name
            );
            match signer_info {
                SignerInfo::Bunker {
                    bunker_uri: _,
                    bunker_app_key: _,
                    npub: _,
                } => {
                    eprintln!(
                        "failed: {logged_in_msg} using nostr connect so your keys are stored in a remote signer"
                    );
                    return Ok(());
                }
                SignerInfo::Nsec {
                    nsec,
                    password: _,
                    npub: _,
                } => {
                    match Interactor::default().choice(
                        PromptChoiceParms::default()
                            .with_default(0)
                            .with_prompt(logged_in_msg)
                            .with_choices(vec![
                                "print nsec".to_string(),
                                "show QR code of nsec".to_string(),
                                "cancel".to_string(),
                            ]),
                    )? {
                        0 => {
                            println!("{nsec}");
                            return Ok(());
                        }
                        1 => {
                            for line in generate_qr(&nsec)? {
                                println!("{line}");
                            }
                            return Ok(());
                        }
                        _ => {
                            return Ok(());
                        }
                    }
                }
            }
        }
    }
    eprintln!("not logged in so no keys are stored");
    Ok(())
}