24
1
mirror of https://github.com/processone/ejabberd.git synced 2024-06-18 22:15:20 +02:00

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.
This commit is contained in:
Holger Weiss 2015-03-25 01:17:35 +01:00
parent 8f9a2d6df8
commit 1b1878409f

View File

@ -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