%% API
-export([route/3,
+ route_error/4,
register_route/1,
register_route/2,
register_routes/1,
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).
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}.
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.