Mercurial > crates > nonstick
changeset 172:6727cbe56f4a
Test environment variable setting; minor cleanup.
author | Paul Fisher <paul@pfish.zone> |
---|---|
date | Fri, 25 Jul 2025 21:02:53 -0400 |
parents | e27c5c667a5a |
children | 46e8ce5cd5d1 |
files | src/constants.rs src/libpam/conversation.rs src/libpam/module.rs testharness/src/bin/testharness.rs testharness/src/lib.rs |
diffstat | 5 files changed, 24 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/src/constants.rs Fri Jul 25 20:52:14 2025 -0400 +++ b/src/constants.rs Fri Jul 25 21:02:53 2025 -0400 @@ -70,16 +70,13 @@ impl From<RawFlags> for $name { #[allow(unused_doc_comments)] fn from(value: RawFlags) -> Self { - eprintln!(concat!(stringify!($name), " FROM RAW FLAGS")); let value: c_int = value.into(); let result = Self::empty(); $( $(#[$m_ident $($m_arg)*])* let result = result | if value & $value_value == 0 { - eprintln!(concat!("checked against ", stringify!($value_value))); Self::empty() } else { - eprintln!(concat!("checked against ", stringify!($value_value), " success")); Self::$item_name }; )* @@ -91,15 +88,12 @@ impl From<$name> for RawFlags { #[allow(unused_doc_comments)] fn from(value: $name) -> Self { - eprintln!(concat!("RAW FLAGS FROM ", stringify!($name))); let result = 0; $( $(#[$m_ident $($m_arg)*])* let result = result | if value.contains($name::$item_name) { - eprintln!(concat!("checked against ", stringify!($item_name), " success")); $value_value } else { - eprintln!(concat!("checked against ", stringify!($item_name))); 0 }; )* @@ -430,7 +424,7 @@ fn from(value: Result<T>) -> Self { match value { Ok(_) => ReturnCode::SUCCESS, - Err(otherwise) => otherwise.into() + Err(otherwise) => otherwise.into(), } } }
--- a/src/libpam/conversation.rs Fri Jul 25 20:52:14 2025 -0400 +++ b/src/libpam/conversation.rs Fri Jul 25 21:02:53 2025 -0400 @@ -1,3 +1,4 @@ +use crate::constants::ReturnCode; use crate::conv::{BinaryQAndA, RadioQAndA}; use crate::conv::{Conversation, ErrorMsg, Exchange, InfoMsg, MaskedQAndA, QAndA}; use crate::libpam::answer::BinaryAnswer; @@ -11,7 +12,6 @@ use std::iter; use std::ptr::NonNull; use std::result::Result as StdResult; -use crate::constants::ReturnCode; /// The type used by PAM to call back into a conversation. ///
--- a/src/libpam/module.rs Fri Jul 25 20:52:14 2025 -0400 +++ b/src/libpam/module.rs Fri Jul 25 21:02:53 2025 -0400 @@ -48,8 +48,8 @@ ($ident:ident) => { mod _pam_hooks_scope { use std::ffi::{c_char, c_int, c_void}; + use $crate::constants::{RawFlags, ReturnCode}; use $crate::ModuleExporter; - use $crate::constants::{RawFlags, ReturnCode}; macro_rules! export { ($func:ident) => { @@ -60,9 +60,8 @@ argc: c_int, argv: *const *const c_char, ) -> c_int { - let ret: ReturnCode = ModuleExporter::$func::<super::$ident>( - pamh, flags, argc, argv - ).into(); + let ret: ReturnCode = + ModuleExporter::$func::<super::$ident>(pamh, flags, argc, argv).into(); ret.into() } }; @@ -170,7 +169,10 @@ /// /// It's up to you to pass a valid handle. unsafe fn wrap<'a>(handle: *mut c_void) -> Result<&'a mut LibPamHandle> { - handle.cast::<LibPamHandle>().as_mut().ok_or(ErrorCode::SystemError) + handle + .cast::<LibPamHandle>() + .as_mut() + .ok_or(ErrorCode::SystemError) } #[cfg(test)]
--- a/testharness/src/bin/testharness.rs Fri Jul 25 20:52:14 2025 -0400 +++ b/testharness/src/bin/testharness.rs Fri Jul 25 21:02:53 2025 -0400 @@ -3,10 +3,12 @@ use nonstick::conv::Exchange; use nonstick::items::Items; use nonstick::libpam::TransactionBuilder; +use nonstick::EnvironMap; use nonstick::{ AuthnFlags, AuthtokFlags, Conversation, ErrorCode, LibPamTransaction, PamShared, Transaction, }; use std::cell::Cell; +use std::collections::HashMap; use std::ffi::OsString; use std::os::unix::ffi::OsStrExt; @@ -43,8 +45,6 @@ Exchange::MaskedPrompt(p) => { let answer = if self.changing_password.get() { let prompt_count = self.change_prompt_count.get(); - eprintln!("CHANGING PASSWORD PROMPT {prompt_count}"); - eprintln!("-> {p:?}"); self.change_prompt_count.set(prompt_count + 1); // When changing passwords after logging in, Sun PAM // uses the existing authtok that was just entered as @@ -133,4 +133,9 @@ assert_eq!(change, Err(ErrorCode::TryAgain)); tx.change_authtok(AuthtokFlags::CHANGE_EXPIRED_AUTHTOK) .unwrap(); + let environ: HashMap<_, _> = tx.environ().iter().collect(); + assert_eq!( + environ, + HashMap::from([("nin".into(), "nine inch nails".into())]) + ); }
--- a/testharness/src/lib.rs Fri Jul 25 20:52:14 2025 -0400 +++ b/testharness/src/lib.rs Fri Jul 25 21:02:53 2025 -0400 @@ -1,6 +1,7 @@ //! The nonstick library use crate::nonstick::items::ItemsMut; +use crate::nonstick::EnvironMapMut; use std::cell::Cell; extern crate nonstick; @@ -55,12 +56,14 @@ } fn account_management(handle: &mut M, _: Vec<&CStr>, _: AuthnFlags) -> nonstick::Result<()> { - let value: &Cell<i32> = match handle.username(None)?.as_bytes() { + match handle.username(None)?.as_bytes() { b"initial" => return Err(ErrorCode::AccountExpired), - b"updated-in-process" => handle.get_module_data("florgus"), + b"updated-in-process" => (), _ => return Err(ErrorCode::UserUnknown), - } - .ok_or(ErrorCode::SessionError)?; + }; + let value: &Cell<i32> = handle + .get_module_data("florgus") + .ok_or(ErrorCode::SessionError)?; let florgus_str: Option<&i32> = handle.get_module_data("florgus"); if let Some(s) = florgus_str { error!( @@ -72,6 +75,7 @@ error!(handle, "wrong value! {}", value.get()); return Err(ErrorCode::AuthTokError); } + handle.environ_mut().insert("nin", "nine inch nails"); let password = handle.authtok(None)?; if password.as_bytes() == b"valid" { Err(ErrorCode::NewAuthTokRequired)