diff --git a/include/ircd/m/event/conforms.h b/include/ircd/m/event/conforms.h index 2f5b5a210..0ac70b3ff 100644 --- a/include/ircd/m/event/conforms.h +++ b/include/ircd/m/event/conforms.h @@ -60,8 +60,6 @@ enum ircd::m::event::conforms::code MISSING_ORIGIN, ///< origin empty INVALID_ORIGIN, ///< origin not a proper domain INVALID_OR_MISSING_REDACTS_ID, ///< for m.room.redaction - MISSING_MEMBERSHIP, ///< for m.room.member, membership empty - INVALID_MEMBERSHIP, ///< for m.room.member (does not check actual states) MISSING_CONTENT_MEMBERSHIP, ///< for m.room.member, content.membership INVALID_CONTENT_MEMBERSHIP, ///< for m.room.member, content.membership MISSING_PREV_EVENTS, ///< for non-m.room.create, empty prev_events diff --git a/include/ircd/m/event/event.h b/include/ircd/m/event/event.h index 7155439fc..d235b15f2 100644 --- a/include/ircd/m/event/event.h +++ b/include/ircd/m/event/event.h @@ -65,7 +65,6 @@ struct ircd::m::event json::property, json::property, json::property, - json::property, json::property, json::property, json::property, diff --git a/ircd/m.cc b/ircd/m.cc index 03242174d..385785138 100644 --- a/ircd/m.cc +++ b/ircd/m.cc @@ -2596,7 +2596,7 @@ const { const string_view &membership_ { - unquote(at<"content"_>(event).at("membership")) + m::membership(event) }; if(membership && membership_ != membership) diff --git a/ircd/m_event.cc b/ircd/m_event.cc index 978e0a995..e28873125 100644 --- a/ircd/m_event.cc +++ b/ircd/m_event.cc @@ -338,9 +338,12 @@ ircd::m::check_size(std::nothrow_t, ircd::string_view ircd::m::membership(const event &event) { - return json::get<"membership"_>(event)? - string_view{json::get<"membership"_>(event)}: - unquote(json::get<"content"_>(event).get("membership")); + const json::object &content + { + json::get<"content"_>(event) + }; + + return unquote(content.get("membership")); } size_t @@ -1591,8 +1594,6 @@ ircd::m::event_conforms_reflects "MISSING_ORIGIN", "INVALID_ORIGIN", "INVALID_OR_MISSING_REDACTS_ID", - "MISSING_MEMBERSHIP", - "INVALID_MEMBERSHIP", "MISSING_CONTENT_MEMBERSHIP", "INVALID_CONTENT_MEMBERSHIP", "MISSING_PREV_EVENTS", @@ -1697,14 +1698,6 @@ ircd::m::event::conforms::conforms(const event &e) if(json::get<"redacts"_>(e) == json::get<"event_id"_>(e)) set(SELF_REDACTS); - if(json::get<"type"_>(e) == "m.room.member") - if(empty(json::get<"membership"_>(e))) - set(MISSING_MEMBERSHIP); - - if(json::get<"type"_>(e) == "m.room.member") - if(!all_of(json::get<"membership"_>(e))) - set(INVALID_MEMBERSHIP); - if(json::get<"type"_>(e) == "m.room.member") if(empty(unquote(json::get<"content"_>(e).get("membership")))) set(MISSING_CONTENT_MEMBERSHIP); diff --git a/ircd/m_room.cc b/ircd/m_room.cc index c44e16e0a..5b55d2476 100644 --- a/ircd/m_room.cc +++ b/ircd/m_room.cc @@ -371,53 +371,20 @@ ircd::m::room::membership(const mutable_buffer &out, const m::id::user &user_id) const { - static const event::keys::selection membership_keys - { - event::keys::include{"membership"} - }; - - // Since this is a member function of m::room there might be a supplied - // fopts. Whatever keys it has are irrelevant, but we can preserve gopts. - const m::event::fetch::opts fopts - { - membership_keys, this->fopts? this->fopts->gopts : db::gopts{} - }; - string_view ret; - const auto result_closure{[&out, &ret] - (const m::event &event) + const room::state state{*this}; + state.get(std::nothrow, "m.room.member", user_id, [&out, &ret] + (const event::idx &event_idx) { - ret = + m::get(std::nothrow, event_idx, "content", [&out, &ret] + (const json::object &content) { - data(out), copy(out, m::membership(event)) - }; - }}; - - const room::state state{*this, &fopts}; - const bool exists - { - state.get(std::nothrow, "m.room.member"_sv, user_id, result_closure) - }; - - // This branch is taken when the event exists but the event.membership had - // no value. Due to wanton protocol violations event.membership may be - // jsundefined and only event.content.membership will exist in event. This - // is a rare case so both queries are optimized to only seek for their key. - if(exists && !ret) - { - static const event::keys::selection content_membership_keys - { - event::keys::include{"content"} - }; - - const m::event::fetch::opts fopts - { - content_membership_keys, this->fopts? this->fopts->gopts : db::gopts{} - }; - - const room::state state{*this, &fopts}; - state.get(std::nothrow, "m.room.member"_sv, user_id, result_closure); - } + ret = + { + data(out), copy(out, unquote(content.get("membership"))) + }; + }); + }); return ret; } @@ -1643,7 +1610,6 @@ const static const event::keys::include keys { "event_id", // Added for any upstack usage (but may be unnecessary). - "membership", // Required for membership test. "content", // Required because synapse events randomly have no event.membership }; @@ -1726,9 +1692,8 @@ const static const event::keys::include keys { "event_id", - "membership", "state_key", - "content", // Required because synapse events randomly have no event.membership + "content", }; // In this case the fetch opts isn't static so it can maintain the diff --git a/modules/client/rooms/context.cc b/modules/client/rooms/context.cc index 7094146d5..61ff8092c 100644 --- a/modules/client/rooms/context.cc +++ b/modules/client/rooms/context.cc @@ -41,7 +41,6 @@ default_fetch_opts "content", "depth", "event_id", - "membership", "origin_server_ts", "redacts", "room_id", diff --git a/modules/client/rooms/invite.cc b/modules/client/rooms/invite.cc index d0b3266b9..a01951337 100644 --- a/modules/client/rooms/invite.cc +++ b/modules/client/rooms/invite.cc @@ -65,7 +65,6 @@ invite__room_user(const m::room &room, { event, { "type", "m.room.member" }}, { event, { "sender", sender }}, { event, { "state_key", target }}, - { event, { "membership", "invite" }}, { content, { "membership", "invite" }}, }; diff --git a/modules/client/rooms/join.cc b/modules/client/rooms/join.cc index 19b019bad..5c973a4d0 100644 --- a/modules/client/rooms/join.cc +++ b/modules/client/rooms/join.cc @@ -69,7 +69,6 @@ join__room_user(const room &room, { event, { "type", "m.room.member" }}, { event, { "sender", user_id }}, { event, { "state_key", user_id }}, - { event, { "membership", "join" }}, { content, { "membership", "join" }}, }; @@ -192,7 +191,6 @@ bootstrap(const string_view &host, { event, { "type", "m.room.member" }}, { event, { "sender", user_id }}, { event, { "state_key", user_id }}, - { event, { "membership", "join" }}, { content, { "membership", "join" }}, { event, { "prev_events", prev_events }}, { event, { "auth_events", auth_events }}, @@ -241,7 +239,6 @@ bootstrap(const string_view &host, }; m::vm::copts opts; - opts.non_conform.set(m::event::conforms::MISSING_MEMBERSHIP); opts.non_conform.set(m::event::conforms::MISSING_PREV_STATE); opts.prev_check_exists = false; opts.head_must_exist = false; diff --git a/modules/client/rooms/kick.cc b/modules/client/rooms/kick.cc index c50239c3c..5c2747ef7 100644 --- a/modules/client/rooms/kick.cc +++ b/modules/client/rooms/kick.cc @@ -76,7 +76,6 @@ kick(const m::room &room, { { event, { "type", "m.room.member" }}, { event, { "sender", sender }}, - { event, { "membership", "leave" }}, { content, { "membership", "leave" }}, }; diff --git a/modules/client/rooms/leave.cc b/modules/client/rooms/leave.cc index 197d158a6..11804dd7a 100644 --- a/modules/client/rooms/leave.cc +++ b/modules/client/rooms/leave.cc @@ -41,7 +41,6 @@ leave__room_user(const room &room, { event, { "type", "m.room.member" }}, { event, { "sender", user_id }}, { event, { "state_key", user_id }}, - { event, { "membership", "leave" }}, { content, { "membership", "leave" }}, }; diff --git a/modules/client/rooms/messages.cc b/modules/client/rooms/messages.cc index 75d3c36f6..2070210d5 100644 --- a/modules/client/rooms/messages.cc +++ b/modules/client/rooms/messages.cc @@ -42,7 +42,6 @@ default_fetch_opts "content", "depth", "event_id", - "membership", "origin_server_ts", "prev_events", "redacts", diff --git a/modules/client/rooms/state.cc b/modules/client/rooms/state.cc index e40ed3a8b..fa084ec81 100644 --- a/modules/client/rooms/state.cc +++ b/modules/client/rooms/state.cc @@ -213,16 +213,5 @@ state__iov(const room &room, { event, { "state_key", state_key }}, }; - const json::iov::add member_ - { - event, type == "m.room.member", - { - "membership", [&content]() -> json::value - { - return content.at("membership"); - } - } - }; - return commit(room, event, content); } diff --git a/modules/console.cc b/modules/console.cc index d0d549418..54bbcf2dd 100644 --- a/modules/console.cc +++ b/modules/console.cc @@ -6031,7 +6031,6 @@ console_cmd__eval__file(opt &out, const string_view &line) m::vm::opts opts; opts.non_conform.set(m::event::conforms::MISSING_PREV_STATE); - opts.non_conform.set(m::event::conforms::MISSING_MEMBERSHIP); opts.prev_check_exists = false; opts.notify = false; opts.verify = false; @@ -9426,7 +9425,6 @@ console_cmd__fed__sync(opt &out, const string_view &line) m::vm::opts vmopts; vmopts.non_conform.set(m::event::conforms::MISSING_PREV_STATE); - vmopts.non_conform.set(m::event::conforms::MISSING_MEMBERSHIP); vmopts.prev_check_exists = false; vmopts.head_must_exist = false; vmopts.history = false; @@ -9520,7 +9518,6 @@ console_cmd__fed__state(opt &out, const string_view &line) m::vm::opts vmopts; vmopts.non_conform.set(m::event::conforms::MISSING_PREV_STATE); - vmopts.non_conform.set(m::event::conforms::MISSING_MEMBERSHIP); vmopts.prev_check_exists = false; vmopts.head_must_exist = false; vmopts.verify = false; @@ -9680,7 +9677,6 @@ console_cmd__fed__backfill(opt &out, const string_view &line) m::vm::opts vmopts; vmopts.non_conform.set(m::event::conforms::MISSING_PREV_STATE); - vmopts.non_conform.set(m::event::conforms::MISSING_MEMBERSHIP); vmopts.prev_check_exists = false; vmopts.head_must_exist = false; vmopts.history = false; @@ -9859,7 +9855,6 @@ console_cmd__fed__event(opt &out, const string_view &line) m::vm::opts vmopts; vmopts.non_conform.set(m::event::conforms::MISSING_PREV_STATE); - vmopts.non_conform.set(m::event::conforms::MISSING_MEMBERSHIP); vmopts.prev_check_exists = false; vmopts.head_must_exist = false; vmopts.history = false; diff --git a/modules/federation/invite.cc b/modules/federation/invite.cc index a167671b1..29c35f95d 100644 --- a/modules/federation/invite.cc +++ b/modules/federation/invite.cc @@ -158,13 +158,6 @@ check_event(const resource::request &request, "event.type must be m.room.member" }; - if(at<"membership"_>(event) != "invite") - throw m::error - { - http::NOT_MODIFIED, "M_INVALID_MEMBERSHIP", - "event.membership must be invite." - }; - if(unquote(at<"content"_>(event).at("membership")) != "invite") throw m::error { diff --git a/modules/federation/send.cc b/modules/federation/send.cc index 279c021f6..80bd20ee9 100644 --- a/modules/federation/send.cc +++ b/modules/federation/send.cc @@ -62,7 +62,6 @@ handle_pdu(client &client, { m::vm::opts vmopts; vmopts.non_conform.set(m::event::conforms::MISSING_PREV_STATE); - vmopts.non_conform.set(m::event::conforms::MISSING_MEMBERSHIP); vmopts.prev_check_exists = false; vmopts.nothrows = -1U; vmopts.infolog_accept = true; diff --git a/modules/federation/send_join.cc b/modules/federation/send_join.cc index 9bbca669b..c931a4814 100644 --- a/modules/federation/send_join.cc +++ b/modules/federation/send_join.cc @@ -95,13 +95,6 @@ put__send_join(client &client, "Event type must be m.room.member" }; - if(json::get<"membership"_>(event) && json::get<"membership"_>(event) != "join") - throw m::error - { - http::NOT_MODIFIED, "M_INVALID_MEMBERSHIP", - "Event membership state must be 'join'." - }; - if(unquote(json::get<"content"_>(event).get("membership")) != "join") throw m::error { @@ -118,7 +111,6 @@ put__send_join(client &client, m::vm::opts vmopts; vmopts.non_conform.set(m::event::conforms::MISSING_PREV_STATE); - vmopts.non_conform.set(m::event::conforms::MISSING_MEMBERSHIP); m::vm::eval eval { event, vmopts diff --git a/modules/federation/send_leave.cc b/modules/federation/send_leave.cc index 5cf02c2ff..f9dd848ad 100644 --- a/modules/federation/send_leave.cc +++ b/modules/federation/send_leave.cc @@ -95,13 +95,6 @@ put__send_leave(client &client, "Event type must be m.room.member" }; - if(json::get<"membership"_>(event) && json::get<"membership"_>(event) != "leave") - throw m::error - { - http::NOT_MODIFIED, "M_INVALID_MEMBERSHIP", - "Event membership state must be 'leave'." - }; - if(unquote(json::get<"content"_>(event).get("membership")) != "leave") throw m::error { @@ -118,7 +111,6 @@ put__send_leave(client &client, m::vm::opts vmopts; vmopts.non_conform.set(m::event::conforms::MISSING_PREV_STATE); - vmopts.non_conform.set(m::event::conforms::MISSING_MEMBERSHIP); m::vm::eval eval { event, vmopts diff --git a/modules/m_event.cc b/modules/m_event.cc index 173c70f59..62a092f09 100644 --- a/modules/m_event.cc +++ b/modules/m_event.cc @@ -254,7 +254,6 @@ pretty__event(std::ostream &s, "type", "depth", "state_key", - "membership", "redacts", }; @@ -420,7 +419,6 @@ pretty_oneline__event(std::ostream &s, else s << "*" << " "; - out("membership", json::get<"membership"_>(event)); out("redacts", json::get<"redacts"_>(event)); const json::object &contents diff --git a/modules/s_fetch.cc b/modules/s_fetch.cc index d04777c5a..bc9ebd9b0 100644 --- a/modules/s_fetch.cc +++ b/modules/s_fetch.cc @@ -172,7 +172,6 @@ ircd::m::fetch::auth_chain_eval(const m::room::id &room_id, { m::vm::opts opts; opts.non_conform.set(m::event::conforms::MISSING_PREV_STATE); - opts.non_conform.set(m::event::conforms::MISSING_MEMBERSHIP); opts.infolog_accept = true; opts.warnlog |= m::vm::fault::STATE; opts.warnlog &= ~m::vm::fault::EXISTS;