]> granicus.if.org Git - ejabberd/commitdiff
Carbons: Handle unavailable resource like bare JID
authorHolger Weiss <holger@zedat.fu-berlin.de>
Tue, 8 Apr 2014 21:32:30 +0000 (23:32 +0200)
committerHolger Weiss <holger@zedat.fu-berlin.de>
Tue, 8 Apr 2014 21:32:30 +0000 (23:32 +0200)
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

index 6a5c8870670a09ed44f113e6e01b2c732bcdec20..dbb942dd5e828fdfed884538b12ba5cf882a8729 100644 (file)
@@ -181,12 +181,21 @@ remove_connection(User, Server, Resource, _Status)->
 %% Direction = received | sent <received xmlns='urn:xmpp:carbons:1'/>
 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) ]),