forked from Business/BinStack
		
	
		
			
	
	
		
			124 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			124 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|  | <?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"); | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | } |