1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//! Simplified PAM module creation in Rust.
//!
//! ```rust
//! use pam::constants::{PamFlag, PamResultCode};
//! use pam::module::{PamHandle, PamHooks};
//! use std::ffi::CStr;
//!
//! struct AliceOnly;
//! pam::pam_hooks!(AliceOnly);
//!
//! impl PamHooks for AliceOnly {
//! fn sm_authenticate(pamh: &mut PamHandle, _args: Vec<&CStr>, _flags: PamFlag) -> PamResultCode {
//! let username = match pamh.get_user(None) {
//! Ok(username) => username,
//! Err(e) => {
//! eprintln!("failed to get username, error code: {e:?}");
//! return e;
//! }
//! };
//!
//! match username.as_str() {
//! "alice" => PamResultCode::PAM_SUCCESS,
//! _ => PamResultCode::PAM_AUTH_ERR,
//! }
//! }
//! }
//! # fn main() {}
//! ```
//!
//! # Introduction
//!
//! The Pluggable Authentication Modules (PAM) framework enables systems to
//! authenticate users and perform other functions by composing PAM modules,
//! which are distributed as shared libraries.
//!
//! The goal of this library is to provide a simple, type-safe API to write
//! these modules.