New verifications (accept only acceptable domains) + new errors.

master
Philippe Pittoli 2023-06-29 12:27:15 +02:00
parent 41b790a4a8
commit d12af2047f
3 changed files with 55 additions and 23 deletions

View File

@ -12,7 +12,7 @@ class DNSManager::Request
def handle(dnsmanagerd : DNSManager::Service, event : IPC::Event) : IPC::JSON
user = dnsmanagerd.get_logged_user event
return Response::ErrorUserNotLogged.new unless user
dnsmanagerd.storage.new_domain user.uid, @domain
dnsmanagerd.storage.new_domain dnsmanagerd.configuration.accepted_domains.not_nil!, user.uid, @domain
end
end
DNSManager.requests << NewDomain

View File

@ -24,4 +24,22 @@ class DNSManager::Response
end
end
DNSManager.responses << ErrorUserNotLogged
IPC::JSON.message DomainNotFound, 5 do
def initialize()
end
end
DNSManager.responses << DomainNotFound
IPC::JSON.message RRNotFound, 6 do
def initialize()
end
end
DNSManager.responses << RRNotFound
IPC::JSON.message UnacceptableDomain, 7 do
def initialize()
end
end
DNSManager.responses << UnacceptableDomain
end

View File

@ -54,7 +54,7 @@ class DNSManager::Storage
Response::Success.new
end
def new_domain(user_id : Int32, domain : String) : IPC::JSON
def new_domain(accepted_domains : Array(String), user_id : Int32, domain : String) : IPC::JSON
# User must exist.
user_data = user_data_by_uid.get? user_id.to_s
unless user_data
@ -62,24 +62,35 @@ class DNSManager::Storage
return Response::UnknownUser.new
end
if zones_by_domain.get? domain
Response::DomainAlreadyExists.new
else
# Add the domain to the user's domain.
user_data.domains << domain
return Response::DomainAlreadyExists.new if zones_by_domain.get? domain
# Actually write data on-disk.
update_user_data user_data
# TODO: verify the domain name validity.
# TODO: Fill a template zone.
## # 2 NS
## zone << rr
## # Update the zone.
## zones_by_domain.update_or_create zone.domain, zone
Response::Success.new
# TODO: verify if the domain is acceptable.
matching_domains = accepted_domains.select { |adomain| domain.ends_with? adomain }
unless matching_domains
Baguette::Log.warning "trying to add an unacceptable domain: #{domain}"
return Response::UnacceptableDomain.new
end
matching_domains.each do |md|
Baguette::Log.info "Add new domain in #{md}: #{domain}"
end
# Add the domain to the user's domain.
user_data.domains << domain
# Actually write data on-disk.
update_user_data user_data
# TODO: Fill a template zone.
## # 2 NS
## zone << rr
## # Update the zone.
## zones_by_domain.update_or_create zone.domain, zone
Response::Success.new
end
def add_or_update_zone(user_id : Int32, zone : Zone) : IPC::JSON
@ -130,9 +141,7 @@ class DNSManager::Storage
# Zone must exist.
zone = zones_by_domain.get? domain
unless zone
return Response::InvalidZone.new ["Domain not found."]
end
return Response::DomainNotFound.new unless zone
# User must own the zone.
unless user_data.domains.includes?(domain) || user_data.admin
@ -169,9 +178,7 @@ class DNSManager::Storage
# Zone must exist.
zone = zones_by_domain.get? domain
unless zone
return Response::InvalidZone.new ["Domain not found."]
end
return Response::DomainNotFound.new unless zone
# User must own the zone.
unless user_data.domains.includes?(domain) || user_data.admin
@ -187,6 +194,13 @@ class DNSManager::Storage
end
end
# TODO: verify that this rr.rrid isn't ReadOnly.
stored_rr = zone.resources.select { |x| x.rrid == rr.rrid }
unless stored_rr.size > 0
Baguette::Log.warning "modifying a RR that doesn't exist (#{rr.rrid}) in domain #{domain}"
return Response::RRNotFound.new
end
zone.resources = zone.resources.map { |x| x.rrid == rr.rrid ? rr : x }
# Update the zone.