summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAmlal <amlal@zka.com>2024-07-28 18:08:37 +0200
committerAmlal <amlal@zka.com>2024-07-28 18:09:00 +0200
commit4db57a2d646b1538783a0675b38bada7a0f903ae (patch)
tree3080ba07a6b552bf3d7591574cf69b2a3c8fd0fd
parent3870cac25e895dcca9535d03a79d5ae96b5b023e (diff)
[MHR-36] Finished ticket.
Signed-off-by: Amlal <amlal@zka.com>
-rw-r--r--Kernel/KernelKit/User.hxx77
-rw-r--r--Kernel/Sources/Main.cxx6
-rw-r--r--Kernel/Sources/User.cxx10
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