From 30296f1bb0dbb54776fe8baa0590ec5fb566596f Mon Sep 17 00:00:00 2001 From: Thibaut Girka Date: Wed, 1 May 2019 11:26:58 +0200 Subject: [PATCH] Record account suspend/silence time and keep track of domain blocks --- app/models/account.rb | 16 ++++++++++------ .../activitypub/process_account_service.rb | 10 ++++++++-- app/services/block_domain_service.rb | 4 ++-- app/services/resolve_account_service.rb | 10 ++++++++-- app/services/suspend_account_service.rb | 2 ++ app/services/unblock_domain_service.rb | 7 ++++++- ...7_add_silenced_at_suspended_at_to_accounts.rb | 6 ++++++ db/schema.rb | 4 +++- 8 files changed, 45 insertions(+), 14 deletions(-) create mode 100644 db/migrate/20190511134027_add_silenced_at_suspended_at_to_accounts.rb diff --git a/app/models/account.rb b/app/models/account.rb index 51e01246e6..effac6c635 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -45,6 +45,8 @@ # actor_type :string # discoverable :boolean # also_known_as :string is an Array +# silenced_at :datetime +# suspended_at :datetime # class Account < ApplicationRecord @@ -165,25 +167,27 @@ class Account < ApplicationRecord ResolveAccountService.new.call(acct) end - def silence! - update!(silenced: true) + def silence!(date = nil) + date = Time.now.utc if date.nil? + update!(silenced: true, silenced_at: date) end def unsilence! - update!(silenced: false) + update!(silenced: false, silenced_at: nil) end - def suspend! + def suspend!(date = nil) + date = Time.now.utc if date.nil? transaction do user&.disable! if local? - update!(suspended: true) + update!(suspended: true, suspended_at: date) end end def unsuspend! transaction do user&.enable! if local? - update!(suspended: false) + update!(suspended: false, suspended_at: nil) end end diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb index 6d0609ca04..1e187a83b6 100644 --- a/app/services/activitypub/process_account_service.rb +++ b/app/services/activitypub/process_account_service.rb @@ -53,9 +53,15 @@ class ActivityPub::ProcessAccountService < BaseService @account.protocol = :activitypub @account.username = @username @account.domain = @domain - @account.suspended = true if auto_suspend? - @account.silenced = true if auto_silence? @account.private_key = nil + if auto_suspend? + @account.suspended = true + @account.suspended_at = domain_block.created_at + end + if auto_silence? + @account.silenced = true + @account.silenced_at = domain_block.created_at + end end def update_account diff --git a/app/services/block_domain_service.rb b/app/services/block_domain_service.rb index a1fe93665b..4b935d8cca 100644 --- a/app/services/block_domain_service.rb +++ b/app/services/block_domain_service.rb @@ -29,7 +29,7 @@ class BlockDomainService < BaseService end def silence_accounts! - blocked_domain_accounts.in_batches.update_all(silenced: true) + blocked_domain_accounts.where(silenced: false).in_batches.update_all(silenced: true, silenced_at: @domain_block.created_at) end def clear_media! @@ -45,7 +45,7 @@ class BlockDomainService < BaseService def suspend_accounts! blocked_domain_accounts.where(suspended: false).reorder(nil).find_each do |account| UnsubscribeService.new.call(account) if account.subscribed? - SuspendAccountService.new.call(account) + SuspendAccountService.new.call(account, suspended_at: @domain_block.created_at) end end diff --git a/app/services/resolve_account_service.rb b/app/services/resolve_account_service.rb index 4ff351c5f7..5719e0d159 100644 --- a/app/services/resolve_account_service.rb +++ b/app/services/resolve_account_service.rb @@ -119,9 +119,15 @@ class ResolveAccountService < BaseService Rails.logger.debug "Creating new remote account for #{@username}@#{@domain}" @account = Account.new(username: @username, domain: @domain) - @account.suspended = true if auto_suspend? - @account.silenced = true if auto_silence? @account.private_key = nil + if auto_suspend? + @account.suspended = true + @account.suspended_at = domain_block.created_at + end + if auto_silence? + @account.silenced = true + @account.silenced_at = domain_block.created_at + end end def update_account diff --git a/app/services/suspend_account_service.rb b/app/services/suspend_account_service.rb index 6c2ecad30f..07e3dc1748 100644 --- a/app/services/suspend_account_service.rb +++ b/app/services/suspend_account_service.rb @@ -89,7 +89,9 @@ class SuspendAccountService < BaseService return if @options[:destroy] @account.silenced = false + @account.silenced_at = nil @account.suspended = true + @account.suspended_at = @options[:suspended_at] || Time.now.utc @account.locked = false @account.display_name = '' @account.note = '' diff --git a/app/services/unblock_domain_service.rb b/app/services/unblock_domain_service.rb index 946b6d465c..fdd0278272 100644 --- a/app/services/unblock_domain_service.rb +++ b/app/services/unblock_domain_service.rb @@ -14,7 +14,12 @@ class UnblockDomainService < BaseService end def blocked_accounts - Account.where(domain: domain_block.domain) + scope = Account.where(domain: domain_block.domain) + if domain_block.silence? + scope.where(silenced_at: @domain_block.created_at) + else + scope.where(suspended_at: @domain_block.created_at) + end end def update_options diff --git a/db/migrate/20190511134027_add_silenced_at_suspended_at_to_accounts.rb b/db/migrate/20190511134027_add_silenced_at_suspended_at_to_accounts.rb new file mode 100644 index 0000000000..cd4aaa916a --- /dev/null +++ b/db/migrate/20190511134027_add_silenced_at_suspended_at_to_accounts.rb @@ -0,0 +1,6 @@ +class AddSilencedAtSuspendedAtToAccounts < ActiveRecord::Migration[5.2] + def change + add_column :accounts, :silenced_at, :datetime + add_column :accounts, :suspended_at, :datetime + end +end diff --git a/db/schema.rb b/db/schema.rb index 4dcbea4e75..9c074afcfd 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2019_05_09_164208) do +ActiveRecord::Schema.define(version: 2019_05_11_134027) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -148,6 +148,8 @@ ActiveRecord::Schema.define(version: 2019_05_09_164208) do t.string "actor_type" t.boolean "discoverable" t.string "also_known_as", array: true + t.datetime "silenced_at" + t.datetime "suspended_at" t.index "(((setweight(to_tsvector('simple'::regconfig, (display_name)::text), 'A'::\"char\") || setweight(to_tsvector('simple'::regconfig, (username)::text), 'B'::\"char\")) || setweight(to_tsvector('simple'::regconfig, (COALESCE(domain, ''::character varying))::text), 'C'::\"char\")))", name: "search_index", using: :gin t.index "lower((username)::text), lower((domain)::text)", name: "index_accounts_on_username_and_domain_lower", unique: true t.index ["moved_to_account_id"], name: "index_accounts_on_moved_to_account_id"