From 09a97386a9f5e3c316ffa36f787e794e2f6c142e Mon Sep 17 00:00:00 2001 From: Philippe Pittoli Date: Fri, 11 Jul 2025 15:30:03 +0200 Subject: [PATCH] Delegation: WIP. --- src/requests/delegation.cr | 21 +++++++++++++++++++++ src/responses/zone.cr | 14 ++++++++++++++ src/storage.cr | 8 ++++++++ 3 files changed, 43 insertions(+) create mode 100644 src/requests/delegation.cr diff --git a/src/requests/delegation.cr b/src/requests/delegation.cr new file mode 100644 index 0000000..5f970be --- /dev/null +++ b/src/requests/delegation.cr @@ -0,0 +1,21 @@ +class DNSManager::Request + IPC::JSON.message DelegateDomain, 25 do + property domain : String + property nameserver1 : String + property nameserver2 : String + def initialize(@domain, @nameserver1, @nameserver2) + end + + def to_s(io : IO) + super io + io << " (domain: #{@domain}, ns1: #{@nameserver1}, ns2: #{@nameserver2}" + end + + def handle(dnsmanagerd : DNSManager::Service, event : IPC::Event) : IPC::JSON + user = dnsmanagerd.get_logged_user event + return Response::ErrorUserNotLogged.new unless user + dnsmanagerd.storage.delegate_domain user.uid, @domain, @nameserver1, @nameserver2 + end + end + DNSManager.requests << DelegateDomain +end diff --git a/src/responses/zone.cr b/src/responses/zone.cr index 3f6049e..c755cf6 100644 --- a/src/responses/zone.cr +++ b/src/responses/zone.cr @@ -204,4 +204,18 @@ class DNSManager::Response end end DNSManager.responses << FoundDomains + + IPC::JSON.message DomainDelegated, 26 do + property domain : String + property nameserver1 : String + property nameserver2 : String + def initialize(@domain, @nameserver1, @nameserver2) + end + + def to_s(io : IO) + super io + io << " (domain: #{@domain}, ns1: #{@nameserver1}, ns2: #{@nameserver2})" + end + end + DNSManager.responses << DomainDelegated end diff --git a/src/storage.cr b/src/storage.cr index e7d84e8..dd7803e 100644 --- a/src/storage.cr +++ b/src/storage.cr @@ -433,6 +433,14 @@ class DNSManager::Storage Response::Zone.new zone end + # TODO, FIXME: verifications + actually delegate the domain. + def delegate_domain(user_id : UserDataID, domain : String, nameserver1 : String, nameserver2 : String) : IPC::JSON + zone = zone_must_exist! domain + user_should_own! user_id, domain + + Response::DomainDelegated.new domain, nameserver1, nameserver2 + end + # Removes user data. def wipe_user_data(user_id : UserDataID) : Nil domains_by_owners.get(user_id.to_s).each do |domain|