Skip to main content

tuwunel_api/client/account/
deactivate.rs

1use axum::extract::State;
2use futures::FutureExt;
3use ruma::api::client::account::{ThirdPartyIdRemovalStatus, deactivate};
4use tuwunel_core::{Result, info};
5
6use crate::{ClientIp, Ruma, router::auth_uiaa};
7
8/// # `POST /_matrix/client/r0/account/deactivate`
9///
10/// Deactivate sender user account.
11///
12/// - Leaves all rooms and rejects all invitations
13/// - Invalidates all access tokens
14/// - Deletes all device metadata (device id, device display name, last seen ip,
15///   last seen ts)
16/// - Forgets all to-device events
17/// - Triggers device list updates
18/// - Removes ability to log in again
19#[tracing::instrument(skip_all, fields(%client), name = "deactivate")]
20pub(crate) async fn deactivate_route(
21	State(services): State<crate::State>,
22	ClientIp(client): ClientIp,
23	body: Ruma<deactivate::v3::Request>,
24) -> Result<deactivate::v3::Response> {
25	let ref sender_user = auth_uiaa(&services, &body).await?;
26
27	services
28		.deactivate
29		.full_deactivate(sender_user, body.erase)
30		.boxed()
31		.await?;
32
33	info!("User {sender_user} deactivated their account.");
34	if services.server.config.admin_room_notices {
35		services
36			.admin
37			.notice(&format!("User {sender_user} deactivated their account."))
38			.await;
39	}
40
41	Ok(deactivate::v3::Response {
42		id_server_unbind_result: ThirdPartyIdRemovalStatus::NoSupport,
43	})
44}