diff src/libpam/handle.rs @ 166:2f5913131295

Separate flag/action flags into flags and action. This also individualizes the type of flag for each PAM function, so that you can only call a function with the right flags and values.
author Paul Fisher <paul@pfish.zone>
date Tue, 15 Jul 2025 00:32:24 -0400
parents a75a66cb4181
children 77470e45e397
line wrap: on
line diff
--- a/src/libpam/handle.rs	Mon Jul 14 18:56:55 2025 -0400
+++ b/src/libpam/handle.rs	Tue Jul 15 00:32:24 2025 -0400
@@ -9,7 +9,7 @@
 use crate::libpam::items::{LibPamItems, LibPamItemsMut};
 use crate::libpam::{items, memory};
 use crate::logging::{Level, Location, Logger};
-use crate::{Conversation, EnvironMap, Flags, ModuleClient, Transaction};
+use crate::{AuthnFlags, AuthtokFlags, Conversation, EnvironMap, ModuleClient, Transaction};
 use libpam_sys_consts::constants;
 use num_enum::{IntoPrimitive, TryFromPrimitive};
 use std::any::TypeId;
@@ -153,8 +153,8 @@
 }
 
 macro_rules! wrap {
-    (fn $name:ident { $pam_func:ident }) => {
-        fn $name(&mut self, flags: Flags) -> Result<()> {
+    (fn $name:ident($ftype:ident) { $pam_func:ident }) => {
+        fn $name(&mut self, flags: $ftype) -> Result<()> {
             ErrorCode::result_from(unsafe {
                 libpam_sys::$pam_func((self as *mut Self).cast(), flags.bits())
             })
@@ -163,9 +163,9 @@
 }
 
 impl Transaction for LibPamHandle {
-    wrap!(fn authenticate { pam_authenticate });
-    wrap!(fn account_management { pam_acct_mgmt });
-    wrap!(fn change_authtok { pam_chauthtok });
+    wrap!(fn authenticate(AuthnFlags) { pam_authenticate });
+    wrap!(fn account_management(AuthnFlags) { pam_acct_mgmt });
+    wrap!(fn change_authtok(AuthtokFlags) { pam_chauthtok });
 }
 
 // TODO: pam_setcred - app
@@ -233,9 +233,9 @@
 }
 
 impl<C: Conversation> Transaction for LibPamTransaction<C> {
-    delegate!(fn authenticate(&mut self, flags: Flags) -> Result<()>);
-    delegate!(fn account_management(&mut self, flags: Flags) -> Result<()>);
-    delegate!(fn change_authtok(&mut self, flags: Flags) -> Result<()>);
+    delegate!(fn authenticate(&mut self, flags: AuthnFlags) -> Result<()>);
+    delegate!(fn account_management(&mut self, flags: AuthnFlags) -> Result<()>);
+    delegate!(fn change_authtok(&mut self, flags: AuthtokFlags) -> Result<()>);
 }
 
 impl<C: Conversation> PamShared for LibPamTransaction<C> {