Mercurial > crates > nonstick
comparison src/pam_ffi/mod.rs @ 72:47eb242a4f88
Fill out the PamHandle trait.
This updates the PamHandle trait to have methods for each Item,
and implements them on the LibPamHandle.
| author | Paul Fisher <paul@pfish.zone> |
|---|---|
| date | Wed, 04 Jun 2025 03:53:36 -0400 |
| parents | 58f9d2a4df38 |
| children | ac6881304c78 |
comparison
equal
deleted
inserted
replaced
| 71:58f9d2a4df38 | 72:47eb242a4f88 |
|---|---|
| 3 //! This includes the functions provided by PAM and the data structures | 3 //! This includes the functions provided by PAM and the data structures |
| 4 //! used by PAM, as well as a few low-level abstractions for dealing with | 4 //! used by PAM, as well as a few low-level abstractions for dealing with |
| 5 //! those data structures. | 5 //! those data structures. |
| 6 //! | 6 //! |
| 7 //! Everything in here is hazmat. | 7 //! Everything in here is hazmat. |
| 8 //! | 8 //! |
| 9 | 9 |
| 10 #![allow(dead_code)] | 10 #![allow(dead_code)] |
| 11 | 11 |
| 12 pub mod memory; | 12 pub mod memory; |
| 13 mod message; | 13 mod message; |
| 14 mod response; | 14 mod response; |
| 15 | 15 |
| 16 use crate::pam_ffi::memory::Immovable; | 16 use crate::pam_ffi::memory::Immovable; |
| 17 use crate::pam_ffi::message::OwnedMessages; | 17 use crate::pam_ffi::message::OwnedMessages; |
| 18 #[doc(inline)] | |
| 18 pub use message::Message; | 19 pub use message::Message; |
| 20 #[doc(inline)] | |
| 19 pub use response::RawResponse; | 21 pub use response::RawResponse; |
| 20 use std::ffi::{c_char, c_int, c_void}; | 22 use std::ffi::{c_char, c_int, c_void}; |
| 21 | 23 |
| 22 /// An opaque structure that a PAM handle points to. | 24 /// An opaque structure that a PAM handle points to. |
| 23 #[repr(C)] | 25 #[repr(C)] |
| 24 pub struct Handle { | 26 pub struct LibPamHandle { |
| 25 _data: (), | 27 _data: (), |
| 26 _marker: Immovable, | 28 _marker: Immovable, |
| 27 } | 29 } |
| 28 | 30 |
| 29 /// An opaque structure that is passed through PAM in a conversation. | 31 /// An opaque structure that is passed through PAM in a conversation. |
| 41 /// [`OwnedMessages`](super::OwnedMessages). | 43 /// [`OwnedMessages`](super::OwnedMessages). |
| 42 /// - `responses` is a pointer to an array of [`RawResponse`]s, | 44 /// - `responses` is a pointer to an array of [`RawResponse`]s, |
| 43 /// which PAM sets in response to a module's request. | 45 /// which PAM sets in response to a module's request. |
| 44 /// This is an array of structs, not an array of pointers to a struct. | 46 /// This is an array of structs, not an array of pointers to a struct. |
| 45 /// There should always be exactly as many `responses` as `num_msg`. | 47 /// There should always be exactly as many `responses` as `num_msg`. |
| 46 /// - `appdata` is the `appdata` field of the [`Conversation`] we were passed. | 48 /// - `appdata` is the `appdata` field of the [`LibPamConversation`] we were passed. |
| 47 pub type ConversationCallback = extern "C" fn( | 49 pub type ConversationCallback = extern "C" fn( |
| 48 num_msg: c_int, | 50 num_msg: c_int, |
| 49 messages: &OwnedMessages, | 51 messages: &OwnedMessages, |
| 50 responses: &mut *mut RawResponse, | 52 responses: &mut *mut RawResponse, |
| 51 appdata: *const AppData, | 53 appdata: *const AppData, |
| 52 ) -> c_int; | 54 ) -> c_int; |
| 53 | 55 |
| 54 /// A callback and the associated [`AppData`] pointer that needs to be passed back to it. | 56 /// The type used by libpam to call back into a conversation. |
| 55 #[repr(C)] | 57 #[repr(C)] |
| 56 pub struct Conversation { | 58 pub struct LibPamConversation { |
| 59 /// The function that is called to get information from the user. | |
| 57 callback: ConversationCallback, | 60 callback: ConversationCallback, |
| 61 /// The pointer that will be passed as the last parameter | |
| 62 /// to the conversation callback. | |
| 58 appdata: *const AppData, | 63 appdata: *const AppData, |
| 59 } | 64 } |
| 60 | 65 |
| 61 #[link(name = "pam")] | 66 #[link(name = "pam")] |
| 62 extern "C" { | 67 extern "C" { |
| 63 pub fn pam_get_data( | 68 pub fn pam_get_data( |
| 64 pamh: *const Handle, | 69 pamh: *const LibPamHandle, |
| 65 module_data_name: *const c_char, | 70 module_data_name: *const c_char, |
| 66 data: &mut *const c_void, | 71 data: &mut *const c_void, |
| 67 ) -> c_int; | 72 ) -> c_int; |
| 68 | 73 |
| 69 pub fn pam_set_data( | 74 pub fn pam_set_data( |
| 70 pamh: *mut Handle, | 75 pamh: *mut LibPamHandle, |
| 71 module_data_name: *const c_char, | 76 module_data_name: *const c_char, |
| 72 data: *const c_void, | 77 data: *const c_void, |
| 73 cleanup: extern "C" fn(pamh: *const c_void, data: *mut c_void, error_status: c_int), | 78 cleanup: extern "C" fn(pamh: *const c_void, data: *mut c_void, error_status: c_int), |
| 74 ) -> c_int; | 79 ) -> c_int; |
| 75 | 80 |
| 76 pub fn pam_get_item(pamh: *const Handle, item_type: c_int, item: &mut *const c_void) -> c_int; | 81 pub fn pam_get_item( |
| 82 pamh: *mut LibPamHandle, | |
| 83 item_type: c_int, | |
| 84 item: &mut *const c_void, | |
| 85 ) -> c_int; | |
| 77 | 86 |
| 78 pub fn pam_set_item(pamh: *mut Handle, item_type: c_int, item: *const c_void) -> c_int; | 87 pub fn pam_set_item(pamh: *mut LibPamHandle, item_type: c_int, item: *const c_void) -> c_int; |
| 79 | 88 |
| 80 pub fn pam_get_user( | 89 pub fn pam_get_user( |
| 81 pamh: *const Handle, | 90 pamh: *mut LibPamHandle, |
| 82 user: &mut *const c_char, | 91 user: &mut *const c_char, |
| 83 prompt: *const c_char, | 92 prompt: *const c_char, |
| 84 ) -> c_int; | 93 ) -> c_int; |
| 85 | 94 |
| 86 pub fn pam_get_authtok( | 95 pub fn pam_get_authtok( |
| 87 pamh: *const Handle, | 96 pamh: *mut LibPamHandle, |
| 88 item_type: c_int, | 97 item_type: c_int, |
| 89 data: &mut *const c_char, | 98 data: &mut *const c_char, |
| 90 prompt: *const c_char, | 99 prompt: *const c_char, |
| 91 ) -> c_int; | 100 ) -> c_int; |
| 92 | 101 |
| 93 pub fn pam_end(pamh: *mut Handle, status: c_int) -> c_int; | 102 pub fn pam_end(pamh: *mut LibPamHandle, status: c_int) -> c_int; |
| 94 } | 103 } |
