From a448b68fcca4f640b68355e0856b2af3569f676b Mon Sep 17 00:00:00 2001 From: Philippe Pittoli Date: Thu, 8 May 2025 02:25:44 +0200 Subject: [PATCH] Admin: enable searching for a domain. --- src/requests/admin.cr | 23 +++++++++++++++++++++++ src/responses/zone.cr | 12 ++++++++++++ src/storage.cr | 20 ++++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/src/requests/admin.cr b/src/requests/admin.cr index 0710259..72271b8 100644 --- a/src/requests/admin.cr +++ b/src/requests/admin.cr @@ -54,6 +54,29 @@ class DNSManager::Request end DNSManager.requests << Maintenance + # Force the generation of a zone file. + IPC::JSON.message SearchDomain, 24 do + property domain : String + property offset : Int32? + + def initialize(@domain) + end + + def to_s(io : IO) + super io + io << " (domain: #{@domain})" + 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.user_must_be_admin! user.uid + dnsmanagerd.storage.search_domain @domain + end + end + DNSManager.requests << SearchDomain + # Generate all zone files. # TODO: should conveniently skip already generated zones. IPC::JSON.message GenerateAllZoneFiles, 100 do diff --git a/src/responses/zone.cr b/src/responses/zone.cr index ec92c05..3f6049e 100644 --- a/src/responses/zone.cr +++ b/src/responses/zone.cr @@ -192,4 +192,16 @@ class DNSManager::Response end end DNSManager.responses << OrphanDomainList + + IPC::JSON.message FoundDomains, 25 do + property domains : Array(String) + def initialize(@domains) + end + + def to_s(io : IO) + super io + io << " (domains: #{@domains[0..5].join ","})" + end + end + DNSManager.responses << FoundDomains end diff --git a/src/storage.cr b/src/storage.cr index ef838a8..e7d84e8 100644 --- a/src/storage.cr +++ b/src/storage.cr @@ -106,6 +106,26 @@ class DNSManager::Storage Response::Success.new end + # Only an admin can access this function. + def search_domain(domain_to_search : String) : IPC::JSON + # WIP: test the request first. + unless domain_to_search =~ /^([_0-9A-Za-z-.]+)$/ + return Response::Error.new "Invalid domain request" + end + + Baguette::Log.info "(admin) searching for a domain: #{domain_to_search}" + + pattern = Regex.new domain_to_search, Regex::Options::IGNORE_CASE + domains = Array(String).new + @domains.each do |d| + if pattern =~ d.name + domains << d.name + end + end + + Response::FoundDomains.new domains + end + # Provides the generated zone file to a user. def get_generated_zonefile(user_id : UserDataID, domain : String) : IPC::JSON zone = zone_must_exist! domain