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); |
