]> granicus.if.org Git - ejabberd/commitdiff
Don't send error stanza as reply to error stanza (EJAB-930)
authorBadlop <badlop@process-one.net>
Tue, 20 Apr 2010 18:31:42 +0000 (20:31 +0200)
committerBadlop <badlop@process-one.net>
Tue, 20 Apr 2010 18:31:42 +0000 (20:31 +0200)
src/ejabberd_router.erl
src/ejabberd_service.erl
src/mod_muc/mod_muc.erl

index 94e4c08657c82b83fca537a1d4893cc578163756..87ba99094d0b2342d43c10eb5e727d160d2fadd1 100644 (file)
@@ -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).
 
index 0b3492c8dd4efda185b15c377f079db9e1ad334d..44bca0b9e4c0d409e3ff1943df2512b4aab9e31e 100644 (file)
@@ -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}.
 
index 9b6f797f12a557fe0582daa38bc984b57ff8d37e..96d62664f7d1f8d1e9583178e56b263aa6cb668d 100644 (file)
@@ -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.