= count($filename_parts) || $equal_number >= count($base_dir_parts)) break; if ($filename_parts[$equal_number] != $base_dir_parts[$equal_number]) break; } $relative_dir = str_repeat('../', count($base_dir_parts) - $equal_number); $relative_dir .= implode('/', array_slice($filename_parts, $equal_number)); return $relative_dir; } /** * Returns open basedirs * * @return array */ function w3_get_open_basedirs() { $open_basedir_ini = ini_get('open_basedir'); $open_basedirs = (W3TC_WIN ? preg_split('~[;,]~', $open_basedir_ini) : explode(':', $open_basedir_ini)); $result = array(); foreach ($open_basedirs as $open_basedir) { $open_basedir = trim($open_basedir); if (!empty($open_basedir) && $open_basedir != '') { $result[] = w3_realpath($open_basedir); } } return $result; } /** * Checks if path is restricted by open_basedir * * @param string $path * @return boolean */ function w3_check_open_basedir($path) { $path = w3_realpath($path); $open_basedirs = w3_get_open_basedirs(); if (!count($open_basedirs)) { return true; } foreach ($open_basedirs as $open_basedir) { if (strstr($path, $open_basedir) !== false) { return true; } } return false; } function w3_get_file_permissions($file) { if (function_exists('fileperms') && $fileperms = @fileperms($file)) { $fileperms = 0777 & $fileperms; } else { clearstatcache(); $stat=@stat($file); if ($stat) $fileperms = 0777 & $stat['mode']; else $fileperms = 0; } return $fileperms; } function w3_get_file_owner($file = '') { $fileowner = $filegroup = 'unknown'; if ($file) { if (function_exists('fileowner') && function_exists('fileowner')) { $fileowner = @fileowner($file); $filegroup = @filegroup($file); if (function_exists('posix_getpwuid') && function_exists('posix_getgrgid')) { $fileowner = @posix_getpwuid($fileowner); $fileowner = $fileowner['name']; $filegroup = @posix_getgrgid($filegroup); $filegroup = $filegroup['name']; } } } else { if (function_exists('getmyuid') && function_exists('getmygid')) { $fileowner = @getmyuid(); $filegroup = @getmygid(); if (function_exists('posix_getpwuid') && function_exists('posix_getgrgid')) { $fileowner = @posix_getpwuid($fileowner); $fileowner = $fileowner['name']; $filegroup = @posix_getgrgid($filegroup); $filegroup = $filegroup['name']; } } } return $fileowner . ':' . $filegroup; } /** * Atomically writes file inside W3TC_CACHE_DIR dir * @param $filename * @param $content * @throws Exception * @return void **/ function w3_file_put_contents_atomic($filename, $content) { if (!is_dir(W3TC_CACHE_TMP_DIR) || !is_writable(W3TC_CACHE_TMP_DIR)) { w3_mkdir_from(W3TC_CACHE_TMP_DIR, W3TC_CACHE_DIR); if (!is_dir(W3TC_CACHE_TMP_DIR) || !is_writable(W3TC_CACHE_TMP_DIR)) { throw new Exception('Can\'t create folder ' . W3TC_CACHE_TMP_DIR . ''); } } $temp = tempnam(W3TC_CACHE_TMP_DIR, 'temp'); try { if (!($f = @fopen($temp, 'wb'))) { if (file_exists($temp)) @unlink($temp); throw new Exception('Can\'t write to temporary file ' . $temp . ''); } fwrite($f, $content); fclose($f); if (!@rename($temp, $filename)) { @unlink($filename); if (!@rename($temp, $filename)) { w3_mkdir_from(dirname($filename), W3TC_CACHE_DIR); if (!@rename($temp, $filename)) { throw new Exception('Can\'t write to file ' . $filename . ''); } } } $chmod = 0644; if (defined('FS_CHMOD_FILE')) $chmod = FS_CHMOD_FILE; @chmod($filename, $chmod); } catch (Exception $ex) { if (file_exists($temp)) @unlink($temp); throw $ex; } }