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;