diff options
Diffstat (limited to 'src/ejabberd_sm.erl')
-rw-r--r-- | src/ejabberd_sm.erl | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl index abe15d9ff..678452951 100644 --- a/src/ejabberd_sm.erl +++ b/src/ejabberd_sm.erl @@ -516,7 +516,18 @@ do_route(From, To, #xmlel{} = Packet) -> PResources); true -> ok end; - <<"message">> -> route_message(From, To, Packet); + <<"message">> -> + case xml:get_attr_s(<<"type">>, Attrs) of + <<"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, normal) + end; <<"iq">> -> process_iq(From, To, Packet); _ -> ok end; @@ -525,7 +536,15 @@ do_route(From, To, #xmlel{} = Packet) -> case Mod:get_sessions(LUser, LServer, LResource) of [] -> case Name of - <<"message">> -> route_message(From, To, Packet); + <<"message">> -> + case xml:get_attr_s(<<"type">>, Attrs) of + <<"chat">> -> route_message(From, To, Packet, chat); + <<"error">> -> ok; + _ -> + Err = jlib:make_error_reply(Packet, + ?ERR_SERVICE_UNAVAILABLE), + ejabberd_router:route(To, From, Err) + end; <<"iq">> -> case xml:get_attr_s(<<"type">>, Attrs) of <<"error">> -> ok; @@ -568,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, @@ -593,12 +613,8 @@ 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">> -> - bounce_offline_message(From, To, Packet); + case Type of + headline -> ok; _ -> case ejabberd_auth:is_user_exists(LUser, LServer) of true -> |