tuwunel_service/server_keys/
verify.rs1use ruma::{
8 CanonicalJsonObject, CanonicalJsonValue, OwnedEventId, RoomVersionId,
9 signatures::{Verified, verify_event},
10};
11use serde_json::value::RawValue as RawJsonValue;
12use tuwunel_core::{
13 Err, Result, implement,
14 matrix::{event::gen_event_id_canonical_json, room_version},
15};
16
17#[implement(super::Service)]
23pub async fn validate_and_add_event_id(
24 &self,
25 pdu: &RawJsonValue,
26 room_version_id: &RoomVersionId,
27) -> Result<(OwnedEventId, CanonicalJsonObject)> {
28 let (event_id, mut value) = gen_event_id_canonical_json(pdu, room_version_id)?;
29
30 if let Err(e) = self
31 .verify_event(&value, Some(room_version_id))
32 .await
33 {
34 return Err!(BadServerResponse(debug_error!(
35 "Event {event_id} failed verification: {e:?}"
36 )));
37 }
38
39 if !room_version::rules(room_version_id)?
41 .event_format
42 .require_event_id
43 {
44 value.insert("event_id".into(), CanonicalJsonValue::String(event_id.as_str().into()));
45 }
46
47 Ok((event_id, value))
48}
49
50#[implement(super::Service)]
56pub async fn validate_and_add_event_id_no_fetch(
57 &self,
58 pdu: &RawJsonValue,
59 room_version_id: &RoomVersionId,
60) -> Result<(OwnedEventId, CanonicalJsonObject)> {
61 let (event_id, mut value) = gen_event_id_canonical_json(pdu, room_version_id)?;
62 let room_version_rules = room_version::rules(room_version_id)?;
63
64 if !self
65 .required_keys_exist(&value, &room_version_rules)
66 .await
67 {
68 return Err!(BadServerResponse(debug_warn!(
69 "Event {event_id} cannot be verified: missing keys."
70 )));
71 }
72
73 if let Err(e) = self
74 .verify_event(&value, Some(room_version_id))
75 .await
76 {
77 return Err!(BadServerResponse(debug_error!(
78 "Event {event_id} failed verification: {e:?}"
79 )));
80 }
81
82 if !room_version_rules.event_format.require_event_id {
84 value.insert("event_id".into(), CanonicalJsonValue::String(event_id.as_str().into()));
85 }
86
87 Ok((event_id, value))
88}
89
90#[implement(super::Service)]
96pub async fn verify_event(
97 &self,
98 event: &CanonicalJsonObject,
99 room_version_id: Option<&RoomVersionId>,
100) -> Result<Verified> {
101 let room_version_id = room_version_id.unwrap_or(&RoomVersionId::V11);
102 let room_version_rules = room_version::rules(room_version_id)?;
103
104 let event_keys = self
105 .get_event_keys(event, &room_version_rules)
106 .await?;
107
108 verify_event(&event_keys, event, &room_version_rules).map_err(Into::into)
109}
110
111#[implement(super::Service)]
116pub async fn verify_json(
117 &self,
118 event: &CanonicalJsonObject,
119 room_version_id: Option<&RoomVersionId>,
120) -> Result {
121 let room_version_id = room_version_id.unwrap_or(&RoomVersionId::V11);
122 let room_version_rules = room_version::rules(room_version_id)?;
123
124 let event_keys = self
125 .get_event_keys(event, &room_version_rules)
126 .await?;
127
128 ruma::signatures::verify_json(&event_keys, event).map_err(Into::into)
129}