From 1a11f365f84586407e4de2d0757a0c15377ea91d Mon Sep 17 00:00:00 2001 From: Skylar Ittner Date: Thu, 25 May 2017 00:43:33 -0600 Subject: [PATCH] Add permissions tables and API function --- api.php | 25 +++++++++++++++++++++++++ database.mwb | Bin 14478 -> 15802 bytes lib/login.php | 19 +++++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/api.php b/api.php index cc576e6..8e776c7 100644 --- a/api.php +++ b/api.php @@ -228,6 +228,31 @@ switch ($VARS['action']) { $data = $database->select('accounts', ['uid', 'username', 'realname (name)'], ["OR" => ['username[~]' => $VARS['search'], 'realname[~]' => $VARS['search']], "LIMIT" => 10]); exit(json_encode(["status" => "OK", "result" => $data])); break; + case "permission": + if (is_empty($VARS['code'])) { + header("HTTP/1.1 400 Bad Request"); + die("\"400 Bad Request\""); + } + $perm = $VARS['code']; + if ($VARS['uid']) { + if ($database->has("accounts", ['uid' => $VARS['uid']])) { + $user = $database->select('accounts', ['username'], ['uid' => $VARS['uid']])[0]['username']; + } else { + exit(json_encode(["status" => "ERROR", "msg" => lang("user does not exist", false)])); + } + } else if ($VARS['username']) { + if ($database->has("accounts", ['username' => $VARS['username']])) { + $user = $VARS['username']; + } else { + exit(json_encode(["status" => "ERROR", "msg" => lang("user does not exist", false)])); + } + } else { + header("HTTP/1.1 400 Bad Request"); + die("\"400 Bad Request\""); + } + $hasperm = account_has_permission($user, $perm); + exit(json_encode(["status" => "OK", "has_permission" => $hasperm])); + break; default: header("HTTP/1.1 400 Bad Request"); die("\"400 Bad Request\""); diff --git a/database.mwb b/database.mwb index ed033633528e119f004e00514e8334986fbcd586..1c75402e29e7a4be7ea8d614564763802678df4a 100644 GIT binary patch literal 15802 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 literal 14478 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 diff --git a/lib/login.php b/lib/login.php index c887f5f..223f8ed 100644 --- a/lib/login.php +++ b/lib/login.php @@ -236,6 +236,25 @@ function get_account_status($username, &$error) { } } +/** + * Check if the given username has the given permission (or admin access) + * @global $database $database + * @param string $username + * @param string $permcode + * @return boolean TRUE if the user has the permission (or admin access), else FALSE + */ +function account_has_permission($username, $permcode) { + global $database; + return $database->has('assigned_permissions', [ + '[>]accounts' => [ + 'uid' => 'uid' + ], + '[>]permissions' => [ + 'permid' => 'permid' + ] + ], ['AND' => ['OR' => ['permcode' => $permcode, 'permcode' => 'ADMIN'], 'username' => $username]]) === TRUE; +} + //////////////////////////////////////////////////////////////////////////////// // Login handling // ////////////////////////////////////////////////////////////////////////////////