X-Git-Url: https://git.cweiske.de/phorkie.git/blobdiff_plain/2b4b34a76f42841e964a549fc64c02ba4f60a3f4..c87f5bbf4f85b875c96d0953c25c2ca824b534d5:/src/phorkie/Tools.php diff --git a/src/phorkie/Tools.php b/src/phorkie/Tools.php index c6e4db5..2febb29 100644 --- a/src/phorkie/Tools.php +++ b/src/phorkie/Tools.php @@ -4,8 +4,18 @@ namespace phorkie; class Tools { + /** + * Delete an entire directory structure + * + * @param string $path Path to delete + * + * @return bool + */ public static function recursiveDelete($path) { + if (!file_exists($path)) { + return true; + } if (!is_dir($path) || is_link($path)) { return unlink($path); } @@ -21,6 +31,106 @@ class Tools return rmdir($path); } -} + /** + * Create a full URL with protocol and host name + * + * @param string $path Path to the file, with leading / + * + * @return string Full URL + */ + public static function fullUrl($path = '') + { + if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']) { + $prot = 'https'; + } else { + $prot = 'http'; + } + return $prot . '://' . $_SERVER['HTTP_HOST'] . $GLOBALS['phorkie']['cfg']['baseurl'] . $path; + } + + /** + * Get the full URL to a path, but remove the .phar file from + * the base URL if necessary + * + * @param string $path Path to the file + * + * @return string Full URL without .phar/ + */ + public static function fullUrlNoPhar($path = '') + { + $base = static::fullUrl(); + if (substr($base, -6) == '.phar/') { + $base = dirname($base) . '/'; + } + return $base . $path; + } + + /** + * Removes malicious parts from a file name + * + * @param string $file File name from the user + * + * @return string Fixed and probably secure filename + */ + public static function sanitizeFilename($file) + { + $file = trim($file); + $file = str_replace(array('\\', '//'), '/', $file); + $file = str_replace('/../', '/', $file); + if (substr($file, 0, 3) == '../') { + $file = substr($file, 3); + } + if (substr($file, 0, 1) == '../') { + $file = substr($file, 1); + } + + return $file; + } + -?> \ No newline at end of file + public static function detectBaseUrl() + { + if (!isset($_SERVER['REQUEST_URI']) + || !isset($_SERVER['SCRIPT_NAME']) + ) { + return '/'; + } + + $scriptName = $_SERVER['SCRIPT_NAME']; + $requestUri = $_SERVER['REQUEST_URI']; + if (substr($scriptName, -4) != '.php') { + //a phar + return $scriptName . '/'; + } + + if (isset($_GET['id'])) { + $idp = strpos($requestUri, '/' . $_GET['id'] . '/'); + if ($idp !== false) { + return substr($requestUri, 0, $idp) . '/'; + } + } + + if (substr($requestUri, -4) != '.php') { + $requestUri .= '.php'; + } + $snl = strlen($scriptName); + if (substr($requestUri, -$snl) == $scriptName) { + return substr($requestUri, 0, -$snl) . '/'; + } + + return '/'; + } + + /** + * Resolves "/../" and "/./" in file paths without validating them. + */ + public static function foldPath($path) + { + $path = str_replace('/./', '/', $path); + $path = str_replace('/./', '/', $path); + $path = preg_replace('#/[^/]+/\.\./#', '/', $path); + $path = preg_replace('#/[^/]+/\.\./#', '/', $path); + return $path; + } +} +?>