]> granicus.if.org Git - ejabberd/commitdiff
disallow room creation if archive not empty and
authorChristoph Scholz <christoph.scholz@gmail.com>
Sun, 27 Jan 2019 16:40:43 +0000 (17:40 +0100)
committerChristoph Scholz <christoph.scholz@gmail.com>
Mon, 18 Feb 2019 12:42:45 +0000 (13:42 +0100)
clear_archive_on_room_destroy is false

src/mod_mam.erl
src/mod_muc.erl

index 5f6bfa089b873e4260a9dc4b86cc17a5fdb676ed..7dc80e4627144dbabdd95d41ea0619b1bcbe1a36 100644 (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
 %%%===================================================================
index 29474e5111f07753150ef03945ccd15ebdd01902..ae3c6f9f767403c1aa0a0824ca4ace5036605f51 100644 (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,
 %% 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).