Skip to main content

tuwunel_service/server_keys/
sign.rs

1use ruma::{CanonicalJsonObject, CanonicalJsonValue, OwnedEventId, RoomVersionId};
2use tuwunel_core::{
3	Result, err, implement,
4	matrix::{event::gen_event_id, room_version},
5};
6
7#[implement(super::Service)]
8pub fn gen_id_hash_and_sign_event(
9	&self,
10	object: &mut CanonicalJsonObject,
11	room_version_id: &RoomVersionId,
12) -> Result<OwnedEventId> {
13	object.remove("event_id");
14
15	if room_version::rules(room_version_id)?
16		.event_format
17		.require_event_id
18	{
19		self.gen_id_hash_and_sign_event_v1(object, room_version_id)
20	} else {
21		self.gen_id_hash_and_sign_event_v3(object, room_version_id)
22	}
23}
24
25#[implement(super::Service)]
26fn gen_id_hash_and_sign_event_v1(
27	&self,
28	object: &mut CanonicalJsonObject,
29	room_version_id: &RoomVersionId,
30) -> Result<OwnedEventId> {
31	let event_id = gen_event_id(object, room_version_id)?;
32
33	object.insert("event_id".into(), CanonicalJsonValue::String(event_id.clone().into()));
34
35	self.services
36		.server_keys
37		.hash_and_sign_event(object, room_version_id)?;
38
39	Ok(event_id)
40}
41
42#[implement(super::Service)]
43fn gen_id_hash_and_sign_event_v3(
44	&self,
45	object: &mut CanonicalJsonObject,
46	room_version_id: &RoomVersionId,
47) -> Result<OwnedEventId> {
48	self.services
49		.server_keys
50		.hash_and_sign_event(object, room_version_id)?;
51
52	let event_id = gen_event_id(object, room_version_id)?;
53
54	object.insert("event_id".into(), CanonicalJsonValue::String(event_id.clone().into()));
55
56	Ok(event_id)
57}
58
59#[implement(super::Service)]
60pub fn hash_and_sign_event(
61	&self,
62	object: &mut CanonicalJsonObject,
63	room_version_id: &RoomVersionId,
64) -> Result {
65	use ruma::signatures::{hash_event, sign_event};
66
67	let server_name = &self.services.server.name;
68	let room_version_rules = room_version::rules(room_version_id)?;
69
70	let map_err = |e: ruma::signatures::JsonError| {
71		use ruma::signatures::JsonError::PduTooLarge;
72		match e {
73			| PduTooLarge => {
74				err!(Request(TooLarge("PDU exceeds 65535 bytes")))
75			},
76			| _ => err!(Request(Unknown(warn!("Signing event failed: {e}")))),
77		}
78	};
79
80	hash_event(object).map_err(map_err)?;
81	sign_event(server_name.as_str(), self.keypair(), object, &room_version_rules.redaction)
82		.map_err(map_err)
83}
84
85#[implement(super::Service)]
86pub fn sign_json(&self, object: &mut CanonicalJsonObject) -> Result {
87	use ruma::signatures::sign_json;
88
89	let server_name = self.services.globals.server_name().as_str();
90
91	sign_json(server_name, self.keypair(), object).map_err(Into::into)
92}