From a32d6b4807da90580ca1e3860d5a738506c1516f Mon Sep 17 00:00:00 2001 From: Philippe Loctaux Date: Sat, 22 Apr 2023 12:56:09 +0200 Subject: [PATCH] forgot password: handling testing environment, no emails when testing --- crates/ezidam/src/email.rs | 19 +++++++++++ crates/ezidam/src/lib.rs | 3 ++ crates/ezidam/src/main.rs | 12 +------ .../ezidam/src/routes/root/forgot_password.rs | 33 +++++++++++-------- crates/ezidam/src/tests.rs | 18 ++++++---- 5 files changed, 55 insertions(+), 30 deletions(-) create mode 100644 crates/ezidam/src/email.rs diff --git a/crates/ezidam/src/email.rs b/crates/ezidam/src/email.rs new file mode 100644 index 0000000..cd47150 --- /dev/null +++ b/crates/ezidam/src/email.rs @@ -0,0 +1,19 @@ +use email::Config; +use rocket::figment::Figment; + +pub fn init(config: &Figment) -> Result, String> { + match config.extract_inner::("email") { + Ok(email_config) => match email_config.status() { + Ok(status) => { + println!("{status}"); + println!("Emails will be sent from \"{}\"", email_config.from); + Ok(Some(email_config)) + } + Err(e) => Err(format!("Invalid email configuration: {e}")), + }, + Err(e) => { + println!("Sending emails has been disabled: {e}"); + Ok(None) + } + } +} diff --git a/crates/ezidam/src/lib.rs b/crates/ezidam/src/lib.rs index 8faffdb..eeb4762 100644 --- a/crates/ezidam/src/lib.rs +++ b/crates/ezidam/src/lib.rs @@ -3,6 +3,7 @@ use rocket::{Build, Rocket}; mod cache; mod cors; mod database; +mod email; mod error; mod file_from_bytes; mod guards; @@ -19,6 +20,8 @@ mod tokens; #[cfg(test)] mod tests; +pub use crate::email::init as email_init; + pub fn rocket_setup(rocket_builder: Rocket) -> Rocket { use cache::CacheControl; use database::Database; diff --git a/crates/ezidam/src/main.rs b/crates/ezidam/src/main.rs index 89f7a13..fedb2f2 100644 --- a/crates/ezidam/src/main.rs +++ b/crates/ezidam/src/main.rs @@ -12,17 +12,7 @@ async fn main() -> Result<(), String> { let config = rocket::Config::figment().merge(("ip_header", "x-forwarded-for")); // Get email config - let email_config = match config.extract_inner::("email") { - Ok(email_config) => match email_config.status() { - Ok(status) => { - println!("{status}"); - email_config - } - Err(e) => return Err(format!("Invalid email configuration: {e}")), - }, - Err(e) => return Err(format!("No email configuration was found: {e}")), - }; - println!("Emails will be sent from \"{}\"", email_config.from); + let email_config = ezidam::email_init(&config)?; // Rocket with custom config let rocket_builder = rocket::custom(config); diff --git a/crates/ezidam/src/routes/root/forgot_password.rs b/crates/ezidam/src/routes/root/forgot_password.rs index 3c62b5a..bb5b84d 100644 --- a/crates/ezidam/src/routes/root/forgot_password.rs +++ b/crates/ezidam/src/routes/root/forgot_password.rs @@ -42,7 +42,7 @@ const SUCCESS_MESSAGE: &str = "An email is on the way with instructions to reset pub async fn forgot_password_email_form( mut db: Connection, form: Form>, - email_config: &State, + email_config: &State>, ) -> Result> { if form.email.is_empty() { return Ok(Flash::new( @@ -176,20 +176,27 @@ pub async fn forgot_password_email_form( }; // Send email - let (flash_kind, flash_message) = - match email::send_email(email_config, &user_for_email, email_title, html).await { - Ok(okay) => { - if okay.is_positive() { - (FlashKind::Success, SUCCESS_MESSAGE.to_string()) - } else { - ( - FlashKind::Warning, - "Email should be on it's way, but it might not arrive".into(), - ) + let (flash_kind, flash_message) = match email_config.inner() { + Some(email_config) => { + match email::send_email(email_config, &user_for_email, email_title, html).await { + Ok(okay) => { + if okay.is_positive() { + (FlashKind::Success, SUCCESS_MESSAGE.to_string()) + } else { + ( + FlashKind::Warning, + "Email should be on it's way, but it might not arrive".into(), + ) + } } + Err(e) => (FlashKind::Danger, e.to_string()), } - Err(e) => (FlashKind::Danger, e.to_string()), - }; + } + None => ( + FlashKind::Warning, + "Email sending is disabled. Contact your administrator to reset your password.".into(), + ), + }; Ok(Flash::new( Redirect::to(uri!(forgot_password_page)), diff --git a/crates/ezidam/src/tests.rs b/crates/ezidam/src/tests.rs index 3698d79..169dbfc 100644 --- a/crates/ezidam/src/tests.rs +++ b/crates/ezidam/src/tests.rs @@ -1,4 +1,3 @@ -use crate::rocket_setup; use rocket::local::blocking::{Client, LocalResponse}; use rocket::{Build, Rocket}; @@ -6,21 +5,28 @@ pub use rocket::http::{ContentType, Status}; pub use rocket::uri; fn rocket_with_memory_database() -> Rocket { + use crate::{email_init, rocket_setup}; use rocket::figment::util::map; + use rocket::figment::Figment; use rocket::Config; // Custom config // - rocket defaults - // - from `Rocket.toml` - // - from env variables // - from code below - let options = map!["url" => ":memory:"]; - let config = Config::figment().merge(("databases", map!["ezidam" => &options])); + let database_options = map!["url" => ":memory:"]; + let config = + Figment::from(Config::default()).merge(("databases", map!["ezidam" => &database_options])); + + // Get email config + let email_config = email_init(&config).unwrap_or(None); let rocket_builder = rocket::custom(config); // Setup server - rocket_setup(rocket_builder) + let rocket_builder = rocket_setup(rocket_builder); + + // Attach email config + rocket_builder.manage(email_config) } pub fn setup_rocket_testing() -> Client {