diff options
author | Holger Weiss <holger@zedat.fu-berlin.de> | 2015-03-25 01:17:35 +0100 |
---|---|---|
committer | Holger Weiss <holger@zedat.fu-berlin.de> | 2015-03-25 01:17:35 +0100 |
commit | 1b1878409f7354f9eb2f2c0564d31fb772ab6801 (patch) | |
tree | 737ade79dc026770e480d5c25b8cd27e9a71940f /src | |
parent | Don'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.erl | 22 |
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 |