From fdd1ae6aef960258567d32abc2ad74da3c7c571b Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Mon, 30 Nov 2015 21:27:08 +0200 Subject: [PATCH] Story#109070142 - Nameservers validations --- app/models/depp/domain.rb | 7 ++++-- app/models/nameserver.rb | 47 ++++++++++++++++++++++++++------------- 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/app/models/depp/domain.rb b/app/models/depp/domain.rb index 05c1698fc..a4d30dd73 100644 --- a/app/models/depp/domain.rb +++ b/app/models/depp/domain.rb @@ -136,6 +136,8 @@ module Depp # rubocop:disable Metrics/MethodLength # rubocop:disable Metrics/AbcSize def construct_params_from_server_data(data) + Rails.logger.fatal("NNNNN: #{data.class}") + Rails.logger.fatal("NNNNN: #{data}") ret = default_params ret[:name] = data.css('name').text ret[:registrant] = data.css('registrant').text @@ -145,10 +147,11 @@ module Depp end data.css('hostAttr').each_with_index do |x, i| + Rails.logger.fatal("QQQQQ: #{x.css('hostAddr[ip="v4"]')}") ret[:nameservers_attributes][i] = { hostname: x.css('hostName').text, - ipv4: x.css('hostAddr[ip="v4"]').text, - ipv6: x.css('hostAddr[ip="v6"]').text + ipv4: Array(x.css('hostAddr[ip="v4"]')).map(&:text).join(','), + ipv6: Array(x.css('hostAddr[ip="v6"]')).map(&:text).join(',') } end diff --git a/app/models/nameserver.rb b/app/models/nameserver.rb index 619881be4..ac3e1f4b4 100644 --- a/app/models/nameserver.rb +++ b/app/models/nameserver.rb @@ -9,8 +9,10 @@ class Nameserver < ActiveRecord::Base # rubocop: disable Metrics/LineLength validates :hostname, format: { with: /\A(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])\z/ } - validates :ipv4, format: { with: /\A(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\z/, allow_blank: true } - validates :ipv6, format: { with: /(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/, allow_blank: true } + # validates :ipv4, format: { with: /\A(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\z/, allow_blank: true } + # validates :ipv6, format: { with: /(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/, allow_blank: true } + validate :val_ipv4 + validate :val_ipv6 # rubocop: enable Metrics/LineLength before_validation :normalize_attributes @@ -19,30 +21,43 @@ class Nameserver < ActiveRecord::Base def epp_code_map { - '2302' => [ - [:hostname, :taken, { value: { obj: 'hostAttr', val: hostname } }] - ], - '2005' => [ - [:hostname, :invalid, { value: { obj: 'hostAttr', val: hostname } }], - [:ipv4, :invalid, { value: { obj: 'hostAddr', val: ipv4 } }], - [:ipv6, :invalid, { value: { obj: 'hostAddr', val: ipv6 } }] - ], - '2306' => [ - [:ipv4, :blank] - ] + '2302' => [ + [:hostname, :taken, { value: { obj: 'hostAttr', val: hostname } }] + ], + '2005' => [ + [:hostname, :invalid, { value: { obj: 'hostAttr', val: hostname } }], + [:ipv4, :invalid, { value: { obj: 'hostAddr', val: ipv4 } }], + [:ipv6, :invalid, { value: { obj: 'hostAddr', val: ipv6 } }] + ], + '2306' => [ + [:ipv4, :blank] + ] } end def normalize_attributes self.hostname = hostname.try(:strip).try(:downcase) self.ipv4 = Array(ipv4).reject(&:blank?).map(&:strip) - self.ipv6 = Array(ipv4).reject(&:blank?).map(&:strip).map(&:upcase) + self.ipv6 = Array(ipv6).reject(&:blank?).map(&:strip).map(&:upcase) end def to_s hostname end + def val_ipv4 + regexp = /\A(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\z/ + ipv4.to_a.each do |ip| + errors.add(:ipv4, :invalid) unless ip =~ regexp + end + end + def val_ipv6 + regexp = /(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/ + ipv6.to_a.each do |ip| + errors.add(:ipv6, :invalid) unless ip =~ regexp + end + end + class << self def replace_hostname_ends(domains, old_end, new_end) domains = domains.where('EXISTS( @@ -58,8 +73,8 @@ class Nameserver < ActiveRecord::Base hn = ns.hostname.chomp(old_end) ns_attrs[:nameservers_attributes] << { - id: ns.id, - hostname: "#{hn}#{new_end}" + id: ns.id, + hostname: "#{hn}#{new_end}" } end