= 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; } } /** * Takes a W3TC settings array and formats it to a PHP String * @param $data * @return string */ function w3tc_format_data_as_settings_file($data) { $config = " $value) $config .= w3tc_format_array_entry_as_settings_file_entry(1, $key, $value); $config .= ");"; return $config; } /** * Writes array item to file * * @param int $tabs * @param string $key * @param mixed $value * @return string */ function w3tc_format_array_entry_as_settings_file_entry($tabs, $key, $value) { $item = str_repeat("\t", $tabs); if (is_numeric($key) && (string)(int)$key === (string)$key) { $item .= sprintf("%d => ", $key); } else { $item .= sprintf("'%s' => ", addcslashes($key, "'\\")); } switch (gettype($value)) { case 'object': case 'array': $item .= "array(\r\n"; foreach ((array)$value as $k => $v) { $item .= w3tc_format_array_entry_as_settings_file_entry($tabs + 1, $k, $v); } $item .= sprintf("%s),\r\n", str_repeat("\t", $tabs)); return $item; case 'integer': $data = (string)$value; break; case 'double': $data = (string)$value; break; case 'boolean': $data = ($value ? 'true' : 'false'); break; case 'NULL': $data = 'null'; break; default: case 'string': $data = "'" . addcslashes($value, "'\\") . "'"; break; } $item .= $data . ",\r\n"; return $item; }