Expand description
State resolution and checks on incoming PDUs according to the Matrix specification.
When creating or receiving a PDU (or event), a server must check whether it is valid and how it affects the room state. The purpose of this crate is to provide functions that solve that.
§Checks performed on receipt of a PDU
This crate used with ruma-signatures should allow to perform all the necessary checks on receipt of a PDU.
To respect the Matrix specification, the following functions should be called for a PDU:
check_pdu_format()
- The event should be dropped on error.ruma_signatures::verify_event()
- The event should be dropped on error. The PDU should be redacted before checking the authorization rules if the result isVerified::Signatures
.check_state_independent_auth_rules()
- The event should be rejected on error.check_state_dependent_auth_rules()
- This function must be called 3 times:- With the
auth_events
for the state, the event should be rejected on error. - With the state before the event, the event should be rejected on error.
- With the current state of the room, the event should be “soft failed” on error.
- With the
§Room State Resolution
Because of the distributed nature of Matrix, homeservers might not receive all events in the same order, which might cause the room state to diverge temporarily between homeservers. The purpose of [state resolution] is to make sure that all homeservers arrive at the same room state given the same events.
The resolve()
function allows to do that. It takes an iterator of state maps and applies the
proper state resolution algorithm for the current room version to output the map of events in
the current room state.
§Event helper types
The types from ruma-events use strict deserialization rules according to their definition in
the specification, which means that they also validate fields that are not checked when
receiving a PDU. Since it is not appropriate for servers to reject an event that passes those
checks, this crate provides helper types in the events
module, built around the Event
trait, to deserialize lazily a handful of fields from the most common state events. Since these
are the same types used for checking the authorization rules, they are guaranteed to not perform
extra validation on unvalidated fields.
The types from ruma-events are still appropriate to be used to create a new event, or to validate an event received from a client.
Re-exports§
pub use self::events::Event;
Modules§
- events
- Helper traits and types to work with events (aka PDUs).
Enums§
- Error
- Represents the various errors that arise when resolving state.
Functions§
- auth_
types_ for_ event - Get the list of relevant auth events required to authorize the event of the given type.
- check_
pdu_ format - Check that the given canonicalized PDU respects the event format of the room version and the size limits from the Matrix specification.
- check_
state_ dependent_ auth_ rules - Check whether the incoming event passes the state-dependent authorization rules for the given room version rules.
- check_
state_ independent_ auth_ rules - Check whether the incoming event passes the state-independent authorization rules for the given room version rules.
- resolve
- Apply the state resolution algorithm introduced in room version 2 to resolve the state of a room.
- reverse_
topological_ power_ sort - Sorts the given event graph using reverse topological power ordering.