mirror of
https://github.com/matrix-construct/construct
synced 2024-12-28 00:14:07 +01:00
modules/s_fetch: Add branch for auth chain fetch/eval on missing room state for event.
This commit is contained in:
parent
1c5b7d2d71
commit
0043cb2af7
2 changed files with 19 additions and 2 deletions
|
@ -219,6 +219,10 @@ struct ircd::m::vm::opts
|
||||||
/// TODO: Y
|
/// TODO: Y
|
||||||
bool head_must_exist {false};
|
bool head_must_exist {false};
|
||||||
|
|
||||||
|
/// Whether to automatically fetch and evaluate the auth chain for the
|
||||||
|
/// event; effective when there is no state for this room on the server.
|
||||||
|
bool fetch_auth_chain {true};
|
||||||
|
|
||||||
/// Evaluators can set this value to optimize the creation of the database
|
/// Evaluators can set this value to optimize the creation of the database
|
||||||
/// transaction where the event will be stored. This value should be set
|
/// transaction where the event will be stored. This value should be set
|
||||||
/// to the amount of space the event consumes; the JSON-serialized size is
|
/// to the amount of space the event consumes; the JSON-serialized size is
|
||||||
|
|
|
@ -59,19 +59,31 @@ ircd::m::fetch::hook_handler(const event &event,
|
||||||
if(type == "m.room.create")
|
if(type == "m.room.create")
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
const m::event::id &event_id
|
||||||
|
{
|
||||||
|
at<"event_id"_>(event)
|
||||||
|
};
|
||||||
|
|
||||||
const m::room::id &room_id
|
const m::room::id &room_id
|
||||||
{
|
{
|
||||||
at<"room_id"_>(event)
|
at<"room_id"_>(event)
|
||||||
};
|
};
|
||||||
|
|
||||||
if(opts.head_must_exist || opts.history)
|
if(!exists(room_id))
|
||||||
if(!exists(room_id))
|
{
|
||||||
|
if((opts.head_must_exist || opts.history) && !opts.fetch_auth_chain)
|
||||||
throw vm::error
|
throw vm::error
|
||||||
{
|
{
|
||||||
vm::fault::STATE, "Missing state for room %s",
|
vm::fault::STATE, "Missing state for room %s",
|
||||||
string_view{room_id}
|
string_view{room_id}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
m::room room{room_id};
|
||||||
|
room.event_id = event_id;
|
||||||
|
const m::room::auth auth{room};
|
||||||
|
auth.chain_eval(auth, event_id.host());
|
||||||
|
}
|
||||||
|
|
||||||
const event::prev prev
|
const event::prev prev
|
||||||
{
|
{
|
||||||
*eval.event_
|
*eval.event_
|
||||||
|
@ -117,6 +129,7 @@ ircd::m::room::auth::chain_eval(const auth &auth,
|
||||||
m::vm::opts opts;
|
m::vm::opts opts;
|
||||||
opts.non_conform.set(m::event::conforms::MISSING_PREV_STATE);
|
opts.non_conform.set(m::event::conforms::MISSING_PREV_STATE);
|
||||||
opts.infolog_accept = true;
|
opts.infolog_accept = true;
|
||||||
|
opts.prev_check_exists = false;
|
||||||
opts.warnlog |= m::vm::fault::STATE;
|
opts.warnlog |= m::vm::fault::STATE;
|
||||||
opts.warnlog &= ~m::vm::fault::EXISTS;
|
opts.warnlog &= ~m::vm::fault::EXISTS;
|
||||||
opts.errorlog &= ~m::vm::fault::STATE;
|
opts.errorlog &= ~m::vm::fault::STATE;
|
||||||
|
|
Loading…
Reference in a new issue