comparison pam/src/macros.rs @ 22:4263c1d83d5b

Refactor PamHooks into modules mod
author Anthony Nowell <anthony@algorithmia.com>
date Tue, 26 Sep 2017 02:30:03 -0600
parents
children ec70822cbdef
comparison
equal deleted inserted replaced
21:aa7e8bd083ef 22:4263c1d83d5b
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] extern crate pam;
11 ///
12 /// use pam::module::{PamHooks, PamHandle};
13 /// use pam::constants::{PamResultCode, PamFlag};
14 /// use std::ffi::CStr;
15 ///
16 /// # fn main() {}
17 /// struct MyPamModule;
18 /// pam_hooks!(MyPamModule);
19 ///
20 /// impl PamHooks for MyPamModule {
21 /// fn sm_authenticate(pamh: &PamHandle, args: Vec<&CStr>, flags: PamFlag) -> PamResultCode {
22 /// println!("Everybody is authenticated!");
23 /// PamResultCode::PAM_SUCCESS
24 /// }
25 ///
26 /// fn acct_mgmt(pamh: &PamHandle, args: Vec<&CStr>, flags: PamFlag) -> PamResultCode {
27 /// println!("Everybody is authorized!");
28 /// PamResultCode::PAM_SUCCESS
29 /// }
30 /// }
31 /// ```
32 #[macro_export]
33 macro_rules! pam_hooks {
34 ($ident:ident) => (
35 pub use self::pam_hooks_scope::*;
36 mod pam_hooks_scope {
37 use $crate::module::{PamHandle, PamHooks};
38 use $crate::constants::{PamFlag, PamResultCode};
39 use std::ffi::CStr;
40 use std::os::raw::{c_char, c_int};
41
42 fn extract_argv<'a>(argc: c_int, argv: *const *const c_char) -> Vec<&'a CStr> {
43 (0..argc)
44 .map(|o| unsafe {
45 CStr::from_ptr(*argv.offset(o as isize) as *const c_char)
46 })
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 }
118
119 #[cfg(test)]
120 pub mod test {
121 use module::PamHooks;
122
123 struct Foo;
124 impl PamHooks for Foo {}
125
126 pam_hooks!(Foo);
127 }