Mercurial > crates > nonstick
comparison src/libpam/handle.rs @ 157:0099f2f79f86
Switch logging interface to accept fmt::Arguments.
This means that we don't have to format arguments eagerly when logging;
an implementation could choose to discard them if it wanted to, avoiding
allocations and expensive format calls.
| author | Paul Fisher <paul@pfish.zone> |
|---|---|
| date | Wed, 09 Jul 2025 16:59:30 -0400 |
| parents | 66e662cde087 |
| children | 634cd5f2ac8b |
comparison
equal
deleted
inserted
replaced
| 156:66e662cde087 | 157:0099f2f79f86 |
|---|---|
| 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; | 18 use std::mem::ManuallyDrop; |
| 19 use std::os::unix::ffi::OsStrExt; | 19 use std::os::unix::ffi::OsStrExt; |
| 20 use std::ptr; | |
| 21 use std::ptr::NonNull; | 20 use std::ptr::NonNull; |
| 21 use std::{fmt, ptr}; | |
| 22 | 22 |
| 23 /// An owned PAM handle. | 23 /// An owned PAM handle. |
| 24 pub struct LibPamTransaction<C: Conversation> { | 24 pub struct LibPamTransaction<C: Conversation> { |
| 25 /// The handle itself. | 25 /// The handle itself. |
| 26 handle: ManuallyDrop<LibPamHandle>, | 26 handle: ManuallyDrop<LibPamHandle>, |
| 221 delegate!(fn account_management(&mut self, flags: Flags) -> Result<()>); | 221 delegate!(fn account_management(&mut self, flags: Flags) -> Result<()>); |
| 222 delegate!(fn change_authtok(&mut self, flags: Flags) -> Result<()>); | 222 delegate!(fn change_authtok(&mut self, flags: Flags) -> Result<()>); |
| 223 } | 223 } |
| 224 | 224 |
| 225 impl<C: Conversation> PamShared for LibPamTransaction<C> { | 225 impl<C: Conversation> PamShared for LibPamTransaction<C> { |
| 226 delegate!(fn log(&self, level: Level, location: Location<'_>, entry: &str) -> ()); | 226 delegate!(fn log(&self, level: Level, location: Location<'_>, entry: fmt::Arguments) -> ()); |
| 227 delegate!(fn environ(&self) -> impl EnvironMap); | 227 delegate!(fn environ(&self) -> impl EnvironMap); |
| 228 delegate!(fn environ_mut(&mut self) -> impl EnvironMapMut); | 228 delegate!(fn environ_mut(&mut self) -> impl EnvironMapMut); |
| 229 delegate!(fn username(&mut self, prompt: Option<&OsStr>) -> Result<OsString>); | 229 delegate!(fn username(&mut self, prompt: Option<&OsStr>) -> Result<OsString>); |
| 230 delegate!(fn items(&self) -> impl Items); | 230 delegate!(fn items(&self) -> impl Items); |
| 231 delegate!(fn items_mut(&mut self) -> impl ItemsMut); | 231 delegate!(fn items_mut(&mut self) -> impl ItemsMut); |
| 320 unsafe { libpam_sys::pam_end(self.0.as_mut(), 0) }; | 320 unsafe { libpam_sys::pam_end(self.0.as_mut(), 0) }; |
| 321 } | 321 } |
| 322 } | 322 } |
| 323 | 323 |
| 324 impl PamShared for LibPamHandle { | 324 impl PamShared for LibPamHandle { |
| 325 fn log(&self, level: Level, loc: Location<'_>, entry: &str) { | 325 fn log(&self, level: Level, loc: Location<'_>, entry: fmt::Arguments) { |
| 326 let entry = match CString::new(entry).or_else(|_| CString::new(dbg!(entry))) { | 326 let entry = match CString::new(entry.to_string()).ok() { |
| 327 Ok(cstr) => cstr, | 327 Some(e) => e, |
| 328 _ => return, | 328 None => return, |
| 329 }; | 329 }; |
| 330 #[cfg(pam_impl = "LinuxPam")] | 330 #[cfg(pam_impl = "LinuxPam")] |
| 331 { | 331 { |
| 332 let level = match level { | 332 let level = match level { |
| 333 Level::Error => libc::LOG_ERR, | 333 Level::Error => libc::LOG_ERR, |
| 334 Level::Warning => libc::LOG_WARNING, | 334 Level::Warn => libc::LOG_WARNING, |
| 335 Level::Info => libc::LOG_INFO, | 335 Level::Info => libc::LOG_INFO, |
| 336 Level::Debug => libc::LOG_DEBUG, | 336 Level::Debug => libc::LOG_DEBUG, |
| 337 }; | 337 }; |
| 338 _ = loc; | 338 _ = loc; |
| 339 // SAFETY: We're calling this function with a known value. | 339 // SAFETY: We're calling this function with a known value. |
| 340 unsafe { | 340 unsafe { |
| 341 libpam_sys::pam_syslog(self.raw_ref(), level, "%s\0".as_ptr().cast(), entry.as_ptr()) | 341 libpam_sys::pam_syslog( |
| 342 self.raw_ref(), | |
| 343 level, | |
| 344 b"%s\0".as_ptr().cast(), | |
| 345 entry.as_ptr(), | |
| 346 ) | |
| 342 } | 347 } |
| 343 } | 348 } |
| 344 #[cfg(pam_impl = "OpenPam")] | 349 #[cfg(pam_impl = "OpenPam")] |
| 345 { | 350 { |
| 346 let func = CString::new(loc.function).unwrap_or(CString::default()); | 351 let func = CString::new(loc.function).unwrap_or(CString::default()); |
| 347 let level = match level { | 352 let level = match level { |
| 348 Level::Error => libpam_sys::PAM_LOG_ERROR, | 353 Level::Error => libpam_sys::PAM_LOG_ERROR, |
| 349 Level::Warning => libpam_sys::PAM_LOG_NOTICE, | 354 Level::Warn => libpam_sys::PAM_LOG_NOTICE, |
| 350 Level::Info => libpam_sys::PAM_LOG_VERBOSE, | 355 Level::Info => libpam_sys::PAM_LOG_VERBOSE, |
| 351 Level::Debug => libpam_sys::PAM_LOG_DEBUG, | 356 Level::Debug => libpam_sys::PAM_LOG_DEBUG, |
| 352 }; | 357 }; |
| 353 // SAFETY: We're calling this function with a known value. | 358 // SAFETY: We're calling this function with a known value. |
| 354 unsafe { | 359 unsafe { |
| 355 libpam_sys::_openpam_log( | 360 libpam_sys::_openpam_log( |
| 356 level as c_int, | 361 level as c_int, |
| 357 func.as_ptr(), | 362 func.as_ptr(), |
| 358 "%s\0".as_ptr().cast(), | 363 b"%s\0".as_ptr().cast(), |
| 359 entry.as_ptr(), | 364 entry.as_ptr(), |
| 360 ) | 365 ) |
| 361 } | 366 } |
| 362 } | 367 } |
| 363 } | 368 } |
