From 1d7daab4e83eb480d38bbd6102e461ca11595035 Mon Sep 17 00:00:00 2001 From: Badlop Date: Tue, 20 Apr 2010 20:31:17 +0200 Subject: [PATCH] Don't send error stanza as reply to error stanza (EJAB-930) --- src/ejabberd_router.erl | 11 +++++++++++ src/ejabberd_service.erl | 2 +- src/mod_muc/mod_muc.erl | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/ejabberd_router.erl b/src/ejabberd_router.erl index fe2f67707..122afa4df 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, @@ -83,6 +84,16 @@ 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) -> + case exmpp_stanza:is_stanza_error(OrigPacket) 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 5120eba65..a786a217f 100644 --- a/src/ejabberd_service.erl +++ b/src/ejabberd_service.erl @@ -347,7 +347,7 @@ handle_info({route, From, To, Packet}, StateName, StateData) -> send_element(StateData, El2); deny -> Err = exmpp_stanza:reply_with_error(Packet, '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 38abaa808..c75c3e8cb 100644 --- a/src/mod_muc/mod_muc.erl +++ b/src/mod_muc/mod_muc.erl @@ -338,7 +338,7 @@ do_route(Host, ServerHost, Access, HistorySize, RoomShaper, Err = exmpp_iq:error(Packet,exmpp_stanza:error(Packet#xmlel.ns, 'forbidden', {Lang,ErrText})), - ejabberd_router:route(To, From, Err) + ejabberd_router:route_error(To, From, Err, Packet) end.