comparison src/items.rs @ 56:daa2cde64601

Big big refactor. Probably should have been multiple changes. - Makes FFI safer by explicitly specifying c_int in calls. - Uses ToPrimitive/FromPrimitive to make this easier. - Pulls PamFlag variables into a bitflags! struct. - Pulls PamMessageStyle variables into an enum. - Renames ResultCode to ErrorCode. - Switches from PAM_SUCCESS to using a Result<(), ErrorCode>. - Uses thiserror to make ErrorCode into an Error. - Gets rid of pam_try! because now we have Results. - Expands some names (e.g. Conv to Conversation). - Adds more doc comments. - Returns passwords as a SecureString, to avoid unnecessarily keeping it around in memory.
author Paul Fisher <paul@pfish.zone>
date Sun, 04 May 2025 02:56:55 -0400
parents 9d1160b02d2c
children 3f4a77aa88be
comparison
equal deleted inserted replaced
55:676675c3d434 56:daa2cde64601
1 use std::ffi::CStr; 1 use num_derive::{FromPrimitive, ToPrimitive};
2 use num_traits::{FromPrimitive, ToPrimitive};
3 use std::ffi::{c_int, CStr};
2 4
3 #[repr(u32)] 5 #[derive(FromPrimitive, ToPrimitive)]
6 #[repr(i32)]
4 pub enum ItemType { 7 pub enum ItemType {
8 /// Unset. This should never be used.
9 Unset = 0,
5 /// The service name 10 /// The service name
6 Service = 1, 11 Service = 1,
7 /// The user name 12 /// The user name
8 User = 2, 13 User = 2,
9 /// The tty name 14 /// The tty name
10 Tty = 3, 15 Tty = 3,
11 /// The remote host name 16 /// The remote host name
12 RHost = 4, 17 RemoteHost = 4,
13 /// The pam_conv structure 18 /// The pam_conv structure
14 Conv = 5, 19 Conversation = 5,
15 /// The authentication token (password) 20 /// The authentication token (password)
16 AuthTok = 6, 21 AuthTok = 6,
17 /// The old authentication token 22 /// The old authentication token
18 OldAuthTok = 7, 23 OldAuthTok = 7,
19 /// The remote user name 24 /// The remote user name
20 RUser = 8, 25 RemoteUser = 8,
21 /// the prompt for getting a username 26 /// the prompt for getting a username
22 UserPrompt = 9, 27 UserPrompt = 9,
23 /// app supplied function to override failure delays 28 /// app supplied function to override failure delays
24 FailDelay = 10, 29 FailDelay = 10,
25 /// X :display name 30 /// X :display name
26 XDisplay = 11, 31 XDisplay = 11,
27 /// X :server authentication data 32 /// X :server authentication data
28 XAuthData = 12, 33 XAuthData = 12,
29 /// The type for pam_get_authtok 34 /// The type for pam_get_authtok
30 AuthTokType = 13, 35 AuthTokType = 13,
36 }
37
38 impl From<c_int> for ItemType {
39 fn from(value: c_int) -> Self {
40 Self::from_i32(value).unwrap_or(Self::Unset)
41 }
42 }
43
44 impl From<ItemType> for c_int {
45 fn from(val: ItemType) -> Self {
46 val.to_i32().unwrap_or(0)
47 }
31 } 48 }
32 49
33 // A type that can be requested by `pam::Handle::get_item`. 50 // A type that can be requested by `pam::Handle::get_item`.
34 pub trait Item { 51 pub trait Item {
35 /// The `repr(C)` type that is returned (by pointer) by the underlying `pam_get_item` function. 52 /// The `repr(C)` type that is returned (by pointer) by the underlying `pam_get_item` function.
81 } 98 }
82 99
83 cstr_item!(Service); 100 cstr_item!(Service);
84 cstr_item!(User); 101 cstr_item!(User);
85 cstr_item!(Tty); 102 cstr_item!(Tty);
86 cstr_item!(RHost); 103 cstr_item!(RemoteHost);
87 // Conv 104 // Conv
88 cstr_item!(AuthTok); 105 cstr_item!(AuthTok);
89 cstr_item!(OldAuthTok); 106 cstr_item!(OldAuthTok);
90 cstr_item!(RUser); 107 cstr_item!(RemoteUser);
91 cstr_item!(UserPrompt); 108 cstr_item!(UserPrompt);