mirror of
				https://github.com/dani-garcia/vaultwarden.git
				synced 2025-10-31 10:18:19 +02:00 
			
		
		
		
	Upgrade dependencies and swap lettre to async transport
This commit is contained in:
		| @@ -168,12 +168,12 @@ async fn register(data: JsonUpcase<RegisterData>, conn: DbConn) -> EmptyResult { | ||||
|  | ||||
|     if CONFIG.mail_enabled() { | ||||
|         if CONFIG.signups_verify() { | ||||
|             if let Err(e) = mail::send_welcome_must_verify(&user.email, &user.uuid) { | ||||
|             if let Err(e) = mail::send_welcome_must_verify(&user.email, &user.uuid).await { | ||||
|                 error!("Error sending welcome email: {:#?}", e); | ||||
|             } | ||||
|  | ||||
|             user.last_verifying_at = Some(user.created_at); | ||||
|         } else if let Err(e) = mail::send_welcome(&user.email) { | ||||
|         } else if let Err(e) = mail::send_welcome(&user.email).await { | ||||
|             error!("Error sending welcome email: {:#?}", e); | ||||
|         } | ||||
|     } | ||||
| @@ -416,7 +416,7 @@ async fn post_email_token(data: JsonUpcase<EmailTokenData>, headers: Headers, co | ||||
|     let token = crypto::generate_email_token(6); | ||||
|  | ||||
|     if CONFIG.mail_enabled() { | ||||
|         if let Err(e) = mail::send_change_email(&data.NewEmail, &token) { | ||||
|         if let Err(e) = mail::send_change_email(&data.NewEmail, &token).await { | ||||
|             error!("Error sending change-email email: {:#?}", e); | ||||
|         } | ||||
|     } | ||||
| @@ -485,14 +485,14 @@ async fn post_email(data: JsonUpcase<ChangeEmailData>, headers: Headers, conn: D | ||||
| } | ||||
|  | ||||
| #[post("/accounts/verify-email")] | ||||
| fn post_verify_email(headers: Headers) -> EmptyResult { | ||||
| async fn post_verify_email(headers: Headers) -> EmptyResult { | ||||
|     let user = headers.user; | ||||
|  | ||||
|     if !CONFIG.mail_enabled() { | ||||
|         err!("Cannot verify email address"); | ||||
|     } | ||||
|  | ||||
|     if let Err(e) = mail::send_verify_email(&user.email, &user.uuid) { | ||||
|     if let Err(e) = mail::send_verify_email(&user.email, &user.uuid).await { | ||||
|         error!("Error sending verify_email email: {:#?}", e); | ||||
|     } | ||||
|  | ||||
| @@ -544,7 +544,7 @@ async fn post_delete_recover(data: JsonUpcase<DeleteRecoverData>, conn: DbConn) | ||||
|  | ||||
|     if CONFIG.mail_enabled() { | ||||
|         if let Some(user) = User::find_by_mail(&data.Email, &conn).await { | ||||
|             if let Err(e) = mail::send_delete_account(&user.email, &user.uuid) { | ||||
|             if let Err(e) = mail::send_delete_account(&user.email, &user.uuid).await { | ||||
|                 error!("Error sending delete account email: {:#?}", e); | ||||
|             } | ||||
|         } | ||||
| @@ -644,7 +644,7 @@ async fn password_hint(data: JsonUpcase<PasswordHintData>, conn: DbConn) -> Empt | ||||
|         Some(user) => { | ||||
|             let hint: Option<String> = user.password_hint; | ||||
|             if CONFIG.mail_enabled() { | ||||
|                 mail::send_password_hint(email, hint)?; | ||||
|                 mail::send_password_hint(email, hint).await?; | ||||
|                 Ok(()) | ||||
|             } else if let Some(hint) = hint { | ||||
|                 err!(format!("Your password hint is: {}", hint)); | ||||
|   | ||||
| @@ -251,7 +251,8 @@ async fn send_invite(data: JsonUpcase<EmergencyAccessInviteData>, headers: Heade | ||||
|             Some(new_emergency_access.uuid), | ||||
|             Some(grantor_user.name.clone()), | ||||
|             Some(grantor_user.email), | ||||
|         )?; | ||||
|         ) | ||||
|         .await?; | ||||
|     } else { | ||||
|         // Automatically mark user as accepted if no email invites | ||||
|         match User::find_by_mail(&email, &conn).await { | ||||
| @@ -304,7 +305,8 @@ async fn resend_invite(emer_id: String, headers: Headers, conn: DbConn) -> Empty | ||||
|             Some(emergency_access.uuid), | ||||
|             Some(grantor_user.name.clone()), | ||||
|             Some(grantor_user.email), | ||||
|         )?; | ||||
|         ) | ||||
|         .await?; | ||||
|     } else { | ||||
|         if Invitation::find_by_mail(&email, &conn).await.is_none() { | ||||
|             let invitation = Invitation::new(email); | ||||
| @@ -366,7 +368,7 @@ async fn accept_invite(emer_id: String, data: JsonUpcase<AcceptData>, conn: DbCo | ||||
|         } | ||||
|  | ||||
|         if CONFIG.mail_enabled() { | ||||
|             mail::send_emergency_access_invite_accepted(&grantor_user.email, &grantee_user.email)?; | ||||
|             mail::send_emergency_access_invite_accepted(&grantor_user.email, &grantee_user.email).await?; | ||||
|         } | ||||
|  | ||||
|         Ok(()) | ||||
| @@ -449,7 +451,7 @@ async fn confirm_emergency_access( | ||||
|         emergency_access.save(&conn).await?; | ||||
|  | ||||
|         if CONFIG.mail_enabled() { | ||||
|             mail::send_emergency_access_invite_confirmed(&grantee_user.email, &grantor_user.name)?; | ||||
|             mail::send_emergency_access_invite_confirmed(&grantee_user.email, &grantor_user.name).await?; | ||||
|         } | ||||
|         Ok(Json(emergency_access.to_json())) | ||||
|     } else { | ||||
| @@ -495,7 +497,8 @@ async fn initiate_emergency_access(emer_id: String, headers: Headers, conn: DbCo | ||||
|             &initiating_user.name, | ||||
|             emergency_access.get_type_as_str(), | ||||
|             &emergency_access.wait_time_days.clone().to_string(), | ||||
|         )?; | ||||
|         ) | ||||
|         .await?; | ||||
|     } | ||||
|     Ok(Json(emergency_access.to_json())) | ||||
| } | ||||
| @@ -531,7 +534,7 @@ async fn approve_emergency_access(emer_id: String, headers: Headers, conn: DbCon | ||||
|         emergency_access.save(&conn).await?; | ||||
|  | ||||
|         if CONFIG.mail_enabled() { | ||||
|             mail::send_emergency_access_recovery_approved(&grantee_user.email, &grantor_user.name)?; | ||||
|             mail::send_emergency_access_recovery_approved(&grantee_user.email, &grantor_user.name).await?; | ||||
|         } | ||||
|         Ok(Json(emergency_access.to_json())) | ||||
|     } else { | ||||
| @@ -571,7 +574,7 @@ async fn reject_emergency_access(emer_id: String, headers: Headers, conn: DbConn | ||||
|         emergency_access.save(&conn).await?; | ||||
|  | ||||
|         if CONFIG.mail_enabled() { | ||||
|             mail::send_emergency_access_recovery_rejected(&grantee_user.email, &grantor_user.name)?; | ||||
|             mail::send_emergency_access_recovery_rejected(&grantee_user.email, &grantor_user.name).await?; | ||||
|         } | ||||
|         Ok(Json(emergency_access.to_json())) | ||||
|     } else { | ||||
| @@ -779,9 +782,11 @@ pub async fn emergency_request_timeout_job(pool: DbPool) { | ||||
|                         &grantee_user.name.clone(), | ||||
|                         emer.get_type_as_str(), | ||||
|                     ) | ||||
|                     .await | ||||
|                     .expect("Error on sending email"); | ||||
|  | ||||
|                     mail::send_emergency_access_recovery_approved(&grantee_user.email, &grantor_user.name.clone()) | ||||
|                         .await | ||||
|                         .expect("Error on sending email"); | ||||
|                 } | ||||
|             } | ||||
| @@ -831,6 +836,7 @@ pub async fn emergency_notification_reminder_job(pool: DbPool) { | ||||
|                         emer.get_type_as_str(), | ||||
|                         &emer.wait_time_days.to_string(), // TODO(jjlin): This should be the number of days left. | ||||
|                     ) | ||||
|                     .await | ||||
|                     .expect("Error on sending email"); | ||||
|                 } | ||||
|             } | ||||
|   | ||||
| @@ -652,7 +652,8 @@ async fn send_invite(org_id: String, data: JsonUpcase<InviteData>, headers: Admi | ||||
|                 Some(new_user.uuid), | ||||
|                 &org_name, | ||||
|                 Some(headers.user.email.clone()), | ||||
|             )?; | ||||
|             ) | ||||
|             .await?; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -732,7 +733,8 @@ async fn _reinvite_user(org_id: &str, user_org: &str, invited_by_email: &str, co | ||||
|             Some(user_org.uuid), | ||||
|             &org_name, | ||||
|             Some(invited_by_email.to_string()), | ||||
|         )?; | ||||
|         ) | ||||
|         .await?; | ||||
|     } else { | ||||
|         let invitation = Invitation::new(user.email); | ||||
|         invitation.save(conn).await?; | ||||
| @@ -830,10 +832,10 @@ async fn accept_invite( | ||||
|         }; | ||||
|         if let Some(invited_by_email) = &claims.invited_by_email { | ||||
|             // User was invited to an organization, so they must be confirmed manually after acceptance | ||||
|             mail::send_invite_accepted(&claims.email, invited_by_email, &org_name)?; | ||||
|             mail::send_invite_accepted(&claims.email, invited_by_email, &org_name).await?; | ||||
|         } else { | ||||
|             // User was invited from /admin, so they are automatically confirmed | ||||
|             mail::send_invite_confirmed(&claims.email, &org_name)?; | ||||
|             mail::send_invite_confirmed(&claims.email, &org_name).await?; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -928,7 +930,7 @@ async fn _confirm_invite( | ||||
|             Some(user) => user.email, | ||||
|             None => err!("Error looking up user."), | ||||
|         }; | ||||
|         mail::send_invite_confirmed(&address, &org_name)?; | ||||
|         mail::send_invite_confirmed(&address, &org_name).await?; | ||||
|     } | ||||
|  | ||||
|     user_to_confirm.save(conn).await | ||||
| @@ -1298,7 +1300,7 @@ async fn put_policy( | ||||
|                     let org = Organization::find_by_uuid(&member.org_uuid, &conn).await.unwrap(); | ||||
|                     let user = User::find_by_uuid(&member.user_uuid, &conn).await.unwrap(); | ||||
|  | ||||
|                     mail::send_2fa_removed_from_org(&user.email, &org.name)?; | ||||
|                     mail::send_2fa_removed_from_org(&user.email, &org.name).await?; | ||||
|                 } | ||||
|                 member.delete(&conn).await?; | ||||
|             } | ||||
| @@ -1323,7 +1325,7 @@ async fn put_policy( | ||||
|                         let org = Organization::find_by_uuid(&member.org_uuid, &conn).await.unwrap(); | ||||
|                         let user = User::find_by_uuid(&member.user_uuid, &conn).await.unwrap(); | ||||
|  | ||||
|                         mail::send_single_org_removed_from_org(&user.email, &org.name)?; | ||||
|                         mail::send_single_org_removed_from_org(&user.email, &org.name).await?; | ||||
|                     } | ||||
|                     member.delete(&conn).await?; | ||||
|                 } | ||||
| @@ -1462,7 +1464,8 @@ async fn import(org_id: String, data: JsonUpcase<OrgImportData>, headers: Header | ||||
|                         Some(new_org_user.uuid), | ||||
|                         &org_name, | ||||
|                         Some(headers.user.email.clone()), | ||||
|                     )?; | ||||
|                     ) | ||||
|                     .await?; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|   | ||||
| @@ -66,7 +66,7 @@ pub async fn send_token(user_uuid: &str, conn: &DbConn) -> EmptyResult { | ||||
|     twofactor.data = twofactor_data.to_json(); | ||||
|     twofactor.save(conn).await?; | ||||
|  | ||||
|     mail::send_token(&twofactor_data.email, &twofactor_data.last_token.map_res("Token is empty")?)?; | ||||
|     mail::send_token(&twofactor_data.email, &twofactor_data.last_token.map_res("Token is empty")?).await?; | ||||
|  | ||||
|     Ok(()) | ||||
| } | ||||
| @@ -132,7 +132,7 @@ async fn send_email(data: JsonUpcase<SendEmailData>, headers: Headers, conn: DbC | ||||
|     let twofactor = TwoFactor::new(user.uuid, TwoFactorType::EmailVerificationChallenge, twofactor_data.to_json()); | ||||
|     twofactor.save(&conn).await?; | ||||
|  | ||||
|     mail::send_token(&twofactor_data.email, &twofactor_data.last_token.map_res("Token is empty")?)?; | ||||
|     mail::send_token(&twofactor_data.email, &twofactor_data.last_token.map_res("Token is empty")?).await?; | ||||
|  | ||||
|     Ok(()) | ||||
| } | ||||
|   | ||||
| @@ -138,7 +138,7 @@ async fn disable_twofactor(data: JsonUpcase<DisableTwoFactorData>, headers: Head | ||||
|             if user_org.atype < UserOrgType::Admin { | ||||
|                 if CONFIG.mail_enabled() { | ||||
|                     let org = Organization::find_by_uuid(&user_org.org_uuid, &conn).await.unwrap(); | ||||
|                     mail::send_2fa_removed_from_org(&user.email, &org.name)?; | ||||
|                     mail::send_2fa_removed_from_org(&user.email, &org.name).await?; | ||||
|                 } | ||||
|                 user_org.delete(&conn).await?; | ||||
|             } | ||||
| @@ -183,6 +183,7 @@ pub async fn send_incomplete_2fa_notifications(pool: DbPool) { | ||||
|             user.email, login.ip_address | ||||
|         ); | ||||
|         mail::send_incomplete_2fa_login(&user.email, &login.ip_address, &login.login_time, &login.device_name) | ||||
|             .await | ||||
|             .expect("Error sending incomplete 2FA email"); | ||||
|         login.delete(&conn).await.expect("Error deleting incomplete 2FA record"); | ||||
|     } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user