about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2016-12-04 19:07:02 +0100
committerEugen Rochko <eugen@zeonfederated.com>2016-12-04 19:07:02 +0100
commitb362de2232da2518381df51ceb71166d0693dd6f (patch)
treed2d23adb9e5bc3e3e64a794256fa7990b0fb82ed
parent41b4be699fa5908dee13f0ceed391f88e2923853 (diff)
Adding configurable e-mail blacklist
-rw-r--r--app/lib/email_validator.rb18
-rw-r--r--app/models/user.rb1
-rw-r--r--config/initializers/blacklists.rb5
-rw-r--r--config/initializers/ostatus.rb4
-rw-r--r--config/initializers/paperclip.rb2
-rw-r--r--config/locales/en.yml2
6 files changed, 31 insertions, 1 deletions
diff --git a/app/lib/email_validator.rb b/app/lib/email_validator.rb
new file mode 100644
index 000000000..856b8b1f7
--- /dev/null
+++ b/app/lib/email_validator.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class EmailValidator < ActiveModel::EachValidator
+  def validate_each(record, attribute, value)
+    return if Rails.configuration.x.email_domains_blacklist.empty?
+
+    record.errors.add(attribute, I18n.t('users.invalid_email')) if blocked_email?(value)
+  end
+
+  private
+
+  def blocked_email?(value)
+    domains = Rails.configuration.x.email_domains_blacklist.gsub('.', '\.')
+    regexp  = Regexp.new("@(.+\\.)?(#{domains})", true)
+
+    value =~ regexp
+  end
+end
diff --git a/app/models/user.rb b/app/models/user.rb
index 423833d47..3fc028a6a 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -8,6 +8,7 @@ class User < ApplicationRecord
 
   validates :account, presence: true
   validates :locale, inclusion: I18n.available_locales.map(&:to_s), unless: 'locale.nil?'
+  validates :email, email: true
 
   scope :prolific, -> { joins('inner join statuses on statuses.account_id = users.account_id').select('users.*, count(statuses.id) as statuses_count').group('users.id').order('statuses_count desc') }
   scope :recent,   -> { order('id desc') }
diff --git a/config/initializers/blacklists.rb b/config/initializers/blacklists.rb
new file mode 100644
index 000000000..52646e64d
--- /dev/null
+++ b/config/initializers/blacklists.rb
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+Rails.application.configure do
+  config.x.email_domains_blacklist = ENV.fetch('EMAIL_DOMAIN_BLACKLIST') { 'mvrht.com' }
+end
diff --git a/config/initializers/ostatus.rb b/config/initializers/ostatus.rb
index 4ba432b6a..c5723b2e9 100644
--- a/config/initializers/ostatus.rb
+++ b/config/initializers/ostatus.rb
@@ -1,7 +1,9 @@
+# frozen_string_literal: true
+
 port  = ENV.fetch('PORT') { 3000 }
 host  = ENV.fetch('LOCAL_DOMAIN') { "localhost:#{port}" }
 https = ENV['LOCAL_HTTPS'] == 'true'
-  
+
 Rails.application.configure do
   config.x.local_domain = host
   config.x.hub_url      = ENV.fetch('HUB_URL') { 'https://pubsubhubbub.superfeedr.com' }
diff --git a/config/initializers/paperclip.rb b/config/initializers/paperclip.rb
index 61bb52480..93822a2d1 100644
--- a/config/initializers/paperclip.rb
+++ b/config/initializers/paperclip.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 if ENV['S3_ENABLED'] == 'true'
   Aws.eager_autoload!(services: %w(S3))
 
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 426f3928a..50a1f0e95 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -55,5 +55,7 @@ en:
   stream_entries:
     favourited: favourited a post by
     is_now_following: is now following
+  users:
+    invalid_email: The e-mail address is invalid
   will_paginate:
     page_gap: "&hellip;"