From 5e7f234ac8b7becf77e0090a4424885766590377 Mon Sep 17 00:00:00 2001 From: Christoph Scholz Date: Sun, 27 Jan 2019 17:40:43 +0100 Subject: [PATCH] disallow room creation if archive not empty and clear_archive_on_room_destroy is false --- src/mod_mam.erl | 12 +++++++++--- src/mod_muc.erl | 14 +++++++++++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/mod_mam.erl b/src/mod_mam.erl index 5f6bfa089..7dc80e462 100644 --- a/src/mod_mam.erl +++ b/src/mod_mam.erl @@ -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 %%%=================================================================== diff --git a/src/mod_muc.erl b/src/mod_muc.erl index 29474e511..ae3c6f9f7 100644 --- a/src/mod_muc.erl +++ b/src/mod_muc.erl @@ -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).