diff options
| author | Amlal <amlal@zka.com> | 2024-07-28 18:08:37 +0200 |
|---|---|---|
| committer | Amlal <amlal@zka.com> | 2024-07-28 18:09:00 +0200 |
| commit | 4db57a2d646b1538783a0675b38bada7a0f903ae (patch) | |
| tree | 3080ba07a6b552bf3d7591574cf69b2a3c8fd0fd | |
| parent | 3870cac25e895dcca9535d03a79d5ae96b5b023e (diff) | |
[MHR-36] Finished ticket.
Signed-off-by: Amlal <amlal@zka.com>
| -rw-r--r-- | Kernel/KernelKit/User.hxx | 77 | ||||
| -rw-r--r-- | Kernel/Sources/Main.cxx | 6 | ||||
| -rw-r--r-- | Kernel/Sources/User.cxx | 10 |
3 files changed, 83 insertions, 10 deletions
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_ */ diff --git a/Kernel/Sources/Main.cxx b/Kernel/Sources/Main.cxx index 950a8e48..0f835adc 100644 --- a/Kernel/Sources/Main.cxx +++ b/Kernel/Sources/Main.cxx @@ -189,8 +189,10 @@ namespace Kernel::Detail STATIC Kernel::Void ke_user_switch(Kernel::Void) { - Kernel::cRootUser = new User(RingKind::kRingSuperUser, kSuperUser); - Kernel::kcout << "newoskrnl: logged in as: " << Kernel::cRootUser->Name().CData() << Kernel::endl; + Kernel::UserView::The()->fRootUser = new User(RingKind::kRingSuperUser, kSuperUser); + Kernel::kcout << "newoskrnl: logged in as: " << Kernel::UserView::The()->fRootUser->Name().CData() << Kernel::endl; + + Kernel::UserView::The()->LogIn(Kernel::UserView::The()->fRootUser); Kernel::kcout << "newoskrnl: " << cKernelVersion.GetKey().CData() << ": " << Kernel::number(cKernelVersion.GetValue()) << Kernel::endl; } diff --git a/Kernel/Sources/User.cxx b/Kernel/Sources/User.cxx index 1deac5be..68d0d5be 100644 --- a/Kernel/Sources/User.cxx +++ b/Kernel/Sources/User.cxx @@ -51,4 +51,14 @@ namespace Kernel { return this->fRing; } + + Bool User::IsStdUser() noexcept + { + return this->Ring() == RingKind::kRingStdUser; + } + + Bool User::IsSuperUser() noexcept + { + return this->Ring() == RingKind::kRingSuperUser; + } } // namespace Kernel |
