Provide a link to existing domain block when trying to block an already-blocked domain (#10663)
* When trying to block an already-blocked domain, provide a link to the block * Fix styling for links in flash messages * Allow blocks to be upgraded but not downgraded
This commit is contained in:
		| @@ -13,13 +13,25 @@ module Admin | ||||
|       authorize :domain_block, :create? | ||||
|  | ||||
|       @domain_block = DomainBlock.new(resource_params) | ||||
|       existing_domain_block = resource_params[:domain].present? ? DomainBlock.find_by(domain: resource_params[:domain]) : nil | ||||
|  | ||||
|       if @domain_block.save | ||||
|         DomainBlockWorker.perform_async(@domain_block.id) | ||||
|         log_action :create, @domain_block | ||||
|         redirect_to admin_instances_path(limited: '1'), notice: I18n.t('admin.domain_blocks.created_msg') | ||||
|       else | ||||
|       if existing_domain_block.present? && !@domain_block.stricter_than?(existing_domain_block) | ||||
|         @domain_block.save | ||||
|         flash[:alert] = I18n.t('admin.domain_blocks.existing_domain_block_html', name: existing_domain_block.domain, unblock_url: admin_domain_block_path(existing_domain_block)).html_safe # rubocop:disable Rails/OutputSafety | ||||
|         @domain_block.errors[:domain].clear | ||||
|         render :new | ||||
|       else | ||||
|         if existing_domain_block.present? | ||||
|           @domain_block = existing_domain_block | ||||
|           @domain_block.update(resource_params) | ||||
|         end | ||||
|         if @domain_block.save | ||||
|           DomainBlockWorker.perform_async(@domain_block.id) | ||||
|           log_action :create, @domain_block | ||||
|           redirect_to admin_instances_path(limited: '1'), notice: I18n.t('admin.domain_blocks.created_msg') | ||||
|         else | ||||
|           render :new | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|  | ||||
|   | ||||
| @@ -533,6 +533,17 @@ code { | ||||
|     color: $error-value-color; | ||||
|   } | ||||
|  | ||||
|   a { | ||||
|     display: inline-block; | ||||
|     color: $darker-text-color; | ||||
|     text-decoration: none; | ||||
|  | ||||
|     &:hover { | ||||
|       color: $primary-text-color; | ||||
|       text-decoration: underline; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   p { | ||||
|     margin-bottom: 15px; | ||||
|   } | ||||
|   | ||||
| @@ -29,4 +29,11 @@ class DomainBlock < ApplicationRecord | ||||
|   def self.blocked?(domain) | ||||
|     where(domain: domain, severity: :suspend).exists? | ||||
|   end | ||||
|  | ||||
|   def stricter_than?(other_block) | ||||
|     return true if suspend? | ||||
|     return false if other_block.suspend? && (silence? || noop?) | ||||
|     return false if other_block.silence? && noop? | ||||
|     (reject_media || !other_block.reject_media) && (reject_reports || !other_block.reject_reports) | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -269,6 +269,7 @@ en: | ||||
|       created_msg: Domain block is now being processed | ||||
|       destroyed_msg: Domain block has been undone | ||||
|       domain: Domain | ||||
|       existing_domain_block_html: You have already imposed stricter limits on %{name}, you need to <a href="%{unblock_url}">unblock it</a> first. | ||||
|       new: | ||||
|         create: Create block | ||||
|         hint: The domain block will not prevent creation of account entries in the database, but will retroactively and automatically apply specific moderation methods on those accounts. | ||||
|   | ||||
| @@ -37,7 +37,7 @@ RSpec.describe Admin::DomainBlocksController, type: :controller do | ||||
|     end | ||||
|  | ||||
|     it 'renders new when failed to save' do | ||||
|       Fabricate(:domain_block, domain: 'example.com') | ||||
|       Fabricate(:domain_block, domain: 'example.com', severity: 'suspend') | ||||
|       allow(DomainBlockWorker).to receive(:perform_async).and_return(true) | ||||
|  | ||||
|       post :create, params: { domain_block: { domain: 'example.com', severity: 'silence' } } | ||||
| @@ -45,6 +45,17 @@ RSpec.describe Admin::DomainBlocksController, type: :controller do | ||||
|       expect(DomainBlockWorker).not_to have_received(:perform_async) | ||||
|       expect(response).to render_template :new | ||||
|     end | ||||
|  | ||||
|     it 'allows upgrading a block' do | ||||
|       Fabricate(:domain_block, domain: 'example.com', severity: 'silence') | ||||
|       allow(DomainBlockWorker).to receive(:perform_async).and_return(true) | ||||
|  | ||||
|       post :create, params: { domain_block: { domain: 'example.com', severity: 'silence', reject_media: true, reject_reports: true } } | ||||
|  | ||||
|       expect(DomainBlockWorker).to have_received(:perform_async) | ||||
|       expect(flash[:notice]).to eq I18n.t('admin.domain_blocks.created_msg') | ||||
|       expect(response).to redirect_to(admin_instances_path(limited: '1')) | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   describe 'DELETE #destroy' do | ||||
|   | ||||
| @@ -36,4 +36,35 @@ RSpec.describe DomainBlock, type: :model do | ||||
|       expect(DomainBlock.blocked?('domain')).to eq false | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   describe 'stricter_than?' do | ||||
|     it 'returns true if the new block has suspend severity while the old has lower severity' do | ||||
|       suspend = DomainBlock.new(domain: 'domain', severity: :suspend) | ||||
|       silence = DomainBlock.new(domain: 'domain', severity: :silence) | ||||
|       noop = DomainBlock.new(domain: 'domain', severity: :noop) | ||||
|       expect(suspend.stricter_than?(silence)).to be true | ||||
|       expect(suspend.stricter_than?(noop)).to be true | ||||
|     end | ||||
|  | ||||
|     it 'returns false if the new block has lower severity than the old one' do | ||||
|       suspend = DomainBlock.new(domain: 'domain', severity: :suspend) | ||||
|       silence = DomainBlock.new(domain: 'domain', severity: :silence) | ||||
|       noop = DomainBlock.new(domain: 'domain', severity: :noop) | ||||
|       expect(silence.stricter_than?(suspend)).to be false | ||||
|       expect(noop.stricter_than?(suspend)).to be false | ||||
|       expect(noop.stricter_than?(silence)).to be false | ||||
|     end | ||||
|  | ||||
|     it 'returns false if the new block does is less strict regarding reports' do | ||||
|       older = DomainBlock.new(domain: 'domain', severity: :silence, reject_reports: true) | ||||
|       newer = DomainBlock.new(domain: 'domain', severity: :silence, reject_reports: false) | ||||
|       expect(newer.stricter_than?(older)).to be false | ||||
|     end | ||||
|  | ||||
|     it 'returns false if the new block does is less strict regarding media' do | ||||
|       older = DomainBlock.new(domain: 'domain', severity: :silence, reject_media: true) | ||||
|       newer = DomainBlock.new(domain: 'domain', severity: :silence, reject_media: false) | ||||
|       expect(newer.stricter_than?(older)).to be false | ||||
|     end | ||||
|   end | ||||
| end | ||||
|   | ||||
		Reference in New Issue
	
	Block a user