automatically configure git paths (dir + public clone url)
[phorkie.git] / src / phorkie / Tools.php
index c6e4db5..2febb29 100644 (file)
@@ -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;
+    }
+}
+?>