palpo_core/federation/
key.rs1use std::collections::BTreeMap;
10use std::time::Duration;
11
12use reqwest::Url;
13use salvo::prelude::*;
14use serde::{Deserialize, Serialize};
15
16use crate::encryption::OneTimeKey;
17use crate::encryption::{CrossSigningKey, DeviceKeys};
18use crate::sending::{SendRequest, SendResult};
19use crate::serde::Base64;
20use crate::{DeviceKeyAlgorithm, OwnedDeviceId, OwnedDeviceKeyId, OwnedUserId};
21
22pub fn get_server_key_request(origin: &str) -> SendResult<SendRequest> {
23 let url = Url::parse(&format!("{origin}/_matrix/key/v2/server"))?;
24 Ok(crate::sending::get(url))
25}
26
27pub fn claim_keys_request(origin: &str, body: ClaimKeysReqBody) -> SendResult<SendRequest> {
44 let url = Url::parse(&format!("{origin}/_matrix/client/v1/user/keys/claim"))?;
45 crate::sending::post(url).stuff(body)
46}
47
48#[derive(ToSchema, Deserialize, Serialize, Debug)]
50pub struct ClaimKeysReqBody {
51 #[serde(
52 with = "crate::serde::duration::opt_ms",
53 default,
54 skip_serializing_if = "Option::is_none"
55 )]
56 pub timeout: Option<Duration>,
57
58 #[salvo(schema(value_type = Object, additional_properties = true))]
60 pub one_time_keys: OneTimeKeyClaims,
61}
62crate::json_body_modifier!(ClaimKeysReqBody);
63
64#[derive(ToSchema, Deserialize, Serialize, Debug)]
66
67pub struct ClaimKeysResBody {
68 #[salvo(schema(value_type = Object, additional_properties = true))]
70 pub one_time_keys: OneTimeKeys,
71}
72impl ClaimKeysResBody {
73 pub fn new(one_time_keys: OneTimeKeys) -> Self {
75 Self { one_time_keys }
76 }
77}
78
79pub type OneTimeKeyClaims = BTreeMap<OwnedUserId, BTreeMap<OwnedDeviceId, DeviceKeyAlgorithm>>;
81
82pub type OneTimeKeys = BTreeMap<OwnedUserId, BTreeMap<OwnedDeviceId, BTreeMap<OwnedDeviceKeyId, OneTimeKey>>>;
84
85#[derive(Debug, Clone, Serialize, Deserialize)]
87pub struct KeyObject {
88 pub key: Base64,
90
91 pub signatures: BTreeMap<OwnedUserId, BTreeMap<OwnedDeviceKeyId, String>>,
93}
94
95impl KeyObject {
96 pub fn new(key: Base64, signatures: BTreeMap<OwnedUserId, BTreeMap<OwnedDeviceKeyId, String>>) -> Self {
98 Self { key, signatures }
99 }
100}
101
102pub fn query_keys_request(origin: &str, body: QueryKeysReqBody) -> SendResult<SendRequest> {
118 let url = Url::parse(&format!("{origin}/_matrix/federation/v1/user/keys/query"))?;
119 crate::sending::post(url).stuff(body)
120}
121
122#[derive(ToSchema, Deserialize, Serialize, Debug)]
125pub struct QueryKeysReqBody {
126 pub device_keys: BTreeMap<OwnedUserId, Vec<OwnedDeviceId>>,
130}
131crate::json_body_modifier!(QueryKeysReqBody);
132
133#[derive(ToSchema, Deserialize, Serialize, Default, Debug)]
135
136pub struct QueryKeysResBody {
137 pub device_keys: BTreeMap<OwnedUserId, BTreeMap<OwnedDeviceId, DeviceKeys>>,
139
140 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
142 pub master_keys: BTreeMap<OwnedUserId, CrossSigningKey>,
143
144 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
146 pub self_signing_keys: BTreeMap<OwnedUserId, CrossSigningKey>,
147}
148impl QueryKeysResBody {
149 pub fn new(device_keys: BTreeMap<OwnedUserId, BTreeMap<OwnedDeviceId, DeviceKeys>>) -> Self {
151 Self {
152 device_keys,
153 ..Default::default()
154 }
155 }
156}