diff options
| -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 |
