diff --git a/src/nss.rs b/src/nss.rs index dc66ed265c8eb5cfe1d06a8cf9a34b2b8b059717..e866eb40cdd6185e35507bcdc008b2efbbfaa4cb 100644 --- a/src/nss.rs +++ b/src/nss.rs @@ -18,9 +18,13 @@ use crate::config::{ get_optional }; use config::Config; +use crate::cache::get_cache; use crate::logging::setup_log; +use libc::{getpwuid, geteuid}; +use std::ffi::CStr; + use libnss::interop::Response; use libnss::passwd::{PasswdHooks, Passwd}; @@ -36,12 +40,28 @@ fn nss_hook_prepare() -> Config { return conf; } +fn get_current_user() -> String { + let euid; + let euser; + unsafe { + euid = geteuid(); + euser = CStr::from_ptr((*getpwuid(euid)).pw_name); + }; + euser.to_str().ok().unwrap().to_string() +} + struct OidcPasswd; impl PasswdHooks for OidcPasswd { fn get_all_entries() -> Response<Vec<Passwd>> { let config = nss_hook_prepare(); + let user = get_current_user(); + let token = match get_cache().load_user_token(&user) { + Some(t) => t, + None => return Response::Unavail + }; + Response::Success( vec![ Passwd {