diff --git a/app/lib/status_reach_finder.rb b/app/lib/status_reach_finder.rb index 924879ccdc..be537896d3 100644 --- a/app/lib/status_reach_finder.rb +++ b/app/lib/status_reach_finder.rb @@ -96,13 +96,20 @@ class StatusReachFinder def banned_domains return @banned_domains if @banned_domains + + domains = banned_domains_of_status(@status) + domains = domains + banned_domains_of_status(@status.reblog) if @status.reblog? + return @banned_domains = domains + end + + def banned_domains_of_status(status) blocks = DomainBlock.where(domain: nil) - blocks = blocks.or(DomainBlock.where(reject_send_not_public_searchability: true)) if @status.compute_searchability != 'public' - blocks = blocks.or(DomainBlock.where(reject_send_unlisted_dissubscribable: true)) if @status.unlisted_visibility? && @status.account.dissubscribable - blocks = blocks.or(DomainBlock.where(reject_send_public_unlisted: true)) if @status.public_unlisted_visibility? - blocks = blocks.or(DomainBlock.where(reject_send_dissubscribable: true)) if @status.account.dissubscribable - blocks = blocks.or(DomainBlock.where(reject_send_media: true)) if @status.with_media? - blocks = blocks.or(DomainBlock.where(reject_send_sensitive: true)) if (@status.with_media? && @status.sensitive) || @status.spoiler_text - return @banned_domains = blocks.pluck(:domain).uniq + blocks = blocks.or(DomainBlock.where(reject_send_not_public_searchability: true)) if status.compute_searchability != 'public' + blocks = blocks.or(DomainBlock.where(reject_send_unlisted_dissubscribable: true)) if status.unlisted_visibility? && status.account.dissubscribable + blocks = blocks.or(DomainBlock.where(reject_send_public_unlisted: true)) if status.public_unlisted_visibility? + blocks = blocks.or(DomainBlock.where(reject_send_dissubscribable: true)) if status.account.dissubscribable + blocks = blocks.or(DomainBlock.where(reject_send_media: true)) if status.with_media? + blocks = blocks.or(DomainBlock.where(reject_send_sensitive: true)) if (status.with_media? && status.sensitive) || status.spoiler_text? + blocks.pluck(:domain).uniq end end diff --git a/app/policies/status_policy.rb b/app/policies/status_policy.rb index 5d2bf17da6..75b9b28eff 100644 --- a/app/policies/status_policy.rb +++ b/app/policies/status_policy.rb @@ -101,14 +101,22 @@ class StatusPolicy < ApplicationPolicy end def server_blocking_domain? - @domain_block = DomainBlock.find_by(domain: current_account&.domain) + if record.reblog? + server_blocking_domain_of_status(record) || server_blocking_domain_of_status(record.reblog) + else + server_blocking_domain_of_status(record) + end + end + + def server_blocking_domain_of_status?(status) + @domain_block ||= DomainBlock.find_by(domain: current_account&.domain) if @domain_block - (@domain_block.reject_send_not_public_searchability && record.compute_searchability != 'public') || - (@domain_block.reject_send_unlisted_dissubscribable && record.unlisted_visibility? && record.account.dissubscribable) || - (@domain_block.reject_send_public_unlisted && record.public_unlisted_visibility?) || - (@domain_block.reject_send_dissubscribable && record.account.dissubscribable) || - (@domain_block.reject_send_media && record.with_media?) || - (@domain_block.reject_send_sensitive && ((record.with_media? && record.sensitive) || record.spoiler_text)) + (@domain_block.reject_send_not_public_searchability && status.compute_searchability != 'public') || + (@domain_block.reject_send_unlisted_dissubscribable && status.unlisted_visibility? && status.account.dissubscribable) || + (@domain_block.reject_send_public_unlisted && status.public_unlisted_visibility?) || + (@domain_block.reject_send_dissubscribable && status.account.dissubscribable) || + (@domain_block.reject_send_media && status.with_media?) || + (@domain_block.reject_send_sensitive && ((status.with_media? && status.sensitive) || status.spoiler_text?)) else false end