2026-04-07 12:17:35 -04:00
|
|
|
use std::collections::BTreeMap;
|
2026-03-29 12:25:42 -04:00
|
|
|
|
2026-04-07 14:40:10 +01:00
|
|
|
use ruma::{
|
2026-04-07 12:17:35 -04:00
|
|
|
CanonicalJsonObject, CanonicalJsonValue, OwnedServerName, OwnedServerSigningKeyId,
|
2026-04-07 10:44:05 -04:00
|
|
|
room_version_rules::SignaturesRules,
|
2026-04-07 12:17:35 -04:00
|
|
|
signatures::{VerificationError, required_server_signatures_to_verify_event},
|
2026-04-07 14:40:10 +01:00
|
|
|
};
|
2026-03-29 12:25:42 -04:00
|
|
|
|
|
|
|
|
/// Extracts the server names and key ids to check signatures for given event.
|
2026-04-07 12:17:35 -04:00
|
|
|
pub(super) fn required_keys(
|
2026-03-29 12:25:42 -04:00
|
|
|
object: &CanonicalJsonObject,
|
2026-04-07 10:44:05 -04:00
|
|
|
rules: &SignaturesRules,
|
2026-04-07 14:40:10 +01:00
|
|
|
) -> Result<BTreeMap<OwnedServerName, Vec<OwnedServerSigningKeyId>>, VerificationError> {
|
2026-03-29 12:25:42 -04:00
|
|
|
use CanonicalJsonValue::Object;
|
|
|
|
|
let mut map = BTreeMap::<OwnedServerName, Vec<OwnedServerSigningKeyId>>::new();
|
|
|
|
|
let Some(Object(signatures)) = object.get("signatures") else {
|
|
|
|
|
return Ok(map);
|
|
|
|
|
};
|
|
|
|
|
|
2026-04-07 10:44:05 -04:00
|
|
|
for server in required_server_signatures_to_verify_event(object, rules)? {
|
2026-03-29 12:25:42 -04:00
|
|
|
let Some(Object(set)) = signatures.get(server.as_str()) else {
|
|
|
|
|
continue;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
let entry = map.entry(server.clone()).or_default();
|
|
|
|
|
set.iter()
|
|
|
|
|
.map(|(k, _)| k.clone())
|
|
|
|
|
.map(TryInto::try_into)
|
|
|
|
|
.filter_map(Result::ok)
|
|
|
|
|
.for_each(|key_id| entry.push(key_id));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Ok(map)
|
2026-04-07 14:40:10 +01:00
|
|
|
}
|