Story#109070142 - Nameservers validations

This commit is contained in:
Vladimir Krylov 2015-11-30 21:27:08 +02:00
parent 539a40b34c
commit fdd1ae6aef
2 changed files with 36 additions and 18 deletions

View file

@ -136,6 +136,8 @@ module Depp
# rubocop:disable Metrics/MethodLength # rubocop:disable Metrics/MethodLength
# rubocop:disable Metrics/AbcSize # rubocop:disable Metrics/AbcSize
def construct_params_from_server_data(data) def construct_params_from_server_data(data)
Rails.logger.fatal("NNNNN: #{data.class}")
Rails.logger.fatal("NNNNN: #{data}")
ret = default_params ret = default_params
ret[:name] = data.css('name').text ret[:name] = data.css('name').text
ret[:registrant] = data.css('registrant').text ret[:registrant] = data.css('registrant').text
@ -145,10 +147,11 @@ module Depp
end end
data.css('hostAttr').each_with_index do |x, i| data.css('hostAttr').each_with_index do |x, i|
Rails.logger.fatal("QQQQQ: #{x.css('hostAddr[ip="v4"]')}")
ret[:nameservers_attributes][i] = { ret[:nameservers_attributes][i] = {
hostname: x.css('hostName').text, hostname: x.css('hostName').text,
ipv4: x.css('hostAddr[ip="v4"]').text, ipv4: Array(x.css('hostAddr[ip="v4"]')).map(&:text).join(','),
ipv6: x.css('hostAddr[ip="v6"]').text ipv6: Array(x.css('hostAddr[ip="v6"]')).map(&:text).join(',')
} }
end end

View file

@ -9,8 +9,10 @@ class Nameserver < ActiveRecord::Base
# rubocop: disable Metrics/LineLength # 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 :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 :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 :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 # rubocop: enable Metrics/LineLength
before_validation :normalize_attributes before_validation :normalize_attributes
@ -19,30 +21,43 @@ class Nameserver < ActiveRecord::Base
def epp_code_map def epp_code_map
{ {
'2302' => [ '2302' => [
[:hostname, :taken, { value: { obj: 'hostAttr', val: hostname } }] [:hostname, :taken, { value: { obj: 'hostAttr', val: hostname } }]
], ],
'2005' => [ '2005' => [
[:hostname, :invalid, { value: { obj: 'hostAttr', val: hostname } }], [:hostname, :invalid, { value: { obj: 'hostAttr', val: hostname } }],
[:ipv4, :invalid, { value: { obj: 'hostAddr', val: ipv4 } }], [:ipv4, :invalid, { value: { obj: 'hostAddr', val: ipv4 } }],
[:ipv6, :invalid, { value: { obj: 'hostAddr', val: ipv6 } }] [:ipv6, :invalid, { value: { obj: 'hostAddr', val: ipv6 } }]
], ],
'2306' => [ '2306' => [
[:ipv4, :blank] [:ipv4, :blank]
] ]
} }
end end
def normalize_attributes def normalize_attributes
self.hostname = hostname.try(:strip).try(:downcase) self.hostname = hostname.try(:strip).try(:downcase)
self.ipv4 = Array(ipv4).reject(&:blank?).map(&:strip) 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 end
def to_s def to_s
hostname hostname
end 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 class << self
def replace_hostname_ends(domains, old_end, new_end) def replace_hostname_ends(domains, old_end, new_end)
domains = domains.where('EXISTS( domains = domains.where('EXISTS(
@ -58,8 +73,8 @@ class Nameserver < ActiveRecord::Base
hn = ns.hostname.chomp(old_end) hn = ns.hostname.chomp(old_end)
ns_attrs[:nameservers_attributes] << { ns_attrs[:nameservers_attributes] << {
id: ns.id, id: ns.id,
hostname: "#{hn}#{new_end}" hostname: "#{hn}#{new_end}"
} }
end end