delete_old_messages/2, get_commands_spec/0, msg_to_el/4,
get_room_config/4, set_room_option/3, offline_message/1, export/1,
mod_options/1, remove_mam_for_user_with_peer/3, remove_mam_for_user/2,
- is_empty_for_user/2, is_empty_for_room/3]).
+ is_empty_for_user/2, is_empty_for_room/3, check_create_room/4]).
-include("xmpp.hrl").
-include("logger.hrl").
ejabberd_hooks:add(remove_room, Host, ?MODULE,
remove_room, 50);
false ->
- ok
+ ejabberd_hooks:add(check_create_room, Host, ?MODULE,
+ check_create_room, 50)
end,
ejabberd_commands:register_commands(get_commands_spec());
Err ->
ejabberd_hooks:delete(remove_room, Host, ?MODULE,
remove_room, 50);
false ->
- ok
+ ejabberd_hooks:delete(check_create_room, Host, ?MODULE,
+ check_create_room, 50)
end,
case gen_mod:is_loaded_elsewhere(Host, ?MODULE) of
false ->
Mod = gen_mod:db_mod(LServer, ?MODULE),
Mod:is_empty_for_room(LServer, LName, LHost).
+-spec check_create_room(boolean(), binary(), binary(), binary()) -> boolean().
+check_create_room(Acc, ServerHost, RoomID, Host) ->
+ Acc and is_empty_for_room(ServerHost, RoomID, Host).
+
%%%===================================================================
%%% Internal functions
%%%===================================================================
iq_set_register_info/5,
count_online_rooms_by_user/3,
get_online_rooms_by_user/3,
- can_use_nick/4]).
+ can_use_nick/4,
+ check_create_room/4]).
-export([init/1, handle_call/3, handle_cast/2,
handle_info/2, terminate/2, code_change/3,
%% API
%%====================================================================
start(Host, Opts) ->
+ ejabberd_hooks:add(check_create_room, Host, ?MODULE,
+ check_create_room, 50),
gen_mod:start_child(?MODULE, Host, Opts).
stop(Host) ->
Rooms = shutdown_rooms(Host),
+ ejabberd_hooks:delete(check_create_room, Host, ?MODULE,
+ check_create_room, 50),
gen_mod:stop_child(?MODULE, Host),
{wait, Rooms}.
true ->
case check_user_can_create_room(
ServerHost, AccessCreate, From, Room) and
- check_create_roomid(ServerHost, Room) of
+ ejabberd_hooks:run_fold(check_create_room,
+ ServerHost, true,
+ [ServerHost, Room, Host]) of
true ->
{ok, Pid} = start_new_room(
Host, ServerHost, Access,
_ -> false
end.
-check_create_roomid(ServerHost, RoomID) ->
+check_create_room(Acc, ServerHost, RoomID, _Host) ->
Max = gen_mod:get_module_opt(ServerHost, ?MODULE, max_room_id),
Regexp = gen_mod:get_module_opt(ServerHost, ?MODULE, regexp_room_id),
+ Acc and
(byte_size(RoomID) =< Max) and
(re:run(RoomID, Regexp, [unicode, {capture, none}]) == match).