From 7a3acc47d7dbb5af19e041cee1d3ec778304aa04 Mon Sep 17 00:00:00 2001 From: Collin Date: Fri, 2 Feb 2024 12:20:59 +0000 Subject: [PATCH] Update Server.php and add actions --- build/build-phar.php | 2 +- build/run-phar.sh | 2 +- src/LonaDB/Actions/create_table.php | 33 ++++++++++++ src/LonaDB/Actions/get_variable.php | 70 ++++++++++++++++++++++++++ src/LonaDB/Actions/remove_variable.php | 51 +++++++++++++++++++ src/LonaDB/Actions/set_variable.php | 53 +++++++++++++++++++ src/LonaDB/LonaDB.php | 2 - src/LonaDB/Server.php | 58 ++++++++------------- src/LonaDB/Tables/Table.php | 14 +++++- src/LonaDB/Tables/TableManager.php | 2 +- src/LonaDB/Users/UserManager.php | 4 ++ src/composer.json | 3 +- src/composer.lock | 2 +- 13 files changed, 248 insertions(+), 48 deletions(-) create mode 100644 src/LonaDB/Actions/create_table.php create mode 100644 src/LonaDB/Actions/get_variable.php create mode 100644 src/LonaDB/Actions/remove_variable.php create mode 100644 src/LonaDB/Actions/set_variable.php diff --git a/build/build-phar.php b/build/build-phar.php index bf06023..2c60ece 100644 --- a/build/build-phar.php +++ b/build/build-phar.php @@ -64,7 +64,7 @@ try { builderLog("[INFO] Phar archive created successfully"); builderLog("[RUN] Generating run script"); - file_put_contents("./build/run-phar.sh", "cd ".$path." ; php ".$filename."-".$version.".phar"); + file_put_contents("./build/run-phar.sh", "cd ".$path." ; php ".$filename."-".$version.".phar -dextension=openswoole.so"); builderLog("[RUN] Adding Permissions to run script"); exec("chmod 777 ./build/run-phar.sh"); diff --git a/build/run-phar.sh b/build/run-phar.sh index f81e258..748aad5 100755 --- a/build/run-phar.sh +++ b/build/run-phar.sh @@ -1 +1 @@ -cd build/debug ; php LonaDB-4.0.0-beta.phar \ No newline at end of file +cd build/debug ; php LonaDB-4.0.0-beta.phar -dextension=openswoole.so \ No newline at end of file diff --git a/src/LonaDB/Actions/create_table.php b/src/LonaDB/Actions/create_table.php new file mode 100644 index 0000000..d5f16aa --- /dev/null +++ b/src/LonaDB/Actions/create_table.php @@ -0,0 +1,33 @@ +UserManager->CheckPermission($data['login']['name'], "table_create")) { + $lona->Logger->Error("User '".$data['login']['name']."' tried to create a Table without permission"); + $response = json_encode(["success" => false, "err" => "no_permission", "process" => $data['process']]); + $server->send($fd, $response); + $server->close($fd); + return; + } + + if (empty($data['table']['name'])) { + $response = json_encode(["success" => false, "err" => "bad_table_name", "process" => $data['process']]); + $server->send($fd, $response); + $server->close($fd); + return; + } + + $table = $lona->TableManager->CreateTable($data['table']['name'], $data['login']['name']); + + if(!$table){ + $response = json_encode(["success" => false, "err" => "table_exists", "process" => $data['process']]); + $server->send($fd, $response); + $server->close($fd); + return; + } + + $response = json_encode(["success" => true, "process" => $data['process']]); + $server->send($fd, $response); + $server->close($fd); + } +}; diff --git a/src/LonaDB/Actions/get_variable.php b/src/LonaDB/Actions/get_variable.php new file mode 100644 index 0000000..0e9129b --- /dev/null +++ b/src/LonaDB/Actions/get_variable.php @@ -0,0 +1,70 @@ + false, "err" => "bad_table_name", "process" => $data['process']]); + $server->send($fd, $response); + $server->close($fd); + return; + } + + if(!$lona->TableManager->GetTable($data['table']['name'])) { + $response = json_encode(["success" => false, "err" => "table_missing", "process" => $data['process']]); + $server->send($fd, $response); + $server->close($fd); + return; + } + + if (!$lona->TableManager->GetTable($data['table']['name'])->CheckPermission($data['login']['name'], "read")){ + $response = json_encode(["success" => false, "err" => "missing_permissions", "process" => $data['process']]); + $server->send($fd, $response); + $server->close($fd); + return; + } + + if (!$data['variable']['name']) { + $response = json_encode(["success" => false, "err" => "bad_variable_name", "process" => $data['process']]); + $server->send($fd, $response); + $server->close($fd); + return; + } + + $value = $lona->TableManager->GetTable($data['table']['name'])->Get($data['variable']['name'], $data['login']['name']); + + $response = [ + "variable" => [ + "name" => $data['variable']['name'], + "value" => null, + ], + "success" => false, + "process" => $data['process'] + ]; + + if (is_array($value) && isset($value['err'])) { + $value['process'] = $data['process']; + $server->send($fd, json_encode($value)); + $server->close($fd); + return; + } + + if ($value === null) { + $response = [ + "success" => false, + "err" => "variable_undefined", + "process" => $data['process'] + ]; + + $server->send($fd, json_encode($response)); + $server->close($fd); + return; + } else { + $response['variable']['value'] = $value; + $response['success'] = true; + + $server->send($fd, json_encode($response)); + $server->close($fd); + return; + } + } +}; \ No newline at end of file diff --git a/src/LonaDB/Actions/remove_variable.php b/src/LonaDB/Actions/remove_variable.php new file mode 100644 index 0000000..d2c4f95 --- /dev/null +++ b/src/LonaDB/Actions/remove_variable.php @@ -0,0 +1,51 @@ + false, "err" => "bad_table_name", "process" => $data['process']]); + $server->send($fd, $response); + $server->close($fd); + return; + } + + if(!$lona->TableManager->GetTable($data['table']['name'])) { + $response = json_encode(["success" => false, "err" => "table_missing", "process" => $data['process']]); + $server->send($fd, $response); + $server->close($fd); + return; + } + + if (!$data['variable']['name']) { + $response = json_encode(["success" => false, "err" => "bad_variable_name", "process" => $data['process']]); + $server->send($fd, $response); + $server->close($fd); + return; + } + + if (!$lona->TableManager->GetTable($data['table']['name'])->CheckPermission($data['login']['name'], "read")) { + $response = json_encode(["success" => false, "err" => "no_permission", "process" => $data['process']]); + $server->send($fd, $response); + $server->close($fd); + return; + } + + if(!$lona->TableManager->GetTable($data['table']['name'])->CheckVariable($data['variable']['name'], $data['login']['name'])){ + $response = json_encode(["success" => false, "err" => "missing_variable", "process" => $data['process']]); + $server->send($fd, $response); + $server->close($fd); + return; + } + + $lona->TableManager->GetTable($data['table']['name'])->Delete($data['variable']['name'], $data['login']['name']); + + $response = [ + "success" => true, + "process" => $data['process'] + ]; + + $server->send($fd, json_encode($response)); + $server->close($fd); + return; + } +}; diff --git a/src/LonaDB/Actions/set_variable.php b/src/LonaDB/Actions/set_variable.php new file mode 100644 index 0000000..2eadd44 --- /dev/null +++ b/src/LonaDB/Actions/set_variable.php @@ -0,0 +1,53 @@ + false, "err" => "bad_table_name", "process" => $data['process']]); + $server->send($fd, $response); + $server->close($fd); + return; + } + + if(!$lona->TableManager->GetTable($data['table']['name'])) { + $response = json_encode(["success" => false, "err" => "table_missing", "process" => $data['process']]); + $server->send($fd, $response); + $server->close($fd); + return; + } + + if (!$lona->TableManager->GetTable($data['table']['name'])->CheckPermission($data['login']['name'], "write")){ + $response = json_encode(["success" => false, "err" => "missing_permissions", "process" => $data['process']]); + $server->send($fd, $response); + $server->close($fd); + return; + } + + if(!$data['variable']['name']) { + $response = json_encode(["success" => false, "err" => "bad_variable_name", "process" => $data['process']]); + $server->send($fd, $response); + $server->close($fd); + return; + } + + if(!$data['variable']['value']) { + $response = json_encode(["success" => false, "err" => "bad_variable_value", "process" => $data['process']]); + $server->send($fd, $response); + $server->close($fd); + return; + } + + if(!$lona->TableManager->GetTable($data['table']['name'])->CheckPermission($data['login']['name'], 'write')){ + $response = json_encode(["success" => false, "err" => "missing_permission", "process" => $data['process']]); + $server->send($fd, $response); + $server->close($fd); + return; + } + + $lona->TableManager->GetTable($data['table']['name'])->Set($data['variable']['name'], $data['variable']['value'], $data['login']['name']); + + $response = json_encode(["success" => true, "process" => $data['process']]); + $server->send($fd, $response); + $server->close($fd); + } +}; diff --git a/src/LonaDB/LonaDB.php b/src/LonaDB/LonaDB.php index a2e90e5..fac59c1 100644 --- a/src/LonaDB/LonaDB.php +++ b/src/LonaDB/LonaDB.php @@ -66,8 +66,6 @@ class LonaDB { $this->TableManager = new TableManager($this); $this->Logger->Info("Loading UserManager class."); $this->UserManager = new UserManager($this); - - //The server has to be loaded as the last class! $this->Logger->Info("Loading Server class."); $this->Server = new Server($this); } diff --git a/src/LonaDB/Server.php b/src/LonaDB/Server.php index b9ea41d..9dea3ab 100644 --- a/src/LonaDB/Server.php +++ b/src/LonaDB/Server.php @@ -4,11 +4,13 @@ namespace LonaDB; require 'vendor/autoload.php'; use LonaDB\LonaDB; +use OpenSwoole\Server as TCPServer; class Server { private array $config; private LonaDB $LonaDB; + private TCPServer $server; private string $address; private int $port; @@ -31,43 +33,27 @@ class Server { if (pathinfo($file, PATHINFO_EXTENSION) === 'php') { $actionName = pathinfo($file, PATHINFO_FILENAME); $this->actions[$actionName] = require(__DIR__ . "/Actions/" . $file); - $this->LonaDB->Logger->Info("Loaded Networking action from file '".$actionName."'" . PHP_EOL); + $this->LonaDB->Logger->Info("Loaded Networking action from file '".$actionName."'"); } } } public function startSocket() { - $socket = stream_socket_server("tcp://".$this->address.":".$this->port, $errno, $errstr); + $this->server = new TCPServer($this->address, $this->port); - if (!$socket) { - $this->LonaDB->Logger->Error($errno." - ".$errstr . PHP_EOL); - exit(); - } + $this->server->on('start', function ($server) + { + $this->LonaDB->Logger->Info("Server running on port ".$this->port); + }); + + $this->server->on('receive', function (TCPServer $server, int $fd, int $fromId, string $data) { + $this->handleData($data, $server, $fd); + }); - $this->LonaDB->Logger->Info("Server listening on port " . $this->port. PHP_EOL); - - stream_set_blocking($socket, 0); - - while ($client = stream_socket_accept($socket, -1)) { - $pid = pcntl_fork(); - - if ($pid == -1) { - } elseif ($pid) { - fclose($client); - } else { - $this->handleClient($client); - exit(); - } - } + $this->server->start(); } - private function handleClient($client) { - $dataString = stream_get_contents($client, 1048576); - $this->handleData($dataString, $client); - fclose($client); - } - - private function handleData($dataString, $client) { + private function handleData(string $dataString, TCPServer $server, int $fd) { try { $data = json_decode($dataString, true); @@ -77,33 +63,29 @@ class Server { if (!$login) { $response = json_encode(["success" => false, "err" => "login_error", "process" => $data['process']]); - fwrite($client, $response); + $server->send($fd, $response); return; } if (!$data['process']) { $response = json_encode(["success" => false, "err" => "bad_process_id", "process" => $data['process']]); - fwrite($client, $response); + $server->send($fd, $response); return; } if (!$this->actions[$data['action']]) { $response = json_encode(["success" => false, "err" => "action_not_found"]); - fwrite($client, $response); + $server->send($fd, $response); return; } try { - $this->actions[$data['action']]->Run($this->LonaDB, $data, $client); + $this->actions[$data['action']]->Run($this->LonaDB, $data, $server, $fd); } catch (Exception $e) { - $this->LonaDB->Loggin->Error($e->getMessage() . PHP_EOL); + $this->LonaDB->Loggin->Error($e->getMessage()); } - - ob_end_flush(); - ob_flush(); - flush(); } catch (Exception $e) { - $this->LonaDB->Loggin->Error($e->getMessage() . PHP_EOL); + $this->LonaDB->Loggin->Error($e->getMessage()); } } } \ No newline at end of file diff --git a/src/LonaDB/Tables/Table.php b/src/LonaDB/Tables/Table.php index 4a5303d..e92ff70 100644 --- a/src/LonaDB/Tables/Table.php +++ b/src/LonaDB/Tables/Table.php @@ -81,18 +81,28 @@ class Table{ $this->LonaDB->Logger->Table("(".$this->file.") User '".$user."' is trying to get the variable '".$name."'"); if(!$this->CheckPermission($user, "read")) return null; - return $this->data->{$name}; + return $this->data[$name]; } public function CheckPermission(string $user, string $permission){ $this->LonaDB->Logger->Table("(".$this->file.") Checkin permission '".$permission."' for user '".$user."'"); - if($user === $this->Owner || $this->permissions[$user]["admin"]) return true; + if($user === $this->Owner) return true; + if($this->permissions[$user]["admin"]) return true; if(!$this->permissions[$user][$permission]) return false; return true; } + public function CheckVariable(string $name, string $user){ + $this->LonaDB->Logger->Table("(".$this->file.") Checkin if variable '".$name."' exists for user '".$user."'"); + + if(!$this->CheckPermission($user, 'read')) return false; + + if(!$this->data[$name]) return false; + return true; + } + public function AddPermission(string $name, string $permission, string $user){ if($user !== $this->Owner && !$this->permissions[$user]["admin"]) return $this->LonaDB->Logger->Table("(".$this->file.") Missing permission! Adding permission '".$permission."' for user '".$name."', requested by '".$user."'"); diff --git a/src/LonaDB/Tables/TableManager.php b/src/LonaDB/Tables/TableManager.php index a9faf98..7249d23 100644 --- a/src/LonaDB/Tables/TableManager.php +++ b/src/LonaDB/Tables/TableManager.php @@ -20,7 +20,6 @@ class TableManager{ foreach (new \DirectoryIterator('data/tables') as $fileInfo) { if(str_ends_with($fileInfo->getFilename(), ".lona")){ - $this->LonaDB->Logger->Load("Loading table from file '" . $fileInfo . "'"); $this->Tables[substr($fileInfo->getFilename(), 0, -5)] = new Table($this->LonaDB, false, $fileInfo->getFilename()); $counter = $counter + 1; } @@ -61,6 +60,7 @@ class TableManager{ } $this->Tables[$name] = new Table($this->LonaDB, true, $name, $owner); $this->LonaDB->Logger->Table("Table '" . $name . "' has been created"); + return true; } public function DeleteTable(string $name, string $user){ diff --git a/src/LonaDB/Users/UserManager.php b/src/LonaDB/Users/UserManager.php index f05f5e4..890727a 100644 --- a/src/LonaDB/Users/UserManager.php +++ b/src/LonaDB/Users/UserManager.php @@ -77,6 +77,10 @@ class UserManager{ $this->Save(); } + public function CheckPermission(string $name){ + return true; + } + public function Save(){ $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length(AES_256_CBC)); diff --git a/src/composer.json b/src/composer.json index 3a68df6..9a8233b 100644 --- a/src/composer.json +++ b/src/composer.json @@ -12,6 +12,5 @@ { "name": "Lona Devs" } - ], - "require": {} + ] } diff --git a/src/composer.lock b/src/composer.lock index 0bc8ffb..2d420f5 100644 --- a/src/composer.lock +++ b/src/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "dc4784b5c77dc7aef8720fbec77a7d65", + "content-hash": "9b5f90876b6bf7a56a75bddb50074efe", "packages": [], "packages-dev": [], "aliases": [],