mirror of
https://github.com/processone/ejabberd.git
synced 2024-11-20 16:15:59 +01:00
Handle user removal in mod_muc
This commit is contained in:
parent
a94209a0e0
commit
8b7da70b57
@ -330,6 +330,7 @@ CREATE TABLE muc_room_subscribers (
|
|||||||
);
|
);
|
||||||
|
|
||||||
CREATE INDEX i_muc_room_subscribers_host_jid ON muc_room_subscribers(host, jid);
|
CREATE INDEX i_muc_room_subscribers_host_jid ON muc_room_subscribers(host, jid);
|
||||||
|
CREATE INDEX i_muc_room_subscribers_jid ON muc_room_subscribers(jid);
|
||||||
CREATE UNIQUE INDEX i_muc_room_subscribers_host_room_jid ON muc_room_subscribers(host, room, jid);
|
CREATE UNIQUE INDEX i_muc_room_subscribers_host_room_jid ON muc_room_subscribers(host, room, jid);
|
||||||
|
|
||||||
CREATE TABLE motd (
|
CREATE TABLE motd (
|
||||||
|
@ -302,6 +302,7 @@ CREATE TABLE muc_room_subscribers (
|
|||||||
);
|
);
|
||||||
|
|
||||||
CREATE INDEX i_muc_room_subscribers_host_jid ON muc_room_subscribers(host, jid);
|
CREATE INDEX i_muc_room_subscribers_host_jid ON muc_room_subscribers(host, jid);
|
||||||
|
CREATE INDEX i_muc_room_subscribers_jid ON muc_room_subscribers(jid);
|
||||||
CREATE UNIQUE INDEX i_muc_room_subscribers_host_room_jid ON muc_room_subscribers(host, room, jid);
|
CREATE UNIQUE INDEX i_muc_room_subscribers_host_room_jid ON muc_room_subscribers(host, room, jid);
|
||||||
|
|
||||||
CREATE TABLE motd (
|
CREATE TABLE motd (
|
||||||
|
@ -150,6 +150,7 @@ CREATE TABLE [dbo].[muc_room_subscribers] (
|
|||||||
|
|
||||||
CREATE UNIQUE CLUSTERED INDEX [muc_room_subscribers_host_room_jid] ON [muc_room_subscribers] (host, room, jid);
|
CREATE UNIQUE CLUSTERED INDEX [muc_room_subscribers_host_room_jid] ON [muc_room_subscribers] (host, room, jid);
|
||||||
CREATE INDEX [muc_room_subscribers_host_jid] ON [muc_room_subscribers] (host, jid);
|
CREATE INDEX [muc_room_subscribers_host_jid] ON [muc_room_subscribers] (host, jid);
|
||||||
|
CREATE INDEX [muc_room_subscribers_jid] ON [muc_room_subscribers] (jid);
|
||||||
|
|
||||||
CREATE TABLE [dbo].[privacy_default_list] (
|
CREATE TABLE [dbo].[privacy_default_list] (
|
||||||
[username] [varchar] (250) NOT NULL,
|
[username] [varchar] (250) NOT NULL,
|
||||||
|
@ -347,6 +347,7 @@ CREATE TABLE muc_room_subscribers (
|
|||||||
) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
|
||||||
CREATE INDEX i_muc_room_subscribers_host_jid USING BTREE ON muc_room_subscribers(host, jid);
|
CREATE INDEX i_muc_room_subscribers_host_jid USING BTREE ON muc_room_subscribers(host, jid);
|
||||||
|
CREATE INDEX i_muc_room_subscribers_jid USING BTREE ON muc_room_subscribers(jid);
|
||||||
|
|
||||||
CREATE TABLE motd (
|
CREATE TABLE motd (
|
||||||
username varchar(191) NOT NULL,
|
username varchar(191) NOT NULL,
|
||||||
|
@ -319,6 +319,7 @@ CREATE TABLE muc_room_subscribers (
|
|||||||
) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
) ENGINE=InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
|
||||||
CREATE INDEX i_muc_room_subscribers_host_jid USING BTREE ON muc_room_subscribers(host, jid);
|
CREATE INDEX i_muc_room_subscribers_host_jid USING BTREE ON muc_room_subscribers(host, jid);
|
||||||
|
CREATE INDEX i_muc_room_subscribers_jid USING BTREE ON muc_room_subscribers(jid);
|
||||||
|
|
||||||
CREATE TABLE motd (
|
CREATE TABLE motd (
|
||||||
username varchar(191) PRIMARY KEY,
|
username varchar(191) PRIMARY KEY,
|
||||||
|
@ -495,6 +495,7 @@ CREATE TABLE muc_room_subscribers (
|
|||||||
);
|
);
|
||||||
|
|
||||||
CREATE INDEX i_muc_room_subscribers_host_jid ON muc_room_subscribers USING btree (host, jid);
|
CREATE INDEX i_muc_room_subscribers_host_jid ON muc_room_subscribers USING btree (host, jid);
|
||||||
|
CREATE INDEX i_muc_room_subscribers_jid ON muc_room_subscribers USING btree (jid);
|
||||||
CREATE UNIQUE INDEX i_muc_room_subscribers_host_room_jid ON muc_room_subscribers USING btree (host, room, jid);
|
CREATE UNIQUE INDEX i_muc_room_subscribers_host_room_jid ON muc_room_subscribers USING btree (host, room, jid);
|
||||||
|
|
||||||
CREATE TABLE motd (
|
CREATE TABLE motd (
|
||||||
|
@ -320,6 +320,7 @@ CREATE TABLE muc_room_subscribers (
|
|||||||
);
|
);
|
||||||
|
|
||||||
CREATE INDEX i_muc_room_subscribers_host_jid ON muc_room_subscribers USING btree (host, jid);
|
CREATE INDEX i_muc_room_subscribers_host_jid ON muc_room_subscribers USING btree (host, jid);
|
||||||
|
CREATE INDEX i_muc_room_subscribers_jid ON muc_room_subscribers USING btree (jid);
|
||||||
CREATE UNIQUE INDEX i_muc_room_subscribers_host_room_jid ON muc_room_subscribers USING btree (host, room, jid);
|
CREATE UNIQUE INDEX i_muc_room_subscribers_host_room_jid ON muc_room_subscribers USING btree (host, room, jid);
|
||||||
|
|
||||||
CREATE TABLE motd (
|
CREATE TABLE motd (
|
||||||
|
@ -69,6 +69,7 @@
|
|||||||
get_online_rooms_by_user/3,
|
get_online_rooms_by_user/3,
|
||||||
can_use_nick/4,
|
can_use_nick/4,
|
||||||
get_subscribed_rooms/2,
|
get_subscribed_rooms/2,
|
||||||
|
remove_user/2,
|
||||||
procname/2,
|
procname/2,
|
||||||
route/1, unhibernate_room/3]).
|
route/1, unhibernate_room/3]).
|
||||||
|
|
||||||
@ -122,6 +123,8 @@
|
|||||||
start(Host, Opts) ->
|
start(Host, Opts) ->
|
||||||
case mod_muc_sup:start(Host) of
|
case mod_muc_sup:start(Host) of
|
||||||
{ok, _} ->
|
{ok, _} ->
|
||||||
|
ejabberd_hooks:add(remove_user, Host, ?MODULE,
|
||||||
|
remove_user, 50),
|
||||||
MyHosts = gen_mod:get_opt_hosts(Opts),
|
MyHosts = gen_mod:get_opt_hosts(Opts),
|
||||||
Mod = gen_mod:db_mod(Opts, ?MODULE),
|
Mod = gen_mod:db_mod(Opts, ?MODULE),
|
||||||
RMod = gen_mod:ram_db_mod(Opts, ?MODULE),
|
RMod = gen_mod:ram_db_mod(Opts, ?MODULE),
|
||||||
@ -133,6 +136,8 @@ start(Host, Opts) ->
|
|||||||
end.
|
end.
|
||||||
|
|
||||||
stop(Host) ->
|
stop(Host) ->
|
||||||
|
ejabberd_hooks:delete(remove_user, Host, ?MODULE,
|
||||||
|
remove_user, 50),
|
||||||
Proc = mod_muc_sup:procname(Host),
|
Proc = mod_muc_sup:procname(Host),
|
||||||
supervisor:terminate_child(ejabberd_gen_mod_sup, Proc),
|
supervisor:terminate_child(ejabberd_gen_mod_sup, Proc),
|
||||||
supervisor:delete_child(ejabberd_gen_mod_sup, Proc).
|
supervisor:delete_child(ejabberd_gen_mod_sup, Proc).
|
||||||
@ -1122,6 +1127,32 @@ count_online_rooms(ServerHost, Host) ->
|
|||||||
RMod = gen_mod:ram_db_mod(ServerHost, ?MODULE),
|
RMod = gen_mod:ram_db_mod(ServerHost, ?MODULE),
|
||||||
RMod:count_online_rooms(ServerHost, Host).
|
RMod:count_online_rooms(ServerHost, Host).
|
||||||
|
|
||||||
|
-spec remove_user(binary(), binary()) -> ok.
|
||||||
|
remove_user(User, Server) ->
|
||||||
|
LUser = jid:nodeprep(User),
|
||||||
|
LServer = jid:nameprep(Server),
|
||||||
|
Mod = gen_mod:db_mod(LServer, ?MODULE),
|
||||||
|
case erlang:function_exported(Mod, remove_user, 2) of
|
||||||
|
true ->
|
||||||
|
Mod:remove_user(LUser, LServer);
|
||||||
|
false ->
|
||||||
|
ok
|
||||||
|
end,
|
||||||
|
JID = jid:make(User, Server),
|
||||||
|
lists:foreach(
|
||||||
|
fun(Host) ->
|
||||||
|
lists:foreach(
|
||||||
|
fun({_, _, Pid}) ->
|
||||||
|
mod_muc_room:change_item(
|
||||||
|
Pid, JID, affiliation, none, <<"User removed">>),
|
||||||
|
mod_muc_room:change_item(
|
||||||
|
Pid, JID, role, none, <<"User removed">>)
|
||||||
|
end,
|
||||||
|
get_online_rooms(LServer, Host))
|
||||||
|
end,
|
||||||
|
gen_mod:get_module_opt_hosts(LServer, mod_muc)),
|
||||||
|
ok.
|
||||||
|
|
||||||
opts_to_binary(Opts) ->
|
opts_to_binary(Opts) ->
|
||||||
lists:map(
|
lists:map(
|
||||||
fun({title, Title}) ->
|
fun({title, Title}) ->
|
||||||
@ -1225,6 +1256,8 @@ mod_opt_type(user_message_shaper) ->
|
|||||||
econf:atom();
|
econf:atom();
|
||||||
mod_opt_type(user_presence_shaper) ->
|
mod_opt_type(user_presence_shaper) ->
|
||||||
econf:atom();
|
econf:atom();
|
||||||
|
mod_opt_type(cleanup_affiliations_on_start) ->
|
||||||
|
econf:bool();
|
||||||
mod_opt_type(default_room_options) ->
|
mod_opt_type(default_room_options) ->
|
||||||
econf:options(
|
econf:options(
|
||||||
#{allow_change_subj => econf:bool(),
|
#{allow_change_subj => econf:bool(),
|
||||||
@ -1302,6 +1335,7 @@ mod_options(Host) ->
|
|||||||
{preload_rooms, true},
|
{preload_rooms, true},
|
||||||
{hibernation_timeout, infinity},
|
{hibernation_timeout, infinity},
|
||||||
{vcard, undefined},
|
{vcard, undefined},
|
||||||
|
{cleanup_affiliations_on_start, false},
|
||||||
{default_room_options,
|
{default_room_options,
|
||||||
[{allow_change_subj,true},
|
[{allow_change_subj,true},
|
||||||
{allow_private_messages,true},
|
{allow_private_messages,true},
|
||||||
@ -1580,6 +1614,11 @@ mod_doc() ->
|
|||||||
" -",
|
" -",
|
||||||
" work: true",
|
" work: true",
|
||||||
" street: Elm Street"]}]}},
|
" street: Elm Street"]}]}},
|
||||||
|
{cleanup_affiliations_on_start,
|
||||||
|
#{value => "true | false",
|
||||||
|
desc =>
|
||||||
|
?T("Remove affiliations for non-existing local users on startup. "
|
||||||
|
"The default value is 'false'.")}},
|
||||||
{default_room_options,
|
{default_room_options,
|
||||||
#{value => ?T("Options"),
|
#{value => ?T("Options"),
|
||||||
desc =>
|
desc =>
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
-export([access_mam/1]).
|
-export([access_mam/1]).
|
||||||
-export([access_persistent/1]).
|
-export([access_persistent/1]).
|
||||||
-export([access_register/1]).
|
-export([access_register/1]).
|
||||||
|
-export([cleanup_affiliations_on_start/1]).
|
||||||
-export([db_type/1]).
|
-export([db_type/1]).
|
||||||
-export([default_room_options/1]).
|
-export([default_room_options/1]).
|
||||||
-export([hibernation_timeout/1]).
|
-export([hibernation_timeout/1]).
|
||||||
@ -73,6 +74,12 @@ access_register(Opts) when is_map(Opts) ->
|
|||||||
access_register(Host) ->
|
access_register(Host) ->
|
||||||
gen_mod:get_module_opt(Host, mod_muc, access_register).
|
gen_mod:get_module_opt(Host, mod_muc, access_register).
|
||||||
|
|
||||||
|
-spec cleanup_affiliations_on_start(gen_mod:opts() | global | binary()) -> boolean().
|
||||||
|
cleanup_affiliations_on_start(Opts) when is_map(Opts) ->
|
||||||
|
gen_mod:get_opt(cleanup_affiliations_on_start, Opts);
|
||||||
|
cleanup_affiliations_on_start(Host) ->
|
||||||
|
gen_mod:get_module_opt(Host, mod_muc, cleanup_affiliations_on_start).
|
||||||
|
|
||||||
-spec db_type(gen_mod:opts() | global | binary()) -> atom().
|
-spec db_type(gen_mod:opts() | global | binary()) -> atom().
|
||||||
db_type(Opts) when is_map(Opts) ->
|
db_type(Opts) when is_map(Opts) ->
|
||||||
gen_mod:get_opt(db_type, Opts);
|
gen_mod:get_opt(db_type, Opts);
|
||||||
|
@ -306,7 +306,8 @@ init([Host, ServerHost, Access, Room, HistorySize, RoomShaper, Opts, QueueType])
|
|||||||
room_shaper = Shaper}),
|
room_shaper = Shaper}),
|
||||||
add_to_log(room_existence, started, State),
|
add_to_log(room_existence, started, State),
|
||||||
ejabberd_hooks:run(start_room, ServerHost, [ServerHost, Room, Host]),
|
ejabberd_hooks:run(start_room, ServerHost, [ServerHost, Room, Host]),
|
||||||
{ok, normal_state, reset_hibernate_timer(State)}.
|
State1 = cleanup_affiliations(State),
|
||||||
|
{ok, normal_state, reset_hibernate_timer(State1)}.
|
||||||
|
|
||||||
normal_state({route, <<"">>,
|
normal_state({route, <<"">>,
|
||||||
#message{from = From, type = Type, lang = Lang} = Packet},
|
#message{from = From, type = Type, lang = Lang} = Packet},
|
||||||
@ -5337,6 +5338,23 @@ muc_subscribers_put(Subscriber, MUCSubscribers) ->
|
|||||||
subscriber_nodes = NewSubNodes}.
|
subscriber_nodes = NewSubNodes}.
|
||||||
|
|
||||||
|
|
||||||
|
cleanup_affiliations(State) ->
|
||||||
|
case mod_muc_opt:cleanup_affiliations_on_start(State#state.server_host) of
|
||||||
|
true ->
|
||||||
|
Affiliations =
|
||||||
|
maps:filter(
|
||||||
|
fun({LUser, LServer, _}, _) ->
|
||||||
|
case ejabberd_router:is_my_host(LServer) of
|
||||||
|
true ->
|
||||||
|
ejabberd_auth:user_exists(LUser, LServer);
|
||||||
|
false ->
|
||||||
|
true
|
||||||
|
end
|
||||||
|
end, State#state.affiliations),
|
||||||
|
State#state{affiliations = Affiliations};
|
||||||
|
false ->
|
||||||
|
State
|
||||||
|
end.
|
||||||
|
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
%% Detect messange stanzas that don't have meaningful content
|
%% Detect messange stanzas that don't have meaningful content
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
register_online_user/4, unregister_online_user/4,
|
register_online_user/4, unregister_online_user/4,
|
||||||
count_online_rooms_by_user/3, get_online_rooms_by_user/3,
|
count_online_rooms_by_user/3, get_online_rooms_by_user/3,
|
||||||
get_subscribed_rooms/3, get_rooms_without_subscribers/2,
|
get_subscribed_rooms/3, get_rooms_without_subscribers/2,
|
||||||
find_online_room_by_pid/2]).
|
find_online_room_by_pid/2, remove_user/2]).
|
||||||
-export([set_affiliation/6, set_affiliations/4, get_affiliation/5,
|
-export([set_affiliation/6, set_affiliations/4, get_affiliation/5,
|
||||||
get_affiliations/3, search_affiliation/4]).
|
get_affiliations/3, search_affiliation/4]).
|
||||||
|
|
||||||
@ -465,6 +465,13 @@ get_subscribed_rooms(LServer, Host, Jid) ->
|
|||||||
{error, db_failure}
|
{error, db_failure}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
remove_user(LUser, LServer) ->
|
||||||
|
SJID = jid:encode(jid:make(LUser, LServer)),
|
||||||
|
ejabberd_sql:sql_query(
|
||||||
|
LServer,
|
||||||
|
?SQL("delete from muc_room_subscribers where jid=%(SJID)s")),
|
||||||
|
ok.
|
||||||
|
|
||||||
%%%===================================================================
|
%%%===================================================================
|
||||||
%%% Internal functions
|
%%% Internal functions
|
||||||
%%%===================================================================
|
%%%===================================================================
|
||||||
|
Loading…
Reference in New Issue
Block a user