Can request new user password on login
This commit is contained in:
@ -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
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user