pam_kanidm/pam/
macros.rs

1/// Macro to generate the `extern "C"` entrypoint bindings needed by PAM
2///
3/// You can call `pam_hooks!(SomeType);` for any type that implements `PamHooks`
4///
5/// ## Examples:
6///
7/// Here is full example of a PAM module that would authenticate and authorize everybody:
8///
9/// ```
10/// #[macro_use]
11/// extern crate pam;
12///
13/// use pam::constants::{PamFlag, PamResultCode};
14/// use pam::module::{PamHandle, PamHooks};
15/// use std::ffi::CStr;
16///
17/// # fn main() {}
18/// struct MyPamModule;
19/// pam_hooks!(MyPamModule);
20///
21/// impl PamHooks for MyPamModule {
22///     fn sm_authenticate(pamh: &PamHandle, args: Vec<&CStr>, flags: PamFlag) -> PamResultCode {
23///         println!("Everybody is authenticated!");
24///         PamResultCode::PAM_SUCCESS
25///     }
26///
27///     fn acct_mgmt(pamh: &PamHandle, args: Vec<&CStr>, flags: PamFlag) -> PamResultCode {
28///         println!("Everybody is authorized!");
29///         PamResultCode::PAM_SUCCESS
30///     }
31/// }
32/// ```
33#[macro_export]
34macro_rules! pam_hooks {
35    ($ident:ident) => {
36        pub use self::pam_hooks_scope::*;
37        mod pam_hooks_scope {
38            use std::ffi::CStr;
39            use std::os::raw::{c_char, c_int};
40
41            use $crate::pam::constants::{PamFlag, PamResultCode};
42            use $crate::pam::module::{PamHandle, PamHooks};
43
44            fn extract_argv<'a>(argc: c_int, argv: *const *const c_char) -> Vec<&'a CStr> {
45                (0..argc)
46                    .map(|o| unsafe { CStr::from_ptr(*argv.offset(o as isize) as *const c_char) })
47                    .collect()
48            }
49
50            #[no_mangle]
51            pub extern "C" fn pam_sm_acct_mgmt(
52                pamh: &PamHandle,
53                flags: PamFlag,
54                argc: c_int,
55                argv: *const *const c_char,
56            ) -> PamResultCode {
57                let args = extract_argv(argc, argv);
58                super::$ident::acct_mgmt(pamh, args, flags)
59            }
60
61            #[no_mangle]
62            pub extern "C" fn pam_sm_authenticate(
63                pamh: &PamHandle,
64                flags: PamFlag,
65                argc: c_int,
66                argv: *const *const c_char,
67            ) -> PamResultCode {
68                let args = extract_argv(argc, argv);
69                super::$ident::sm_authenticate(pamh, args, flags)
70            }
71
72            #[no_mangle]
73            pub extern "C" fn pam_sm_chauthtok(
74                pamh: &PamHandle,
75                flags: PamFlag,
76                argc: c_int,
77                argv: *const *const c_char,
78            ) -> PamResultCode {
79                let args = extract_argv(argc, argv);
80                super::$ident::sm_chauthtok(pamh, args, flags)
81            }
82
83            #[no_mangle]
84            pub extern "C" fn pam_sm_close_session(
85                pamh: &PamHandle,
86                flags: PamFlag,
87                argc: c_int,
88                argv: *const *const c_char,
89            ) -> PamResultCode {
90                let args = extract_argv(argc, argv);
91                super::$ident::sm_close_session(pamh, args, flags)
92            }
93
94            #[no_mangle]
95            pub extern "C" fn pam_sm_open_session(
96                pamh: &PamHandle,
97                flags: PamFlag,
98                argc: c_int,
99                argv: *const *const c_char,
100            ) -> PamResultCode {
101                let args = extract_argv(argc, argv);
102                super::$ident::sm_open_session(pamh, args, flags)
103            }
104
105            #[no_mangle]
106            pub extern "C" fn pam_sm_setcred(
107                pamh: &PamHandle,
108                flags: PamFlag,
109                argc: c_int,
110                argv: *const *const c_char,
111            ) -> PamResultCode {
112                let args = extract_argv(argc, argv);
113                super::$ident::sm_setcred(pamh, args, flags)
114            }
115        }
116    };
117}