added soa nameserver validator

This commit is contained in:
olegphenomenon 2022-01-06 13:45:15 +02:00
parent 3f0c1211da
commit 57e653e9e6
3 changed files with 77 additions and 20 deletions

View file

@ -32,6 +32,10 @@ class ValidateDnssecJob < ApplicationJob
def iterate_nameservers(domain) def iterate_nameservers(domain)
domain.nameservers.each do |n| domain.nameservers.each do |n|
result_nameserver_validation = SoaNameserverQuery.validate(domain_name: domain.name, hostname: n.hostname)
return unless result_nameserver_validation
validate(hostname: n.hostname, domain: domain) validate(hostname: n.hostname, domain: domain)
notify_contacts(domain) notify_contacts(domain)

View file

@ -0,0 +1,49 @@
module SoaNameserverQuery
include Dnsruby
extend self
def validate(domain_name:, hostname:)
resolver = create_resolver(hostname)
answers = resolver.query(domain_name, 'SOA', 'IN')
answers.answer.each do |a|
if a.serial.nil?
logger.info "No serial number of nameserver found"
return false
end
serial_number = a.serial.to_s
p "-------------- >>"
p "serial number #{serial_number} of #{hostname} - domain name: #{domain_name}"
p "<< --------------"
true
end
rescue StandardError => e
logger.error e.message
logger.error "failed #{hostname} validation of #{domain_name} domain name"
false
end
private
def create_resolver(nameserver)
resolver = Dnsruby::Resolver.new
resolver.retry_times = 3
resolver.recurse = 0 # Send out non-recursive queries
# disable caching otherwise SOA is cached from first nameserver queried
resolver.do_caching = false
resolver.nameserver = nameserver
resolver
end
def logger
@logger ||= Rails.logger
end
end

View file

@ -7,7 +7,7 @@ class ValidateDnssecJobTest < ActiveJob::TestCase
@dnskey = dnskeys(:one) @dnskey = dnskeys(:one)
end end
# def test_job_should_return_successfully_validated_dnskeys def test_job_should_return_successfully_validated_dnskeys
# @domain.dnskeys << @dnskey # @domain.dnskeys << @dnskey
# @domain.save # @domain.save
# @domain.reload # @domain.reload
@ -20,13 +20,17 @@ class ValidateDnssecJobTest < ActiveJob::TestCase
# public_key: @dnskey.public_key # 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, :parse_response).and_return(mock_zone_data)
# # Spy.on_instance_method(ValidateDnssecJob, :prepare_validator).and_return(true)
#
# #
# ValidateDnssecJob.perform_now(domain_name: @domain.name) # ValidateDnssecJob.perform_now(domain_name: @domain.name)
# #
# @domain.reload # @domain.reload
# p @domain.dnskeys # p @domain.dnskeys
# end end
# def test_job_discarded_after_error # def test_job_discarded_after_error
# assert_no_enqueued_jobs # assert_no_enqueued_jobs