ruma_common/identifiers/
signatures.rs1use std::{
2 collections::BTreeMap,
3 ops::{Deref, DerefMut},
4};
5
6use serde::{Deserialize, Serialize};
7
8use super::{
9 Base64PublicKeyOrDeviceId, DeviceId, KeyName, OwnedServerName, OwnedSigningKeyId, OwnedUserId,
10 ServerSigningKeyVersion,
11};
12
13pub type EntitySignatures<K> = BTreeMap<OwnedSigningKeyId<K>, String>;
15
16#[derive(Debug, Serialize, Deserialize)]
31#[serde(
32 transparent,
33 bound(serialize = "E: Serialize", deserialize = "E: serde::de::DeserializeOwned")
34)]
35pub struct Signatures<E: Ord, K: KeyName + ?Sized>(BTreeMap<E, EntitySignatures<K>>);
36
37impl<E: Ord, K: KeyName + ?Sized> Signatures<E, K> {
38 pub fn new() -> Self {
40 Self::default()
41 }
42
43 pub fn insert_signature(
47 &mut self,
48 entity: E,
49 key_identifier: OwnedSigningKeyId<K>,
50 value: String,
51 ) -> Option<String> {
52 self.0.entry(entity).or_default().insert(key_identifier, value)
53 }
54}
55
56pub type ServerSignatures = Signatures<OwnedServerName, ServerSigningKeyVersion>;
58
59pub type DeviceSignatures = Signatures<OwnedUserId, DeviceId>;
61
62pub type CrossSigningOrDeviceSignatures = Signatures<OwnedUserId, Base64PublicKeyOrDeviceId>;
64
65impl<E, K> Clone for Signatures<E, K>
66where
67 E: Ord + Clone,
68 K: KeyName + ?Sized,
69{
70 fn clone(&self) -> Self {
71 Self(self.0.clone())
72 }
73}
74
75impl<E: Ord, K: KeyName + ?Sized> Default for Signatures<E, K> {
76 fn default() -> Self {
77 Self(Default::default())
78 }
79}
80
81impl<E: Ord, K: KeyName + ?Sized> Deref for Signatures<E, K> {
82 type Target = BTreeMap<E, EntitySignatures<K>>;
83
84 fn deref(&self) -> &Self::Target {
85 &self.0
86 }
87}
88
89impl<E: Ord, K: KeyName + ?Sized> DerefMut for Signatures<E, K> {
90 fn deref_mut(&mut self) -> &mut Self::Target {
91 &mut self.0
92 }
93}
94
95impl<E: Ord, K: KeyName + ?Sized, const N: usize> From<[(E, OwnedSigningKeyId<K>, String); N]>
96 for Signatures<E, K>
97{
98 fn from(value: [(E, OwnedSigningKeyId<K>, String); N]) -> Self {
99 value.into_iter().collect()
100 }
101}
102
103impl<E: Ord, K: KeyName + ?Sized> FromIterator<(E, OwnedSigningKeyId<K>, String)>
104 for Signatures<E, K>
105{
106 fn from_iter<T: IntoIterator<Item = (E, OwnedSigningKeyId<K>, String)>>(iter: T) -> Self {
107 iter.into_iter().fold(Self::new(), |mut acc, (entity, key_identifier, value)| {
108 acc.insert_signature(entity, key_identifier, value);
109 acc
110 })
111 }
112}
113
114impl<E: Ord, K: KeyName + ?Sized> Extend<(E, OwnedSigningKeyId<K>, String)> for Signatures<E, K> {
115 fn extend<T: IntoIterator<Item = (E, OwnedSigningKeyId<K>, String)>>(&mut self, iter: T) {
116 for (entity, key_identifier, value) in iter {
117 self.insert_signature(entity, key_identifier, value);
118 }
119 }
120}