diff --git a/src/cache.rs b/src/cache.rs index 2c4018e870a9805ff7a14112be02f508078183fd..9256531f68c061e255854fcfe741266e8a2fdedc 100644 --- a/src/cache.rs +++ b/src/cache.rs @@ -182,6 +182,13 @@ impl UserInfo { }; } + /// Set the full passwd struct from outside + pub fn set_passwd(&mut self, passwd: Passwd) { + self.passwd = Some(passwd.clone()); + self.username = Some(passwd.pw_name); + self.uid = Some(passwd.pw_uid); + } + /// Return the home directory from the passwd slot, /// attempting NSS resolution before doing so pub fn get_home_directory(&mut self) -> Result<String, io::Error> { diff --git a/src/pam.rs b/src/pam.rs index 8bfef0c02b3cce320bae474581c6720e478f7a99..d7637ed2c7938459969dd4fce51cdcd75c790181 100644 --- a/src/pam.rs +++ b/src/pam.rs @@ -26,6 +26,8 @@ use crate::logging::setup_log; use crate::cache::{get_context_user, set_is_getpwnam_safe}; +use crate::unix::getpwnam_safe; + use pamsm::{PamServiceModule, Pam, PamFlag, PamError, PamLibExt}; fn pam_sm_prepare(argv: &Vec<String>) -> Config { @@ -91,7 +93,10 @@ impl PamServiceModule for PamOidc { Ok(t) => { info!("Authenticated {} using Resource Owner Password Grant", username); set_is_getpwnam_safe(false); - get_context_user().set_username(username.to_string()); + let passwd = getpwnam_safe(username.to_string()); + if passwd.is_ok() { + get_context_user().set_passwd(passwd.unwrap()); + } get_context_user().set_access_token(t); set_is_getpwnam_safe(true); return PamError::SUCCESS; diff --git a/src/unix.rs b/src/unix.rs index d74e0e7076661ddabd647bee51b6263dcc46ec47..64523668ea0a106e22e8f25ee6fae1250792699b 100644 --- a/src/unix.rs +++ b/src/unix.rs @@ -20,6 +20,7 @@ use std::io; use std::mem::uninitialized; use std::ptr::null_mut; +#[derive(Clone)] pub struct Passwd { pub pw_name: String, pub pw_passwd: String,