Mercurial > crates > nonstick
diff src/macros.rs @ 56:daa2cde64601
Big big refactor. Probably should have been multiple changes.
- Makes FFI safer by explicitly specifying c_int in calls.
- Uses ToPrimitive/FromPrimitive to make this easier.
- Pulls PamFlag variables into a bitflags! struct.
- Pulls PamMessageStyle variables into an enum.
- Renames ResultCode to ErrorCode.
- Switches from PAM_SUCCESS to using a Result<(), ErrorCode>.
- Uses thiserror to make ErrorCode into an Error.
- Gets rid of pam_try! because now we have Results.
- Expands some names (e.g. Conv to Conversation).
- Adds more doc comments.
- Returns passwords as a SecureString, to avoid unnecessarily
keeping it around in memory.
author | Paul Fisher <paul@pfish.zone> |
---|---|
date | Sun, 04 May 2025 02:56:55 -0400 |
parents | a921b72743e4 |
children | 3f4a77aa88be |
line wrap: on
line diff
--- a/src/macros.rs Sun May 04 00:58:04 2025 -0400 +++ b/src/macros.rs Sun May 04 02:56:55 2025 -0400 @@ -7,10 +7,10 @@ /// Here is full example of a PAM module that would authenticate and authorize everybody: /// /// ``` -/// #[macro_use] extern crate pam; +/// #[macro_use] extern crate nonstick; /// -/// use pam::module::{PamHooks, PamHandle}; -/// use pam::constants::{PamResultCode, PamFlag}; +/// use nonstick::module::{PamHooks, PamHandle}; +/// use nonstick::constants::{PamResult, Flags}; /// use std::ffi::CStr; /// /// # fn main() {} @@ -18,14 +18,14 @@ /// pam_hooks!(MyPamModule); /// /// impl PamHooks for MyPamModule { -/// fn sm_authenticate(pamh: &mut PamHandle, args: Vec<&CStr>, flags: PamFlag) -> PamResultCode { -/// println!("Everybody is authenticated!"); -/// PamResultCode::PAM_SUCCESS +/// fn acct_mgmt(pamh: &mut PamHandle, args: Vec<&CStr>, flags: Flags) -> PamResult<()> { +/// println!("Everybody is authorized!"); +/// Ok(()) /// } /// -/// fn acct_mgmt(pamh: &mut PamHandle, args: Vec<&CStr>, flags: PamFlag) -> PamResultCode { -/// println!("Everybody is authorized!"); -/// PamResultCode::PAM_SUCCESS +/// fn sm_authenticate(pamh: &mut PamHandle, args: Vec<&CStr>, flags: Flags) -> PamResult<()> { +/// println!("Everybody is authenticated!"); +/// Ok(()) /// } /// } /// ``` @@ -36,7 +36,7 @@ mod pam_hooks_scope { use std::ffi::CStr; use std::os::raw::{c_char, c_int}; - use $crate::constants::{PamFlag, PamResultCode}; + use $crate::constants::{Flags, ErrorCode}; use $crate::module::{PamHandle, PamHooks}; fn extract_argv<'a>(argc: c_int, argv: *const *const c_char) -> Vec<&'a CStr> { @@ -48,88 +48,72 @@ #[no_mangle] pub extern "C" fn pam_sm_acct_mgmt( pamh: &mut PamHandle, - flags: PamFlag, + flags: Flags, argc: c_int, argv: *const *const c_char, - ) -> PamResultCode { + ) -> c_int { let args = extract_argv(argc, argv); - super::$ident::acct_mgmt(pamh, args, flags) + ErrorCode::result_to_c(super::$ident::acct_mgmt(pamh, args, flags)) } #[no_mangle] pub extern "C" fn pam_sm_authenticate( pamh: &mut PamHandle, - flags: PamFlag, + flags: Flags, argc: c_int, argv: *const *const c_char, - ) -> PamResultCode { + ) -> c_int { let args = extract_argv(argc, argv); - super::$ident::sm_authenticate(pamh, args, flags) + ErrorCode::result_to_c(super::$ident::sm_authenticate(pamh, args, flags)) } #[no_mangle] pub extern "C" fn pam_sm_chauthtok( pamh: &mut PamHandle, - flags: PamFlag, + flags: Flags, argc: c_int, argv: *const *const c_char, - ) -> PamResultCode { + ) -> c_int { let args = extract_argv(argc, argv); - super::$ident::sm_chauthtok(pamh, args, flags) + ErrorCode::result_to_c(super::$ident::sm_chauthtok(pamh, args, flags)) } #[no_mangle] pub extern "C" fn pam_sm_close_session( pamh: &mut PamHandle, - flags: PamFlag, + flags: Flags, argc: c_int, argv: *const *const c_char, - ) -> PamResultCode { + ) -> c_int { let args = extract_argv(argc, argv); - super::$ident::sm_close_session(pamh, args, flags) + ErrorCode::result_to_c(super::$ident::sm_close_session(pamh, args, flags)) } #[no_mangle] pub extern "C" fn pam_sm_open_session( pamh: &mut PamHandle, - flags: PamFlag, + flags: Flags, argc: c_int, argv: *const *const c_char, - ) -> PamResultCode { + ) -> c_int { let args = extract_argv(argc, argv); - super::$ident::sm_open_session(pamh, args, flags) + ErrorCode::result_to_c(super::$ident::sm_open_session(pamh, args, flags)) } #[no_mangle] pub extern "C" fn pam_sm_setcred( pamh: &mut PamHandle, - flags: PamFlag, + flags: Flags, argc: c_int, argv: *const *const c_char, - ) -> PamResultCode { + ) -> c_int { let args = extract_argv(argc, argv); - super::$ident::sm_setcred(pamh, args, flags) + ErrorCode::result_to_c(super::$ident::sm_setcred(pamh, args, flags)) } } }; } -#[macro_export] -macro_rules! pam_try { - ($r:expr) => { - match $r { - Ok(t) => t, - Err(e) => return e, - } - }; - ($r:expr, $e:expr) => { - match $r { - Ok(t) => t, - Err(_) => return $e, - } - }; -} - #[cfg(test)] pub mod test { use crate::module::PamHooks;