Skip to content

Commit efe0e3c

Browse files
committed
Reply with error iq when receiving IQ with unknown id format in ejabberd_local
1 parent ca654ae commit efe0e3c

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

big_tests/tests/local_iq_SUITE.erl

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ groups() ->
1919

2020
cases() ->
2121
[process_iq_works_across_multiple_nodes,
22-
process_iq_timeout].
22+
process_iq_timeout,
23+
send_unexpected_result_iq].
2324

2425
%%--------------------------------------------------------------------
2526
%% Init & teardown
@@ -77,6 +78,19 @@ process_iq_timeout(Config) ->
7778
end,
7879
escalus:fresh_story(Config, [{alice, 1}], F).
7980

81+
82+
send_unexpected_result_iq(Config) ->
83+
F = fun(Alice) ->
84+
Jid = escalus_client:full_jid(Alice),
85+
Server = escalus_client:server(Alice),
86+
Request = unexpected_result_iq(Server),
87+
escalus_client:send(Alice, Request),
88+
Stanza = escalus:wait_for_stanza(Alice),
89+
escalus:assert(is_iq_error, [Request], Stanza),
90+
escalus:assert(is_error, [<<"cancel">>, <<"service-unavailable">>], Stanza)
91+
end,
92+
escalus:fresh_story(Config, [{alice, 1}], F).
93+
8094
%%--------------------------------------------------------------------
8195
%% Helpers
8296
%%--------------------------------------------------------------------
@@ -100,3 +114,10 @@ route_iq(Alice, Timeout) ->
100114
Self ! {result, CbFrom, CbTo, CbAcc, CbIQ}, CbAcc end,
101115
Args = [From, To, Acc, IQ, Callback, Timeout],
102116
rpc(mim2(), ejabberd_local, route_iq, Args).
117+
118+
119+
unexpected_result_iq(To) ->
120+
#xmlel{name = <<"iq">>,
121+
attrs = #{<<"id">> => <<"unexp3443">>, <<"type">> => <<"result">>,
122+
<<"to">> => To},
123+
children = []}.

src/ejabberd_local.erl

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,11 +127,16 @@ process_iq(_, Acc, From, To, El) ->
127127
To :: jid:jid(),
128128
Acc :: mongoose_acc:t(),
129129
IQ :: jlib:iq()) -> mongoose_acc:t().
130-
process_iq_reply(From, To, Acc, #iq{id = ID} = IQ) ->
130+
process_iq_reply(From, To, Acc, #iq{type = Type, id = ID} = IQ) ->
131131
case get_iq_callback_in_cluster(ID, Acc) of
132132
{ok, Callback} ->
133133
Callback(From, To, Acc, IQ);
134-
_ ->
134+
_ when Type =:= result ->
135+
ejabberd_router:route_error_reply(To, From, Acc,
136+
mongoose_xmpp_errors:service_unavailable(<<"en">>, <<"Unexpected IQ with this ID">>));
137+
_ when Type =:= error ->
138+
%% Do not reply on errors to avoid loops
139+
?LOG_INFO(#{what => client_sends_error_iq, acc => Acc}),
135140
Acc
136141
end.
137142

@@ -145,7 +150,7 @@ get_iq_callback_in_cluster(ID, Acc) ->
145150
{remote_node, NodeName} ->
146151
rpc:call(NodeName, ?MODULE, get_iq_callback, [ID]);
147152
{error, Reason} ->
148-
?LOG_ERROR(#{what => parse_iq_id_failed,
153+
?LOG_DEBUG(#{what => parse_iq_id_failed,
149154
reason => Reason, acc => Acc}),
150155
{error, Reason}
151156
end.

0 commit comments

Comments
 (0)