From b3b12effbca94f9b16c3317fa8fdd9b2f4c5554b Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Tue, 8 Apr 2014 23:32:30 +0200 Subject: [PATCH] Carbons: Handle unavailable resource like bare JID As the session manager handles messages sent to unavailable resources just like messages sent to bare JIDs, mod_carboncopy must do that, too. That is, forward them only to those carbon-copy-enabled resources that don't have a top priority, in order to avoid duplicates. --- src/mod_carboncopy.erl | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/mod_carboncopy.erl b/src/mod_carboncopy.erl index 6a5c88706..dbb942dd5 100644 --- a/src/mod_carboncopy.erl +++ b/src/mod_carboncopy.erl @@ -181,12 +181,21 @@ remove_connection(User, Server, Resource, _Status)-> %% Direction = received | sent send_copies(JID, To, Packet, Direction)-> {U, S, R} = jlib:jid_tolower(JID), + PrioRes = ejabberd_sm:get_user_present_resources(U, S), + IsBareTo = case {Direction, To} of + {received, #jid{lresource = <<>>}} -> true; + {received, #jid{lresource = LRes}} -> + %% unavailable resources are handled like bare JIDs + case lists:keyfind(LRes, 2, PrioRes) of + false -> true; + _ -> false + end; + _ -> false + end, %% list of JIDs that should receive a carbon copy of this message (excluding the %% receiver(s) of the original message - TargetJIDs = case {Direction, To} of - {received, #jid{resource = <<>>}} -> - PrioRes = ejabberd_sm:get_user_present_resources(U, S), + TargetJIDs = if IsBareTo -> MaxPrio = case catch lists:max(PrioRes) of {Prio, _Res} -> Prio; _ -> 0 @@ -194,7 +203,7 @@ send_copies(JID, To, Packet, Direction)-> OrigTo = fun(Res) -> lists:member({MaxPrio, Res}, PrioRes) end, [ {jlib:make_jid({U, S, CCRes}), CC_Version} || {CCRes, CC_Version} <- list(U, S), not OrigTo(CCRes) ]; - _ -> + true -> [ {jlib:make_jid({U, S, CCRes}), CC_Version} || {CCRes, CC_Version} <- list(U, S), CCRes /= R ] %TargetJIDs = lists:delete(JID, [ jlib:make_jid({U, S, CCRes}) || CCRes <- list(U, S) ]),