From 2a41ca062847bdc4ac196ac209705b2202110ab6 Mon Sep 17 00:00:00 2001 From: Maxim Ignatenko Date: Sat, 23 Jul 2011 12:16:17 +0300 Subject: [PATCH] More correct dispatching of normal messages to conference room is_invitation/1 function returns true if element of message is an invitation --- src/mod_muc/mod_muc_room.erl | 94 ++++++++++++++++++++++-------------- 1 file changed, 59 insertions(+), 35 deletions(-) diff --git a/src/mod_muc/mod_muc_room.erl b/src/mod_muc/mod_muc_room.erl index c7d43e689..a0ff8df59 100644 --- a/src/mod_muc/mod_muc_room.erl +++ b/src/mod_muc/mod_muc_room.erl @@ -256,42 +256,48 @@ normal_state({route, From, "", From, Err), {next_state, normal_state, StateData}; Type when (Type == "") or (Type == "normal") -> - case catch check_invitation(From, Els, Lang, StateData) of - {error, Error} -> - Err = jlib:make_error_reply( - Packet, Error), - ejabberd_router:route( - StateData#state.jid, - From, Err), - {next_state, normal_state, StateData}; - IJID -> - Config = StateData#state.config, - case Config#config.members_only of - true -> - case get_affiliation(IJID, StateData) of - none -> - NSD = set_affiliation( - IJID, - member, - StateData), - case (NSD#state.config)#config.persistent of - true -> - mod_muc:store_room( - NSD#state.host, - NSD#state.room, - make_opts(NSD)); + IsInvitation = is_invitation(Els), + if + IsInvitation -> + case catch check_invitation(From, Els, Lang, StateData) of + {error, Error} -> + Err = jlib:make_error_reply( + Packet, Error), + ejabberd_router:route( + StateData#state.jid, + From, Err), + {next_state, normal_state, StateData}; + IJID -> + Config = StateData#state.config, + case Config#config.members_only of + true -> + case get_affiliation(IJID, StateData) of + none -> + NSD = set_affiliation( + IJID, + member, + StateData), + case (NSD#state.config)#config.persistent of + true -> + mod_muc:store_room( + NSD#state.host, + NSD#state.room, + make_opts(NSD)); + _ -> + ok + end, + {next_state, normal_state, NSD}; _ -> - ok - end, - {next_state, normal_state, NSD}; - _ -> - {next_state, normal_state, - StateData} - end; - false -> - {next_state, normal_state, StateData} - end - end; + {next_state, normal_state, + StateData} + end; + false -> + {next_state, normal_state, StateData} + end + end; + true -> + {next_state, normal_state, StateData} + end; _ -> ErrText = "Improper message type", Err = jlib:make_error_reply( @@ -3623,6 +3629,24 @@ get_mucroom_disco_items(StateData) -> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Invitation support +is_invitation(Els) -> + case xml:remove_cdata(Els) of + [{xmlelement, "x", _Attrs1, Els1} = XEl] -> + case xml:get_tag_attr_s("xmlns", XEl) of + ?NS_MUC_USER -> + case xml:remove_cdata(Els1) of + [{xmlelement, "invite", _, _}] -> + true; + _ -> + false + end; + _ -> + false + end; + _ -> + false + end. + check_invitation(From, Els, Lang, StateData) -> FAffiliation = get_affiliation(From, StateData), CanInvite = (StateData#state.config)#config.allow_user_invites