aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.in2
-rw-r--r--src/mod_carboncopy.erl20
2 files changed, 15 insertions, 7 deletions
diff --git a/Makefile.in b/Makefile.in
index 6f48bc0d7..575b0bdc7 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -161,7 +161,7 @@ install: all
# Binary system libraries
$(INSTALL) -d $(SODIR)
$(INSTALL) -m 644 $(DLLs) $(SODIR)
- [ -f $(SODIR)/jiffy.so ] && (cd $(PRIVDIR); ln -s lib/jiffy.so; true)
+ -[ -f $(SODIR)/jiffy.so ] && (cd $(PRIVDIR); ln -s lib/jiffy.so; true)
#
# Translated strings
$(INSTALL) -d $(MSGSDIR)
diff --git a/src/mod_carboncopy.erl b/src/mod_carboncopy.erl
index a5cbd60d1..1313e341a 100644
--- a/src/mod_carboncopy.erl
+++ b/src/mod_carboncopy.erl
@@ -167,6 +167,10 @@ remove_connection(User, Server, Resource, _Status)->
send_copies(JID, To, Packet, Direction)->
{U, S, R} = jlib:jid_tolower(JID),
PrioRes = ejabberd_sm:get_user_present_resources(U, S),
+ {MaxPrio, MaxRes} = case catch lists:max(PrioRes) of
+ {Prio, Res} -> {Prio, Res};
+ _ -> {0, undefined}
+ end,
IsBareTo = case {Direction, To} of
{received, #jid{lresource = <<>>}} -> true;
@@ -180,15 +184,19 @@ send_copies(JID, To, Packet, Direction)->
end,
%% list of JIDs that should receive a carbon copy of this message (excluding the
%% receiver(s) of the original message
- TargetJIDs = if IsBareTo ->
- MaxPrio = case catch lists:max(PrioRes) of
- {Prio, _Res} -> Prio;
- _ -> 0
- end,
+ TargetJIDs = case {IsBareTo, R} of
+ {true, MaxRes} ->
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 ->
+ {true, _} ->
+ %% The message was sent to our bare JID, and we currently have
+ %% multiple resources with the same highest priority, so the session
+ %% manager routes the message to each of them. We create carbon
+ %% copies only from one of those resources (the one where R equals
+ %% MaxRes) in order to avoid duplicates.
+ [];
+ {false, _} ->
[ {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) ]),