From 169f0d9d275dcacd6497dd8e3e8ec2203d7b5435 Mon Sep 17 00:00:00 2001
From: Dominik George <dominik.george@teckids.org>
Date: Thu, 13 May 2021 11:42:12 +0200
Subject: [PATCH] [Unix] Use &str instead of String for Passwd values

---
 src/cache.rs | 28 ++++++++++++++--------------
 src/pam.rs   |  2 +-
 src/unix.rs  | 30 +++++++++++++++---------------
 3 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/src/cache.rs b/src/cache.rs
index a7db22f..065862f 100644
--- a/src/cache.rs
+++ b/src/cache.rs
@@ -36,19 +36,19 @@ use serde_json;
 
 const USER_TOKEN_FILENAME: &str = "user_token.json";
 
-struct UserInfo {
+struct UserInfo<'a> {
     uid: Option<uid_t>,
-    username: Option<String>,
-    passwd: Option<Passwd>,
+    username: Option<&'a str>,
+    passwd: Option<Passwd<'a>>,
     access_token: Option<BasicTokenResponse>
 }
 
-pub struct Cache {
-    pub context_user: UserInfo
+pub struct Cache<'a> {
+    pub context_user: UserInfo<'a>
 }
 
-impl Cache {
-    pub fn new() -> Cache {
+impl Cache<'_> {
+    pub fn new<'a>() -> Cache<'a> {
         let euid = unsafe {
             geteuid()
         };
@@ -63,7 +63,7 @@ impl Cache {
     }
 }
 
-impl UserInfo {
+impl <'a>UserInfo<'a> {
     pub fn set_current_user(&mut self) {
         self.set_uid(original_euid);
     }
@@ -125,9 +125,9 @@ impl UserInfo {
         self.try_resolve();
     }
 
-    pub fn get_username(&mut self) -> Result<String, io::Error> {
+    pub fn get_username(&mut self) -> Result<&str, io::Error> {
         match self.try_resolve() {
-            Ok(passwd) => Ok(&passwd.pw_name),
+            Ok(passwd) => Ok(passwd.pw_name),
             Err(e) => match self.username {
                 Some(username) => Ok(username),
                 None => Err(e)
@@ -135,14 +135,14 @@ impl UserInfo {
         }
     }
 
-    pub fn set_username(&mut self, username: String) {
+    pub fn set_username(&mut self, username: &'a str) {
         self.username = Some(username);
         self.uid = None;
         self.passwd = None;
         self.try_resolve();
     }
 
-    pub fn get_home_directory(&mut self) -> Result<String, io::Error> {
+    pub fn get_home_directory(&mut self) -> Result<&str, io::Error> {
         match self.try_resolve() {
             Ok(passwd) => Ok(passwd.pw_dir),
             Err(e) => Err(e)
@@ -301,8 +301,8 @@ static original_euid: uid_t = unsafe {
 };
 
 lazy_static! {
-    static ref CACHE: Mutex<Cache> = Mutex::new(Cache::new());
+    static ref CACHE: Mutex<Cache<'static>> = Mutex::new(Cache::new());
 }
-pub fn get_cache() -> MutexGuard<'static, Cache> {
+pub fn get_cache() -> MutexGuard<'static, Cache<'static>> {
     CACHE.lock().unwrap()
 }
diff --git a/src/pam.rs b/src/pam.rs
index e98a1fa..f721a50 100644
--- a/src/pam.rs
+++ b/src/pam.rs
@@ -90,7 +90,7 @@ impl PamServiceModule for PamOidc {
             match get_access_token_password(&conf, "pam", username.to_string(), password.to_string(), PamError::SERVICE_ERR, PamError::AUTH_ERR) {
                 Ok(t) => {
                     info!("Authenticated {} using Resource Owner Password Grant", username);
-                    get_cache().context_user.set_username(username.to_string());
+                    get_cache().context_user.set_username(username);
                     get_cache().context_user.set_access_token(t);
                     return PamError::SUCCESS;
                 },
diff --git a/src/unix.rs b/src/unix.rs
index d74e0e7..8671217 100644
--- a/src/unix.rs
+++ b/src/unix.rs
@@ -1,5 +1,5 @@
 /* Copyright 2021 Dominik George <dominik.george@teckids.org>
- * Copyright 2021 mirabilos <thorsten.glaser@teckids.org>
+65;6203;1c * Copyright 2021 mirabilos <thorsten.glaser@teckids.org>
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,33 +20,33 @@ use std::io;
 use std::mem::uninitialized;
 use std::ptr::null_mut;
 
-pub struct Passwd {
-    pub pw_name: String,
-    pub pw_passwd: String,
+pub struct Passwd<'a> {
+    pub pw_name: &'a str,
+    pub pw_passwd: &'a str,
     pub pw_uid: uid_t,
     pub pw_gid: gid_t,
-    pub pw_gecos: String,
-    pub pw_dir: String,
-    pub pw_shell: String
+    pub pw_gecos: &'a str,
+    pub pw_dir: &'a str,
+    pub pw_shell: &'a str
 }
 
 const MAX_BUFLEN: size_t = 1024 * 1024;
 
-fn getpwxx_fillpw(c_passwd: passwd) -> Passwd {
+fn getpwxx_fillpw<'a>(c_passwd: passwd) -> Passwd<'a> {
     unsafe {
         Passwd {
-            pw_name: CStr::from_ptr(c_passwd.pw_name).to_string_lossy().into_owned(),
-            pw_passwd: CStr::from_ptr(c_passwd.pw_passwd).to_string_lossy().into_owned(),
+            pw_name: CStr::from_ptr(c_passwd.pw_name).to_str().ok().unwrap(),
+            pw_passwd: CStr::from_ptr(c_passwd.pw_passwd).to_str().ok().unwrap(),
             pw_uid: c_passwd.pw_uid,
             pw_gid: c_passwd.pw_gid,
-            pw_gecos: CStr::from_ptr(c_passwd.pw_gecos).to_string_lossy().into_owned(),
-            pw_dir: CStr::from_ptr(c_passwd.pw_dir).to_string_lossy().into_owned(),
-            pw_shell: CStr::from_ptr(c_passwd.pw_shell).to_string_lossy().into_owned(),
+            pw_gecos: CStr::from_ptr(c_passwd.pw_gecos).to_str().ok().unwrap(),
+            pw_dir: CStr::from_ptr(c_passwd.pw_dir).to_str().ok().unwrap(),
+            pw_shell: CStr::from_ptr(c_passwd.pw_shell).to_str().ok().unwrap(),
         }
     }
 }
 
-pub fn getpwnam_safe(name: String) -> Result<Passwd, io::Error> {
+pub fn getpwnam_safe<'a>(name: String) -> Result<Passwd<'a>, io::Error> {
     let res: Passwd;
 
     unsafe {
@@ -82,7 +82,7 @@ pub fn getpwnam_safe(name: String) -> Result<Passwd, io::Error> {
     return Ok(res);
 }
 
-pub fn getpwuid_safe(uid: uid_t) -> Result<Passwd, io::Error> {
+pub fn getpwuid_safe<'a>(uid: uid_t) -> Result<Passwd<'a>, io::Error> {
     let res: Passwd;
 
     unsafe {
-- 
GitLab