diff options
Diffstat (limited to 'src/ejabberd_auth_anonymous.erl')
-rw-r--r-- | src/ejabberd_auth_anonymous.erl | 38 |
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. |