@ -64,7 +64,6 @@ use std::{
@@ -64,7 +64,6 @@ use std::{
future ::Future ,
mem ,
net ::{ IpAddr , SocketAddr } ,
ops ::Deref ,
pin ::Pin ,
sync ::{ Arc , RwLock , RwLockWriteGuard } ,
time ::{ Duration , Instant , SystemTime } ,
@ -397,7 +396,10 @@ async fn find_actual_destination(
@@ -397,7 +396,10 @@ async fn find_actual_destination(
}
if let Some ( port ) = force_port {
FedDest ::Named ( delegated_hostname , format! ( ":{}" , port ) )
FedDest ::Named (
delegated_hostname ,
format! ( ":{}" , port . to_string ( ) ) ,
)
} else {
add_port_to_hostname ( & delegated_hostname )
}
@ -430,7 +432,10 @@ async fn find_actual_destination(
@@ -430,7 +432,10 @@ async fn find_actual_destination(
}
if let Some ( port ) = force_port {
FedDest ::Named ( hostname . clone ( ) , format! ( ":{}" , port ) )
FedDest ::Named (
hostname . clone ( ) ,
format! ( ":{}" , port . to_string ( ) ) ,
)
} else {
add_port_to_hostname ( & hostname )
}
@ -545,10 +550,11 @@ pub fn get_server_keys_route(db: DatabaseGuard) -> Json<String> {
@@ -545,10 +550,11 @@ pub fn get_server_keys_route(db: DatabaseGuard) -> Json<String> {
return Json ( "Federation is disabled." . to_owned ( ) ) ;
}
let mut verify_keys : BTreeMap < Box < ServerSigningKeyId > , VerifyKey > = BTreeMap ::new ( ) ;
let mut verify_keys = BTreeMap ::new ( ) ;
verify_keys . insert (
format! ( "ed25519:{}" , db . globals . keypair ( ) . version ( ) )
. try_into ( )
ServerSigningKeyId ::try_from (
format! ( "ed25519:{}" , db . globals . keypair ( ) . version ( ) ) . as_str ( ) ,
)
. expect ( "found invalid server signing keys in DB" ) ,
VerifyKey {
key : base64 ::encode_config ( db . globals . keypair ( ) . public_key ( ) , base64 ::STANDARD_NO_PAD ) ,
@ -719,7 +725,7 @@ pub async fn send_transaction_message_route(
@@ -719,7 +725,7 @@ pub async fn send_transaction_message_route(
for pdu in & body . pdus {
// We do not add the event_id field to the pdu here because of signature and hashes checks
let ( event_id , value ) = match crate ::pdu ::gen_event_id_canonical_json ( pdu ) {
let ( event_id , value ) = match crate ::pdu ::gen_event_id_canonical_json ( pdu , & db ) {
Ok ( t ) = > t ,
Err ( _ ) = > {
// Event could not be converted to canonical json
@ -730,7 +736,7 @@ pub async fn send_transaction_message_route(
@@ -730,7 +736,7 @@ pub async fn send_transaction_message_route(
// 0. Check the server is in the room
let room_id = match value
. get ( "room_id" )
. and_then ( | id | RoomId ::parse ( id . as_str ( ) ? ) . ok ( ) )
. and_then ( | id | RoomId ::try_from ( id . as_str ( ) ? ) . ok ( ) )
{
Some ( id ) = > id ,
None = > {
@ -995,9 +1001,14 @@ pub(crate) async fn handle_incoming_pdu<'a>(
@@ -995,9 +1001,14 @@ pub(crate) async fn handle_incoming_pdu<'a>(
}
// 9. Fetch any missing prev events doing all checks listed here starting at 1. These are timeline events
let mut graph : HashMap < Arc < EventId > , _ > = HashMap ::new ( ) ;
let mut graph = HashMap ::new ( ) ;
let mut eventid_info = HashMap ::new ( ) ;
let mut todo_outlier_stack : Vec < Arc < EventId > > = incoming_pdu . prev_events . clone ( ) ;
let mut todo_outlier_stack : Vec < _ > = incoming_pdu
. prev_events
. iter ( )
. cloned ( )
. map ( Arc ::new )
. collect ( ) ;
let mut amount = 0 ;
@ -1016,7 +1027,7 @@ pub(crate) async fn handle_incoming_pdu<'a>(
@@ -1016,7 +1027,7 @@ pub(crate) async fn handle_incoming_pdu<'a>(
if amount > 100 {
// Max limit reached
warn ! ( "Max prev event limit reached!" ) ;
graph . insert ( prev_event_id . clone ( ) , HashSet ::new ( ) ) ;
graph . insert ( ( * prev_event_id ) . clone ( ) , HashSet ::new ( ) ) ;
continue ;
}
@ -1027,27 +1038,27 @@ pub(crate) async fn handle_incoming_pdu<'a>(
@@ -1027,27 +1038,27 @@ pub(crate) async fn handle_incoming_pdu<'a>(
amount + = 1 ;
for prev_prev in & pdu . prev_events {
if ! graph . contains_key ( prev_prev ) {
todo_outlier_stack . push ( dbg! ( prev_prev . clone ( ) ) ) ;
todo_outlier_stack . push ( dbg! ( Arc ::new ( prev_prev . clone ( ) ) ) ) ;
}
}
graph . insert (
prev_event_id . clone ( ) ,
( * prev_event_id ) . clone ( ) ,
pdu . prev_events . iter ( ) . cloned ( ) . collect ( ) ,
) ;
} else {
// Time based check failed
graph . insert ( prev_event_id . clone ( ) , HashSet ::new ( ) ) ;
graph . insert ( ( * prev_event_id ) . clone ( ) , HashSet ::new ( ) ) ;
}
eventid_info . insert ( prev_event_id . clone ( ) , ( pdu , json ) ) ;
} else {
// Get json failed
graph . insert ( prev_event_id . clone ( ) , HashSet ::new ( ) ) ;
graph . insert ( ( * prev_event_id ) . clone ( ) , HashSet ::new ( ) ) ;
}
} else {
// Fetch and handle failed
graph . insert ( prev_event_id . clone ( ) , HashSet ::new ( ) ) ;
graph . insert ( ( * prev_event_id ) . clone ( ) , HashSet ::new ( ) ) ;
}
}
@ -1063,6 +1074,7 @@ pub(crate) async fn handle_incoming_pdu<'a>(
@@ -1063,6 +1074,7 @@ pub(crate) async fn handle_incoming_pdu<'a>(
. get ( event_id )
. map_or_else ( | | uint ! ( 0 ) , | info | info . 0. origin_server_ts ) ,
) ,
ruma ::event_id ! ( "$notimportant" ) ,
) )
} )
. map_err ( | _ | "Error sorting prev events" . to_owned ( ) ) ? ;
@ -1072,7 +1084,7 @@ pub(crate) async fn handle_incoming_pdu<'a>(
@@ -1072,7 +1084,7 @@ pub(crate) async fn handle_incoming_pdu<'a>(
if errors > = 5 {
break ;
}
if let Some ( ( pdu , json ) ) = eventid_info . remove ( & * prev_id ) {
if let Some ( ( pdu , json ) ) = eventid_info . remove ( & prev_id ) {
if pdu . origin_server_ts < first_pdu_in_room . origin_server_ts {
continue ;
}
@ -1188,7 +1200,8 @@ fn handle_outlier_pdu<'a>(
@@ -1188,7 +1200,8 @@ fn handle_outlier_pdu<'a>(
& incoming_pdu
. auth_events
. iter ( )
. map ( | x | Arc ::from ( & * * x ) )
. cloned ( )
. map ( Arc ::new )
. collect ::< Vec < _ > > ( ) ,
create_event ,
room_id ,
@ -1318,7 +1331,7 @@ async fn upgrade_outlier_to_timeline_pdu(
@@ -1318,7 +1331,7 @@ async fn upgrade_outlier_to_timeline_pdu(
let mut state_at_incoming_event = None ;
if incoming_pdu . prev_events . len ( ) = = 1 {
let prev_event = & * incoming_pdu . prev_events [ 0 ] ;
let prev_event = & incoming_pdu . prev_events [ 0 ] ;
let prev_event_sstatehash = db
. rooms
. pdu_shortstatehash ( prev_event )
@ -1340,7 +1353,7 @@ async fn upgrade_outlier_to_timeline_pdu(
@@ -1340,7 +1353,7 @@ async fn upgrade_outlier_to_timeline_pdu(
. get_or_create_shortstatekey ( & prev_pdu . kind , state_key , & db . globals )
. map_err ( | _ | "Failed to create shortstatekey." . to_owned ( ) ) ? ;
state . insert ( shortstatekey , Arc ::from ( prev_event ) ) ;
state . insert ( shortstatekey , Arc ::new ( prev_event . clone ( ) ) ) ;
// Now it's the state after the pdu
}
@ -1384,7 +1397,7 @@ async fn upgrade_outlier_to_timeline_pdu(
@@ -1384,7 +1397,7 @@ async fn upgrade_outlier_to_timeline_pdu(
. rooms
. get_or_create_shortstatekey ( & prev_event . kind , state_key , & db . globals )
. map_err ( | _ | "Failed to create shortstatekey." . to_owned ( ) ) ? ;
leaf_state . insert ( shortstatekey , Arc ::from ( & * prev_event . event_id ) ) ;
leaf_state . insert ( shortstatekey , Arc ::new ( prev_event . event_id . clone ( ) ) ) ;
// Now it's the state after the pdu
}
@ -1397,13 +1410,14 @@ async fn upgrade_outlier_to_timeline_pdu(
@@ -1397,13 +1410,14 @@ async fn upgrade_outlier_to_timeline_pdu(
. get_statekey_from_short ( k )
. map_err ( | _ | "Failed to get_statekey_from_short." . to_owned ( ) ) ? ;
state . insert ( k , id . clone ( ) ) ;
state . insert ( k , ( * id ) . clone ( ) ) ;
starting_events . push ( id ) ;
}
auth_chain_sets . push (
get_auth_chain ( room_id , starting_events , db )
. map_err ( | _ | "Failed to load auth chain." . to_owned ( ) ) ?
. map ( | event_id | ( * event_id ) . clone ( ) )
. collect ( ) ,
) ;
@ -1430,7 +1444,7 @@ async fn upgrade_outlier_to_timeline_pdu(
@@ -1430,7 +1444,7 @@ async fn upgrade_outlier_to_timeline_pdu(
. rooms
. get_or_create_shortstatekey ( & event_type , & state_key , & db . globals )
. map_err ( | _ | "Failed to get_or_create_shortstatekey" . to_owned ( ) ) ? ;
Ok ( ( shortstatekey , event_id ) )
Ok ( ( shortstatekey , Arc ::new ( event_id ) ) )
} )
. collect ::< Result < _ , String > > ( ) ? ,
) ,
@ -1465,7 +1479,8 @@ async fn upgrade_outlier_to_timeline_pdu(
@@ -1465,7 +1479,8 @@ async fn upgrade_outlier_to_timeline_pdu(
origin ,
& res . pdu_ids
. iter ( )
. map ( | x | Arc ::from ( & * * x ) )
. cloned ( )
. map ( Arc ::new )
. collect ::< Vec < _ > > ( ) ,
create_event ,
room_id ,
@ -1473,7 +1488,7 @@ async fn upgrade_outlier_to_timeline_pdu(
@@ -1473,7 +1488,7 @@ async fn upgrade_outlier_to_timeline_pdu(
)
. await ;
let mut state : BTreeMap < _ , Arc < EventId > > = BTreeMap ::new ( ) ;
let mut state = BTreeMap ::new ( ) ;
for ( pdu , _ ) in state_vec {
let state_key = pdu
. state_key
@ -1487,7 +1502,7 @@ async fn upgrade_outlier_to_timeline_pdu(
@@ -1487,7 +1502,7 @@ async fn upgrade_outlier_to_timeline_pdu(
match state . entry ( shortstatekey ) {
btree_map ::Entry ::Vacant ( v ) = > {
v . insert ( Arc ::from ( & * pdu . event_id ) ) ;
v . insert ( Arc ::new ( pdu . event_id . clone ( ) ) ) ;
}
btree_map ::Entry ::Occupied ( _ ) = > return Err (
"State event's type and state_key combination exists multiple times."
@ -1562,7 +1577,7 @@ async fn upgrade_outlier_to_timeline_pdu(
@@ -1562,7 +1577,7 @@ async fn upgrade_outlier_to_timeline_pdu(
. roomid_mutex_state
. write ( )
. unwrap ( )
. entry ( room_id . to_owned ( ) )
. entry ( room_id . clone ( ) )
. or_default ( ) ,
) ;
let state_lock = mutex_state . lock ( ) . await ;
@ -1632,7 +1647,7 @@ async fn upgrade_outlier_to_timeline_pdu(
@@ -1632,7 +1647,7 @@ async fn upgrade_outlier_to_timeline_pdu(
db ,
& incoming_pdu ,
val ,
extremities . iter ( ) . map ( Deref ::deref ) ,
extremities ,
state_ids_compressed ,
soft_fail ,
& state_lock ,
@ -1700,7 +1715,7 @@ async fn upgrade_outlier_to_timeline_pdu(
@@ -1700,7 +1715,7 @@ async fn upgrade_outlier_to_timeline_pdu(
. rooms
. get_or_create_shortstatekey ( & leaf_pdu . kind , state_key , & db . globals )
. map_err ( | _ | "Failed to create shortstatekey." . to_owned ( ) ) ? ;
leaf_state . insert ( shortstatekey , Arc ::from ( & * leaf_pdu . event_id ) ) ;
leaf_state . insert ( shortstatekey , Arc ::new ( leaf_pdu . event_id . clone ( ) ) ) ;
// Now it's the state after the pdu
}
@ -1715,7 +1730,7 @@ async fn upgrade_outlier_to_timeline_pdu(
@@ -1715,7 +1730,7 @@ async fn upgrade_outlier_to_timeline_pdu(
. get_or_create_shortstatekey ( & incoming_pdu . kind , state_key , & db . globals )
. map_err ( | _ | "Failed to create shortstatekey." . to_owned ( ) ) ? ;
state_after . insert ( shortstatekey , Arc ::from ( & * incoming_pdu . event_id ) ) ;
state_after . insert ( shortstatekey , Arc ::new ( incoming_pdu . event_id . clone ( ) ) ) ;
}
fork_states . push ( state_after ) ;
@ -1747,6 +1762,7 @@ async fn upgrade_outlier_to_timeline_pdu(
@@ -1747,6 +1762,7 @@ async fn upgrade_outlier_to_timeline_pdu(
db ,
)
. map_err ( | _ | "Failed to load auth chain." . to_owned ( ) ) ?
. map ( | event_id | ( * event_id ) . clone ( ) )
. collect ( ) ,
) ;
}
@ -1755,7 +1771,11 @@ async fn upgrade_outlier_to_timeline_pdu(
@@ -1755,7 +1771,11 @@ async fn upgrade_outlier_to_timeline_pdu(
. into_iter ( )
. map ( | map | {
map . into_iter ( )
. map ( | ( k , id ) | db . rooms . get_statekey_from_short ( k ) . map ( | k | ( k , id ) ) )
. map ( | ( k , id ) | {
db . rooms
. get_statekey_from_short ( k )
. map ( | k | ( k , ( * id ) . clone ( ) ) )
} )
. collect ::< Result < StateMap < _ > > > ( )
} )
. collect ::< Result < _ > > ( )
@ -1812,7 +1832,7 @@ async fn upgrade_outlier_to_timeline_pdu(
@@ -1812,7 +1832,7 @@ async fn upgrade_outlier_to_timeline_pdu(
db ,
& incoming_pdu ,
val ,
extremities . iter ( ) . map ( Deref ::deref ) ,
extremities ,
state_ids_compressed ,
soft_fail ,
& state_lock ,
@ -1854,8 +1874,7 @@ pub(crate) fn fetch_and_handle_outliers<'a>(
@@ -1854,8 +1874,7 @@ pub(crate) fn fetch_and_handle_outliers<'a>(
let mut pdus = vec! [ ] ;
for id in events {
if let Some ( ( time , tries ) ) = db . globals . bad_event_ratelimiter . read ( ) . unwrap ( ) . get ( & * * id )
{
if let Some ( ( time , tries ) ) = db . globals . bad_event_ratelimiter . read ( ) . unwrap ( ) . get ( id ) {
// Exponential backoff
let mut min_elapsed_duration = Duration ::from_secs ( 5 * 60 ) * ( * tries ) * ( * tries ) ;
if min_elapsed_duration > Duration ::from_secs ( 60 * 60 * 24 ) {
@ -1892,10 +1911,10 @@ pub(crate) fn fetch_and_handle_outliers<'a>(
@@ -1892,10 +1911,10 @@ pub(crate) fn fetch_and_handle_outliers<'a>(
Ok ( res ) = > {
warn ! ( "Got {} over federation" , id ) ;
let ( calculated_event_id , value ) =
match crate ::pdu ::gen_event_id_canonical_json ( & res . pdu ) {
match crate ::pdu ::gen_event_id_canonical_json ( & res . pdu , & db ) {
Ok ( t ) = > t ,
Err ( _ ) = > {
back_off ( ( * * id ) . to_owned ( ) ) ;
back_off ( ( * * id ) . clone ( ) ) ;
continue ;
}
} ;
@ -1920,14 +1939,14 @@ pub(crate) fn fetch_and_handle_outliers<'a>(
@@ -1920,14 +1939,14 @@ pub(crate) fn fetch_and_handle_outliers<'a>(
Ok ( ( pdu , json ) ) = > ( pdu , Some ( json ) ) ,
Err ( e ) = > {
warn ! ( "Authentication of event {} failed: {:?}" , id , e ) ;
back_off ( ( * * id ) . to_owned ( ) ) ;
back_off ( ( * * id ) . clone ( ) ) ;
continue ;
}
}
}
Err ( _ ) = > {
warn ! ( "Failed to fetch event: {}" , id ) ;
back_off ( ( * * id ) . to_owned ( ) ) ;
back_off ( ( * * id ) . clone ( ) ) ;
continue ;
}
}
@ -2105,11 +2124,11 @@ pub(crate) async fn fetch_signing_keys(
@@ -2105,11 +2124,11 @@ pub(crate) async fn fetch_signing_keys(
/// Append the incoming event setting the state snapshot to the state from the
/// server that sent the event.
#[ tracing::instrument(skip(db, pdu, pdu_json, new_room_leaves, state_ids_compressed, _mutex_lock)) ]
fn append_incoming_pdu < ' a > (
fn append_incoming_pdu (
db : & Database ,
pdu : & PduEvent ,
pdu_json : CanonicalJsonObject ,
new_room_leaves : impl IntoIterator < Item = & ' a EventId > + Clone + Debug ,
new_room_leaves : HashSet < EventId > ,
state_ids_compressed : HashSet < CompressedStateEvent > ,
soft_fail : bool ,
_mutex_lock : & MutexGuard < ' _ , ( ) > , // Take mutex guard to make sure users get the room mutex
@ -2126,11 +2145,19 @@ fn append_incoming_pdu<'a>(
@@ -2126,11 +2145,19 @@ fn append_incoming_pdu<'a>(
if soft_fail {
db . rooms
. mark_as_referenced ( & pdu . room_id , & pdu . prev_events ) ? ;
db . rooms . replace_pdu_leaves ( & pdu . room_id , new_room_leaves ) ? ;
db . rooms . replace_pdu_leaves (
& pdu . room_id ,
& new_room_leaves . into_iter ( ) . collect ::< Vec < _ > > ( ) ,
) ? ;
return Ok ( None ) ;
}
let pdu_id = db . rooms . append_pdu ( pdu , pdu_json , new_room_leaves , db ) ? ;
let pdu_id = db . rooms . append_pdu (
pdu ,
pdu_json ,
& new_room_leaves . into_iter ( ) . collect ::< Vec < _ > > ( ) ,
db ,
) ? ;
for appservice in db . appservice . all ( ) ? {
if db . rooms . appservice_in_room ( & pdu . room_id , & appservice , db ) ? {
@ -2271,13 +2298,13 @@ fn get_auth_chain_inner(
@@ -2271,13 +2298,13 @@ fn get_auth_chain_inner(
event_id : & EventId ,
db : & Database ,
) -> Result < HashSet < u64 > > {
let mut todo = vec! [ Arc ::from ( event_id ) ] ;
let mut todo = vec! [ event_id . clone ( ) ] ;
let mut found = HashSet ::new ( ) ;
while let Some ( event_id ) = todo . pop ( ) {
match db . rooms . get_pdu ( & event_id ) {
Ok ( Some ( pdu ) ) = > {
if pdu . room_id ! = room_id {
if & pdu . room_id ! = room_id {
return Err ( Error ::BadRequest ( ErrorKind ::Forbidden , "Evil event in db" ) ) ;
}
for auth_event in & pdu . auth_events {
@ -2336,10 +2363,10 @@ pub fn get_event_route(
@@ -2336,10 +2363,10 @@ pub fn get_event_route(
. and_then ( | val | val . as_str ( ) )
. ok_or_else ( | | Error ::bad_database ( "Invalid event in database" ) ) ? ;
let room_id = < & RoomId > ::try_from ( room_id_str )
let room_id = RoomId ::try_from ( room_id_str )
. map_err ( | _ | Error ::bad_database ( "Invalid room id field in event in database" ) ) ? ;
if ! db . rooms . server_in_room ( sender_servername , room_id ) ? {
if ! db . rooms . server_in_room ( sender_servername , & room_id ) ? {
return Err ( Error ::BadRequest ( ErrorKind ::NotFound , "Event not found." ) ) ;
}
@ -2390,7 +2417,7 @@ pub fn get_missing_events_route(
@@ -2390,7 +2417,7 @@ pub fn get_missing_events_route(
. and_then ( | val | val . as_str ( ) )
. ok_or_else ( | | Error ::bad_database ( "Invalid event in database" ) ) ? ;
let event_room_id = < & RoomId > ::try_from ( room_id_str )
let event_room_id = RoomId ::try_from ( room_id_str )
. map_err ( | _ | Error ::bad_database ( "Invalid room id field in event in database" ) ) ? ;
if event_room_id ! = body . room_id {
@ -2409,7 +2436,7 @@ pub fn get_missing_events_route(
@@ -2409,7 +2436,7 @@ pub fn get_missing_events_route(
continue ;
}
queued_events . extend_from_slice (
& serde_json ::from_value ::< Vec < Box < EventId > > > (
& serde_json ::from_value ::< Vec < EventId > > (
serde_json ::to_value ( pdu . get ( "prev_events" ) . cloned ( ) . ok_or_else ( | | {
Error ::bad_database ( "Event in db has no prev_events field." )
} ) ? )
@ -2458,14 +2485,14 @@ pub fn get_event_authorization_route(
@@ -2458,14 +2485,14 @@ pub fn get_event_authorization_route(
. and_then ( | val | val . as_str ( ) )
. ok_or_else ( | | Error ::bad_database ( "Invalid event in database" ) ) ? ;
let room_id = < & RoomId > ::try_from ( room_id_str )
let room_id = RoomId ::try_from ( room_id_str )
. map_err ( | _ | Error ::bad_database ( "Invalid room id field in event in database" ) ) ? ;
if ! db . rooms . server_in_room ( sender_servername , room_id ) ? {
if ! db . rooms . server_in_room ( sender_servername , & room_id ) ? {
return Err ( Error ::BadRequest ( ErrorKind ::NotFound , "Event not found." ) ) ;
}
let auth_chain_ids = get_auth_chain ( room_id , vec! [ Arc ::from ( & * body . event_id ) ] , & db ) ? ;
let auth_chain_ids = get_auth_chain ( & room_id , vec! [ Arc ::new ( body . event_id . clone ( ) ) ] , & db ) ? ;
Ok ( get_event_authorization ::v1 ::Response {
auth_chain : auth_chain_ids
@ -2523,7 +2550,7 @@ pub fn get_room_state_route(
@@ -2523,7 +2550,7 @@ pub fn get_room_state_route(
} )
. collect ( ) ;
let auth_chain_ids = get_auth_chain ( & body . room_id , vec! [ Arc ::from ( & * body . event_id ) ] , & db ) ? ;
let auth_chain_ids = get_auth_chain ( & body . room_id , vec! [ Arc ::new ( body . event_id . clone ( ) ) ] , & db ) ? ;
Ok ( get_room_state ::v1 ::Response {
auth_chain : auth_chain_ids
@ -2579,13 +2606,13 @@ pub fn get_room_state_ids_route(
@@ -2579,13 +2606,13 @@ pub fn get_room_state_ids_route(
. rooms
. state_full_ids ( shortstatehash ) ?
. into_iter ( )
. map ( | ( _ , id ) | ( * id ) . to_owned ( ) )
. map ( | ( _ , id ) | ( * id ) . clone ( ) )
. collect ( ) ;
let auth_chain_ids = get_auth_chain ( & body . room_id , vec! [ Arc ::from ( & * body . event_id ) ] , & db ) ? ;
let auth_chain_ids = get_auth_chain ( & body . room_id , vec! [ Arc ::new ( body . event_id . clone ( ) ) ] , & db ) ? ;
Ok ( get_room_state_ids ::v1 ::Response {
auth_chain_ids : auth_chain_ids . map ( | id | ( * id ) . to_owned ( ) ) . collect ( ) ,
auth_chain_ids : auth_chain_ids . map ( | id | ( * id ) . clone ( ) ) . collect ( ) ,
pdu_ids ,
}
. into ( ) )
@ -2643,9 +2670,12 @@ pub fn create_join_event_template_route(
@@ -2643,9 +2670,12 @@ pub fn create_join_event_template_route(
None
} ;
// If there was no create event yet, assume we are creating a version 6 room right now
let room_version_id =
create_event_content . map_or ( RoomVersionId ::V6 , | create_event | create_event . room_version ) ;
// If there was no create event yet, assume we are creating a room with the default version
// right now
let room_version_id = create_event_content
. map_or ( db . globals . default_room_version ( ) , | create_event | {
create_event . room_version
} ) ;
let room_version = RoomVersion ::new ( & room_version_id ) . expect ( "room version is supported" ) ;
if ! body . ver . contains ( & room_version_id ) {
@ -2665,7 +2695,6 @@ pub fn create_join_event_template_route(
@@ -2665,7 +2695,6 @@ pub fn create_join_event_template_route(
membership : MembershipState ::Join ,
third_party_invite : None ,
reason : None ,
join_authorized_via_users_server : None ,
} )
. expect ( "member event is valid value" ) ;
@ -2699,7 +2728,7 @@ pub fn create_join_event_template_route(
@@ -2699,7 +2728,7 @@ pub fn create_join_event_template_route(
}
let pdu = PduEvent {
event_id : ruma ::event_id ! ( "$thiswillbefilledinlater" ) . into ( ) ,
event_id : ruma ::event_id ! ( "$thiswillbefilledinlater" ) ,
room_id : body . room_id . clone ( ) ,
sender : body . user_id . clone ( ) ,
origin_server_ts : utils ::millis_since_unix_epoch ( )
@ -2786,7 +2815,7 @@ async fn create_join_event(
@@ -2786,7 +2815,7 @@ async fn create_join_event(
// let mut auth_cache = EventMap::new();
// We do not add the event_id field to the pdu here because of signature and hashes checks
let ( event_id , value ) = match crate ::pdu ::gen_event_id_canonical_json ( pdu ) {
let ( event_id , value ) = match crate ::pdu ::gen_event_id_canonical_json ( pdu , & db ) {
Ok ( t ) = > t ,
Err ( _ ) = > {
// Event could not be converted to canonical json
@ -2811,7 +2840,7 @@ async fn create_join_event(
@@ -2811,7 +2840,7 @@ async fn create_join_event(
. roomid_mutex_federation
. write ( )
. unwrap ( )
. entry ( room_id . to_owned ( ) )
. entry ( room_id . clone ( ) )
. or_default ( ) ,
) ;
let mutex_lock = mutex . lock ( ) . await ;
@ -2910,7 +2939,7 @@ pub async fn create_invite_route(
@@ -2910,7 +2939,7 @@ pub async fn create_invite_route(
return Err ( Error ::bad_config ( "Federation is disabled." ) ) ;
}
if body . room_version ! = RoomVersionId ::V5 & & body . room_version ! = RoomVersionId ::V6 {
if ! db . rooms . is_supported_version ( & db , & body . room_version ) {
return Err ( Error ::BadRequest (
ErrorKind ::IncompatibleRoomVersion {
room_version : body . room_version . clone ( ) ,
@ -2931,7 +2960,7 @@ pub async fn create_invite_route(
@@ -2931,7 +2960,7 @@ pub async fn create_invite_route(
. map_err ( | _ | Error ::BadRequest ( ErrorKind ::InvalidParam , "Failed to sign event." ) ) ? ;
// Generate event id
let event_id = EventId ::parse ( format! (
let event_id = EventId ::try_from ( & * format! (
"${}" ,
ruma ::signatures ::reference_hash ( & signed_event , & body . room_version )
. expect ( "ruma can calculate reference hashes" )
@ -2944,7 +2973,7 @@ pub async fn create_invite_route(
@@ -2944,7 +2973,7 @@ pub async fn create_invite_route(
CanonicalJsonValue ::String ( event_id . into ( ) ) ,
) ;
let sender : Box < _ > = serde_json ::from_value (
let sender = serde_json ::from_value (
signed_event
. get ( "sender" )
. ok_or ( Error ::BadRequest (
@ -2956,7 +2985,7 @@ pub async fn create_invite_route(
@@ -2956,7 +2985,7 @@ pub async fn create_invite_route(
)
. map_err ( | _ | Error ::BadRequest ( ErrorKind ::InvalidParam , "sender is not a user id." ) ) ? ;
let invited_user : Box < _ > = serde_json ::from_value (
let invited_user = serde_json ::from_value (
signed_event
. get ( "state_key" )
. ok_or ( Error ::BadRequest (
@ -3207,7 +3236,7 @@ pub(crate) async fn fetch_required_signing_keys(
@@ -3207,7 +3236,7 @@ pub(crate) async fn fetch_required_signing_keys(
let fetch_res = fetch_signing_keys (
db ,
signature_server . as_str ( ) . try_into ( ) . map_err ( | _ | {
& Box ::< ServerName > ::try_from ( & * * signature_server ) . map_err ( | _ | {
Error ::BadServerResponse ( "Invalid servername in signatures of server response pdu." )
} ) ? ,
signature_ids ,
@ -3235,7 +3264,7 @@ pub(crate) async fn fetch_required_signing_keys(
@@ -3235,7 +3264,7 @@ pub(crate) async fn fetch_required_signing_keys(
// the PDUs and either cache the key or add it to the list that needs to be retrieved.
fn get_server_keys_from_cache (
pdu : & RawJsonValue ,
servers : & mut BTreeMap < Box < ServerName > , BTreeMap < Box < ServerSigningKeyId > , QueryCriteria > > ,
servers : & mut BTreeMap < Box < ServerName > , BTreeMap < ServerSigningKeyId , QueryCriteria > > ,
room_version : & RoomVersionId ,
pub_key_map : & mut RwLockWriteGuard < ' _ , BTreeMap < String , BTreeMap < String , String > > > ,
db : & Database ,
@ -3245,12 +3274,11 @@ fn get_server_keys_from_cache(
@@ -3245,12 +3274,11 @@ fn get_server_keys_from_cache(
Error ::BadServerResponse ( "Invalid PDU in server response" )
} ) ? ;
let event_id = format! (
let event_id = EventId ::try_from ( & * format! (
"${}" ,
ruma ::signatures ::reference_hash ( & value , room_version )
. expect ( "ruma can calculate reference hashes" )
) ;
let event_id = < & EventId > ::try_from ( event_id . as_str ( ) )
) )
. expect ( "ruma's reference hashes are valid event ids" ) ;
if let Some ( ( time , tries ) ) = db
@ -3258,7 +3286,7 @@ fn get_server_keys_from_cache(
@@ -3258,7 +3286,7 @@ fn get_server_keys_from_cache(
. bad_event_ratelimiter
. read ( )
. unwrap ( )
. get ( event_id )
. get ( & event_id )
{
// Exponential backoff
let mut min_elapsed_duration = Duration ::from_secs ( 30 ) * ( * tries ) * ( * tries ) ;
@ -3292,7 +3320,7 @@ fn get_server_keys_from_cache(
@@ -3292,7 +3320,7 @@ fn get_server_keys_from_cache(
let contains_all_ids =
| keys : & BTreeMap < String , String > | signature_ids . iter ( ) . all ( | id | keys . contains_key ( id ) ) ;
let origin = < & ServerName > ::try_from ( signature_server . as_str ( ) ) . map_err ( | _ | {
let origin = & Box ::< ServerName > ::try_from ( & * * signature_server ) . map_err ( | _ | {
Error ::BadServerResponse ( "Invalid servername in signatures of server response pdu." )
} ) ? ;
@ -3311,7 +3339,7 @@ fn get_server_keys_from_cache(
@@ -3311,7 +3339,7 @@ fn get_server_keys_from_cache(
if ! contains_all_ids ( & result ) {
trace ! ( "Signing key not loaded for {}" , origin ) ;
servers . insert ( origin . to_owned ( ) , BTreeMap ::new ( ) ) ;
servers . insert ( origin . clone ( ) , BTreeMap ::new ( ) ) ;
}
pub_key_map . insert ( origin . to_string ( ) , result ) ;
@ -3326,7 +3354,7 @@ pub(crate) async fn fetch_join_signing_keys(
@@ -3326,7 +3354,7 @@ pub(crate) async fn fetch_join_signing_keys(
pub_key_map : & RwLock < BTreeMap < String , BTreeMap < String , String > > > ,
db : & Database ,
) -> Result < ( ) > {
let mut servers : BTreeMap < Box < ServerName > , BTreeMap < Box < ServerSigningKeyId > , QueryCriteria > > =
let mut servers : BTreeMap < Box < ServerName > , BTreeMap < ServerSigningKeyId , QueryCriteria > > =
BTreeMap ::new ( ) ;
{
@ -3360,6 +3388,10 @@ pub(crate) async fn fetch_join_signing_keys(
@@ -3360,6 +3388,10 @@ pub(crate) async fn fetch_join_signing_keys(
server ,
get_remote_server_keys_batch ::v2 ::Request {
server_keys : servers . clone ( ) ,
minimum_valid_until_ts : MilliSecondsSinceUnixEpoch ::from_system_time (
SystemTime ::now ( ) + Duration ::from_secs ( 60 ) ,
)
. expect ( "time is valid" ) ,
} ,
)
. await