comparison 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
comparison
equal deleted inserted replaced
165:c4b1e280463c 166:2f5913131295
7 use crate::items::{Items, ItemsMut}; 7 use crate::items::{Items, ItemsMut};
8 use crate::libpam::environ::{LibPamEnviron, LibPamEnvironMut}; 8 use crate::libpam::environ::{LibPamEnviron, LibPamEnvironMut};
9 use crate::libpam::items::{LibPamItems, LibPamItemsMut}; 9 use crate::libpam::items::{LibPamItems, LibPamItemsMut};
10 use crate::libpam::{items, memory}; 10 use crate::libpam::{items, memory};
11 use crate::logging::{Level, Location, Logger}; 11 use crate::logging::{Level, Location, Logger};
12 use crate::{Conversation, EnvironMap, Flags, ModuleClient, Transaction}; 12 use crate::{AuthnFlags, AuthtokFlags, Conversation, EnvironMap, ModuleClient, Transaction};
13 use libpam_sys_consts::constants; 13 use libpam_sys_consts::constants;
14 use num_enum::{IntoPrimitive, TryFromPrimitive}; 14 use num_enum::{IntoPrimitive, TryFromPrimitive};
15 use std::any::TypeId; 15 use std::any::TypeId;
16 use std::cell::Cell; 16 use std::cell::Cell;
17 use std::ffi::{c_char, c_int, c_void, CString, OsStr, OsString}; 17 use std::ffi::{c_char, c_int, c_void, CString, OsStr, OsString};
151 unsafe { libpam_sys::pam_end(self.handle.cast(), result) }; 151 unsafe { libpam_sys::pam_end(self.handle.cast(), result) };
152 } 152 }
153 } 153 }
154 154
155 macro_rules! wrap { 155 macro_rules! wrap {
156 (fn $name:ident { $pam_func:ident }) => { 156 (fn $name:ident($ftype:ident) { $pam_func:ident }) => {
157 fn $name(&mut self, flags: Flags) -> Result<()> { 157 fn $name(&mut self, flags: $ftype) -> Result<()> {
158 ErrorCode::result_from(unsafe { 158 ErrorCode::result_from(unsafe {
159 libpam_sys::$pam_func((self as *mut Self).cast(), flags.bits()) 159 libpam_sys::$pam_func((self as *mut Self).cast(), flags.bits())
160 }) 160 })
161 } 161 }
162 }; 162 };
163 } 163 }
164 164
165 impl Transaction for LibPamHandle { 165 impl Transaction for LibPamHandle {
166 wrap!(fn authenticate { pam_authenticate }); 166 wrap!(fn authenticate(AuthnFlags) { pam_authenticate });
167 wrap!(fn account_management { pam_acct_mgmt }); 167 wrap!(fn account_management(AuthnFlags) { pam_acct_mgmt });
168 wrap!(fn change_authtok { pam_chauthtok }); 168 wrap!(fn change_authtok(AuthtokFlags) { pam_chauthtok });
169 } 169 }
170 170
171 // TODO: pam_setcred - app 171 // TODO: pam_setcred - app
172 // pam_open_session - app 172 // pam_open_session - app
173 // pam_close_session - app 173 // pam_close_session - app
231 impl<C: Conversation> Logger for LibPamTransaction<C> { 231 impl<C: Conversation> Logger for LibPamTransaction<C> {
232 delegate!(fn log(&self, level: Level, location: Location<'_>, entry: fmt::Arguments) -> ()); 232 delegate!(fn log(&self, level: Level, location: Location<'_>, entry: fmt::Arguments) -> ());
233 } 233 }
234 234
235 impl<C: Conversation> Transaction for LibPamTransaction<C> { 235 impl<C: Conversation> Transaction for LibPamTransaction<C> {
236 delegate!(fn authenticate(&mut self, flags: Flags) -> Result<()>); 236 delegate!(fn authenticate(&mut self, flags: AuthnFlags) -> Result<()>);
237 delegate!(fn account_management(&mut self, flags: Flags) -> Result<()>); 237 delegate!(fn account_management(&mut self, flags: AuthnFlags) -> Result<()>);
238 delegate!(fn change_authtok(&mut self, flags: Flags) -> Result<()>); 238 delegate!(fn change_authtok(&mut self, flags: AuthtokFlags) -> Result<()>);
239 } 239 }
240 240
241 impl<C: Conversation> PamShared for LibPamTransaction<C> { 241 impl<C: Conversation> PamShared for LibPamTransaction<C> {
242 delegate!(fn environ(&self) -> impl EnvironMap); 242 delegate!(fn environ(&self) -> impl EnvironMap);
243 delegate!(fn environ_mut(&mut self) -> impl EnvironMapMut); 243 delegate!(fn environ_mut(&mut self) -> impl EnvironMapMut);