diff --git a/src/requests/zone.cr b/src/requests/zone.cr index e5c8bcf..8a7031f 100644 --- a/src/requests/zone.cr +++ b/src/requests/zone.cr @@ -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 diff --git a/src/responses/error.cr b/src/responses/error.cr index 1b1e666..53f9019 100644 --- a/src/responses/error.cr +++ b/src/responses/error.cr @@ -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 diff --git a/src/storage.cr b/src/storage.cr index 0df1f12..85ad999 100644 --- a/src/storage.cr +++ b/src/storage.cr @@ -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.