From d790caa4e18e8c912b59cd3108ce14d8ce4e2f7b Mon Sep 17 00:00:00 2001 From: Philippe PITTOLI Date: Tue, 7 May 2024 10:54:25 +0200 Subject: [PATCH] Client: do not raise exceptions on expected possible errors. --- src/authd/client.cr | 98 ++++++++++++++++++++++++++++++++------------- 1 file changed, 70 insertions(+), 28 deletions(-) diff --git a/src/authd/client.cr b/src/authd/client.cr index 15a3745..733fdc2 100644 --- a/src/authd/client.cr +++ b/src/authd/client.cr @@ -20,7 +20,8 @@ module AuthD m.not_nil! end - # TODO: parse_message should raise exception if response not anticipated + # `parse_message` only raises exception in case the response could not be anticipated. + # Any possibly expected error for a request should be in `expected_messages`. def parse_message(expected_messages, message) em = Array(IPC::JSON.class).new expected_messages.each do |e| @@ -32,17 +33,16 @@ module AuthD def login?(login : String, password : String) send_now Request::Login.new login, password - parse_message [Response::Login], read - end - - def get_user?(login : String, password : String) - send_now Request::GetUserByCredentials.new login, password - parse_message [Response::User], read + parse_message [Response::Login, Response::ErrorInvalidCredentials], read end def get_user?(uid_or_login : UserID) send_now Request::GetUser.new uid_or_login - parse_message [Response::User], read + parse_message [ + Response::User, + Response::ErrorMustBeAuthenticated, + Response::ErrorUserNotFound + ], read end def send_now(msg : IPC::JSON) @@ -62,7 +62,12 @@ module AuthD profile : Hash(String, ::JSON::Any)?) send_now Request::AddUser.new login, password, admin, email, profile - parse_message [Response::UserAdded], read + parse_message [ + Response::UserAdded, + Response::ErrorMustBeAuthenticated, + Response::ErrorAlreadyUsedLogin, + Response::ErrorMailRequired + ], read end def bootstrap(login : String, @@ -71,27 +76,40 @@ module AuthD profile : Hash(String, ::JSON::Any)? = nil) send_now Request::BootstrapFirstAdmin.new login, password, email, profile - parse_message [Response::UserAdded], read + parse_message [Response::UserAdded,Response::ErrorAlreadyUsersInDB], read end def decode_token(token) send_now Request::DecodeToken.new token - parse_message [Response::User], read + parse_message [ + Response::User, + Response::ErrorMustBeAuthenticated, + Response::ErrorUserNotFound + ], read end def validate_user(login : String, activation_key : String) send_now Request::ValidateUser.new login, activation_key - parse_message [Response::UserValidated], read + parse_message [ + Response::UserValidated, + Response::ErrorUserNotFound, + Response::ErrorUserAlreadyValidated, + Response::ErrorInvalidActivationKey + ], read end def ask_password_recovery(uid_or_login : UserID) send_now Request::AskPasswordRecovery.new uid_or_login - parse_message [Response::PasswordRecoverySent], read + parse_message [Response::PasswordRecoverySent, Response::ErrorUserNotFound], read end def change_password(uid_or_login : UserID, new_pass : String, renew_key : String) send_now Request::PasswordRecovery.new uid_or_login, renew_key, new_pass - parse_message [Response::PasswordRecovered], read + parse_message [ + Response::PasswordRecovered, + Response::ErrorUserNotFound, + Response::ErrorInvalidRenewKey + ], read end def register(login : String, @@ -100,14 +118,17 @@ module AuthD profile : Hash(String, ::JSON::Any)?) send_now Request::Register.new login, password, email, profile - parse_message [Response::UserAdded, - Response::ErrorRegistrationsClosed, - Response::ErrorAlreadyUsedLogin, - Response::ErrorInvalidLoginFormat, - Response::ErrorMailRequired, - Response::ErrorInvalidEmailFormat, - Response::ErrorCannotContactUser, - Response::ErrorPasswordTooShort], read + parse_message [ + Response::UserAdded, + Response::ErrorRegistrationsClosed, + Response::ErrorAlreadyUsedLogin, + Response::ErrorInvalidLoginFormat, + Response::ErrorMailRequired, + Response::ErrorInvalidEmailFormat, + Response::ErrorPasswordTooShort, + Response::ErrorPasswordTooLong, + Response::ErrorCannotContactUser + ], read end def mod_user(uid_or_login : UserID, password : String? = nil, email : String? = nil) @@ -117,34 +138,55 @@ module AuthD request.email = email if email send_now request - parse_message [Response::UserEdited], read + parse_message [ + Response::ErrorMustBeAuthenticated, + Response::ErrorUserNotFound, + Response::UserEdited + ], read end def check_permission(user : UserID, service_name : String, resource_name : String) request = Request::CheckPermission.new user, service_name, resource_name send_now request - parse_message [Response::PermissionCheck], read + parse_message [ + Response::PermissionCheck, + Response::ErrorMustBeAuthenticated, + Response::ErrorUserNotFound + ], read end def set_permission(user : UserID, service : String, resource : String, permission : User::PermissionLevel) request = Request::SetPermission.new user, service, resource, permission send_now request - parse_message [Response::PermissionSet], read + parse_message [ + Response::PermissionSet, + Response::ErrorMustBeAuthenticated, + Response::ErrorUserNotFound + ], read end def search_user(user_login : String) send_now Request::SearchUser.new user_login - parse_message [Response::MatchingUsers], read + parse_message [Response::MatchingUsers, Response::ErrorMustBeAuthenticated], read end def edit_profile_content(user : UserID, new_values) send_now Request::EditProfileEntries.new user, new_values - parse_message [Response::User], read + parse_message [ + Response::User, + Response::ErrorMustBeAuthenticated, + Response::ErrorUserNotFound, + Response::ErrorReadOnlyProfileKeys + ], read end def delete(user : UserID) send_now Request::Delete.new user - parse_message [Response::UserDeleted], read + parse_message [ + Response::ErrorMustBeAuthenticated, + Response::ErrorUserNotFound, + Response::UserDeleted + ], read end end end