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:
parent
8f9a2d6df8
commit
1b1878409f
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user