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_rules()- 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_eventsfor 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::topological_sort::topological_sort;
Modules§
- event_
auth 🔒 - events
- Helper traits and types to work with events (aka PDUs).
- fetch_
state 🔒 - resolve 🔒
- topological_
sort - Sorts the given event graph using reverse topological power ordering.
Functions§
- auth_
check - auth_
types_ for_ event - Get the list of relevant auth events required to authorize the event of the given type.
- resolve
- Apply the state resolution algorithm introduced in room version 2 to resolve the state of a room.
Type Aliases§
- AuthSet
- Full recursive set of
auth_eventsfor each event in a StateMap. - Auth
Types - Conflict
Map - ConflictMap of OwnedEventId specifically.
- State
Map - A mapping of event type and state_key to some value
T, usually anEventId.