Fix federated join miss hashing the join event created

next
Devin Ragotzy 2020-11-08 13:49:02 -05:00 committed by Timo Kösters
parent eca0bbb35a
commit b13049a6fa
No known key found for this signature in database
GPG Key ID: 24DA7517711A2BA4
1 changed files with 13 additions and 11 deletions

View File

@ -512,22 +512,16 @@ async fn join_room_by_id_helper(
// TODO fixup CanonicalJsonValue // TODO fixup CanonicalJsonValue
// use that instead of serde_json::Map... maybe? // use that instead of serde_json::Map... maybe?
let mut canon_json_stub = let mut canon_json_stub: BTreeMap<_, ruma::signatures::CanonicalJsonValue> =
serde_json::from_value(join_event_stub_value).expect("json Value is canonical JSON"); serde_json::from_value(join_event_stub_value).expect("json Value is canonical JSON");
// Generate event id
let event_id = EventId::try_from(&*format!(
"${}",
ruma::signatures::reference_hash(&canon_json_stub, &RoomVersionId::Version6)
.expect("ruma can calculate reference hashes")
))
.expect("ruma's reference hashes are valid event ids");
// We don't leave the event id into the pdu because that's only allowed in v1 or v2 rooms // We don't leave the event id into the pdu because that's only allowed in v1 or v2 rooms
// let join_event_stub = join_event_stub_value.as_object_mut().unwrap(); // let join_event_stub = join_event_stub_value.as_object_mut().unwrap();
// join_event_stub.remove("event_id"); // join_event_stub.remove("event_id");
canon_json_stub.remove("event_id"); canon_json_stub.remove("event_id");
// In order to create a compatible ref hash (EventID) the `hashes` field needs to be present
// who the hell knew...
ruma::signatures::hash_and_sign_event( ruma::signatures::hash_and_sign_event(
db.globals.server_name().as_str(), db.globals.server_name().as_str(),
db.globals.keypair(), db.globals.keypair(),
@ -536,6 +530,14 @@ async fn join_room_by_id_helper(
) )
.expect("event is valid, we just created it"); .expect("event is valid, we just created it");
// Generate event id
let event_id = EventId::try_from(&*format!(
"${}",
ruma::signatures::reference_hash(&canon_json_stub, &RoomVersionId::Version6)
.expect("ruma can calculate reference hashes")
))
.expect("ruma's reference hashes are valid event ids");
// Add event_id back // Add event_id back
canon_json_stub.insert( canon_json_stub.insert(
"event_id".to_owned(), "event_id".to_owned(),
@ -545,7 +547,7 @@ async fn join_room_by_id_helper(
); );
// It has enough fields to be called a proper event now // It has enough fields to be called a proper event now
let join_event = canon_json_stub; let join_event = dbg!(canon_json_stub);
let send_join_response = server_server::send_request( let send_join_response = server_server::send_request(
&db.globals, &db.globals,
@ -606,7 +608,7 @@ async fn join_room_by_id_helper(
.map(|ev| (event_id, Arc::new(ev))) .map(|ev| (event_id, Arc::new(ev)))
.map_err(|e| { .map_err(|e| {
warn!("{}: {}", value, e); warn!("{}: {}", value, e);
Error::BadServerResponse("Invalid PDU bytes in send_join response.") Error::BadServerResponse("Invalid PDU in send_join response.")
}) })
}) })
.collect::<Result<BTreeMap<EventId, Arc<StateEvent>>>>()?; .collect::<Result<BTreeMap<EventId, Arc<StateEvent>>>>()?;