diff --git a/.gitignore b/.gitignore index 193d30e..e7180de 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,10 @@ Cargo.lock # Added by cargo /target + + +# Added by cargo +# +# already existing elements were commented out + +#/target diff --git a/Cargo.toml b/Cargo.toml index 747a43d..2f3aa0a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,11 @@ [package] name = "breaDM" version = "0.1.0" -edition = "2021" +edition = "2024" + +[[bin]] +name = "breadm" +path = "src/main.rs" [dependencies] pam = "0.8.0" diff --git a/src/auth.rs b/src/auth.rs new file mode 100644 index 0000000..b8481d9 --- /dev/null +++ b/src/auth.rs @@ -0,0 +1,24 @@ +use pam::Client; +use std::error::Error; + +/// Authenticate a user using PAM. +/// +/// Arguments +/// username: login name as typed +/// password: secret provided by user +/// +/// Uses the `login` PAM service for now. +pub fn authenticate(username: &str, password: &str) -> Result<(), Box> { + // Initialize PAM with the login service + let mut client = Client::with_password("login")?; + + // Provide credentials to PAM conversation + client + .conversation_mut() + .set_credentials(username.to_owned(), password.to_owned()); + + // Authenticate + client.authenticate()?; + + Ok(()) +} diff --git a/src/main.rs b/src/main.rs index e7a11a9..f090720 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,22 @@ +mod auth; + +use std::io; + fn main() { - println!("Hello, world!"); + let mut username = String::new(); + let mut password = String::new(); + + println!("username:"); + io::stdin().read_line(&mut username).unwrap(); + + println!("password:"); + io::stdin().read_line(&mut password).unwrap(); + + let username = username.trim(); + let password = password.trim(); + + match auth::authenticate(username, password) { + Ok(()) => println!("authentication successful"), + Err(e) => eprintln!("authentication failed: {e}"), + } }