Mercurial > crates > nonstick
annotate src/macros.rs @ 48:a921b72743e4
Upgrade to Rust 2021 edition.
author | Paul Fisher <paul@pfish.zone> |
---|---|
date | Tue, 15 Apr 2025 01:04:29 -0400 |
parents | ce47901aab7a |
children |
rev | line source |
---|---|
22
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
1 /// Macro to generate the `extern "C"` entrypoint bindings needed by PAM |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
2 /// |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
3 /// You can call `pam_hooks!(SomeType);` for any type that implements `PamHooks` |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
4 /// |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
5 /// ## Examples: |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
6 /// |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
7 /// Here is full example of a PAM module that would authenticate and authorize everybody: |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
8 /// |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
9 /// ``` |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
10 /// #[macro_use] extern crate pam; |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
11 /// |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
12 /// use pam::module::{PamHooks, PamHandle}; |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
13 /// use pam::constants::{PamResultCode, PamFlag}; |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
14 /// use std::ffi::CStr; |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
15 /// |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
16 /// # fn main() {} |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
17 /// struct MyPamModule; |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
18 /// pam_hooks!(MyPamModule); |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
19 /// |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
20 /// impl PamHooks for MyPamModule { |
34 | 21 /// fn sm_authenticate(pamh: &mut PamHandle, args: Vec<&CStr>, flags: PamFlag) -> PamResultCode { |
22
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
22 /// println!("Everybody is authenticated!"); |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
23 /// PamResultCode::PAM_SUCCESS |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
24 /// } |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
25 /// |
34 | 26 /// fn acct_mgmt(pamh: &mut PamHandle, args: Vec<&CStr>, flags: PamFlag) -> PamResultCode { |
22
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
27 /// println!("Everybody is authorized!"); |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
28 /// PamResultCode::PAM_SUCCESS |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
29 /// } |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
30 /// } |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
31 /// ``` |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
32 #[macro_export] |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
33 macro_rules! pam_hooks { |
34 | 34 ($ident:ident) => { |
35 pub use self::pam_hooks_scope::*; | |
36 mod pam_hooks_scope { | |
37 use std::ffi::CStr; | |
38 use std::os::raw::{c_char, c_int}; | |
39 use $crate::constants::{PamFlag, PamResultCode}; | |
40 use $crate::module::{PamHandle, PamHooks}; | |
22
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
41 |
34 | 42 fn extract_argv<'a>(argc: c_int, argv: *const *const c_char) -> Vec<&'a CStr> { |
43 (0..argc) | |
44 .map(|o| unsafe { CStr::from_ptr(*argv.offset(o as isize) as *const c_char) }) | |
45 .collect() | |
46 } | |
22
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
47 |
34 | 48 #[no_mangle] |
49 pub extern "C" fn pam_sm_acct_mgmt( | |
50 pamh: &mut PamHandle, | |
51 flags: PamFlag, | |
52 argc: c_int, | |
53 argv: *const *const c_char, | |
54 ) -> PamResultCode { | |
55 let args = extract_argv(argc, argv); | |
56 super::$ident::acct_mgmt(pamh, args, flags) | |
57 } | |
22
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
58 |
34 | 59 #[no_mangle] |
60 pub extern "C" fn pam_sm_authenticate( | |
61 pamh: &mut PamHandle, | |
62 flags: PamFlag, | |
63 argc: c_int, | |
64 argv: *const *const c_char, | |
65 ) -> PamResultCode { | |
66 let args = extract_argv(argc, argv); | |
67 super::$ident::sm_authenticate(pamh, args, flags) | |
68 } | |
69 | |
70 #[no_mangle] | |
71 pub extern "C" fn pam_sm_chauthtok( | |
72 pamh: &mut PamHandle, | |
73 flags: PamFlag, | |
74 argc: c_int, | |
75 argv: *const *const c_char, | |
76 ) -> PamResultCode { | |
77 let args = extract_argv(argc, argv); | |
78 super::$ident::sm_chauthtok(pamh, args, flags) | |
79 } | |
22
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
80 |
34 | 81 #[no_mangle] |
82 pub extern "C" fn pam_sm_close_session( | |
83 pamh: &mut PamHandle, | |
84 flags: PamFlag, | |
85 argc: c_int, | |
86 argv: *const *const c_char, | |
87 ) -> PamResultCode { | |
88 let args = extract_argv(argc, argv); | |
89 super::$ident::sm_close_session(pamh, args, flags) | |
90 } | |
22
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
91 |
34 | 92 #[no_mangle] |
93 pub extern "C" fn pam_sm_open_session( | |
94 pamh: &mut PamHandle, | |
95 flags: PamFlag, | |
96 argc: c_int, | |
97 argv: *const *const c_char, | |
98 ) -> PamResultCode { | |
99 let args = extract_argv(argc, argv); | |
100 super::$ident::sm_open_session(pamh, args, flags) | |
101 } | |
22
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
102 |
34 | 103 #[no_mangle] |
104 pub extern "C" fn pam_sm_setcred( | |
105 pamh: &mut PamHandle, | |
106 flags: PamFlag, | |
107 argc: c_int, | |
108 argv: *const *const c_char, | |
109 ) -> PamResultCode { | |
110 let args = extract_argv(argc, argv); | |
111 super::$ident::sm_setcred(pamh, args, flags) | |
112 } | |
113 } | |
114 }; | |
115 } | |
22
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
116 |
34 | 117 #[macro_export] |
118 macro_rules! pam_try { | |
119 ($r:expr) => { | |
120 match $r { | |
121 Ok(t) => t, | |
122 Err(e) => return e, | |
123 } | |
124 }; | |
125 ($r:expr, $e:expr) => { | |
126 match $r { | |
127 Ok(t) => t, | |
128 Err(_) => return $e, | |
129 } | |
130 }; | |
22
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
131 } |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
132 |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
133 #[cfg(test)] |
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
134 pub mod test { |
48 | 135 use crate::module::PamHooks; |
22
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
136 |
34 | 137 struct Foo; |
138 impl PamHooks for Foo {} | |
22
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
139 |
34 | 140 pam_hooks!(Foo); |
141 } |