Update Server.php and add actions
This commit is contained in:
parent
5833b2a660
commit
7a3acc47d7
@ -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");
|
||||
|
@ -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
|
33
src/LonaDB/Actions/create_table.php
Normal file
33
src/LonaDB/Actions/create_table.php
Normal 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);
|
||||
}
|
||||
};
|
70
src/LonaDB/Actions/get_variable.php
Normal file
70
src/LonaDB/Actions/get_variable.php
Normal 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;
|
||||
}
|
||||
}
|
||||
};
|
51
src/LonaDB/Actions/remove_variable.php
Normal file
51
src/LonaDB/Actions/remove_variable.php
Normal 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;
|
||||
}
|
||||
};
|
53
src/LonaDB/Actions/set_variable.php
Normal file
53
src/LonaDB/Actions/set_variable.php
Normal 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);
|
||||
}
|
||||
};
|
@ -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);
|
||||
}
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
@ -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."'");
|
||||
|
@ -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){
|
||||
|
@ -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));
|
||||
|
||||
|
@ -12,6 +12,5 @@
|
||||
{
|
||||
"name": "Lona Devs"
|
||||
}
|
||||
],
|
||||
"require": {}
|
||||
]
|
||||
}
|
||||
|
2
src/composer.lock
generated
2
src/composer.lock
generated
@ -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": [],
|
||||
|
Loading…
Reference in New Issue
Block a user