diff options
author | Jonne Haß <me@jhass.eu> | 2014-10-17 03:00:51 +0400 |
---|---|---|
committer | Jonne Haß <me@jhass.eu> | 2014-10-17 03:00:51 +0400 |
commit | f361a0f8853d4ba030bd507fe3218a77aa6ed2da (patch) | |
tree | 1ba050f984d6bdc809e8081db0dfc8bd8306e032 /app | |
parent | c460218a4b16d9e12aa3d30288d0db603e9a9182 (diff) | |
parent | 69c35669585896249db1eb3e3487a30ae09cff46 (diff) |
Merge pull request #5288 from jaywink/remove-old-users
Maintenance feature to remove old users, scheduled in settings
Diffstat (limited to 'app')
-rw-r--r-- | app/mailers/maintenance.rb | 15 | ||||
-rw-r--r-- | app/models/user.rb | 18 | ||||
-rw-r--r-- | app/views/maintenance/account_removal_warning.markerb | 2 | ||||
-rw-r--r-- | app/workers/queue_users_for_removal.rb | 41 | ||||
-rw-r--r-- | app/workers/remove_old_user.rb | 27 |
5 files changed, 102 insertions, 1 deletions
diff --git a/app/mailers/maintenance.rb b/app/mailers/maintenance.rb new file mode 100644 index 000000000..d44b28f51 --- /dev/null +++ b/app/mailers/maintenance.rb @@ -0,0 +1,15 @@ +class Maintenance < ActionMailer::Base + default :from => AppConfig.mail.sender_address + + def account_removal_warning(user) + @user = user + @login_url = new_user_session_path + @pod_url = AppConfig.environment.url + @after_days = AppConfig.settings.maintenance.remove_old_users.after_days.to_s + @remove_after = @user.remove_after + mail(:to => @user.email, :subject => I18n.t('notifier.remove_old_user.subject')) do |format| + format.text + format.html + end + end +end diff --git a/app/models/user.rb b/app/models/user.rb index 5f7a5fd22..35fe032f9 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -481,12 +481,28 @@ class User < ActiveRecord::Base end end + def flag_for_removal(remove_after) + # flag inactive user for future removal + if AppConfig.settings.maintenance.remove_old_users.enable? + self.remove_after = remove_after + self.save + end + end + + def after_database_authentication + # remove any possible remove_after timestamp flag set by maintenance.remove_old_users + unless self.remove_after.nil? + self.remove_after = nil + self.save + end + end + private def clearable_fields self.attributes.keys - ["id", "username", "encrypted_password", "created_at", "updated_at", "locked_at", "serialized_private_key", "getting_started", "disable_mail", "show_community_spotlight_in_stream", - "email"] + "email", "remove_after"] end end diff --git a/app/views/maintenance/account_removal_warning.markerb b/app/views/maintenance/account_removal_warning.markerb new file mode 100644 index 000000000..7303bafae --- /dev/null +++ b/app/views/maintenance/account_removal_warning.markerb @@ -0,0 +1,2 @@ +<%= t('notifier.remove_old_user.body', pod_url: @pod_url, login_url: @login_url, after_days: @after_days, remove_after: @remove_after) %> + diff --git a/app/workers/queue_users_for_removal.rb b/app/workers/queue_users_for_removal.rb new file mode 100644 index 000000000..63efa3365 --- /dev/null +++ b/app/workers/queue_users_for_removal.rb @@ -0,0 +1,41 @@ +# Copyright (c) 2010-2011, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3 or later. See +# the COPYRIGHT file. + +module Workers + class QueueUsersForRemoval < Base + include Sidetiq::Schedulable + + sidekiq_options queue: :maintenance + + recurrence { daily } + + def perform + # Queue users for removal due to inactivity + if AppConfig.settings.maintenance.remove_old_users.enable? + users = User.where("last_seen < ? and locked_at is null and remove_after is null", + Time.now - (AppConfig.settings.maintenance.remove_old_users.after_days.to_i).days) + .order(:last_seen) + .limit(AppConfig.settings.maintenance.remove_old_users.limit_removals_to_per_day) + + # deliver to be closed emails to account holders + # and queue accounts for closing to sidekiq + # for those who have not signed in, skip warning and queue removal + # in +1 days + users.find_each do |user| + if user.sign_in_count > 0 + remove_at = Time.now + AppConfig.settings.maintenance.remove_old_users.warn_days.to_i.days + else + remove_at = Time.now + end + user.flag_for_removal(remove_at) + if user.sign_in_count > 0 + # send a warning + Maintenance.account_removal_warning(user).deliver + end + Workers::RemoveOldUser.perform_in(remove_at+1.day, user.id) + end + end + end + end +end
\ No newline at end of file diff --git a/app/workers/remove_old_user.rb b/app/workers/remove_old_user.rb new file mode 100644 index 000000000..d8619b4bf --- /dev/null +++ b/app/workers/remove_old_user.rb @@ -0,0 +1,27 @@ +# Copyright (c) 2010-2011, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3 or later. See +# the COPYRIGHT file. + +module Workers + class RemoveOldUser < Base + sidekiq_options queue: :maintenance + + def safe_remove_after + # extra safety time to compare in addition to remove_after + Time.now- + (AppConfig.settings.maintenance.remove_old_users.after_days.to_i).days- + (AppConfig.settings.maintenance.remove_old_users.warn_days.to_i).days + end + + def perform(user_id) + # if user has been flagged as to be removed (see settings.maintenance.remove_old_users) + # and hasn't logged in since that flag has been set, we remove the user + if AppConfig.settings.maintenance.remove_old_users.enable? + user = User.find(user_id) + if user.remove_after < Time.now and user.last_seen < self.safe_remove_after + user.close_account! + end + end + end + end +end
\ No newline at end of file |