Skip to main content

tuwunel_api/client/session/
logout.rs

1use axum::extract::State;
2use futures::StreamExt;
3use ruma::api::client::session::{logout, logout_all};
4use tuwunel_core::Result;
5
6use crate::{ClientIp, Ruma};
7
8/// # `POST /_matrix/client/v3/logout`
9///
10/// Log out the current device.
11///
12/// - Invalidates access token
13/// - Deletes device metadata (device id, device display name, last seen ip,
14///   last seen ts)
15/// - Forgets to-device events
16/// - Triggers device list updates
17#[tracing::instrument(skip_all, fields(%client), name = "logout")]
18pub(crate) async fn logout_route(
19	State(services): State<crate::State>,
20	ClientIp(client): ClientIp,
21	body: Ruma<logout::v3::Request>,
22) -> Result<logout::v3::Response> {
23	services
24		.users
25		.remove_device(body.sender_user(), body.sender_device()?)
26		.await;
27
28	Ok(logout::v3::Response::new())
29}
30
31/// # `POST /_matrix/client/r0/logout/all`
32///
33/// Log out all devices of this user.
34///
35/// - Invalidates all access tokens
36/// - Deletes all device metadata (device id, device display name, last seen ip,
37///   last seen ts)
38/// - Forgets all to-device events
39/// - Triggers device list updates
40///
41/// Note: This is equivalent to calling [`GET
42/// /_matrix/client/r0/logout`](fn.logout_route.html) from each device of this
43/// user.
44#[tracing::instrument(skip_all, fields(%client), name = "logout")]
45pub(crate) async fn logout_all_route(
46	State(services): State<crate::State>,
47	ClientIp(client): ClientIp,
48	body: Ruma<logout_all::v3::Request>,
49) -> Result<logout_all::v3::Response> {
50	services
51		.users
52		.all_device_ids(body.sender_user())
53		.for_each(|device_id| {
54			services
55				.users
56				.remove_device(body.sender_user(), device_id)
57		})
58		.await;
59
60	Ok(logout_all::v3::Response::new())
61}