From a6e5a5ca9a3f3635e81da6dedfb168508bdb71b4 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Mon, 9 Oct 2017 17:59:22 +0300 Subject: Resend presences and history if presence possesses MUC element Behave according to the new rule from XEP-0045, section 7.2.2: > When a MUC service receives an tagged join stanza from an > already-joined client (as identified by the client's full JID), > the service should assume that the client lost its synchronization, > and therefore it SHOULD send exactly the same stanzas to the client > as if it actually just joined the MUC. --- src/mod_muc_room.erl | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index 8521238e8..e06c20683 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -1014,7 +1014,13 @@ do_process_presence(Nick, #presence{from = From, type = available, lang = Lang} From, Packet, StateData), NewState = add_user_presence(From, Stanza, StateData), - send_new_presence(From, NewState, StateData), + case xmpp:has_subtag(Packet, #muc{}) of + true -> + send_initial_presences_and_messages( + From, Nick, Packet, NewState, StateData); + false -> + send_new_presence(From, NewState, StateData) + end, NewState end end; @@ -1869,11 +1875,8 @@ add_new_user(From, Nick, Packet, StateData) -> From, Packet, add_online_user(From, Nick, Role, StateData)), - send_existing_presences(From, NewState), - send_initial_presence(From, NewState, StateData), - History = get_history(Nick, Packet, NewState), - send_history(From, History, NewState), - send_subject(From, StateData), + send_initial_presences_and_messages( + From, Nick, Packet, NewState, StateData), NewState; true -> set_subscriber(From, Nick, Nodes, StateData) @@ -2068,6 +2071,15 @@ presence_broadcast_allowed(JID, StateData) -> Role = get_role(JID, StateData), lists:member(Role, (StateData#state.config)#config.presence_broadcast). +-spec send_initial_presences_and_messages( + jid(), binary(), presence(), state(), state()) -> ok. +send_initial_presences_and_messages(From, Nick, Presence, NewState, OldState) -> + send_existing_presences(From, NewState), + send_initial_presence(From, NewState, OldState), + History = get_history(Nick, Presence, NewState), + send_history(From, History, NewState), + send_subject(From, OldState). + -spec send_initial_presence(jid(), state(), state()) -> ok. send_initial_presence(NJID, StateData, OldStateData) -> send_new_presence1(NJID, <<"">>, true, StateData, OldStateData). -- cgit v1.2.3