diff options
author | ThibG <thib@sitedethib.com> | 2020-12-26 23:52:46 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-26 23:52:46 +0100 |
commit | f1f96ebf02e96d21d84c52825cbac623b66488f8 (patch) | |
tree | b0185cd71c95891a5aa04f859db0e213d66f32f3 /app/models | |
parent | 4580129c987371b656a8ab19feba09fb98f9fac1 (diff) |
Fix being able to import more than allowed number of follows (#15384)
* Fix being able to import more than allowed number of follows Without this commit, if someone tries importing a second list of accounts to follow before the first one has been processed, this will queue imports for the two whole lists, even if they exceed the account's allowed number of outgoing follows. This commit changes it so the individual queued imports aren't exempt from the follow limit check (they remain exempt from the rate-limiting check though). * Catch validation errors to not re-queue failed follows Co-authored-by: Claire <claire.github-309c@sitedethib.com>
Diffstat (limited to 'app/models')
-rw-r--r-- | app/models/concerns/account_interactions.rb | 8 | ||||
-rw-r--r-- | app/models/concerns/follow_limitable.rb | 17 | ||||
-rw-r--r-- | app/models/follow.rb | 2 | ||||
-rw-r--r-- | app/models/follow_request.rb | 2 |
4 files changed, 23 insertions, 6 deletions
diff --git a/app/models/concerns/account_interactions.rb b/app/models/concerns/account_interactions.rb index e2c4b8acf..974f57820 100644 --- a/app/models/concerns/account_interactions.rb +++ b/app/models/concerns/account_interactions.rb @@ -97,8 +97,8 @@ module AccountInteractions has_many :announcement_mutes, dependent: :destroy end - def follow!(other_account, reblogs: nil, notify: nil, uri: nil, rate_limit: false) - rel = active_relationships.create_with(show_reblogs: reblogs.nil? ? true : reblogs, notify: notify.nil? ? false : notify, uri: uri, rate_limit: rate_limit) + def follow!(other_account, reblogs: nil, notify: nil, uri: nil, rate_limit: false, bypass_limit: false) + rel = active_relationships.create_with(show_reblogs: reblogs.nil? ? true : reblogs, notify: notify.nil? ? false : notify, uri: uri, rate_limit: rate_limit, bypass_follow_limit: bypass_limit) .find_or_create_by!(target_account: other_account) rel.show_reblogs = reblogs unless reblogs.nil? @@ -111,8 +111,8 @@ module AccountInteractions rel end - def request_follow!(other_account, reblogs: nil, notify: nil, uri: nil, rate_limit: false) - rel = follow_requests.create_with(show_reblogs: reblogs.nil? ? true : reblogs, notify: notify.nil? ? false : notify, uri: uri, rate_limit: rate_limit) + def request_follow!(other_account, reblogs: nil, notify: nil, uri: nil, rate_limit: false, bypass_limit: false) + rel = follow_requests.create_with(show_reblogs: reblogs.nil? ? true : reblogs, notify: notify.nil? ? false : notify, uri: uri, rate_limit: rate_limit, bypass_follow_limit: bypass_limit) .find_or_create_by!(target_account: other_account) rel.show_reblogs = reblogs unless reblogs.nil? diff --git a/app/models/concerns/follow_limitable.rb b/app/models/concerns/follow_limitable.rb new file mode 100644 index 000000000..c64060d6e --- /dev/null +++ b/app/models/concerns/follow_limitable.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module FollowLimitable + extend ActiveSupport::Concern + + included do + validates_with FollowLimitValidator, on: :create, unless: :bypass_follow_limit? + end + + def bypass_follow_limit=(value) + @bypass_follow_limit = value + end + + def bypass_follow_limit? + @bypass_follow_limit + end +end diff --git a/app/models/follow.rb b/app/models/follow.rb index 69a1722b3..a5e3fe809 100644 --- a/app/models/follow.rb +++ b/app/models/follow.rb @@ -17,6 +17,7 @@ class Follow < ApplicationRecord include Paginable include RelationshipCacheable include RateLimitable + include FollowLimitable rate_limit by: :account, family: :follows @@ -26,7 +27,6 @@ class Follow < ApplicationRecord has_one :notification, as: :activity, dependent: :destroy validates :account_id, uniqueness: { scope: :target_account_id } - validates_with FollowLimitValidator, on: :create, if: :rate_limit? scope :recent, -> { reorder(id: :desc) } diff --git a/app/models/follow_request.rb b/app/models/follow_request.rb index 2d2a77b59..59fefcdf6 100644 --- a/app/models/follow_request.rb +++ b/app/models/follow_request.rb @@ -17,6 +17,7 @@ class FollowRequest < ApplicationRecord include Paginable include RelationshipCacheable include RateLimitable + include FollowLimitable rate_limit by: :account, family: :follows @@ -26,7 +27,6 @@ class FollowRequest < ApplicationRecord has_one :notification, as: :activity, dependent: :destroy validates :account_id, uniqueness: { scope: :target_account_id } - validates_with FollowLimitValidator, on: :create, if: :rate_limit? def authorize! account.follow!(target_account, reblogs: show_reblogs, notify: notify, uri: uri) |