mirror of
https://github.com/processone/ejabberd.git
synced 2024-12-26 17:38:45 +01:00
Protect users from delete_old_users command using a fixed access rule (#1462)
This commit is contained in:
parent
4294ba6b52
commit
6314a96b05
@ -181,6 +181,11 @@ get_commands_spec() ->
|
||||
result_desc = "Number of users active on given server in last n days"},
|
||||
#ejabberd_commands{name = delete_old_users, tags = [accounts, purge],
|
||||
desc = "Delete users that didn't log in last days, or that never logged",
|
||||
longdesc = "To protect admin accounts, configure this for example:\n"
|
||||
"access_rules:\n"
|
||||
" delete_old_users:\n"
|
||||
" - deny: admin\n"
|
||||
" - allow: all\n",
|
||||
module = ?MODULE, function = delete_old_users,
|
||||
args = [{days, integer}],
|
||||
args_example = [30],
|
||||
@ -190,6 +195,11 @@ get_commands_spec() ->
|
||||
result_desc = "Result tuple"},
|
||||
#ejabberd_commands{name = delete_old_users_vhost, tags = [accounts, purge],
|
||||
desc = "Delete users that didn't log in last days in vhost, or that never logged",
|
||||
longdesc = "To protect admin accounts, configure this for example:\n"
|
||||
"access_rules:\n"
|
||||
" delete_old_users:\n"
|
||||
" - deny: admin\n"
|
||||
" - allow: all\n",
|
||||
module = ?MODULE, function = delete_old_users_vhost,
|
||||
args = [{host, binary}, {days, integer}],
|
||||
args_example = [<<"myserver.com">>, 30],
|
||||
@ -810,53 +820,35 @@ delete_old_users_vhost(Host, Days) ->
|
||||
{ok, io_lib:format("Deleted ~p users: ~p", [N, UR])}.
|
||||
|
||||
delete_old_users(Days, Users) ->
|
||||
%% Convert older time
|
||||
SecOlder = Days*24*60*60,
|
||||
|
||||
%% Get current time
|
||||
TimeStamp_now = p1_time_compat:system_time(seconds),
|
||||
|
||||
%% For a user, remove if required and answer true
|
||||
TimeStamp_oldest = TimeStamp_now - SecOlder,
|
||||
F = fun({LUser, LServer}) ->
|
||||
%% Check if the user is logged
|
||||
case ejabberd_sm:get_user_resources(LUser, LServer) of
|
||||
%% If it isnt
|
||||
[] ->
|
||||
%% Look for his last_activity
|
||||
case mod_last:get_last_info(LUser, LServer) of
|
||||
%% If it is
|
||||
%% existent:
|
||||
{ok, TimeStamp, _Status} ->
|
||||
%% get his age
|
||||
Sec = TimeStamp_now - TimeStamp,
|
||||
%% If he is
|
||||
if
|
||||
%% younger than SecOlder:
|
||||
Sec < SecOlder ->
|
||||
%% do nothing
|
||||
false;
|
||||
%% older:
|
||||
true ->
|
||||
%% remove the user
|
||||
ejabberd_auth:remove_user(LUser, LServer),
|
||||
true
|
||||
end;
|
||||
%% nonexistent:
|
||||
not_found ->
|
||||
%% remove the user
|
||||
ejabberd_auth:remove_user(LUser, LServer),
|
||||
true
|
||||
end;
|
||||
%% Else
|
||||
_ ->
|
||||
%% do nothing
|
||||
false
|
||||
end
|
||||
case catch delete_or_not(LUser, LServer, TimeStamp_oldest) of
|
||||
true ->
|
||||
ejabberd_auth:remove_user(LUser, LServer),
|
||||
true;
|
||||
_ ->
|
||||
false
|
||||
end
|
||||
end,
|
||||
%% Apply the function to every user in the list
|
||||
Users_removed = lists:filter(F, Users),
|
||||
{removed, length(Users_removed), Users_removed}.
|
||||
|
||||
delete_or_not(LUser, LServer, TimeStamp_oldest) ->
|
||||
allow = acl:match_rule(LServer, delete_old_users, jid:make(LUser, LServer)),
|
||||
[] = ejabberd_sm:get_user_resources(LUser, LServer),
|
||||
case mod_last:get_last_info(LUser, LServer) of
|
||||
{ok, TimeStamp, _Status} ->
|
||||
if TimeStamp_oldest < TimeStamp ->
|
||||
false;
|
||||
true ->
|
||||
true
|
||||
end;
|
||||
not_found ->
|
||||
true
|
||||
end.
|
||||
|
||||
%%
|
||||
%% Ban account
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user