diff options
author | Eugen Rochko <eugen@zeonfederated.com> | 2017-05-19 21:05:32 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-05-19 21:05:32 +0200 |
commit | f1ab70649b00e717a00ac295d42ff99160aa713b (patch) | |
tree | 283147302494a44af53409ca71736ffc1bd6eda1 /app/services | |
parent | 1548695c8300618d44efa8785f5c6eb7b3a86917 (diff) |
Add buttons to block and unblock domain (#3127)
* Add buttons to block and unblock domain * Relationship API now returns "domain_blocking" status for accounts, rename "block entire domain" to "hide entire domain", fix unblocking domain, do not block notifications from domain-blocked-but-followed people, do not send Salmons to domain blocked users * Add test * Personal domain blocks shouldn't affect Salmon after all, since in this direction of communication the control is very thin when it comes to public stuff. Best stay consistent and not affect federation in this way * Ignore followers and follow request from domain blocked folks, ensure account domain blocks are not created for empty domain, and avoid duplicates in validation * Purge followers when blocking domain (without soft-blocks, since they are useless here) * Add tests, fix local timeline being empty when having any domain blocks
Diffstat (limited to 'app/services')
-rw-r--r-- | app/services/block_domain_from_account_service.rb | 8 | ||||
-rw-r--r-- | app/services/notify_service.rb | 16 | ||||
-rw-r--r-- | app/services/process_interaction_service.rb | 4 | ||||
-rw-r--r-- | app/services/send_interaction_service.rb | 14 |
4 files changed, 30 insertions, 12 deletions
diff --git a/app/services/block_domain_from_account_service.rb b/app/services/block_domain_from_account_service.rb new file mode 100644 index 000000000..cae7abcbd --- /dev/null +++ b/app/services/block_domain_from_account_service.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +class BlockDomainFromAccountService < BaseService + def call(account, domain) + account.block_domain!(domain) + account.passive_relationships.where(account: Account.where(domain: domain)).delete_all + end +end diff --git a/app/services/notify_service.rb b/app/services/notify_service.rb index 150ffe6b2..ce22b6505 100644 --- a/app/services/notify_service.rb +++ b/app/services/notify_service.rb @@ -37,15 +37,15 @@ class NotifyService < BaseService end def blocked? - blocked = @recipient.suspended? # Skip if the recipient account is suspended anyway - blocked ||= @recipient.id == @notification.from_account.id # Skip for interactions with self - blocked ||= @recipient.domain_blocking?(@notification.from_account.domain) # Skip for domain blocked accounts - blocked ||= @recipient.blocking?(@notification.from_account) # Skip for blocked accounts - blocked ||= (@notification.from_account.silenced? && !@recipient.following?(@notification.from_account)) # Hellban - blocked ||= (@recipient.user.settings.interactions['must_be_follower'] && !@notification.from_account.following?(@recipient)) # Options - blocked ||= (@recipient.user.settings.interactions['must_be_following'] && !@recipient.following?(@notification.from_account)) # Options + blocked = @recipient.suspended? # Skip if the recipient account is suspended anyway + blocked ||= @recipient.id == @notification.from_account.id # Skip for interactions with self + blocked ||= @recipient.domain_blocking?(@notification.from_account.domain) && !@recipient.following?(@notification.from_account) # Skip for domain blocked accounts + blocked ||= @recipient.blocking?(@notification.from_account) # Skip for blocked accounts + blocked ||= (@notification.from_account.silenced? && !@recipient.following?(@notification.from_account)) # Hellban + blocked ||= (@recipient.user.settings.interactions['must_be_follower'] && !@notification.from_account.following?(@recipient)) # Options + blocked ||= (@recipient.user.settings.interactions['must_be_following'] && !@recipient.following?(@notification.from_account)) # Options blocked ||= conversation_muted? - blocked ||= send("blocked_#{@notification.type}?") # Type-dependent filters + blocked ||= send("blocked_#{@notification.type}?") # Type-dependent filters blocked end diff --git a/app/services/process_interaction_service.rb b/app/services/process_interaction_service.rb index bc8361510..e9c01103d 100644 --- a/app/services/process_interaction_service.rb +++ b/app/services/process_interaction_service.rb @@ -21,9 +21,9 @@ class ProcessInteractionService < BaseService case verb(xml) when :follow - follow!(account, target_account) unless target_account.locked? || target_account.blocking?(account) + follow!(account, target_account) unless target_account.locked? || target_account.blocking?(account) || target_account.domain_blocking?(account.domain) when :request_friend - follow_request!(account, target_account) unless !target_account.locked? || target_account.blocking?(account) + follow_request!(account, target_account) unless !target_account.locked? || target_account.blocking?(account) || target_account.domain_blocking?(account.domain) when :authorize authorize_follow_request!(account, target_account) when :reject diff --git a/app/services/send_interaction_service.rb b/app/services/send_interaction_service.rb index 99113eeca..504f41c72 100644 --- a/app/services/send_interaction_service.rb +++ b/app/services/send_interaction_service.rb @@ -6,12 +6,22 @@ class SendInteractionService < BaseService # @param [Account] source_account # @param [Account] target_account def call(xml, source_account, target_account) - envelope = salmon.pack(xml, source_account.keypair) - salmon.post(target_account.salmon_url, envelope) + @xml = xml + @source_account = source_account + @target_account = target_account + + return if block_notification? + + envelope = salmon.pack(@xml, @source_account.keypair) + salmon.post(@target_account.salmon_url, envelope) end private + def block_notification? + DomainBlock.blocked?(@target_account.domain) + end + def salmon @salmon ||= OStatus2::Salmon.new end |