From 639f18426fcc1c1bb60b59fdd42d589dd8669276 Mon Sep 17 00:00:00 2001 From: lol Date: Wed, 21 Feb 2024 16:50:54 +0100 Subject: [PATCH] fix(token): allow to get and store token in local config --- src/commands/credential.rs | 28 +++++++++++++++------------- src/commands/push/new.rs | 4 ++-- src/services/request_manager.rs | 12 ++++++++++++ src/utils/api.rs | 4 +++- 4 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/commands/credential.rs b/src/commands/credential.rs index 0922523..7bf2149 100644 --- a/src/commands/credential.rs +++ b/src/commands/credential.rs @@ -12,8 +12,18 @@ pub struct CredentialArgs<'a> { } pub fn credential_add(args: CredentialArgs) { - let username = args.username.unwrap().next().unwrap(); + // get remote if exists + let remote = match config::get_remote("origin") { + None => { + eprintln!("fatal: No remote origin, impossible to send request to get token"); + std::process::exit(1); + }, + Some(remote) => remote + }; + let (host, _, _) = get_url_props(&remote); + // get username and password + let username = args.username.unwrap().next().unwrap(); let password = match args.password { Some(mut pwd) => pwd.next().unwrap().to_owned(), None => { @@ -22,22 +32,13 @@ pub fn credential_add(args: CredentialArgs) { } }; - let remote = match config::get_remote("origin") { - None => { - eprintln!("fatal: No remote origin, impossible to send request to get token"); - std::process::exit(1); - }, - Some(remote) => remote - }; - - let (host, _, _) = get_url_props(&remote); - + // get token let get_token = Login::new() .set_auth(username, &password) .set_host(Some(host)) .send_login(); - + // deal with error if let Err(err) = get_token { if let RequestError(err) = err { eprintln!("fatal: Failed to get token for these credential. ({})", err); @@ -48,6 +49,7 @@ pub fn credential_add(args: CredentialArgs) { std::process::exit(1); } - let _ = config::add_core(username, get_token.unwrap().as_str()); + // save token + let _ = config::write_option_in_cat("core", "token", get_token.unwrap().as_str()); } diff --git a/src/commands/push/new.rs b/src/commands/push/new.rs index a760f6c..df6cb73 100644 --- a/src/commands/push/new.rs +++ b/src/commands/push/new.rs @@ -32,11 +32,11 @@ impl PushChange for New { match res { Err(ApiError::IncorrectRequest(err)) => { - eprintln!("fatal: error pushing file {}: {}", obj.name, err.status()); + eprintln!("fatal: error pushing file '{}': {}", obj.name, err.status()); std::process::exit(1); }, Err(ApiError::RequestError(_)) => { - eprintln!("fatal: request error pushing file {}", obj.name); + eprintln!("fatal: request error pushing file '{}'", obj.name); std::process::exit(1); } _ => (), diff --git a/src/services/request_manager.rs b/src/services/request_manager.rs index 4fd898a..30a9dfc 100644 --- a/src/services/request_manager.rs +++ b/src/services/request_manager.rs @@ -56,6 +56,7 @@ impl RequestManager { pub fn get_token(&mut self) -> String { if self.token.is_none() { + // look in global config if let Some(token) = gconfig::read_token() { if !token.is_empty() { self.token = Some(token); @@ -63,10 +64,21 @@ impl RequestManager { } } + // look in local config + if let Some(token) = config::find_option_in_cat("core", "token") + { + if !token.is_empty() { + self.token = Some(token); + return self.token.clone().unwrap(); + } + } + + // ask for a token let get_token = Login::new() .ask_auth() .set_host(Some(self.get_host())) .send_login(); + // todo deal with error cases self.token = Some(get_token.unwrap()); if let Err(err) = gconfig::write_token(&self.token.clone().unwrap()) { diff --git a/src/utils/api.rs b/src/utils/api.rs index 506b9ef..b9c4015 100644 --- a/src/utils/api.rs +++ b/src/utils/api.rs @@ -39,6 +39,8 @@ pub fn get_relative_s(p: String, api_props: &ApiProps) -> String { final_p = final_p.strip_prefix("/remote.php/dav/files/").unwrap().to_string(); final_p = final_p.strip_prefix(&api_props.username).unwrap().to_string(); final_p = final_p.strip_prefix(&api_props.root).unwrap().to_string(); - final_p = final_p.strip_prefix("/").unwrap().to_string(); + if final_p.starts_with("/") { + final_p = final_p.strip_prefix("/").unwrap().to_string(); + } final_p }