Refactor usage of CanonicalJsonValue

next
Jonas Platte 2021-04-26 18:20:20 +02:00
parent c2b72773d5
commit 2e1d7d12ca
No known key found for this signature in database
GPG Key ID: CC154DE0E30B7C67
4 changed files with 63 additions and 75 deletions

View File

@ -24,7 +24,7 @@ use ruma::{
room::{create::CreateEventContent, member}, room::{create::CreateEventContent, member},
EventType, EventType,
}, },
serde::{to_canonical_value, CanonicalJsonObject, Raw}, serde::{to_canonical_value, CanonicalJsonObject, CanonicalJsonValue, Raw},
uint, EventId, RoomId, RoomVersionId, ServerName, UserId, uint, EventId, RoomId, RoomVersionId, ServerName, UserId,
}; };
use state_res::EventMap; use state_res::EventMap;
@ -481,13 +481,15 @@ async fn join_room_by_id_helper(
// TODO: Is origin needed? // TODO: Is origin needed?
join_event_stub.insert( join_event_stub.insert(
"origin".to_owned(), "origin".to_owned(),
to_canonical_value(db.globals.server_name()) CanonicalJsonValue::String(db.globals.server_name().as_str().to_owned()),
.map_err(|_| Error::bad_database("Invalid server name found"))?,
); );
join_event_stub.insert( join_event_stub.insert(
"origin_server_ts".to_owned(), "origin_server_ts".to_owned(),
to_canonical_value(utils::millis_since_unix_epoch()) CanonicalJsonValue::Integer(
.expect("Timestamp is valid js_int value"), utils::millis_since_unix_epoch()
.try_into()
.expect("Timestamp is valid js_int value"),
),
); );
join_event_stub.insert( join_event_stub.insert(
"content".to_owned(), "content".to_owned(),
@ -524,7 +526,7 @@ async fn join_room_by_id_helper(
// Add event_id back // Add event_id back
join_event_stub.insert( join_event_stub.insert(
"event_id".to_owned(), "event_id".to_owned(),
to_canonical_value(&event_id).expect("EventId is a valid CanonicalJsonValue"), CanonicalJsonValue::String(event_id.as_str().to_owned()),
); );
// It has enough fields to be called a proper event now // It has enough fields to be called a proper event now
@ -717,8 +719,7 @@ async fn validate_and_add_event_id(
value.insert( value.insert(
"event_id".to_owned(), "event_id".to_owned(),
to_canonical_value(&event_id) CanonicalJsonValue::String(event_id.as_str().to_owned()),
.expect("a valid EventId can be converted to CanonicalJsonValue"),
); );
Ok((event_id, value)) Ok((event_id, value))

View File

@ -15,7 +15,7 @@ use ruma::{
AnyStrippedStateEvent, AnySyncStateEvent, EventType, AnyStrippedStateEvent, AnySyncStateEvent, EventType,
}, },
push::{self, Action, Tweak}, push::{self, Action, Tweak},
serde::{to_canonical_value, CanonicalJsonObject, CanonicalJsonValue, Raw}, serde::{CanonicalJsonObject, CanonicalJsonValue, Raw},
uint, EventId, RoomAliasId, RoomId, RoomVersionId, ServerName, UserId, uint, EventId, RoomAliasId, RoomId, RoomVersionId, ServerName, UserId,
}; };
use sled::IVec; use sled::IVec;
@ -372,9 +372,7 @@ impl Rooms {
for event_id in new_state.difference(&old_state) { for event_id in new_state.difference(&old_state) {
if let Some(pdu) = self.get_pdu_json(event_id)? { if let Some(pdu) = self.get_pdu_json(event_id)? {
if pdu.get("event_type") if pdu.get("event_type").and_then(|val| val.as_str()) == Some("m.room.member") {
== Some(&CanonicalJsonValue::String("m.room.member".to_owned()))
{
if let Ok(pdu) = serde_json::from_value::<PduEvent>( if let Ok(pdu) = serde_json::from_value::<PduEvent>(
serde_json::to_value(&pdu).expect("CanonicalJsonObj is a valid JsonValue"), serde_json::to_value(&pdu).expect("CanonicalJsonObj is a valid JsonValue"),
) { ) {
@ -1321,8 +1319,7 @@ impl Rooms {
// Add origin because synapse likes that (and it's required in the spec) // Add origin because synapse likes that (and it's required in the spec)
pdu_json.insert( pdu_json.insert(
"origin".to_owned(), "origin".to_owned(),
to_canonical_value(db.globals.server_name()) CanonicalJsonValue::String(db.globals.server_name().as_ref().to_owned()),
.expect("server name is a valid CanonicalJsonValue"),
); );
ruma::signatures::hash_and_sign_event( ruma::signatures::hash_and_sign_event(
@ -1343,7 +1340,7 @@ impl Rooms {
pdu_json.insert( pdu_json.insert(
"event_id".to_owned(), "event_id".to_owned(),
to_canonical_value(&pdu.event_id).expect("EventId is a valid CanonicalJsonValue"), CanonicalJsonValue::String(pdu.event_id.as_str().to_owned()),
); );
// Increment the last index and use that // Increment the last index and use that
@ -1885,13 +1882,15 @@ impl Rooms {
// TODO: Is origin needed? // TODO: Is origin needed?
leave_event_stub.insert( leave_event_stub.insert(
"origin".to_owned(), "origin".to_owned(),
to_canonical_value(db.globals.server_name()) CanonicalJsonValue::String(db.globals.server_name().as_str().to_owned()),
.map_err(|_| Error::bad_database("Invalid server name found"))?,
); );
leave_event_stub.insert( leave_event_stub.insert(
"origin_server_ts".to_owned(), "origin_server_ts".to_owned(),
to_canonical_value(utils::millis_since_unix_epoch()) CanonicalJsonValue::Integer(
.expect("Timestamp is valid js_int value"), utils::millis_since_unix_epoch()
.try_into()
.expect("Timestamp is valid js_int value"),
),
); );
// We don't leave the event id in the pdu because that's only allowed in v1 or v2 rooms // We don't leave the event id in the pdu because that's only allowed in v1 or v2 rooms
leave_event_stub.remove("event_id"); leave_event_stub.remove("event_id");
@ -1916,7 +1915,7 @@ impl Rooms {
// Add event_id back // Add event_id back
leave_event_stub.insert( leave_event_stub.insert(
"event_id".to_owned(), "event_id".to_owned(),
to_canonical_value(&event_id).expect("EventId is a valid CanonicalJsonValue"), CanonicalJsonValue::String(event_id.as_str().to_owned()),
); );
// It has enough fields to be called a proper event now // It has enough fields to be called a proper event now

View File

@ -5,7 +5,7 @@ use ruma::{
pdu::EventHash, room::member::MemberEventContent, AnyEvent, AnyRoomEvent, AnyStateEvent, pdu::EventHash, room::member::MemberEventContent, AnyEvent, AnyRoomEvent, AnyStateEvent,
AnyStrippedStateEvent, AnySyncRoomEvent, AnySyncStateEvent, EventType, StateEvent, AnyStrippedStateEvent, AnySyncRoomEvent, AnySyncStateEvent, EventType, StateEvent,
}, },
serde::{to_canonical_value, CanonicalJsonObject, CanonicalJsonValue, Raw}, serde::{CanonicalJsonObject, CanonicalJsonValue, Raw},
EventId, RoomId, RoomVersionId, ServerName, ServerSigningKeyId, UInt, UserId, EventId, RoomId, RoomVersionId, ServerName, ServerSigningKeyId, UInt, UserId,
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -238,7 +238,7 @@ impl PduEvent {
) -> Result<Self, serde_json::Error> { ) -> Result<Self, serde_json::Error> {
json.insert( json.insert(
"event_id".to_string(), "event_id".to_string(),
to_canonical_value(event_id).expect("event_id is a valid Value"), CanonicalJsonValue::String(event_id.as_str().to_owned()),
); );
serde_json::from_value(serde_json::to_value(json).expect("valid JSON")) serde_json::from_value(serde_json::to_value(json).expect("valid JSON"))

View File

@ -33,7 +33,7 @@ use ruma::{
}, },
EventType, EventType,
}, },
serde::{to_canonical_value, Raw}, serde::Raw,
signatures::{CanonicalJsonObject, CanonicalJsonValue}, signatures::{CanonicalJsonObject, CanonicalJsonValue},
uint, EventId, RoomId, RoomVersionId, ServerName, ServerSigningKeyId, UserId, uint, EventId, RoomId, RoomVersionId, ServerName, ServerSigningKeyId, UserId,
}; };
@ -709,11 +709,7 @@ pub fn handle_incoming_pdu<'a>(
// 1. Check the server is in the room // 1. Check the server is in the room
let room_id = match value let room_id = match value
.get("room_id") .get("room_id")
.map(|id| match id { .and_then(|id| RoomId::try_from(id.as_str()?).ok())
CanonicalJsonValue::String(id) => RoomId::try_from(id.as_str()).ok(),
_ => None,
})
.flatten()
{ {
Some(id) => id, Some(id) => id,
None => { None => {
@ -776,7 +772,7 @@ pub fn handle_incoming_pdu<'a>(
// to our PduEvent type // to our PduEvent type
val.insert( val.insert(
"event_id".to_owned(), "event_id".to_owned(),
to_canonical_value(&event_id).expect("EventId is a valid CanonicalJsonValue"), CanonicalJsonValue::String(event_id.as_str().to_owned()),
); );
let incoming_pdu = serde_json::from_value::<PduEvent>( let incoming_pdu = serde_json::from_value::<PduEvent>(
serde_json::to_value(&val).expect("CanonicalJsonObj is a valid JsonValue"), serde_json::to_value(&val).expect("CanonicalJsonObj is a valid JsonValue"),
@ -1306,8 +1302,7 @@ pub(crate) fn fetch_and_handle_events<'a>(
Ok(_) => { Ok(_) => {
value.insert( value.insert(
"event_id".to_owned(), "event_id".to_owned(),
to_canonical_value(&event_id) CanonicalJsonValue::String(event_id.into()),
.expect("EventId is a valid CanonicalJsonValue"),
); );
Arc::new(serde_json::from_value( Arc::new(serde_json::from_value(
@ -1805,8 +1800,7 @@ pub fn create_join_event_template_route<'a>(
// Add origin because synapse likes that (and it's required in the spec) // Add origin because synapse likes that (and it's required in the spec)
pdu_json.insert( pdu_json.insert(
"origin".to_owned(), "origin".to_owned(),
to_canonical_value(db.globals.server_name()) CanonicalJsonValue::String(db.globals.server_name().as_str().to_owned()),
.expect("server name is a valid CanonicalJsonValue"),
); );
Ok(create_join_event_template::v1::Response { Ok(create_join_event_template::v1::Response {
@ -1979,33 +1973,30 @@ pub async fn create_invite_route<'a>(
// Add event_id back // Add event_id back
signed_event.insert( signed_event.insert(
"event_id".to_owned(), "event_id".to_owned(),
to_canonical_value(&event_id).expect("EventId is a valid CanonicalJsonValue"), CanonicalJsonValue::String(event_id.into()),
); );
let sender = serde_json::from_value( let sender = serde_json::from_value(
serde_json::to_value( signed_event
signed_event .get("sender")
.get("sender") .ok_or(Error::BadRequest(
.ok_or(Error::BadRequest( ErrorKind::InvalidParam,
ErrorKind::InvalidParam, "Event had no sender field.",
"Event had no sender field.", ))?
))? .clone()
.clone(), .into(),
)
.expect("CanonicalJsonValue to serde_json::Value always works"),
) )
.map_err(|_| Error::BadRequest(ErrorKind::InvalidParam, "sender is not a user id."))?; .map_err(|_| Error::BadRequest(ErrorKind::InvalidParam, "sender is not a user id."))?;
let invited_user = serde_json::from_value( let invited_user = serde_json::from_value(
serde_json::to_value( signed_event
signed_event .get("state_key")
.get("state_key") .ok_or(Error::BadRequest(
.ok_or(Error::BadRequest( ErrorKind::InvalidParam,
ErrorKind::InvalidParam, "Event had no state_key field.",
"Event had no state_key field.", ))?
))? .clone()
.clone(), .into(),
)
.expect("CanonicalJsonValue to serde_json::Value always works"),
) )
.map_err(|_| Error::BadRequest(ErrorKind::InvalidParam, "state_key is not a user id."))?; .map_err(|_| Error::BadRequest(ErrorKind::InvalidParam, "state_key is not a user id."))?;
@ -2150,39 +2141,36 @@ pub async fn fetch_required_signing_keys(
pub_key_map: &RwLock<BTreeMap<String, BTreeMap<String, String>>>, pub_key_map: &RwLock<BTreeMap<String, BTreeMap<String, String>>>,
db: &Database, db: &Database,
) -> Result<()> { ) -> Result<()> {
let signatures = event
.get("signatures")
.ok_or(Error::BadServerResponse(
"No signatures in server response pdu.",
))?
.as_object()
.ok_or(Error::BadServerResponse(
"Invalid signatures object in server response pdu.",
))?;
// We go through all the signatures we see on the value and fetch the corresponding signing // We go through all the signatures we see on the value and fetch the corresponding signing
// keys // keys
for (signature_server, signature) in match event.get("signatures").ok_or( for (signature_server, signature) in signatures {
Error::BadServerResponse("No signatures in server response pdu."), let signature_object = signature.as_object().ok_or(Error::BadServerResponse(
)? { "Invalid signatures content object in server response pdu.",
CanonicalJsonValue::Object(map) => map, ))?;
_ => {
return Err(Error::BadServerResponse(
"Invalid signatures object in server response pdu.",
))
}
} {
let signature_object = match signature {
CanonicalJsonValue::Object(map) => map,
_ => {
return Err(Error::BadServerResponse(
"Invalid signatures content object in server response pdu.",
))
}
};
let signature_ids = signature_object.keys().collect::<Vec<_>>(); let signature_ids = signature_object.keys().collect::<Vec<_>>();
debug!("Fetching signing keys for {}", signature_server); debug!("Fetching signing keys for {}", signature_server);
let keys = match fetch_signing_keys( let fetch_res = fetch_signing_keys(
db, db,
&Box::<ServerName>::try_from(&**signature_server).map_err(|_| { &Box::<ServerName>::try_from(&**signature_server).map_err(|_| {
Error::BadServerResponse("Invalid servername in signatures of server response pdu.") Error::BadServerResponse("Invalid servername in signatures of server response pdu.")
})?, })?,
signature_ids, signature_ids,
) )
.await .await;
{
let keys = match fetch_res {
Ok(keys) => keys, Ok(keys) => keys,
Err(_) => { Err(_) => {
warn!("Signature verification failed: Could not fetch signing key.",); warn!("Signature verification failed: Could not fetch signing key.",);