Mercurial > crates > nonstick
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 } |
