forgot password: handling testing environment, no emails when testing

This commit is contained in:
Philippe Loctaux 2023-04-22 12:56:09 +02:00
parent feb9f16bc9
commit a32d6b4807
5 changed files with 55 additions and 30 deletions

View file

@ -0,0 +1,19 @@
use email::Config;
use rocket::figment::Figment;
pub fn init(config: &Figment) -> Result<Option<Config>, String> {
match config.extract_inner::<Config>("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)
}
}
}

View file

@ -3,6 +3,7 @@ use rocket::{Build, Rocket};
mod cache; mod cache;
mod cors; mod cors;
mod database; mod database;
mod email;
mod error; mod error;
mod file_from_bytes; mod file_from_bytes;
mod guards; mod guards;
@ -19,6 +20,8 @@ mod tokens;
#[cfg(test)] #[cfg(test)]
mod tests; mod tests;
pub use crate::email::init as email_init;
pub fn rocket_setup(rocket_builder: Rocket<Build>) -> Rocket<Build> { pub fn rocket_setup(rocket_builder: Rocket<Build>) -> Rocket<Build> {
use cache::CacheControl; use cache::CacheControl;
use database::Database; use database::Database;

View file

@ -12,17 +12,7 @@ async fn main() -> Result<(), String> {
let config = rocket::Config::figment().merge(("ip_header", "x-forwarded-for")); let config = rocket::Config::figment().merge(("ip_header", "x-forwarded-for"));
// Get email config // Get email config
let email_config = match config.extract_inner::<email::Config>("email") { let email_config = ezidam::email_init(&config)?;
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);
// Rocket with custom config // Rocket with custom config
let rocket_builder = rocket::custom(config); let rocket_builder = rocket::custom(config);

View file

@ -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( pub async fn forgot_password_email_form(
mut db: Connection<Database>, mut db: Connection<Database>,
form: Form<ForgotPasswordEmailForm<'_>>, form: Form<ForgotPasswordEmailForm<'_>>,
email_config: &State<email::Config>, email_config: &State<Option<email::Config>>,
) -> Result<Flash<Redirect>> { ) -> Result<Flash<Redirect>> {
if form.email.is_empty() { if form.email.is_empty() {
return Ok(Flash::new( return Ok(Flash::new(
@ -176,7 +176,8 @@ pub async fn forgot_password_email_form(
}; };
// Send email // Send email
let (flash_kind, flash_message) = 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 { match email::send_email(email_config, &user_for_email, email_title, html).await {
Ok(okay) => { Ok(okay) => {
if okay.is_positive() { if okay.is_positive() {
@ -189,6 +190,12 @@ pub async fn forgot_password_email_form(
} }
} }
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( Ok(Flash::new(

View file

@ -1,4 +1,3 @@
use crate::rocket_setup;
use rocket::local::blocking::{Client, LocalResponse}; use rocket::local::blocking::{Client, LocalResponse};
use rocket::{Build, Rocket}; use rocket::{Build, Rocket};
@ -6,21 +5,28 @@ pub use rocket::http::{ContentType, Status};
pub use rocket::uri; pub use rocket::uri;
fn rocket_with_memory_database() -> Rocket<Build> { fn rocket_with_memory_database() -> Rocket<Build> {
use crate::{email_init, rocket_setup};
use rocket::figment::util::map; use rocket::figment::util::map;
use rocket::figment::Figment;
use rocket::Config; use rocket::Config;
// Custom config // Custom config
// - rocket defaults // - rocket defaults
// - from `Rocket.toml`
// - from env variables
// - from code below // - from code below
let options = map!["url" => ":memory:"]; let database_options = map!["url" => ":memory:"];
let config = Config::figment().merge(("databases", map!["ezidam" => &options])); 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); let rocket_builder = rocket::custom(config);
// Setup server // 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 { pub fn setup_rocket_testing() -> Client {