sheepd/src/server_core/route.rs
JMARyA 125d50530d
mqtt connections
almost working, need encryption
2025-04-28 23:33:11 +02:00

58 lines
1.5 KiB
Rust

use crate::api;
use crate::api::JoinResponse;
use crate::server_core::model::Machine;
use axum::Json;
use axum::http::StatusCode;
use axum_client_ip::ClientIp;
use based::auth::Sessions;
use based::auth::User;
use owl::save;
use serde::Deserialize;
use serde_json::json;
#[derive(Deserialize)]
pub struct LoginParam {
username: String,
password: String,
}
pub async fn login_user(Json(payload): Json<LoginParam>) -> (StatusCode, Json<serde_json::Value>) {
log::info!("Login attempt for {}", payload.username);
let u = User::find(&payload.username).await.unwrap();
if u.read().verify_pw(&payload.password) {
let ses = u.read().session().await;
(StatusCode::OK, Json(json!({"token": ses.read().token})))
} else {
(StatusCode::FORBIDDEN, Json(json!({"error": "invalid"})))
}
}
pub async fn join_device(
ClientIp(ip): ClientIp,
Json(payload): Json<api::JoinParams>,
) -> (StatusCode, Json<serde_json::Value>) {
// TODO : check if exists already
// TODO : validate join token
log::info!(
"New device joined: {} [{}]",
payload.hostname.trim(),
payload.machine_id
);
let machine = Machine::from_join_param(payload);
let new_token = machine.token.clone();
save!(machine);
let i = crate::IDENTITY.get().unwrap();
(
StatusCode::OK,
Json(json!(JoinResponse {
token: new_token,
identity: i.public(),
mqtt: crate::CONFIG.get().unwrap().mqtt.clone()
})),
)
}