|
|
|
@ -357,7 +357,7 @@ impl Service {
|
|
|
|
|
.await;
|
|
|
|
|
|
|
|
|
|
// 6. Reject "due to auth events" if the event doesn't pass auth based on the auth events
|
|
|
|
|
info!(
|
|
|
|
|
debug!(
|
|
|
|
|
"Auth check for {} based on auth events",
|
|
|
|
|
incoming_pdu.event_id
|
|
|
|
|
);
|
|
|
|
@ -419,7 +419,7 @@ impl Service {
|
|
|
|
|
));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
info!("Validation successful.");
|
|
|
|
|
debug!("Validation successful.");
|
|
|
|
|
|
|
|
|
|
// 7. Persist the event as an outlier.
|
|
|
|
|
services()
|
|
|
|
@ -427,7 +427,7 @@ impl Service {
|
|
|
|
|
.outlier
|
|
|
|
|
.add_pdu_outlier(&incoming_pdu.event_id, &val)?;
|
|
|
|
|
|
|
|
|
|
info!("Added pdu as outlier.");
|
|
|
|
|
debug!("Added pdu as outlier.");
|
|
|
|
|
|
|
|
|
|
Ok((Arc::new(incoming_pdu), val))
|
|
|
|
|
})
|
|
|
|
@ -476,7 +476,7 @@ impl Service {
|
|
|
|
|
// TODO: if we know the prev_events of the incoming event we can avoid the request and build
|
|
|
|
|
// the state from a known point and resolve if > 1 prev_event
|
|
|
|
|
|
|
|
|
|
info!("Requesting state at event");
|
|
|
|
|
debug!("Requesting state at event");
|
|
|
|
|
let mut state_at_incoming_event = None;
|
|
|
|
|
|
|
|
|
|
if incoming_pdu.prev_events.len() == 1 {
|
|
|
|
@ -499,7 +499,7 @@ impl Service {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if let Some(Ok(mut state)) = state {
|
|
|
|
|
info!("Using cached state");
|
|
|
|
|
debug!("Using cached state");
|
|
|
|
|
let prev_pdu = services()
|
|
|
|
|
.rooms
|
|
|
|
|
.timeline
|
|
|
|
@ -523,7 +523,7 @@ impl Service {
|
|
|
|
|
state_at_incoming_event = Some(state);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
info!("Calculating state at event using state res");
|
|
|
|
|
debug!("Calculating state at event using state res");
|
|
|
|
|
let mut extremity_sstatehashes = HashMap::new();
|
|
|
|
|
|
|
|
|
|
let mut okay = true;
|
|
|
|
@ -632,7 +632,7 @@ impl Service {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if state_at_incoming_event.is_none() {
|
|
|
|
|
info!("Calling /state_ids");
|
|
|
|
|
debug!("Calling /state_ids");
|
|
|
|
|
// Call /state_ids to find out what the state at this pdu is. We trust the server's
|
|
|
|
|
// response to some extend, but we still do a lot of checks on the events
|
|
|
|
|
match services()
|
|
|
|
@ -647,7 +647,7 @@ impl Service {
|
|
|
|
|
.await
|
|
|
|
|
{
|
|
|
|
|
Ok(res) => {
|
|
|
|
|
info!("Fetching state events at event.");
|
|
|
|
|
debug!("Fetching state events at event.");
|
|
|
|
|
let state_vec = self
|
|
|
|
|
.fetch_and_handle_outliers(
|
|
|
|
|
origin,
|
|
|
|
@ -710,7 +710,7 @@ impl Service {
|
|
|
|
|
let state_at_incoming_event =
|
|
|
|
|
state_at_incoming_event.expect("we always set this to some above");
|
|
|
|
|
|
|
|
|
|
info!("Starting auth check");
|
|
|
|
|
debug!("Starting auth check");
|
|
|
|
|
// 11. Check the auth of the event passes based on the state of the event
|
|
|
|
|
let check_result = state_res::event_auth::auth_check(
|
|
|
|
|
&room_version,
|
|
|
|
@ -734,7 +734,7 @@ impl Service {
|
|
|
|
|
"Event has failed auth check with state at the event.",
|
|
|
|
|
));
|
|
|
|
|
}
|
|
|
|
|
info!("Auth check succeeded");
|
|
|
|
|
debug!("Auth check succeeded");
|
|
|
|
|
|
|
|
|
|
// Soft fail check before doing state res
|
|
|
|
|
let auth_events = services().rooms.state.get_auth_events(
|
|
|
|
@ -769,7 +769,7 @@ impl Service {
|
|
|
|
|
|
|
|
|
|
// Now we calculate the set of extremities this room has after the incoming event has been
|
|
|
|
|
// applied. We start with the previous extremities (aka leaves)
|
|
|
|
|
info!("Calculating extremities");
|
|
|
|
|
debug!("Calculating extremities");
|
|
|
|
|
let mut extremities = services().rooms.state.get_forward_extremities(room_id)?;
|
|
|
|
|
|
|
|
|
|
// Remove any forward extremities that are referenced by this incoming event's prev_events
|
|
|
|
@ -790,7 +790,7 @@ impl Service {
|
|
|
|
|
)
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
info!("Compressing state at event");
|
|
|
|
|
debug!("Compressing state at event");
|
|
|
|
|
let state_ids_compressed = Arc::new(
|
|
|
|
|
state_at_incoming_event
|
|
|
|
|
.iter()
|
|
|
|
@ -804,7 +804,7 @@ impl Service {
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if incoming_pdu.state_key.is_some() {
|
|
|
|
|
info!("Preparing for stateres to derive new room state");
|
|
|
|
|
debug!("Preparing for stateres to derive new room state");
|
|
|
|
|
|
|
|
|
|
// We also add state after incoming event to the fork states
|
|
|
|
|
let mut state_after = state_at_incoming_event.clone();
|
|
|
|
@ -822,7 +822,7 @@ impl Service {
|
|
|
|
|
.await?;
|
|
|
|
|
|
|
|
|
|
// Set the new room state to the resolved state
|
|
|
|
|
info!("Forcing new room state");
|
|
|
|
|
debug!("Forcing new room state");
|
|
|
|
|
|
|
|
|
|
let (sstatehash, new, removed) = services()
|
|
|
|
|
.rooms
|
|
|
|
@ -837,7 +837,7 @@ impl Service {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 14. Check if the event passes auth based on the "current state" of the room, if not soft fail it
|
|
|
|
|
info!("Starting soft fail auth check");
|
|
|
|
|
debug!("Starting soft fail auth check");
|
|
|
|
|
|
|
|
|
|
if soft_fail {
|
|
|
|
|
services().rooms.timeline.append_incoming_pdu(
|
|
|
|
@ -861,7 +861,7 @@ impl Service {
|
|
|
|
|
));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
info!("Appending pdu to timeline");
|
|
|
|
|
debug!("Appending pdu to timeline");
|
|
|
|
|
extremities.insert(incoming_pdu.event_id.clone());
|
|
|
|
|
|
|
|
|
|
// Now that the event has passed all auth it is added into the timeline.
|
|
|
|
@ -877,7 +877,7 @@ impl Service {
|
|
|
|
|
&state_lock,
|
|
|
|
|
)?;
|
|
|
|
|
|
|
|
|
|
info!("Appended incoming pdu");
|
|
|
|
|
debug!("Appended incoming pdu");
|
|
|
|
|
|
|
|
|
|
// Event has passed all auth/stateres checks
|
|
|
|
|
drop(state_lock);
|
|
|
|
@ -890,7 +890,7 @@ impl Service {
|
|
|
|
|
room_version_id: &RoomVersionId,
|
|
|
|
|
incoming_state: HashMap<u64, Arc<EventId>>,
|
|
|
|
|
) -> Result<Arc<HashSet<CompressedStateEvent>>> {
|
|
|
|
|
info!("Loading current room state ids");
|
|
|
|
|
debug!("Loading current room state ids");
|
|
|
|
|
let current_sstatehash = services()
|
|
|
|
|
.rooms
|
|
|
|
|
.state
|
|
|
|
@ -917,7 +917,7 @@ impl Service {
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
info!("Loading fork states");
|
|
|
|
|
debug!("Loading fork states");
|
|
|
|
|
|
|
|
|
|
let fork_states: Vec<_> = fork_states
|
|
|
|
|
.into_iter()
|
|
|
|
@ -935,7 +935,7 @@ impl Service {
|
|
|
|
|
})
|
|
|
|
|
.collect();
|
|
|
|
|
|
|
|
|
|
info!("Resolving state");
|
|
|
|
|
debug!("Resolving state");
|
|
|
|
|
|
|
|
|
|
let lock = services().globals.stateres_mutex.lock();
|
|
|
|
|
let state = match state_res::resolve(room_version_id, &fork_states, auth_chain_sets, |id| {
|
|
|
|
@ -953,7 +953,7 @@ impl Service {
|
|
|
|
|
|
|
|
|
|
drop(lock);
|
|
|
|
|
|
|
|
|
|
info!("State resolution done. Compressing state");
|
|
|
|
|
debug!("State resolution done. Compressing state");
|
|
|
|
|
|
|
|
|
|
let new_room_state = state
|
|
|
|
|
.into_iter()
|
|
|
|
|