From 4db57a2d646b1538783a0675b38bada7a0f903ae Mon Sep 17 00:00:00 2001 From: Amlal Date: Sun, 28 Jul 2024 18:08:37 +0200 Subject: [MHR-36] Finished ticket. Signed-off-by: Amlal --- Kernel/KernelKit/User.hxx | 77 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 69 insertions(+), 8 deletions(-) (limited to 'Kernel/KernelKit') diff --git a/Kernel/KernelKit/User.hxx b/Kernel/KernelKit/User.hxx index aa0901ac..02ba475d 100644 --- a/Kernel/KernelKit/User.hxx +++ b/Kernel/KernelKit/User.hxx @@ -26,16 +26,16 @@ namespace Kernel { enum class RingKind { - kRingStdUser = 1, - kRingSuperUser = 2, + kRingStdUser = 1, + kRingSuperUser = 2, kRingGuestUser = 5, - kRingCount = 5, + kRingCount = 5, }; class User final { public: - explicit User() = default; + explicit User() = default; User(const Int32& sel, const Char* userName); User(const RingKind& kind, const Char* userName); @@ -50,16 +50,77 @@ namespace Kernel bool operator!=(const User& lhs); public: - const RingKind& Ring() noexcept; + /// @brief Getters. + const RingKind& Ring() noexcept; const StringView Name() noexcept; + Bool IsStdUser() noexcept; + Bool IsSuperUser() noexcept; + private: - RingKind fRing{RingKind::kRingStdUser}; + RingKind fRing{RingKind::kRingStdUser}; StringView fUserName{kMaxUserNameLen}; - }; - inline User* cRootUser = nullptr; + class UserView final + { + UserView() = default; + ~UserView() = default; + + User* fCurrentUser = nullptr; + User* fLastLoggedOffUser = nullptr; + + public: + User* fRootUser = nullptr; + + public: + NEWOS_COPY_DELETE(UserView); + + STATIC UserView* The() noexcept + { + UserView* view = nullptr; + + if (!view) + view = new UserView(); + + return view; + } + + Void LogIn(User* user) noexcept + { + if (fCurrentUser) + { + if (!fLastLoggedOffUser) + { + fLastLoggedOffUser = fCurrentUser; + } + else + { + this->LogOff(); + } + } + + fCurrentUser = user; + } + + Void LogOff() noexcept + { + if (!fCurrentUser) + return; + + // an illegal operation just occured, we can't risk more. + if (fCurrentUser == fRootUser) + { + ke_stop(RUNTIME_CHECK_BOOTSTRAP); + } + + if (fLastLoggedOffUser) + delete fLastLoggedOffUser; + + fLastLoggedOffUser = nullptr; + fLastLoggedOffUser = fCurrentUser; + } + }; } // namespace Kernel #endif /* ifndef _INC_PERMISSION_SEL_HXX_ */ -- cgit v1.2.3