Skip to content
Permalink
Browse files

Fix crash when saving invalid domain name (#11528)

Fix #7629
  • Loading branch information...
Gargron committed Aug 8, 2019
1 parent 699db45 commit 7a1f8a58df7edeb4f1d03c9dd3c25d5370d858a6
@@ -15,7 +15,7 @@ class AccountDomainBlock < ApplicationRecord
include DomainNormalizable

belongs_to :account
validates :domain, presence: true, uniqueness: { scope: :account_id }
validates :domain, presence: true, uniqueness: { scope: :account_id }, domain: true

after_commit :remove_blocking_cache
after_commit :remove_relationship_cache
@@ -4,7 +4,7 @@ module DomainNormalizable
extend ActiveSupport::Concern

included do
before_validation :normalize_domain
before_save :normalize_domain
end

private
@@ -13,7 +13,7 @@
class DomainAllow < ApplicationRecord
include DomainNormalizable

validates :domain, presence: true, uniqueness: true
validates :domain, presence: true, uniqueness: true, domain: true

scope :matches_domain, ->(value) { where(arel_table[:domain].matches("%#{value}%")) }

@@ -19,7 +19,7 @@ class DomainBlock < ApplicationRecord

enum severity: [:silence, :suspend, :noop]

validates :domain, presence: true, uniqueness: true
validates :domain, presence: true, uniqueness: true, domain: true

has_many :accounts, foreign_key: :domain, primary_key: :domain
delegate :count, to: :accounts, prefix: true
@@ -12,7 +12,7 @@
class EmailDomainBlock < ApplicationRecord
include DomainNormalizable

validates :domain, presence: true, uniqueness: true
validates :domain, presence: true, uniqueness: true, domain: true

def self.block?(email)
_, domain = email.split('@', 2)
@@ -0,0 +1,17 @@
# frozen_string_literal: true

class DomainValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
return if value.blank?

record.errors.add(attribute, I18n.t('domain_validator.invalid_domain')) unless compliant?(value)
end

private

def compliant?(value)
Addressable::URI.new.tap { |uri| uri.host = value }
rescue Addressable::URI::InvalidURIError
false
end
end
@@ -628,6 +628,8 @@ en:
people:
one: "%{count} person"
other: "%{count} people"
domain_validator:
invalid_domain: is not a valid domain name
errors:
'403': You don't have permission to view this page.
'404': The page you are looking for isn't here.

0 comments on commit 7a1f8a5

Please sign in to comment.
You can’t perform that action at this time.