overhauling proxy_url
- Decode possible HTML entities in the input URL - Add the safe extension for the shortpath as well - Formatting - Documentation
This commit is contained in:
parent
03943cb4c0
commit
a6bdb2c34a
|
@ -233,66 +233,87 @@ function proxy_init() {
|
||||||
killme();
|
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();
|
$a = get_app();
|
||||||
|
|
||||||
if (substr($url, 0, strlen('http')) !== 'http') {
|
if (substr($url, 0, strlen('http')) !== 'http') {
|
||||||
return($url);
|
return $url;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only continue if it isn't a local image and the isn't deactivated
|
// Only continue if it isn't a local image and the isn't deactivated
|
||||||
if (proxy_is_local_image($url)) {
|
if (proxy_is_local_image($url)) {
|
||||||
$url = str_replace(normalise_link($a->get_baseurl())."/", $a->get_baseurl()."/", $url);
|
$url = str_replace(normalise_link($a->get_baseurl()) . '/', $a->get_baseurl() . '/', $url);
|
||||||
return($url);
|
return $url;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (get_config("system", "proxy_disabled"))
|
if (get_config('system', 'proxy_disabled')) {
|
||||||
return($url);
|
return $url;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Image URL may have encoded ampersands for display which aren't desirable for proxy
|
||||||
|
$url = html_entity_decode($url, ENT_NOQUOTES, 'UTF8');
|
||||||
|
|
||||||
// Creating a sub directory to reduce the amount of files in the cache directory
|
// Creating a sub directory to reduce the amount of files in the cache directory
|
||||||
$basepath = $a->get_basepath()."/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) and $writemode) {
|
||||||
if (!is_dir($basepath."/".$path)) {
|
if (!is_dir($basepath . '/' . $longpath)) {
|
||||||
mkdir($basepath."/".$path);
|
mkdir($basepath . '/' . $longpath);
|
||||||
chmod($basepath."/".$path, 0777);
|
chmod($basepath . '/' . $longpath, 0777);
|
||||||
}
|
}
|
||||||
|
|
||||||
$path .= "/".strtr(base64_encode($url), '+/', '-_');
|
|
||||||
|
|
||||||
// Checking for valid extensions. Only add them if they are safe
|
|
||||||
$pos = strrpos($url, ".");
|
|
||||||
if ($pos) {
|
|
||||||
$extension = strtolower(substr($url, $pos+1));
|
|
||||||
$pos = strpos($extension, "?");
|
|
||||||
if ($pos)
|
|
||||||
$extension = substr($extension, 0, $pos);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$extensions = array("jpg", "jpeg", "gif", "png");
|
$longpath .= '/' . strtr(base64_encode($url), '+/', '-_');
|
||||||
|
|
||||||
if (in_array($extension, $extensions))
|
// Checking for valid extensions. Only add them if they are safe
|
||||||
$path .= ".".$extension;
|
$pos = strrpos($url, '.');
|
||||||
|
if ($pos) {
|
||||||
|
$extension = strtolower(substr($url, $pos + 1));
|
||||||
|
$pos = strpos($extension, '?');
|
||||||
|
if ($pos) {
|
||||||
|
$extension = substr($extension, 0, $pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$proxypath = $a->get_baseurl()."/proxy/".$path;
|
$extensions = array('jpg', 'jpeg', 'gif', 'png');
|
||||||
|
if (in_array($extension, $extensions)) {
|
||||||
|
$shortpath .= '.' . $extension;
|
||||||
|
$longpath .= '.' . $extension;
|
||||||
|
}
|
||||||
|
|
||||||
if ($size != "")
|
$proxypath = $a->get_baseurl() . '/proxy/' . $longpath;
|
||||||
$size = ":".$size;
|
|
||||||
|
if ($size != '') {
|
||||||
|
$size = ':' . $size;
|
||||||
|
}
|
||||||
|
|
||||||
// Too long files aren't supported by Apache
|
// Too long files aren't supported by Apache
|
||||||
// Writemode in combination with long files shouldn't be possible
|
// Writemode in combination with long files shouldn't be possible
|
||||||
if ((strlen($proxypath) > 250) AND $writemode)
|
if ((strlen($proxypath) > 250) AND $writemode) {
|
||||||
return (hash("md5", $url));
|
return hash('md5', $url);
|
||||||
elseif (strlen($proxypath) > 250)
|
} elseif (strlen($proxypath) > 250) {
|
||||||
return ($a->get_baseurl()."/proxy/".hash("md5", $url)."?url=".urlencode($url));
|
return $a->get_baseurl() . '/proxy/' . $shortpath . '?url=' . urlencode($url);
|
||||||
elseif ($writemode)
|
} elseif ($writemode) {
|
||||||
return ($path);
|
return $longpath;
|
||||||
else
|
} else {
|
||||||
return ($proxypath.$size);
|
return $proxypath . $size;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue