From daac2977d02e534446000485ed2c8c31f38817ab Mon Sep 17 00:00:00 2001 From: Alex Sherman Date: Thu, 2 Jul 2020 14:00:10 +0500 Subject: [PATCH] Add support of single-character domains --- app/validators/domain_name_validator.rb | 9 +++++++-- ...9_fill_single_characted_blocked_domains.rb | 20 +++++++++++++++++++ test/models/domain_test.rb | 5 +---- 3 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 db/data/20200702074549_fill_single_characted_blocked_domains.rb diff --git a/app/validators/domain_name_validator.rb b/app/validators/domain_name_validator.rb index 2652c44d6..3372bb952 100644 --- a/app/validators/domain_name_validator.rb +++ b/app/validators/domain_name_validator.rb @@ -1,4 +1,6 @@ class DomainNameValidator < ActiveModel::EachValidator + # rubocop:disable Metrics/CyclomaticComplexity + # rubocop:disable Metrics/LineLength def validate_each(record, attribute, value) if !self.class.validate_format(value) record.errors[attribute] << (options[:message] || record.errors.generate_message(attribute, :invalid)) @@ -27,8 +29,9 @@ class DomainNameValidator < ActiveModel::EachValidator end unicode_chars = /\u00E4\u00F5\u00F6\u00FC\u0161\u017E/ # äõöüšž - regexp = /\A[a-zA-Z0-9#{unicode_chars.source}][a-zA-Z0-9#{unicode_chars.source}-]{0,61}[a-zA-Z0-9#{unicode_chars.source}]\.#{general_domains.source}\z/ - !!(value =~ regexp) + regexp = /\A[a-zA-Z0-9#{unicode_chars.source}][a-zA-Z0-9#{unicode_chars.source}-]{0,62}\.#{general_domains.source}\z/ + end_regexp = /\-\.#{general_domains.source}\z/ # should not contain dash as a closing char + !!(value =~ regexp && value !~ end_regexp) end def validate_blocked(value) @@ -39,4 +42,6 @@ class DomainNameValidator < ActiveModel::EachValidator DNS::Zone.where(origin: value).count.zero? end end + # rubocop:enable Metrics/CyclomaticComplexity + # rubocop:enable Metrics/LineLength end diff --git a/db/data/20200702074549_fill_single_characted_blocked_domains.rb b/db/data/20200702074549_fill_single_characted_blocked_domains.rb new file mode 100644 index 000000000..da8bac9be --- /dev/null +++ b/db/data/20200702074549_fill_single_characted_blocked_domains.rb @@ -0,0 +1,20 @@ +class FillSingleCharactedBlockedDomains < ActiveRecord::Migration[6.0] + + DOMAIN_NAMES = %w[a.ee b.ee c.ee d.ee e.ee f.ee g.ee h.ee i.ee j.ee k.ee l.ee m.ee n.ee o.ee + p.ee q.ee r.ee s.ee š.ee z.ee ž.ee t.ee u.ee v.ee w.ee õ.ee ä.ee ö.ee ü.ee + x.ee y.ee 0.ee 1.ee 2.ee 3.ee 4.ee 5.ee 6.ee 7.ee 8.ee 9.ee].freeze + + def up + BlockedDomain.transaction do + DOMAIN_NAMES.each do |name| + BlockedDomain.find_or_create_by(name: name) + end + end + end + + def down + BlockedDomain.transaction do + BlockedDomain.by_domain(DOMAIN_NAMES).delete_all + end + end +end diff --git a/test/models/domain_test.rb b/test/models/domain_test.rb index 8bac6d7ab..83e12118d 100644 --- a/test/models/domain_test.rb +++ b/test/models/domain_test.rb @@ -31,7 +31,7 @@ class DomainTest < ActiveSupport::TestCase def test_validates_name_format assert_equal dns_zones(:one).origin, 'test' domain = valid_domain - subdomain_min_length = 2 + subdomain_min_length = 1 subdomain_max_length = 63 domain.name = '!invalid' @@ -46,9 +46,6 @@ class DomainTest < ActiveSupport::TestCase domain.name = 'example-.test' assert domain.invalid? - domain.name = "#{'a' * subdomain_min_length.pred}.test" - assert domain.invalid? - domain.name = "#{'a' * subdomain_max_length.next}.test" assert domain.invalid?