Crowdin / Upload translations / upload-translations (push) Skipped
Historical data migration test / test (14-alpine) (push) Canceled after 0s
Historical data migration test / test (15-alpine) (push) Canceled after 0s
Historical data migration test / test (16-alpine) (push) Canceled after 0s
Historical data migration test / test (17-alpine) (push) Canceled after 0s
Bundler Audit / security (push) Canceled after 0s
Haml Linting / lint (push) Canceled after 0s
JavaScript Linting / lint (push) Canceled after 0s
Ruby Linting / lint (push) Canceled after 0s
JavaScript Testing / test (push) Canceled after 0s
Ruby Testing / build (production) (push) Canceled after 0s
Ruby Testing / test (.ruby-version) (push) Canceled after 0s
Ruby Testing / test (3.3) (push) Canceled after 0s
Ruby Testing / test (3.4) (push) Canceled after 0s
Ruby Testing / End to End testing (.ruby-version) (push) Canceled after 0s
Ruby Testing / End to End testing (3.3) (push) Canceled after 0s
Ruby Testing / End to End testing (3.4) (push) Canceled after 0s
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:7.17.29) (push) Canceled after 0s
Check i18n / check-i18n (push) Canceled after 0s
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (javascript) (push) Canceled after 0s
CodeQL / Analyze (ruby) (push) Canceled after 0s
Ruby Testing / Elastic Search integration testing (.ruby-version, opensearchproject/opensearch:2) (push) Canceled after 0s
Ruby Testing / Elastic Search integration testing (3.3, docker.elastic.co/elasticsearch/elasticsearch:7.17.29) (push) Canceled after 0s
Ruby Testing / Elastic Search integration testing (3.4, docker.elastic.co/elasticsearch/elasticsearch:7.17.29) (push) Canceled after 0s
Check formatting / lint (push) Canceled after 0s
CSS Linting / lint (push) Canceled after 0s
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:8.19.2) (push) Canceled after 0s
Chromatic / Check for relevant changes (push) Canceled after 0s
Chromatic / Run Chromatic (push) Canceled after 0s
Snapshot of upstream tag v4.7.3 (commit 8ff11c2bb7b9f0714e947b10fa3629c6542c7121) from https://github.com/mastodon/mastodon, unmodified.
67 lines
2.0 KiB
Ruby
67 lines
2.0 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Status::InteractionPolicyConcern
|
|
extend ActiveSupport::Concern
|
|
|
|
included do
|
|
composed_of :quote_interaction_policy, class_name: 'InteractionPolicy', mapping: { quote_approval_policy: :bitmap }
|
|
|
|
before_validation :downgrade_quote_policy, if: -> { local? && !distributable? }
|
|
end
|
|
|
|
def quote_policy_as_keys(kind)
|
|
raise ArgumentError unless kind.in?(%i(automatic manual))
|
|
|
|
sub_policy = quote_interaction_policy.send(kind)
|
|
sub_policy.as_keys
|
|
end
|
|
|
|
# Returns `:automatic`, `:manual`, `:unknown` or `:denied`
|
|
def quote_policy_for_account(other_account)
|
|
return :denied if other_account.nil? || direct_visibility? || reblog?
|
|
|
|
following_author = nil
|
|
followed_by_author = nil
|
|
|
|
# Post author is always allowed to quote themselves
|
|
return :automatic if account_id == other_account.id
|
|
|
|
automatic_policy = quote_interaction_policy.automatic
|
|
|
|
return :automatic if automatic_policy.public?
|
|
|
|
if automatic_policy.followers?
|
|
following_author = other_account.following?(account) if following_author.nil?
|
|
return :automatic if following_author
|
|
end
|
|
|
|
if automatic_policy.following?
|
|
followed_by_author = account.following?(other_account) if followed_by_author.nil?
|
|
return :automatic if followed_by_author
|
|
end
|
|
|
|
# We don't know we are allowed by the automatic policy, considering the manual one
|
|
manual_policy = quote_interaction_policy.manual
|
|
|
|
return :manual if manual_policy.public?
|
|
|
|
if manual_policy.followers?
|
|
following_author = other_account.following?(account) if following_author.nil?
|
|
return :manual if following_author
|
|
end
|
|
|
|
if manual_policy.following?
|
|
followed_by_author = account.following?(other_account) if followed_by_author.nil?
|
|
return :manual if followed_by_author
|
|
end
|
|
|
|
return :unknown if [automatic_policy, manual_policy].any?(&:unsupported_policy?)
|
|
|
|
:denied
|
|
end
|
|
|
|
def downgrade_quote_policy
|
|
self.quote_approval_policy = 0
|
|
end
|
|
end
|