Mercurial > crates > nonstick
annotate src/libpam/items.rs @ 171:e27c5c667a5a
Create full new types for return code and flags, separate end to end.
This plumbs the ReturnCode and RawFlags types through the places where
we call into or are called from PAM.
Also adds Sun documentation to the project.
author | Paul Fisher <paul@pfish.zone> |
---|---|
date | Fri, 25 Jul 2025 20:52:14 -0400 |
parents | a75a66cb4181 |
children | a1bb1d013567 |
rev | line source |
---|---|
146
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
1 use crate::constants::ErrorCode; |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
2 use crate::constants::Result; |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
3 use crate::items::{Items, ItemsMut}; |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
4 use crate::libpam::handle::ItemType; |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
5 use crate::libpam::handle::LibPamHandle; |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
6 use crate::libpam::memory; |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
7 use std::ffi::{c_int, OsStr, OsString}; |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
8 use std::ptr; |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
9 |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
10 pub struct LibPamItems<'a>(pub &'a LibPamHandle); |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
11 pub struct LibPamItemsMut<'a>(pub &'a mut LibPamHandle); |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
12 |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
13 /// Macro to implement getting/setting a CStr-based item. |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
14 macro_rules! cstr_item { |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
15 (get = $getter:ident, item = $item_type:path) => { |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
16 fn $getter(&self) -> Result<Option<OsString>> { |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
17 unsafe { get_cstr_item(&self.0, $item_type) } |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
18 } |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
19 }; |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
20 (set = $setter:ident, item = $item_type:path) => { |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
21 fn $setter(&mut self, value: Option<&OsStr>) -> Result<()> { |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
22 unsafe { set_cstr_item(&mut self.0, $item_type, value) } |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
23 } |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
24 }; |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
25 } |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
26 |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
27 impl Items<'_> for LibPamItems<'_> { |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
28 cstr_item!(get = user, item = ItemType::User); |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
29 cstr_item!(get = service, item = ItemType::Service); |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
30 cstr_item!(get = user_prompt, item = ItemType::UserPrompt); |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
31 cstr_item!(get = tty_name, item = ItemType::Tty); |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
32 cstr_item!(get = remote_user, item = ItemType::RemoteUser); |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
33 cstr_item!(get = remote_host, item = ItemType::RemoteHost); |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
34 } |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
35 |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
36 impl Items<'_> for LibPamItemsMut<'_> { |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
37 cstr_item!(get = user, item = ItemType::User); |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
38 cstr_item!(get = service, item = ItemType::Service); |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
39 cstr_item!(get = user_prompt, item = ItemType::UserPrompt); |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
40 cstr_item!(get = tty_name, item = ItemType::Tty); |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
41 cstr_item!(get = remote_user, item = ItemType::RemoteUser); |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
42 cstr_item!(get = remote_host, item = ItemType::RemoteHost); |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
43 } |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
44 |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
45 impl ItemsMut<'_> for LibPamItemsMut<'_> { |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
46 cstr_item!(set = set_user, item = ItemType::User); |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
47 cstr_item!(set = set_service, item = ItemType::Service); |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
48 cstr_item!(set = set_user_prompt, item = ItemType::UserPrompt); |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
49 cstr_item!(set = set_tty_name, item = ItemType::Tty); |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
50 cstr_item!(set = set_remote_user, item = ItemType::RemoteUser); |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
51 cstr_item!(set = set_remote_host, item = ItemType::RemoteHost); |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
52 cstr_item!(set = set_authtok, item = ItemType::AuthTok); |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
53 cstr_item!(set = set_old_authtok, item = ItemType::OldAuthTok); |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
54 } |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
55 |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
56 /// Gets a C string item. |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
57 /// |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
58 /// # Safety |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
59 /// |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
60 /// You better be requesting an item which is a C string. |
163
a75a66cb4181
Add end-to-end tests; fix issues found by tests.
Paul Fisher <paul@pfish.zone>
parents:
146
diff
changeset
|
61 pub unsafe fn get_cstr_item(hdl: &LibPamHandle, item_type: ItemType) -> Result<Option<OsString>> { |
146
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
62 let mut output = ptr::null(); |
163
a75a66cb4181
Add end-to-end tests; fix issues found by tests.
Paul Fisher <paul@pfish.zone>
parents:
146
diff
changeset
|
63 let ret = unsafe { libpam_sys::pam_get_item(hdl.inner(), item_type as c_int, &mut output) }; |
146
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
64 ErrorCode::result_from(ret)?; |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
65 Ok(memory::copy_pam_string(output.cast())) |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
66 } |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
67 |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
68 /// Sets a C string item. |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
69 /// |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
70 /// # Safety |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
71 /// |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
72 /// You better be setting an item which is a C string. |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
73 pub unsafe fn set_cstr_item( |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
74 hdl: &mut LibPamHandle, |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
75 item_type: ItemType, |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
76 data: Option<&OsStr>, |
163
a75a66cb4181
Add end-to-end tests; fix issues found by tests.
Paul Fisher <paul@pfish.zone>
parents:
146
diff
changeset
|
77 ) -> Result<()> { |
146
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
78 let data_str = memory::option_cstr_os(data); |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
79 let ret = unsafe { |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
80 libpam_sys::pam_set_item( |
163
a75a66cb4181
Add end-to-end tests; fix issues found by tests.
Paul Fisher <paul@pfish.zone>
parents:
146
diff
changeset
|
81 hdl.inner_mut(), |
146
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
82 item_type as c_int, |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
83 memory::prompt_ptr(data_str.as_deref()).cast(), |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
84 ) |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
85 }; |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
86 ErrorCode::result_from(ret) |
1bc52025156b
Split PAM items into their own separate struct.
Paul Fisher <paul@pfish.zone>
parents:
diff
changeset
|
87 } |