diff --git a/src/ejabberd_router.erl b/src/ejabberd_router.erl index 94e4c0865..87ba99094 100644 --- a/src/ejabberd_router.erl +++ b/src/ejabberd_router.erl @@ -31,6 +31,7 @@ %% API -export([route/3, + route_error/4, register_route/1, register_route/2, register_routes/1, @@ -72,6 +73,17 @@ route(From, To, Packet) -> ok end. +%% Route the error packet only if the originating packet is not an error itself. +%% RFC3920 9.3.1 +route_error(From, To, ErrPacket, OrigPacket) -> + {xmlelement, _Name, Attrs, _Els} = OrigPacket, + case "error" == xml:get_attr_s("type", Attrs) of + false -> + route(From, To, ErrPacket); + true -> + ok + end. + register_route(Domain) -> register_route(Domain, undefined). diff --git a/src/ejabberd_service.erl b/src/ejabberd_service.erl index 0b3492c8d..44bca0b9e 100644 --- a/src/ejabberd_service.erl +++ b/src/ejabberd_service.erl @@ -351,7 +351,7 @@ handle_info({route, From, To, Packet}, StateName, StateData) -> send_text(StateData, Text); deny -> Err = jlib:make_error_reply(Packet, ?ERR_NOT_ALLOWED), - ejabberd_router:route(To, From, Err) + ejabberd_router:route_error(To, From, Err, Packet) end, {next_state, StateName, StateData}. diff --git a/src/mod_muc/mod_muc.erl b/src/mod_muc/mod_muc.erl index 9b6f797f1..96d62664f 100644 --- a/src/mod_muc/mod_muc.erl +++ b/src/mod_muc/mod_muc.erl @@ -336,7 +336,7 @@ do_route(Host, ServerHost, Access, HistorySize, RoomShaper, ErrText = "Access denied by service policy", Err = jlib:make_error_reply(Packet, ?ERRT_FORBIDDEN(Lang, ErrText)), - ejabberd_router:route(To, From, Err) + ejabberd_router:route_error(To, From, Err, Packet) end.