feat(auth): brahman-auth — autenticación del escritorio (PAM + mock)
Base del DM/greeter de carmen. Contrato Authenticator agnóstico: authenticate(usuario, secreto) -> UserInfo (uid/gid/home/shell). PamAuthenticator verifica contra PAM (/etc/pam.d/carmen); MockAuthenticator con credenciales en memoria para tests. AuthError grueso: BadCredentials vs AccountUnavailable, sin filtrar existencia de cuentas. resolve_user vía getpwnam. data/carmen como servicio PAM; ejemplo auth-probe. 11 tests; el camino PAM real se ejercita. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
//! Prueba interactiva de `brahman-auth` contra PAM. Sirve para verificar
|
||||
//! la configuración de `/etc/pam.d/<servicio>` en una máquina real.
|
||||
//!
|
||||
//! `cargo run -p brahman-auth --example auth-probe -- [usuario] [servicio]`
|
||||
//!
|
||||
//! Pide la contraseña sin eco. El servicio por defecto es `carmen`; si
|
||||
//! `/etc/pam.d/carmen` aún no está instalado, probar con `login`.
|
||||
|
||||
use brahman_auth::{Authenticator, PamAuthenticator};
|
||||
|
||||
fn main() {
|
||||
let mut args = std::env::args().skip(1);
|
||||
let user = args
|
||||
.next()
|
||||
.or_else(|| std::env::var("USER").ok())
|
||||
.unwrap_or_else(|| "root".into());
|
||||
let service = args.next().unwrap_or_else(|| "carmen".into());
|
||||
|
||||
let password = match rpassword::prompt_password(format!("Contraseña de {user}: ")) {
|
||||
Ok(p) => p,
|
||||
Err(e) => {
|
||||
eprintln!("no se pudo leer la contraseña: {e}");
|
||||
std::process::exit(2);
|
||||
}
|
||||
};
|
||||
|
||||
let auth = PamAuthenticator::new(&service);
|
||||
println!("autenticando «{user}» contra el servicio PAM «{service}»…");
|
||||
match auth.authenticate(&user, &password) {
|
||||
Ok(info) => {
|
||||
println!("✓ autenticado");
|
||||
println!(" uid={} gid={}", info.uid, info.gid);
|
||||
println!(" home={}", info.home.display());
|
||||
println!(" shell={}", info.shell.display());
|
||||
}
|
||||
Err(e) => {
|
||||
eprintln!("✗ {e}");
|
||||
std::process::exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user