use std::collections::BTreeMap;
use std::time::Duration;
use reqwest::Url;
use salvo::prelude::*;
use serde::{Deserialize, Serialize};
use crate::encryption::OneTimeKey;
use crate::encryption::{CrossSigningKey, DeviceKeys};
use crate::sending::{SendRequest, SendResult};
use crate::serde::Base64;
use crate::{DeviceKeyAlgorithm, OwnedDeviceId, OwnedDeviceKeyId, OwnedUserId};
pub fn get_server_key_request(origin: &str) -> SendResult<SendRequest> {
let url = Url::parse(&format!("{origin}/_matrix/key/v2/server"))?;
Ok(crate::sending::get(url))
}
pub fn claim_keys_request(origin: &str, body: ClaimKeysReqBody) -> SendResult<SendRequest> {
let url = Url::parse(&format!("{origin}/_matrix/client/v1/user/keys/claim"))?;
crate::sending::post(url).stuff(body)
}
#[derive(ToSchema, Deserialize, Serialize, Debug)]
pub struct ClaimKeysReqBody {
#[serde(
with = "crate::serde::duration::opt_ms",
default,
skip_serializing_if = "Option::is_none"
)]
pub timeout: Option<Duration>,
#[salvo(schema(value_type = Object, additional_properties = true))]
pub one_time_keys: OneTimeKeyClaims,
}
crate::json_body_modifier!(ClaimKeysReqBody);
#[derive(ToSchema, Deserialize, Serialize, Debug)]
pub struct ClaimKeysResBody {
#[salvo(schema(value_type = Object, additional_properties = true))]
pub one_time_keys: OneTimeKeys,
}
impl ClaimKeysResBody {
pub fn new(one_time_keys: OneTimeKeys) -> Self {
Self { one_time_keys }
}
}
pub type OneTimeKeyClaims = BTreeMap<OwnedUserId, BTreeMap<OwnedDeviceId, DeviceKeyAlgorithm>>;
pub type OneTimeKeys = BTreeMap<OwnedUserId, BTreeMap<OwnedDeviceId, BTreeMap<OwnedDeviceKeyId, OneTimeKey>>>;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct KeyObject {
pub key: Base64,
pub signatures: BTreeMap<OwnedUserId, BTreeMap<OwnedDeviceKeyId, String>>,
}
impl KeyObject {
pub fn new(key: Base64, signatures: BTreeMap<OwnedUserId, BTreeMap<OwnedDeviceKeyId, String>>) -> Self {
Self { key, signatures }
}
}
pub fn query_keys_request(origin: &str, body: QueryKeysReqBody) -> SendResult<SendRequest> {
let url = Url::parse(&format!("{origin}/_matrix/federation/v1/user/keys/query"))?;
crate::sending::post(url).stuff(body)
}
#[derive(ToSchema, Deserialize, Serialize, Debug)]
pub struct QueryKeysReqBody {
pub device_keys: BTreeMap<OwnedUserId, Vec<OwnedDeviceId>>,
}
crate::json_body_modifier!(QueryKeysReqBody);
#[derive(ToSchema, Deserialize, Serialize, Default, Debug)]
pub struct QueryKeysResBody {
pub device_keys: BTreeMap<OwnedUserId, BTreeMap<OwnedDeviceId, DeviceKeys>>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub master_keys: BTreeMap<OwnedUserId, CrossSigningKey>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub self_signing_keys: BTreeMap<OwnedUserId, CrossSigningKey>,
}
impl QueryKeysResBody {
pub fn new(device_keys: BTreeMap<OwnedUserId, BTreeMap<OwnedDeviceId, DeviceKeys>>) -> Self {
Self {
device_keys,
..Default::default()
}
}
}