mirror of
https://github.com/internetee/registry.git
synced 2025-05-17 01:47:18 +02:00
Merge pull request #142 from internetee/114677695-idn_support
114677695 idn support
This commit is contained in:
commit
67db21cb47
4 changed files with 73 additions and 2 deletions
|
@ -8,7 +8,7 @@ class Nameserver < ActiveRecord::Base
|
||||||
# scope :owned_by_registrar, -> (registrar) { joins(:domain).where('domains.registrar_id = ?', registrar.id) }
|
# scope :owned_by_registrar, -> (registrar) { joins(:domain).where('domains.registrar_id = ?', registrar.id) }
|
||||||
|
|
||||||
# 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-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/ }
|
||||||
# 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_ipv4
|
||||||
|
@ -16,7 +16,9 @@ class Nameserver < ActiveRecord::Base
|
||||||
# rubocop: enable Metrics/LineLength
|
# rubocop: enable Metrics/LineLength
|
||||||
|
|
||||||
before_validation :normalize_attributes
|
before_validation :normalize_attributes
|
||||||
|
before_validation :check_puny_symbols
|
||||||
|
before_validation :check_label_length
|
||||||
|
|
||||||
delegate :name, to: :domain, prefix: true
|
delegate :name, to: :domain, prefix: true
|
||||||
|
|
||||||
def epp_code_map
|
def epp_code_map
|
||||||
|
@ -26,6 +28,7 @@ class Nameserver < ActiveRecord::Base
|
||||||
],
|
],
|
||||||
'2005' => [
|
'2005' => [
|
||||||
[:hostname, :invalid, { value: { obj: 'hostAttr', val: hostname } }],
|
[:hostname, :invalid, { value: { obj: 'hostAttr', val: hostname } }],
|
||||||
|
[:hostname, :puny_to_long, { 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 } }]
|
||||||
],
|
],
|
||||||
|
@ -41,10 +44,26 @@ class Nameserver < ActiveRecord::Base
|
||||||
self.ipv6 = Array(ipv6).reject(&:blank?).map(&:strip).map(&:upcase)
|
self.ipv6 = Array(ipv6).reject(&:blank?).map(&:strip).map(&:upcase)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def check_label_length
|
||||||
|
hostname_puny.split('.').each do |label|
|
||||||
|
errors.add(:hostname, :puny_to_long) if label.length > 63
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def check_puny_symbols
|
||||||
|
regexp = /(\A|\.)..--/
|
||||||
|
errors.add(:hostname, :invalid) if hostname =~ regexp
|
||||||
|
end
|
||||||
|
|
||||||
def to_s
|
def to_s
|
||||||
hostname
|
hostname
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def hostname=(hostname)
|
||||||
|
self[:hostname] = SimpleIDN.to_unicode(hostname)
|
||||||
|
self[:hostname_puny] = SimpleIDN.to_ascii(hostname)
|
||||||
|
end
|
||||||
|
|
||||||
def val_ipv4
|
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/
|
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|
|
ipv4.to_a.each do |ip|
|
||||||
|
|
|
@ -131,6 +131,7 @@ en:
|
||||||
hostname:
|
hostname:
|
||||||
invalid: 'Hostname is invalid'
|
invalid: 'Hostname is invalid'
|
||||||
taken: 'Nameserver already exists on this domain'
|
taken: 'Nameserver already exists on this domain'
|
||||||
|
puny_to_long: 'Hostname puny label is too long (maximum is 63 characters)'
|
||||||
ipv4:
|
ipv4:
|
||||||
blank: 'IPv4 is missing'
|
blank: 'IPv4 is missing'
|
||||||
invalid: 'IPv4 is invalid'
|
invalid: 'IPv4 is invalid'
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
class AddPunyHostnameToNameserver < ActiveRecord::Migration
|
||||||
|
|
||||||
|
def change
|
||||||
|
|
||||||
|
add_column :nameservers, :hostname_puny, :string
|
||||||
|
execute "UPDATE nameservers n SET hostname_puny = n.hostname"
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
|
@ -71,5 +71,47 @@ namespace :convert do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
desc 'Convert nameservers hostname and hostname_puny'
|
||||||
|
task nameserves_hostname: :environment do
|
||||||
|
|
||||||
|
start = Time.zone.now.to_f
|
||||||
|
count = 0
|
||||||
|
puts '-----> Converting hostnames...'
|
||||||
|
|
||||||
|
Nameserver.find_each(:batch_size => 1000) do |ns|
|
||||||
|
ns.hostname = SimpleIDN.to_unicode(ns.hostname)
|
||||||
|
ns.hostname_puny = SimpleIDN.to_ascii(ns.hostname_puny)
|
||||||
|
ns.save validate: false
|
||||||
|
count += 1
|
||||||
|
puts "-----> Converted #{count} nameservers" if count % 1000 == 0
|
||||||
|
end
|
||||||
|
puts "-----> Converted #{count} nameservers #{(Time.zone.now.to_f - start).round(2)} seconds"
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
desc 'Convert nameservers history hostname'
|
||||||
|
task nameserves_history_hostname: :environment do
|
||||||
|
|
||||||
|
start = Time.zone.now.to_f
|
||||||
|
count = 0
|
||||||
|
puts '-----> Converting hostnames history...'
|
||||||
|
|
||||||
|
NameserverVersion.find_each do |ns|
|
||||||
|
if obj = ns.object
|
||||||
|
obj["hostname"] = SimpleIDN.to_unicode(obj["hostname"])
|
||||||
|
ns.object = obj
|
||||||
|
end
|
||||||
|
|
||||||
|
if (obj_c = ns.object_changes).present?
|
||||||
|
obj_c["name"].map!{|e| e ? SimpleIDN.to_unicode(e) : e } if obj_c["hostname"]
|
||||||
|
ns.object_changes = obj_c
|
||||||
|
end
|
||||||
|
count += 1
|
||||||
|
ns.save!
|
||||||
|
end
|
||||||
|
puts "-----> Converted #{count} history rows #{(Time.zone.now.to_f - start).round(2)} seconds"
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue