aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/muc/muc.lib.lua16
1 files changed, 8 insertions, 8 deletions
diff --git a/plugins/muc/muc.lib.lua b/plugins/muc/muc.lib.lua
index 9ae54d5e..c925329f 100644
--- a/plugins/muc/muc.lib.lua
+++ b/plugins/muc/muc.lib.lua
@@ -470,6 +470,13 @@ function room_mt:handle_normal_presence(origin, stanza)
local bare_jid = jid_bare(real_jid);
local orig_occupant = self:get_occupant_by_real_jid(real_jid);
local muc_x = stanza:get_child("x", "http://jabber.org/protocol/muc");
+
+ if orig_occupant == nil and not muc_x then
+ module:log("debug", "Attempted join without <x>, possibly desynced");
+ origin.send(st.error_reply(stanza, "cancel", "item-not-found", "You must join the room before sending presence updates"));
+ return true;
+ end
+
local is_first_dest_session;
local dest_occupant;
if type == "unavailable" then
@@ -496,13 +503,6 @@ function room_mt:handle_normal_presence(origin, stanza)
is_last_orig_session = iter(ob, iter(ob, last)) == nil;
end
- -- TODO Handle these cases sensibly
- if orig_occupant == nil and not muc_x then
- module:log("debug", "Join without <x>, possibly desynced");
- elseif orig_occupant ~= nil and muc_x then
- module:log("debug", "Presence update with <x>, possibly desynced");
- end
-
local orig_nick = dest_occupant and dest_occupant.nick;
local event, event_name = {
@@ -604,7 +604,7 @@ function room_mt:handle_normal_presence(origin, stanza)
self:save_occupant(dest_occupant);
if orig_occupant == nil or muc_x then
- -- Send occupant list to newly joined user
+ -- Send occupant list to newly joined or desynced user
self:send_occupant_list(real_jid, function(nick, occupant) -- luacheck: ignore 212
-- Don't include self
return occupant:get_presence(real_jid) == nil;