54 lines
1.6 KiB
Rust
54 lines
1.6 KiB
Rust
use actix_identity::Identity;
|
|
use actix_web::{get, http::header::LOCATION, web, HttpResponse, Responder};
|
|
use askama::Template;
|
|
use serde::Deserialize;
|
|
use sqlx::PgPool;
|
|
|
|
use crate::utils::{ApplicationError, Customization, TemplateResponse};
|
|
use brass_db::models::PasswordReset;
|
|
|
|
use super::ResetPasswordTemplate;
|
|
|
|
#[derive(Template)]
|
|
#[template(path = "user/forgot_password.html")]
|
|
struct ForgotPasswordTemplate<'a> {
|
|
webmaster_email: &'a str,
|
|
}
|
|
|
|
#[derive(Deserialize)]
|
|
struct TokenQuery {
|
|
token: Option<String>,
|
|
}
|
|
|
|
#[get("/reset-password")]
|
|
pub async fn get(
|
|
user: Option<Identity>,
|
|
pool: web::Data<PgPool>,
|
|
query: web::Query<TokenQuery>,
|
|
customization: web::Data<Customization>,
|
|
) -> Result<impl Responder, ApplicationError> {
|
|
if user.is_some() {
|
|
return Ok(HttpResponse::Found()
|
|
.insert_header((LOCATION, "/"))
|
|
.finish());
|
|
} else if let Some(token) = &query.token {
|
|
if let Some(_) = PasswordReset::does_token_exist(pool.get_ref(), token).await? {
|
|
let template = ResetPasswordTemplate {
|
|
token,
|
|
title: "Brass - Passwort zurücksetzen",
|
|
endpoint: "/reset-password",
|
|
new_password_label: "neues Passwort:",
|
|
retype_label: "neues Passwort wiederholen:",
|
|
submit_button_label: "Passwort zurücksetzen",
|
|
};
|
|
|
|
return Ok(template.to_response()?);
|
|
}
|
|
}
|
|
|
|
let template = ForgotPasswordTemplate {
|
|
webmaster_email: &customization.webmaster_email,
|
|
};
|
|
Ok(template.to_response()?)
|
|
}
|