nomilo/src/controllers.rs

75 lines
2.0 KiB
Rust

use rocket::http::{Cookie, SameSite, CookieJar};
use rocket::State;
use crate::config::Config;
use crate::dns::ZoneConnector;
use crate::DbConn;
use crate::models;
pub async fn do_login(
conn: DbConn,
config: &State<Config>,
auth_request: models::AuthTokenRequest,
cookies: &CookieJar<'_>
) -> Result<models::Session, models::UserError> {
let session_duration = config.web_app.token_duration;
let session = conn.run(move |c| {
let user_info = models::LocalUser::get_user_by_creds(
c,
&auth_request.email,
&auth_request.password
)?;
models::Session::new(c, &user_info, session_duration)
}).await?;
// Conversion between different date / time libraries, very cursed, I don't like that
// About unwrap: I guess too bad if session time is over year 9999 (current max time if time-rs)
let expires = time::OffsetDateTime::from_unix_timestamp(session.expires_at.timestamp()).unwrap();
let session_cookie = Cookie::build(models::session::COOKIE_NAME, session.session_id.clone())
.same_site(SameSite::Strict)
.secure(true)
.http_only(true)
.expires(expires)
.finish();
cookies.add(session_cookie);
Ok(session)
}
pub async fn create_zone(
conn: &DbConn,
mut dns_api: Box<dyn ZoneConnector>,
user_info: models::UserInfo,
zone_request: models::CreateZoneRequest,
) -> Result<models::Zone, models::ErrorResponse> {
user_info.check_admin()?;
dns_api.zone_exists(zone_request.name.clone(), models::DNSClass::IN.into()).await?;
let zone = conn.run(move |c| {
models::Zone::create_zone(c, zone_request)
}).await?;
Ok(zone)
}
pub async fn get_zones(
conn: &DbConn,
user_info: models::UserInfo,
) -> Result<Vec<models::Zone>, models::ErrorResponse> {
let zones = conn.run(move |c| {
if user_info.is_admin() {
models::Zone::get_all(c)
} else {
user_info.get_zones(c)
}
}).await?;
Ok(zones)
}