Skip to content

Commit f90163c

Browse files
Gargronhiyuki2578
authored andcommitted
Fix crash when saving invalid domain name (mastodon#11528)
Fix mastodon#7629
1 parent e21fda8 commit f90163c

7 files changed

Lines changed: 24 additions & 5 deletions

File tree

app/models/account_domain_block.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class AccountDomainBlock < ApplicationRecord
1515
include DomainNormalizable
1616

1717
belongs_to :account
18-
validates :domain, presence: true, uniqueness: { scope: :account_id }
18+
validates :domain, presence: true, uniqueness: { scope: :account_id }, domain: true
1919

2020
after_commit :remove_blocking_cache
2121
after_commit :remove_relationship_cache

app/models/concerns/domain_normalizable.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ module DomainNormalizable
44
extend ActiveSupport::Concern
55

66
included do
7-
before_validation :normalize_domain
7+
before_save :normalize_domain
88
end
99

1010
private

app/models/domain_allow.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
class DomainAllow < ApplicationRecord
1414
include DomainNormalizable
1515

16-
validates :domain, presence: true, uniqueness: true
16+
validates :domain, presence: true, uniqueness: true, domain: true
1717

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

app/models/domain_block.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class DomainBlock < ApplicationRecord
1919

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

22-
validates :domain, presence: true, uniqueness: true
22+
validates :domain, presence: true, uniqueness: true, domain: true
2323

2424
has_many :accounts, foreign_key: :domain, primary_key: :domain
2525
delegate :count, to: :accounts, prefix: true

app/models/email_domain_block.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
class EmailDomainBlock < ApplicationRecord
1313
include DomainNormalizable
1414

15-
validates :domain, presence: true, uniqueness: true
15+
validates :domain, presence: true, uniqueness: true, domain: true
1616

1717
def self.block?(email)
1818
_, domain = email.split('@', 2)

app/validators/domain_validator.rb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# frozen_string_literal: true
2+
3+
class DomainValidator < ActiveModel::EachValidator
4+
def validate_each(record, attribute, value)
5+
return if value.blank?
6+
7+
record.errors.add(attribute, I18n.t('domain_validator.invalid_domain')) unless compliant?(value)
8+
end
9+
10+
private
11+
12+
def compliant?(value)
13+
Addressable::URI.new.tap { |uri| uri.host = value }
14+
rescue Addressable::URI::InvalidURIError
15+
false
16+
end
17+
end

config/locales/en.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,8 @@ en:
629629
people:
630630
one: "%{count} person"
631631
other: "%{count} people"
632+
domain_validator:
633+
invalid_domain: is not a valid domain name
632634
errors:
633635
'403': You don't have permission to view this page.
634636
'404': The page you are looking for isn't here.

0 commit comments

Comments
 (0)