From 39bc79d05c61eebbfc8e0755f66717acef4c3b1d Mon Sep 17 00:00:00 2001 From: Philippe Pittoli Date: Thu, 1 Jun 2023 02:19:18 +0200 Subject: [PATCH] A few more request messages. --- src/App/Messages/AuthenticationDaemon.purs | 63 ++++++++++++++-------- 1 file changed, 41 insertions(+), 22 deletions(-) diff --git a/src/App/Messages/AuthenticationDaemon.purs b/src/App/Messages/AuthenticationDaemon.purs index f2bf089..3f16d8a 100644 --- a/src/App/Messages/AuthenticationDaemon.purs +++ b/src/App/Messages/AuthenticationDaemon.purs @@ -26,14 +26,13 @@ import Data.Bifunctor (lmap) import App.IPC as IPC {- TODO: + For a few messages, user can be designated by a string (login) or a number (its UID). + This was simplified by using the login for each. + Maybe this could be changed in the future to match the actual possibilities of the API. Possible requests: - - 9 type CheckPermission = { shared_key :: Maybe String, token :: Maybe String, user :: Int | String, service :: String, resource :: String } - - 10 type SetPermission = { shared_key :: String, user :: Int | String, service :: String, resource :: String, permission :: PermissionLevel.PermissionLevel } - 14 type EditProfile = { token :: String, new_profile :: Hash(String, JSON::Any) } - 15 type EditProfileContent = { token :: Maybe String, shared_key :: Maybe String, user :: Int | String | Nil, new_profile :: Hash(String, JSON::Any) } - - 16 type EditContacts = { token :: String, email :: Maybe Email.Email, phone :: Maybe Phone.Phone } - - 17 type Delete = { shared_key :: Maybe String, login :: Maybe String, password :: Maybe String, user :: String | Int } -- Deletion can be triggered by either an admin or the user. -} @@ -66,9 +65,13 @@ type GetUserByCredentials = { login :: String, password :: String } type Register = { login :: String, password :: String, email :: Maybe Email.Email, phone :: Maybe Phone.Phone } -- profile :: Maybe Hash(String, JSON::Any) type UpdatePassword = { login :: String, old_password :: String, new_password :: String } type ListUsers = { token :: Maybe String, key :: Maybe String } +type CheckPermission = { shared_key :: Maybe String, token :: Maybe String, user :: String, service :: String, resource :: String } +type SetPermission = { shared_key :: String, user :: String, service :: String, resource :: String, permission :: PermissionLevel.PermissionLevel } type PasswordRecovery = { user :: String, password_renew_key :: String, new_password :: String } type AskPasswordRecovery = { user :: String, email :: Email.Email } type SearchUser = { user :: String } +type EditContacts = { token :: String, email :: Maybe Email.Email, phone :: Maybe Phone.Phone } +type Delete = { shared_key :: Maybe String, login :: Maybe String, password :: Maybe String, user :: String } type GetContacts = { token :: String } -- Related JSON codecs. @@ -99,12 +102,28 @@ codecUpdatePassword = CA.object "UpdatePassword" (CAR.record { login: CA.string , new_password: CA.string }) codecListUsers ∷ CA.JsonCodec ListUsers codecListUsers = CA.object "ListUsers" (CAR.record { token: CAR.optional CA.string, key: CAR.optional CA.string }) +codecCheckPermission ∷ CA.JsonCodec CheckPermission +codecCheckPermission = CA.object "CheckPermission" (CAR.record { shared_key: CAR.optional CA.string + , token: CAR.optional CA.string + , user: CA.string + , service: CA.string + , resource: CA.string }) +codecSetPermission ∷ CA.JsonCodec SetPermission +codecSetPermission = CA.object "SetPermission" (CAR.record { shared_key: CA.string + , user: CA.string + , service: CA.string + , resource: CA.string + , permission: PermissionLevel.codec }) codecPasswordRecovery ∷ CA.JsonCodec PasswordRecovery codecPasswordRecovery = CA.object "PasswordRecovery" (CAR.record { user: CA.string, password_renew_key: CA.string, new_password: CA.string }) codecAskPasswordRecovery ∷ CA.JsonCodec AskPasswordRecovery codecAskPasswordRecovery = CA.object "AskPasswordRecovery" (CAR.record { user: CA.string, email: Email.codec }) codecSearchUser ∷ CA.JsonCodec SearchUser codecSearchUser = CA.object "SearchUser" (CAR.record { user: CA.string }) +codecEditContacts ∷ CA.JsonCodec EditContacts +codecEditContacts = CA.object "EditContacts" (CAR.record { token: CA.string, email: CAR.optional Email.codec, phone: CAR.optional Phone.codec }) +codecDelete ∷ CA.JsonCodec Delete +codecDelete = CA.object "Delete" (CAR.record { shared_key: CAR.optional CA.string, login: CAR.optional CA.string, password: CAR.optional CA.string, user: CA.string }) codecGetContacts ∷ CA.JsonCodec GetContacts codecGetContacts = CA.object "GetContacts" (CAR.record { token: CA.string }) @@ -154,15 +173,15 @@ data RequestMessage | MkRegister Register -- 6 | MkUpdatePassword UpdatePassword -- 7 | MkListUsers ListUsers -- 8 - --| MkCheckPermission CheckPermission -- 9 - --| MkSetPermission SetPermission -- 10 + | MkCheckPermission CheckPermission -- 9 + | MkSetPermission SetPermission -- 10 | MkPasswordRecovery PasswordRecovery -- 11 | MkAskPasswordRecovery AskPasswordRecovery -- 12 | MkSearchUser SearchUser -- 13 --| MkEditProfile EditProfile -- 14 --| MkEditProfileContent EditProfileContent -- 15 - --| MkEditContacts EditContacts -- 16 - --| MkDelete Delete -- 17 + | MkEditContacts EditContacts -- 16 + | MkDelete Delete -- 17 | MkGetContacts GetContacts -- 18 -- All possible answers from the authentication daemon (authd). @@ -183,27 +202,27 @@ data AnswerMessage encode ∷ RequestMessage -> Tuple UInt String encode m = case m of - (MkGetToken request) -> get_tuple 0 codecGetToken request - (MkAddUser request) -> get_tuple 1 codecAddUser request - (MkValidateUser request) -> get_tuple 2 codecValidateUser request + (MkGetToken request) -> get_tuple 0 codecGetToken request + (MkAddUser request) -> get_tuple 1 codecAddUser request + (MkValidateUser request) -> get_tuple 2 codecValidateUser request -- Both messages are actually a single message type, so they have the same number. -- TODO: change the message codec for an Either Int String. - (MkGetUserByUID request) -> get_tuple 3 codecGetUserByUID request - (MkGetUserByName request) -> get_tuple 3 codecGetUserByName request - (MkGetUserByCredentials request) -> get_tuple 4 codecGetUserByCredentials request - (MkRegister request) -> get_tuple 6 codecRegister request - (MkUpdatePassword request) -> get_tuple 7 codecUpdatePassword request - (MkListUsers request) -> get_tuple 8 codecListUsers request - -- 9 MkCheckPermission - -- 10 MkSetPermission + (MkGetUserByUID request) -> get_tuple 3 codecGetUserByUID request + (MkGetUserByName request) -> get_tuple 3 codecGetUserByName request + (MkGetUserByCredentials request) -> get_tuple 4 codecGetUserByCredentials request + (MkRegister request) -> get_tuple 6 codecRegister request + (MkUpdatePassword request) -> get_tuple 7 codecUpdatePassword request + (MkListUsers request) -> get_tuple 8 codecListUsers request + (MkCheckPermission request) -> get_tuple 9 codecCheckPermission request + (MkSetPermission request) -> get_tuple 10 codecSetPermission request (MkPasswordRecovery request) -> get_tuple 11 codecPasswordRecovery request (MkAskPasswordRecovery request) -> get_tuple 12 codecAskPasswordRecovery request (MkSearchUser request) -> get_tuple 13 codecSearchUser request -- 14 MkEditProfile -- 15 MkEditProfileContent - -- 16 MkEditContacts - -- 17 MkDelete - (MkGetContacts request) -> get_tuple 18 codecGetContacts request + (MkEditContacts request) -> get_tuple 16 codecEditContacts request + (MkDelete request) -> get_tuple 17 codecDelete request + (MkGetContacts request) -> get_tuple 18 codecGetContacts request where get_tuple :: forall a. Int -> CA.JsonCodec a -> a -> Tuple UInt String get_tuple num codec request = Tuple (fromInt num) (J.stringify $ CA.encode codec request)