Mercurial > crates > nonstick
annotate pam-http/src/lib.rs @ 34:ec70822cbdef
Overhaul
author | Andy Caldwell <andrew.caldwell@metaswitch.com> |
---|---|
date | Sun, 24 Apr 2022 03:42:11 +0100 |
parents | 4263c1d83d5b |
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 } |