diff --git a/geneit_backend/src/constants.rs b/geneit_backend/src/constants.rs index eb42d62..e155111 100644 --- a/geneit_backend/src/constants.rs +++ b/geneit_backend/src/constants.rs @@ -1,3 +1,5 @@ +use std::time::Duration; + #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] pub struct SizeConstraint { min: usize, @@ -31,3 +33,6 @@ impl Default for StaticConstraints { } } } + +/// Password reset token duration +pub const PASSWORD_RESET_TOKEN_DURATION: Duration = Duration::from_secs(3600 * 24); diff --git a/geneit_backend/src/controllers/auth_controller.rs b/geneit_backend/src/controllers/auth_controller.rs index 7e41ae1..a95cd39 100644 --- a/geneit_backend/src/controllers/auth_controller.rs +++ b/geneit_backend/src/controllers/auth_controller.rs @@ -31,6 +31,9 @@ pub async fn create_account(remote_ip: RemoteIP, req: web::Json(to: &str, subject: &str, body: D) -> anyhow:: let conf = AppConfig::get(); let email = Message::builder() - .from(conf.mail_sender.parse()?) + .from(format!("GeneIT <{}>", conf.mail_sender).parse()?) .to(to.parse()?) .subject(subject) .header(ContentType::TEXT_PLAIN) diff --git a/geneit_backend/src/services/users_service.rs b/geneit_backend/src/services/users_service.rs index 76aa620..5a49c80 100644 --- a/geneit_backend/src/services/users_service.rs +++ b/geneit_backend/src/services/users_service.rs @@ -2,6 +2,7 @@ use crate::app_config::AppConfig; use crate::connections::db_connection; +use crate::constants::PASSWORD_RESET_TOKEN_DURATION; use crate::models::{NewUser, User, UserID}; use crate::schema::users; use crate::services::mail_service; @@ -78,3 +79,19 @@ pub async fn request_reset_password(user: &mut User) -> anyhow::Result<()> { Ok(()) } + +/// Delete not validated accounts whose reset token has expired +pub async fn delete_not_validated_accounts() -> anyhow::Result<()> { + db_connection::execute(|conn| { + diesel::delete( + users::dsl::users.filter( + users::dsl::time_activate.eq(0).and( + users::dsl::time_gen_reset_token + .lt(time() as i64 - PASSWORD_RESET_TOKEN_DURATION.as_secs() as i64), + ), + ), + ) + .execute(conn)?; + Ok(()) + }) +}