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)