<?php /* * SCROTT IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. * * For more information, please refer to UNLICENSE */ /* * This file defines various functions which exist in the global namespace. * These are utility functions and constants for the Scrott application. */ define("__VERSION__", "v0.0"); /* * These global variables are arrays of strings logged by Scrott business * logic to report errors, warnings, or informational responses to the * user in cases where an exception doesn't need to be thrown. */ define("ERROR", "errorlist"); define("WARNING", "warninglist"); define("NOTICE", "noticelist"); $_SCROTT[ERROR] = array(); $_SCROTT[WARNING] = array(); $_SCROTT[NOTICE] = array(); /* * Get the application root path. This is an absolute path on the server. */ function ar() : string { return substr($_SERVER['SCRIPT_NAME'], 0, -10); // 10 = strlen of "/index.php" } /* * Get the current page's path. This is an absolute path on the server. */ function ap() : string { return ar() . $_SERVER['PATH_INFO']; } /* * Redirect to the given URL and die. */ function redirect(string $url) : void { header("Location: " . $url); exit; } /* * Redirect to the given in-app URL and die. The given URL should be a path * relative to the app root. */ function location(string $path) : void { redirect(ar() . $path); } /* * Assert that the current connection to the server is over HTTPS. Redirect * if not. */ function require_https() : void { if (!isset($_SERVER['HTTPS'])) redirect("https://" . $_SERVER['SERVER_NAME'] . ap()); } /* * Check whether an action string was submitted by the user agent */ function isAction(string $action) : bool { if (!isset($_REQUEST['action'])) return false; return $_REQUEST['action'] == $action; } /* * Get an array of submitted form input */ function input() : array { if (!isset($_REQUEST['input'])) throw new Exception("Requested form input, but no input data was supplied"); return $_REQUEST['input']; } /* * Check for errors, warnings, or notices */ function isError(string $level) : bool { global $_SCROTT; return count($_SCROTT[$level]) > 0; } /* * Log an error, warning, or notice */ function logError(string $level, string $error) : void { global $_SCROTT; $_SCROTT[$level][] = $error; } /* * Get an array of all errors, warnings, or notices */ function getErrors(string $level) : array { global $_SCROTT; return $_SCROTT[$level]; } /* * Save an uploaded file and impose some constraints on supplied * data. Caller can optionally pass some strings by reference to * be given the supplied file's original name and mime-type. * Maxsize is in bytes. If this function returns false, the * appropriate error will be logged. */ function saveFile(array $file, string $path, int $maxsize, ?array $allowedMime = NULL, ?string &$origName = NULL, ?string &$origMime = NULL) : bool { if ($file['error'] > 0) { if ($file['error'] != UPLOAD_ERR_NO_FILE) logError(ERROR, "An unknown error occurred"); return false; } if ($file['size'] > $maxsize) { logError(ERROR, "File must be no larger than " . $maxsize . " bytes"); return false; } if (is_array($allowedMime) && array_search($file['type'], $allowedMime) === false) { logError(ERROR, "File type is not supported"); return false; } if (!move_uploaded_file($file['tmp_name'], $path)) { logError(ERROR, "Error saving uploaded file"); return false; } $origName = $file['name']; $origMime = $file['type']; return true; } ?>