diff options
Diffstat (limited to 'app/class/globals.php')
-rw-r--r-- | app/class/globals.php | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/app/class/globals.php b/app/class/globals.php new file mode 100644 index 0000000..74635d7 --- /dev/null +++ b/app/class/globals.php @@ -0,0 +1,255 @@ +<?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 + */ + +require_once "class/obj.class.php"; + +/* + * This file defines various functions which exist in the global namespace. + * These are utility functions and constants for the Scrott application. + */ + +define("__VERSION__", "v0.1"); + +/* + * 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", "ERROR_LIST"); +define("WARNING", "WARNING_LIST"); +define("NOTICE", "NOTICE_LIST"); + +$_SCROTT[ERROR] = array(); +$_SCROTT[WARNING] = array(); +$_SCROTT[NOTICE] = array(); + +/* + * The page object is the object our current request is primarily + * interested in. For example, when navigating to a pad web page by + * its guid, that pad is the page object. When viewing the dashboard, + * the current logged-in user is the page object. + */ +$_SCROTT['PAGE_OBJECT'] = NULL; + +/* + * The page name variable is what displays in the pad select dropdown and + * is typically set to the "group / pad" of the current page or, "Dashboard", + * "Groups", "Pads", etc. on special pages. + */ +$_SCROTT['PAGE_NAME'] = ""; + +/* + * 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. No argument reloads the current path. + */ +function location(?string $path = NULL) : void +{ + if ($path) + redirect(ar() . $path); + else + redirect(ap()); +} + +/* + * 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]; +} + +/* + * Set the page object for the current request. + */ +function setPageObj(obj $obj) : void +{ + global $_SCROTT; + $_SCROTT['PAGE_OBJECT'] = $obj; +} + +/* + * Get the page object for the current request. + */ +function getPageObj() : ?obj +{ + global $_SCROTT; + return $_SCROTT['PAGE_OBJECT']; +} + +/* + * Set the page name string. + */ +function setPageName(string $name) : void +{ + global $_SCROTT; + $_SCROTT['PAGE_NAME'] = $name; +} + +/* + * Get the page name string. + */ +function getPageName() : string +{ + global $_SCROTT; + return $_SCROTT['PAGE_NAME']; +} + +/* + * Produce a string, but only once. This function is useful + * when dealing with some variable collection of markup and + * you want to affect only the first one with a modifier. + * $state should be initialized to false prior to first call. + */ +function oneStr(string $str, bool &$state) : string +{ + if ($state) + return ""; + + $state = true; + return $str; +} + +/* + * 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; +} + +/* + * Similar to saveFile, but takes the uploaded file field name, + * rather than the array directly. The file is looked up in + * $_FILES. If it does not exist, an exception is thrown. + */ +function saveIfFile(string $file, string $path, int $maxsize, ?array $allowedMime = NULL, + ?string &$origName = NULL, ?string &$origMime = NULL) : bool +{ + if (!isset($_FILES[$file])) + throw new Exception("Requested file upload, but no data was supplied"); + + $f = $_FILES[$file]; + return saveFile($f, $path, $maxsize, $allowedMime, $origName, $origMime); +} + +?> |