diff --git a/.env b/.env index c9da62cb..c8327e52 100644 --- a/.env +++ b/.env @@ -6,9 +6,11 @@ SQLX_OFFLINE=true # 64 byte long openssl rand -base64 64 SECRET_KEY="changeInProdOrHandAb11111111111111111111111111111111111111111111" HOSTNAME="localhost" +WEBMASTER_EMAIL="admin@example.com" SERVER_ADDRESS="127.0.0.1" SERVER_PORT="8080" +APP_ENVIRONMENT="development" SMTP_SERVER="localhost" SMTP_PORT="1025" # SMTP_LOGIN="" diff --git a/config/src/lib.rs b/config/src/lib.rs index 1baaa0a9..4fff75ac 100644 --- a/config/src/lib.rs +++ b/config/src/lib.rs @@ -17,6 +17,7 @@ pub struct Config { pub smtp_login: Option, pub smtp_password: Option, pub smtp_tlstype: SmtpTlsType, + pub webmaster_email: String } #[derive(Clone)] @@ -67,6 +68,7 @@ pub fn load_config(env: &Environment) -> Result { smtp_login: env::var("SMTP_LOGIN").map(Some).unwrap_or(None), smtp_password: env::var("SMTP_PASSWORD").map(Some).unwrap_or(None), smtp_tlstype: SmtpTlsType::from(env::var("SMTP_TLSTYPE")?), + webmaster_email: env::var("WEBMASTER_EMAIL")?, }; Ok(config) diff --git a/web/src/endpoints/user/get_reset.rs b/web/src/endpoints/user/get_reset.rs index b05d7be4..f35e0460 100644 --- a/web/src/endpoints/user/get_reset.rs +++ b/web/src/endpoints/user/get_reset.rs @@ -6,14 +6,16 @@ use sqlx::PgPool; use crate::{ models::PasswordReset, - utils::{ApplicationError, TemplateResponse}, + utils::{ApplicationError, Customization, TemplateResponse}, }; use super::ResetPasswordTemplate; #[derive(Template)] #[template(path = "user/forgot_password.html")] -struct ForgotPasswordTemplate {} +struct ForgotPasswordTemplate<'a> { + webmaster_email: &'a str, +} #[derive(Deserialize)] struct TokenQuery { @@ -25,6 +27,7 @@ pub async fn get( user: Option, pool: web::Data, query: web::Query, + customization: web::Data, ) -> Result { if user.is_some() { return Ok(HttpResponse::Found() @@ -45,6 +48,8 @@ pub async fn get( } } - let template = ForgotPasswordTemplate {}; + let template = ForgotPasswordTemplate { + webmaster_email: &customization.webmaster_email, + }; Ok(template.to_response()?) } diff --git a/web/src/main.rs b/web/src/main.rs index 53134309..0df2ff4c 100644 --- a/web/src/main.rs +++ b/web/src/main.rs @@ -19,6 +19,7 @@ use tracing_panic::panic_hook; use tracing_subscriber::layer::SubscriberExt; use tracing_subscriber::util::SubscriberInitExt; use tracing_subscriber::{fmt, EnvFilter}; +use utils::Customization; use crate::postgres_session_store::SqlxPostgresqlSessionStore; use crate::utils::manage_commands::{handle_command, parse_args}; @@ -49,6 +50,9 @@ async fn main() -> anyhow::Result<()> { let pool = PgPool::connect(&config.database_url).await?; let mailer = Mailer::new(&config)?; + let customization = Customization { + webmaster_email: config.webmaster_email.clone(), + }; handle_command(args.command, &pool, &mailer).await?; @@ -56,10 +60,17 @@ async fn main() -> anyhow::Result<()> { let port = config.server_port; info!("Starting server on http://{address}:{port}."); - HttpServer::new(move || create_app(config.clone(), pool.clone(), mailer.clone())) - .bind((address, port))? - .run() - .await?; + HttpServer::new(move || { + create_app( + config.clone(), + pool.clone(), + mailer.clone(), + customization.clone(), + ) + }) + .bind((address, port))? + .run() + .await?; Ok(()) } @@ -68,6 +79,7 @@ pub fn create_app( config: Config, pool: Pool, mailer: Mailer, + customization: Customization, ) -> App< impl ServiceFactory< ServiceRequest, @@ -84,6 +96,7 @@ pub fn create_app( App::new() .app_data(web::Data::new(pool)) .app_data(web::Data::new(mailer)) + .app_data(web::Data::new(customization)) .configure(endpoints::init) .wrap(middleware::ErrorAppender) .wrap(TracingLogger::default()) diff --git a/web/src/utils/app_customization.rs b/web/src/utils/app_customization.rs new file mode 100644 index 00000000..59b435f9 --- /dev/null +++ b/web/src/utils/app_customization.rs @@ -0,0 +1,4 @@ +#[derive(Clone)] +pub struct Customization { + pub webmaster_email: String, +} diff --git a/web/src/utils/mod.rs b/web/src/utils/mod.rs index f848a788..435e3a25 100644 --- a/web/src/utils/mod.rs +++ b/web/src/utils/mod.rs @@ -5,6 +5,7 @@ pub mod event_planning_template; pub mod manage_commands; pub mod password_change; mod template_response_trait; +mod app_customization; pub mod token_generation; #[cfg(test)] @@ -13,6 +14,7 @@ pub mod test_helper; pub use application_error::ApplicationError; pub use date_time_format::DateTimeFormat; pub use template_response_trait::TemplateResponse; +pub use app_customization::Customization; use chrono::{NaiveDate, Utc}; diff --git a/web/src/utils/test_helper/test_context.rs b/web/src/utils/test_helper/test_context.rs index fe2f9d66..b13e9a5f 100644 --- a/web/src/utils/test_helper/test_context.rs +++ b/web/src/utils/test_helper/test_context.rs @@ -8,6 +8,7 @@ use actix_web::{ }; use rand::{distr::Alphanumeric, rng, Rng}; +use crate::utils::Customization; use crate::{create_app, mail::Mailer}; use brass_config::{load_config, Config, Environment}; use regex::{Captures, Regex}; @@ -29,10 +30,15 @@ impl DbTestContext { Response = ServiceResponse, Error = actix_web::error::Error, > { + let customization = Customization { + webmaster_email: self.config.webmaster_email.clone(), + }; + init_service(create_app( self.config.clone(), self.db_pool.clone(), Mailer::new_stub(), + customization, )) .await } diff --git a/web/templates/user/forgot_password.html b/web/templates/user/forgot_password.html index 8c43a722..993ba78b 100644 --- a/web/templates/user/forgot_password.html +++ b/web/templates/user/forgot_password.html @@ -6,7 +6,7 @@

Brass - Passwort zurücksetzen

- Gib deine E-Mail Adresse ein und erhalte einen Link zum Zurücksetzen deines Passworts, sofern ein Account mit dieser Adresse existiert. Bei Problemen wende dich an mail@example.com. + Gib deine E-Mail Adresse ein und erhalte einen Link zum Zurücksetzen deines Passworts, sofern ein Account mit dieser Adresse existiert. Bei Problemen wende dich an {{ webmaster_email }}.
diff --git a/web/templates/user/login.html b/web/templates/user/login.html index cb406836..4be96398 100644 --- a/web/templates/user/login.html +++ b/web/templates/user/login.html @@ -5,7 +5,7 @@

Brass - Anmeldung

+ hx-on:change="document.getElementById('error-message').innerHTML = ''"> {% if let Some(next) = next %} @@ -28,13 +28,22 @@
- - Passwort vergessen +
+ +
+