diff options
author | Evgeny Khramtsov <ekhramtsov@process-one.net> | 2019-07-15 13:59:41 +0300 |
---|---|---|
committer | Evgeny Khramtsov <ekhramtsov@process-one.net> | 2019-07-15 13:59:41 +0300 |
commit | 4ec78736b9e37265cac6e3d5b708aea77aa59b57 (patch) | |
tree | e981bbf861867a1c11509e40ba1964a0d2769567 /src/mod_muc_room.erl | |
parent | ejabberd_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.erl | 34 |
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) -> |