diff --git a/Cargo.toml b/Cargo.toml index a56e8de4d7a9e4f2eb99a825f6f1bbb0bcf2f9e4..3f9b5e8579e4a715a1896e60dadab75026b2c17f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,6 +24,7 @@ config = "^0.11.0" serde = "^1.0.125" log = "^0.4.11" syslog = "^5.0.0" +xdg = "^2.2.0" [profile.release] opt-level = 'z' diff --git a/src/cache.rs b/src/cache.rs index 2a23c4f8f424498ed69c11fedf0e904529a14948..f1d0f1426d69a12fb4da2e0345934056c353f7b9 100644 --- a/src/cache.rs +++ b/src/cache.rs @@ -23,6 +23,9 @@ use std::ffi::CString; use oauth2::basic::BasicTokenResponse; +use std::env; +use xdg::{BaseDirectories,BaseDirectoriesError}; + const TOKEN_DEFAULT_EXPIRES: u64 = 24 * 60 * 60; struct UserToken { @@ -31,7 +34,6 @@ struct UserToken { refresh_token: Option<String>, } - impl UserToken { fn is_expired(&self) -> bool { match SystemTime::now().duration_since(SystemTime::UNIX_EPOCH) { @@ -91,6 +93,27 @@ impl Cache { seteuid(self.original_euid); } + fn get_user_xdg_base_directories(&self, username: String) -> Result<BaseDirectories, BaseDirectoriesError> { + let saved_home = env::var_os("HOME"); + + let nam = match CString::new(username) { + Ok(nam) => nam, + Err(_) => CString::new("nobody").ok().unwrap() + }; + let user_home = CString::from_raw((*getpwnam(nam.as_ptr())).pw_dir).to_str().unwrap(); + env::set_var("HOME", user_home); + + let base_dirs = BaseDirectories::new()?; + + if saved_home != None { + env::set_var("HOME", saved_home.unwrap()); + } else { + env::remove_var("HOME"); + } + + return Ok(base_dirs); + } + pub fn load_user_token(&self, owner: String) -> Option<&UserToken> { return self.user_tokens.get(&owner); }