upleb.uk

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

summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/git/mod.rs16
-rw-r--r--src/lib/login/existing.rs35
-rw-r--r--src/lib/login/mod.rs2
3 files changed, 50 insertions, 3 deletions
diff --git a/src/lib/git/mod.rs b/src/lib/git/mod.rs
index 23fa5f0..ca7aa3f 100644
--- a/src/lib/git/mod.rs
+++ b/src/lib/git/mod.rs
@@ -1089,6 +1089,22 @@ pub fn get_git_config_item(git_repo: &Option<&Repo>, item: &str) -> Result<Optio
1089 } 1089 }
1090} 1090}
1091 1091
1092/// Read a config item from the system-level git config only (e.g.
1093/// /etc/gitconfig).
1094pub fn get_git_config_item_system(item: &str) -> Result<Option<String>> {
1095 let config = git2::Config::open_default().context("failed to open git config")?;
1096 // Try system level first, then ProgramData (Windows equivalent)
1097 for level in [git2::ConfigLevel::System, git2::ConfigLevel::ProgramData] {
1098 if let Ok(level_config) = config.open_level(level) {
1099 match level_config.get_entry(item) {
1100 Ok(entry) => return Ok(entry.value().map(|v| v.to_string())),
1101 Err(_) => continue,
1102 }
1103 }
1104 }
1105 Ok(None)
1106}
1107
1092pub fn save_git_config_item(git_repo: &Option<&Repo>, item: &str, value: &str) -> Result<()> { 1108pub fn save_git_config_item(git_repo: &Option<&Repo>, item: &str, value: &str) -> Result<()> {
1093 if let Some(git_repo) = git_repo { 1109 if let Some(git_repo) = git_repo {
1094 git_repo.save_git_config_item(item, value, false) 1110 git_repo.save_git_config_item(item, value, false)
diff --git a/src/lib/login/existing.rs b/src/lib/login/existing.rs
index e60621d..2e45ca4 100644
--- a/src/lib/login/existing.rs
+++ b/src/lib/login/existing.rs
@@ -18,7 +18,7 @@ use crate::client::MockConnect;
18use crate::{ 18use crate::{
19 cli_interactor::{Interactor, InteractorPrompt, PromptPasswordParms}, 19 cli_interactor::{Interactor, InteractorPrompt, PromptPasswordParms},
20 client::fetch_public_key, 20 client::fetch_public_key,
21 git::{Repo, RepoActions, get_git_config_item}, 21 git::{Repo, RepoActions, get_git_config_item, get_git_config_item_system},
22}; 22};
23 23
24/// load signer from git config and UserProfile from cache or relays 24/// load signer from git config and UserProfile from cache or relays
@@ -62,7 +62,8 @@ pub async fn load_existing_login(
62 Ok((signer, user_ref, source)) 62 Ok((signer, user_ref, source))
63} 63}
64 64
65/// priority order: cli arguments, local git config, global git config 65/// priority order: cli arguments, local git config, global git config, system
66/// git config
66pub fn get_signer_info( 67pub fn get_signer_info(
67 git_repo: &Option<&Repo>, 68 git_repo: &Option<&Repo>,
68 signer_info: &Option<SignerInfo>, 69 signer_info: &Option<SignerInfo>,
@@ -82,6 +83,7 @@ pub fn get_signer_info(
82 SignerInfoSource::CommandLineArguments, 83 SignerInfoSource::CommandLineArguments,
83 SignerInfoSource::GitLocal, 84 SignerInfoSource::GitLocal,
84 SignerInfoSource::GitGlobal, 85 SignerInfoSource::GitGlobal,
86 SignerInfoSource::GitSystem,
85 ] 87 ]
86 } { 88 } {
87 if let Ok(res) = 89 if let Ok(res) =
@@ -91,7 +93,7 @@ pub fn get_signer_info(
91 break; 93 break;
92 } 94 }
93 } 95 }
94 result.context("failed to get or find signer info in cli arguments, local git config or global git config")? 96 result.context("failed to get or find signer info in cli arguments, local git config, global git config or system git config")?
95 } 97 }
96 Some(SignerInfoSource::CommandLineArguments) => { 98 Some(SignerInfoSource::CommandLineArguments) => {
97 if let Some(signer_info) = signer_info { 99 if let Some(signer_info) = signer_info {
@@ -158,6 +160,33 @@ pub fn get_signer_info(
158 bail!("no signer info in global git config") 160 bail!("no signer info in global git config")
159 } 161 }
160 } 162 }
163 Some(SignerInfoSource::GitSystem) => {
164 if let Some(nsec) = get_git_config_item_system("nostr.nsec")
165 .context("failed to get system git config")?
166 {
167 (
168 SignerInfo::Nsec {
169 nsec: nsec.to_string(),
170 password: password.clone(),
171 npub: get_git_config_item_system("nostr.npub")
172 .context("failed to get system git config")?,
173 },
174 SignerInfoSource::GitSystem,
175 )
176 } else if let Some(bunker_uri) = get_git_config_item_system("nostr.bunker-uri")
177 .context("failed to get system git config")?
178 {
179 (SignerInfo::Bunker {
180 bunker_uri, bunker_app_key: get_git_config_item_system("nostr.bunker-app-key")
181 .context("failed to get system git config")?
182 .context("system git config item nostr.bunker-uri exists but nostr.bunker-app-key doesn't")?,
183 npub: get_git_config_item_system("nostr.npub")
184 .context("failed to get system git config")?,
185 }, SignerInfoSource::GitSystem)
186 } else {
187 bail!("no signer info in system git config")
188 }
189 }
161 }) 190 })
162} 191}
163 192
diff --git a/src/lib/login/mod.rs b/src/lib/login/mod.rs
index 47847c3..938cec4 100644
--- a/src/lib/login/mod.rs
+++ b/src/lib/login/mod.rs
@@ -65,6 +65,7 @@ pub enum SignerInfo {
65pub enum SignerInfoSource { 65pub enum SignerInfoSource {
66 GitLocal, 66 GitLocal,
67 GitGlobal, 67 GitGlobal,
68 GitSystem,
68 CommandLineArguments, 69 CommandLineArguments,
69} 70}
70 71
@@ -91,6 +92,7 @@ fn print_logged_in_as(
91 SignerInfoSource::CommandLineArguments => " via cli arguments", 92 SignerInfoSource::CommandLineArguments => " via cli arguments",
92 SignerInfoSource::GitLocal => " to local repository", 93 SignerInfoSource::GitLocal => " to local repository",
93 SignerInfoSource::GitGlobal => "", 94 SignerInfoSource::GitGlobal => "",
95 SignerInfoSource::GitSystem => " via system git config",
94 } 96 }
95 ); 97 );
96 Ok(()) 98 Ok(())