From 99f2e07f63311cce59c66d7718b0726e5f31da20 Mon Sep 17 00:00:00 2001 From: Skylar Ittner Date: Mon, 11 Feb 2019 15:21:27 -0700 Subject: [PATCH] Add API key types --- api/apisettings.php | 87 +++++++++++++++++++++++++++++--------------- api/functions.php | 38 +++++++++++++++++++ api/index.php | 9 +++++ database.mwb | Bin 22851 -> 22861 bytes 4 files changed, 105 insertions(+), 29 deletions(-) diff --git a/api/apisettings.php b/api/apisettings.php index 0b2767a..32ce97f 100644 --- a/api/apisettings.php +++ b/api/apisettings.php @@ -12,14 +12,16 @@ $APIS = [ "vars" => [ ], "permission" => [ - ] + ], + "keytype" => "NONE" ], "auth" => [ "load" => "auth.php", "vars" => [ "username" => "string", "password" => "string" - ] + ], + "keytype" => "AUTH" ], "userinfo" => [ "load" => "userinfo.php", @@ -28,7 +30,8 @@ $APIS = [ "username" => "string", "uid" => "numeric" ] - ] + ], + "keytype" => "READ" ], "userexists" => [ "load" => "userexists.php", @@ -37,33 +40,38 @@ $APIS = [ "username" => "string", "uid" => "numeric" ] - ] + ], + "keytype" => "AUTH" ], "hastotp" => [ "load" => "hastotp.php", "vars" => [ "username" => "string" - ] + ], + "keytype" => "AUTH" ], "verifytotp" => [ "load" => "verifytotp.php", "vars" => [ "username" => "string", "code" => "string" - ] + ], + "keytype" => "AUTH" ], "acctstatus" => [ "load" => "acctstatus.php", "vars" => [ "username" => "string" - ] + ], + "keytype" => "AUTH" ], "login" => [ "load" => "login.php", "vars" => [ "username" => "string", "password" => "string" - ] + ], + "keytype" => "AUTH" ], "ismanagerof" => [ "load" => "ismanagerof.php", @@ -71,7 +79,8 @@ $APIS = [ "manager" => "string", "employee" => "string", "uid (optional)" => "numeric" - ] + ], + "keytype" => "READ" ], "getmanaged" => [ "load" => "getmanaged.php", @@ -81,7 +90,8 @@ $APIS = [ "uid" => "numeric" ], "get (optional)" => "string" - ] + ], + "keytype" => "READ" ], "getmanagers" => [ "load" => "getmanagers.php", @@ -90,13 +100,15 @@ $APIS = [ "username" => "string", "uid" => "numeric" ] - ] + ], + "keytype" => "READ" ], "usersearch" => [ "load" => "usersearch.php", "vars" => [ "search" => "string" - ] + ], + "keytype" => "READ" ], "permission" => [ "load" => "permission.php", @@ -106,40 +118,47 @@ $APIS = [ "uid" => "numeric" ], "code" => "string" - ] + ], + "keytype" => "READ" ], "mobileenabled" => [ - "load" => "mobileenabled.php" + "load" => "mobileenabled.php", + "keytype" => "NONE" ], "mobilevalid" => [ "load" => "mobilevalid.php", "vars" => [ "username" => "string", "code" => "string" - ] + ], + "keytype" => "AUTH" ], "alertemail" => [ "load" => "alertemail.php", "vars" => [ "username" => "string", "appname (optional)" => "string" - ] + ], + "keytype" => "FULL" ], "codelogin" => [ "load" => "codelogin.php", "vars" => [ "code" => "string" - ] + ], + "keytype" => "AUTH" ], "listapps" => [ - "load" => "listapps.php" + "load" => "listapps.php", + "keytype" => "NONE" ], "getusersbygroup" => [ "load" => "getusersbygroup.php", "vars" => [ "gid" => "numeric", "get (optional)" => "string" - ] + ], + "keytype" => "READ" ], "getgroupsbyuser" => [ "load" => "getgroupsbyuser.php", @@ -148,16 +167,19 @@ $APIS = [ "uid" => "numeric", "username" => "string" ] - ] + ], + "keytype" => "READ" ], "getgroups" => [ - "load" => "getgroups.php" + "load" => "getgroups.php", + "keytype" => "READ" ], "groupsearch" => [ "load" => "groupsearch.php", "vars" => [ "search" => "string" - ] + ], + "keytype" => "READ" ], "checkpin" => [ "load" => "checkpin.php", @@ -167,7 +189,8 @@ $APIS = [ "uid" => "numeric", "username" => "string" ] - ] + ], + "keytype" => "AUTH" ], "getnotifications" => [ "load" => "getnotifications.php", @@ -176,7 +199,8 @@ $APIS = [ "uid" => "numeric", "username" => "string" ] - ] + ], + "keytype" => "READ" ], "readnotification" => [ "load" => "readnotification.php", @@ -186,7 +210,8 @@ $APIS = [ "username" => "string" ], "id" => "numeric" - ] + ], + "keytype" => "FULL" ], "addnotification" => [ "load" => "addnotification.php", @@ -200,7 +225,8 @@ $APIS = [ "timestamp (optional)" => "string", "url (optional)" => "string", "sensitive (optional)" => "string" - ] + ], + "keytype" => "FULL" ], "deletenotification" => [ "load" => "deletenotification.php", @@ -210,19 +236,22 @@ $APIS = [ "username" => "string" ], "id" => "numeric" - ] + ], + "keytype" => "FULL" ], "getloginkey" => [ "load" => "getloginkey.php", "vars" => [ "appname" => "string", "appicon (optional)" => "string" - ] + ], + "keytype" => "AUTH" ], "checkloginkey" => [ "load" => "checkloginkey.php", "vars" => [ "code" => "string" - ] + ], + "keytype" => "AUTH" ] ]; diff --git a/api/functions.php b/api/functions.php index 78e84c1..551f34f 100644 --- a/api/functions.php +++ b/api/functions.php @@ -121,3 +121,41 @@ function checkVars($vars, $or = false) { } } } + +/** + * Check if the client API key is allowed to access API functions that require the + * specified API key type. + * @global type $VARS + * @global type $database + * @param string $type The required key type: "NONE", "AUTH", "READ", or "FULL" + * @return bool + */ +function checkkeytype(string $type): bool { + global $VARS, $database; + if (empty($VARS['key'])) { + return false; + } else { + $key = $VARS['key']; + $keytype = $database->get('apikeys', 'type', ['key' => $key]); + $allowedtypes = []; + switch ($type) { + case "NONE": + $allowedtypes = ["NONE", "AUTH", "READ", "FULL"]; + break; + case "AUTH": + $allowedtypes = ["AUTH", "READ", "FULL"]; + break; + case "READ": + $allowedtypes = ["READ", "FULL"]; + break; + case "FULL": + $allowedtypes = ["FULL"]; + } + if (!in_array($type, $allowedtypes)) { + http_response_code(403); + Log::insert(LogType::API_BAD_KEY, null, "Key: " . $key); + return false; + } + } + return true; +} \ No newline at end of file diff --git a/api/index.php b/api/index.php index 59d0c2a..3821d60 100644 --- a/api/index.php +++ b/api/index.php @@ -74,4 +74,13 @@ if (!empty($APIACTION["vars"])) { checkVars($APIACTION["vars"]); } +// Assume we need full API access +if (empty($APIACTION["keytype"])) { + $APIACTION["keytype"] = "FULL"; +} + +if (!checkkeytype($APIACTION["keytype"])) { + die("403 Unauthorized"); +} + require_once __DIR__ . "/actions/" . $APIACTION["load"]; diff --git a/database.mwb b/database.mwb index 235a664ece2b274f164e3fc457d68d5f148f96b2..a7fea3b060f553ace419e09f7fcf7f4fc134dcbb 100644 GIT binary patch delta 15591 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 KR!s!c5&2(@809?x delta 15559 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