function realUrl($targetUrl, $baseUrl = null) { if (isAbsoluteUrl($targetUrl)) { return $targetUrl; } ### get baseUrl if (!$baseUrl) { // default baseUrl to currently running web script $baseUrl = isHTTPS() ? 'https://' : 'http://'; $baseUrl .= coalesce(@$_SERVER['HTTP_HOST'], parse_url(@$GLOBALS['SETTINGS']['adminUrl'], PHP_URL_HOST)); $baseUrl .= inCLI() ? '/' : $_SERVER['SCRIPT_NAME']; // SCRIPT_NAME has filepath not web path for command line scripts so just set to / $baseUrl = str_replace(' ', '%20', $baseUrl); } if (!isAbsoluteUrl($baseUrl)) { $baseUrl = realUrl($baseUrl); } // make sure supplied $baseUrl is absolute. if it's not, make it so, relative to currently running script // parse baseurl into parts $baseUrlParts = parse_url($baseUrl); $baseUrlDomain = $baseUrlParts['scheme'] . '://'; // figure out $baseUrlDomain (e.g. http://domain) if (@$baseUrlParts['user']) { $baseUrlDomain .= $baseUrlParts['user']; if (@$baseUrlParts['pass']) { $baseUrlDomain .= ':' . $baseUrlParts['pass']; } $baseUrlDomain .= '@'; } $baseUrlDomain .= $baseUrlParts['host']; if (@$baseUrlParts['port']) { $baseUrlDomain .= ':' . $baseUrlParts['port']; } // if no target, nothing specified for target, use baseUrl if ($targetUrl == '') { $absoluteUrl = $baseUrl; } elseif (strpos($targetUrl, '/') === 0) { $absoluteUrl = $baseUrlDomain . $targetUrl; } else { if (strpos($targetUrl, '?') === 0) { $absoluteUrl = $baseUrlDomain . $baseUrlParts['path'] . $targetUrl; } else { if (strpos($targetUrl, '#') === 0) { $absoluteUrl = $baseUrlDomain . $baseUrlParts['path']; if (@$baseUrlParts['query']) { $absoluteUrl .= '?' . $baseUrlParts['query']; } $absoluteUrl = $absoluteUrl . $targetUrl; } else { $basePath = $baseUrlParts['path']; if (!$basePath) { trigger_error("Error getting path from realUrl('{$targetUrl}', '{$baseUrl}')!\n"); } // v2.62 - if basepath is webroot ("/") or webroot file ("/example.php") then remote all parent references (../) from targetUrl $isPathRootDir = in_array(dirname($baseUrlParts['path']), array('\\', '/')); if ($isPathRootDir) { $targetUrl = preg_replace("|(\\.\\./)+|", '', $targetUrl); } // if the baseUrl includes a file (e.g. 'dir/admin.php'), strip it (e.g. 'dir/') if (!endsWith('/', $basePath)) { $basePath = dirname($basePath) . '/'; $basePath = fixSlashes($basePath); // root paths return / only, so prevent // (or \/ on windows) from the above code } $absoluteUrl = $baseUrlDomain . $basePath . $targetUrl; } } } // collapse "dir/../"s $madeReplacement = true; while ($madeReplacement) { // keep making replacements until we can't anymore $absoluteUrl = preg_replace('@[^/]+/\\.\\./@', '', $absoluteUrl, 1, $madeReplacement); } // collapse "/./"s $absoluteUrl = preg_replace('@/\\./@', '/', $absoluteUrl, -1); // url encode spaces $absoluteUrl = str_replace(' ', '%20', $absoluteUrl); // url encoded spaces return $absoluteUrl; }
function getUploadDirAndUrl($fieldSchema, $settingsUploadDir = null, $settingsUploadUrl = null, $returnOnErrors = false) { if ($settingsUploadDir === null) { $settingsUploadDir = $GLOBALS['SETTINGS']['uploadDir']; } if ($settingsUploadUrl === null) { $settingsUploadUrl = $GLOBALS['SETTINGS']['uploadUrl']; } // get upload dir and url if (@$fieldSchema['useCustomUploadDir']) { // if field is configured to use custom upload paths, use them $uploadDir = $fieldSchema['customUploadDir']; $uploadUrl = $fieldSchema['customUploadUrl']; list($baseDir, $baseUrl) = getUploadDirAndUrl(array()); // path for resolving CUSTOM dirs/urls: Uses upload dir/url from general settings made absolute using CMS dir/url } else { // default to using global SETTINGS upload paths $uploadDir = $settingsUploadDir; $uploadUrl = $settingsUploadUrl; $baseDir = SCRIPT_DIR; // paths for resolving relative dirs and urls (CMS Script Dir) $baseUrl = dirname(@$GLOBALS['SETTINGS']['adminUrl']) . '/'; // paths for resolving relative dirs and urls (CMS Script Dir URL) } $uploadDir = applyFilters('upload_uploadDir', $uploadDir, $fieldSchema); $uploadUrl = applyFilters('upload_uploadUrl', $uploadUrl, $fieldSchema); doAction('upload_dirAndUrl', $uploadDir, $uploadUrl); // make path absolute (and format/normalize it) $uploadDir = absPath($uploadDir, $baseDir); if (!endsWith('/', $uploadDir)) { $uploadDir .= '/'; } // absPath doesn't return trailing slash, but we require that for user entered values and expect it in the code // make urls absolute, starting with either http:// or / if (!isAbsoluteUrl($uploadUrl) && !preg_match("|^/|", $uploadUrl)) { $uploadUrl = coalesce($uploadUrl, './'); // added ./ so blank upload url gets DIR of $baseUrl, not baseurl with admin.php on the end $uploadUrl = realUrl($uploadUrl, $baseUrl); $uploadUrl = preg_replace("|^\\w+://[^/]+|", '', $uploadUrl); // remove scheme://hostname } if (!endsWith('/', $uploadUrl)) { $uploadUrl .= '/'; } // return array($uploadDir, $uploadUrl); }