forked from Business/BinStack
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
3.1 KiB
PHTML
124 lines
3.1 KiB
PHTML
6 years ago
|
<?php
|
||
|
|
||
|
/*
|
||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Build and send a simple JSON response.
|
||
|
* @param string $msg A message
|
||
|
* @param string $status "OK" or "ERROR"
|
||
|
* @param array $data More JSON data
|
||
|
*/
|
||
|
function sendJsonResp(string $msg = null, string $status = "OK", array $data = null) {
|
||
|
$resp = [];
|
||
|
if (!is_null($data)) {
|
||
|
$resp = $data;
|
||
|
}
|
||
|
if (!is_null($msg)) {
|
||
|
$resp["msg"] = $msg;
|
||
|
}
|
||
|
$resp["status"] = $status;
|
||
|
header("Content-Type: application/json");
|
||
|
exit(json_encode($resp));
|
||
|
}
|
||
|
|
||
|
function exitWithJson(array $json) {
|
||
|
header("Content-Type: application/json");
|
||
|
exit(json_encode($json));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the API key with most of the characters replaced with *s.
|
||
|
* @global string $key
|
||
|
* @return string
|
||
|
*/
|
||
|
function getCensoredKey() {
|
||
|
global $key;
|
||
|
$resp = $key;
|
||
|
if (strlen($key) > 5) {
|
||
|
for ($i = 2; $i < strlen($key) - 2; $i++) {
|
||
|
$resp[$i] = "*";
|
||
|
}
|
||
|
}
|
||
|
return $resp;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if the request is allowed
|
||
|
* @global type $VARS
|
||
|
* @global type $database
|
||
|
* @return bool true if the request should continue, false if the request is bad
|
||
|
*/
|
||
|
function authenticate(): bool {
|
||
|
global $VARS, $database;
|
||
|
if (empty($VARS['key'])) {
|
||
|
return false;
|
||
|
} else {
|
||
|
$key = $VARS['key'];
|
||
|
if ($database->has('apikeys', ['key' => $key]) !== TRUE) {
|
||
|
engageRateLimit();
|
||
|
http_response_code(403);
|
||
|
Log::insert(LogType::API_BAD_KEY, null, "Key: " . $key);
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
function checkVars($vars, $or = false) {
|
||
|
global $VARS;
|
||
|
$ok = [];
|
||
|
foreach ($vars as $key => $val) {
|
||
|
if (strpos($key, "OR") === 0) {
|
||
|
checkVars($vars[$key], true);
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// Only check type of optional variables if they're set, and don't
|
||
|
// mark them as bad if they're not set
|
||
|
if (strpos($key, " (optional)") !== false) {
|
||
|
$key = str_replace(" (optional)", "", $key);
|
||
|
if (empty($VARS[$key])) {
|
||
|
continue;
|
||
|
}
|
||
|
} else {
|
||
|
if (empty($VARS[$key])) {
|
||
|
$ok[$key] = false;
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
$checkmethod = "is_$val";
|
||
|
if ($checkmethod($VARS[$key]) !== true) {
|
||
|
$ok[$key] = false;
|
||
|
} else {
|
||
|
$ok[$key] = true;
|
||
|
}
|
||
|
}
|
||
|
if ($or) {
|
||
|
$success = false;
|
||
|
$bad = "";
|
||
|
foreach ($ok as $k => $v) {
|
||
|
if ($v) {
|
||
|
$success = true;
|
||
|
break;
|
||
|
} else {
|
||
|
$bad = $k;
|
||
|
}
|
||
|
}
|
||
|
if (!$success) {
|
||
|
http_response_code(400);
|
||
|
die("400 Bad request: variable $bad is missing or invalid");
|
||
|
}
|
||
|
} else {
|
||
|
foreach ($ok as $key => $bool) {
|
||
|
if (!$bool) {
|
||
|
http_response_code(400);
|
||
|
die("400 Bad request: variable $key is missing or invalid");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|