summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/src/UserMgr.cc
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-05-23 23:31:58 +0200
committerAmlal El Mahrouss <amlal@nekernel.org>2025-05-23 23:31:58 +0200
commit6551964ad66de7bc7ccb636c54351be2a260612b (patch)
tree4b8adea356562f7e4365cd24b64f7cac1559da2e /dev/kernel/src/UserMgr.cc
parente2bd3c7b6fcd6147fcbf699be087a475608ffdf7 (diff)
feat(kernel/libSystem): Lots of improvements, see below.
what: - Reworked NetworkDevice. - Reworked RTL8139 driver. - Don't assert fCleanup on NetworkDevice destructor. - Add new Ref types in libSystem. Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev/kernel/src/UserMgr.cc')
-rw-r--r--dev/kernel/src/UserMgr.cc129
1 files changed, 129 insertions, 0 deletions
diff --git a/dev/kernel/src/UserMgr.cc b/dev/kernel/src/UserMgr.cc
new file mode 100644
index 00000000..c41b445b
--- /dev/null
+++ b/dev/kernel/src/UserMgr.cc
@@ -0,0 +1,129 @@
+/*
+ * ========================================================
+ *
+ * NeKernel
+ * Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved.
+ *
+ * File: User.cc
+ * Purpose: User class, used to provide authentication and security.
+ *
+ * ========================================================
+ */
+
+#include <KernelKit/FileMgr.h>
+#include <KernelKit/HeapMgr.h>
+#include <KernelKit/KPC.h>
+#include <KernelKit/UserMgr.h>
+#include <NeKit/KernelPanic.h>
+
+#define kStdUserType (0xEE)
+#define kSuperUserType (0xEF)
+
+/// @file User.cc
+/// @brief Multi-user support.
+
+namespace Kernel {
+namespace Detail {
+ ////////////////////////////////////////////////////////////
+ /// \brief Constructs a password by hashing the password.
+ /// \param password password to hash.
+ /// \return the hashed password
+ ////////////////////////////////////////////////////////////
+ STATIC UInt64 user_fnv_generator(const Char* password, User* user) {
+ if (!password || !user) return 1;
+ if (*password == 0) return 1;
+
+ kout << "user_fnv_generator: Hashing user password...\r";
+
+ const UInt64 FNV_OFFSET_BASIS = 0xcbf29ce484222325ULL;
+ const UInt64 FNV_PRIME = 0x100000001b3ULL;
+
+ UInt64 hash = FNV_OFFSET_BASIS;
+
+ while (*password) {
+ hash ^= (Utf8Char) (*password++);
+ hash *= FNV_PRIME;
+ }
+
+ kout << "user_fnv_generator: Hashed user password.\r";
+
+ return 0;
+ }
+} // namespace Detail
+
+////////////////////////////////////////////////////////////
+/// @brief User ring constructor.
+////////////////////////////////////////////////////////////
+User::User(const Int32& sel, const Char* user_name) : mUserRing((UserRingKind) sel) {
+ MUST_PASS(sel >= 0);
+ rt_copy_memory((VoidPtr) user_name, this->mUserName, rt_string_len(user_name));
+}
+
+////////////////////////////////////////////////////////////
+/// @brief User ring constructor.
+////////////////////////////////////////////////////////////
+User::User(const UserRingKind& ring_kind, const Char* user_name) : mUserRing(ring_kind) {
+ rt_copy_memory((VoidPtr) user_name, this->mUserName, rt_string_len(user_name));
+}
+
+////////////////////////////////////////////////////////////
+/// @brief User destructor class.
+////////////////////////////////////////////////////////////
+User::~User() = default;
+
+Bool User::Save(const UserPublicKey password) noexcept {
+ if (!password || *password == 0) return No;
+
+ this->mUserFNV = Detail::user_fnv_generator(password, this);
+
+ kout << "User::Save: Saved password successfully...\r";
+
+ return Yes;
+}
+
+Bool User::Login(const UserPublicKey password) noexcept {
+ if (!password || !*password) return No;
+
+ // now check if the password matches.
+ if (this->mUserFNV == Detail::user_fnv_generator(password, this)) {
+ kout << "User::Login: Password matches.\r";
+ return Yes;
+ }
+
+ kout << "User::Login: Password doesn't match.\r";
+ return No;
+}
+
+Bool User::operator==(const User& lhs) {
+ return lhs.mUserRing == this->mUserRing;
+}
+
+Bool User::operator!=(const User& lhs) {
+ return lhs.mUserRing != this->mUserRing;
+}
+
+////////////////////////////////////////////////////////////
+/// @brief Returns the user's name.
+////////////////////////////////////////////////////////////
+
+Char* User::Name() noexcept {
+ return this->mUserName;
+}
+
+////////////////////////////////////////////////////////////
+/// @brief Returns the user's ring.
+/// @return The king of ring the user is attached to.
+////////////////////////////////////////////////////////////
+
+const UserRingKind& User::Ring() noexcept {
+ return this->mUserRing;
+}
+
+Bool User::IsStdUser() noexcept {
+ return this->Ring() == UserRingKind::kRingStdUser;
+}
+
+Bool User::IsSuperUser() noexcept {
+ return this->Ring() == UserRingKind::kRingSuperUser;
+}
+} // namespace Kernel