tuwunel_service/server_keys/
verify.rs1use ruma::{
2 CanonicalJsonObject, CanonicalJsonValue, OwnedEventId, RoomVersionId,
3 signatures::{Verified, verify_event},
4};
5use serde_json::value::RawValue as RawJsonValue;
6use tuwunel_core::{
7 Err, Result, implement,
8 matrix::{event::gen_event_id_canonical_json, room_version},
9};
10
11#[implement(super::Service)]
12pub async fn validate_and_add_event_id(
13 &self,
14 pdu: &RawJsonValue,
15 room_version_id: &RoomVersionId,
16) -> Result<(OwnedEventId, CanonicalJsonObject)> {
17 let (event_id, mut value) = gen_event_id_canonical_json(pdu, room_version_id)?;
18
19 if let Err(e) = self
20 .verify_event(&value, Some(room_version_id))
21 .await
22 {
23 return Err!(BadServerResponse(debug_error!(
24 "Event {event_id} failed verification: {e:?}"
25 )));
26 }
27
28 if !room_version::rules(room_version_id)?
30 .event_format
31 .require_event_id
32 {
33 value.insert("event_id".into(), CanonicalJsonValue::String(event_id.as_str().into()));
34 }
35
36 Ok((event_id, value))
37}
38
39#[implement(super::Service)]
40pub async fn validate_and_add_event_id_no_fetch(
41 &self,
42 pdu: &RawJsonValue,
43 room_version_id: &RoomVersionId,
44) -> Result<(OwnedEventId, CanonicalJsonObject)> {
45 let (event_id, mut value) = gen_event_id_canonical_json(pdu, room_version_id)?;
46 let room_version_rules = room_version::rules(room_version_id)?;
47
48 if !self
49 .required_keys_exist(&value, &room_version_rules)
50 .await
51 {
52 return Err!(BadServerResponse(debug_warn!(
53 "Event {event_id} cannot be verified: missing keys."
54 )));
55 }
56
57 if let Err(e) = self
58 .verify_event(&value, Some(room_version_id))
59 .await
60 {
61 return Err!(BadServerResponse(debug_error!(
62 "Event {event_id} failed verification: {e:?}"
63 )));
64 }
65
66 if !room_version_rules.event_format.require_event_id {
68 value.insert("event_id".into(), CanonicalJsonValue::String(event_id.as_str().into()));
69 }
70
71 Ok((event_id, value))
72}
73
74#[implement(super::Service)]
75pub async fn verify_event(
76 &self,
77 event: &CanonicalJsonObject,
78 room_version_id: Option<&RoomVersionId>,
79) -> Result<Verified> {
80 let room_version_id = room_version_id.unwrap_or(&RoomVersionId::V11);
81 let room_version_rules = room_version::rules(room_version_id)?;
82
83 let event_keys = self
84 .get_event_keys(event, &room_version_rules)
85 .await?;
86
87 verify_event(&event_keys, event, &room_version_rules).map_err(Into::into)
88}
89
90#[implement(super::Service)]
91pub async fn verify_json(
92 &self,
93 event: &CanonicalJsonObject,
94 room_version_id: Option<&RoomVersionId>,
95) -> Result {
96 let room_version_id = room_version_id.unwrap_or(&RoomVersionId::V11);
97 let room_version_rules = room_version::rules(room_version_id)?;
98
99 let event_keys = self
100 .get_event_keys(event, &room_version_rules)
101 .await?;
102
103 ruma::signatures::verify_json(&event_keys, event).map_err(Into::into)
104}