summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2018-07-08 14:52:12 +0300
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2018-07-08 14:52:12 +0300
commit491993d4016bcb7ad62d48c8b243479f5d9727e6 (patch)
tree543e48005457b1c637224ba3b8ad3b06c8eebb32 /src
parentMerge pull request #2511 from licaon-kter/patch-5 (diff)
Reload internal room's configuration when mod_muc is reloaded
Fixes #2513
Diffstat (limited to 'src')
-rw-r--r--src/ejabberd_auth.erl8
-rw-r--r--src/misc.erl9
-rw-r--r--src/mod_muc.erl9
-rw-r--r--src/mod_muc_room.erl13
4 files changed, 31 insertions, 8 deletions
diff --git a/src/ejabberd_auth.erl b/src/ejabberd_auth.erl
index 7894679a..b11bfe3c 100644
--- a/src/ejabberd_auth.erl
+++ b/src/ejabberd_auth.erl
@@ -139,7 +139,7 @@ handle_cast(config_reloaded, #state{host_modules = HostModules} = State) ->
NewModules = auth_modules(Host),
start(Host, NewModules -- OldModules),
stop(Host, OldModules -- NewModules),
- reload(Host, lists_intersection(OldModules, NewModules)),
+ reload(Host, misc:intersection(OldModules, NewModules)),
maps:put(Host, NewModules, Acc)
end, HostModules, ejabberd_config:get_myhosts()),
init_cache(NewHostModules),
@@ -834,12 +834,6 @@ validate_credentials(User, Server, Password) ->
end
end.
-lists_intersection(L1, L2) ->
- lists:filter(
- fun(E) ->
- lists:member(E, L2)
- end, L1).
-
import_info() ->
[{<<"users">>, 3}].
diff --git a/src/misc.erl b/src/misc.erl
index 2e1b3f00..69534ef3 100644
--- a/src/misc.erl
+++ b/src/misc.erl
@@ -35,7 +35,7 @@
now_to_usec/1, usec_to_now/1, encode_pid/1, decode_pid/2,
compile_exprs/2, join_atoms/2, try_read_file/1, get_descr/2,
css_dir/0, img_dir/0, js_dir/0, msgs_dir/0, sql_dir/0,
- read_css/1, read_img/1, read_js/1, try_url/1]).
+ read_css/1, read_img/1, read_js/1, try_url/1, intersection/2]).
%% Deprecated functions
-export([decode_base64/1, encode_base64/1]).
@@ -280,6 +280,13 @@ get_descr(Lang, Text) ->
Copyright = ejabberd_config:get_copyright(),
<<Desc/binary, $\n, Copyright/binary>>.
+-spec intersection(list(), list()) -> list().
+intersection(L1, L2) ->
+ lists:filter(
+ fun(E) ->
+ lists:member(E, L2)
+ end, L1).
+
%%%===================================================================
%%% Internal functions
%%%===================================================================
diff --git a/src/mod_muc.erl b/src/mod_muc.erl
index f44b5392..d7bb194c 100644
--- a/src/mod_muc.erl
+++ b/src/mod_muc.erl
@@ -295,6 +295,15 @@ handle_cast({reload, ServerHost, NewOpts, OldOpts}, #state{hosts = OldHosts}) ->
ejabberd_router:unregister_route(OldHost),
unregister_iq_handlers(OldHost)
end, OldHosts -- NewHosts),
+ lists:foreach(
+ fun(Host) ->
+ lists:foreach(
+ fun({_, _, Pid}) when node(Pid) == node() ->
+ Pid ! config_reloaded;
+ (_) ->
+ ok
+ end, get_online_rooms(ServerHost, Host))
+ end, misc:intersection(NewHosts, OldHosts)),
{noreply, NewState};
handle_cast(Msg, State) ->
?WARNING_MSG("unexpected cast: ~p", [Msg]),
diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl
index 3ff24192..f1acf3cb 100644
--- a/src/mod_muc_room.erl
+++ b/src/mod_muc_room.erl
@@ -678,6 +678,19 @@ handle_info({iq_reply, timeout, IQ}, StateName, StateData) ->
Err = xmpp:err_recipient_unavailable(Txt, IQ#iq.lang),
ejabberd_router:route_error(IQ, Err),
{next_state, StateName, StateData};
+handle_info(config_reloaded, StateName, StateData) ->
+ Max = gen_mod:get_module_opt(StateData#state.server_host,
+ mod_muc, history_size),
+ History1 = StateData#state.history,
+ Q1 = History1#lqueue.queue,
+ Q2 = case p1_queue:len(Q1) of
+ Len when Len > Max ->
+ lqueue_cut(Q1, Len-Max);
+ _ ->
+ Q1
+ end,
+ History2 = History1#lqueue{queue = Q2, max = Max},
+ {next_state, StateName, StateData#state{history = History2}};
handle_info(_Info, StateName, StateData) ->
{next_state, StateName, StateData}.