summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-08-23 17:12:37 +0200
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-08-23 17:13:00 +0200
commitc9fef8cfeae2047b66858385689d448a1ad5b8d0 (patch)
tree1d55c0af46da0bf0db9b32362b404bb6a51f27ef
parent58ec3282634ccf75006043017ceacffed9a4533c (diff)
[FIX+IMP] 'User' login system in order to use the system according to
permissions. Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
-rw-r--r--dev/ZBA/BootKit/BootKit.hxx2
-rw-r--r--dev/ZBA/amd64-efi.make2
-rw-r--r--dev/ZKA/HALKit/AMD64/HalKernelMain.cxx9
-rw-r--r--dev/ZKA/KernelKit/User.hxx5
-rw-r--r--dev/ZKA/Sources/FS/NewFS.cxx73
-rw-r--r--dev/ZKA/Sources/User.cxx113
6 files changed, 67 insertions, 137 deletions
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<BootDev>::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<VoidPtr>(token), len, this->fUserName);
-
- this->fUserNodePtr = reinterpret_cast<VoidPtr>(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<NFS_CATALOG_STRUCT*>(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<VoidPtr>(const_cast<Char*>(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<NFS_CATALOG_STRUCT*>(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<Char*>(token), user.fUserToken, rt_string_len(user.fUserToken)))
+ Char password[kMaxUserTokenLen] = {0};
+
+ rt_copy_memory(reinterpret_cast<Char*>(const_cast<Char*>(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;
}