Mercurial > crates > nonstick
annotate src/items.rs @ 59:3f4a77aa88be
Fix string copyting and improve error situation.
This change is too big and includes several things:
- Fix copying strings from PAM by fixing const and mut on pam funcs.
- Improve error enums by simplifying conversions and removing
unnecessary and ambiguous "success" variants.
- Make a bunch of casts nicer.
- Assorted other cleanup.
author | Paul Fisher <paul@pfish.zone> |
---|---|
date | Wed, 21 May 2025 00:27:18 -0400 |
parents | daa2cde64601 |
children | 05cc2c27334f |
rev | line source |
---|---|
59
3f4a77aa88be
Fix string copyting and improve error situation.
Paul Fisher <paul@pfish.zone>
parents:
56
diff
changeset
|
1 use crate::constants::InvalidEnum; |
3f4a77aa88be
Fix string copyting and improve error situation.
Paul Fisher <paul@pfish.zone>
parents:
56
diff
changeset
|
2 use num_derive::FromPrimitive; |
3f4a77aa88be
Fix string copyting and improve error situation.
Paul Fisher <paul@pfish.zone>
parents:
56
diff
changeset
|
3 use num_traits::FromPrimitive; |
56
daa2cde64601
Big big refactor. Probably should have been multiple changes.
Paul Fisher <paul@pfish.zone>
parents:
51
diff
changeset
|
4 use std::ffi::{c_int, CStr}; |
51 | 5 |
59
3f4a77aa88be
Fix string copyting and improve error situation.
Paul Fisher <paul@pfish.zone>
parents:
56
diff
changeset
|
6 #[derive(FromPrimitive)] |
56
daa2cde64601
Big big refactor. Probably should have been multiple changes.
Paul Fisher <paul@pfish.zone>
parents:
51
diff
changeset
|
7 #[repr(i32)] |
59
3f4a77aa88be
Fix string copyting and improve error situation.
Paul Fisher <paul@pfish.zone>
parents:
56
diff
changeset
|
8 #[non_exhaustive] // because C could give us anything! |
34 | 9 pub enum ItemType { |
10 /// The service name | |
11 Service = 1, | |
12 /// The user name | |
13 User = 2, | |
14 /// The tty name | |
15 Tty = 3, | |
16 /// The remote host name | |
56
daa2cde64601
Big big refactor. Probably should have been multiple changes.
Paul Fisher <paul@pfish.zone>
parents:
51
diff
changeset
|
17 RemoteHost = 4, |
34 | 18 /// The pam_conv structure |
56
daa2cde64601
Big big refactor. Probably should have been multiple changes.
Paul Fisher <paul@pfish.zone>
parents:
51
diff
changeset
|
19 Conversation = 5, |
34 | 20 /// The authentication token (password) |
21 AuthTok = 6, | |
22 /// The old authentication token | |
23 OldAuthTok = 7, | |
24 /// The remote user name | |
56
daa2cde64601
Big big refactor. Probably should have been multiple changes.
Paul Fisher <paul@pfish.zone>
parents:
51
diff
changeset
|
25 RemoteUser = 8, |
34 | 26 /// the prompt for getting a username |
27 UserPrompt = 9, | |
28 /// app supplied function to override failure delays | |
29 FailDelay = 10, | |
30 /// X :display name | |
31 XDisplay = 11, | |
32 /// X :server authentication data | |
33 XAuthData = 12, | |
34 /// The type for pam_get_authtok | |
35 AuthTokType = 13, | |
15
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
36 } |
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
37 |
59
3f4a77aa88be
Fix string copyting and improve error situation.
Paul Fisher <paul@pfish.zone>
parents:
56
diff
changeset
|
38 impl TryFrom<c_int> for ItemType { |
3f4a77aa88be
Fix string copyting and improve error situation.
Paul Fisher <paul@pfish.zone>
parents:
56
diff
changeset
|
39 type Error = InvalidEnum<Self>; |
3f4a77aa88be
Fix string copyting and improve error situation.
Paul Fisher <paul@pfish.zone>
parents:
56
diff
changeset
|
40 fn try_from(value: c_int) -> Result<Self, Self::Error> { |
3f4a77aa88be
Fix string copyting and improve error situation.
Paul Fisher <paul@pfish.zone>
parents:
56
diff
changeset
|
41 Self::from_i32(value).ok_or(value.into()) |
56
daa2cde64601
Big big refactor. Probably should have been multiple changes.
Paul Fisher <paul@pfish.zone>
parents:
51
diff
changeset
|
42 } |
daa2cde64601
Big big refactor. Probably should have been multiple changes.
Paul Fisher <paul@pfish.zone>
parents:
51
diff
changeset
|
43 } |
daa2cde64601
Big big refactor. Probably should have been multiple changes.
Paul Fisher <paul@pfish.zone>
parents:
51
diff
changeset
|
44 |
daa2cde64601
Big big refactor. Probably should have been multiple changes.
Paul Fisher <paul@pfish.zone>
parents:
51
diff
changeset
|
45 impl From<ItemType> for c_int { |
daa2cde64601
Big big refactor. Probably should have been multiple changes.
Paul Fisher <paul@pfish.zone>
parents:
51
diff
changeset
|
46 fn from(val: ItemType) -> Self { |
59
3f4a77aa88be
Fix string copyting and improve error situation.
Paul Fisher <paul@pfish.zone>
parents:
56
diff
changeset
|
47 val as Self |
56
daa2cde64601
Big big refactor. Probably should have been multiple changes.
Paul Fisher <paul@pfish.zone>
parents:
51
diff
changeset
|
48 } |
daa2cde64601
Big big refactor. Probably should have been multiple changes.
Paul Fisher <paul@pfish.zone>
parents:
51
diff
changeset
|
49 } |
daa2cde64601
Big big refactor. Probably should have been multiple changes.
Paul Fisher <paul@pfish.zone>
parents:
51
diff
changeset
|
50 |
59
3f4a77aa88be
Fix string copyting and improve error situation.
Paul Fisher <paul@pfish.zone>
parents:
56
diff
changeset
|
51 /// A type that can be requested by [crate::Handle::get_item]. |
34 | 52 pub trait Item { |
53 /// The `repr(C)` type that is returned (by pointer) by the underlying `pam_get_item` function. | |
54 type Raw; | |
55 | |
56 /// The `ItemType` for this type | |
57 fn type_id() -> ItemType; | |
15
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
58 |
51 | 59 /// The function to convert from the pointer to the C-representation to this safer wrapper type. |
34 | 60 /// |
61 /// # Safety | |
62 /// | |
51 | 63 /// This function assumes the pointer is a valid pointer to a `Self::Raw` instance. |
34 | 64 unsafe fn from_raw(raw: *const Self::Raw) -> Self; |
15
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
65 |
34 | 66 /// The function to convert from this wrapper type to a C-compatible pointer. |
67 fn into_raw(self) -> *const Self::Raw; | |
15
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
68 } |
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
69 |
34 | 70 macro_rules! cstr_item { |
71 ($name:ident) => { | |
51 | 72 ///A `CStr`-based item from a PAM conversation. |
34 | 73 #[derive(Debug)] |
51 | 74 pub struct $name<'s>(pub &'s CStr); |
34 | 75 |
76 impl<'s> std::ops::Deref for $name<'s> { | |
51 | 77 type Target = &'s CStr; |
34 | 78 fn deref(&self) -> &Self::Target { |
79 &self.0 | |
80 } | |
81 } | |
15
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
82 |
34 | 83 impl<'s> Item for $name<'s> { |
84 type Raw = libc::c_char; | |
85 | |
86 fn type_id() -> ItemType { | |
87 ItemType::$name | |
88 } | |
89 | |
90 unsafe fn from_raw(raw: *const Self::Raw) -> Self { | |
91 Self(std::ffi::CStr::from_ptr(raw)) | |
92 } | |
93 | |
94 fn into_raw(self) -> *const Self::Raw { | |
95 self.0.as_ptr() | |
96 } | |
97 } | |
98 }; | |
15
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
99 } |
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
100 |
34 | 101 cstr_item!(Service); |
102 cstr_item!(User); | |
103 cstr_item!(Tty); | |
56
daa2cde64601
Big big refactor. Probably should have been multiple changes.
Paul Fisher <paul@pfish.zone>
parents:
51
diff
changeset
|
104 cstr_item!(RemoteHost); |
59
3f4a77aa88be
Fix string copyting and improve error situation.
Paul Fisher <paul@pfish.zone>
parents:
56
diff
changeset
|
105 // Conversation is not included here since it's special. |
34 | 106 cstr_item!(AuthTok); |
107 cstr_item!(OldAuthTok); | |
56
daa2cde64601
Big big refactor. Probably should have been multiple changes.
Paul Fisher <paul@pfish.zone>
parents:
51
diff
changeset
|
108 cstr_item!(RemoteUser); |
34 | 109 cstr_item!(UserPrompt); |