EinsatzOnline/src/helper/user_request_guard.rs

39 lines
1.6 KiB
Rust

use crate::helper::session_cookies::model::{
SessionCookie, SessionCookieError, SessionCookieStorage,
};
use crate::helper::settings::Settings;
use chrono::{Duration, Utc};
use rocket::http::Status;
use rocket::request::{FromRequest, Outcome};
use rocket::{request, Request, State};
#[rocket::async_trait]
impl<'r> FromRequest<'r> for SessionCookie {
type Error = SessionCookieError;
async fn from_request(request: &'r Request<'_>) -> request::Outcome<Self, Self::Error> {
let storage = match request.guard::<&State<SessionCookieStorage>>().await {
Outcome::Success(storage) => storage,
_ => return Outcome::Failure((Status::Unauthorized, SessionCookieError::Unavailable)),
};
let settings = request
.guard::<&State<Settings>>().await
.expect("Settings not available!");
match request.cookies().get_private("session") {
Some(cookie) => match storage.get(cookie.value().to_string()) {
Ok(cookie) => {
let mut updated_cookie = cookie.clone();
updated_cookie.expires = Utc::now()
.checked_add_signed(Duration::seconds(settings.application.session_timeout))
.expect("Session timeout specified in configuration is too great!");
storage.update(updated_cookie);
Outcome::Success(cookie.clone())
}
Err(e) => Outcome::Failure((Status::Unauthorized, e)),
},
None => Outcome::Failure((Status::Unauthorized, SessionCookieError::NotFound)),
}
}
}