Mercurial > crates > nonstick
comparison src/libpam/handle.rs @ 169:77470e45e397
Set up stuff to work the way Sun expects it to.
This sets up PAM to use pam_authtok_get.so on Sun machines.
| author | Paul Fisher <paul@pfish.zone> |
|---|---|
| date | Tue, 15 Jul 2025 01:32:21 -0400 |
| parents | 2f5913131295 |
| children | e27c5c667a5a |
comparison
equal
deleted
inserted
replaced
| 168:6642e89d29a2 | 169:77470e45e397 |
|---|---|
| 13 use libpam_sys_consts::constants; | 13 use libpam_sys_consts::constants; |
| 14 use num_enum::{IntoPrimitive, TryFromPrimitive}; | 14 use num_enum::{IntoPrimitive, TryFromPrimitive}; |
| 15 use std::any::TypeId; | 15 use std::any::TypeId; |
| 16 use std::cell::Cell; | 16 use std::cell::Cell; |
| 17 use std::ffi::{c_char, c_int, c_void, CString, OsStr, OsString}; | 17 use std::ffi::{c_char, c_int, c_void, CString, OsStr, OsString}; |
| 18 use std::mem::ManuallyDrop; | |
| 19 use std::os::unix::ffi::OsStrExt; | 18 use std::os::unix::ffi::OsStrExt; |
| 20 use std::ptr::NonNull; | 19 use std::ptr::NonNull; |
| 21 use std::{any, fmt, ptr}; | 20 use std::{any, fmt, ptr}; |
| 22 | 21 |
| 23 /// An owned PAM handle. | 22 /// An owned PAM handle. |
| 137 /// | 136 /// |
| 138 #[doc = man7!(3 pam_end)] | 137 #[doc = man7!(3 pam_end)] |
| 139 pub fn end_silent(self) { | 138 pub fn end_silent(self) { |
| 140 #[cfg(pam_impl = "LinuxPam")] | 139 #[cfg(pam_impl = "LinuxPam")] |
| 141 { | 140 { |
| 142 let mut me = ManuallyDrop::new(self); | 141 let mut me = std::mem::ManuallyDrop::new(self); |
| 143 me.end_internal(libpam_sys::PAM_DATA_SILENT); | 142 me.end_internal(libpam_sys::PAM_DATA_SILENT); |
| 144 } | 143 } |
| 145 // If it's not LinuxPam, we just drop normally. | 144 // If it's not LinuxPam, we just drop normally. |
| 146 } | 145 } |
| 147 | 146 |
| 492 // SAFETY: We got this string from PAM. | 491 // SAFETY: We got this string from PAM. |
| 493 unsafe { memory::copy_pam_string(output) }.ok_or(ErrorCode::ConversationError) | 492 unsafe { memory::copy_pam_string(output) }.ok_or(ErrorCode::ConversationError) |
| 494 } | 493 } |
| 495 | 494 |
| 496 #[cfg(pam_impl = "Sun")] | 495 #[cfg(pam_impl = "Sun")] |
| 497 fn get_authtok(&mut self, prompt: Option<&OsStr>, item_type: ItemType) -> Result<OsString> { | 496 fn get_authtok(&mut self, _prompt: Option<&OsStr>, item_type: ItemType) -> Result<OsString> { |
| 498 use crate::libpam::memory::CHeapString; | 497 unsafe { items::get_cstr_item(self, item_type) }?.ok_or(ErrorCode::ConversationError) |
| 499 use std::os::unix::ffi::OsStringExt; | |
| 500 // Sun's __pam_get_authtok function is a little weird and requires | |
| 501 // that you specify where you want the authtok to come from. | |
| 502 // First we see if there's an authtok already set. | |
| 503 let mut output: *mut c_char = ptr::null_mut(); | |
| 504 let result = unsafe { | |
| 505 libpam_sys::__pam_get_authtok( | |
| 506 self.inner_mut(), | |
| 507 libpam_sys::PAM_HANDLE, | |
| 508 item_type.into(), | |
| 509 ptr::null(), | |
| 510 &mut output, | |
| 511 ) | |
| 512 }; | |
| 513 let output = unsafe { CHeapString::from_ptr(output) }; | |
| 514 if result == libpam_sys::PAM_SUCCESS { | |
| 515 if let Some(output) = output { | |
| 516 return Ok(OsString::from_vec(output.to_bytes().into())); | |
| 517 } | |
| 518 } | |
| 519 drop(output); | |
| 520 let mut output: *mut c_char = ptr::null_mut(); | |
| 521 let prompt = memory::option_cstr_os(prompt); | |
| 522 let result = unsafe { | |
| 523 libpam_sys::__pam_get_authtok( | |
| 524 self.inner_mut(), | |
| 525 libpam_sys::PAM_PROMPT, | |
| 526 item_type.into(), | |
| 527 memory::prompt_ptr(prompt.as_deref()), | |
| 528 &mut output, | |
| 529 ) | |
| 530 }; | |
| 531 let output = unsafe { CHeapString::from_ptr(output) }; | |
| 532 ErrorCode::result_from(result)?; | |
| 533 output | |
| 534 .map(|s| OsString::from_vec(s.to_bytes().into())) | |
| 535 .ok_or(ErrorCode::ConversationError) | |
| 536 } | 498 } |
| 537 | 499 |
| 538 /// Gets the `PAM_CONV` item from the handle. | 500 /// Gets the `PAM_CONV` item from the handle. |
| 539 fn conversation_item(&self) -> Result<&PamConv> { | 501 fn conversation_item(&self) -> Result<&PamConv> { |
| 540 let mut output: *const c_void = ptr::null(); | 502 let mut output: *const c_void = ptr::null(); |
