Add uniqueness to block email domains (#5692)
This commit is contained in:
		
							parent
							
								
									8087aa83d4
								
							
						
					
					
						commit
						20150659e6
					
				|  | @ -4,14 +4,33 @@ | ||||||
| # Table name: email_domain_blocks | # Table name: email_domain_blocks | ||||||
| # | # | ||||||
| #  id         :bigint           not null, primary key | #  id         :bigint           not null, primary key | ||||||
| #  domain     :string           not null | #  domain     :string           default(""), not null | ||||||
| #  created_at :datetime         not null | #  created_at :datetime         not null | ||||||
| #  updated_at :datetime         not null | #  updated_at :datetime         not null | ||||||
| # | # | ||||||
| 
 | 
 | ||||||
| class EmailDomainBlock < ApplicationRecord | class EmailDomainBlock < ApplicationRecord | ||||||
|  |   before_validation :normalize_domain | ||||||
|  | 
 | ||||||
|  |   validates :domain, presence: true, uniqueness: true | ||||||
|  | 
 | ||||||
|   def self.block?(email) |   def self.block?(email) | ||||||
|     domain = email.gsub(/.+@([^.]+)/, '\1') |     _, domain = email.split('@', 2) | ||||||
|  | 
 | ||||||
|  |     return true if domain.nil? | ||||||
|  | 
 | ||||||
|  |     begin | ||||||
|  |       domain = TagManager.instance.normalize_domain(domain) | ||||||
|  |     rescue Addressable::URI::InvalidURIError | ||||||
|  |       return true | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|     where(domain: domain).exists? |     where(domain: domain).exists? | ||||||
|   end |   end | ||||||
|  | 
 | ||||||
|  |   private | ||||||
|  | 
 | ||||||
|  |   def normalize_domain | ||||||
|  |     self.domain = TagManager.instance.normalize_domain(domain) | ||||||
|  |   end | ||||||
| end | end | ||||||
|  |  | ||||||
|  | @ -0,0 +1,8 @@ | ||||||
|  | class AddIndexDomainToEmailDomainBlocks < ActiveRecord::Migration[5.1] | ||||||
|  |   disable_ddl_transaction! | ||||||
|  | 
 | ||||||
|  |   def change | ||||||
|  |     add_index :email_domain_blocks, :domain, algorithm: :concurrently, unique: true | ||||||
|  |     change_column_default :email_domain_blocks, :domain, from: nil, to: '' | ||||||
|  |   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: 20171109012327) do | ActiveRecord::Schema.define(version: 20171114080328) 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" | ||||||
|  | @ -126,9 +126,10 @@ ActiveRecord::Schema.define(version: 20171109012327) do | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   create_table "email_domain_blocks", force: :cascade do |t| |   create_table "email_domain_blocks", force: :cascade do |t| | ||||||
|     t.string "domain", null: false |     t.string "domain", default: "", null: false | ||||||
|     t.datetime "created_at", null: false |     t.datetime "created_at", null: false | ||||||
|     t.datetime "updated_at", null: false |     t.datetime "updated_at", null: false | ||||||
|  |     t.index ["domain"], name: "index_email_domain_blocks_on_domain", unique: true | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   create_table "favourites", force: :cascade do |t| |   create_table "favourites", force: :cascade do |t| | ||||||
|  |  | ||||||
|  | @ -13,9 +13,10 @@ RSpec.describe EmailDomainBlock, type: :model do | ||||||
|       Fabricate(:email_domain_block, domain: 'example.com') |       Fabricate(:email_domain_block, domain: 'example.com') | ||||||
|       expect(EmailDomainBlock.block?('nyarn@example.com')).to eq true |       expect(EmailDomainBlock.block?('nyarn@example.com')).to eq true | ||||||
|     end |     end | ||||||
|  | 
 | ||||||
|     it 'returns true if the domain is not registed' do |     it 'returns true if the domain is not registed' do | ||||||
|       Fabricate(:email_domain_block, domain: 'domain') |       Fabricate(:email_domain_block, domain: 'example.com') | ||||||
|       expect(EmailDomainBlock.block?('example')).to eq false |       expect(EmailDomainBlock.block?('nyarn@example.net')).to eq false | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue