diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-08-19 10:14:36 +0200 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-08-19 10:14:36 +0200 |
| commit | 933d1ef6721903895b15c45917a0fc705763fbf5 (patch) | |
| tree | 1aed4505be011528b6a9799bcd29bbc846eefb4a /dev/ZKA/Sources/User.cxx | |
| parent | da70596895d8135e08f8caac6978117697b4c021 (diff) | |
[IMP]
+ Fixed big parts of the user manager's code.
+ Fixed New FS kernel support.
+ Allocate 2GB of RAM for kernel.
- Reported bug to Jira regarding UserManager's TryLogin method.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/ZKA/Sources/User.cxx')
| -rw-r--r-- | dev/ZKA/Sources/User.cxx | 91 |
1 files changed, 67 insertions, 24 deletions
diff --git a/dev/ZKA/Sources/User.cxx b/dev/ZKA/Sources/User.cxx index e05aa283..3aad5ad4 100644 --- a/dev/ZKA/Sources/User.cxx +++ b/dev/ZKA/Sources/User.cxx @@ -29,17 +29,21 @@ namespace Kernel /// \brief Constructs a token by hashing the password. /// \param password password to hash. /// \return the hashed password - const Int32 cred_construct_token(Char* password, User* user) + const Int32 cred_construct_token(Char* password, const Char* in_password, User* user, SizeT length) { if (!password || !user) return -1; - for (Size i_pass = 0; i_pass < rt_string_len(password); ++i_pass) + kcout << "Constructing token...\r"; + + for (Size i_pass = 0; i_pass < length; ++i_pass) { - Char cur_chr = password[i_pass]; + Char cur_chr = in_password[i_pass]; password[i_pass] = cur_chr + (user->IsStdUser() ? cStdUser : cSuperUser); } + kcout << "Done constructing token...\r"; + return 0; } } // namespace Detail @@ -48,46 +52,74 @@ namespace Kernel : fRing((RingKind)sel) { MUST_PASS(sel >= 0); - this->fUserName += userName; + rt_copy_memory((VoidPtr)userName, this->fUserName, rt_string_len(userName)); } User::User(const RingKind& ringKind, const Char* userName) : fRing(ringKind) { - this->fUserName += userName; + rt_copy_memory((VoidPtr)userName, this->fUserName, rt_string_len(userName)); } User::~User() = default; Bool User::TrySave(const Char* password) noexcept { - kcout << "Trying to save password...\r"; - SizeT len = rt_string_len(password); Char* token = new Char[len]; MUST_PASS(token); - rt_copy_memory((VoidPtr)password, token, rt_string_len(password)); + kcout << "Trying to save password...\r"; - Detail::cred_construct_token(token, this); + rt_copy_memory((VoidPtr)password, token, len); + Detail::cred_construct_token(token, password, this, len); if (NewFilesystemManager::GetMounted()) { - auto node = NewFilesystemManager::GetMounted()->Create(kUsersFile); + NewFilesystemManager* new_fs = (NewFilesystemManager*)NewFilesystemManager::GetMounted(); + + kcout << "newoskrnl: Opening catalog.\r"; + + auto node = new_fs->GetParser()->GetCatalog(kUsersFile); - if (node) + if (!node) { - NewFilesystemManager::GetMounted()->Write(this->fUserName.CData(), node, (VoidPtr)token, (this->IsStdUser() ? cStdUser : cSuperUser) | kNewFSCatalogKindMetaFile, len); - delete node; + node = new_fs->GetParser()->CreateCatalog(kUsersFile); } - delete token; + kcout << "newoskrnl: Writing token...\r"; + + NFS_FORK_STRUCT fork{0}; + + fork.Kind = kNewFSRsrcForkKind; + fork.DataSize = rt_string_len(password); + + rt_copy_memory((VoidPtr)this->fUserName, fork.ForkName, rt_string_len(this->fUserName)); + rt_copy_memory((VoidPtr)kUsersFile, fork.CatalogName, rt_string_len(kUsersFile)); + + fork.DataSize = len; + + new_fs->GetParser()->CreateFork(node, fork); + + new_fs->GetParser()->WriteCatalog(node, (fork.Kind == kNewFSRsrcForkKind), reinterpret_cast<VoidPtr>(token), len, this->fUserName); + + delete node; + node = nullptr; + + delete[] token; + token = nullptr; + + kcout << "newoskrnl: Wrote token...\r"; return true; } - delete token; + kcout << "No filesystem mounted...\r"; + + delete[] token; + token = nullptr; + return false; } @@ -101,7 +133,7 @@ namespace Kernel return lhs.fRing != this->fRing; } - StringView& User::Name() noexcept + Char* User::Name() noexcept { return this->fUserName; } @@ -123,7 +155,7 @@ namespace Kernel UserManager* UserManager::The() noexcept { - UserManager* view = nullptr; + static UserManager* view = nullptr; if (!view) view = new UserManager(); @@ -136,22 +168,33 @@ namespace Kernel if (!password || !user) { - ErrLocal() = kErrorInvalidData; - kcout << "newoskrnl: Incorrect data given.\r"; + ErrLocal() = kErrorInvalidData; + return false; } kcout << "newoskrnl: Trying to log-in.\r"; - FileStreamUTF8 file(kUsersFile, "rb"); + NewFilesystemManager* new_fs = (NewFilesystemManager*)NewFilesystemManager::GetMounted(); + + // do not use if unmounted. + + if (!new_fs) + return false; + + auto node = new_fs->GetParser()->GetCatalog(kUsersFile); // ------------------------------------------ // // Retrieve token from a specific file fork. + // Fail on null. // ------------------------------------------ // - auto token = file.Read(user->fUserName.CData()); + if (!node) + return false; + + auto token = new_fs->GetParser()->ReadCatalog(node, rt_string_len(password), user->fUserName); if (!token) { @@ -162,7 +205,7 @@ namespace Kernel } else { - Char generated_token[255] = {0}; + Char generated_token[kMaxUserTokenLen] = {0}; // ================================================== // // Provide password on token variable. @@ -174,7 +217,7 @@ namespace Kernel // Construct token. // ================================================== // - Detail::cred_construct_token(generated_token, user); + Detail::cred_construct_token(generated_token, password, user, rt_string_len(password)); // ================================================== // // Checks if it matches the current token we have. @@ -210,7 +253,7 @@ namespace Kernel } fCurrentUser = user; - Kernel::kcout << "newoskrnl: Logged in as: " << fCurrentUser->Name().CData() << Kernel::endl; + Kernel::kcout << "newoskrnl: Logged in as: " << fCurrentUser->Name() << Kernel::endl; return true; } |
