From 32a8c235249febb033980a53157d47e36cdda296 Mon Sep 17 00:00:00 2001 From: Luka Vandervelden Date: Fri, 22 Nov 2019 17:31:56 +0100 Subject: [PATCH] Grooming. --- src/authd.cr | 134 ++++++++++++++++++++++++++------------------------- src/main.cr | 56 ++++++++++----------- 2 files changed, 97 insertions(+), 93 deletions(-) diff --git a/src/authd.cr b/src/authd.cr index 8527037..d323ad3 100644 --- a/src/authd.cr +++ b/src/authd.cr @@ -6,67 +6,71 @@ require "ipc" require "./user.cr" module AuthD - enum RequestTypes - GetToken - AddUser - GetUser - GetUserByCredentials - ModUser # Edit user attributes. + class Response + enum Type + Ok + Malformed + InvalidCredentials + InvalidUser + UserNotFound # For UID-based GetUser requests. + AuthenticationError + end end - enum ResponseTypes - Ok - MalformedRequest - InvalidCredentials - InvalidUser - UserNotFound # For UID-based GetUser requests. - AuthenticationError - end + class Request + enum Type + GetToken + AddUser + GetUser + GetUserByCredentials + ModUser # Edit user attributes. + end - class GetTokenRequest - JSON.mapping({ - # FIXME: Rename to "login" for consistency. - login: String, - password: String - }) - end + class GetToken + JSON.mapping({ + # FIXME: Rename to "login" for consistency. + login: String, + password: String + }) + end - class AddUserRequest - JSON.mapping({ - # Only clients that have the right shared key will be allowed - # to create users. - shared_key: String, + class AddUser + JSON.mapping({ + # Only clients that have the right shared key will be allowed + # to create users. + shared_key: String, - login: String, - password: String, - uid: Int32?, - gid: Int32?, - home: String?, - shell: String? - }) - end + login: String, + password: String, + uid: Int32?, + gid: Int32?, + home: String?, + shell: String? + }) + end - class GetUserRequest - JSON.mapping({ - uid: Int32 - }) - end + class GetUser + JSON.mapping({ + uid: Int32 + }) + end - class GetUserByCredentialsRequest - JSON.mapping({ - login: String, - password: String - }) - end + class GetUserByCredentials + JSON.mapping({ + login: String, + password: String + }) + end - class ModUserRequest - JSON.mapping({ - shared_key: String, + class ModUser + JSON.mapping({ + shared_key: String, - uid: Int32, - password: String?, - avatar: String? - }) + uid: Int32, + password: String?, + avatar: String? + }) + end end class Client < IPC::Connection @@ -79,14 +83,14 @@ module AuthD end def get_token?(login : String, password : String) : String? - send RequestTypes::GetToken, { + send Request::Type::GetToken, { :login => login, :password => password }.to_json response = read - if response.type == ResponseTypes::Ok.value.to_u8 + if response.type == Response::Type::Ok.value.to_u8 String.new response.payload else nil @@ -94,14 +98,14 @@ module AuthD end def get_user?(login : String, password : String) : Passwd::User? - send RequestTypes::GetUserByCredentials, { + send Request::Type::GetUserByCredentials, { :login => login, :password => password }.to_json response = read - if response.type == ResponseTypes::Ok.value.to_u8 + if response.type == Response::Type::Ok.value.to_u8 Passwd::User.from_json String.new response.payload else nil @@ -109,18 +113,18 @@ module AuthD end def get_user?(uid : Int32) - send RequestTypes::GetUser, {:uid => uid}.to_json + send Request::Type::GetUser, {:uid => uid}.to_json response = read - if response.type == ResponseTypes::Ok.value.to_u8 + if response.type == Response::Type::Ok.value.to_u8 User.from_json String.new response.payload else nil end end - def send(type : RequestTypes, payload) + def send(type : Request::Type, payload) send type.value.to_u8, payload end @@ -134,7 +138,7 @@ module AuthD # FIXME: Extra options may be useful to implement here. def add_user(login : String, password : String) : Passwd::User | Exception - send RequestTypes::AddUser, { + send Request::Type::AddUser, { :shared_key => @key, :login => login, :password => password @@ -143,8 +147,8 @@ module AuthD response = read payload = String.new response.payload - case ResponseTypes.new response.type.to_i - when ResponseTypes::Ok + case Response::Type.new response.type.to_i + when Response::Type::Ok Passwd::User.from_json payload else Exception.new payload @@ -164,12 +168,12 @@ module AuthD payload["avatar"] = avatar end - send RequestTypes::ModUser, payload.to_json + send Request::Type::ModUser, payload.to_json response = read - case ResponseTypes.new response.type.to_i - when ResponseTypes::Ok + case Response::Type.new response.type.to_i + when Response::Type::Ok true else Exception.new String.new response.payload diff --git a/src/main.cr b/src/main.cr index af000d4..dad9db2 100644 --- a/src/main.cr +++ b/src/main.cr @@ -11,7 +11,7 @@ require "./authd.cr" extend AuthD class IPC::Connection - def send(type : AuthD::ResponseTypes, payload : String) + def send(type : AuthD::Response::Type, payload : String) send type.to_u8, payload end end @@ -58,12 +58,12 @@ IPC::Service.new "auth" do |event| message = event.message payload = message.payload - case RequestTypes.new message.type.to_i - when RequestTypes::GetToken + case Request::Type.new message.type.to_i + when Request::Type::GetToken begin - request = GetTokenRequest.from_json String.new payload + request = Request::GetToken.from_json String.new payload rescue e - client.send ResponseTypes::MalformedRequest.value.to_u8, e.message || "" + client.send Response::Type::Malformed.value.to_u8, e.message || "" next end @@ -71,76 +71,76 @@ IPC::Service.new "auth" do |event| user = passwd.get_user request.login, request.password if user.nil? - client.send ResponseTypes::InvalidCredentials.value.to_u8, "" + client.send Response::Type::InvalidCredentials.value.to_u8, "" next end - client.send ResponseTypes::Ok.value.to_u8, + client.send Response::Type::Ok.value.to_u8, JWT.encode user.to_h, authd_jwt_key, JWT::Algorithm::HS256 - when RequestTypes::AddUser + when Request::Type::AddUser begin - request = AddUserRequest.from_json String.new payload + request = Request::AddUser.from_json String.new payload rescue e - client.send ResponseTypes::MalformedRequest.value.to_u8, e.message || "" + client.send Response::Type::Malformed.value.to_u8, e.message || "" next end if request.shared_key != authd_jwt_key - client.send ResponseTypes::AuthenticationError, "Invalid authentication key." + client.send Response::Type::AuthenticationError, "Invalid authentication key." next end if passwd.user_exists? request.login - client.send ResponseTypes::InvalidUser, "Another user with the same login already exists." + client.send Response::Type::InvalidUser, "Another user with the same login already exists." next end user = passwd.add_user request.login, request.password - client.send ResponseTypes::Ok, user.sanitize!.to_json - when RequestTypes::GetUserByCredentials + client.send Response::Type::Ok, user.sanitize!.to_json + when Request::Type::GetUserByCredentials begin - request = GetUserByCredentialsRequest.from_json String.new payload + request = Request::GetUserByCredentials.from_json String.new payload rescue e - client.send ResponseTypes::MalformedRequest, e.message || "" + client.send Response::Type::Malformed, e.message || "" next end user = passwd.get_user request.login, request.password if user - client.send ResponseTypes::Ok, user.sanitize!.to_json + client.send Response::Type::Ok, user.sanitize!.to_json else - client.send ResponseTypes::UserNotFound, "" + client.send Response::Type::UserNotFound, "" end - when RequestTypes::GetUser + when Request::Type::GetUser begin - request = GetUserRequest.from_json String.new payload + request = Request::GetUser.from_json String.new payload rescue e - client.send ResponseTypes::MalformedRequest, e.message || "" + client.send Response::Type::Malformed, e.message || "" next end user = passwd.get_user request.uid if user - client.send ResponseTypes::Ok, user.sanitize!.to_json + client.send Response::Type::Ok, user.sanitize!.to_json else - client.send ResponseTypes::UserNotFound, "" + client.send Response::Type::UserNotFound, "" end - when RequestTypes::ModUser + when Request::Type::ModUser begin - request = ModUserRequest.from_json String.new payload + request = Request::ModUser.from_json String.new payload rescue e - client.send ResponseTypes::MalformedRequest, e.message || "" + client.send Response::Type::Malformed, e.message || "" next end if request.shared_key != authd_jwt_key - client.send ResponseTypes::AuthenticationError, "Invalid authentication key." + client.send Response::Type::AuthenticationError, "Invalid authentication key." next end @@ -150,7 +150,7 @@ IPC::Service.new "auth" do |event| passwd.mod_user request.uid, password_hash: password_hash - client.send ResponseTypes::Ok, "" + client.send Response::Type::Ok, "" end end end