nixgreety/src/greetd.rs

66 lines
2.0 KiB
Rust
Raw Normal View History

2025-02-21 17:34:31 +00:00
use std::{env, error::Error, os::unix::net::UnixStream};
use greetd_ipc::{codec::SyncCodec, AuthMessageType, ErrorType, Request, Response};
use crate::{Session, User};
pub enum LoginResult {
Success,
Failure,
}
pub fn login(
user: &User,
session: &Session,
password: &str,
) -> Result<LoginResult, Box<dyn Error>> {
let mut stream = UnixStream::connect(env::var("GREETD_SOCK")?)?;
Request::CreateSession {
username: user.name.clone(),
}
.write_to(&mut stream)?;
let mut starting = false;
loop {
match Response::read_from(&mut stream)? {
Response::Success => {
if starting {
return Ok(LoginResult::Success);
} else {
starting = true;
2025-02-21 19:46:10 +00:00
let cmd = vec![session.init.clone()];
2025-02-21 17:34:31 +00:00
let env = vec![];
Request::StartSession { cmd, env }.write_to(&mut stream)?;
}
}
Response::Error {
error_type,
description,
} => {
Request::CancelSession.write_to(&mut stream)?;
match error_type {
ErrorType::Error => {
return Err(format!("login error: {:?}", description).into())
}
ErrorType::AuthError => return Ok(LoginResult::Failure),
}
}
Response::AuthMessage {
auth_message_type,
auth_message,
} => {
let response = match auth_message_type {
AuthMessageType::Visible => todo!(),
AuthMessageType::Secret => Some(password.to_string()),
AuthMessageType::Info => todo!(),
AuthMessageType::Error => todo!(),
};
Request::PostAuthMessageResponse { response }.write_to(&mut stream)?;
}
}
}
}