From b3aa91fd07fda7e45428a0b24246345dd4be7ff4 Mon Sep 17 00:00:00 2001 From: Philippe Pittoli Date: Thu, 14 Mar 2024 04:36:03 +0100 Subject: [PATCH] Client: code simplification. Token-handler: works. --- src/client.cr | 6 +++++ src/client/lib/authd_api.cr | 16 ------------ src/client/lib/dnsmanager-client.cr | 39 +++++++++++++++++++++++++---- src/client/main.cr | 38 +++++++++------------------- src/requests/token.cr | 5 +--- src/storage.cr | 5 +--- tools/token-handler.cr | 26 ++++++++++++++++--- 7 files changed, 76 insertions(+), 59 deletions(-) create mode 100644 src/client.cr delete mode 100644 src/client/lib/authd_api.cr diff --git a/src/client.cr b/src/client.cr new file mode 100644 index 0000000..2f4c421 --- /dev/null +++ b/src/client.cr @@ -0,0 +1,6 @@ +require "authd" +require "ipc" +require "./storage.cr" +require "./network.cr" +require "./lib" +require "./client/lib/*" diff --git a/src/client/lib/authd_api.cr b/src/client/lib/authd_api.cr deleted file mode 100644 index da8a8fb..0000000 --- a/src/client/lib/authd_api.cr +++ /dev/null @@ -1,16 +0,0 @@ - -def authd_get_token(login : String? = nil, pass : String? = nil) - authd = AuthD::Client.new - - response = authd.login? login, pass - case response - when Response::Login - authd.close - uid = response.uid - token = response.token - Baguette::Log.info "Authenticated as #{login} #{uid}, token: #{token}" - return token - end - authd.close - raise "Cannot authenticate to authd with login #{login}: #{response}." -end diff --git a/src/client/lib/dnsmanager-client.cr b/src/client/lib/dnsmanager-client.cr index a54338c..99d4d59 100644 --- a/src/client/lib/dnsmanager-client.cr +++ b/src/client/lib/dnsmanager-client.cr @@ -1,13 +1,11 @@ -require "../../requests/*" - class DNSManager::Client < IPC - property server_fd : Int32 = -1 + property server_fd : Int32 = -1 def initialize super() fd = self.connect "dnsmanager" if fd.nil? - raise "couldn't connect to 'auth' IPC service" + raise "couldn't connect to 'dnsmanager' IPC service" end @server_fd = fd end @@ -16,10 +14,33 @@ class DNSManager::Client < IPC # Simple users. # + def authd_get_token(login : String? = nil, pass : String? = nil) + authd = AuthD::Client.new + response = authd.login? login, pass + case response + when AuthD::Response::Login + authd.close + uid = response.uid + token = response.token + Baguette::Log.info "Authenticated as #{login} #{uid}, token: #{token}" + return token + end + authd.close + raise "Cannot authenticate to authd with login #{login}: #{response}." + end + + def login(login : String, pass : String) + # Authd authentication, get the token and quit right away. + token = authd_get_token login: login, pass: pass + login token + end + def login(token : String) request = Request::Login.new token send_now request - parse_message [ Response::Logged ], read + response = parse_message [ Response::Logged ], read + raise "cannot connect to dnsmanagerd" unless response.class == Response::Logged + response end # @@ -123,6 +144,14 @@ class DNSManager::Client < IPC parse_message [ Response::Success ], read end + def use_token(token_uuid : String, address : String) + request = Request::UseToken.new token_uuid, address + send_now request + response = parse_message [ Response::Success ], read + raise "token update failed" unless response.class == Response::Success + response + end + # # Utils # diff --git a/src/client/main.cr b/src/client/main.cr index 0d809d9..f0bcf59 100644 --- a/src/client/main.cr +++ b/src/client/main.cr @@ -1,16 +1,10 @@ -require "authd" -require "ipc" -require "../network.cr" -require "../storage.cr" require "yaml" require "baguette-crystal-base" +require "../client.cr" require "../config" -require "./lib/*" -require "../lib" - class Context class_property command = "not-implemented" class_property args : Array(String)? = nil @@ -256,27 +250,19 @@ def main if authd_config.login.nil? || authd_config.pass.nil? Baguette::Log.info "no authd login." else - Baguette::Log.info "authd login..." login = authd_config.login.not_nil! pass = authd_config.pass.not_nil! - # Authd authentication, get the token and quit right away. - token = authd_get_token login: login, pass: pass - # Then push the token to the dnsmanager daemon. - logged_message = dnsmanagerd.login token - case logged_message - when DNSManager::Response::Logged - Baguette::Log.info "logged to dnsmanagerd as '#{login}'" - Baguette::Log.debug "from logging message, accepted domains:" - logged_message.accepted_domains.each do |d| - Baguette::Log.debug "- #{d}" - end - Baguette::Log.debug "from logging message, owned domains:" - logged_message.my_domains.each do |d| - Baguette::Log.debug "- #{d}" - end - else - Baguette::Log.info "not logged to dnsmanagerd?" - end + #logged_message = dnsmanagerd.login login, pass + dnsmanagerd.login login, pass + Baguette::Log.info "logged to dnsmanagerd as '#{login}'" + #Baguette::Log.debug "from logging message, accepted domains:" + #logged_message.accepted_domains.each do |d| + # Baguette::Log.debug "- #{d}" + #end + #Baguette::Log.debug "from logging message, owned domains:" + #logged_message.my_domains.each do |d| + # Baguette::Log.debug "- #{d}" + #end end actions = Actions.new dnsmanagerd, config diff --git a/src/requests/token.cr b/src/requests/token.cr index f6301e3..769f3a4 100644 --- a/src/requests/token.cr +++ b/src/requests/token.cr @@ -25,10 +25,7 @@ class DNSManager::Request end def handle(dnsmanagerd : DNSManager::Service, event : IPC::Event) : IPC::JSON - user = dnsmanagerd.get_logged_user event - return Response::ErrorUserNotLogged.new unless user - return Response::InsufficientRights.new unless user.admin - dnsmanagerd.storage.use_token user.uid, @token, @address + dnsmanagerd.storage.use_token @token, @address end end DNSManager.requests << UseToken diff --git a/src/storage.cr b/src/storage.cr index ef96efd..2d3c898 100644 --- a/src/storage.cr +++ b/src/storage.cr @@ -333,10 +333,7 @@ class DNSManager::Storage token end - def use_token(user_id : Int32, token_uuid : String, address : String) : IPC::JSON - puts "use token #{token_uuid} address #{address}" - - user_data = user_must_be_admin! user_id + def use_token(token_uuid : String, address : String) : IPC::JSON token = token_must_exist! token_uuid zone = zone_must_exist! token.domain rr = zone.rr_must_exist! token.rrid diff --git a/tools/token-handler.cr b/tools/token-handler.cr index 2d573a2..4a138dc 100644 --- a/tools/token-handler.cr +++ b/tools/token-handler.cr @@ -1,24 +1,42 @@ +require "authd" require "ipc" +require "../src/client.cr" require "http/server" port = ARGV[0].to_i rescue 8080 addr = ARGV[1] rescue "127.0.0.1" -# TODO: connect to `dnsmanagerd`. +#login = ENV["LOGIN"] +#pass = ENV["PASS"] + +dnsmanagerd = DNSManager::Client.new +#dnsmanagerd.login login, pass server = HTTP::Server.new do |context| pp! context.request.remote_address + ip = case remote = context.request.remote_address + when Socket::IPAddress + remote.address + else + "" + end case context.request.path - when /^\/token-update\/(?[a-z-]+)/ + when /^\/token-update\/(?[a-z0-9-]+)/ token = $~["token"] if token.nil? context.response.status_code = 404 context.response.print "invalid token" else context.response.content_type = "text/html" - context.response.print "coucou, token: #{token}" - # TODO: send update to `dnsmanagerd`. + context.response.print "coucou, token: #{token} from #{ip}" + begin + dnsmanagerd.use_token token, ip + context.response.print "; Success!" # 🔻 + rescue e + puts "error while updating token: #{e}" + context.response.print "; The command failed!" # ⚠ + end end else context.response.status_code = 404