_ ->
case mnesia:dirty_read(muc_online_room, {Room, Host}) of
[] ->
- Type = fxml:get_attr_s(<<"type">>, Attrs),
- case {Name, Type} of
- {<<"presence">>, <<"">>} ->
+ case is_create_request(Packet) of
+ true ->
case check_user_can_create_room(ServerHost,
AccessCreate, From, Room) and
check_create_roomid(ServerHost, Room) of
Packet, ?ERRT_FORBIDDEN(Lang, ErrText)),
ejabberd_router:route(To, From, Err)
end;
- _ ->
+ false ->
Lang = fxml:get_attr_s(<<"xml:lang">>, Attrs),
ErrText = <<"Conference room does not exist">>,
Err = jlib:make_error_reply(Packet,
end
end.
+-spec is_create_request(xmlel()) -> boolean().
+is_create_request(#xmlel{name = <<"presence">>} = Packet) ->
+ <<"">> == fxml:get_tag_attr_s(<<"type">>, Packet);
+is_create_request(#xmlel{name = <<"iq">>} = Packet) ->
+ case jlib:iq_query_info(Packet) of
+ #iq{type = set, xmlns = ?NS_MUCSUB,
+ sub_el = #xmlel{name = <<"subscribe">>}} ->
+ true;
+ #iq{type = get, xmlns = ?NS_MUC_OWNER, sub_el = SubEl} ->
+ [] == fxml:remove_cdata(SubEl#xmlel.children);
+ _ ->
+ false
+ end;
+is_create_request(_) ->
+ false.
+
check_user_can_create_room(ServerHost, AccessCreate,
From, _RoomID) ->
case acl:match_rule(ServerHost, AccessCreate, From) of