75 lines
2.0 KiB
Rust
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)
|
|
}
|