From c9fef8cfeae2047b66858385689d448a1ad5b8d0 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 23 Aug 2024 17:12:37 +0200 Subject: [FIX+IMP] 'User' login system in order to use the system according to permissions. Signed-off-by: Amlal El Mahrouss --- dev/ZBA/BootKit/BootKit.hxx | 2 +- dev/ZBA/amd64-efi.make | 2 +- dev/ZKA/HALKit/AMD64/HalKernelMain.cxx | 9 +-- dev/ZKA/KernelKit/User.hxx | 5 +- dev/ZKA/Sources/FS/NewFS.cxx | 73 +++++++++------------ dev/ZKA/Sources/User.cxx | 113 +++++++++------------------------ 6 files changed, 67 insertions(+), 137 deletions(-) (limited to 'dev') diff --git a/dev/ZBA/BootKit/BootKit.hxx b/dev/ZBA/BootKit/BootKit.hxx index bdffb69f..166eec5d 100644 --- a/dev/ZBA/BootKit/BootKit.hxx +++ b/dev/ZBA/BootKit/BootKit.hxx @@ -320,7 +320,7 @@ inline Boolean BDiskFormatFactory::Format(const Char* partName, /// @note A catalog roughly equal to a sector. - constexpr auto cMinimumDiskSize = 4; // at minimum. + constexpr auto cMinimumDiskSize = 10; // at minimum. /// @note also look at EPM headers, for free part blocks. diff --git a/dev/ZBA/amd64-efi.make b/dev/ZBA/amd64-efi.make index 70071439..aaaa1222 100644 --- a/dev/ZBA/amd64-efi.make +++ b/dev/ZBA/amd64-efi.make @@ -91,7 +91,7 @@ run-efi-amd64: # img_2 is the rescue disk. img is the bootable disk, as provided by the Zeta. .PHONY: epm-img epm-img: - qemu-img create -f raw $(IMG) 4G + qemu-img create -f raw $(IMG) 10G qemu-img create -f raw $(IMG_2) 4G qemu-img create -f raw $(IMG_3) 4G diff --git a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx index c5548df7..1c3d4187 100644 --- a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx +++ b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx @@ -227,15 +227,10 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept Kernel::NewFilesystemManager::Mount(fs); -#ifdef __DEBUG__ const auto cPassword = "debug_usr"; - Kernel::User user{Kernel::RingKind::kRingSuperUser, kSuperUser}; - - user.TrySave(cPassword); - - Kernel::UserManager::The()->TryLogIn(user); -#endif + Kernel::User user_debug{Kernel::RingKind::kRingSuperUser, kSuperUser}; + Kernel::UserManager::The()->TryLogIn(user_debug, cPassword, cPassword); Kernel::ke_stop(RUNTIME_CHECK_FAILED); } diff --git a/dev/ZKA/KernelKit/User.hxx b/dev/ZKA/KernelKit/User.hxx index 1b719f24..8f126237 100644 --- a/dev/ZKA/KernelKit/User.hxx +++ b/dev/ZKA/KernelKit/User.hxx @@ -17,6 +17,7 @@ #define kGuestUser "\\Local\\Guest" #define kUsersFile "\\Users\\UsrRcrd" +#define kUsersDir "\\Users\\" #define kMaxUserNameLen (255) #define kMaxUserTokenLen (255) @@ -73,7 +74,6 @@ namespace Kernel RingKind fRing{RingKind::kRingStdUser}; Char fUserName[kMaxUserNameLen] = { 0 }; Char fUserToken[kMaxUserTokenLen] = { 0 }; - VoidPtr fUserNodePtr{nullptr}; friend UserManager; }; @@ -92,7 +92,8 @@ namespace Kernel NEWOS_COPY_DELETE(UserManager); STATIC UserManager* The() noexcept; - Bool TryLogIn(User& user) noexcept; + Bool TryLogIn(User& user, const Char* password, const Char* right_password) noexcept; + Bool TryLogIn(User& user, const Char* password) noexcept; User* GetCurrent() noexcept; Void TryLogOff() noexcept; }; diff --git a/dev/ZKA/Sources/FS/NewFS.cxx b/dev/ZKA/Sources/FS/NewFS.cxx index 88c415eb..36e0755e 100644 --- a/dev/ZKA/Sources/FS/NewFS.cxx +++ b/dev/ZKA/Sources/FS/NewFS.cxx @@ -388,7 +388,7 @@ _Output NFS_CATALOG_STRUCT* NewFSParser::CreateCatalog(_Input const Char* name, return nullptr; } - catalogChild->DataFork = partBlock->DiskSize - partBlock->StartCatalog; + catalogChild->DataFork = partBlock->DiskSize - start_free; catalogChild->ResourceFork = catalogChild->DataFork; catalogChild->NextSibling = @@ -624,19 +624,19 @@ bool NewFSParser::WriteCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, Bool auto startFork = (!isRsrcFork) ? catalog->DataFork : catalog->ResourceFork; - NFS_FORK_STRUCT forkDataIn{0}; + NFS_FORK_STRUCT* forkDataIn = new NFS_FORK_STRUCT(); // sanity check of the fork position as the condition to run the loop. while (startFork >= kNewFSCatalogStartAddress) { - drive.fPacket.fPacketContent = &forkDataIn; + drive.fPacket.fPacketContent = forkDataIn; drive.fPacket.fPacketSize = sizeof(NFS_FORK_STRUCT); drive.fPacket.fLba = startFork; drive.fInput(&drive.fPacket); // check the fork, if it's position is valid. - if (forkDataIn.DataOffset <= kNewFSCatalogStartAddress) + if (forkDataIn->DataOffset <= kNewFSCatalogStartAddress) { ErrLocal() = kErrorDiskIsCorrupted; @@ -645,22 +645,23 @@ bool NewFSParser::WriteCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, Bool return false; } - if (forkDataIn.Flags != kNewFSFlagUnallocated && - forkDataIn.Flags != kNewFSFlagDeleted && - StringBuilder::Equals(forkDataIn.ForkName, forkName) && - StringBuilder::Equals(forkDataIn.CatalogName, catalog->Name)) + if (forkDataIn->Flags != kNewFSFlagUnallocated && + forkDataIn->Flags != kNewFSFlagDeleted && + StringBuilder::Equals(forkDataIn->ForkName, forkName) && + StringBuilder::Equals(forkDataIn->CatalogName, catalog->Name)) { - if (forkDataIn.DataSize < sizeOfData) + if (forkDataIn->DataSize < sizeOfData && + forkDataIn->DataSize < 1) { - startFork = forkDataIn.NextSibling; + startFork = forkDataIn->NextSibling; continue; } drive.fPacket.fPacketContent = data; drive.fPacket.fPacketSize = sizeOfData; - drive.fPacket.fLba = forkDataIn.DataOffset; + drive.fPacket.fLba = forkDataIn->DataOffset; - kcout << "newoskrnl: data offset: " << hex_number(forkDataIn.DataOffset) << endl; + kcout << "newoskrnl: data offset: " << hex_number(forkDataIn->DataOffset) << endl; drive.fOutput(&drive.fPacket); @@ -672,19 +673,22 @@ bool NewFSParser::WriteCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, Bool // Store size of blob now. // ===================================================== // - if (forkDataIn.DataSize < sizeOfData) + if (forkDataIn->DataSize < sizeOfData && + forkDataIn->DataSize < 1) { - startFork = forkDataIn.NextSibling; + startFork = forkDataIn->NextSibling + sizeof(NFS_FORK_STRUCT); continue; } - forkDataIn.Flags = kNewFSFlagCreated; + forkDataIn->Flags = kNewFSFlagCreated; + forkDataIn->DataOffset = startFork + sizeof(NFS_FORK_STRUCT); + forkDataIn->DataSize = sizeOfData; drive.fPacket.fPacketContent = data; drive.fPacket.fPacketSize = sizeOfData; - drive.fPacket.fLba = forkDataIn.DataOffset; + drive.fPacket.fLba = startFork + sizeof(NFS_FORK_STRUCT); - kcout << "newoskrnl: data offset: " << hex_number(forkDataIn.DataOffset) << endl; + kcout << "newoskrnl: data offset: " << hex_number(forkDataIn->DataOffset) << endl; drive.fOutput(&drive.fPacket); @@ -694,14 +698,14 @@ bool NewFSParser::WriteCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, Bool drive.fOutput(&drive.fPacket); - kcout << "newoskrnl: wrote fork at offset: " << hex_number(forkDataIn.DataOffset) << endl; + kcout << "newoskrnl: wrote fork at offset: " << hex_number(forkDataIn->DataOffset) << endl; delete catalog; return true; } - startFork = forkDataIn.NextSibling; + startFork = forkDataIn->NextSibling + forkDataIn->DataSize; } return false; @@ -931,6 +935,8 @@ VoidPtr NewFSParser::ReadCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, return nullptr; } + constexpr auto cNewFSCatalogPadding = 4; + Lba dataForkLba = (!isRsrcFork) ? catalog->DataFork : catalog->ResourceFork; Size dataForkSize = (!isRsrcFork) ? catalog->DataForkSize : catalog->ResourceForkSize; @@ -938,14 +944,14 @@ VoidPtr NewFSParser::ReadCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, << ", fork: " << hex_number(dataForkLba) << endl; NFS_FORK_STRUCT* fs_buf = new NFS_FORK_STRUCT(); - auto drive = sMountpointInterface.A(); + auto drive = sMountpointInterface.A(); rt_copy_memory((VoidPtr) "fs/newfs-packet", drive.fPacket.fPacketMime, rt_string_len("fs/newfs-packet")); NFS_FORK_STRUCT* fs_fork_data = nullptr; - while (dataForkLba >= kNewFSCatalogStartAddress) + while (dataForkLba > kNewFSCatalogStartAddress) { drive.fPacket.fLba = dataForkLba; drive.fPacket.fPacketSize = sizeof(NFS_FORK_STRUCT); @@ -955,16 +961,8 @@ VoidPtr NewFSParser::ReadCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, fs_fork_data = fs_buf; - kcout << "newoskrnl: name: " << fs_fork_data->ForkName << endl; - - if (fs_fork_data->DataOffset <= kNewFSCatalogStartAddress) - { - delete[] fs_buf; - - kcout << "Fail-Data-Offset: " << hex_number(fs_fork_data->DataOffset) << endl; - - return nullptr; - } + kcout << "newoskrnl: ForkName: " << fs_fork_data->ForkName << endl; + kcout << "newoskrnl: CatalogName: " << fs_fork_data->CatalogName << endl; if (StringBuilder::Equals(forkName, fs_fork_data->ForkName) && StringBuilder::Equals(catalog->Name, fs_fork_data->CatalogName)) @@ -973,22 +971,13 @@ VoidPtr NewFSParser::ReadCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, dataForkLba = fs_fork_data->NextSibling; } - if (dataForkLba <= kNewFSCatalogStartAddress) + if (dataForkLba < kNewFSCatalogStartAddress) { delete[] fs_buf; return nullptr; } - NFS_FORK_STRUCT* forkBuf = new NFS_FORK_STRUCT(); - - drive.fPacket.fLba = fs_fork_data->DataOffset; - drive.fPacket.fPacketSize = dataSz; - drive.fPacket.fPacketContent = forkBuf; - - drive.fInput(&drive.fPacket); - - delete[] fs_buf; - return forkBuf; + return fs_fork_data; } /***********************************************************************************/ diff --git a/dev/ZKA/Sources/User.cxx b/dev/ZKA/Sources/User.cxx index 620c62f1..62b45e25 100644 --- a/dev/ZKA/Sources/User.cxx +++ b/dev/ZKA/Sources/User.cxx @@ -66,71 +66,31 @@ namespace Kernel rt_copy_memory((VoidPtr)userName, this->fUserName, rt_string_len(userName)); } - User::~User() - { - mm_delete_ke_heap(fUserNodePtr); - } + User::~User() = default; Bool User::TrySave(const Char* password) noexcept { + if (!password || + *password == 0) + return false; + SizeT len = rt_string_len(password); Char* token = new Char[len]; MUST_PASS(token); - kcout << "Trying to save password...\r"; - rt_copy_memory((VoidPtr)password, token, len); Detail::cred_construct_token(token, password, this, len); - if (NewFilesystemManager::GetMounted()) - { - NewFilesystemManager* new_fs = (NewFilesystemManager*)NewFilesystemManager::GetMounted(); - - kcout << "newoskrnl: Opening catalog.\r"; - - auto node = new_fs->GetParser()->GetCatalog(kUsersFile); - - if (!node) - { - ErrLocal() = kErrorDiskIsFull; - return false; - } - - kcout << "newoskrnl: Writing token...\r"; - - NFS_FORK_STRUCT fork{0}; - - fork.Kind = kNewFSDataForkKind; - 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); - - // writing the data fork now. False means a data fork. - bool wrote = new_fs->GetParser()->WriteCatalog(node, false, reinterpret_cast(token), len, this->fUserName); - - this->fUserNodePtr = reinterpret_cast(node); - rt_copy_memory(token, this->fUserToken, rt_string_len(token)); - - delete[] token; - token = nullptr; - - kcout << "newoskrnl: Wrote token?\r"; - return wrote; - } - - kcout << "No filesystem mounted...\r"; + rt_copy_memory(token, this->fUserToken, rt_string_len(token)); delete[] token; token = nullptr; - return false; + kcout << "newoskrnl: Saved password...\r"; + + return true; } bool User::operator==(const User& lhs) @@ -173,48 +133,30 @@ namespace Kernel return view; } - Bool UserManager::TryLogIn(User& user) noexcept + Bool UserManager::TryLogIn(User& user, const Char* password, const Char* right_password) noexcept { - if (!user.fUserToken[0] || - !user.fUserNodePtr) - { - kcout << "newoskrnl: Incorrect data given.\r"; - - ErrLocal() = kErrorInvalidData; - + if (!password || + *password == 0) return false; - } - - kcout << "newoskrnl: Trying to log-in.\r"; - kcout << "newoskrnl: reading: " << reinterpret_cast(user.fUserNodePtr)->Name << endl; - - NewFilesystemManager* new_fs = (NewFilesystemManager*)NewFilesystemManager::GetMounted(); - - if (!new_fs) - { - ErrLocal() = kErrorInvalidCreds; - kcout << "newoskrnl: Incorrect filesystem.\r"; - - return false; - } + rt_copy_memory(reinterpret_cast(const_cast(password)), user.fUserToken, rt_string_len(password)); + Detail::cred_construct_token(user.fUserToken, password, &user, rt_string_len(password)); - NFS_CATALOG_STRUCT* node = new_fs->GetParser()->GetCatalog(kUsersFile); + return this->TryLogIn(user, right_password); + } - if (!node) + Bool UserManager::TryLogIn(User& user, const Char* token) noexcept + { + if (!user.fUserToken[0]) { - node = reinterpret_cast(user.fUserNodePtr); + kcout << "newoskrnl: Incorrect data given.\r"; - if (!node) - { - ErrLocal() = kErrorInvalidCreds; - kcout << "newoskrnl: Incorrect catalog.\r"; + ErrLocal() = kErrorInvalidData; - return false; - } + return false; } - auto token = new_fs->GetParser()->ReadCatalog(node, false, rt_string_len(user.fUserToken), user.fUserName); + kcout << "newoskrnl: Trying to log-in.\r"; if (!token) { @@ -229,11 +171,14 @@ namespace Kernel // Checks if it matches the current token we have. // ================================================== // - if (rt_string_cmp(reinterpret_cast(token), user.fUserToken, rt_string_len(user.fUserToken))) + Char password[kMaxUserTokenLen] = {0}; + + rt_copy_memory(reinterpret_cast(const_cast(token)), password, rt_string_len(token)); + Detail::cred_construct_token(password, token, &user, rt_string_len(password)); + + if (rt_string_cmp(password, user.fUserToken, rt_string_len(token))) { kcout << "newoskrnl: Incorrect credentials.\r"; - mm_delete_ke_heap(token); - return false; } -- cgit v1.2.3