39 lines
1.6 KiB
Rust
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)),
|
|
}
|
|
}
|
|
}
|