Add a spam check (#11217)
* Add a spam check * Use Nilsimsa to generate locality-sensitive hashes and compare using Levenshtein distance * Add more tests * Add exemption when the message is a reply to something that mentions the sender * Use Nilsimsa Compare Value instead of Levenshtein distance * Use MD5 for messages shorter than 10 characters * Add message to automated report, do not add non-public statuses to automated report, add trust level to accounts and make unsilencing raise the trust level to prevent repeated spam checks on that account * Expire spam check data after 3 months * Add support for local statuses, reduce expiration to 1 week, always create a report * Add content warnings to the spam check and exempt empty statuses * Change Nilsimsa threshold to 95 and make sure removed statuses are removed from the spam check * Add all matched statuses into automatic report
This commit is contained in:
parent
402302776c
commit
6ff67be0f6
10 changed files with 377 additions and 5 deletions
|
@ -45,6 +45,7 @@
|
|||
# also_known_as :string is an Array
|
||||
# silenced_at :datetime
|
||||
# suspended_at :datetime
|
||||
# trust_level :integer
|
||||
#
|
||||
|
||||
class Account < ApplicationRecord
|
||||
|
@ -62,6 +63,11 @@ class Account < ApplicationRecord
|
|||
include AccountCounters
|
||||
include DomainNormalizable
|
||||
|
||||
TRUST_LEVELS = {
|
||||
untrusted: 0,
|
||||
trusted: 1,
|
||||
}.freeze
|
||||
|
||||
enum protocol: [:ostatus, :activitypub]
|
||||
|
||||
validates :username, presence: true
|
||||
|
@ -163,6 +169,10 @@ class Account < ApplicationRecord
|
|||
last_webfingered_at.nil? || last_webfingered_at <= 1.day.ago
|
||||
end
|
||||
|
||||
def trust_level
|
||||
self[:trust_level] || 0
|
||||
end
|
||||
|
||||
def refresh!
|
||||
ResolveAccountService.new.call(acct) unless local?
|
||||
end
|
||||
|
@ -171,21 +181,19 @@ class Account < ApplicationRecord
|
|||
silenced_at.present?
|
||||
end
|
||||
|
||||
def silence!(date = nil)
|
||||
date ||= Time.now.utc
|
||||
def silence!(date = Time.now.utc)
|
||||
update!(silenced_at: date)
|
||||
end
|
||||
|
||||
def unsilence!
|
||||
update!(silenced_at: nil)
|
||||
update!(silenced_at: nil, trust_level: trust_level == TRUST_LEVELS[:untrusted] ? TRUST_LEVELS[:trusted] : trust_level)
|
||||
end
|
||||
|
||||
def suspended?
|
||||
suspended_at.present?
|
||||
end
|
||||
|
||||
def suspend!(date = nil)
|
||||
date ||= Time.now.utc
|
||||
def suspend!(date = Time.now.utc)
|
||||
transaction do
|
||||
user&.disable! if local?
|
||||
update!(suspended_at: date)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue