X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=mod%2Fproxy.php;h=de2810dd78e87ba1ae6294a5d4c5b5047401c1bd;hb=13150c09a56de662677ee17a1614a2ee55931890;hp=d26967dddf2f1e6e21d1749728f213236cbab419;hpb=1f0b759e2f6df7af4bc55571168bad3e3acbcd76;p=friendica.git diff --git a/mod/proxy.php b/mod/proxy.php index d26967dddf..de2810dd78 100644 --- a/mod/proxy.php +++ b/mod/proxy.php @@ -44,14 +44,15 @@ function proxy_init() { $thumb = false; $size = 1024; $sizetype = ""; + $basepath = $a->get_basepath(); // If the cache path isn't there, try to create it - if (!is_dir($_SERVER["DOCUMENT_ROOT"]."/proxy")) - if (is_writable($_SERVER["DOCUMENT_ROOT"])) - mkdir($_SERVER["DOCUMENT_ROOT"]."/proxy"); + if (!is_dir($basepath."/proxy")) + if (is_writable($basepath)) + mkdir($basepath."/proxy"); // Checking if caching into a folder in the webroot is activated and working - $direct_cache = (is_dir($_SERVER["DOCUMENT_ROOT"]."/proxy") AND is_writable($_SERVER["DOCUMENT_ROOT"]."/proxy")); + $direct_cache = (is_dir($basepath."/proxy") AND is_writable($basepath."/proxy")); // Look for filename in the arguments if ((isset($a->argv[1]) OR isset($a->argv[2]) OR isset($a->argv[3])) AND !isset($_REQUEST["url"])) { @@ -134,7 +135,7 @@ function proxy_init() { $valid = true; if (!$direct_cache AND ($cachefile == "")) { - $r = q("SELECT * FROM `photo` WHERE `resource-id` = '%s' LIMIT 1", $urlhash); + $r = qu("SELECT * FROM `photo` WHERE `resource-id` = '%s' LIMIT 1", $urlhash); if (count($r)) { $img_str = $r[0]['data']; $mime = $r[0]["desc"]; @@ -211,9 +212,9 @@ function proxy_init() { // advantage: real file access is really fast // Otherwise write in cachefile if ($valid AND $direct_cache) { - file_put_contents($_SERVER["DOCUMENT_ROOT"]."/proxy/".proxy_url($_REQUEST['url'], true), $img_str_orig); + file_put_contents($basepath."/proxy/".proxy_url($_REQUEST['url'], true), $img_str_orig); if ($sizetype <> '') - file_put_contents($_SERVER["DOCUMENT_ROOT"]."/proxy/".proxy_url($_REQUEST['url'], true).$sizetype, $img_str); + file_put_contents($basepath."/proxy/".proxy_url($_REQUEST['url'], true).$sizetype, $img_str); } elseif ($cachefile != '') file_put_contents($cachefile, $img_str_orig); @@ -232,62 +233,87 @@ function proxy_init() { killme(); } -function proxy_url($url, $writemode = false, $size = "") { - global $_SERVER; - +/** + * @brief Transform a remote URL into a local one + * + * This function only performs the URL replacement on http URL and if the + * provided URL isn't local, "the isn't deactivated" (sic) and if the config + * system.proxy_disabled is set to false. + * + * @param string $url The URL to proxyfy + * @param bool $writemode Returns a local path the remote URL should be saved to + * @param string $size One of the PROXY_SIZE_* constants + * + * @return string The proxyfied URL or relative path + */ +function proxy_url($url, $writemode = false, $size = '') { $a = get_app(); + if (substr($url, 0, strlen('http')) !== 'http') { + return $url; + } + // Only continue if it isn't a local image and the isn't deactivated if (proxy_is_local_image($url)) { - $url = str_replace(normalise_link($a->get_baseurl())."/", $a->get_baseurl()."/", $url); - return($url); + $url = str_replace(normalise_link($a->get_baseurl()) . '/', $a->get_baseurl() . '/', $url); + return $url; + } + + if (get_config('system', 'proxy_disabled')) { + return $url; } - if (get_config("system", "proxy_disabled")) - return($url); + // Image URL may have encoded ampersands for display which aren't desirable for proxy + $url = html_entity_decode($url, ENT_NOQUOTES, 'utf-8'); // Creating a sub directory to reduce the amount of files in the cache directory - $basepath = $_SERVER["DOCUMENT_ROOT"]."/proxy"; + $basepath = $a->get_basepath() . '/proxy'; - $path = substr(hash("md5", $url), 0, 2); + $shortpath = hash('md5', $url); + $longpath = substr($shortpath, 0, 2); - if (is_dir($basepath) and $writemode) - if (!is_dir($basepath."/".$path)) { - mkdir($basepath."/".$path); - chmod($basepath."/".$path, 0777); + if (is_dir($basepath) and $writemode) { + if (!is_dir($basepath . '/' . $longpath)) { + mkdir($basepath . '/' . $longpath); + chmod($basepath . '/' . $longpath, 0777); } + } - $path .= "/".strtr(base64_encode($url), '+/', '-_'); + $longpath .= '/' . strtr(base64_encode($url), '+/', '-_'); // Checking for valid extensions. Only add them if they are safe - $pos = strrpos($url, "."); + $pos = strrpos($url, '.'); if ($pos) { - $extension = strtolower(substr($url, $pos+1)); - $pos = strpos($extension, "?"); - if ($pos) + $extension = strtolower(substr($url, $pos + 1)); + $pos = strpos($extension, '?'); + if ($pos) { $extension = substr($extension, 0, $pos); + } } - $extensions = array("jpg", "jpeg", "gif", "png"); - - if (in_array($extension, $extensions)) - $path .= ".".$extension; + $extensions = array('jpg', 'jpeg', 'gif', 'png'); + if (in_array($extension, $extensions)) { + $shortpath .= '.' . $extension; + $longpath .= '.' . $extension; + } - $proxypath = $a->get_baseurl()."/proxy/".$path; + $proxypath = $a->get_baseurl() . '/proxy/' . $longpath; - if ($size != "") - $size = ":".$size; + if ($size != '') { + $size = ':' . $size; + } // Too long files aren't supported by Apache // Writemode in combination with long files shouldn't be possible - if ((strlen($proxypath) > 250) AND $writemode) - return (hash("md5", $url)); - elseif (strlen($proxypath) > 250) - return ($a->get_baseurl()."/proxy/".hash("md5", $url)."?url=".urlencode($url)); - elseif ($writemode) - return ($path); - else - return ($proxypath.$size); + if ((strlen($proxypath) > 250) AND $writemode) { + return $shortpath; + } elseif (strlen($proxypath) > 250) { + return $a->get_baseurl() . '/proxy/' . $shortpath . '?url=' . urlencode($url); + } elseif ($writemode) { + return $longpath; + } else { + return $proxypath . $size; + } } /**