Update Server.php and add actions

This commit is contained in:
Collin 2024-02-02 12:20:59 +00:00
parent 5833b2a660
commit 7a3acc47d7
13 changed files with 248 additions and 48 deletions

View File

@ -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");

View File

@ -1 +1 @@
cd build/debug ; php LonaDB-4.0.0-beta.phar
cd build/debug ; php LonaDB-4.0.0-beta.phar -dextension=openswoole.so

View File

@ -0,0 +1,33 @@
<?php
return new class {
public function run($lona, $data, $server, $fd) {
if (!$lona->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);
}
};

View File

@ -0,0 +1,70 @@
<?php
return new class {
public function run($lona, $data, $server, $fd) {
if (!$data['table']['name']) {
$response = json_encode(["success" => 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;
}
}
};

View File

@ -0,0 +1,51 @@
<?php
return new class {
public function run($lona, $data, $server, $fd) {
if (!$data['table']['name']) {
$response = json_encode(["success" => 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;
}
};

View File

@ -0,0 +1,53 @@
<?php
return new class {
public function run($lona, $data, $server, $fd) {
if(!$data['table']['name']) {
$response = json_encode(["success" => 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);
}
};

View File

@ -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);
}

View File

@ -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());
}
}
}

View File

@ -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."'");

View File

@ -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){

View File

@ -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));

View File

@ -12,6 +12,5 @@
{
"name": "Lona Devs"
}
],
"require": {}
]
}

2
src/composer.lock generated
View File

@ -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": [],