aboutsummaryrefslogtreecommitdiff
path: root/src/mod_muc_room.erl
diff options
context:
space:
mode:
authorEvgeny Khramtsov <ekhramtsov@process-one.net>2019-07-15 13:59:41 +0300
committerEvgeny Khramtsov <ekhramtsov@process-one.net>2019-07-15 13:59:41 +0300
commit4ec78736b9e37265cac6e3d5b708aea77aa59b57 (patch)
treee981bbf861867a1c11509e40ba1964a0d2769567 /src/mod_muc_room.erl
parentejabberd_s2s should start after its supervisors (diff)
Improve handling of unexpected iq in mod_muc_room
Don't crash on an iq-set/get containing unexpected tag within expected namespace This further improves PR #2900
Diffstat (limited to 'src/mod_muc_room.erl')
-rw-r--r--src/mod_muc_room.erl34
1 files changed, 19 insertions, 15 deletions
diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl
index af7e3c3bd..a2f351c9b 100644
--- a/src/mod_muc_room.erl
+++ b/src/mod_muc_room.erl
@@ -423,20 +423,24 @@ normal_state({route, <<"">>,
ejabberd_router:route(IQRes),
{next_state, normal_state, StateData};
#iq{sub_els = [SubEl]} = IQ ->
- Res1 = case xmpp:get_ns(SubEl) of
- ?NS_MUC_ADMIN ->
+ Res1 = case SubEl of
+ #muc_admin{} ->
process_iq_admin(From, IQ, StateData);
- ?NS_MUC_OWNER ->
+ #muc_owner{} ->
process_iq_owner(From, IQ, StateData);
- ?NS_DISCO_INFO ->
+ #disco_info{} ->
process_iq_disco_info(From, IQ, StateData);
- ?NS_DISCO_ITEMS ->
+ #disco_items{} ->
process_iq_disco_items(From, IQ, StateData);
- ?NS_VCARD ->
+ #vcard_temp{} ->
process_iq_vcard(From, IQ, StateData);
- ?NS_MUCSUB ->
+ #muc_subscribe{} ->
process_iq_mucsub(From, IQ, StateData);
- ?NS_CAPTCHA ->
+ #muc_unsubscribe{} ->
+ process_iq_mucsub(From, IQ, StateData);
+ #muc_subscriptions{} ->
+ process_iq_mucsub(From, IQ, StateData);
+ #xcaptcha{} ->
process_iq_captcha(From, IQ, StateData);
_ ->
Txt = ?T("The feature requested is not "
@@ -2741,6 +2745,11 @@ process_iq_admin(_From, #iq{lang = Lang, sub_els = [#muc_admin{items = []}]},
_StateData) ->
Txt = ?T("No 'item' element found"),
{error, xmpp:err_bad_request(Txt, Lang)};
+process_iq_admin(_From, #iq{type = get, lang = Lang,
+ sub_els = [#muc_admin{items = [_, _|_]}]},
+ _StateData) ->
+ ErrText = ?T("Too many <item/> elements"),
+ {error, xmpp:err_bad_request(ErrText, Lang)};
process_iq_admin(From, #iq{type = set, lang = Lang,
sub_els = [#muc_admin{items = Items}]},
StateData) ->
@@ -2773,10 +2782,7 @@ process_iq_admin(From, #iq{type = get, lang = Lang,
ErrText = ?T("Moderator privileges required"),
{error, xmpp:err_forbidden(ErrText, Lang)}
end
- end;
-process_iq_admin(_From, #iq{type = get, lang = Lang}, _StateData) ->
- ErrText = ?T("Too many <item/> elements"),
- {error, xmpp:err_bad_request(ErrText, Lang)}.
+ end.
-spec items_with_role(role(), state()) -> [muc_item()].
items_with_role(SRole, StateData) ->
@@ -3377,9 +3383,7 @@ process_iq_owner(From, #iq{type = get, lang = Lang,
end;
true ->
{error, xmpp:err_bad_request()}
- end;
-process_iq_owner(_, _, _) ->
- {error, xmpp:err_bad_request()}.
+ end.
-spec is_allowed_log_change(muc_roomconfig:result(), state(), jid()) -> boolean().
is_allowed_log_change(Options, StateData, From) ->