From 9aac47f516d2cf002f7e049fcca3bf2c18212c11 Mon Sep 17 00:00:00 2001 From: Skylar Ittner Date: Sun, 1 Jul 2018 20:52:26 -0600 Subject: [PATCH] Add roles/permissions for API keys, add "os" column to machines --- api/index.php | 46 +++++++++++++++++++++++++++++++++++++++++----- database.mwb | Bin 11036 -> 12658 bytes machine.php | 5 ++++- roles.php | 39 +++++++++++++++++++++++++++++++++++++++ routes/info.php | 5 ++++- 5 files changed, 88 insertions(+), 7 deletions(-) create mode 100644 roles.php diff --git a/api/index.php b/api/index.php index 7aafb61..0bbe5d7 100644 --- a/api/index.php +++ b/api/index.php @@ -5,6 +5,7 @@ header('Content-Type: application/json'); require_once __DIR__ . "/../required.php"; require_once __DIR__ . "/../machine.php"; +require_once __DIR__ . "/../roles.php"; $VARS; if ($_SERVER['REQUEST_METHOD'] === 'POST') { @@ -13,14 +14,17 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $VARS = $_GET; } -if (!$database->has('apikeys', ['key' => $VARS['key']])) { - http_response_code(403); - die('{"status": "ERROR", "message": "Invalid API key. Access denied."}'); -} - function sendError($type, $msg = "An error occurred.") { $code = 404; switch ($type) { + case "invalidapikey": + $code = 403; + $msg = "Invalid API key. Access denied."; + break; + case "nopermission": + $code = 403; + $msg = "You don't have permission to do that."; + break; case "nomachineid": $code = 400; $msg = "No machine ID sent."; @@ -36,9 +40,33 @@ function sendError($type, $msg = "An error occurred.") { ])); } +if (!$database->has('apikeys', ['key' => $VARS['key']])) { + sendError("invalidapikey"); +} + +function dieWithoutRole($roleid) { + global $VARS; + $roles = []; + if (is_array($roleid)) { + $roles = $roleid; + } else { + $roles = [$roleid]; + } + $hasrole = false; + foreach ($roles as $r) { + if (Roles::has($VARS['key'], $r)) { + $hasrole = true; + } + } + if (!$hasrole) { + sendError("nopermission"); + } +} + switch ($VARS['action']) { /* Get info */ case "getmachineinfo": + dieWithoutRole(Roles::ROLE_VIEWBYID); if (empty($VARS['id'])) { sendError("nomachineid"); } @@ -51,6 +79,7 @@ switch ($VARS['action']) { } break; case "getmachinehistory": + dieWithoutRole(Roles::ROLE_VIEWBYID); if (empty($VARS['id'])) { sendError("nomachineid"); } @@ -63,6 +92,7 @@ switch ($VARS['action']) { } break; case "getmachinecomponents": + dieWithoutRole(Roles::ROLE_VIEWBYID); if (empty($VARS['id'])) { sendError("nomachineid"); } @@ -84,6 +114,7 @@ switch ($VARS['action']) { /* Save info */ case "addmachine": + dieWithoutRole(Roles::ROLE_ADDEDIT); if (empty($VARS['id'])) { sendError("nomachineid"); } @@ -114,6 +145,9 @@ switch ($VARS['action']) { sendError("", "Machine price must be a number and 0 < price < 10000."); } } + if (!empty($VARS['os'])) { + $data['os'] = $VARS['os']; + } $database->insert('machines', $data); if ($database->error()[1] != 0) { @@ -122,6 +156,7 @@ switch ($VARS['action']) { exit(json_encode(["status" => "OK"])); break; case "addhistory": + dieWithoutRole([Roles::ROLE_ADDEDIT, Roles::ROLE_ADDHIST]); if (empty($VARS['id'])) { sendError("nomachineid"); } @@ -134,6 +169,7 @@ switch ($VARS['action']) { } break; case "addcomponent": + dieWithoutRole(Roles::ROLE_ADDEDIT); if (empty($VARS['id'])) { sendError("nomachineid"); } diff --git a/database.mwb b/database.mwb index faa20cedbc224c829f87b80e0bdcff965dcbf909..f890662746346d538c7a722d2293e8a17a21dd30 100644 GIT binary patch literal 12658 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 literal 11036 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 diff --git a/machine.php b/machine.php index a2a6204..bb84b7d 100644 --- a/machine.php +++ b/machine.php @@ -11,7 +11,7 @@ class Machine { global $database; if ($database->has('machines', ['machineid' => $machineid])) { $this->machineid = $machineid; - $this->machine = $database->get('machines', ['machineid', 'notes', 'model', 'condition', 'price'], ['machineid' => $machineid]); + $this->machine = $database->get('machines', ['machineid', 'notes', 'model', 'condition', 'price', 'os'], ['machineid' => $machineid]); $this->history = $database->select('history', ['[>]event_types' => 'eventid'], ['historyid', 'date', 'eventname', 'notes'], ['machineid' => $machineid]); $this->components = $database->select('components', ['[>]component_types' => 'typeid'], ['compid', 'serial', 'typename', 'tested', 'notes', 'capacity', 'model'], ['machineid' => $machineid]); } else { @@ -35,6 +35,9 @@ class Machine { if (!empty($this->machine['price'])) { $info['price'] = $this->machine['price']; } + if (!empty($this->machine['os'])) { + $info['os'] = $this->machine['os']; + } $info['notes'] = $this->machine['notes']; return $info; } diff --git a/roles.php b/roles.php new file mode 100644 index 0000000..6e4aa19 --- /dev/null +++ b/roles.php @@ -0,0 +1,39 @@ +has('permissions', ["AND" => ['apikey' => $apikey, 'roleid' => $roleid]]) === true; + } + + public static function add($apikey, $roleid) { + global $database; + if (!$database->has('apikeys', ['apikey' => $apikey])) { + throw new Exception("No such API key found."); + } + if (!$database->has('roles', ['roleid' => $roleid])) { + throw new Exception("No such role ID found."); + } + if (!$database->has('permissions', ["AND" => ['apikey' => $apikey, 'roleid' => $roleid]])) { + $database->insert('permissions', ['apikey' => $apikey, 'roleid' => $roleid]); + } + } + + public static function remove($apikey, $roleid) { + global $database; + if (!$database->has('apikeys', ['apikey' => $apikey])) { + throw new Exception("No such API key found."); + } + if (!$database->has('roles', ['roleid' => $roleid])) { + throw new Exception("No such role ID found."); + } + $database->delete('permissions', ["AND" => ['apikey' => $apikey, 'roleid' => $roleid]]); + } + +} diff --git a/routes/info.php b/routes/info.php index 3b0f2bb..0623935 100644 --- a/routes/info.php +++ b/routes/info.php @@ -54,7 +54,10 @@ } break; case "price": - $echo = "Sale Value: $" . number_format($val * 1.0, 2); + $echo = "Est. Value: $" . number_format($val * 1.0, 2); + break; + case "os": + $echo = "Operating System: " . htmlspecialchars($val); break; case "notes": $echo = "
" . htmlspecialchars($val) . "
";