]> cat aescling's git repositories - mastodon.git/commitdiff
Adding configurable e-mail blacklist
authorEugen Rochko <eugen@zeonfederated.com>
Sun, 4 Dec 2016 18:07:02 +0000 (19:07 +0100)
committerEugen Rochko <eugen@zeonfederated.com>
Sun, 4 Dec 2016 18:07:02 +0000 (19:07 +0100)
app/lib/email_validator.rb [new file with mode: 0644]
app/models/user.rb
config/initializers/blacklists.rb [new file with mode: 0644]
config/initializers/ostatus.rb
config/initializers/paperclip.rb
config/locales/en.yml

diff --git a/app/lib/email_validator.rb b/app/lib/email_validator.rb
new file mode 100644 (file)
index 0000000..856b8b1
--- /dev/null
@@ -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
index 423833d471cd86fd0fc4335a28a26e46cfeb5294..3fc028a6a4544bb68627d7d3ceda5880d506d193 100644 (file)
@@ -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 (file)
index 0000000..52646e6
--- /dev/null
@@ -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
index 4ba432b6a93813aa924ee35980b060b415f1f67c..c5723b2e948538fc46a97ab004a9d17b094505b9 100644 (file)
@@ -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' }
index 61bb52480dbe10f241110c0bca2384fcfa4911ee..93822a2d19d8405bf083a1ecc1d1863563c9d62a 100644 (file)
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 if ENV['S3_ENABLED'] == 'true'
   Aws.eager_autoload!(services: %w(S3))
 
index 426f3928a18fb75aa2e3be054e8498917bd14cea..50a1f0e9552e559c88624d25a6ce3f964333d108 100644 (file)
@@ -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;"