diff --git a/app/models/csync_record.rb b/app/models/csync_record.rb index b4893c7d1..c31418364 100644 --- a/app/models/csync_record.rb +++ b/app/models/csync_record.rb @@ -90,13 +90,19 @@ class CsyncRecord < ApplicationRecord def validate_unique_pub_key return false unless domain return true if disable_requested? - return true unless domain.dnskeys.where(public_key: dnskey.public_key).any? + return true unless dnskey_already_present? errors.add(:public_key, 'already tied to this domain') end + # since dnskeys stored in DB may include whitespace chars, we could not find them by + # 'where' clause using dnskey.public_key being stripped of whitespaces by csync generator + def dnskey_already_present? + domain.dnskeys.pluck(:public_key).map { |key| key.gsub(/\s+/, '') }.include? dnskey.public_key + end + def self.by_domain_name(domain_name) - domain = Domain.find_by(name: domain_name) + domain = Domain.find_by(name: domain_name) || Domain.find_by(name_puny: domain_name) log.info "CsyncRecord: '#{domain_name}' not in zone. Not initializing record." unless domain CsyncRecord.find_or_initialize_by(domain: domain) if domain end @@ -112,8 +118,11 @@ class CsyncRecord < ApplicationRecord end def log - @log ||= Rails.env.test? ? logger : Logger.new(STDOUT) - @log + self.class.log + end + + def self.log + Rails.env.test? ? logger : Logger.new(STDOUT) end def validate_csync_action diff --git a/test/fixtures/dnskeys.yml b/test/fixtures/dnskeys.yml index 218c14ba6..b740a6ec0 100644 --- a/test/fixtures/dnskeys.yml +++ b/test/fixtures/dnskeys.yml @@ -8,3 +8,13 @@ one: ds_alg: 13 ds_digest_type: 2 ds_digest: 39456058862EA09DD96992ED2BDAFAEDE8C7E949589E3DA903A46F4F9CD373EA +with_whitespace: + domain: + flags: 257 + protocol: 3 + alg: 13 + public_key: mdsswUyr3DPW132mOi8V9xE SWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ== + ds_key_tag: 2371 + ds_alg: 13 + ds_digest_type: 2 + ds_digest: 39456058862EA09DD96992ED2BDAFAEDE8C7E949589E3DA903A46F4F9CD373EA diff --git a/test/fixtures/files/cdns_output.txt b/test/fixtures/files/cdns_output.txt index 9299ec195..1863326ab 100644 --- a/test/fixtures/files/cdns_output.txt +++ b/test/fixtures/files/cdns_output.txt @@ -2,3 +2,5 @@ insecure-empty ns1.bestnames.test 127.0.0.1 airport.test insecure-empty ns2.bestnames.test 127.0.0.1 airport.test insecure ns1.bestnames.test 127.0.0.1 shop.test 257 3 13 mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ== insecure ns2.bestnames.test 127.0.0.1 shop.test 257 3 13 mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ== +secure library.test 257 3 13 mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ== +secure library.test 257 3 13 mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ== diff --git a/test/jobs/csync_job_test.rb b/test/jobs/csync_job_test.rb index c015f66a3..2c1ed4936 100644 --- a/test/jobs/csync_job_test.rb +++ b/test/jobs/csync_job_test.rb @@ -89,4 +89,24 @@ class CsyncJobTest < ActiveSupport::TestCase end end end + + def test_does_not_update_if_whitespaces_in_dnskey + @dnskey = dnskeys(:with_whitespace) + @domain = domains(:library) + @dnskey.domain_id = @domain.id + @dnskey.save(validate: false) + pubkey = @dnskey.public_key + + CsyncJob.perform_now + @domain.reload + + 2.times do + CsyncJob.perform_now + end + + @domain.reload + @dnskey.reload + assert_equal @dnskey, @domain.dnskeys.last + assert_equal pubkey, @domain.dnskeys.last.public_key + end end