mirror of
https://github.com/dani-garcia/vaultwarden.wiki.git
synced 2026-11-02 13:26:49 +02:00
Add registration email verification clicked endpoint (#7790)
This commit is contained in:
2 files changed
+28
-1
No files matched your search
@@ -46,6 +46,7 @@ pub fn routes() -> Vec<Route> {
|
|||||||
post_prelogin,
|
post_prelogin,
|
||||||
prelogin_password,
|
prelogin_password,
|
||||||
register_verification_email,
|
register_verification_email,
|
||||||
|
register_verification_email_clicked,
|
||||||
register_finish,
|
register_finish,
|
||||||
prevalidate,
|
prevalidate,
|
||||||
authorize,
|
authorize,
|
||||||
@@ -1034,6 +1035,13 @@ struct RegisterVerificationData {
|
|||||||
// receiveMarketingEmails: bool,
|
// receiveMarketingEmails: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
struct RegisterVerificationEmailClickedData {
|
||||||
|
email: String,
|
||||||
|
email_verification_token: String,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(rocket::Responder)]
|
#[derive(rocket::Responder)]
|
||||||
enum RegisterVerificationResponse {
|
enum RegisterVerificationResponse {
|
||||||
#[response(status = 204)]
|
#[response(status = 204)]
|
||||||
@@ -1096,6 +1104,25 @@ async fn register_verification_email(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[post("/accounts/register/verification-email-clicked", data = "<data>")]
|
||||||
|
async fn register_verification_email_clicked(
|
||||||
|
data: Json<RegisterVerificationEmailClickedData>,
|
||||||
|
conn: DbConn,
|
||||||
|
) -> EmptyResult {
|
||||||
|
let data = data.into_inner();
|
||||||
|
let token_valid = auth::decode_register_verify(&data.email_verification_token)
|
||||||
|
.is_ok_and(|claims| claims.verified && claims.sub.eq_ignore_ascii_case(&data.email));
|
||||||
|
let user_exists = User::find_by_mail(&data.email, &conn)
|
||||||
|
.await
|
||||||
|
.is_some_and(|user| !user.password_hash.is_empty() || user.private_key.is_some());
|
||||||
|
|
||||||
|
if !token_valid || user_exists {
|
||||||
|
err!("Expired link. Please restart registration or try logging in. You may already have an account")
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[post("/accounts/register/finish", data = "<data>")]
|
#[post("/accounts/register/finish", data = "<data>")]
|
||||||
async fn register_finish(data: Json<RegisterData>, ip: ClientIp, conn: DbConn) -> JsonResult {
|
async fn register_finish(data: Json<RegisterData>, ip: ClientIp, conn: DbConn) -> JsonResult {
|
||||||
crate::ratelimit::check_limit_unauthenticated(&ip.ip)?;
|
crate::ratelimit::check_limit_unauthenticated(&ip.ip)?;
|
||||||
|
|||||||
+1
-1
@@ -206,7 +206,7 @@ pub async fn send_verify_email(address: &str, user_id: &UserId) -> EmptyResult {
|
|||||||
|
|
||||||
pub async fn send_register_verify_email(email: &str, token: &str) -> EmptyResult {
|
pub async fn send_register_verify_email(email: &str, token: &str) -> EmptyResult {
|
||||||
let mut query = url::Url::parse("https://query.builder").unwrap();
|
let mut query = url::Url::parse("https://query.builder").unwrap();
|
||||||
query.query_pairs_mut().append_pair("email", email).append_pair("token", token);
|
query.query_pairs_mut().append_pair("email", email).append_pair("token", token).append_pair("fromEmail", "true");
|
||||||
let Some(query_string) = query.query() else {
|
let Some(query_string) = query.query() else {
|
||||||
err!("Failed to build verify URL query parameters")
|
err!("Failed to build verify URL query parameters")
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in new issue
Block a user