diff options
author | Badlop <badlop@process-one.net> | 2010-04-20 22:31:42 +0400 |
---|---|---|
committer | Badlop <badlop@process-one.net> | 2010-04-20 22:31:42 +0400 |
commit | 2ff291899dfa2d4366d73c6b5705a692827a4108 (patch) | |
tree | 9fbdf9d34c06d284d5ee467c5aca46c82d925098 /src | |
parent | 2d375e0429512917a666808eda3482519943e85c (diff) |
Don't send error stanza as reply to error stanza (EJAB-930)
Diffstat (limited to 'src')
-rw-r--r-- | src/ejabberd_router.erl | 12 | ||||
-rw-r--r-- | src/ejabberd_service.erl | 2 | ||||
-rw-r--r-- | src/mod_muc/mod_muc.erl | 2 |
3 files changed, 14 insertions, 2 deletions
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. |