aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHolger Weiss <holger@zedat.fu-berlin.de>2015-03-25 01:17:35 +0100
committerHolger Weiss <holger@zedat.fu-berlin.de>2015-03-25 01:17:35 +0100
commit1b1878409f7354f9eb2f2c0564d31fb772ab6801 (patch)
tree737ade79dc026770e480d5c25b8cd27e9a71940f /src
parentDon't route error/groupchat messages to bare JIDs (diff)
Route headlines sent to bare JIDs to all resources
As per RFC 6121, deliver headline messages that were sent to a bare JID to all resources with a non-negative priority, not just to those with the highest priority. If no such resource is available, discard them silently.
Diffstat (limited to 'src')
-rw-r--r--src/ejabberd_sm.erl22
1 files changed, 11 insertions, 11 deletions
diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl
index 478de69c0..2a508c565 100644
--- a/src/ejabberd_sm.erl
+++ b/src/ejabberd_sm.erl
@@ -518,15 +518,15 @@ do_route(From, To, #xmlel{} = Packet) ->
end;
<<"message">> ->
case xml:get_attr_s(<<"type">>, Attrs) of
- <<"chat">> -> route_message(From, To, Packet);
- <<"headline">> -> route_message(From, To, Packet);
+ <<"chat">> -> route_message(From, To, Packet, chat);
+ <<"headline">> -> route_message(From, To, Packet, headline);
<<"error">> -> ok;
<<"groupchat">> ->
Err = jlib:make_error_reply(Packet,
?ERR_SERVICE_UNAVAILABLE),
ejabberd_router:route(To, From, Err);
_ ->
- route_message(From, To, Packet)
+ route_message(From, To, Packet, normal)
end;
<<"iq">> -> process_iq(From, To, Packet);
_ -> ok
@@ -538,7 +538,7 @@ do_route(From, To, #xmlel{} = Packet) ->
case Name of
<<"message">> ->
case xml:get_attr_s(<<"type">>, Attrs) of
- <<"chat">> -> route_message(From, To, Packet);
+ <<"chat">> -> route_message(From, To, Packet, chat);
<<"error">> -> ok;
_ ->
Err = jlib:make_error_reply(Packet,
@@ -587,14 +587,15 @@ is_privacy_allow(From, To, Packet, PrivacyList) ->
[User, Server, PrivacyList, {From, To, Packet},
in]).
-route_message(From, To, Packet) ->
+route_message(From, To, Packet, Type) ->
LUser = To#jid.luser,
LServer = To#jid.lserver,
PrioRes = get_user_present_resources(LUser, LServer),
case catch lists:max(PrioRes) of
{Priority, _R}
when is_integer(Priority), Priority >= 0 ->
- lists:foreach(fun ({P, R}) when P == Priority ->
+ lists:foreach(fun ({P, R}) when P == Priority;
+ (P >= 0) and (Type == headline) ->
LResource = jlib:resourceprep(R),
Mod = get_sm_backend(),
case Mod:get_sessions(LUser, LServer,
@@ -612,11 +613,10 @@ route_message(From, To, Packet) ->
end,
PrioRes);
_ ->
- case xml:get_tag_attr_s(<<"type">>, Packet) of
- <<"error">> -> ok;
- <<"groupchat">> ->
- bounce_offline_message(From, To, Packet);
- <<"headline">> ->
+ case Type of
+ error -> ok;
+ headline -> ok;
+ groupchat ->
bounce_offline_message(From, To, Packet);
_ ->
case ejabberd_auth:is_user_exists(LUser, LServer) of