From be06986917018d672c5836287dcb84d86f9c6df5 Mon Sep 17 00:00:00 2001 From: Fabrice Desclaux Date: Fri, 8 Jul 2022 11:47:59 +0200 Subject: [PATCH 1/3] Fix env parsing off by one --- src/env.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/env.rs b/src/env.rs index d72b2fd..b34751e 100644 --- a/src/env.rs +++ b/src/env.rs @@ -51,7 +51,7 @@ fn parse_env_line(input: &[u8]) -> Option<(OsString, OsString)> { if input.is_empty() { return None; } - let pos = memchr(b'=', input).map(|p| p + 1); + let pos = memchr(b'=', input); pos.map(|p| { ( OsStringExt::from_vec(input[..p].to_vec()), From 56a3e244dd13f5be98a62f180fab1bf0aae52402 Mon Sep 17 00:00:00 2001 From: Fabrice Desclaux Date: Thu, 21 Jul 2022 11:17:00 +0200 Subject: [PATCH 2/3] Set environement retrived by pam module --- src/client.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/client.rs b/src/client.rs index 237bac9..5f6dbb9 100644 --- a/src/client.rs +++ b/src/client.rs @@ -142,6 +142,16 @@ impl<'a, C: conv::Conversation> Client<'a, C> { self.initialize_environment() } + /// Retreive environement variable set by pam + pub fn get_env_list(&mut self) -> Vec<(String, String)> { + let pam_env = getenvlist(self.handle); + let mut env = vec![]; + for (name, value) in pam_env { + env.push((name, value)); + } + env + } + // Initialize the client environment with common variables. // Currently always called from Client.open_session() fn initialize_environment(&mut self) -> PamResult<()> { @@ -172,6 +182,11 @@ impl<'a, C: conv::Conversation> Client<'a, C> { self.set_env("SHELL", user.shell().to_str().unwrap())?; // Note: We don't set PATH here, as this should be the job of `pam_env.so` + // Set env variable returned by pam module + for (name, value) in self.get_env_list() { + self.set_env(&name, &value)?; + } + Ok(()) } From a65741d5a566c527cc5ce2624b0b15bed53918a1 Mon Sep 17 00:00:00 2001 From: Antonio Gurgel Date: Mon, 22 Aug 2022 17:30:24 -0700 Subject: [PATCH 3/3] Portably refer to C char type --- src/client.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client.rs b/src/client.rs index 5f6dbb9..781988d 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1,5 +1,5 @@ //! Authentication related structure and functions -use std::{env, ffi::CStr}; +use std::{env, ffi::CStr, os::raw::c_char}; use crate::{conv, enums::*, functions::*, types::*}; @@ -105,7 +105,7 @@ impl<'a, C: conv::Conversation> Client<'a, C> { pub fn get_user(&mut self) -> PamResult { get_item(self.handle, PamItemType::User).and_then(|result| { // Pam user is a char * - let ptr: *const i8 = unsafe { std::mem::transmute(result) }; + let ptr: *const c_char = unsafe { std::mem::transmute(result) }; let username = unsafe { CStr::from_ptr(ptr) }; match username.to_str() { Err(_) => Err(PamError(PamReturnCode::System_Err)),