diff pam-sober/src/lib.rs @ 34:ec70822cbdef

Overhaul
author Andy Caldwell <andrew.caldwell@metaswitch.com>
date Sun, 24 Apr 2022 03:42:11 +0100
parents d5c842a50827
children
line wrap: on
line diff
--- a/pam-sober/src/lib.rs	Thu Jul 11 19:13:19 2019 -0700
+++ b/pam-sober/src/lib.rs	Sun Apr 24 03:42:11 2022 +0100
@@ -1,37 +1,20 @@
-#[macro_use] extern crate pam;
+extern crate pam;
 extern crate rand;
 
+use pam::constants::{PamFlag, PamResultCode, PAM_PROMPT_ECHO_ON};
+use pam::conv::Conv;
 use pam::module::{PamHandle, PamHooks};
-use pam::constants::{PamResultCode, PamFlag, PAM_PROMPT_ECHO_ON};
-use pam::conv::PamConv;
 use rand::Rng;
-use std::str::FromStr;
 use std::ffi::CStr;
-
-macro_rules! pam_try {
-    ($e:expr) => (
-        match $e {
-            Ok(v) => v,
-            Err(e) => return e,
-        }
-    );
-    ($e:expr, $err:expr) => (
-        match $e {
-            Ok(v) => v,
-            Err(e) => {
-                println!("Error: {}", e);
-                return $err;
-            }
-        }
-    );
-}
+use std::str::FromStr;
+use pam::pam_try;
 
 struct PamSober;
-pam_hooks!(PamSober);
+pam::pam_hooks!(PamSober);
 
 impl PamHooks for PamSober {
     // This function performs the task of authenticating the user.
-    fn sm_authenticate(pamh: &PamHandle, _args: Vec<&CStr>, _flags: PamFlag) -> PamResultCode {
+    fn sm_authenticate(pamh: &mut PamHandle, _args: Vec<&CStr>, _flags: PamFlag) -> PamResultCode {
         println!("Let's make sure you're sober enough to perform basic addition");
 
         /* TODO: use args to change difficulty ;-)
@@ -44,8 +27,9 @@
         // TODO: maybe we can change difficulty base on user?
         // let user = pam_try!(pam.get_user(None));
 
-        let conv = match pamh.get_item::<PamConv>() {
-            Ok(conv) => conv,
+        let conv = match pamh.get_item::<Conv>() {
+            Ok(Some(conv)) => conv,
+            Ok(None) => todo!(),
             Err(err) => {
                 println!("Couldn't get pam_conv");
                 return err;
@@ -58,24 +42,31 @@
         let math = format!("{} + {} = ", a, b);
 
         // This println kinda helps debugging since the test script doesn't echo
-        println!("{}", math);
+        eprintln!("[DEBUG]: {}{}", math, a + b);
 
         let password = pam_try!(conv.send(PAM_PROMPT_ECHO_ON, &math));
 
-        if password.and_then(|p| u32::from_str(&p).ok()) == Some(a+b) {
-            return PamResultCode::PAM_SUCCESS;
+        if let Some(password) = password {
+            let password = pam_try!(password.to_str(), PamResultCode::PAM_AUTH_ERR);
+            let answer = pam_try!(u32::from_str(password), PamResultCode::PAM_AUTH_ERR);
+            if answer == a + b {
+                PamResultCode::PAM_SUCCESS
+            } else {
+                println!("Wrong answer provided {} + {} != {}", a, b, answer);
+                PamResultCode::PAM_AUTH_ERR
+            }
+        } else {
+            println!("You failed the PAM sobriety test.");
+            PamResultCode::PAM_AUTH_ERR
         }
-
-        println!("You failed the PAM sobriety test.");
-        return PamResultCode::PAM_AUTH_ERR;
     }
 
-    fn sm_setcred(_pamh: &PamHandle, _args: Vec<&CStr>, _flags: PamFlag) -> PamResultCode {
+    fn sm_setcred(_pamh: &mut PamHandle, _args: Vec<&CStr>, _flags: PamFlag) -> PamResultCode {
         println!("set credentials");
         PamResultCode::PAM_SUCCESS
     }
 
-    fn acct_mgmt(_pamh: &PamHandle, _args: Vec<&CStr>, _flags: PamFlag) -> PamResultCode {
+    fn acct_mgmt(_pamh: &mut PamHandle, _args: Vec<&CStr>, _flags: PamFlag) -> PamResultCode {
         println!("account management");
         PamResultCode::PAM_SUCCESS
     }