diff --git a/src/client/lib/dnsmanager-client.cr b/src/client/lib/dnsmanager-client.cr index 6b58fdd..bc5f4f5 100644 --- a/src/client/lib/dnsmanager-client.cr +++ b/src/client/lib/dnsmanager-client.cr @@ -67,6 +67,13 @@ class DNSManager::Client < IPC parse_message [ Response::Success ], read end + # Delete a RR. + def user_rr_delete(domain : String, rr : UInt32) + request = Request::DeleteRR.new domain, rr + send_now request + parse_message [ Response::Success ], read + end + # Get user domain list. def user_domain_list() request = Request::UserDomains.new diff --git a/src/client/main.cr b/src/client/main.cr index 42d9f4c..c67eeb7 100644 --- a/src/client/main.cr +++ b/src/client/main.cr @@ -46,6 +46,7 @@ class Actions # Zone RR operations. @the_call["user-rr-add-a"] = ->user_rr_add_a @the_call["user-rr-update-a"] = ->user_rr_update_a + @the_call["user-rr-del"] = ->user_rr_del @the_call["user-domain-list"] = ->user_domain_list end @@ -152,6 +153,13 @@ class Actions puts "error for user_rr_update_a: #{e.message}" end + def user_rr_del + domain, rrid = Context.args.not_nil! + pp! @dnsmanagerd.user_rr_delete domain, rrid.to_u32 + rescue e + puts "error for user_rr_del: #{e.message}" + end + end diff --git a/src/client/parser.cr b/src/client/parser.cr index 7cfefa0..c6c3ad6 100644 --- a/src/client/parser.cr +++ b/src/client/parser.cr @@ -165,6 +165,13 @@ def parsing_cli(authd_config : Baguette::Configuration::Auth) unrecognized_args_to_context_args.call parser, 5, nil end end + + parser.on("del", "Delete a RR.") do + Baguette::Log.info "delete a RR." + parser.banner = "COMMAND: user rr del " + Context.command = "user-rr-del" + unrecognized_args_to_context_args.call parser, 2, nil + end end end diff --git a/src/requests/zone.cr b/src/requests/zone.cr index f7d6f75..38ca35e 100644 --- a/src/requests/zone.cr +++ b/src/requests/zone.cr @@ -86,4 +86,19 @@ class DNSManager::Request end end DNSManager.requests << UpdateRR + + IPC::JSON.message DeleteRR, 16 do + property domain : String + property rrid : UInt32 + + def initialize(@domain, @rrid) + end + + def handle(dnsmanagerd : DNSManager::Service, event : IPC::Event) : IPC::JSON + user = dnsmanagerd.get_logged_user event + raise NotLoggedException.new if user.nil? + dnsmanagerd.storage.delete_rr user.uid, @domain, @rrid + end + end + DNSManager.requests << DeleteRR end diff --git a/src/storage.cr b/src/storage.cr index 870c8ff..1fe0304 100644 --- a/src/storage.cr +++ b/src/storage.cr @@ -170,6 +170,37 @@ class DNSManager::Storage Response::Error.new "error while replacing a resource record in domain #{domain}" end + def delete_rr(user_id : Int32, domain : String, rrid : UInt32) : IPC::JSON + # User must exist. + user_data = user_data_by_uid.get? user_id.to_s + unless user_data + Baguette::Log.warning "unknown user #{user_id} tries to add -or update- zone #{domain}" + return Response::UnknownUser.new + end + + # Zone must exist. + zone = zones_by_domain.get? domain + unless zone + return Response::InvalidZone.new ["Domain not found."] + end + + # User must own the zone. + unless user_data.domains.includes? domain + Baguette::Log.warning "user #{user_id} doesn't own domain #{domain}" + return Response::NoOwnership.new + end + + zone.resources.select! { |x| x.rrid != rrid } + + # Update the zone. + zones_by_domain.update_or_create zone.domain, zone + + Response::Success.new + rescue e + Baguette::Log.error "trying to replace a resource record in domain #{domain}: #{e}" + Response::Error.new "error while replacing a resource record in domain #{domain}" + end + def delete_domain(user_id : Int32, domain : String) : IPC::JSON # User must exist. user_data = user_data_by_uid.get? user_id.to_s