use session::{AuthUser, Session, SessionUser, SessionUserMut}; use uuid::Uuid; use crate::errors::{ApiError, AuthError}; pub const PWD_VERSION_KEY: &str = "auth:pwd_version"; pub fn session_token_key(uid: Uuid) -> String { format!("auth:token_hash:{uid}") } pub fn require_uid(session: &Session) -> Result> { match session.uid() { Some(uid) => Ok(uid), None => Err(Box::new(ApiError::from(AuthError::Unauthorized))), } } pub fn apply_login(session: &Session, user: AuthUser, passwd_version: Option) { session.login_user(user); session.set(PWD_VERSION_KEY, passwd_version.unwrap_or(0)); } pub fn pwd_version_matches(session: &Session, current: Option) -> bool { let stored = session.get::(PWD_VERSION_KEY); match (stored, current) { (Some(stored_ver), Some(curr_ver)) => stored_ver == curr_ver, (None, None) => true, _ => false, } } pub fn validate_session_pwd_version(session: &Session, current_passwd_version: Option) -> Result<(), AuthError> { if !pwd_version_matches(session, current_passwd_version) { if let Some(uid) = session.uid() { session.logout_user(uid); } return Err(AuthError::Unauthorized); } Ok(()) }