disallow room creation if archive not empty and

clear_archive_on_room_destroy is false
This commit is contained in:
Christoph Scholz 2019-01-27 17:40:43 +01:00
parent f987db5a39
commit 5e7f234ac8
2 changed files with 20 additions and 6 deletions

View File

@ -41,7 +41,7 @@
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").
@ -132,7 +132,8 @@ start(Host, Opts) ->
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 ->
@ -207,7 +208,8 @@ stop(Host) ->
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 ->
@ -589,6 +591,10 @@ is_empty_for_room(LServer, Name, Host) ->
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
%%%===================================================================

View File

@ -65,7 +65,8 @@
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,
@ -112,10 +113,14 @@
%% 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}.
@ -442,7 +447,9 @@ do_route1(Host, ServerHost, Access, HistorySize, RoomShaper,
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,
@ -611,9 +618,10 @@ check_user_can_create_room(ServerHost, AccessCreate,
_ -> 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).