@@ -35,7 +35,10 @@ where
|
||||
.filter_map(FlatOk::flat_ok)
|
||||
.flat_map(IntoIterator::into_iter)
|
||||
.for_each(|(server, sigs)| {
|
||||
batch.entry(server).or_default().extend(sigs.into_keys());
|
||||
batch
|
||||
.entry(server)
|
||||
.or_default()
|
||||
.extend(sigs.into_keys());
|
||||
});
|
||||
|
||||
let batch = batch
|
||||
@@ -51,8 +54,16 @@ where
|
||||
S: Iterator<Item = (&'a ServerName, K)> + Send + Clone,
|
||||
K: Iterator<Item = &'a ServerSigningKeyId> + Send + Clone,
|
||||
{
|
||||
let notary_only = self.services.server.config.only_query_trusted_key_servers;
|
||||
let notary_first_always = self.services.server.config.query_trusted_key_servers_first;
|
||||
let notary_only = self
|
||||
.services
|
||||
.server
|
||||
.config
|
||||
.only_query_trusted_key_servers;
|
||||
let notary_first_always = self
|
||||
.services
|
||||
.server
|
||||
.config
|
||||
.query_trusted_key_servers_first;
|
||||
let notary_first_on_join = self
|
||||
.services
|
||||
.server
|
||||
@@ -60,7 +71,10 @@ where
|
||||
.query_trusted_key_servers_first_on_join;
|
||||
|
||||
let requested_servers = batch.clone().count();
|
||||
let requested_keys = batch.clone().flat_map(|(_, key_ids)| key_ids).count();
|
||||
let requested_keys = batch
|
||||
.clone()
|
||||
.flat_map(|(_, key_ids)| key_ids)
|
||||
.count();
|
||||
|
||||
debug!("acquire {requested_keys} keys from {requested_servers}");
|
||||
|
||||
@@ -214,7 +228,8 @@ where
|
||||
| Err(e) => error!("Failed to contact notary {notary:?}: {e}"),
|
||||
| Ok(results) =>
|
||||
for server_keys in results {
|
||||
self.acquire_notary_result(&mut missing, server_keys).await;
|
||||
self.acquire_notary_result(&mut missing, server_keys)
|
||||
.await;
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -236,5 +251,8 @@ async fn acquire_notary_result(&self, missing: &mut Batch, server_keys: ServerSi
|
||||
}
|
||||
|
||||
fn keys_count(batch: &Batch) -> usize {
|
||||
batch.iter().flat_map(|(_, key_ids)| key_ids.iter()).count()
|
||||
batch
|
||||
.iter()
|
||||
.flat_map(|(_, key_ids)| key_ids.iter())
|
||||
.count()
|
||||
}
|
||||
|
||||
@@ -66,27 +66,44 @@ pub async fn get_verify_key(
|
||||
origin: &ServerName,
|
||||
key_id: &ServerSigningKeyId,
|
||||
) -> Result<VerifyKey> {
|
||||
let notary_first = self.services.server.config.query_trusted_key_servers_first;
|
||||
let notary_only = self.services.server.config.only_query_trusted_key_servers;
|
||||
let notary_first = self
|
||||
.services
|
||||
.server
|
||||
.config
|
||||
.query_trusted_key_servers_first;
|
||||
let notary_only = self
|
||||
.services
|
||||
.server
|
||||
.config
|
||||
.only_query_trusted_key_servers;
|
||||
|
||||
if let Some(result) = self.verify_keys_for(origin).await.remove(key_id) {
|
||||
return Ok(result);
|
||||
}
|
||||
|
||||
if notary_first {
|
||||
if let Ok(result) = self.get_verify_key_from_notaries(origin, key_id).await {
|
||||
if let Ok(result) = self
|
||||
.get_verify_key_from_notaries(origin, key_id)
|
||||
.await
|
||||
{
|
||||
return Ok(result);
|
||||
}
|
||||
}
|
||||
|
||||
if !notary_only {
|
||||
if let Ok(result) = self.get_verify_key_from_origin(origin, key_id).await {
|
||||
if let Ok(result) = self
|
||||
.get_verify_key_from_origin(origin, key_id)
|
||||
.await
|
||||
{
|
||||
return Ok(result);
|
||||
}
|
||||
}
|
||||
|
||||
if !notary_first {
|
||||
if let Ok(result) = self.get_verify_key_from_notaries(origin, key_id).await {
|
||||
if let Ok(result) = self
|
||||
.get_verify_key_from_notaries(origin, key_id)
|
||||
.await
|
||||
{
|
||||
return Ok(result);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -107,8 +107,11 @@ async fn add_signing_keys(&self, new_keys: ServerSigningKeys) {
|
||||
});
|
||||
|
||||
keys.verify_keys.extend(new_keys.verify_keys);
|
||||
keys.old_verify_keys.extend(new_keys.old_verify_keys);
|
||||
self.db.server_signingkeys.raw_put(origin, Json(&keys));
|
||||
keys.old_verify_keys
|
||||
.extend(new_keys.old_verify_keys);
|
||||
self.db
|
||||
.server_signingkeys
|
||||
.raw_put(origin, Json(&keys));
|
||||
}
|
||||
|
||||
#[implement(Service)]
|
||||
@@ -177,7 +180,11 @@ pub async fn verify_keys_for(&self, origin: &ServerName) -> VerifyKeys {
|
||||
|
||||
#[implement(Service)]
|
||||
pub async fn signing_keys_for(&self, origin: &ServerName) -> Result<ServerSigningKeys> {
|
||||
self.db.server_signingkeys.get(origin).await.deserialized()
|
||||
self.db
|
||||
.server_signingkeys
|
||||
.get(origin)
|
||||
.await
|
||||
.deserialized()
|
||||
}
|
||||
|
||||
#[implement(Service)]
|
||||
|
||||
@@ -42,7 +42,12 @@ where
|
||||
while let Some(batch) = server_keys
|
||||
.keys()
|
||||
.rev()
|
||||
.take(self.services.server.config.trusted_server_batch_size)
|
||||
.take(
|
||||
self.services
|
||||
.server
|
||||
.config
|
||||
.trusted_server_batch_size,
|
||||
)
|
||||
.next_back()
|
||||
.cloned()
|
||||
{
|
||||
|
||||
@@ -11,7 +11,10 @@ pub async fn validate_and_add_event_id(
|
||||
room_version: &RoomVersionId,
|
||||
) -> Result<(OwnedEventId, CanonicalJsonObject)> {
|
||||
let (event_id, mut value) = gen_event_id_canonical_json(pdu, room_version)?;
|
||||
if let Err(e) = self.verify_event(&value, Some(room_version)).await {
|
||||
if let Err(e) = self
|
||||
.verify_event(&value, Some(room_version))
|
||||
.await
|
||||
{
|
||||
return Err!(BadServerResponse(debug_error!(
|
||||
"Event {event_id} failed verification: {e:?}"
|
||||
)));
|
||||
@@ -29,13 +32,19 @@ pub async fn validate_and_add_event_id_no_fetch(
|
||||
room_version: &RoomVersionId,
|
||||
) -> Result<(OwnedEventId, CanonicalJsonObject)> {
|
||||
let (event_id, mut value) = gen_event_id_canonical_json(pdu, room_version)?;
|
||||
if !self.required_keys_exist(&value, room_version).await {
|
||||
if !self
|
||||
.required_keys_exist(&value, room_version)
|
||||
.await
|
||||
{
|
||||
return Err!(BadServerResponse(debug_warn!(
|
||||
"Event {event_id} cannot be verified: missing keys."
|
||||
)));
|
||||
}
|
||||
|
||||
if let Err(e) = self.verify_event(&value, Some(room_version)).await {
|
||||
if let Err(e) = self
|
||||
.verify_event(&value, Some(room_version))
|
||||
.await
|
||||
{
|
||||
return Err!(BadServerResponse(debug_error!(
|
||||
"Event {event_id} failed verification: {e:?}"
|
||||
)));
|
||||
|
||||
Reference in New Issue
Block a user