From f4a905c57f7059b8e307f2c6a3b1437d7ac1e5c0 Mon Sep 17 00:00:00 2001 From: grimhilt Date: Tue, 24 Oct 2023 15:32:51 +0200 Subject: [PATCH] store token --- src/services/login.rs | 5 ++- src/services/request_manager.rs | 13 +++++++- src/store/gconfig.rs | 54 +++++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 src/store/gconfig.rs diff --git a/src/services/login.rs b/src/services/login.rs index 058b155..11963fe 100644 --- a/src/services/login.rs +++ b/src/services/login.rs @@ -35,7 +35,6 @@ impl ApiCall for Login { }, None => "/ocs/v2.php/core/getapppassword".to_owned(), }; - dbg!(url.clone()); self.api_builder.set_url(Method::GET, &url); self.api_builder.set_header("OCS-APIRequest", HeaderValue::from_str("true").unwrap()); self.api_builder.set_basic_auth(self.login.clone(), self.password.clone()); @@ -88,8 +87,8 @@ impl Login { return text.clone(); } } - Ok(XmlEvent::EndElement { name, .. }) => { - } + //Ok(XmlEvent::EndElement { name, .. }) => { + //} Err(e) => { eprintln!("err: parsing xml: {}", e); break; diff --git a/src/services/request_manager.rs b/src/services/request_manager.rs index f968c62..3919835 100644 --- a/src/services/request_manager.rs +++ b/src/services/request_manager.rs @@ -3,6 +3,7 @@ use std::sync::Mutex; use crate::services::login::Login; use crate::commands::config; +use crate::store::gconfig; use crate::commands::clone::get_url_props; use crate::services::api_call::ApiCall; @@ -55,14 +56,24 @@ impl RequestManager { pub fn get_token(&mut self) -> String { if self.token.is_none() { - // todo check in config + if let Some(token) = gconfig::read_token() { + if !token.is_empty() { + self.token = Some(token); + return self.token.clone().unwrap(); + } + } + 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()) { + eprintln!("err: failed to write token ({})", err); + } } + self.token.clone().unwrap() } diff --git a/src/store/gconfig.rs b/src/store/gconfig.rs new file mode 100644 index 0000000..6b6f399 --- /dev/null +++ b/src/store/gconfig.rs @@ -0,0 +1,54 @@ +use std::env; +use std::path::PathBuf; +use std::fs::{self, OpenOptions}; +use std::io::{self, Write}; +use crate::utils::read; + +fn global_path() -> Option { + if let Some(home_dir) = env::var_os("HOME") { + let mut path = PathBuf::new(); + path.push(home_dir); + path.push(".nextsync"); + Some(path) + } + else + { + None + } +} + +pub fn write_token(token: &str) -> io::Result<()> { + if let Some(mut path_token) = global_path() { + if !path_token.exists() { + fs::create_dir_all(path_token.clone())?; + } + path_token.push("token"); + let mut file = OpenOptions::new() + .read(true) + .write(true) + .create(true) + .open(path_token)?; + + writeln!(file, "{}", token)?; + } + Ok(()) + +} + +pub fn read_token() -> Option { + if let Some(mut path_token) = global_path() { + if !path_token.exists() { + return None; + } + path_token.push("token"); + if let Ok(lines) = read::read_lines(path_token) { + for line in lines { + if let Ok(l) = line { + return Some(l); + } + } + } + } + + None +}