aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_auth_anonymous.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/ejabberd_auth_anonymous.erl')
-rw-r--r--src/ejabberd_auth_anonymous.erl38
1 files changed, 31 insertions, 7 deletions
diff --git a/src/ejabberd_auth_anonymous.erl b/src/ejabberd_auth_anonymous.erl
index 57a33746d..b314e51af 100644
--- a/src/ejabberd_auth_anonymous.erl
+++ b/src/ejabberd_auth_anonymous.erl
@@ -34,6 +34,7 @@
anonymous_user_exist/2,
allow_multiple_connections/1,
register_connection/3,
+ unregister_migrated_connection/3,
unregister_connection/3
]).
@@ -62,12 +63,16 @@
%% Register to login / logout events
start(Host) ->
%% TODO: Check cluster mode
+ update_tables(),
mnesia:create_table(anonymous, [{ram_copies, [node()]},
- {type, bag},
+ {type, bag}, {local_content, true},
{attributes, record_info(fields, anonymous)}]),
+ mnesia:add_table_copy(anonymous, node(), ram_copies),
%% The hooks are needed to add / remove users from the anonymous tables
ejabberd_hooks:add(sm_register_connection_hook, Host,
?MODULE, register_connection, 100),
+ ejabberd_hooks:add(sm_remove_migrated_connection_hook, Host,
+ ?MODULE, unregister_migrated_connection, 100),
ejabberd_hooks:add(sm_remove_connection_hook, Host,
?MODULE, unregister_connection, 100),
ok.
@@ -124,11 +129,18 @@ anonymous_user_exist(User, Server) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
US = {LUser, LServer},
- case catch mnesia:dirty_read({anonymous, US}) of
- [] ->
- false;
+ Ss = case ejabberd_cluster:get_node(US) of
+ Node when Node == node() ->
+ catch mnesia:dirty_read({anonymous, US});
+ Node ->
+ catch rpc:call(Node, mnesia, dirty_read,
+ [{anonymous, US}], 5000)
+ end,
+ case Ss of
[_H|_T] ->
- true
+ true;
+ _ ->
+ false
end.
%% Remove connection from Mnesia tables
@@ -137,7 +149,7 @@ remove_connection(SID, LUser, LServer) ->
F = fun() ->
mnesia:delete_object({anonymous, US, SID})
end,
- mnesia:transaction(F).
+ mnesia:async_dirty(F).
%% Register connection
register_connection(SID, #jid{luser = LUser, lserver = LServer}, Info) ->
@@ -146,7 +158,7 @@ register_connection(SID, #jid{luser = LUser, lserver = LServer}, Info) ->
true ->
ejabberd_hooks:run(register_user, LServer, [LUser, LServer]),
US = {LUser, LServer},
- mnesia:sync_dirty(
+ mnesia:async_dirty(
fun() -> mnesia:write(#anonymous{us = US, sid=SID})
end);
false ->
@@ -159,6 +171,10 @@ unregister_connection(SID, #jid{luser = LUser, lserver = LServer}, _) ->
LUser, LServer),
remove_connection(SID, LUser, LServer).
+%% Remove an anonymous user from the anonymous users table
+unregister_migrated_connection(SID, #jid{luser = LUser, lserver = LServer}, _) ->
+ remove_connection(SID, LUser, LServer).
+
%% Launch the hook to purge user data only for anonymous users
purge_hook(false, _LUser, _LServer) ->
ok;
@@ -249,5 +265,13 @@ remove_user(_User, _Server, _Password) ->
plain_password_required() ->
false.
+update_tables() ->
+ case catch mnesia:table_info(anonymous, local_content) of
+ false ->
+ mnesia:delete_table(anonymous);
+ _ ->
+ ok
+ end.
+
store_type() ->
plain.