Catching a few errors.
This commit is contained in:
parent
0e5a2c3967
commit
5c735a2055
@ -17,6 +17,9 @@ dependencies:
|
|||||||
baguette-crystal-base:
|
baguette-crystal-base:
|
||||||
git: https://git.baguette.netlib.re/Baguette/baguette-crystal-base
|
git: https://git.baguette.netlib.re/Baguette/baguette-crystal-base
|
||||||
branch: master
|
branch: master
|
||||||
|
ipaddress:
|
||||||
|
github: sija/ipaddress.cr
|
||||||
|
|
||||||
|
|
||||||
targets:
|
targets:
|
||||||
dnsmanager:
|
dnsmanager:
|
||||||
|
@ -27,9 +27,9 @@ class DNSManager::Client < IPC::Client
|
|||||||
|
|
||||||
# Adding a full zone.
|
# Adding a full zone.
|
||||||
def user_zone_add(zone : DNSManager::Storage::Zone)
|
def user_zone_add(zone : DNSManager::Storage::Zone)
|
||||||
request = DNSManager::Request::AddZone.new zone
|
request = DNSManager::Request::AddOrUpdateZone.new zone
|
||||||
send_now @server_fd.not_nil!, request
|
send_now @server_fd.not_nil!, request
|
||||||
parse_message [ DNSManager::Response::Success ], read
|
parse_message [ DNSManager::Response::Success, DNSManager::Response::InvalidZone ], read
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@ require "baguette-crystal-base"
|
|||||||
require "../config"
|
require "../config"
|
||||||
|
|
||||||
require "./lib/*"
|
require "./lib/*"
|
||||||
|
require "../lib"
|
||||||
|
|
||||||
class Context
|
class Context
|
||||||
class_property command = "not-implemented"
|
class_property command = "not-implemented"
|
||||||
@ -75,7 +76,7 @@ class Actions
|
|||||||
pp! zone
|
pp! zone
|
||||||
pp! @dnsmanagerd.user_zone_add zone
|
pp! @dnsmanagerd.user_zone_add zone
|
||||||
rescue e
|
rescue e
|
||||||
puts "error for admin_maintainance #{subject}: #{e.message}"
|
puts "error for user_zone_add: #{e.message}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
require "ipaddress"
|
||||||
|
|
||||||
# Store a DNS zone.
|
# Store a DNS zone.
|
||||||
class DNSManager::Storage::Zone
|
class DNSManager::Storage::Zone
|
||||||
@ -39,8 +40,8 @@ class DNSManager::Storage::Zone
|
|||||||
@rrtype = self.class.name.downcase.gsub /dnsmanager::storage::zone::/, ""
|
@rrtype = self.class.name.downcase.gsub /dnsmanager::storage::zone::/, ""
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_error : Error?
|
def get_errors : Array(Error)
|
||||||
nil
|
[] of Error
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -61,8 +62,38 @@ class DNSManager::Storage::Zone
|
|||||||
end
|
end
|
||||||
|
|
||||||
class A < ResourceRecord
|
class A < ResourceRecord
|
||||||
|
def get_errors : Array(Error)
|
||||||
|
errors = [] of Error
|
||||||
|
|
||||||
|
unless Zone.is_subdomain_valid? @name
|
||||||
|
errors << "invalid subdomain: #{@name}"
|
||||||
|
end
|
||||||
|
|
||||||
|
# TODO: impose a limit on the TTL
|
||||||
|
|
||||||
|
unless Zone.is_ipv4_address_valid? @target
|
||||||
|
errors << "target not valid ipv4: #{@target}"
|
||||||
|
end
|
||||||
|
|
||||||
|
errors
|
||||||
|
end
|
||||||
end
|
end
|
||||||
class AAAA < ResourceRecord
|
class AAAA < ResourceRecord
|
||||||
|
def get_errors : Array(Error)
|
||||||
|
errors = [] of Error
|
||||||
|
|
||||||
|
unless Zone.is_subdomain_valid? @name
|
||||||
|
errors << "invalid subdomain: #{@name}"
|
||||||
|
end
|
||||||
|
|
||||||
|
# TODO: impose a limit on the TTL
|
||||||
|
|
||||||
|
unless Zone.is_ipv6_address_valid? @target
|
||||||
|
errors << "target not valid ipv6: #{@target}"
|
||||||
|
end
|
||||||
|
|
||||||
|
errors
|
||||||
|
end
|
||||||
end
|
end
|
||||||
class TXT < ResourceRecord
|
class TXT < ResourceRecord
|
||||||
end
|
end
|
||||||
@ -101,7 +132,7 @@ class DNSManager::Storage::Zone
|
|||||||
end
|
end
|
||||||
|
|
||||||
@resources.each do |r|
|
@resources.each do |r|
|
||||||
if error = r.get_error
|
r.get_errors().each do |error|
|
||||||
errors << error
|
errors << error
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -121,5 +152,46 @@ class DNSManager::Storage::Zone
|
|||||||
false
|
false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# This regex only is "good enough for now".
|
||||||
|
def self.is_subdomain_valid?(subdomain) : Bool
|
||||||
|
if subdomain =~ /^(((?!-))(xn--|_{1,1})?[a-z0-9-]{0,61}[a-z0-9]{1,1}\.)*(xn--)?[a-z0-9][a-z0-9\-]{0,60}[a-z0-9]*[a-z]+|[a-z]+|[a-z][a-z0-9]+[a-z]+$/
|
||||||
|
true
|
||||||
|
else
|
||||||
|
false
|
||||||
|
end
|
||||||
|
rescue e
|
||||||
|
Baguette::Log.error "invalid zone subdomain #{subdomain}: #{e}"
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
# This only is "good enough for now".
|
||||||
|
# Regex only matches for invalid characters.
|
||||||
|
def self.is_ipv4_address_valid?(address) : Bool
|
||||||
|
if ! address =~ /^[0-9\.]+$/
|
||||||
|
false
|
||||||
|
elsif ip = IPAddress::IPv4.new address
|
||||||
|
true
|
||||||
|
else
|
||||||
|
false
|
||||||
|
end
|
||||||
|
rescue e
|
||||||
|
Baguette::Log.warning "wrong IPv4 address: #{address}"
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
# This only is "good enough for now".
|
||||||
|
# Regex only matches for invalid characters.
|
||||||
|
def self.is_ipv6_address_valid?(address) : Bool
|
||||||
|
if ! address =~ /^[0-9a-f:]+$/
|
||||||
|
false
|
||||||
|
elsif ip = IPAddress::IPv6.new address
|
||||||
|
true
|
||||||
|
else
|
||||||
|
false
|
||||||
|
end
|
||||||
|
rescue e
|
||||||
|
Baguette::Log.warning "wrong IPv4 address: #{address}"
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user