diff --git a/build/build-phar.php b/build/build-phar.php index 6d3f0fe..95c0a89 100644 --- a/build/build-phar.php +++ b/build/build-phar.php @@ -13,13 +13,18 @@ $filename = $config->{"filename"}; $version = $config->{"version"}; $branch = "debug"; -if($config->{"debug"}) $path = $path."/debug"; +if($config->{"debug"}) { + $path = $path."/debug"; + $debug = "True"; +} else { + $debug = "False"; $path = $path."/release"; $branch = "release"; } -echo "[CONF] Debug=".$config->{"debug"}."\n"; + +echo "[CONF] Debug=".$debug."\n"; echo "[CONF] Path=".$path."\n"; echo "[CONF] Filename=".$filename."\n"; echo "[CONF] Version=".$version."\n"; diff --git a/src/LonaDB/Actions/check_permission.php b/src/LonaDB/Actions/check_permission.php index c17a147..ee91b30 100644 --- a/src/LonaDB/Actions/check_permission.php +++ b/src/LonaDB/Actions/check_permission.php @@ -17,7 +17,7 @@ return new class { return; } - $permission = $lona->UserManager->CheckPermission($data['permission']['user'], $data['permission']['name']); + $permission = $lona->UserManager->CheckPermission($data['permission']['user'], $data['permission']['name'], $data['login']['name']); $response = json_encode(["success" => true, "result" => $permission, "process" => $data['process']]); $server->send($fd, $response); diff --git a/src/LonaDB/Actions/create_table.php b/src/LonaDB/Actions/create_table.php index 2965fa0..06666b9 100644 --- a/src/LonaDB/Actions/create_table.php +++ b/src/LonaDB/Actions/create_table.php @@ -17,6 +17,13 @@ return new class { return; } + if(str_starts_with($data['table']['name'], "system.") && $data['login']['name'] !== "root"){ + $response = json_encode(["success" => false, "err" => "not_root", "process" => $data['process']]); + $server->send($fd, $response); + $server->close($fd); + return; + } + $table = $lona->TableManager->CreateTable($data['table']['name'], $data['login']['name']); if(!$table){ diff --git a/src/LonaDB/Actions/delete_user.php b/src/LonaDB/Actions/delete_user.php index eec368f..5a7a35e 100644 --- a/src/LonaDB/Actions/delete_user.php +++ b/src/LonaDB/Actions/delete_user.php @@ -17,7 +17,7 @@ return new class { return; } - if(!$lona->UserManager->CheckUser($data['user'])){ + if(!$lona->UserManager->CheckUser($data['user']['name'])){ $response = json_encode(["success" => false, "err" => "user_doesnt_exist", "process" => $data['process']]); $server->send($fd, $response); $server->close($fd); diff --git a/src/LonaDB/Actions/eval.php b/src/LonaDB/Actions/eval.php index a50cec5..a192d2a 100644 --- a/src/LonaDB/Actions/eval.php +++ b/src/LonaDB/Actions/eval.php @@ -1,22 +1,36 @@ false, "err" => "not_root", "process" => $data['process']]); $server->send($fd, $response); $server->close($fd); } - $evalFunc = "function evaluate_".$data['process']."(\$lona) { "; - $evalFunc .= $data['function']; - $evalFunc .= " }"; + $evalFunc = "\$functions['" . $data['process'] . "'] = new class { \n"; + $evalFunc .= "public function Execute(\$LonaDB) : mixed {\n"; + $evalFunc .= $data['function'] . "\n"; + $evalFunc .= "}\n};"; - eval($evalFunc); + try{ + eval($evalFunc); - eval("\$answer = evaluate_".$data['process']."(\$lonaEval);"); - - echo $answer; + try{ + $answer = $functions[$data['process']]->Execute($LonaDB); + } + catch(e){ + $answer = e; + } + } + catch(e){ + $answer = e; + } $response = json_encode(["success" => true, "response" => $answer, "process" => $data['process']]); $server->send($fd, $response); diff --git a/src/LonaDB/Actions/get_permissions_raw.php b/src/LonaDB/Actions/get_permissions_raw.php index d8149c9..64df1f9 100644 --- a/src/LonaDB/Actions/get_permissions_raw.php +++ b/src/LonaDB/Actions/get_permissions_raw.php @@ -2,6 +2,13 @@ return new class { public function run($lona, $data, $server, $fd) : void { + if($data['login']['name'] !== "root" && $lona->UserManager->GetRole($data['login']['name']) !== "Administrator"){ + $response = json_encode(["success" => false, "err" => "not_allowed", "process" => $data['process']]); + $server->send($fd, $response); + $server->close($fd); + return; + } + if(!$lona->UserManager->CheckUser($data['user'])){ $response = json_encode(["success" => false, "err" => "user_doesnt_exist", "process" => $data['process']]); $server->send($fd, $response); @@ -11,8 +18,8 @@ return new class { $permissions = $lona->UserManager->GetPermissions($data['user']); - if($permissions === []) $response = '{ "success": true, "list": {}, "process": "'.$data['process'].' }'; - else $response = json_encode(["success" => true, "list" => $permissions, "process" => $data['process']]); + if($permissions === []) $response = '{ "success": true, "list": {}, "role": "' . $lona->UserManager->GetRole($data['user']) . '", "process": "'.$data['process'].'" }'; + else $response = json_encode(["success" => true, "list" => $permissions, "role" => $lona->UserManager->GetRole($data['user']), "process" => $data['process']]); $server->send($fd, $response); $server->close($fd); } diff --git a/src/LonaDB/Actions/get_table_data.php b/src/LonaDB/Actions/get_table_data.php index f3c5ef2..bcc18b7 100644 --- a/src/LonaDB/Actions/get_table_data.php +++ b/src/LonaDB/Actions/get_table_data.php @@ -16,9 +16,9 @@ return new class { return; } - $tableData = $lona->TableManager->GetData(); + $tableData = $lona->TableManager->getTable($data['table'])->GetData(); - if($tableData === []) $response = '{ "success": true, "data": {}, "process": "'.$data['process'].' }'; + if($tableData === []) $response = '{ "success": true, "data": {}, "process": "'.$data['process'].'" }'; else $response = json_encode(["success" => true, "data" => $tableData, "process" => $data['process']]); $server->send($fd, $response); $server->close($fd); diff --git a/src/LonaDB/Tables/TableManager.php b/src/LonaDB/Tables/TableManager.php index 6d2640f..519c72f 100644 --- a/src/LonaDB/Tables/TableManager.php +++ b/src/LonaDB/Tables/TableManager.php @@ -76,7 +76,7 @@ class TableManager{ return false; } - unlink("data/".$name.".json"); + unlink("data/tables/".$name.".lona"); unset($this->Tables[$name]); $this->LonaDB->Logger->Table("Deleted table '" . $name . "', requested by user '" . $user . "'"); return true; diff --git a/src/LonaDB/Users/UserManager.php b/src/LonaDB/Users/UserManager.php index 819e52c..ab403b7 100644 --- a/src/LonaDB/Users/UserManager.php +++ b/src/LonaDB/Users/UserManager.php @@ -31,11 +31,9 @@ class UserManager{ } public function CheckPassword(string $name, string $password) : bool { - $this->LonaDB->Logger->User("Trying to check password for user '" . $name . "'"); if($name === "root" && $password === $this->LonaDB->config["root"]) return true; if(!$this->Users[$name]) { - $this->LonaDB->Logger->User("User '".$name."'doesn't exist"); return false; } @@ -57,7 +55,7 @@ class UserManager{ array_push($users, $name); } - return users; + return $users; } public function CreateUser(string $name, string $password) : bool { @@ -69,7 +67,7 @@ class UserManager{ } $this->Users[$name] = array( - "role" => "user", + "role" => "User", "password" => $password, "permissions" => [ "default" => true @@ -97,14 +95,49 @@ class UserManager{ return true; } + public function GetRole(string $name) : string { + if($name === "root") return "Superuser"; + if(!$this->CheckUser($name)) return ""; + + return $this->Users[$name]['role']; + } + public function CheckPermission(string $name, string $permission, string $user = "") : bool { + if(!$this->CheckUser($name)) return false; + if($this->GetRole($name) === "Administrator" || $this->GetRole($name) === "Superuser") return true; + + if(!$this->Users[$name]['permissions'][$permission]) return false; + return true; } public function GetPermissions(string $name) : array { + if($name === "root") return []; return $this->Users[$name]['permissions']; } + public function AddPermission(string $name, string $permission) : bool { + if($name === "root") return false; + if(!$this->CheckUser($name)) return false; + + $this->Users[$name]['permissions'][$permission] = true; + $this->LonaDB->Logger->User("Added permission '" . $permission . "' to user '" . $name . "'"); + + $this->Save(); + return true; + } + + public function RemovePermission(string $name, string $permission) : bool { + if($name === "root") return false; + if(!$this->CheckUser($name)) return false; + + unset($this->Users[$name]['permissions'][$permission]); + $this->LonaDB->Logger->User("Removed permission '" . $permission . "' from user '" . $name . "'"); + + $this->Save(); + return true; + } + public function Save() : void { $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length(AES_256_CBC));