3dc85ebdcd
Stack de display extraído del monorepo: compositor teselante (Cuerpo smithay + Cerebro WM agnóstico), greeter PAM, portal XDG, CLI de control. Llimphi se consume por git desde su repo publicado; las hojas compartidas (format, auth-core, rimay-localize, wawa-config, app-bus) y el widget menubar van vendorizados. Sin el asistente IA (pluma-llm) ni la barra web wasm — el compositor no los necesita. cargo check --workspace pasa (18 crates, 0 warn). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
42 lines
1.4 KiB
Rust
42 lines
1.4 KiB
Rust
//! 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 auth_core::{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);
|
|
}
|
|
}
|
|
}
|