Skip to main content

tuwunel_api_client/account/3pid/
request_3pid_management_token_via_email.rs

1use axum::extract::State;
2use ruma::api::client::account::request_3pid_management_token_via_email::{self, v3::Response};
3use tuwunel_core::{Err, Result};
4use tuwunel_service::threepid::canonicalize_email;
5
6use super::email_token::send_email_token;
7use crate::{ClientIp, Ruma, utils::check_email_domain};
8
9/// # `POST /_matrix/client/v3/account/3pid/email/requestToken`
10///
11/// Request a validation token to add an email address to the account.
12pub(crate) async fn request_3pid_management_token_via_email_route(
13	State(services): State<crate::State>,
14	ClientIp(client): ClientIp,
15	body: Ruma<request_3pid_management_token_via_email::v3::Request>,
16) -> Result<Response> {
17	if !services.sendmail.is_enabled() {
18		return Err!(Request(ThreepidDenied("Email verification is not configured")));
19	}
20
21	let email_canon = canonicalize_email(&body.email)?;
22
23	check_email_domain(&services, &email_canon)?;
24
25	if services
26		.threepid
27		.address_in_use(&email_canon)
28		.await
29	{
30		return Err!(Request(ThreepidInUse("That email address is already in use")));
31	}
32
33	let sid = send_email_token(
34		&services,
35		client,
36		body.client_secret.as_str(),
37		&email_canon,
38		body.send_attempt.into(),
39	)
40	.await?;
41
42	Ok(Response::new(sid))
43}