client-api: Add support for fallback keys

This implements support for MSC2732[1], fallback keys. Only support to
upload and get notifications about fallback keys via `/sync` is
implemented.

[1]: https://github.com/matrix-org/matrix-doc/pull/2732
This commit is contained in:
Damir Jelić 2021-12-01 16:02:24 +01:00 committed by Jonas Platte
parent af0a8f009c
commit caa3c05db3
3 changed files with 33 additions and 1 deletions

View File

@ -29,6 +29,11 @@ ruma_api! {
/// One-time public keys for "pre-key" messages.
#[serde(skip_serializing_if = "Option::is_none")]
pub one_time_keys: Option<BTreeMap<Box<DeviceKeyId>, Raw<OneTimeKey>>>,
/// Fallback public keys for "pre-key" messages.
#[cfg(feature = "unstable-pre-spec")]
#[serde(skip_serializing_if = "Option::is_none", rename = "org.matrix.msc2732.fallback_keys")]
pub fallback_keys: Option<BTreeMap<Box<DeviceKeyId>, Raw<OneTimeKey>>>,
}
response: {

View File

@ -93,6 +93,15 @@ ruma_api! {
/// currently held on the server for a device.
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub device_one_time_keys_count: BTreeMap<DeviceKeyAlgorithm, UInt>,
/// For each key algorithm, the number of unclaimed one-time keys
/// currently held on the server for a device.
///
/// The presence of this field indicates that the server supports
/// fallback keys.
#[cfg(feature = "unstable-pre-spec")]
#[serde(rename = "org.matrix.msc2732.device_unused_fallback_key_types")]
pub device_unused_fallback_key_types: Option<Vec<DeviceKeyAlgorithm>>,
}
error: crate::Error
@ -116,6 +125,8 @@ impl Response {
to_device: Default::default(),
device_lists: Default::default(),
device_one_time_keys_count: BTreeMap::new(),
#[cfg(feature = "unstable-pre-spec")]
device_unused_fallback_key_types: None,
}
}
}

View File

@ -83,12 +83,28 @@ pub struct SignedKey {
/// Signatures for the key object.
pub signatures: SignedKeySignatures,
/// Is this key considered to be a fallback key, defaults to false.
#[cfg(feature = "unstable-pre-spec")]
#[serde(default, skip_serializing_if = "ruma_serde::is_default")]
pub fallback: bool,
}
impl SignedKey {
/// Creates a new `SignedKey` with the given key and signatures.
pub fn new(key: String, signatures: SignedKeySignatures) -> Self {
Self { key, signatures }
Self {
key,
signatures,
#[cfg(feature = "unstable-pre-spec")]
fallback: false,
}
}
/// Creates a new fallback `SignedKey` with the given key and signatures.
#[cfg(feature = "unstable-pre-spec")]
pub fn new_fallback(key: String, signatures: SignedKeySignatures) -> Self {
Self { key, signatures, fallback: true }
}
}