diff --git a/app/jobs/validate_dnssec_job.rb b/app/jobs/validate_dnssec_job.rb index b5357bead..07728eff1 100644 --- a/app/jobs/validate_dnssec_job.rb +++ b/app/jobs/validate_dnssec_job.rb @@ -63,6 +63,7 @@ class ValidateDnssecJob < ApplicationJob logger.info "-----------" response_container = parse_response(answer) + compare_dnssec_data(response_container: response_container, domain: domain) rescue Exception => e logger.error "#{e.message} - domain name: #{domain.name} - hostname: #{hostname}" @@ -76,6 +77,7 @@ class ValidateDnssecJob < ApplicationJob flag = make_magic(response_container: response_container, dnskey: key) text = "#{key.flags} - #{key.protocol} - #{key.alg} - #{key.public_key}" + if flag key.validation_datetime = Time.zone.now key.save @@ -98,7 +100,9 @@ class ValidateDnssecJob < ApplicationJob def parse_response(answer) response_container = [] + answer.each_answer do |a| + a_string = a.to_s a_string = a_string.gsub /\t/, ' ' a_string = a_string.split(' ') diff --git a/test/jobs/validate_dnssec_job_test.rb b/test/jobs/validate_dnssec_job_test.rb index d8207492c..cd207e03a 100644 --- a/test/jobs/validate_dnssec_job_test.rb +++ b/test/jobs/validate_dnssec_job_test.rb @@ -1,42 +1,71 @@ -$VERBOSE=nil require 'test_helper' +class ZoneAnswer + def initialize(valid_response: true) + @answer = [] + + algorithm = OpenStruct.new(code: 13) + + answer = OpenStruct.new + answer.data = "some0 some1 some2 257 some4 some5 some6 mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ== some" + answer.flags = 257 + answer.protocol = 3 + answer.protocol = 7 unless valid_response + answer.algorithm = algorithm + + @answer << answer + end + + def each_answer + @answer.each {|rec| + yield rec + } + end +end + class ValidateDnssecJobTest < ActiveJob::TestCase setup do @domain = domains(:shop) @dnskey = dnskeys(:one) end - def test_job_should_return_successfully_validated_dnskeys - # @domain.dnskeys << @dnskey - # @domain.save - # @domain.reload - # - # mock_zone_data = [ - # { - # flags: @dnskey.flags, - # protocol: @dnskey.protocol, - # alg: @dnskey.alg, - # public_key: @dnskey.public_key - # }] - # - # resolver = Spy.mock(Dnsruby::Recursor) - # Spy.on(resolver, :query).and_return true - # Spy.on_instance_method(ValidateDnssecJob, :parse_response).and_return(mock_zone_data) - # # Spy.on_instance_method(ValidateDnssecJob, :prepare_validator).and_return(true) - # - # - # ValidateDnssecJob.perform_now(domain_name: @domain.name) - # - # @domain.reload - # p @domain.dnskeys + def test_job_should_set_validation_datetime_if_validation_is_valid + @domain.nameservers.each do |n| + n.update(validation_datetime: Time.zone.now - 1.minute) + end + @domain.dnskeys << @dnskey + @domain.save + + @domain.reload + + mock_zone_data = ZoneAnswer.new + + Spy.on_instance_method(ValidateDnssecJob, :prepare_validator).and_return(Dnsruby::Resolver.new) + Spy.on_instance_method(Dnsruby::Resolver, :query).and_return(mock_zone_data) + + ValidateDnssecJob.perform_now(domain_name: @domain.name) + + @domain.reload + assert_not_nil @domain.dnskeys.first.validation_datetime end - # def test_job_discarded_after_error - # assert_no_enqueued_jobs - # assert_performed_jobs 1 do - # TestDiscardedJob.perform_later - # end - # assert_no_enqueued_jobs - # end + def test_job_should_not_set_validation_datetime_if_validation_is_invalid + @domain.nameservers.each do |n| + n.update(validation_datetime: Time.zone.now - 1.minute) + end + @domain.dnskeys << @dnskey + @domain.save + + @domain.reload + + mock_zone_data = ZoneAnswer.new(valid_response: false) + + Spy.on_instance_method(ValidateDnssecJob, :prepare_validator).and_return(Dnsruby::Resolver.new) + Spy.on_instance_method(Dnsruby::Resolver, :query).and_return(mock_zone_data) + + ValidateDnssecJob.perform_now(domain_name: @domain.name) + + @domain.reload + assert_nil @domain.dnskeys.first.validation_datetime + end end