From 1b22e17a94135dc6e27f9f7f815a329ab1c8ddee Mon Sep 17 00:00:00 2001 From: Artur Beljajev Date: Thu, 22 Feb 2018 08:57:20 +0200 Subject: [PATCH] Add glue record requirement validation #661 --- app/models/nameserver.rb | 12 ++++++++++ config/locales/nameservers.en.yml | 8 +++++++ test/models/nameserver/glue_record_test.rb | 26 ++++++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 config/locales/nameservers.en.yml create mode 100644 test/models/nameserver/glue_record_test.rb diff --git a/app/models/nameserver.rb b/app/models/nameserver.rb index 6c990dc8e..849a026e4 100644 --- a/app/models/nameserver.rb +++ b/app/models/nameserver.rb @@ -8,6 +8,7 @@ class Nameserver < ActiveRecord::Base validates :hostname, presence: true, format: { with: /\A(([a-zA-Z0-9]|[a-zA-ZäöüõšžÄÖÜÕŠŽ0-9][a-zA-ZäöüõšžÄÖÜÕŠŽ0-9\-]*[a-zA-ZäöüõšžÄÖÜÕŠŽ0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])\z/ } validate :val_ipv4 validate :val_ipv6 + validate :require_ip, if: :glue_record_required? # rubocop: enable Metrics/LineLength before_validation :normalize_attributes @@ -86,4 +87,15 @@ class Nameserver < ActiveRecord::Base pluck(:hostname) end end + + private + + def require_ip + errors.add(:base, :ip_required) if ipv4.blank? && ipv6.blank? + end + + def glue_record_required? + return unless hostname? && domain + hostname.end_with?(domain.name) + end end diff --git a/config/locales/nameservers.en.yml b/config/locales/nameservers.en.yml new file mode 100644 index 000000000..82a6d045e --- /dev/null +++ b/config/locales/nameservers.en.yml @@ -0,0 +1,8 @@ +en: + activemodel: + errors: + models: + nameserver: + attributes: + base: + ip_required: At least one IPv4 or IPv6 is required diff --git a/test/models/nameserver/glue_record_test.rb b/test/models/nameserver/glue_record_test.rb new file mode 100644 index 000000000..5f162cb2b --- /dev/null +++ b/test/models/nameserver/glue_record_test.rb @@ -0,0 +1,26 @@ +require 'test_helper' + +class NameserverGlueRecordTest < ActiveSupport::TestCase + def setup + @nameserver = nameservers(:ns1) + end + + def test_invalid_without_ip_if_glue_record_is_required + @nameserver.hostname = 'ns1.shop.test' + @nameserver.ipv4 = @nameserver.ipv6 = '' + assert @nameserver.invalid? + assert @nameserver.errors.added?(:base, :ip_required) + end + + def test_valid_with_ip_if_glue_record_is_required + @nameserver.hostname = 'ns1.shop.test' + @nameserver.ipv4 = ['192.0.2.1'] + @nameserver.ipv6 = '' + assert @nameserver.valid? + end + + def test_valid_without_ip_if_glue_record_is_not_required + @nameserver.ipv4 = @nameserver.ipv6 = '' + assert @nameserver.valid? + end +end