Can request new user password on login

This commit is contained in:
2022-04-02 08:30:01 +02:00
parent 0f4a5cde57
commit 4b8c9fdfdc
7 changed files with 222 additions and 11 deletions

@ -6,18 +6,28 @@ use crate::data::user::User;
use crate::utils::time::time;
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq)]
enum SessionStatus {
pub enum SessionStatus {
Invalid,
SignedIn,
NeedNewPassword,
NeedMFA,
}
#[derive(Debug, Serialize, Deserialize)]
impl Default for SessionStatus {
fn default() -> Self {
Self::Invalid
}
}
#[derive(Debug, Serialize, Deserialize, Default)]
struct SessionIdentityData {
pub id: String,
pub is_admin: bool,
last_access: u64,
pub status: SessionStatus,
// TODO : add session max duration (1 day)
}
pub struct SessionIdentity<'a>(pub &'a Identity);
@ -39,6 +49,13 @@ impl<'a> SessionIdentity<'a> {
.map(serde_json::from_str)
.map(|f| f.expect("Failed to deserialize session data!"));
// Check if session is valid
if let Some(sess) = &res {
if sess.id.is_empty() {
return None;
}
}
if let Some(session) = res.as_mut() {
if session.last_access + MAX_SESSION_DURATION < time() {
log::info!("Session is expired for {}", session.id);
@ -63,9 +80,27 @@ impl<'a> SessionIdentity<'a> {
self.0.remember(s);
}
pub fn set_status(&self, status: SessionStatus) {
let mut sess = self.get_session_data().unwrap_or_default();
sess.status = status;
self.set_session_data(&sess);
}
pub fn is_authenticated(&self) -> bool {
self.get_session_data()
.map(|s| s.status == SessionStatus::SignedIn)
.unwrap_or(false)
}
pub fn need_new_password(&self) -> bool {
self.get_session_data()
.map(|s| s.status == SessionStatus::NeedNewPassword)
.unwrap_or(false)
}
pub fn user_id(&self) -> String {
self.get_session_data()
.unwrap_or_default()
.id
}
}