Skip to main content

tuwunel_api/client/backup/
keys_session.rs

1use axum::extract::State;
2use ruma::api::client::backup::{
3	add_backup_keys_for_session, delete_backup_keys_for_session, get_backup_keys_for_session,
4};
5use tuwunel_core::{Result, err};
6
7use super::{check_backup_version, get_count_etag};
8use crate::Ruma;
9
10/// # `PUT /_matrix/client/r0/room_keys/keys/{roomId}/{sessionId}`
11///
12/// Add the received backup key to the database.
13///
14/// - Only manipulating the most recently created version of the backup is
15///   allowed
16/// - Adds the keys to the backup
17/// - Returns the new number of keys in this backup and the etag
18pub(crate) async fn add_backup_keys_for_session_route(
19	State(services): State<crate::State>,
20	body: Ruma<add_backup_keys_for_session::v3::Request>,
21) -> Result<add_backup_keys_for_session::v3::Response> {
22	check_backup_version(&services, body.sender_user(), &body.version).await?;
23
24	services
25		.key_backups
26		.add_key(
27			body.sender_user(),
28			&body.version,
29			&body.room_id,
30			&body.session_id,
31			&body.session_data,
32		)
33		.await?;
34
35	let (count, etag) = get_count_etag(&services, body.sender_user(), &body.version).await?;
36
37	Ok(add_backup_keys_for_session::v3::Response { count, etag })
38}
39
40/// # `GET /_matrix/client/r0/room_keys/keys/{roomId}/{sessionId}`
41///
42/// Retrieves a key from the backup.
43pub(crate) async fn get_backup_keys_for_session_route(
44	State(services): State<crate::State>,
45	body: Ruma<get_backup_keys_for_session::v3::Request>,
46) -> Result<get_backup_keys_for_session::v3::Response> {
47	let key_data = services
48		.key_backups
49		.get_session(body.sender_user(), &body.version, &body.room_id, &body.session_id)
50		.await
51		.map_err(|_| {
52			err!(Request(NotFound(debug_error!("Backup key not found for this user's session."))))
53		})?;
54
55	Ok(get_backup_keys_for_session::v3::Response { key_data })
56}
57
58/// # `DELETE /_matrix/client/r0/room_keys/keys/{roomId}/{sessionId}`
59///
60/// Delete a key from the backup.
61pub(crate) async fn delete_backup_keys_for_session_route(
62	State(services): State<crate::State>,
63	body: Ruma<delete_backup_keys_for_session::v3::Request>,
64) -> Result<delete_backup_keys_for_session::v3::Response> {
65	services
66		.key_backups
67		.delete_room_key(body.sender_user(), &body.version, &body.room_id, &body.session_id)
68		.await;
69
70	let (count, etag) = get_count_etag(&services, body.sender_user(), &body.version).await?;
71
72	Ok(delete_backup_keys_for_session::v3::Response { count, etag })
73}