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);
     }