Mercurial > crates > nonstick
comparison src/module.rs @ 71:58f9d2a4df38
Reorganize everything again???
- Splits ffi/memory stuff into a bunch of stuff in the pam_ffi module.
- Builds infrastructure for passing Messages and Responses.
- Adds tests for some things at least.
author | Paul Fisher <paul@pfish.zone> |
---|---|
date | Tue, 03 Jun 2025 21:54:58 -0400 |
parents | 9f8381a1c09c |
children | 47eb242a4f88 |
comparison
equal
deleted
inserted
replaced
70:9f8381a1c09c | 71:58f9d2a4df38 |
---|---|
3 // Temporarily allowed until we get the actual conversation functions hooked up. | 3 // Temporarily allowed until we get the actual conversation functions hooked up. |
4 #![allow(dead_code)] | 4 #![allow(dead_code)] |
5 | 5 |
6 use crate::constants::{ErrorCode, Flags, Result}; | 6 use crate::constants::{ErrorCode, Flags, Result}; |
7 use crate::conv::BinaryData; | 7 use crate::conv::BinaryData; |
8 use crate::conv::{Conversation, Message, Response}; | 8 use crate::conv::{Conversation, Response}; |
9 use crate::handle::PamModuleHandle; | 9 use crate::handle::PamModuleHandle; |
10 use crate::pam_ffi::Message; | |
10 use secure_string::SecureString; | 11 use secure_string::SecureString; |
11 use std::ffi::CStr; | 12 use std::ffi::CStr; |
12 | 13 |
13 /// A trait for a PAM module to implement. | 14 /// A trait for a PAM module to implement. |
14 /// | 15 /// |
360 pamh: *mut libc::c_void, | 361 pamh: *mut libc::c_void, |
361 flags: Flags, | 362 flags: Flags, |
362 argc: c_int, | 363 argc: c_int, |
363 argv: *const *const c_char, | 364 argv: *const *const c_char, |
364 ) -> c_int { | 365 ) -> c_int { |
365 let args = extract_argv(argc, argv); | 366 if let Some(handle) = unsafe { pamh.cast::<LibPamHandle>().as_mut() } { |
366 ErrorCode::result_to_c(super::$ident::account_management( | 367 let args = extract_argv(argc, argv); |
367 unsafe { LibPamHandle::from_ptr(pamh) }, | 368 ErrorCode::result_to_c(super::$ident::account_management(handle, args, flags)) |
368 args, | 369 } else { |
369 flags, | 370 ErrorCode::Ignore as c_int |
370 )) | 371 } |
371 } | 372 } |
372 | 373 |
373 #[no_mangle] | 374 #[no_mangle] |
374 extern "C" fn pam_sm_authenticate( | 375 extern "C" fn pam_sm_authenticate( |
375 pamh: *mut libc::c_void, | 376 pamh: *mut libc::c_void, |
376 flags: Flags, | 377 flags: Flags, |
377 argc: c_int, | 378 argc: c_int, |
378 argv: *const *const c_char, | 379 argv: *const *const c_char, |
379 ) -> c_int { | 380 ) -> c_int { |
380 let args = extract_argv(argc, argv); | 381 if let Some(handle) = unsafe { pamh.cast::<LibPamHandle>().as_mut() } { |
381 ErrorCode::result_to_c(super::$ident::authenticate( | 382 let args = extract_argv(argc, argv); |
382 unsafe { LibPamHandle::from_ptr(pamh) }, | 383 ErrorCode::result_to_c(super::$ident::authenticate(handle, args, flags)) |
383 args, | 384 } else { |
384 flags, | 385 ErrorCode::Ignore as c_int |
385 )) | 386 } |
386 } | 387 } |
387 | 388 |
388 #[no_mangle] | 389 #[no_mangle] |
389 extern "C" fn pam_sm_chauthtok( | 390 extern "C" fn pam_sm_chauthtok( |
390 pamh: *mut libc::c_void, | 391 pamh: *mut libc::c_void, |
391 flags: Flags, | 392 flags: Flags, |
392 argc: c_int, | 393 argc: c_int, |
393 argv: *const *const c_char, | 394 argv: *const *const c_char, |
394 ) -> c_int { | 395 ) -> c_int { |
395 let args = extract_argv(argc, argv); | 396 if let Some(handle) = unsafe { pamh.cast::<LibPamHandle>().as_mut() } { |
396 ErrorCode::result_to_c(super::$ident::change_authtok( | 397 let args = extract_argv(argc, argv); |
397 unsafe { LibPamHandle::from_ptr(pamh) }, | 398 ErrorCode::result_to_c(super::$ident::change_authtok(handle, args, flags)) |
398 args, | 399 } else { |
399 flags, | 400 ErrorCode::Ignore as c_int |
400 )) | 401 } |
401 } | 402 } |
402 | 403 |
403 #[no_mangle] | 404 #[no_mangle] |
404 extern "C" fn pam_sm_close_session( | 405 extern "C" fn pam_sm_close_session( |
405 pamh: *mut libc::c_void, | 406 pamh: *mut libc::c_void, |
406 flags: Flags, | 407 flags: Flags, |
407 argc: c_int, | 408 argc: c_int, |
408 argv: *const *const c_char, | 409 argv: *const *const c_char, |
409 ) -> c_int { | 410 ) -> c_int { |
410 let args = extract_argv(argc, argv); | 411 if let Some(handle) = unsafe { pamh.cast::<LibPamHandle>().as_mut() } { |
411 ErrorCode::result_to_c(super::$ident::close_session( | 412 let args = extract_argv(argc, argv); |
412 unsafe { LibPamHandle::from_ptr(pamh) }, | 413 ErrorCode::result_to_c(super::$ident::close_session(handle, args, flags)) |
413 args, | 414 } else { |
414 flags, | 415 ErrorCode::Ignore as c_int |
415 )) | 416 } |
416 } | 417 } |
417 | 418 |
418 #[no_mangle] | 419 #[no_mangle] |
419 extern "C" fn pam_sm_open_session( | 420 extern "C" fn pam_sm_open_session( |
420 pamh: *mut libc::c_void, | 421 pamh: *mut libc::c_void, |
421 flags: Flags, | 422 flags: Flags, |
422 argc: c_int, | 423 argc: c_int, |
423 argv: *const *const c_char, | 424 argv: *const *const c_char, |
424 ) -> c_int { | 425 ) -> c_int { |
425 let args = extract_argv(argc, argv); | 426 let args = extract_argv(argc, argv); |
426 ErrorCode::result_to_c(super::$ident::open_session( | 427 if let Some(handle) = unsafe { pamh.cast::<LibPamHandle>().as_mut() } { |
427 unsafe { LibPamHandle::from_ptr(pamh) }, | 428 ErrorCode::result_to_c(super::$ident::open_session(handle, args, flags)) |
428 args, | 429 } else { |
429 flags, | 430 ErrorCode::Ignore as c_int |
430 )) | 431 } |
431 } | 432 } |
432 | 433 |
433 #[no_mangle] | 434 #[no_mangle] |
434 extern "C" fn pam_sm_setcred( | 435 extern "C" fn pam_sm_setcred( |
435 pamh: *mut libc::c_void, | 436 pamh: *mut libc::c_void, |
436 flags: Flags, | 437 flags: Flags, |
437 argc: c_int, | 438 argc: c_int, |
438 argv: *const *const c_char, | 439 argv: *const *const c_char, |
439 ) -> c_int { | 440 ) -> c_int { |
440 let args = extract_argv(argc, argv); | 441 let args = extract_argv(argc, argv); |
441 ErrorCode::result_to_c(super::$ident::set_credentials( | 442 if let Some(handle) = unsafe { pamh.cast::<LibPamHandle>().as_mut() } { |
442 unsafe { LibPamHandle::from_ptr(pamh) }, | 443 ErrorCode::result_to_c(super::$ident::set_credentials(handle, args, flags)) |
443 args, | 444 } else { |
444 flags, | 445 ErrorCode::Ignore as c_int |
445 )) | 446 } |
446 } | 447 } |
447 | 448 |
448 /// Turns `argc`/`argv` into a [Vec] of [CStr]s. | 449 /// Turns `argc`/`argv` into a [Vec] of [CStr]s. |
449 /// | 450 /// |
450 /// # Safety | 451 /// # Safety |
458 } | 459 } |
459 }; | 460 }; |
460 } | 461 } |
461 | 462 |
462 #[cfg(test)] | 463 #[cfg(test)] |
463 mod test { | 464 mod tests { |
464 use super::{ | 465 use super::{ |
465 Conversation, ConversationMux, ErrorCode, Message, Response, Result, SecureString, | 466 Conversation, ConversationMux, ErrorCode, Message, Response, Result, SecureString, |
466 }; | 467 }; |
467 | 468 |
468 /// Compile-time test that the `pam_hooks` macro compiles. | 469 /// Compile-time test that the `pam_hooks` macro compiles. |