| 
									
										
										
										
											2017-04-24 17:13:08 -06:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-09 19:18:19 -06:00
										 |  |  | /* 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/. */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-24 17:13:08 -06:00
										 |  |  | /** | 
					
						
							|  |  |  |  * This file contains global settings and utility functions. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | ob_start(); // allow sending headers after content
 | 
					
						
							| 
									
										
										
										
											2018-04-15 19:28:34 -06:00
										 |  |  | // Settings file
 | 
					
						
							|  |  |  | require __DIR__ . '/settings.php'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-24 17:13:08 -06:00
										 |  |  | // Unicode, solves almost all stupid encoding problems
 | 
					
						
							|  |  |  | header('Content-Type: text/html; charset=utf-8'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-08 16:08:08 -06:00
										 |  |  | // Strip PHP version
 | 
					
						
							|  |  |  | header('X-Powered-By: PHP'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Security
 | 
					
						
							| 
									
										
										
										
											2017-04-24 17:13:08 -06:00
										 |  |  | header('X-Content-Type-Options: nosniff'); | 
					
						
							|  |  |  | header('X-XSS-Protection: 1; mode=block'); | 
					
						
							| 
									
										
										
										
											2017-11-13 16:14:40 -07:00
										 |  |  | header('X-Frame-Options: "DENY"'); | 
					
						
							|  |  |  | header('Referrer-Policy: "no-referrer, strict-origin-when-cross-origin"'); | 
					
						
							|  |  |  | $SECURE_NONCE = base64_encode(random_bytes(8)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-17 21:44:53 -06:00
										 |  |  | $session_length = 60 * 60 * 1; // 1 hour
 | 
					
						
							| 
									
										
										
										
											2018-05-15 13:44:43 -06:00
										 |  |  | ini_set('session.gc_maxlifetime', $session_length); | 
					
						
							| 
									
										
										
										
											2017-11-08 02:35:12 -07:00
										 |  |  | session_set_cookie_params($session_length, "/", null, false, false); | 
					
						
							| 
									
										
										
										
											2017-04-24 17:13:08 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | session_start(); // stick some cookies in it
 | 
					
						
							| 
									
										
										
										
											2017-05-07 00:14:59 -06:00
										 |  |  | // renew session cookie
 | 
					
						
							| 
									
										
										
										
											2018-05-17 21:44:53 -06:00
										 |  |  | setcookie(session_name(), session_id(), time() + $session_length, "/", false, false); | 
					
						
							| 
									
										
										
										
											2017-11-13 16:14:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | if ($_SESSION['mobile'] === TRUE) { | 
					
						
							|  |  |  |     header("Content-Security-Policy: " | 
					
						
							|  |  |  |             . "default-src 'self';" | 
					
						
							|  |  |  |             . "object-src 'none'; " | 
					
						
							|  |  |  |             . "img-src * data:; " | 
					
						
							|  |  |  |             . "media-src 'self'; " | 
					
						
							|  |  |  |             . "frame-src 'none'; " | 
					
						
							|  |  |  |             . "font-src 'self'; " | 
					
						
							|  |  |  |             . "connect-src *; " | 
					
						
							| 
									
										
										
										
											2018-12-26 16:25:48 -07:00
										 |  |  |             . "style-src 'self' 'unsafe-inline'; " | 
					
						
							|  |  |  |             . "script-src 'self' 'unsafe-inline'"); | 
					
						
							| 
									
										
										
										
											2017-11-13 16:14:40 -07:00
										 |  |  | } else { | 
					
						
							|  |  |  |     header("Content-Security-Policy: " | 
					
						
							|  |  |  |             . "default-src 'self';" | 
					
						
							|  |  |  |             . "object-src 'none'; " | 
					
						
							|  |  |  |             . "img-src * data:; " | 
					
						
							|  |  |  |             . "media-src 'self'; " | 
					
						
							|  |  |  |             . "frame-src 'none'; " | 
					
						
							|  |  |  |             . "font-src 'self'; " | 
					
						
							|  |  |  |             . "connect-src *; " | 
					
						
							| 
									
										
										
										
											2018-12-26 16:25:48 -07:00
										 |  |  |             . "style-src 'self' 'nonce-$SECURE_NONCE'; " | 
					
						
							|  |  |  |             . "script-src 'self' 'nonce-$SECURE_NONCE'"); | 
					
						
							| 
									
										
										
										
											2017-11-13 16:14:40 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-24 17:13:08 -06:00
										 |  |  | //
 | 
					
						
							|  |  |  | // Composer
 | 
					
						
							|  |  |  | require __DIR__ . '/vendor/autoload.php'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // List of alert messages
 | 
					
						
							| 
									
										
										
										
											2018-09-07 15:03:42 -06:00
										 |  |  | require __DIR__ . '/langs/messages.php'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | $libs = glob(__DIR__ . "/lib/*.lib.php"); | 
					
						
							|  |  |  | foreach ($libs as $lib) { | 
					
						
							|  |  |  |     require_once $lib; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-20 23:45:45 -07:00
										 |  |  | $Strings = new Strings($SETTINGS['language']); | 
					
						
							| 
									
										
										
										
											2017-04-24 17:13:08 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Kill off the running process and spit out an error message | 
					
						
							|  |  |  |  * @param string $error error message | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | function sendError($error) { | 
					
						
							| 
									
										
										
										
											2017-11-13 16:14:40 -07:00
										 |  |  |     global $SECURE_NONCE; | 
					
						
							|  |  |  |     die("<!DOCTYPE html>" | 
					
						
							|  |  |  |             . "<meta charset=\"UTF-8\">" | 
					
						
							|  |  |  |             . "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">" | 
					
						
							|  |  |  |             . "<title>Error</title>" | 
					
						
							|  |  |  |             . "<style nonce=\"" . $SECURE_NONCE . "\">" | 
					
						
							|  |  |  |             . "h1 {color: red; font-family: sans-serif; font-size: 20px; margin-bottom: 0px;} " | 
					
						
							|  |  |  |             . "h2 {font-family: sans-serif; font-size: 16px;} " | 
					
						
							|  |  |  |             . "p {font-family: monospace; font-size: 14px; width: 100%; wrap-style: break-word;} " | 
					
						
							|  |  |  |             . "i {font-size: 12px;}" | 
					
						
							|  |  |  |             . "</style>" | 
					
						
							|  |  |  |             . "<h1>A fatal application error has occurred.</h1>" | 
					
						
							|  |  |  |             . "<i>(This isn't your fault.)</i>" | 
					
						
							|  |  |  |             . "<h2>Details:</h2>" | 
					
						
							|  |  |  |             . "<p>" . htmlspecialchars($error) . "</p>"); | 
					
						
							| 
									
										
										
										
											2017-04-24 17:13:08 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-20 23:45:45 -07:00
										 |  |  | date_default_timezone_set($SETTINGS['timezone']); | 
					
						
							| 
									
										
										
										
											2017-04-24 17:13:08 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Database settings
 | 
					
						
							|  |  |  | // Also inits database and stuff
 | 
					
						
							|  |  |  | use Medoo\Medoo; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | $database; | 
					
						
							|  |  |  | try { | 
					
						
							|  |  |  |     $database = new Medoo([ | 
					
						
							| 
									
										
										
										
											2018-12-20 23:45:45 -07:00
										 |  |  |         'database_type' => $SETTINGS['database']['type'], | 
					
						
							|  |  |  |         'database_name' => $SETTINGS['database']['name'], | 
					
						
							|  |  |  |         'server' => $SETTINGS['database']['server'], | 
					
						
							|  |  |  |         'username' => $SETTINGS['database']['user'], | 
					
						
							|  |  |  |         'password' => $SETTINGS['database']['password'], | 
					
						
							|  |  |  |         'charset' => $SETTINGS['database']['charset'] | 
					
						
							| 
									
										
										
										
											2017-04-24 17:13:08 -06:00
										 |  |  |     ]); | 
					
						
							|  |  |  | } catch (Exception $ex) { | 
					
						
							|  |  |  |     //header('HTTP/1.1 500 Internal Server Error');
 | 
					
						
							|  |  |  |     sendError("Database error.  Try again later.  $ex"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-20 23:45:45 -07:00
										 |  |  | if (!$SETTINGS['debug']) { | 
					
						
							| 
									
										
										
										
											2017-04-24 17:13:08 -06:00
										 |  |  |     error_reporting(0); | 
					
						
							|  |  |  | } else { | 
					
						
							|  |  |  |     error_reporting(E_ALL); | 
					
						
							|  |  |  |     ini_set('display_errors', 'On'); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | $VARS; | 
					
						
							|  |  |  | if ($_SERVER['REQUEST_METHOD'] === 'POST') { | 
					
						
							|  |  |  |     $VARS = $_POST; | 
					
						
							|  |  |  |     define("GET", false); | 
					
						
							|  |  |  | } else { | 
					
						
							|  |  |  |     $VARS = $_GET; | 
					
						
							|  |  |  |     define("GET", true); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function dieifnotloggedin() { | 
					
						
							| 
									
										
										
										
											2019-01-02 23:54:53 -07:00
										 |  |  |     global $SETTINGS; | 
					
						
							| 
									
										
										
										
											2017-04-24 17:13:08 -06:00
										 |  |  |     if ($_SESSION['loggedin'] != true) { | 
					
						
							|  |  |  |         sendError("Session expired.  Please log out and log in again."); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-01-02 23:51:47 -07:00
										 |  |  |     $user = new User($_SESSION['uid']); | 
					
						
							|  |  |  |     foreach ($SETTINGS['permissions'] as $perm) { | 
					
						
							|  |  |  |         if (!$user->hasPermission($perm)) { | 
					
						
							|  |  |  |             session_destroy(); | 
					
						
							|  |  |  |             die("You don't have permission to be here."); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-04-24 17:13:08 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Check if the previous database action had a problem. | 
					
						
							|  |  |  |  * @param array $specials int=>string array with special response messages for SQL errors | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | function checkDBError($specials = []) { | 
					
						
							|  |  |  |     global $database; | 
					
						
							|  |  |  |     $errors = $database->error(); | 
					
						
							|  |  |  |     if (!is_null($errors[1])) { | 
					
						
							|  |  |  |         foreach ($specials as $code => $text) { | 
					
						
							|  |  |  |             if ($errors[1] == $code) { | 
					
						
							|  |  |  |                 sendError($text); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         sendError("A database error occurred:<br /><code>" . $errors[2] . "</code>"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function redirectIfNotLoggedIn() { | 
					
						
							| 
									
										
										
										
											2019-01-02 23:54:53 -07:00
										 |  |  |     global $SETTINGS; | 
					
						
							| 
									
										
										
										
											2017-04-24 17:13:08 -06:00
										 |  |  |     if ($_SESSION['loggedin'] !== TRUE) { | 
					
						
							| 
									
										
										
										
											2018-12-20 23:45:45 -07:00
										 |  |  |         header('Location: ' . $SETTINGS['url'] . '/index.php'); | 
					
						
							| 
									
										
										
										
											2017-04-24 17:13:08 -06:00
										 |  |  |         die(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-01-02 23:51:47 -07:00
										 |  |  |     $user = new User($_SESSION['uid']); | 
					
						
							|  |  |  |     foreach ($SETTINGS['permissions'] as $perm) { | 
					
						
							|  |  |  |         if (!$user->hasPermission($perm)) { | 
					
						
							|  |  |  |             session_destroy(); | 
					
						
							|  |  |  |             header('Location: ./index.php'); | 
					
						
							|  |  |  |             die("You don't have permission to be here."); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-04-24 17:13:08 -06:00
										 |  |  | } |