]> granicus.if.org Git - ejabberd/commitdiff
Improve presence-error processing
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>
Tue, 26 Sep 2017 16:01:54 +0000 (19:01 +0300)
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>
Tue, 26 Sep 2017 16:01:54 +0000 (19:01 +0300)
When a presence-error is received from a participant in a MUC, kick
only this particular participant's full JID, leaving other resources
untouched. This will prevent from erroneous kicking all user's resources
in the presence of "multi-session nicks".

src/mod_muc_room.erl

index 41e776339bb2b57e3b87ba18c63af0d5a783d18f..d883788ddb17e2bd1cda7a8edebd5c90962f1e89 100644 (file)
@@ -1243,7 +1243,12 @@ expulse_participant(Packet, From, StateData, Reason1) ->
                                    #presence{type = unavailable,
                                              status = xmpp:mk_text(Reason2)},
                                    StateData),
-    send_new_presence(From, NewState, StateData),
+    LJID = jid:tolower(From),
+    {ok, #user{nick = Nick}} = (?DICT):find(LJID, StateData#state.users),
+    case (?DICT):find(Nick, StateData#state.nicks) of
+       {ok, [_, _ | _]} -> ok;
+       _ -> send_new_presence(From, NewState, StateData)
+    end,
     remove_online_user(From, NewState).
 
 -spec set_affiliation(jid(), affiliation(), state()) -> state().