Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/processone/ejabberd.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHolger Weiss <holger@zedat.fu-berlin.de>2014-04-09 01:32:30 +0400
committerHolger Weiss <holger@zedat.fu-berlin.de>2014-04-09 01:32:30 +0400
commitb3b12effbca94f9b16c3317fa8fdd9b2f4c5554b (patch)
tree842425c2e3f6b338320c914d88bb8edc14d1dc9e /src/mod_carboncopy.erl
parent9d5426315f796fd1467f469e888e4aee58b30d37 (diff)
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.
Diffstat (limited to 'src/mod_carboncopy.erl')
-rw-r--r--src/mod_carboncopy.erl17
1 files 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 <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) ]),