From a2a8cf57069c020e2ff4e7581a32778854d11e66 Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 3 Sep 2026 17:20:50 +0200 Subject: [PATCH] Orphan domain blocks when their severity is changed --- .../admin/domain_blocks_controller.rb | 2 ++ .../api/v1/admin/domain_blocks_controller.rb | 4 +++- app/helpers/admin/action_logs_helper.rb | 20 +++++++++++++++++++ .../admin/action_logs/_action_log.html.haml | 8 +++++--- config/locales/en.yml | 7 +++++++ 5 files changed, 37 insertions(+), 4 deletions(-) diff --git a/app/controllers/admin/domain_blocks_controller.rb b/app/controllers/admin/domain_blocks_controller.rb index fdc8e53f531..1d02e3fae76 100644 --- a/app/controllers/admin/domain_blocks_controller.rb +++ b/app/controllers/admin/domain_blocks_controller.rb @@ -57,6 +57,7 @@ module Admin if existing_domain_block.present? && existing_domain_block.domain == TagManager.instance.normalize_domain(@domain_block.domain) @domain_block = existing_domain_block @domain_block.assign_attributes(resource_params) + @domain_block.moderation_subscription_id = nil if @domain_block.severity_changed? end # Require explicit confirmation when suspending @@ -75,6 +76,7 @@ module Admin authorize :domain_block, :update? @domain_block.assign_attributes(update_params) + @domain_block.moderation_subscription_id = nil if @domain_block.severity_changed? # Require explicit confirmation when suspending return render :confirm_suspension if requires_confirmation? diff --git a/app/controllers/api/v1/admin/domain_blocks_controller.rb b/app/controllers/api/v1/admin/domain_blocks_controller.rb index 90dec85c15c..93d31cac3d8 100644 --- a/app/controllers/api/v1/admin/domain_blocks_controller.rb +++ b/app/controllers/api/v1/admin/domain_blocks_controller.rb @@ -41,7 +41,9 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController def update authorize @domain_block, :update? - @domain_block.update!(domain_block_params) + @domain_block.assign_attributes(domain_block_params) + @domain_block.moderation_subscription_id = nil if @domain_block.severity_changed? + @domain_block.save! DomainBlockWorker.perform_async(@domain_block.id, @domain_block.severity_previously_changed?) log_action :update, @domain_block render json: @domain_block, serializer: REST::Admin::DomainBlockSerializer diff --git a/app/helpers/admin/action_logs_helper.rb b/app/helpers/admin/action_logs_helper.rb index c3730c0100e..a8878cbaa0b 100644 --- a/app/helpers/admin/action_logs_helper.rb +++ b/app/helpers/admin/action_logs_helper.rb @@ -1,6 +1,26 @@ # frozen_string_literal: true module Admin::ActionLogsHelper + def action_log_title(log) + log.account_id == -99 ? automated_action_log_title(log) : generic_action_log_title(log) + end + + def automated_action_log_title(log) + t("admin.action_logs.automated_actions.#{log.action}_#{log.target_type.underscore}_html", + target: content_tag(:span, log_target(log), class: 'target')) + end + + def generic_action_log_title(log) + t("admin.action_logs.actions.#{log.action}_#{log.target_type.underscore}_html", + name: content_tag(:span, log.account.username, class: 'username'), + target: content_tag(:span, log_target(log), class: 'target')) + end + + def action_log_subscription(log) + subscription = log.moderation_subscription.present? ? link_to(log.moderation_subscription.name, admin_moderation_subscription_path(log.moderation_subscription)) : t('admin.action_logs.deleted_suggestion') + t('admin.action_logs.suggested_by_html', subscription: content_tag(:span, subscription, class: 'target')) + end + def log_target(log) case log.target_type when 'Account' diff --git a/app/views/admin/action_logs/_action_log.html.haml b/app/views/admin/action_logs/_action_log.html.haml index 2032a7ace31..5e751e491f6 100644 --- a/app/views/admin/action_logs/_action_log.html.haml +++ b/app/views/admin/action_logs/_action_log.html.haml @@ -4,11 +4,13 @@ = image_tag action_log.account.avatar.url(:original), alt: '', width: 40, height: 40, class: 'avatar' .log-entry__content .log-entry__title - = t("admin.action_logs.actions.#{action_log.action}_#{action_log.target_type.underscore}_html", - name: content_tag(:span, action_log.account.username, class: 'username'), - target: content_tag(:span, log_target(action_log), class: 'target')) + = action_log_title(action_log) - if action_log.recorded_changes.present? = t(chain_multiple_translations(action_log)) + - if action_log.moderation_subscription_id.present? + .log-entry__suggestion + = action_log_subscription(action_log) + .log-entry__timestamp %time.formatted{ datetime: action_log.created_at.iso8601 } diff --git a/config/locales/en.yml b/config/locales/en.yml index b37207ebd74..ae71f23777a 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -343,11 +343,18 @@ en: update_user_role_html: "%{name} changed %{target} role" update_username_block_html: "%{name} updated rule for usernames containing %{target}" usable_tag_html: can be used; + automated_actions: + create_domain_allow_html: Automatically allowed federation with domain %{target} + create_domain_block_html: Automatically blocked domain %{target} + destroy_domain_allow_html: Automatically disallowed federation with domain %{target} + destroy_domain_block_html: Automatically unblocked domain %{target} + update_domain_block_html: Automatically updated domain block for %{target} deleted_account: deleted account deleted_suggestion: a deleted moderation subscription empty: No logs found. filter_by_action: Filter by action filter_by_user: Filter by user + suggested_by_html: Action suggested by %{subscription} title: Audit log unavailable_instance: "(domain name unavailable)" announcements: