From 559454b2a6ec0664ad85bf43bb7b5fde53c561bf Mon Sep 17 00:00:00 2001 From: Dominik George <dominik.george@teckids.org> Date: Sat, 8 May 2021 17:07:40 +0200 Subject: [PATCH] [Cache] Implement XDG base directory fetching --- Cargo.toml | 1 + src/cache.rs | 25 ++++++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index a56e8de..3f9b5e8 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 2a23c4f..f1d0f14 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); } -- GitLab