Skip to main content

tuwunel_api_client/session/
logout.rs

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