aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxim Ignatenko <gelraen.ua@gmail.com>2011-07-23 12:16:17 +0300
committerMaxim Ignatenko <gelraen.ua@gmail.com>2011-09-26 11:16:27 +0300
commit2a41ca062847bdc4ac196ac209705b2202110ab6 (patch)
treeb6e8e5f1670eebafbcaed69e783acd426e9ac035 /src
parentDecrease CPU usage caused by tls:send with large data. (diff)
More correct dispatching of normal messages to conference room
is_invitation/1 function returns true if <x> element of message is an invitation
Diffstat (limited to 'src')
-rw-r--r--src/mod_muc/mod_muc_room.erl94
1 files 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