Add option to obfuscate domain name in public list of domain blocks (#15355)
- Replace the middle of the domain with * characters (except for periods) - Add SHA-256 digest of the domain name in tooltip
This commit is contained in:
		| @@ -74,11 +74,11 @@ module Admin | |||||||
|     end |     end | ||||||
|  |  | ||||||
|     def update_params |     def update_params | ||||||
|       params.require(:domain_block).permit(:severity, :reject_media, :reject_reports, :private_comment, :public_comment) |       params.require(:domain_block).permit(:severity, :reject_media, :reject_reports, :private_comment, :public_comment, :obfuscate) | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     def resource_params |     def resource_params | ||||||
|       params.require(:domain_block).permit(:domain, :severity, :reject_media, :reject_reports, :private_comment, :public_comment) |       params.require(:domain_block).permit(:domain, :severity, :reject_media, :reject_reports, :private_comment, :public_comment, :obfuscate) | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|   | |||||||
| @@ -12,6 +12,7 @@ | |||||||
| #  reject_reports  :boolean          default(FALSE), not null | #  reject_reports  :boolean          default(FALSE), not null | ||||||
| #  private_comment :text | #  private_comment :text | ||||||
| #  public_comment  :text | #  public_comment  :text | ||||||
|  | #  obfuscate       :boolean          default(FALSE), not null | ||||||
| # | # | ||||||
|  |  | ||||||
| class DomainBlock < ApplicationRecord | class DomainBlock < ApplicationRecord | ||||||
| @@ -73,4 +74,23 @@ class DomainBlock < ApplicationRecord | |||||||
|     scope = suspend? ? accounts.where(suspended_at: created_at) : accounts.where(silenced_at: created_at) |     scope = suspend? ? accounts.where(suspended_at: created_at) : accounts.where(silenced_at: created_at) | ||||||
|     scope.count |     scope.count | ||||||
|   end |   end | ||||||
|  |  | ||||||
|  |   def public_domain | ||||||
|  |     return domain unless obfuscate? | ||||||
|  |  | ||||||
|  |     length        = domain.size | ||||||
|  |     visible_ratio = length / 4 | ||||||
|  |  | ||||||
|  |     domain.chars.map.with_index do |chr, i| | ||||||
|  |       if i > visible_ratio && i < length - visible_ratio && chr != '.' | ||||||
|  |         '*' | ||||||
|  |       else | ||||||
|  |         chr | ||||||
|  |       end | ||||||
|  |     end.join | ||||||
|  |   end | ||||||
|  |  | ||||||
|  |   def domain_digest | ||||||
|  |     Digest::SHA256.hexdigest(domain) | ||||||
|  |   end | ||||||
| end | end | ||||||
|   | |||||||
| @@ -7,6 +7,6 @@ | |||||||
|     - domain_blocks.each do |domain_block| |     - domain_blocks.each do |domain_block| | ||||||
|       %tr |       %tr | ||||||
|         %td.nowrap |         %td.nowrap | ||||||
|           %span{ title: domain_block.domain }= domain_block.domain |           %span{ title: "SHA-256: #{domain_block.domain_digest}" }= domain_block.public_domain | ||||||
|         %td |         %td | ||||||
|           = domain_block.public_comment if display_blocks_rationale? |           = domain_block.public_comment if display_blocks_rationale? | ||||||
|   | |||||||
| @@ -20,6 +20,9 @@ | |||||||
|   .fields-group |   .fields-group | ||||||
|     = f.input :reject_reports, as: :boolean, wrapper: :with_label, label: I18n.t('admin.domain_blocks.reject_reports'), hint: I18n.t('admin.domain_blocks.reject_reports_hint') |     = f.input :reject_reports, as: :boolean, wrapper: :with_label, label: I18n.t('admin.domain_blocks.reject_reports'), hint: I18n.t('admin.domain_blocks.reject_reports_hint') | ||||||
|  |  | ||||||
|  |   .fields-group | ||||||
|  |     = f.input :obfuscate, as: :boolean, wrapper: :with_label, label: I18n.t('admin.domain_blocks.obfuscate'), hint: I18n.t('admin.domain_blocks.obfuscate_hint') | ||||||
|  |  | ||||||
|   .field-group |   .field-group | ||||||
|     = f.input :private_comment, wrapper: :with_label, label: I18n.t('admin.domain_blocks.private_comment'), hint: t('admin.domain_blocks.private_comment_hint'), rows: 6 |     = f.input :private_comment, wrapper: :with_label, label: I18n.t('admin.domain_blocks.private_comment'), hint: t('admin.domain_blocks.private_comment_hint'), rows: 6 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -20,6 +20,9 @@ | |||||||
|   .fields-group |   .fields-group | ||||||
|     = f.input :reject_reports, as: :boolean, wrapper: :with_label, label: I18n.t('admin.domain_blocks.reject_reports'), hint: I18n.t('admin.domain_blocks.reject_reports_hint') |     = f.input :reject_reports, as: :boolean, wrapper: :with_label, label: I18n.t('admin.domain_blocks.reject_reports'), hint: I18n.t('admin.domain_blocks.reject_reports_hint') | ||||||
|  |  | ||||||
|  |   .fields-group | ||||||
|  |     = f.input :obfuscate, as: :boolean, wrapper: :with_label, label: I18n.t('admin.domain_blocks.obfuscate'), hint: I18n.t('admin.domain_blocks.obfuscate_hint') | ||||||
|  |  | ||||||
|   .field-group |   .field-group | ||||||
|     = f.input :private_comment, wrapper: :with_label, label: I18n.t('admin.domain_blocks.private_comment'), hint: t('admin.domain_blocks.private_comment_hint'), rows: 6 |     = f.input :private_comment, wrapper: :with_label, label: I18n.t('admin.domain_blocks.private_comment'), hint: t('admin.domain_blocks.private_comment_hint'), rows: 6 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -402,6 +402,8 @@ en: | |||||||
|           silence: Silence |           silence: Silence | ||||||
|           suspend: Suspend |           suspend: Suspend | ||||||
|         title: New domain block |         title: New domain block | ||||||
|  |       obfuscate: Obfuscate domain name | ||||||
|  |       obfuscate_hint: Partially obfuscate the domain name in the list if advertising the list of domain limitations is enabled | ||||||
|       private_comment: Private comment |       private_comment: Private comment | ||||||
|       private_comment_hint: Comment about this domain limitation for internal use by the moderators. |       private_comment_hint: Comment about this domain limitation for internal use by the moderators. | ||||||
|       public_comment: Public comment |       public_comment: Public comment | ||||||
|   | |||||||
							
								
								
									
										15
									
								
								db/migrate/20201218054746_add_obfuscate_to_domain_blocks.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								db/migrate/20201218054746_add_obfuscate_to_domain_blocks.rb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | |||||||
|  | require Rails.root.join('lib', 'mastodon', 'migration_helpers') | ||||||
|  |  | ||||||
|  | class AddObfuscateToDomainBlocks < ActiveRecord::Migration[5.2] | ||||||
|  |   include Mastodon::MigrationHelpers | ||||||
|  |  | ||||||
|  |   disable_ddl_transaction! | ||||||
|  |  | ||||||
|  |   def up | ||||||
|  |     safety_assured { add_column_with_default :domain_blocks, :obfuscate, :boolean, default: false, allow_null: false } | ||||||
|  |   end | ||||||
|  |  | ||||||
|  |   def down | ||||||
|  |     remove_column :domain_blocks, :obfuscate | ||||||
|  |   end | ||||||
|  | end | ||||||
| @@ -10,7 +10,7 @@ | |||||||
| # | # | ||||||
| # It's strongly recommended that you check this file into your version control system. | # It's strongly recommended that you check this file into your version control system. | ||||||
|  |  | ||||||
| ActiveRecord::Schema.define(version: 2020_12_06_004238) do | ActiveRecord::Schema.define(version: 2020_12_18_054746) do | ||||||
|  |  | ||||||
|   # These are extensions that must be enabled in order to support this database |   # These are extensions that must be enabled in order to support this database | ||||||
|   enable_extension "plpgsql" |   enable_extension "plpgsql" | ||||||
| @@ -360,6 +360,7 @@ ActiveRecord::Schema.define(version: 2020_12_06_004238) do | |||||||
|     t.boolean "reject_reports", default: false, null: false |     t.boolean "reject_reports", default: false, null: false | ||||||
|     t.text "private_comment" |     t.text "private_comment" | ||||||
|     t.text "public_comment" |     t.text "public_comment" | ||||||
|  |     t.boolean "obfuscate", default: false, null: false | ||||||
|     t.index ["domain"], name: "index_domain_blocks_on_domain", unique: true |     t.index ["domain"], name: "index_domain_blocks_on_domain", unique: true | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user