Mercurial > crates > nonstick
annotate pam-http/src/lib.rs @ 36:d1f0c1cf3c6e
Github actions publish crate
| author | Nigma <magnusgsvend@gmail.com> |
|---|---|
| date | Sun, 24 Jul 2022 02:05:30 +0200 |
| parents | ec70822cbdef |
| children |
| rev | line source |
|---|---|
| 34 | 1 extern crate pam; |
|
15
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
2 extern crate reqwest; |
|
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
3 |
| 34 | 4 use pam::constants::{PamFlag, PamResultCode, PAM_PROMPT_ECHO_OFF}; |
| 5 use pam::conv::Conv; | |
|
22
4263c1d83d5b
Refactor PamHooks into modules mod
Anthony Nowell <anthony@algorithmia.com>
parents:
20
diff
changeset
|
6 use pam::module::{PamHandle, PamHooks}; |
| 34 | 7 use reqwest::blocking::Client; |
| 8 use reqwest::StatusCode; | |
|
15
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
9 use std::collections::HashMap; |
|
20
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
10 use std::ffi::CStr; |
| 34 | 11 use std::time::Duration; |
| 12 use pam::pam_try; | |
|
15
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
13 |
|
20
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
14 struct PamHttp; |
| 34 | 15 pam::pam_hooks!(PamHttp); |
|
20
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
16 |
|
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
17 impl PamHooks for PamHttp { |
|
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
18 // This function performs the task of authenticating the user. |
| 34 | 19 fn sm_authenticate(pamh: &mut PamHandle, args: Vec<&CStr>, _flags: PamFlag) -> PamResultCode { |
|
20
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
20 println!("Let's auth over HTTP"); |
|
15
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
21 |
| 34 | 22 let args: Vec<_> = args |
| 23 .iter() | |
| 24 .map(|s| s.to_string_lossy()) | |
| 25 .collect(); | |
| 26 let args: HashMap<&str, &str> = args | |
| 27 .iter() | |
| 28 .map(|s| { | |
| 29 let mut parts = s.splitn(2, '='); | |
| 30 (parts.next().unwrap(), parts.next().unwrap_or("")) | |
| 31 }) | |
| 32 .collect(); | |
|
15
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
33 |
|
20
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
34 let user = pam_try!(pamh.get_user(None)); |
|
15
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
35 |
|
20
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
36 let url: &str = match args.get("url") { |
|
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
37 Some(url) => url, |
|
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
38 None => return PamResultCode::PAM_AUTH_ERR, |
|
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
39 }; |
|
15
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
40 |
| 34 | 41 let conv = match pamh.get_item::<Conv>() { |
| 42 Ok(Some(conv)) => conv, | |
| 43 Ok(None) => { | |
| 44 unreachable!("No conv available"); | |
| 45 } | |
|
20
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
46 Err(err) => { |
|
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
47 println!("Couldn't get pam_conv"); |
|
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
48 return err; |
|
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
49 } |
|
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
50 }; |
|
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
51 let password = pam_try!(conv.send(PAM_PROMPT_ECHO_OFF, "Word, yo: ")); |
| 34 | 52 let password = match password { |
| 53 Some(password) => Some(pam_try!(password.to_str(), PamResultCode::PAM_AUTH_ERR)), | |
| 54 None => None, | |
| 55 }; | |
|
20
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
56 println!("Got a password {:?}", password); |
| 34 | 57 let status = pam_try!( |
| 58 get_url(url, &user, password), | |
| 59 PamResultCode::PAM_AUTH_ERR | |
| 60 ); | |
|
20
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
61 |
|
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
62 if !status.is_success() { |
|
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
63 println!("HTTP Error: {}", status); |
|
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
64 return PamResultCode::PAM_AUTH_ERR; |
|
15
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
65 } |
|
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
66 |
|
20
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
67 PamResultCode::PAM_SUCCESS |
|
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 fn sm_setcred(_pamh: &mut PamHandle, _args: Vec<&CStr>, _flags: PamFlag) -> PamResultCode { |
|
20
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
71 println!("set credentials"); |
|
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
72 PamResultCode::PAM_SUCCESS |
|
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
73 } |
|
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
74 |
| 34 | 75 fn acct_mgmt(_pamh: &mut PamHandle, _args: Vec<&CStr>, _flags: PamFlag) -> PamResultCode { |
|
20
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
76 println!("account management"); |
|
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
77 PamResultCode::PAM_SUCCESS |
|
734ca62159fb
Refactor exported endpoings into pam_hooks macro
Anthony Nowell <anthony@algorithmia.com>
parents:
19
diff
changeset
|
78 } |
|
15
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
79 } |
|
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
80 |
|
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
81 fn get_url(url: &str, user: &str, password: Option<&str>) -> reqwest::Result<StatusCode> { |
| 34 | 82 let client = Client::builder().timeout(Duration::from_secs(15)).build()?; |
| 83 client | |
| 84 .get(url) | |
|
15
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
85 .basic_auth(user, password) |
|
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
86 .send() |
|
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
87 .map(|r| r.status()) |
|
27730595f1ea
Adding pam-http module
Anthony Nowell <anthony@algorithmia.com>
parents:
diff
changeset
|
88 } |
