comparison src/libpam/handle.rs @ 90:f6186e41399b

Miscellaneous fixes and cleanup: - Rename `get_user` to `username` and `get_authtok` to `authtok`. - Use pam_strerror for error messages. - Add library linkage to build.rs (it was missing???).
author Paul Fisher <paul@pfish.zone>
date Sat, 14 Jun 2025 09:30:16 -0400
parents 5aa1a010f1e8
children 5ddbcada30f2
comparison
equal deleted inserted replaced
89:dd3e9c4bcde3 90:f6186e41399b
6 use crate::libpam::{memory, pam_ffi}; 6 use crate::libpam::{memory, pam_ffi};
7 use crate::{Conversation, PamHandleModule}; 7 use crate::{Conversation, PamHandleModule};
8 use num_enum::{IntoPrimitive, TryFromPrimitive}; 8 use num_enum::{IntoPrimitive, TryFromPrimitive};
9 use std::cell::Cell; 9 use std::cell::Cell;
10 use std::ffi::{c_char, c_int}; 10 use std::ffi::{c_char, c_int};
11 use std::marker::PhantomData;
11 use std::ops::{Deref, DerefMut}; 12 use std::ops::{Deref, DerefMut};
12 use std::ptr; 13 use std::ptr;
13 14
14 struct HandleWrap(*mut LibPamHandle); 15 struct HandleWrap(*mut LibPamHandle);
15 16
25 unsafe { &mut *self.0 } 26 unsafe { &mut *self.0 }
26 } 27 }
27 } 28 }
28 29
29 /// An owned PAM handle. 30 /// An owned PAM handle.
30 pub struct OwnedLibPamHandle { 31 pub struct OwnedLibPamHandle<'a> {
31 handle: HandleWrap, 32 handle: HandleWrap,
32 last_return: Cell<Result<()>>, 33 last_return: Cell<Result<()>>,
34 _conversation_lifetime: PhantomData<&'a mut ()>,
33 } 35 }
34 36
35 // TODO: pam_authenticate - app 37 // TODO: pam_authenticate - app
36 // pam_setcred - app 38 // pam_setcred - app
37 // pam_acct_mgmt - app 39 // pam_acct_mgmt - app
40 // pam_close_session - app 42 // pam_close_session - app
41 // pam_putenv - shared 43 // pam_putenv - shared
42 // pam_getenv - shared 44 // pam_getenv - shared
43 // pam_getenvlist - shared 45 // pam_getenvlist - shared
44 46
45 impl Drop for OwnedLibPamHandle { 47 impl Drop for OwnedLibPamHandle<'_> {
46 /// Closes the PAM session on an owned PAM handle. 48 /// Closes the PAM session on an owned PAM handle.
47 /// 49 ///
48 /// See the [`pam_end` manual page][man] for more information. 50 /// See the [`pam_end` manual page][man] for more information.
49 /// 51 ///
50 /// [man]: https://www.man7.org/linux/man-pages/man3/pam_end.3.html 52 /// [man]: https://www.man7.org/linux/man-pages/man3/pam_end.3.html
70 } 72 }
71 }; 73 };
72 } 74 }
73 75
74 impl PamShared for LibPamHandle { 76 impl PamShared for LibPamHandle {
75 fn get_user(&mut self, prompt: Option<&str>) -> Result<&str> { 77 fn username(&mut self, prompt: Option<&str>) -> Result<&str> {
76 let prompt = memory::option_cstr(prompt)?; 78 let prompt = memory::option_cstr(prompt)?;
77 let mut output: *const c_char = ptr::null(); 79 let mut output: *const c_char = ptr::null();
78 let ret = unsafe { 80 let ret = unsafe {
79 pam_ffi::pam_get_user(self, &mut output, memory::prompt_ptr(prompt.as_ref())) 81 pam_ffi::pam_get_user(self, &mut output, memory::prompt_ptr(prompt.as_ref()))
80 }; 82 };
112 } 114 }
113 } 115 }
114 } 116 }
115 117
116 impl PamHandleModule for LibPamHandle { 118 impl PamHandleModule for LibPamHandle {
117 fn get_authtok(&mut self, prompt: Option<&str>) -> Result<&str> { 119 fn authtok(&mut self, prompt: Option<&str>) -> Result<&str> {
118 let prompt = memory::option_cstr(prompt)?; 120 let prompt = memory::option_cstr(prompt)?;
119 let mut output: *const c_char = ptr::null_mut(); 121 let mut output: *const c_char = ptr::null_mut();
120 // SAFETY: We're calling this with known-good values. 122 // SAFETY: We're calling this with known-good values.
121 let res = unsafe { 123 let res = unsafe {
122 pam_ffi::pam_get_authtok( 124 pam_ffi::pam_get_authtok(
219 221
220 fn split<T>(result: &Result<T>) -> Result<()> { 222 fn split<T>(result: &Result<T>) -> Result<()> {
221 result.as_ref().map(drop).map_err(|&e| e) 223 result.as_ref().map(drop).map_err(|&e| e)
222 } 224 }
223 225
224 impl PamShared for OwnedLibPamHandle { 226 impl PamShared for OwnedLibPamHandle<'_> {
225 delegate!(fn get_user(&mut self, prompt: Option<&str>) -> Result<&str>); 227 delegate!(fn username(&mut self, prompt: Option<&str>) -> Result<&str>);
226 delegate!(get = user_item, set = set_user_item); 228 delegate!(get = user_item, set = set_user_item);
227 delegate!(get = service, set = set_service); 229 delegate!(get = service, set = set_service);
228 delegate!(get = user_prompt, set = set_user_prompt); 230 delegate!(get = user_prompt, set = set_user_prompt);
229 delegate!(get = tty_name, set = set_tty_name); 231 delegate!(get = tty_name, set = set_tty_name);
230 delegate!(get = remote_user, set = set_remote_user); 232 delegate!(get = remote_user, set = set_remote_user);