Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/processone/ejabberd.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBadlop <badlop@process-one.net>2010-04-20 22:31:42 +0400
committerBadlop <badlop@process-one.net>2010-04-20 22:31:42 +0400
commit2ff291899dfa2d4366d73c6b5705a692827a4108 (patch)
tree9fbdf9d34c06d284d5ee467c5aca46c82d925098 /src
parent2d375e0429512917a666808eda3482519943e85c (diff)
Don't send error stanza as reply to error stanza (EJAB-930)
Diffstat (limited to 'src')
-rw-r--r--src/ejabberd_router.erl12
-rw-r--r--src/ejabberd_service.erl2
-rw-r--r--src/mod_muc/mod_muc.erl2
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.