Skip to main content

tuwunel_api/client/backup/
keys_room.rs

1use axum::extract::State;
2use futures::{StreamExt, TryStreamExt};
3use ruma::api::client::backup::{
4	add_backup_keys_for_room, delete_backup_keys_for_room, get_backup_keys_for_room,
5};
6use tuwunel_core::{Result, utils::stream::IterStream};
7
8use super::{check_backup_version, get_count_etag};
9use crate::Ruma;
10
11/// # `PUT /_matrix/client/r0/room_keys/keys/{roomId}`
12///
13/// Add the received backup keys to the database.
14///
15/// - Only manipulating the most recently created version of the backup is
16///   allowed
17/// - Adds the keys to the backup
18/// - Returns the new number of keys in this backup and the etag
19pub(crate) async fn add_backup_keys_for_room_route(
20	State(services): State<crate::State>,
21	body: Ruma<add_backup_keys_for_room::v3::Request>,
22) -> Result<add_backup_keys_for_room::v3::Response> {
23	check_backup_version(&services, body.sender_user(), &body.version).await?;
24
25	body.sessions
26		.iter()
27		.stream()
28		.map(Ok)
29		.try_for_each(|(sid, kd)| {
30			services.key_backups.add_key(
31				body.sender_user(),
32				&body.version,
33				&body.room_id,
34				sid,
35				kd,
36			)
37		})
38		.await?;
39
40	let (count, etag) = get_count_etag(&services, body.sender_user(), &body.version).await?;
41
42	Ok(add_backup_keys_for_room::v3::Response { count, etag })
43}
44
45/// # `GET /_matrix/client/r0/room_keys/keys/{roomId}`
46///
47/// Retrieves all keys from the backup for a given room.
48pub(crate) async fn get_backup_keys_for_room_route(
49	State(services): State<crate::State>,
50	body: Ruma<get_backup_keys_for_room::v3::Request>,
51) -> Result<get_backup_keys_for_room::v3::Response> {
52	let sessions = services
53		.key_backups
54		.get_room(body.sender_user(), &body.version, &body.room_id)
55		.await;
56
57	Ok(get_backup_keys_for_room::v3::Response { sessions })
58}
59
60/// # `DELETE /_matrix/client/r0/room_keys/keys/{roomId}`
61///
62/// Delete the keys from the backup for a given room.
63pub(crate) async fn delete_backup_keys_for_room_route(
64	State(services): State<crate::State>,
65	body: Ruma<delete_backup_keys_for_room::v3::Request>,
66) -> Result<delete_backup_keys_for_room::v3::Response> {
67	services
68		.key_backups
69		.delete_room_keys(body.sender_user(), &body.version, &body.room_id)
70		.await;
71
72	let (count, etag) = get_count_etag(&services, body.sender_user(), &body.version).await?;
73
74	Ok(delete_backup_keys_for_room::v3::Response { count, etag })
75}