From 1731ff8bad0726d28d6fec023eb46d1673eaf9f9 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Fri, 20 Sep 2019 15:18:39 -0700 Subject: [PATCH] modules/client/rooms/leave: Override any mismatch between room and user_room. --- modules/client/rooms/leave.cc | 36 ++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/modules/client/rooms/leave.cc b/modules/client/rooms/leave.cc index 9c5d9a216..b83ef156f 100644 --- a/modules/client/rooms/leave.cc +++ b/modules/client/rooms/leave.cc @@ -23,14 +23,40 @@ post__leave(client &client, }; if(!room.has("m.room.member", request.user_id)) - throw m::error + { + const m::user::room user_room { - http::NOT_MODIFIED, "M_TARGET_NOT_IN_ROOM", - "The user %s has no membership state in %s", - string_view{request.user_id}, - string_view{room_id}, + request.user_id }; + // In case the user's user room falls out of sync with the real room + // state; we directly set the user's user room state. + if(!user_room.has("ircd.member", room_id)) + throw m::error + { + http::NOT_MODIFIED, "M_TARGET_NOT_IN_ROOM", + "The user %s has no membership state in %s", + string_view{request.user_id}, + string_view{room_id}, + }; + + const auto event_id + { + send(user_room, request.user_id, "ircd.member", room_id, json::members + { + { "membership", "leave" } + }) + }; + + return resource::response + { + client, http::OK, json::members + { + { "event_id", event_id } + } + }; + } + const auto event_id { m::leave(room, request.user_id)