Implement EmailBlackList (#5109)
* Implement BlacklistedEmailDomain * Use Faker::Internet.domain_name * Remove note column * Add frozen_string_literal comment * Delete unnecessary codes * Sort alphabetically * Change of wording * Rename BlacklistedEmailDomain to EmailDomainBlock
This commit is contained in:
		
							parent
							
								
									d5091387c6
								
							
						
					
					
						commit
						b3af3f9f8c
					
				
					 15 changed files with 207 additions and 1 deletions
				
			
		
							
								
								
									
										40
									
								
								app/controllers/admin/email_domain_blocks_controller.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								app/controllers/admin/email_domain_blocks_controller.rb
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,40 @@ | |||
| # frozen_string_literal: true | ||||
| 
 | ||||
| module Admin | ||||
|   class EmailDomainBlocksController < BaseController | ||||
|     before_action :set_email_domain_block, only: [:show, :destroy] | ||||
| 
 | ||||
|     def index | ||||
|       @email_domain_blocks = EmailDomainBlock.page(params[:page]) | ||||
|     end | ||||
| 
 | ||||
|     def new | ||||
|       @email_domain_block = EmailDomainBlock.new | ||||
|     end | ||||
| 
 | ||||
|     def create | ||||
|       @email_domain_block = EmailDomainBlock.new(resource_params) | ||||
| 
 | ||||
|       if @email_domain_block.save | ||||
|         redirect_to admin_email_domain_blocks_path, notice: I18n.t('admin.email_domain_blocks.created_msg') | ||||
|       else | ||||
|         render :new | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     def destroy | ||||
|       @email_domain_block.destroy | ||||
|       redirect_to admin_email_domain_blocks_path, notice: I18n.t('admin.email_domain_blocks.destroyed_msg') | ||||
|     end | ||||
| 
 | ||||
|     private | ||||
| 
 | ||||
|     def set_email_domain_block | ||||
|       @email_domain_block = EmailDomainBlock.find(params[:id]) | ||||
|     end | ||||
| 
 | ||||
|     def resource_params | ||||
|       params.require(:email_domain_block).permit(:domain) | ||||
|     end | ||||
|   end | ||||
| end | ||||
							
								
								
									
										17
									
								
								app/models/email_domain_block.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								app/models/email_domain_block.rb
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,17 @@ | |||
| # frozen_string_literal: true | ||||
| # == Schema Information | ||||
| # | ||||
| # Table name: email_domain_blocks | ||||
| # | ||||
| #  id         :integer          not null, primary key | ||||
| #  domain     :string           not null | ||||
| #  created_at :datetime         not null | ||||
| #  updated_at :datetime         not null | ||||
| # | ||||
| 
 | ||||
| class EmailDomainBlock < ApplicationRecord | ||||
|   def self.block?(email) | ||||
|     domain = email.gsub(/.+@([^.]+)/, '\1') | ||||
|     where(domain: domain).exists? | ||||
|   end | ||||
| end | ||||
|  | @ -12,6 +12,7 @@ class BlacklistedEmailValidator < ActiveModel::Validator | |||
|   end | ||||
| 
 | ||||
|   def on_blacklist?(value) | ||||
|     return true if EmailDomainBlock.block?(value) | ||||
|     return false if Rails.configuration.x.email_domains_blacklist.blank? | ||||
| 
 | ||||
|     domains = Rails.configuration.x.email_domains_blacklist.gsub('.', '\.') | ||||
|  |  | |||
|  | @ -0,0 +1,5 @@ | |||
| %tr | ||||
|   %td.domain | ||||
|     %samp= email_domain_block.domain | ||||
|   %td | ||||
|     = table_link_to 'trash', t('admin.email_domain_blocks.delete'), admin_email_domain_block_path(email_domain_block), method: :delete | ||||
							
								
								
									
										13
									
								
								app/views/admin/email_domain_blocks/index.html.haml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								app/views/admin/email_domain_blocks/index.html.haml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,13 @@ | |||
| - content_for :page_title do | ||||
|   = t('admin.email_domain_blocks.title') | ||||
| 
 | ||||
| %table.table | ||||
|   %thead | ||||
|     %tr | ||||
|       %th= t('admin.email_domain_blocks.domain') | ||||
|       %th | ||||
|   %tbody | ||||
|     = render @email_domain_blocks | ||||
| 
 | ||||
| = paginate @email_domain_blocks | ||||
| = link_to t('admin.email_domain_blocks.add_new'), new_admin_email_domain_block_path, class: 'button' | ||||
							
								
								
									
										10
									
								
								app/views/admin/email_domain_blocks/new.html.haml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								app/views/admin/email_domain_blocks/new.html.haml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | |||
| - content_for :page_title do | ||||
|   = t('.title') | ||||
| 
 | ||||
| = simple_form_for @email_domain_block, url: admin_email_domain_blocks_path do |f| | ||||
|   = render 'shared/error_messages', object: @email_domain_block | ||||
| 
 | ||||
|   = f.input :domain, placeholder: t('admin.email_domain_blocks.domain') | ||||
| 
 | ||||
|   .actions | ||||
|     = f.button :button, t('.create'), type: :submit | ||||
|  | @ -152,6 +152,16 @@ en: | |||
|         undo: Undo | ||||
|       title: Domain Blocks | ||||
|       undo: Undo | ||||
|     email_domain_blocks: | ||||
|       add_new: Add new | ||||
|       created_msg: Email domain block successfully created | ||||
|       delete: Delete | ||||
|       destroyed_msg: Email domain block successfully deleted | ||||
|       domain: Domain | ||||
|       new: | ||||
|         create: Create block | ||||
|         title: New email domain block | ||||
|       title: Email Domain Block | ||||
|     instances: | ||||
|       account_count: Known accounts | ||||
|       domain_name: Domain | ||||
|  |  | |||
|  | @ -152,6 +152,16 @@ ja: | |||
|         undo: 元に戻す | ||||
|       title: ドメインブロック | ||||
|       undo: 元に戻す | ||||
|     email_domain_blocks: | ||||
|       add_new: 新規追加 | ||||
|       created_msg: 処理を完了しました | ||||
|       delete: 消去 | ||||
|       destroyed_msg: 消去しました | ||||
|       domain: ドメイン | ||||
|       new: | ||||
|         create: ブロックを作成 | ||||
|         title: 新規メールドメインブロック | ||||
|       title: メールドメインブロック | ||||
|     instances: | ||||
|       account_count: 既知のアカウント数 | ||||
|       domain_name: ドメイン名 | ||||
|  |  | |||
|  | @ -26,6 +26,7 @@ SimpleNavigation::Configuration.run do |navigation| | |||
|       admin.item :instances, safe_join([fa_icon('cloud fw'), t('admin.instances.title')]), admin_instances_url, highlights_on: %r{/admin/instances} | ||||
|       admin.item :subscriptions, safe_join([fa_icon('paper-plane-o fw'), t('admin.subscriptions.title')]), admin_subscriptions_url | ||||
|       admin.item :domain_blocks, safe_join([fa_icon('lock fw'), t('admin.domain_blocks.title')]), admin_domain_blocks_url, highlights_on: %r{/admin/domain_blocks} | ||||
|       admin.item :email_domain_blocks, safe_join([fa_icon('envelope fw'), t('admin.email_domain_blocks.title')]), admin_email_domain_blocks_url, highlights_on: %r{/admin/email_domain_blocks} | ||||
|       admin.item :sidekiq, safe_join([fa_icon('diamond fw'), 'Sidekiq']), sidekiq_url, link_html: { target: 'sidekiq' } | ||||
|       admin.item :pghero, safe_join([fa_icon('database fw'), 'PgHero']), pghero_url, link_html: { target: 'pghero' } | ||||
|       admin.item :settings, safe_join([fa_icon('cogs fw'), t('admin.settings.title')]), edit_admin_settings_url | ||||
|  |  | |||
|  | @ -108,6 +108,7 @@ Rails.application.routes.draw do | |||
|   namespace :admin do | ||||
|     resources :subscriptions, only: [:index] | ||||
|     resources :domain_blocks, only: [:index, :new, :create, :show, :destroy] | ||||
|     resources :email_domain_blocks, only: [:index, :new, :create, :destroy] | ||||
|     resource :settings, only: [:edit, :update] | ||||
| 
 | ||||
|     resources :instances, only: [:index] do | ||||
|  |  | |||
							
								
								
									
										9
									
								
								db/migrate/20170928082043_create_email_domain_blocks.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								db/migrate/20170928082043_create_email_domain_blocks.rb
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,9 @@ | |||
| class CreateEmailDomainBlocks < ActiveRecord::Migration[5.1] | ||||
|   def change | ||||
|     create_table :email_domain_blocks do |t| | ||||
|       t.string :domain, null: false | ||||
| 
 | ||||
|       t.timestamps | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  | @ -10,7 +10,7 @@ | |||
| # | ||||
| # It's strongly recommended that you check this file into your version control system. | ||||
| 
 | ||||
| ActiveRecord::Schema.define(version: 20170927215609) do | ||||
| ActiveRecord::Schema.define(version: 20170928082043) do | ||||
| 
 | ||||
|   # These are extensions that must be enabled in order to support this database | ||||
|   enable_extension "plpgsql" | ||||
|  | @ -110,6 +110,12 @@ ActiveRecord::Schema.define(version: 20170927215609) do | |||
|     t.index ["domain"], name: "index_domain_blocks_on_domain", unique: true | ||||
|   end | ||||
| 
 | ||||
|   create_table "email_domain_blocks", force: :cascade do |t| | ||||
|     t.string "domain", null: false | ||||
|     t.datetime "created_at", null: false | ||||
|     t.datetime "updated_at", null: false | ||||
|   end | ||||
| 
 | ||||
|   create_table "favourites", force: :cascade do |t| | ||||
|     t.datetime "created_at", null: false | ||||
|     t.datetime "updated_at", null: false | ||||
|  |  | |||
|  | @ -0,0 +1,59 @@ | |||
| # frozen_string_literal: true | ||||
| 
 | ||||
| require 'rails_helper' | ||||
| 
 | ||||
| RSpec.describe Admin::EmailDomainBlocksController, type: :controller do | ||||
|   render_views | ||||
| 
 | ||||
|   before do | ||||
|     sign_in Fabricate(:user, admin: true), scope: :user | ||||
|   end | ||||
| 
 | ||||
|   describe 'GET #index' do | ||||
|     around do |example| | ||||
|       default_per_page = EmailDomainBlock.default_per_page | ||||
|       EmailDomainBlock.paginates_per 1 | ||||
|       example.run | ||||
|       EmailDomainBlock.paginates_per default_per_page | ||||
|     end | ||||
| 
 | ||||
|     it 'renders email blacks' do | ||||
|       2.times { Fabricate(:email_domain_block) } | ||||
| 
 | ||||
|       get :index, params: { page: 2 } | ||||
| 
 | ||||
|       assigned = assigns(:email_domain_blocks) | ||||
|       expect(assigned.count).to eq 1 | ||||
|       expect(assigned.klass).to be EmailDomainBlock | ||||
|       expect(response).to have_http_status(:success) | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'GET #new' do | ||||
|     it 'assigns a new email black' do | ||||
|       get :new | ||||
| 
 | ||||
|       expect(assigns(:email_domain_block)).to be_instance_of(EmailDomainBlock) | ||||
|       expect(response).to have_http_status(:success) | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'POST #create' do | ||||
|     it 'blocks the domain when succeeded to save' do | ||||
|       post :create, params: { email_domain_block: { domain: 'example.com'} } | ||||
| 
 | ||||
|       expect(flash[:notice]).to eq I18n.t('admin.email_domain_blocks.created_msg') | ||||
|       expect(response).to redirect_to(admin_email_domain_blocks_path) | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'DELETE #destroy' do | ||||
|     it 'unblocks the domain' do | ||||
|       email_domain_block = Fabricate(:email_domain_block) | ||||
|       delete :destroy, params: { id: email_domain_block.id }  | ||||
| 
 | ||||
|       expect(flash[:notice]).to eq I18n.t('admin.email_domain_blocks.destroyed_msg') | ||||
|       expect(response).to redirect_to(admin_email_domain_blocks_path) | ||||
|     end | ||||
|   end | ||||
| end | ||||
							
								
								
									
										3
									
								
								spec/fabricators/email_domain_block_fabricator.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								spec/fabricators/email_domain_block_fabricator.rb
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,3 @@ | |||
| Fabricator(:email_domain_block) do | ||||
|   domain { sequence(:domain) { |i| "#{i}#{Faker::Internet.domain_name}" } } | ||||
| end | ||||
							
								
								
									
										21
									
								
								spec/models/email_domain_block_spec.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								spec/models/email_domain_block_spec.rb
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | |||
| require 'rails_helper' | ||||
| 
 | ||||
| RSpec.describe EmailDomainBlock, type: :model do | ||||
|   describe 'validations' do | ||||
|     it 'has a valid fabricator' do | ||||
|       email_domain_block = Fabricate.build(:email_domain_block) | ||||
|       expect(email_domain_block).to be_valid | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   describe 'block?' do | ||||
|     it 'returns true if the domain is registed' do | ||||
|       Fabricate(:email_domain_block, domain: 'example.com') | ||||
|       expect(EmailDomainBlock.block?('nyarn@example.com')).to eq true | ||||
|     end | ||||
|     it 'returns true if the domain is not registed' do | ||||
|       Fabricate(:email_domain_block, domain: 'domain') | ||||
|       expect(EmailDomainBlock.block?('example')).to eq false | ||||
|     end | ||||
|   end | ||||
| end | ||||
		Loading…
	
	Add table
		
		Reference in a new issue