Add canonical e-mail blocks for suspended accounts (#16049)
Prevent new accounts from being created using the same underlying e-mail as a suspended account using extensions and period permutations. Stores e-mails as a SHA256 hash
This commit is contained in:
		@ -235,6 +235,7 @@ class Account < ApplicationRecord
 | 
			
		||||
    transaction do
 | 
			
		||||
      create_deletion_request!
 | 
			
		||||
      update!(suspended_at: date, suspension_origin: origin)
 | 
			
		||||
      create_canonical_email_block!
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -242,6 +243,7 @@ class Account < ApplicationRecord
 | 
			
		||||
    transaction do
 | 
			
		||||
      deletion_request&.destroy!
 | 
			
		||||
      update!(suspended_at: nil, suspension_origin: nil)
 | 
			
		||||
      destroy_canonical_email_block!
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -569,4 +571,16 @@ class Account < ApplicationRecord
 | 
			
		||||
  def clean_feed_manager
 | 
			
		||||
    FeedManager.instance.clean_feeds!(:home, [id])
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def create_canonical_email_block!
 | 
			
		||||
    return unless local? && user_email.present?
 | 
			
		||||
 | 
			
		||||
    CanonicalEmailBlock.create(reference_account: self, email: user_email)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def destroy_canonical_email_block!
 | 
			
		||||
    return unless local?
 | 
			
		||||
 | 
			
		||||
    CanonicalEmailBlock.where(reference_account: self).delete_all
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										27
									
								
								app/models/canonical_email_block.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								app/models/canonical_email_block.rb
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,27 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
# == Schema Information
 | 
			
		||||
#
 | 
			
		||||
# Table name: canonical_email_blocks
 | 
			
		||||
#
 | 
			
		||||
#  id                   :bigint(8)        not null, primary key
 | 
			
		||||
#  canonical_email_hash :string           default(""), not null
 | 
			
		||||
#  reference_account_id :bigint(8)        not null
 | 
			
		||||
#  created_at           :datetime         not null
 | 
			
		||||
#  updated_at           :datetime         not null
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
class CanonicalEmailBlock < ApplicationRecord
 | 
			
		||||
  include EmailHelper
 | 
			
		||||
 | 
			
		||||
  belongs_to :reference_account, class_name: 'Account'
 | 
			
		||||
 | 
			
		||||
  validates :canonical_email_hash, presence: true
 | 
			
		||||
 | 
			
		||||
  def email=(email)
 | 
			
		||||
    self.canonical_email_hash = email_to_canonical_email_hash(email)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def self.block?(email)
 | 
			
		||||
    where(canonical_email_hash: email_to_canonical_email_hash(email)).exists?
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
		Reference in New Issue
	
	Block a user