1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-01-17 22:28:46 +01:00

[ticket/13697] Moving filesystem related functions to filesystem service

* Moving filesystem service to \phpbb\filesystem namespace
 * Wraping Symfony's Filesystem component
 * Moving filesystem related functions from includes/functions.php
   into \phpbb\filesystem\filesystem
   Functions moved (and deprecated):
     - phpbb_chmod
     - phpbb_is_writable
     - phpbb_is_absolute
     - phpbb_own_realpath
     - phpbb_realpath
 * Adding interface for filesystem service

PHPBB3-13697
This commit is contained in:
MateBartus 2015-03-12 00:25:00 +01:00
parent f86c5d905b
commit 4bdef6fd21
82 changed files with 1859 additions and 657 deletions

View File

@ -59,7 +59,7 @@ if (!defined('PHPBB_INSTALLED'))
// Eliminate . and .. from the path
require($phpbb_root_path . 'phpbb/filesystem.' . $phpEx);
$phpbb_filesystem = new phpbb\filesystem();
$phpbb_filesystem = new phpbb\filesystem\filesystem();
$script_path = $phpbb_filesystem->clean_path($script_path);
$url = (($secure) ? 'https://' : 'http://') . $server_name;

View File

@ -32,6 +32,7 @@
"symfony/console": "2.7.*@dev",
"symfony/dependency-injection": "2.7.*@dev",
"symfony/event-dispatcher": "2.7.*@dev",
"symfony/filesystem": "2.7.*@dev",
"symfony/http-kernel": "2.7.*@dev",
"symfony/routing": "2.7.*@dev",
"symfony/security-core": "2.7.*@dev",
@ -51,7 +52,6 @@
"symfony/css-selector": "2.7.*@dev",
"symfony/debug": "2.7.*@dev",
"symfony/dom-crawler": "2.7.*@dev",
"symfony/filesystem": "2.7.*@dev",
"symfony/finder": "2.7.*@dev",
"symfony/http-foundation": "2.7.*@dev",
"symfony/process": "2.7.*@dev"

View File

@ -103,7 +103,7 @@ services:
- @cache.driver
filesystem:
class: phpbb\filesystem
class: phpbb\filesystem\filesystem
file_downloader:
class: phpbb\file_downloader
@ -159,6 +159,7 @@ services:
router:
class: phpbb\routing\router
arguments:
- @filesystem
- @ext.manager
- %core.root_path%
- %core.php_ext%

View File

@ -58,6 +58,7 @@ services:
- @config
- %core.root_path%
- %core.php_ext%
- @filesystem
- @path_helper
- @mimetype.guesser
- @cache.driver

View File

@ -84,6 +84,7 @@ services:
- @config
- @cache
- @log
- @filesystem
- %core.root_path%
tags:
- { name: console.command }

View File

@ -19,6 +19,8 @@ services:
template.twig.loader:
class: phpbb\template\twig\loader
arguments:
- @filesystem
template.twig.extensions.collection:
class: phpbb\di\service_collection

View File

@ -43,7 +43,7 @@ require($phpbb_root_path . 'phpbb/class_loader.' . $phpEx);
$phpbb_class_loader = new \phpbb\class_loader('phpbb\\', "{$phpbb_root_path}phpbb/", $phpEx);
$phpbb_class_loader->register();
$finder = new \phpbb\finder(new \phpbb\filesystem(), $phpbb_root_path);
$finder = new \phpbb\finder(new \phpbb\filesystem\filesystem(), $phpbb_root_path);
$classes = $finder->core_path('phpbb/')
->directory('/db/migration/data')
->get_classes();

View File

@ -62,7 +62,7 @@ echo "USE $dbname;$newline$newline";
@set_time_limit(0);
$finder = new \phpbb\finder(new \phpbb\filesystem(), $phpbb_root_path);
$finder = new \phpbb\finder(new \phpbb\filesystem\filesystem(), $phpbb_root_path);
$classes = $finder->core_path('phpbb/')
->directory('/db/migration/data')
->get_classes();

View File

@ -36,13 +36,16 @@ class acp_attachments
/** @var \phpbb\user */
protected $user;
/** @var \phpbb\filesystem\filesystem_interface */
protected $filesystem;
public $id;
public $u_action;
protected $new_config;
function main($id, $mode)
{
global $db, $user, $auth, $template, $cache, $phpbb_container;
global $db, $user, $auth, $template, $cache, $phpbb_container, $phpbb_filesystem;
global $config, $phpbb_admin_path, $phpbb_root_path, $phpEx, $phpbb_log, $request;
$this->id = $id;
@ -51,6 +54,7 @@ class acp_attachments
$this->template = $template;
$this->user = $user;
$this->phpbb_container = $phpbb_container;
$this->filesystem = $phpbb_filesystem;
$user->add_lang(array('posting', 'viewtopic', 'acp/attachments'));
@ -1501,7 +1505,15 @@ class acp_attachments
if (!file_exists($phpbb_root_path . $upload_dir))
{
@mkdir($phpbb_root_path . $upload_dir, 0777);
phpbb_chmod($phpbb_root_path . $upload_dir, CHMOD_READ | CHMOD_WRITE);
try
{
$this->filesystem->phpbb_chmod($phpbb_root_path . $upload_dir, CHMOD_READ | CHMOD_WRITE);
}
catch (\phpbb\filesystem\exception\filesystem_exception $e)
{
// Do nothing
}
}
}
@ -1517,7 +1529,7 @@ class acp_attachments
return;
}
if (!phpbb_is_writable($phpbb_root_path . $upload_dir))
if (!$this->filesystem->is_writable($phpbb_root_path . $upload_dir))
{
$error[] = sprintf($user->lang['NO_WRITE_UPLOAD'], $upload_dir);
return;

View File

@ -26,7 +26,7 @@ class acp_main
function main($id, $mode)
{
global $config, $db, $cache, $user, $auth, $template, $request, $phpbb_log;
global $phpbb_root_path, $phpbb_admin_path, $phpEx, $phpbb_container, $phpbb_dispatcher;
global $phpbb_root_path, $phpbb_admin_path, $phpEx, $phpbb_container, $phpbb_dispatcher, $phpbb_filesystem;
// Show restore permissions notice
if ($user->data['user_perm_from'] && $auth->acl_get('a_switchperm'))
@ -644,7 +644,7 @@ class acp_main
}
}
if (!defined('PHPBB_DISABLE_CONFIG_CHECK') && file_exists($phpbb_root_path . 'config.' . $phpEx) && phpbb_is_writable($phpbb_root_path . 'config.' . $phpEx))
if (!defined('PHPBB_DISABLE_CONFIG_CHECK') && file_exists($phpbb_root_path . 'config.' . $phpEx) && $phpbb_filesystem->is_writable($phpbb_root_path . 'config.' . $phpEx))
{
// World-Writable? (000x)
$template->assign_var('S_WRITABLE_CONFIG', (bool) (@fileperms($phpbb_root_path . 'config.' . $phpEx) & 0x0002));

View File

@ -129,7 +129,7 @@ class bbcode
*/
function bbcode_cache_init()
{
global $phpbb_root_path, $phpEx, $config, $user, $phpbb_dispatcher, $phpbb_extension_manager, $phpbb_path_helper, $phpbb_container;
global $phpbb_root_path, $phpEx, $config, $user, $phpbb_dispatcher, $phpbb_extension_manager, $phpbb_path_helper, $phpbb_container, $phpbb_filesystem;
if (empty($this->template_filename))
{
@ -146,7 +146,9 @@ class bbcode
$phpbb_container,
$phpbb_container->getParameter('core.root_path') . 'cache/',
$phpbb_container->get('ext.manager'),
new \phpbb\template\twig\loader()
new \phpbb\template\twig\loader(
$phpbb_filesystem
)
),
$phpbb_container->getParameter('core.root_path') . 'cache/',
$phpbb_container->get('template.twig.extensions.collection'),

View File

@ -48,7 +48,7 @@ $phpbb_log = $phpbb_container->get('log');
/* @var $symfony_request \phpbb\symfony_request */
$symfony_request = $phpbb_container->get('symfony_request');
/* @var $phpbb_filesystem \phpbb\filesystem */
/* @var $phpbb_filesystem \phpbb\filesystem\filesystem_interface */
$phpbb_filesystem = $phpbb_container->get('filesystem');
/* @var $phpbb_path_helper \phpbb\path_helper */

View File

@ -311,448 +311,6 @@ function phpbb_version_compare($version1, $version2, $operator = null)
}
}
/**
* Global function for chmodding directories and files for internal use
*
* This function determines owner and group whom the file belongs to and user and group of PHP and then set safest possible file permissions.
* The function determines owner and group from common.php file and sets the same to the provided file.
* The function uses bit fields to build the permissions.
* The function sets the appropiate execute bit on directories.
*
* Supported constants representing bit fields are:
*
* CHMOD_ALL - all permissions (7)
* CHMOD_READ - read permission (4)
* CHMOD_WRITE - write permission (2)
* CHMOD_EXECUTE - execute permission (1)
*
* NOTE: The function uses POSIX extension and fileowner()/filegroup() functions. If any of them is disabled, this function tries to build proper permissions, by calling is_readable() and is_writable() functions.
*
* @param string $filename The file/directory to be chmodded
* @param int $perms Permissions to set
*
* @return bool true on success, otherwise false
*/
function phpbb_chmod($filename, $perms = CHMOD_READ)
{
static $_chmod_info;
// Return if the file no longer exists.
if (!file_exists($filename))
{
return false;
}
// Determine some common vars
if (empty($_chmod_info))
{
if (!function_exists('fileowner') || !function_exists('filegroup'))
{
// No need to further determine owner/group - it is unknown
$_chmod_info['process'] = false;
}
else
{
global $phpbb_root_path, $phpEx;
// Determine owner/group of common.php file and the filename we want to change here
$common_php_owner = @fileowner($phpbb_root_path . 'common.' . $phpEx);
$common_php_group = @filegroup($phpbb_root_path . 'common.' . $phpEx);
// And the owner and the groups PHP is running under.
$php_uid = (function_exists('posix_getuid')) ? @posix_getuid() : false;
$php_gids = (function_exists('posix_getgroups')) ? @posix_getgroups() : false;
// If we are unable to get owner/group, then do not try to set them by guessing
if (!$php_uid || empty($php_gids) || !$common_php_owner || !$common_php_group)
{
$_chmod_info['process'] = false;
}
else
{
$_chmod_info = array(
'process' => true,
'common_owner' => $common_php_owner,
'common_group' => $common_php_group,
'php_uid' => $php_uid,
'php_gids' => $php_gids,
);
}
}
}
if ($_chmod_info['process'])
{
$file_uid = @fileowner($filename);
$file_gid = @filegroup($filename);
// Change owner
if (@chown($filename, $_chmod_info['common_owner']))
{
clearstatcache();
$file_uid = @fileowner($filename);
}
// Change group
if (@chgrp($filename, $_chmod_info['common_group']))
{
clearstatcache();
$file_gid = @filegroup($filename);
}
// If the file_uid/gid now match the one from common.php we can process further, else we are not able to change something
if ($file_uid != $_chmod_info['common_owner'] || $file_gid != $_chmod_info['common_group'])
{
$_chmod_info['process'] = false;
}
}
// Still able to process?
if ($_chmod_info['process'])
{
if ($file_uid == $_chmod_info['php_uid'])
{
$php = 'owner';
}
else if (in_array($file_gid, $_chmod_info['php_gids']))
{
$php = 'group';
}
else
{
// Since we are setting the everyone bit anyway, no need to do expensive operations
$_chmod_info['process'] = false;
}
}
// We are not able to determine or change something
if (!$_chmod_info['process'])
{
$php = 'other';
}
// Owner always has read/write permission
$owner = CHMOD_READ | CHMOD_WRITE;
if (is_dir($filename))
{
$owner |= CHMOD_EXECUTE;
// Only add execute bit to the permission if the dir needs to be readable
if ($perms & CHMOD_READ)
{
$perms |= CHMOD_EXECUTE;
}
}
switch ($php)
{
case 'owner':
$result = @chmod($filename, ($owner << 6) + (0 << 3) + (0 << 0));
clearstatcache();
if (is_readable($filename) && phpbb_is_writable($filename))
{
break;
}
case 'group':
$result = @chmod($filename, ($owner << 6) + ($perms << 3) + (0 << 0));
clearstatcache();
if ((!($perms & CHMOD_READ) || is_readable($filename)) && (!($perms & CHMOD_WRITE) || phpbb_is_writable($filename)))
{
break;
}
case 'other':
$result = @chmod($filename, ($owner << 6) + ($perms << 3) + ($perms << 0));
clearstatcache();
if ((!($perms & CHMOD_READ) || is_readable($filename)) && (!($perms & CHMOD_WRITE) || phpbb_is_writable($filename)))
{
break;
}
default:
return false;
break;
}
return $result;
}
/**
* Test if a file/directory is writable
*
* This function calls the native is_writable() when not running under
* Windows and it is not disabled.
*
* @param string $file Path to perform write test on
* @return bool True when the path is writable, otherwise false.
*/
function phpbb_is_writable($file)
{
if (strtolower(substr(PHP_OS, 0, 3)) === 'win' || !function_exists('is_writable'))
{
if (file_exists($file))
{
// Canonicalise path to absolute path
$file = phpbb_realpath($file);
if (is_dir($file))
{
// Test directory by creating a file inside the directory
$result = @tempnam($file, 'i_w');
if (is_string($result) && file_exists($result))
{
unlink($result);
// Ensure the file is actually in the directory (returned realpathed)
return (strpos($result, $file) === 0) ? true : false;
}
}
else
{
$handle = @fopen($file, 'r+');
if (is_resource($handle))
{
fclose($handle);
return true;
}
}
}
else
{
// file does not exist test if we can write to the directory
$dir = dirname($file);
if (file_exists($dir) && is_dir($dir) && phpbb_is_writable($dir))
{
return true;
}
}
return false;
}
else
{
return is_writable($file);
}
}
/**
* Checks if a path ($path) is absolute or relative
*
* @param string $path Path to check absoluteness of
* @return boolean
*/
function phpbb_is_absolute($path)
{
return (isset($path[0]) && $path[0] == '/' || preg_match('#^[a-z]:[/\\\]#i', $path)) ? true : false;
}
/**
* @author Chris Smith <chris@project-minerva.org>
* @copyright 2006 Project Minerva Team
* @param string $path The path which we should attempt to resolve.
* @return mixed
*/
function phpbb_own_realpath($path)
{
global $request;
// Now to perform funky shizzle
// Switch to use UNIX slashes
$path = str_replace(DIRECTORY_SEPARATOR, '/', $path);
$path_prefix = '';
// Determine what sort of path we have
if (phpbb_is_absolute($path))
{
$absolute = true;
if ($path[0] == '/')
{
// Absolute path, *NIX style
$path_prefix = '';
}
else
{
// Absolute path, Windows style
// Remove the drive letter and colon
$path_prefix = $path[0] . ':';
$path = substr($path, 2);
}
}
else
{
// Relative Path
// Prepend the current working directory
if (function_exists('getcwd'))
{
// This is the best method, hopefully it is enabled!
$path = str_replace(DIRECTORY_SEPARATOR, '/', getcwd()) . '/' . $path;
$absolute = true;
if (preg_match('#^[a-z]:#i', $path))
{
$path_prefix = $path[0] . ':';
$path = substr($path, 2);
}
else
{
$path_prefix = '';
}
}
else if ($request->server('SCRIPT_FILENAME'))
{
// Warning: If chdir() has been used this will lie!
// Warning: This has some problems sometime (CLI can create them easily)
$filename = htmlspecialchars_decode($request->server('SCRIPT_FILENAME'));
$path = str_replace(DIRECTORY_SEPARATOR, '/', dirname($filename)) . '/' . $path;
$absolute = true;
$path_prefix = '';
}
else
{
// We have no way of getting the absolute path, just run on using relative ones.
$absolute = false;
$path_prefix = '.';
}
}
// Remove any repeated slashes
$path = preg_replace('#/{2,}#', '/', $path);
// Remove the slashes from the start and end of the path
$path = trim($path, '/');
// Break the string into little bits for us to nibble on
$bits = explode('/', $path);
// Remove any . in the path, renumber array for the loop below
$bits = array_values(array_diff($bits, array('.')));
// Lets get looping, run over and resolve any .. (up directory)
for ($i = 0, $max = sizeof($bits); $i < $max; $i++)
{
// @todo Optimise
if ($bits[$i] == '..' )
{
if (isset($bits[$i - 1]))
{
if ($bits[$i - 1] != '..')
{
// We found a .. and we are able to traverse upwards, lets do it!
unset($bits[$i]);
unset($bits[$i - 1]);
$i -= 2;
$max -= 2;
$bits = array_values($bits);
}
}
else if ($absolute) // ie. !isset($bits[$i - 1]) && $absolute
{
// We have an absolute path trying to descend above the root of the filesystem
// ... Error!
return false;
}
}
}
// Prepend the path prefix
array_unshift($bits, $path_prefix);
$resolved = '';
$max = sizeof($bits) - 1;
// Check if we are able to resolve symlinks, Windows (prior to Vista and Server 2008) cannot.
$symlink_resolve = (function_exists('readlink')) ? true : false;
foreach ($bits as $i => $bit)
{
if (@is_dir("$resolved/$bit") || ($i == $max && @is_file("$resolved/$bit")))
{
// Path Exists
if ($symlink_resolve && is_link("$resolved/$bit") && ($link = readlink("$resolved/$bit")))
{
// Resolved a symlink.
$resolved = $link . (($i == $max) ? '' : '/');
continue;
}
}
else
{
// Something doesn't exist here!
// This is correct realpath() behaviour but sadly open_basedir and safe_mode make this problematic
// return false;
}
$resolved .= $bit . (($i == $max) ? '' : '/');
}
// @todo If the file exists fine and open_basedir only has one path we should be able to prepend it
// because we must be inside that basedir, the question is where...
// @internal The slash in is_dir() gets around an open_basedir restriction
if (!@file_exists($resolved) || (!@is_dir($resolved . '/') && !is_file($resolved)))
{
return false;
}
// Put the slashes back to the native operating systems slashes
$resolved = str_replace('/', DIRECTORY_SEPARATOR, $resolved);
// Check for DIRECTORY_SEPARATOR at the end (and remove it!)
if (substr($resolved, -1) == DIRECTORY_SEPARATOR)
{
return substr($resolved, 0, -1);
}
return $resolved; // We got here, in the end!
}
if (!function_exists('realpath'))
{
/**
* A wrapper for realpath
* @ignore
*/
function phpbb_realpath($path)
{
return phpbb_own_realpath($path);
}
}
else
{
/**
* A wrapper for realpath
*/
function phpbb_realpath($path)
{
$realpath = realpath($path);
// Strangely there are provider not disabling realpath but returning strange values. :o
// We at least try to cope with them.
if ($realpath === $path || $realpath === false)
{
return phpbb_own_realpath($path);
}
// Check for DIRECTORY_SEPARATOR at the end (and remove it!)
if (substr($realpath, -1) == DIRECTORY_SEPARATOR)
{
$realpath = substr($realpath, 0, -1);
}
return $realpath;
}
}
// functions used for building option fields
/**
@ -1029,7 +587,7 @@ function markread($mode, $forum_id = false, $topic_id = false, $post_time = 0, $
/**
* This event is used for performing actions directly before marking forums,
* topics or posts as read.
*
*
* It is also possible to prevent the marking. For that, the $should_markread parameter
* should be set to FALSE.
*
@ -3913,11 +3471,13 @@ function msg_handler($errno, $msg_text, $errfile, $errline)
*/
function phpbb_filter_root_path($errfile)
{
global $phpbb_filesystem;
static $root_path;
if (empty($root_path))
{
$root_path = phpbb_realpath(dirname(__FILE__) . '/../');
$root_path = $phpbb_filesystem->realpath(dirname(__FILE__) . '/../');
}
return str_replace(array($root_path, '\\'), array('[ROOT]', '/'), $errfile);

View File

@ -405,7 +405,7 @@ function build_cfg_template($tpl_type, $key, &$new, $config_key, $vars)
*/
function validate_config_vars($config_vars, &$cfg_array, &$error)
{
global $phpbb_root_path, $user, $phpbb_dispatcher;
global $phpbb_root_path, $user, $phpbb_dispatcher, $phpbb_filesystem;
$type = 0;
$min = 1;
@ -586,7 +586,7 @@ function validate_config_vars($config_vars, &$cfg_array, &$error)
// Check if the path is writable
if ($config_definition['validate'] == 'wpath' || $config_definition['validate'] == 'rwpath' || $config_definition['validate'] === 'absolute_path_writable')
{
if (file_exists($path) && !phpbb_is_writable($path))
if (file_exists($path) && !$phpbb_filesystem->is_writable($path))
{
$error[] = sprintf($user->lang['DIRECTORY_NOT_WRITABLE'], $cfg_array[$config_name]);
}

View File

@ -117,7 +117,7 @@ function phpbb_clean_path($path)
new phpbb\symfony_request(
$request
),
new phpbb\filesystem(),
new phpbb\filesystem\filesystem(),
$request,
$phpbb_root_path,
$phpEx
@ -397,3 +397,88 @@ function get_tables(&$db)
return $db_tools->sql_list_tables();
}
/**
* Global function for chmodding directories and files for internal use
*
* This function determines owner and group whom the file belongs to and user and group of PHP and then set safest possible file permissions.
* The function determines owner and group from common.php file and sets the same to the provided file.
* The function uses bit fields to build the permissions.
* The function sets the appropiate execute bit on directories.
*
* Supported constants representing bit fields are:
*
* CHMOD_ALL - all permissions (7)
* CHMOD_READ - read permission (4)
* CHMOD_WRITE - write permission (2)
* CHMOD_EXECUTE - execute permission (1)
*
* NOTE: The function uses POSIX extension and fileowner()/filegroup() functions. If any of them is disabled, this function tries to build proper permissions, by calling is_readable() and is_writable() functions.
*
* @param string $filename The file/directory to be chmodded
* @param int $perms Permissions to set
*
* @return bool true on success, otherwise false
*
* @deprecated 3.2.0-dev use \phpbb\filesystem\filesystem::phpbb_chmod() instead
*/
function phpbb_chmod($filename, $perms = CHMOD_READ)
{
global $phpbb_filesystem;
try
{
$phpbb_filesystem->phpbb_chmod($filename, $perms);
}
catch (\phpbb\filesystem\exception\filesystem_exception $e)
{
return false;
}
return true;
}
/**
* Test if a file/directory is writable
*
* This function calls the native is_writable() when not running under
* Windows and it is not disabled.
*
* @param string $file Path to perform write test on
* @return bool True when the path is writable, otherwise false.
*
* @deprecated 3.2.0-dev use \phpbb\filesystem\filesystem::is_writable() instead
*/
function phpbb_is_writable($file)
{
global $phpbb_filesystem;
return $phpbb_filesystem->is_writable($file);
}
/**
* Checks if a path ($path) is absolute or relative
*
* @param string $path Path to check absoluteness of
* @return boolean
*
* @deprecated 3.2.0-dev use \phpbb\filesystem\filesystem::is_absolute_path() instead
*/
function phpbb_is_absolute($path)
{
global $phpbb_filesystem;
return $phpbb_filesystem->is_absolute_path($path);
}
/**
* A wrapper for realpath
*
* @deprecated 3.2.0-dev use \phpbb\filesystem\filesystem::realpath() instead
*/
function phpbb_realpath($path)
{
global $phpbb_filesystem;
return $phpbb_filesystem->realpath($path);
}

View File

@ -184,7 +184,7 @@ class compress
}
/**
* Zip creation class from phpMyAdmin 2.3.0 (c) Tobias Ratschiller, Olivier Müller, Loïc Chapeaux,
* Zip creation class from phpMyAdmin 2.3.0 (c) Tobias Ratschiller, Olivier Müller, Loïc Chapeaux,
* Marc Delisle, http://www.phpmyadmin.net/
*
* Zip extraction function by Alexandre Tedeschi, alexandrebr at gmail dot com
@ -203,12 +203,20 @@ class compress_zip extends compress
var $old_offset = 0;
var $datasec_len = 0;
/**
* @var \phpbb\filesystem\filesystem_interface
*/
protected $filesystem;
/**
* Constructor
*/
function compress_zip($mode, $file)
{
global $phpbb_filesystem;
$this->fp = @fopen($file, $mode . 'b');
$this->filesystem = ($phpbb_filesystem instanceof \phpbb\filesystem\filesystem_interface) ? $phpbb_filesystem : new \phpbb\filesystem\filesystem();
if (!$this->fp)
{
@ -286,7 +294,15 @@ class compress_zip extends compress
{
trigger_error("Could not create directory $folder");
}
phpbb_chmod($str, CHMOD_READ | CHMOD_WRITE);
try
{
$this->filesystem->phpbb_chmod($str, CHMOD_READ | CHMOD_WRITE);
}
catch (\phpbb\filesystem\exception\filesystem_exception $e)
{
// Do nothing
}
}
}
}
@ -315,7 +331,15 @@ class compress_zip extends compress
{
trigger_error("Could not create directory $folder");
}
phpbb_chmod($str, CHMOD_READ | CHMOD_WRITE);
try
{
$this->filesystem->phpbb_chmod($str, CHMOD_READ | CHMOD_WRITE);
}
catch (\phpbb\filesystem\exception\filesystem_exception $e)
{
// Do nothing
}
}
}
}
@ -538,11 +562,18 @@ class compress_tar extends compress
var $type = '';
var $wrote = false;
/**
* @var \phpbb\filesystem\filesystem_interface
*/
protected $filesystem;
/**
* Constructor
*/
function compress_tar($mode, $file, $type = '')
{
global $phpbb_filesystem;
$type = (!$type) ? $file : $type;
$this->isgz = preg_match('#(\.tar\.gz|\.tgz)$#', $type);
$this->isbz = preg_match('#\.tar\.bz2$#', $type);
@ -551,6 +582,8 @@ class compress_tar extends compress
$this->file = &$file;
$this->type = &$type;
$this->open();
$this->filesystem = ($phpbb_filesystem instanceof \phpbb\filesystem\filesystem_interface) ? $phpbb_filesystem : new \phpbb\filesystem\filesystem();
}
/**
@ -601,7 +634,15 @@ class compress_tar extends compress
{
trigger_error("Could not create directory $folder");
}
phpbb_chmod($str, CHMOD_READ | CHMOD_WRITE);
try
{
$this->filesystem->phpbb_chmod($str, CHMOD_READ | CHMOD_WRITE);
}
catch (\phpbb\filesystem\exception\filesystem_exception $e)
{
// Do nothing
}
}
}
}
@ -628,7 +669,15 @@ class compress_tar extends compress
{
trigger_error("Could not create directory $folder");
}
phpbb_chmod($str, CHMOD_READ | CHMOD_WRITE);
try
{
$this->filesystem->phpbb_chmod($str, CHMOD_READ | CHMOD_WRITE);
}
catch (\phpbb\filesystem\exception\filesystem_exception $e)
{
// Do nothing
}
}
}
@ -637,7 +686,15 @@ class compress_tar extends compress
{
trigger_error("Couldn't create file $filename");
}
phpbb_chmod($target_filename, CHMOD_READ);
try
{
$this->filesystem->phpbb_chmod($target_filename, CHMOD_READ);
}
catch (\phpbb\filesystem\exception\filesystem_exception $e)
{
// Do nothing
}
// Grab the file contents
fwrite($fp, ($filesize) ? $fzread($this->fp, ($filesize + 511) &~ 511) : '', $filesize);

View File

@ -2316,7 +2316,10 @@ function convert_bbcode($message, $convert_size = true, $extended_bbcodes = fals
function copy_file($src, $trg, $overwrite = false, $die_on_failure = true, $source_relative_path = true)
{
global $convert, $phpbb_root_path, $config, $user, $db;
global $convert, $phpbb_root_path, $config, $user, $db, $phpbb_filesystem;
/** @var \phpbb\filesystem\filesystem_interface $filesystem */
$filesystem = $phpbb_filesystem;
if (substr($trg, -1) == '/')
{
@ -2349,7 +2352,7 @@ function copy_file($src, $trg, $overwrite = false, $die_on_failure = true, $sour
}
}
if (!phpbb_is_writable($path))
if (!$filesystem->is_writable($path))
{
@chmod($path, 0777);
}
@ -2370,7 +2373,10 @@ function copy_file($src, $trg, $overwrite = false, $die_on_failure = true, $sour
function copy_dir($src, $trg, $copy_subdirs = true, $overwrite = false, $die_on_failure = true, $source_relative_path = true)
{
global $convert, $phpbb_root_path, $config, $user, $db;
global $convert, $phpbb_root_path, $config, $user, $db, $phpbb_filesystem;
/** @var \phpbb\filesystem\filesystem_interface $filesystem */
$filesystem = $phpbb_filesystem;
$dirlist = $filelist = $bad_dirs = array();
$src = path($src, $source_relative_path);
@ -2384,7 +2390,7 @@ function copy_dir($src, $trg, $copy_subdirs = true, $overwrite = false, $die_on_
@chmod($trg_path, 0777);
}
if (!phpbb_is_writable($trg_path))
if (!$filesystem->is_writable($trg_path))
{
$bad_dirs[] = path($config['script_path']) . $trg;
}
@ -2451,7 +2457,7 @@ function copy_dir($src, $trg, $copy_subdirs = true, $overwrite = false, $die_on_
@chmod($trg_path . $dir, 0777);
}
if (!phpbb_is_writable($trg_path . $dir))
if (!$filesystem->is_writable($trg_path . $dir))
{
$bad_dirs[] = $trg . $dir;
$bad_dirs[] = $trg_path . $dir;

View File

@ -189,7 +189,7 @@ function dbms_select($default = '', $only_20x_options = false)
*/
function connect_check_db($error_connect, &$error, $dbms_details, $table_prefix, $dbhost, $dbuser, $dbpasswd, $dbname, $dbport, $prefix_may_exist = false, $load_dbal = true, $unicode_check = true)
{
global $phpbb_root_path, $phpEx, $config, $lang;
global $phpbb_root_path, $phpEx, $config, $lang, $phpbb_filesystem;
$dbms = $dbms_details['DRIVER'];
@ -205,7 +205,7 @@ function connect_check_db($error_connect, &$error, $dbms_details, $table_prefix,
}
// Make sure we don't have a daft user who thinks having the SQLite database in the forum directory is a good idea
if (($dbms_details['DRIVER'] == 'phpbb\db\driver\sqlite' || $dbms_details['DRIVER'] == 'phpbb\db\driver\sqlite3') && stripos(phpbb_realpath($dbhost), phpbb_realpath('../')) === 0)
if (($dbms_details['DRIVER'] == 'phpbb\db\driver\sqlite' || $dbms_details['DRIVER'] == 'phpbb\db\driver\sqlite3') && stripos($phpbb_filesystem->realpath($dbhost), $phpbb_filesystem->realpath('../')) === 0)
{
$error[] = $lang['INST_ERR_DB_FORUM_PATH'];
return false;

View File

@ -623,7 +623,7 @@ class messenger
*/
protected function setup_template()
{
global $config, $phpbb_path_helper, $user, $phpbb_extension_manager, $phpbb_container;
global $config, $phpbb_path_helper, $user, $phpbb_extension_manager, $phpbb_container, $phpbb_filesystem;
if ($this->template instanceof \phpbb\template\template)
{
@ -641,7 +641,9 @@ class messenger
$phpbb_container,
$phpbb_container->getParameter('core.root_path') . 'cache/',
$phpbb_container->get('ext.manager'),
new \phpbb\template\twig\loader()
new \phpbb\template\twig\loader(
$phpbb_filesystem
)
),
$phpbb_container->getParameter('core.root_path') . 'cache/',
$phpbb_container->get('template.twig.extensions.collection'),
@ -671,15 +673,21 @@ class queue
var $cache_file = '';
var $eol = "\n";
/**
* @var \phpbb\filesystem\filesystem_interface
*/
protected $filesystem;
/**
* constructor
*/
function queue()
{
global $phpEx, $phpbb_root_path;
global $phpEx, $phpbb_root_path, $phpbb_filesystem;
$this->data = array();
$this->cache_file = "{$phpbb_root_path}cache/queue.$phpEx";
$this->filesystem = $phpbb_filesystem;
}
/**
@ -865,7 +873,14 @@ class queue
fwrite($fp, "<?php\nif (!defined('IN_PHPBB')) exit;\n\$this->queue_data = unserialize(" . var_export(serialize($this->queue_data), true) . ");\n\n?>");
fclose($fp);
phpbb_chmod($this->cache_file, CHMOD_READ | CHMOD_WRITE);
try
{
$this->filesystem->phpbb_chmod($this->cache_file, CHMOD_READ | CHMOD_WRITE);
}
catch (\phpbb\filesystem\exception\filesystem_exception $e)
{
// Do nothing
}
}
}
@ -907,7 +922,14 @@ class queue
fwrite($fp, "<?php\nif (!defined('IN_PHPBB')) exit;\n\$this->queue_data = unserialize(" . var_export(serialize($this->data), true) . ");\n\n?>");
fclose($fp);
phpbb_chmod($this->cache_file, CHMOD_READ | CHMOD_WRITE);
try
{
$this->filesystem->phpbb_chmod($this->cache_file, CHMOD_READ | CHMOD_WRITE);
}
catch (\phpbb\filesystem\exception\filesystem_exception $e)
{
// Do nothing
}
}
$lock->release();

View File

@ -407,14 +407,14 @@ function posting_gen_topic_types($forum_id, $cur_topic_type = POST_NORMAL)
function upload_attachment($form_name, $forum_id, $local = false, $local_storage = '', $is_message = false, $local_filedata = false, \phpbb\mimetype\guesser $mimetype_guesser = null, \phpbb\plupload\plupload $plupload = null)
{
global $auth, $user, $config, $db, $cache;
global $phpbb_root_path, $phpEx, $phpbb_dispatcher;
global $phpbb_root_path, $phpEx, $phpbb_dispatcher, $phpbb_filesystem;
$filedata = array(
'error' => array()
);
include_once($phpbb_root_path . 'includes/functions_upload.' . $phpEx);
$upload = new fileupload();
$upload = new fileupload($phpbb_filesystem);
if ($config['check_attachment_content'] && isset($config['mime_triggers']))
{
@ -668,7 +668,7 @@ function get_supported_image_types($type = false)
*/
function create_thumbnail($source, $destination, $mimetype)
{
global $config;
global $config, $phpbb_filesystem;
$min_filesize = (int) $config['img_min_thumb_filesize'];
$img_filesize = (file_exists($source)) ? @filesize($source) : false;
@ -820,7 +820,14 @@ function create_thumbnail($source, $destination, $mimetype)
return false;
}
phpbb_chmod($destination, CHMOD_READ | CHMOD_WRITE);
try
{
$this->filesystem->phpbb_chmod($destination, CHMOD_READ | CHMOD_WRITE);
}
catch (\phpbb\filesystem\exception\filesystem_exception $e)
{
// Do nothing
}
return true;
}

View File

@ -46,6 +46,11 @@ class filespec
var $upload = '';
/**
* @var \phpbb\filesystem\filesystem_interface
*/
protected $filesystem;
/**
* The plupload object
* @var \phpbb\plupload\plupload
@ -62,7 +67,7 @@ class filespec
* File Class
* @access private
*/
function filespec($upload_ary, $upload_namespace, \phpbb\mimetype\guesser $mimetype_guesser = null, \phpbb\plupload\plupload $plupload = null)
function filespec($upload_ary, $upload_namespace, \phpbb\filesystem\filesystem_interface $phpbb_filesystem, \phpbb\mimetype\guesser $mimetype_guesser = null, \phpbb\plupload\plupload $plupload = null)
{
if (!isset($upload_ary))
{
@ -97,6 +102,7 @@ class filespec
$this->upload = $upload_namespace;
$this->plupload = $plupload;
$this->mimetype_guesser = $mimetype_guesser;
$this->filesystem = $phpbb_filesystem;
}
/**
@ -374,7 +380,14 @@ class filespec
return false;
}
phpbb_chmod($this->destination_file, $chmod);
try
{
$this->filesystem->phpbb_chmod($this->destination_file, $chmod);
}
catch (\phpbb\filesystem\exception\filesystem_exception $e)
{
// Do nothing
}
}
// Try to get real filesize from destination folder
@ -499,9 +512,15 @@ class fileupload
/** @var int Timeout for remote upload */
var $upload_timeout = 6;
/**
* @var \phpbb\filesystem\filesystem_interface
*/
protected $filesystem;
/**
* Init file upload class.
*
* @param \phpbb\filesystem\filesystem_interface $filesystem
* @param string $error_prefix Used error messages will get prefixed by this string
* @param array $allowed_extensions Array of allowed extensions, for example array('jpg', 'jpeg', 'gif', 'png')
* @param int $max_filesize Maximum filesize
@ -513,13 +532,14 @@ class fileupload
* contain any of its values. Defaults to false.
*
*/
function fileupload($error_prefix = '', $allowed_extensions = false, $max_filesize = false, $min_width = false, $min_height = false, $max_width = false, $max_height = false, $disallowed_content = false)
function fileupload(\phpbb\filesystem\filesystem_interface $filesystem, $error_prefix = '', $allowed_extensions = false, $max_filesize = false, $min_width = false, $min_height = false, $max_width = false, $max_height = false, $disallowed_content = false)
{
$this->set_allowed_extensions($allowed_extensions);
$this->set_max_filesize($max_filesize);
$this->set_allowed_dimensions($min_width, $min_height, $max_width, $max_height);
$this->set_error_prefix($error_prefix);
$this->set_disallowed_content($disallowed_content);
$this->filesystem = $filesystem;
}
/**
@ -613,7 +633,7 @@ class fileupload
}
}
$file = new filespec($upload, $this, $mimetype_guesser, $plupload);
$file = new filespec($upload, $this, $this->filesystem, $mimetype_guesser, $plupload);
if ($file->init_error)
{
@ -694,7 +714,7 @@ class fileupload
$upload['type'] = $filedata['type'];
}
$file = new filespec($upload, $this, $mimetype_guesser);
$file = new filespec($upload, $this, $this->filesystem, $mimetype_guesser);
if ($file->init_error)
{
@ -932,7 +952,7 @@ class fileupload
$upload_ary['tmp_name'] = $filename;
$file = new filespec($upload_ary, $this, $mimetype_guesser);
$file = new filespec($upload_ary, $this, $this->filesystem, $mimetype_guesser);
$this->common_checks($file);
return $file;

View File

@ -183,7 +183,10 @@ define('IN_DB_UPDATE', true);
/* @var $migrator \phpbb\db\migrator */
$migrator = $phpbb_container->get('migrator');
$migrator->set_output_handler(new \phpbb\db\log_wrapper_migrator_output_handler($user, new \phpbb\db\html_migrator_output_handler($user), $phpbb_root_path . 'store/migrations_' . time() . '.log'));
/** @var \phpbb\filesystem\filesystem_interface $filesystem */
$filesystem = $phpbb_container->get('filesystem');
$migrator->set_output_handler(new \phpbb\db\log_wrapper_migrator_output_handler($user, new \phpbb\db\html_migrator_output_handler($user), $phpbb_root_path . 'store/migrations_' . time() . '.log', $filesystem));
$migrator->create_migrations_table();

View File

@ -270,7 +270,7 @@ $config = new \phpbb\config\config(array(
/* @var $symfony_request \phpbb\symfony_request */
$symfony_request = $phpbb_container->get('symfony_request');
/* @var $phpbb_filesystem \phpbb\filesystem */
/* @var $phpbb_filesystem \phpbb\filesystem\filesystem_interface */
$phpbb_filesystem = $phpbb_container->get('filesystem');
/* @var $phpbb_path_helper \phpbb\path_helper */

View File

@ -96,6 +96,9 @@ class install_convert extends module
/** @var string */
protected $php_ext;
/** @var \phpbb\filesystem\filesystem_interface */
protected $filesystem;
/**
* Variables used while converting, they are accessible from the global variable $convert
*/
@ -116,6 +119,7 @@ class install_convert extends module
$this->template = $template;
$this->phpbb_root_path = $phpbb_root_path;
$this->php_ext = $phpEx;
$this->filesystem = new \phpbb\filesystem\filesystem();
if (!$this->check_phpbb_installed())
{
@ -859,7 +863,7 @@ class install_convert extends module
$this->p_master->error($user->lang['DEV_NO_TEST_FILE'], __LINE__, __FILE__);
}
if (!$local_path || !phpbb_is_writable($phpbb_root_path . $local_path))
if (!$local_path || !$this->filesystem->is_writable($phpbb_root_path . $local_path))
{
if (!$local_path)
{

View File

@ -43,9 +43,15 @@ if (!empty($setmodules))
*/
class install_install extends module
{
/**
* @var \phpbb\filesystem\filesystem_interface
*/
protected $filesystem;
function install_install(&$p_master)
{
$this->p_master = &$p_master;
$this->filesystem = new \phpbb\filesystem\filesystem();
}
function main($mode, $sub)
@ -466,13 +472,29 @@ class install_install extends module
if (!file_exists($phpbb_root_path . $dir))
{
@mkdir($phpbb_root_path . $dir, 0777);
phpbb_chmod($phpbb_root_path . $dir, CHMOD_READ | CHMOD_WRITE);
try
{
$this->filesystem->phpbb_chmod($phpbb_root_path . $dir, CHMOD_READ | CHMOD_WRITE);
}
catch (\phpbb\filesystem\exception\filesystem_exception $e)
{
// Do nothing
}
}
// Now really check
if (file_exists($phpbb_root_path . $dir) && is_dir($phpbb_root_path . $dir))
{
phpbb_chmod($phpbb_root_path . $dir, CHMOD_READ | CHMOD_WRITE);
try
{
$this->filesystem->phpbb_chmod($phpbb_root_path . $dir, CHMOD_READ | CHMOD_WRITE);
}
catch (\phpbb\filesystem\exception\filesystem_exception $e)
{
// Do nothing
}
$exists = true;
}
@ -514,7 +536,7 @@ class install_install extends module
$write = $exists = true;
if (file_exists($phpbb_root_path . $dir))
{
if (!phpbb_is_writable($phpbb_root_path . $dir))
if (!$this->filesystem->is_writable($phpbb_root_path . $dir))
{
$write = false;
}
@ -892,7 +914,7 @@ class install_install extends module
$config_data = phpbb_create_config_file_data($data, $available_dbms[$data['dbms']]['DRIVER']);
// Attempt to write out the config file directly. If it works, this is the easiest way to do it ...
if ((file_exists($phpbb_root_path . 'config.' . $phpEx) && phpbb_is_writable($phpbb_root_path . 'config.' . $phpEx)) || phpbb_is_writable($phpbb_root_path))
if ((file_exists($phpbb_root_path . 'config.' . $phpEx) && $this->filesystem->is_writable($phpbb_root_path . 'config.' . $phpEx)) || $this->filesystem->is_writable($phpbb_root_path))
{
// Assume it will work ... if nothing goes wrong below
$written = true;
@ -914,7 +936,14 @@ class install_install extends module
if ($written)
{
// We may revert back to chmod() if we see problems with users not able to change their config.php file directly
phpbb_chmod($phpbb_root_path . 'config.' . $phpEx, CHMOD_READ);
try
{
$this->filesystem->phpbb_chmod($phpbb_root_path . 'config.' . $phpEx, CHMOD_READ);
}
catch (\phpbb\filesystem\exception\filesystem_exception $e)
{
// Do nothing
}
}
}
@ -1195,7 +1224,7 @@ class install_install extends module
include($phpbb_root_path . 'includes/constants.' . $phpEx);
}
$finder = new \phpbb\finder(new \phpbb\filesystem(), $phpbb_root_path, null, $phpEx);
$finder = new \phpbb\finder(new \phpbb\filesystem\filesystem(), $phpbb_root_path, null, $phpEx);
$classes = $finder->core_path('phpbb/db/migration/data/')
->get_classes();
@ -2031,7 +2060,7 @@ class install_install extends module
{
global $config, $phpbb_root_path;
if (!phpbb_is_writable($phpbb_root_path . 'images/avatars/upload/'))
if (!$this->filesystem->is_writable($phpbb_root_path . 'images/avatars/upload/'))
{
$config->set('allow_avatar', 0);
$config->set('allow_avatar_upload', 0);

View File

@ -55,6 +55,8 @@ class install_update extends module
var $update_to_version;
protected $filesystem;
// Set to false
var $test_update = false;
@ -87,6 +89,8 @@ class install_update extends module
/* @var $cache \phpbb\cache\service */
$cache = $phpbb_container->get('cache');
$this->filesystem = $phpbb_container->get('filesystem');
$this->tpl_name = 'install_update';
$this->page_title = 'UPDATE_INSTALLATION';
@ -961,7 +965,7 @@ class install_update extends module
// Now init the connection
if ($update_mode == 'download')
{
if (function_exists('phpbb_is_writable') && !phpbb_is_writable($phpbb_root_path . 'store/'))
if ($this->filesystem->is_writable($phpbb_root_path . 'store/'))
{
trigger_error(sprintf('The directory “%s” is not writable.', $phpbb_root_path . 'store/'), E_USER_ERROR);
}

View File

@ -18,6 +18,11 @@ namespace phpbb\avatar\driver;
*/
class upload extends \phpbb\avatar\driver\driver
{
/**
* @var \phpbb\filesystem\filesystem_interface
*/
protected $filesystem;
/**
* @var \phpbb\mimetype\guesser
*/
@ -29,15 +34,17 @@ class upload extends \phpbb\avatar\driver\driver
* @param \phpbb\config\config $config phpBB configuration
* @param string $phpbb_root_path Path to the phpBB root
* @param string $php_ext PHP file extension
* @param \phpbb_path_helper $path_helper phpBB path helper
* @param \phpbb\filesystem\filesystem_interface phpBB filesystem helper
* @param \phpbb\path_helper $path_helper phpBB path helper
* @param \phpbb\mimetype\guesser $mimetype_guesser Mimetype guesser
* @param \phpbb\cache\driver\driver_interface $cache Cache driver
*/
public function __construct(\phpbb\config\config $config, $phpbb_root_path, $php_ext, \phpbb\path_helper $path_helper, \phpbb\mimetype\guesser $mimetype_guesser, \phpbb\cache\driver\driver_interface $cache = null)
public function __construct(\phpbb\config\config $config, $phpbb_root_path, $php_ext, \phpbb\filesystem\filesystem_interface $filesystem, \phpbb\path_helper $path_helper, \phpbb\mimetype\guesser $mimetype_guesser, \phpbb\cache\driver\driver_interface $cache = null)
{
$this->config = $config;
$this->phpbb_root_path = $phpbb_root_path;
$this->php_ext = $php_ext;
$this->filesystem = $filesystem;
$this->path_helper = $path_helper;
$this->mimetype_guesser = $mimetype_guesser;
$this->cache = $cache;
@ -88,7 +95,7 @@ class upload extends \phpbb\avatar\driver\driver
include($this->phpbb_root_path . 'includes/functions_upload.' . $this->php_ext);
}
$upload = new \fileupload('AVATAR_', $this->allowed_extensions, $this->config['avatar_filesize'], $this->config['avatar_min_width'], $this->config['avatar_min_height'], $this->config['avatar_max_width'], $this->config['avatar_max_height'], (isset($this->config['mime_triggers']) ? explode('|', $this->config['mime_triggers']) : false));
$upload = new \fileupload($this->filesystem, 'AVATAR_', $this->allowed_extensions, $this->config['avatar_filesize'], $this->config['avatar_min_width'], $this->config['avatar_min_height'], $this->config['avatar_max_width'], $this->config['avatar_max_height'], (isset($this->config['mime_triggers']) ? explode('|', $this->config['mime_triggers']) : false));
$url = $request->variable('avatar_upload_url', '');
$upload_file = $request->file('avatar_upload_file');
@ -209,6 +216,6 @@ class upload extends \phpbb\avatar\driver\driver
*/
protected function can_upload()
{
return (file_exists($this->phpbb_root_path . $this->config['avatar_path']) && phpbb_is_writable($this->phpbb_root_path . $this->config['avatar_path']) && (@ini_get('file_uploads') || strtolower(@ini_get('file_uploads')) == 'on'));
return (file_exists($this->phpbb_root_path . $this->config['avatar_path']) && $this->filesystem->is_writable($this->phpbb_root_path . $this->config['avatar_path']) && (@ini_get('file_uploads') || strtolower(@ini_get('file_uploads')) == 'on'));
}
}

View File

@ -177,13 +177,9 @@ abstract class base implements \phpbb\cache\driver\driver_interface
*/
function remove_file($filename, $check = false)
{
if (!function_exists('phpbb_is_writable'))
{
global $phpbb_root_path, $phpEx;
include($phpbb_root_path . 'includes/functions.' . $phpEx);
}
global $phpbb_filesystem;
if ($check && !phpbb_is_writable($this->cache_dir))
if ($check && !$phpbb_filesystem->is_writable($this->cache_dir))
{
// E_USER_ERROR - not using language entry - intended.
trigger_error('Unable to remove files within ' . $this->cache_dir . '. Please check directory permissions.', E_USER_ERROR);

View File

@ -20,6 +20,11 @@ class file extends \phpbb\cache\driver\base
{
var $var_expires = array();
/**
* @var \phpbb\filesystem\filesystem_interface
*/
protected $filesystem;
/**
* Set cache path
*
@ -30,6 +35,7 @@ class file extends \phpbb\cache\driver\base
global $phpbb_root_path, $phpbb_container;
$this->cache_dir = !is_null($cache_dir) ? $cache_dir : $phpbb_root_path . 'cache/' . $phpbb_container->getParameter('core.environment') . '/';
$this->filesystem = new \phpbb\filesystem\filesystem();
if (!is_dir($this->cache_dir))
{
@ -69,14 +75,8 @@ class file extends \phpbb\cache\driver\base
if (!$this->_write('data_global'))
{
if (!function_exists('phpbb_is_writable'))
{
global $phpbb_root_path;
include($phpbb_root_path . 'includes/functions.' . $phpEx);
}
// Now, this occurred how often? ... phew, just tell the user then...
if (!phpbb_is_writable($this->cache_dir))
if (!$this->filesystem->is_writable($this->cache_dir))
{
// We need to use die() here, because else we may encounter an infinite loop (the message handler calls $cache->unload())
die('Fatal: ' . $this->cache_dir . ' is NOT writable.');
@ -574,13 +574,14 @@ class file extends \phpbb\cache\driver\base
fclose($handle);
if (!function_exists('phpbb_chmod'))
try
{
global $phpbb_root_path;
include($phpbb_root_path . 'includes/functions.' . $phpEx);
$this->filesystem->phpbb_chmod($file, CHMOD_READ | CHMOD_WRITE);
}
catch (\phpbb\filesystem\exception\filesystem_exception $e)
{
// Do nothing
}
phpbb_chmod($file, CHMOD_READ | CHMOD_WRITE);
$return_value = true;
}

View File

@ -35,13 +35,17 @@ class migrate extends \phpbb\console\command\command
/** @var string phpBB root path */
protected $phpbb_root_path;
function __construct(\phpbb\user $user, \phpbb\db\migrator $migrator, \phpbb\extension\manager $extension_manager, \phpbb\config\config $config, \phpbb\cache\service $cache, \phpbb\log\log $log, $phpbb_root_path)
/** @var \phpbb\filesystem\filesystem_interface */
protected $filesystem;
function __construct(\phpbb\user $user, \phpbb\db\migrator $migrator, \phpbb\extension\manager $extension_manager, \phpbb\config\config $config, \phpbb\cache\service $cache, \phpbb\log\log $log, \phpbb\filesystem\filesystem_interface $filesystem, $phpbb_root_path)
{
$this->migrator = $migrator;
$this->extension_manager = $extension_manager;
$this->config = $config;
$this->cache = $cache;
$this->log = $log;
$this->filesystem = $filesystem;
$this->phpbb_root_path = $phpbb_root_path;
parent::__construct($user);
$this->user->add_lang(array('common', 'install', 'migrator'));
@ -57,7 +61,7 @@ class migrate extends \phpbb\console\command\command
protected function execute(InputInterface $input, OutputInterface $output)
{
$this->migrator->set_output_handler(new \phpbb\db\log_wrapper_migrator_output_handler($this->user, new console_migrator_output_handler($this->user, $output), $this->phpbb_root_path . 'store/migrations_' . time() . '.log'));
$this->migrator->set_output_handler(new \phpbb\db\log_wrapper_migrator_output_handler($this->user, new console_migrator_output_handler($this->user, $output), $this->phpbb_root_path . 'store/migrations_' . time() . '.log', $this->filesystem));
$this->migrator->create_migrations_table();

View File

@ -53,7 +53,7 @@ class helper
protected $request;
/**
* @var \phpbb\filesystem The filesystem object
* @var \phpbb\filesystem\filesystem_interface The filesystem object
*/
protected $filesystem;
@ -78,11 +78,11 @@ class helper
* @param \phpbb\routing\router $router phpBB router
* @param \phpbb\symfony_request $symfony_request Symfony Request object
* @param \phpbb\request\request_interface $request phpBB request object
* @param \phpbb\filesystem $filesystem The filesystem object
* @param \phpbb\filesystem\filesystem_interface $filesystem The filesystem object
* @param string $phpbb_root_path phpBB root path
* @param string $php_ext PHP file extension
*/
public function __construct(\phpbb\template\template $template, \phpbb\user $user, \phpbb\config\config $config, \phpbb\routing\router $router, \phpbb\symfony_request $symfony_request, \phpbb\request\request_interface $request, \phpbb\filesystem $filesystem, $phpbb_root_path, $php_ext)
public function __construct(\phpbb\template\template $template, \phpbb\user $user, \phpbb\config\config $config, \phpbb\routing\router $router, \phpbb\symfony_request $symfony_request, \phpbb\request\request_interface $request, \phpbb\filesystem\filesystem_interface $filesystem, $phpbb_root_path, $php_ext)
{
$this->template = $template;
$this->user = $user;

View File

@ -37,17 +37,24 @@ class log_wrapper_migrator_output_handler implements migrator_output_handler_int
*/
protected $file_handle = false;
/**
* @var \phpbb\filesystem\filesystem_interface
*/
protected $filesystem;
/**
* Constructor
*
* @param user $user User object
* @param migrator_output_handler_interface $migrator Migrator output handler
* @param string $log_file File to log to
* @param \phpbb\filesystem\filesystem_interface phpBB filesystem object
*/
public function __construct(user $user, migrator_output_handler_interface $migrator, $log_file)
public function __construct(user $user, migrator_output_handler_interface $migrator, $log_file, \phpbb\filesystem\filesystem_interface $filesystem)
{
$this->user = $user;
$this->migrator = $migrator;
$this->filesystem = $filesystem;
$this->file_open($log_file);
}
@ -58,7 +65,7 @@ class log_wrapper_migrator_output_handler implements migrator_output_handler_int
*/
protected function file_open($file)
{
if (phpbb_is_writable(dirname($file)))
if ($this->filesystem->is_writable(dirname($file)))
{
$this->file_handle = fopen($file, 'w');
}

View File

@ -192,7 +192,8 @@ class container_builder
}
}
$loader = new YamlFileLoader($this->container, new FileLocator(phpbb_realpath($this->get_config_path())));
$filesystem = new \phpbb\filesystem\filesystem();
$loader = new YamlFileLoader($this->container, new FileLocator($filesystem->realpath($this->get_config_path())));
$loader->load($this->container->getParameter('core.environment') . '/config.yml');
$this->inject_custom_parameters();

View File

@ -50,7 +50,8 @@ class core extends Extension
*/
public function load(array $configs, ContainerBuilder $container)
{
$loader = new YamlFileLoader($container, new FileLocator(phpbb_realpath($this->config_path)));
$filesystem = new \phpbb\filesystem\filesystem();
$loader = new YamlFileLoader($container, new FileLocator($filesystem->realpath($this->config_path)));
$loader->load($container->getParameter('core.environment') . '/container/environment.yml');
$config = $this->getConfiguration($configs, $container);

View File

@ -94,7 +94,8 @@ class extension_base extends Extension
if ($services_directory && $services_file)
{
$loader = new YamlFileLoader($container, new FileLocator(phpbb_realpath($services_directory)));
$filesystem = new \phpbb\filesystem\filesystem();
$loader = new YamlFileLoader($container, new FileLocator($filesystem->realpath($services_directory)));
$loader->load($services_file);
}
}

View File

@ -39,7 +39,7 @@ class manager
* @param ContainerInterface $container A container
* @param \phpbb\db\driver\driver_interface $db A database connection
* @param \phpbb\config\config $config Config object
* @param \phpbb\filesystem $filesystem
* @param \phpbb\filesystem\filesystem_interface $filesystem
* @param \phpbb\user $user User object
* @param string $extension_table The name of the table holding extensions
* @param string $phpbb_root_path Path to the phpbb includes directory.
@ -47,7 +47,7 @@ class manager
* @param \phpbb\cache\driver\driver_interface $cache A cache instance or null
* @param string $cache_name The name of the cache variable, defaults to _ext
*/
public function __construct(ContainerInterface $container, \phpbb\db\driver\driver_interface $db, \phpbb\config\config $config, \phpbb\filesystem $filesystem, \phpbb\user $user, $extension_table, $phpbb_root_path, $php_ext = 'php', \phpbb\cache\driver\driver_interface $cache = null, $cache_name = '_ext')
public function __construct(ContainerInterface $container, \phpbb\db\driver\driver_interface $db, \phpbb\config\config $config, \phpbb\filesystem\filesystem_interface $filesystem, \phpbb\user $user, $extension_table, $phpbb_root_path, $php_ext = 'php', \phpbb\cache\driver\driver_interface $cache = null, $cache_name = '_ext')
{
$this->cache = $cache;
$this->cache_name = $cache_name;

View File

@ -14,37 +14,8 @@
namespace phpbb;
/**
* A class with various functions that are related to paths, files and the filesystem
*/
class filesystem
* @deprecated 3.2.0-dev (To be removed 3.3.0) use \phpbb\filesystem\filesystem instead
*/
class filesystem extends \phpbb\filesystem\filesystem
{
/**
* Eliminates useless . and .. components from specified path.
*
* @param string $path Path to clean
* @return string Cleaned path
*/
public function clean_path($path)
{
$exploded = explode('/', $path);
$filtered = array();
foreach ($exploded as $part)
{
if ($part === '.' && !empty($filtered))
{
continue;
}
if ($part === '..' && !empty($filtered) && $filtered[sizeof($filtered) - 1] !== '.' && $filtered[sizeof($filtered) - 1] !== '..')
{
array_pop($filtered);
}
else
{
$filtered[] = $part;
}
}
$path = implode('/', $filtered);
return $path;
}
}

View File

@ -0,0 +1,42 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
namespace phpbb\filesystem\exception;
class filesystem_exception extends \phpbb\exception\runtime_exception
{
/**
* Constructor
*
* @param string $message The Exception message to throw (must be a language variable).
* @param string $filename The file that caused the error.
* @param array $parameters The parameters to use with the language var.
* @param \Exception $previous The previous runtime_exception used for the runtime_exception chaining.
* @param integer $code The Exception code.
*/
public function __construct($message = "", $filename = '', $parameters = array(), \Exception $previous = null, $code = 0)
{
parent::__construct($message, array_merge(array('filename' => $filename), $parameters), $previous, $code);
}
/**
* Returns the filename that triggered the error
*
* @return string
*/
public function get_filename()
{
$parameters = parent::get_parameters();
return $parameters['filename'];
}
}

View File

@ -0,0 +1,916 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
namespace phpbb\filesystem;
use phpbb\filesystem\exception\filesystem_exception;
/**
* A class with various functions that are related to paths, files and the filesystem
*/
class filesystem implements filesystem_interface
{
/**
* Store some information about file ownership for phpBB's chmod function
*
* @var array
*/
protected $chmod_info;
/**
* Stores current working directory
*
* @var string|bool current working directory or false if it cannot be recovered
*/
protected $working_directory;
/**
* Symfony's Filesystem component
*
* @var \Symfony\Component\Filesystem\Filesystem
*/
protected $symfony_filesystem;
/**
* Constructor
*/
public function __construct()
{
$this->chmod_info = array();
$this->symfony_filesystem = new \Symfony\Component\Filesystem\Filesystem();
$this->working_directory = null;
}
/**
* {@inheritdoc}
*/
public function chgrp($files, $group, $recursive = false)
{
try
{
$this->symfony_filesystem->chgrp($files, $group, $recursive);
}
catch (\Symfony\Component\Filesystem\Exception\IOException $e)
{
// Try to recover filename
// By the time this is written that is at the end of the message
$error = trim($e->getMessage());
$file = substr($error, strrpos($error, ' '));
throw new filesystem_exception('CANNOT_CHANGE_FILE_GROUP', $file, array(), $e);
}
}
/**
* {@inheritdoc}
*/
public function chmod($files, $perms = null, $recursive = false, $force_chmod_link = false)
{
if (is_null($perms))
{
// Default to read permission for compatibility reasons
$perms = self::CHMOD_READ;
}
// Check if we got a permission flag
if ($perms > self::CHMOD_ALL)
{
$file_perm = $perms;
// Extract permissions
//$owner = ($file_perm >> 6) & 7; // This will be ignored
$group = ($file_perm >> 3) & 7;
$other = ($file_perm >> 0) & 7;
// Does any permissions provided? if so we add execute bit for directories
$group = ($group !== 0) ? ($group | self::CHMOD_EXECUTE) : $group;
$other = ($other !== 0) ? ($other | self::CHMOD_EXECUTE) : $other;
// Compute directory permissions
$dir_perm = (self::CHMOD_ALL << 6) + ($group << 3) + ($other << 3);
}
else
{
// Add execute bit to owner if execute bit is among perms
$owner_perm = (self::CHMOD_READ | self::CHMOD_WRITE) | ($perms & self::CHMOD_EXECUTE);
$file_perm = ($owner_perm << 6) + ($perms << 3) + ($perms << 0);
// Compute directory permissions
$perm = ($perms !== 0) ? ($perms | self::CHMOD_EXECUTE) : $perms;
$dir_perm = (($owner_perm | self::CHMOD_EXECUTE) << 6) + ($perm << 3) + ($perm << 0);
}
// Symfony's filesystem component does not support extra execution flags on directories
// so we need to implement it again
foreach ($this->to_iterator($files) as $file)
{
if ($recursive && is_dir($file) && !is_link($file))
{
$this->chmod(new \FilesystemIterator($file), $perms, true);
}
// Don't chmod links as mostly those require 0777 and that cannot be changed
if (is_dir($file) || (is_link($file) && $force_chmod_link))
{
if (true !== @chmod($file, $dir_perm))
{
throw new filesystem_exception('CANNOT_CHANGE_FILE_PERMISSIONS', $file, array());
}
}
else if (is_file($file))
{
if (true !== @chmod($file, $file_perm))
{
throw new filesystem_exception('CANNOT_CHANGE_FILE_PERMISSIONS', $file, array());
}
}
}
}
/**
* {@inheritdoc}
*/
public function chown($files, $user, $recursive = false)
{
try
{
$this->symfony_filesystem->chown($files, $user, $recursive);
}
catch (\Symfony\Component\Filesystem\Exception\IOException $e)
{
// Try to recover filename
// By the time this is written that is at the end of the message
$error = trim($e->getMessage());
$file = substr($error, strrpos($error, ' '));
throw new filesystem_exception('CANNOT_CHANGE_FILE_GROUP', $file, array(), $e);
}
}
/**
* {@inheritdoc}
*/
public function clean_path($path)
{
$exploded = explode('/', $path);
$filtered = array();
foreach ($exploded as $part)
{
if ($part === '.' && !empty($filtered))
{
continue;
}
if ($part === '..' && !empty($filtered) && $filtered[sizeof($filtered) - 1] !== '.' && $filtered[sizeof($filtered) - 1] !== '..')
{
array_pop($filtered);
}
else
{
$filtered[] = $part;
}
}
$path = implode('/', $filtered);
return $path;
}
/**
* {@inheritdoc}
*/
public function copy($origin_file, $target_file, $override = false)
{
try
{
$this->symfony_filesystem->copy($origin_file, $target_file, $override);
}
catch (\Symfony\Component\Filesystem\Exception\IOException $e)
{
throw new filesystem_exception('CANNOT_COPY_FILES', '', array(), $e);
}
}
/**
* {@inheritdoc}
*/
public function dump_file($filename, $content)
{
try
{
$this->symfony_filesystem->dumpFile($filename, $content);
}
catch (\Symfony\Component\Filesystem\Exception\IOException $e)
{
throw new filesystem_exception('CANNOT_DUMP_FILE', $filename, array(), $e);
}
}
/**
* {@inheritdoc}
*/
public function exists($files)
{
return $this->symfony_filesystem->exists($files);
}
/**
* {@inheritdoc}
*/
public function is_absolute_path($path)
{
return (isset($path[0]) && $path[0] === '/' || preg_match('#^[a-z]:[/\\\]#i', $path)) ? true : false;
}
/**
* {@inheritdoc}
*/
public function is_readable($files, $recursive = false)
{
foreach ($this->to_iterator($files) as $file)
{
if ($recursive && is_dir($file) && !is_link($file))
{
if (!$this->is_readable(new \FilesystemIterator($file), true))
{
return false;
}
}
if (!is_readable($file))
{
return false;
}
}
return true;
}
/**
* {@inheritdoc}
*/
public function is_writable($files, $recursive = false)
{
if (defined('PHP_WINDOWS_VERSION_MAJOR') || !function_exists('is_writable'))
{
foreach ($this->to_iterator($files) as $file)
{
if ($recursive && is_dir($file) && !is_link($file))
{
if (!$this->is_writable(new \FilesystemIterator($file), true))
{
return false;
}
}
if (!$this->phpbb_is_writable($file))
{
return false;
}
}
}
else
{
// use built in is_writable
foreach ($this->to_iterator($files) as $file)
{
if ($recursive && is_dir($file) && !is_link($file))
{
if (!$this->is_writable(new \FilesystemIterator($file), true))
{
return false;
}
}
if (!is_writable($file))
{
return false;
}
}
}
return true;
}
/**
* {@inheritdoc}
*/
public function make_path_relative($end_path, $start_path)
{
return $this->symfony_filesystem->makePathRelative($end_path, $start_path);
}
/**
* {@inheritdoc}
*/
public function mirror($origin_dir, $target_dir, \Traversable $iterator = null, $options = array())
{
try
{
$this->symfony_filesystem->mirror($origin_dir, $target_dir, $iterator, $options);
}
catch (\Symfony\Component\Filesystem\Exception\IOException $e)
{
$msg = $e->getMessage();
$filename = substr($msg, strpos($msg, '"'), strrpos($msg, '"'));
throw new filesystem_exception('CANNOT_MIRROR_DIRECTORY', $filename, array(), $e);
}
}
/**
* {@inheritdoc}
*/
public function mkdir($dirs, $mode = 0777)
{
try
{
$this->symfony_filesystem->mkdir($dirs, $mode);
}
catch (\Symfony\Component\Filesystem\Exception\IOException $e)
{
$msg = $e->getMessage();
$filename = substr($msg, strpos($msg, '"'), strrpos($msg, '"'));
throw new filesystem_exception('CANNOT_CREATE_DIRECTORY', $filename, array(), $e);
}
}
/**
* {@inheritdoc}
*/
public function phpbb_chmod($files, $perms = null, $recursive = false, $force_chmod_link = false)
{
if (is_null($perms))
{
// Default to read permission for compatibility reasons
$perms = self::CHMOD_READ;
}
if (empty($this->chmod_info))
{
if (!function_exists('fileowner') || !function_exists('filegroup'))
{
$this->chmod_info['process'] = false;
}
else
{
$common_php_owner = @fileowner(__FILE__);
$common_php_group = @filegroup(__FILE__);
// And the owner and the groups PHP is running under.
$php_uid = (function_exists('posic_getuid')) ? @posix_getuid() : false;
$php_gids = (function_exists('posix_getgroups')) ? @posix_getgroups() : false;
// If we are unable to get owner/group, then do not try to set them by guessing
if (!$php_uid || empty($php_gids) || !$common_php_owner || !$common_php_group)
{
$this->chmod_info['process'] = false;
}
else
{
$this->chmod_info = array(
'process' => true,
'common_owner' => $common_php_owner,
'common_group' => $common_php_group,
'php_uid' => $php_uid,
'php_gids' => $php_gids,
);
}
}
}
if ($this->chmod_info['process'])
{
try
{
foreach ($this->to_iterator($files) as $file)
{
$file_uid = @fileowner($file);
$file_gid = @filegroup($file);
// Change owner
if ($file_uid !== $this->chmod_info['common_owner'])
{
$this->chown($file, $this->chmod_info['common_owner'], $recursive);
}
// Change group
if ($file_gid !== $this->chmod_info['common_group'])
{
$this->chgrp($file, $this->chmod_info['common_group'], $recursive);
}
clearstatcache();
$file_uid = @fileowner($file);
$file_gid = @filegroup($file);
}
}
catch (filesystem_exception $e)
{
$this->chmod_info['process'] = false;
}
}
// Still able to process?
if ($this->chmod_info['process'])
{
if ($file_uid === $this->chmod_info['php_uid'])
{
$php = 'owner';
}
else if (in_array($file_gid, $this->chmod_info['php_gids']))
{
$php = 'group';
}
else
{
// Since we are setting the everyone bit anyway, no need to do expensive operations
$this->chmod_info['process'] = false;
}
}
// We are not able to determine or change something
if (!$this->chmod_info['process'])
{
$php = 'other';
}
switch ($php)
{
case 'owner':
try
{
$this->chmod($files, $perms, $recursive, $force_chmod_link);
clearstatcache();
if ($this->is_readable($files) && $this->is_writable($files))
{
break;
}
}
catch (filesystem_exception $e)
{
// Do nothing
}
case 'group':
try
{
$this->chmod($files, $perms, $recursive, $force_chmod_link);
clearstatcache();
if ((!($perms & self::CHMOD_READ) || $this->is_readable($files, $recursive)) && (!($perms & self::CHMOD_WRITE) || $this->is_writable($files, $recursive)))
{
break;
}
}
catch (filesystem_exception $e)
{
// Do nothing
}
case 'other':
default:
$this->chmod($files, $perms, $recursive, $force_chmod_link);
break;
}
}
/**
* {@inheritdoc}
*/
public function realpath($path)
{
if (!function_exists('realpath'))
{
return $this->phpbb_own_realpath($path);
}
$realpath = realpath($path);
// Strangely there are provider not disabling realpath but returning strange values. :o
// We at least try to cope with them.
if ((!$this->is_absolute_path($path) && $realpath === $path) || $realpath === false)
{
return $this->phpbb_own_realpath($path);
}
// Check for DIRECTORY_SEPARATOR at the end (and remove it!)
if (substr($realpath, -1) === DIRECTORY_SEPARATOR)
{
$realpath = substr($realpath, 0, -1);
}
return $realpath;
}
/**
* {@inheritdoc}
*/
public function remove($files)
{
try
{
$this->symfony_filesystem->remove($files);
}
catch (\Symfony\Component\Filesystem\Exception\IOException $e)
{
// Try to recover filename
// By the time this is written that is at the end of the message
$error = trim($e->getMessage());
$file = substr($error, strrpos($error, ' '));
throw new filesystem_exception('CANNOT_DELETE_FILES', $file, array(), $e);
}
}
/**
* {@inheritdoc}
*/
public function rename($origin, $target, $overwrite = false)
{
try
{
$this->symfony_filesystem->rename($origin, $target, $overwrite);
}
catch (\Symfony\Component\Filesystem\Exception\IOException $e)
{
$msg = $e->getMessage();
$filename = substr($msg, strpos($msg, '"'), strrpos($msg, '"'));
throw new filesystem_exception('CANNOT_RENAME_FILE', $filename, array(), $e);
}
}
/**
* {@inheritdoc}
*/
public function symlink($origin_dir, $target_dir, $copy_on_windows = false)
{
try
{
$this->symfony_filesystem->symlink($origin_dir, $target_dir, $copy_on_windows);
}
catch (\Symfony\Component\Filesystem\Exception\IOException $e)
{
throw new filesystem_exception('CANNOT_CREATE_SYMLINK', $origin_dir, array(), $e);
}
}
/**
* {@inheritdoc}
*/
public function touch($files, $time = null, $access_time = null)
{
try
{
$this->symfony_filesystem->touch($files, $time, $access_time);
}
catch (\Symfony\Component\Filesystem\Exception\IOException $e)
{
// Try to recover filename
// By the time this is written that is at the end of the message
$error = trim($e->getMessage());
$file = substr($error, strrpos($error, ' '));
throw new filesystem_exception('CANNOT_TOUCH_FILES', $file, array(), $e);
}
}
/**
* phpBB's implementation of is_writable
*
* @todo Investigate if is_writable is still buggy
*
* @param string $file file/directory to check if writable
*
* @return bool true if the given path is writable
*/
protected function phpbb_is_writable($file)
{
if (file_exists($file))
{
// Canonicalise path to absolute path
$file = $this->realpath($file);
if (is_dir($file))
{
// Test directory by creating a file inside the directory
$result = @tempnam($file, 'i_w');
if (is_string($result) && file_exists($result))
{
unlink($result);
// Ensure the file is actually in the directory (returned realpathed)
return (strpos($result, $file) === 0) ? true : false;
}
}
else
{
$handle = @fopen($file, 'w');
if (is_resource($handle))
{
fclose($handle);
return true;
}
}
}
else
{
// file does not exist test if we can write to the directory
$dir = dirname($file);
if (file_exists($dir) && is_dir($dir) && $this->phpbb_is_writable($dir))
{
return true;
}
}
return false;
}
/**
* Try to resolve real path when PHP's realpath failes to do so
*
* @param string $path
* @return bool|string
*/
protected function phpbb_own_realpath($path)
{
// Replace all directory separators with '/'
$path = str_replace(DIRECTORY_SEPARATOR, '/', $path);
$is_absolute_path = false;
$path_prefix = '';
if ($this->is_absolute_path($path))
{
$is_absolute_path = true;
}
else
{
// Resolve working directory and store it
if (is_null($this->working_directory))
{
if (function_exists('getcwd'))
{
$this->working_directory = str_replace(DIRECTORY_SEPARATOR, '/', getcwd());
}
//
// From this point on we really just guessing
// If chdir were called we screwed
//
else if (function_exists('debug_backtrace'))
{
$call_stack = debug_backtrace(0);
$this->working_directory = str_replace(DIRECTORY_SEPARATOR, '/', dirname($call_stack[sizeof($call_stack) - 1]['file']));
}
else
{
//
// Assuming that the working directory is phpBB root
// we could use this as a fallback, when phpBB will use controllers
// everywhere this will be a safe assumption
//
//$dir_parts = explode(DIRECTORY_SEPARATOR, __DIR__);
//$namespace_parts = explode('\\', trim(__NAMESPACE__, '\\'));
//$namespace_part_count = sizeof($namespace_parts);
// Check if we still loading from root
//if (array_slice($dir_parts, -$namespace_part_count) === $namespace_parts)
//{
// $this->working_directory = implode('/', array_slice($dir_parts, 0, -$namespace_part_count));
//}
//else
//{
// $this->working_directory = false;
//}
$this->working_directory = false;
}
}
if ($this->working_directory !== false)
{
$is_absolute_path = true;
$path = $this->working_directory . '/' . $path;
}
}
if ($is_absolute_path)
{
if (defined('PHP_WINDOWS_VERSION_MAJOR'))
{
$path_prefix = $path[0] . ':';
$path = substr($path, 2);
}
else
{
$path_prefix = '';
}
}
$resolved_path = $this->resolve_path($path, $path_prefix, $is_absolute_path);
if ($resolved_path === false)
{
return false;
}
if (!@file_exists($resolved_path) || (!@is_dir($resolved_path . '/') && !is_file($resolved_path)))
{
return false;
}
// Return OS specific directory separators
$resolved = str_replace('/', DIRECTORY_SEPARATOR, $resolved_path);
// Check for DIRECTORY_SEPARATOR at the end (and remove it!)
if (substr($resolved, -1) === DIRECTORY_SEPARATOR)
{
return substr($resolved, 0, -1);
}
return $resolved;
}
/**
* Convert file(s) to \Traversable object
*
* This is the same function as Symfony's toIterator, but that is private
* so we cannot use it.
*
* @param string|array|\Traversable $files filename/list of filenames
* @return \Traversable
*/
protected function to_iterator($files)
{
if (!$files instanceof \Traversable)
{
$files = new \ArrayObject(is_array($files) ? $files : array($files));
}
return $files;
}
/**
* Try to resolve symlinks in path
*
* @param string $path The path to resolve
* @param string $prefix The path prefix (on windows the drive letter)
* @param bool $absolute Whether or not the path is absolute
* @param bool $return_array Whether or not to return path parts
*
* @return string|array|bool returns the resolved path or an array of parts of the path if $return_array is true
* or false if path cannot be resolved
*/
protected function resolve_path($path, $prefix = '', $absolute = false, $return_array = false)
{
if ($return_array)
{
$path = str_replace(DIRECTORY_SEPARATOR, '/', $path);
}
trim ($path, '/');
$path_parts = explode('/', $path);
$resolved = array();
$resolved_path = $prefix;
$file_found = false;
foreach ($path_parts as $path_part)
{
if ($file_found)
{
return false;
}
if (empty($path_part) || ($path_part === '.' && ($absolute || !empty($resolved))))
{
continue;
}
else if ($absolute && $path_part === '..')
{
if (empty($resolved))
{
// No directories above root
return false;
}
array_pop($resolved);
$resolved_path = false;
}
else if ($path_part === '..' && !empty($resolved) && !in_array($resolved[sizeof($resolved) - 1], array('.', '..')))
{
array_pop($resolved);
$resolved_path = false;
}
else
{
if ($resolved_path === false)
{
if (empty($resolved))
{
$resolved_path = ($absolute) ? $prefix . '/' . $path_part : $path_part;
}
else
{
$tmp_array = $resolved;
if ($absolute)
{
array_unshift($tmp_array, $prefix);
}
$resolved_path = implode('/', $tmp_array);
}
}
$current_path = $resolved_path . '/' . $path_part;
// Resolve symlinks
if (is_link($current_path))
{
if (!function_exists('readlink'))
{
return false;
}
$link = readlink($current_path);
// Is link has an absolute path in it?
if ($this->is_absolute_path($link))
{
if (defined('PHP_WINDOWS_VERSION_MAJOR'))
{
$prefix = $link[0] . ':';
$link = substr($link, 2);
}
else
{
$prefix = '';
}
$resolved = $this->resolve_path($link, $prefix, true, true);
$absolute = true;
}
else
{
$resolved = $this->resolve_path($resolved_path . '/' . $link, $prefix, $absolute, true);
}
if (!$resolved)
{
return false;
}
$resolved_path = false;
}
else if (is_dir($current_path . '/'))
{
$resolved[] = $path_part;
$resolved_path = $current_path;
}
else if (is_file($current_path))
{
$resolved[] = $path_part;
$resolved_path = $current_path;
$file_found = true;
}
else
{
return false;
}
}
}
// If at the end of the path there were a .. or .
// we need to build the path again.
// Only doing this when a string is expected in return
if ($resolved_path === false && $return_array === false)
{
if (empty($resolved))
{
$resolved_path = ($absolute) ? $prefix . '/' : './';
}
else
{
$tmp_array = $resolved;
if ($absolute)
{
array_unshift($tmp_array, $prefix);
}
$resolved_path = implode('/', $tmp_array);
}
}
return ($return_array) ? $resolved : $resolved_path;
}
}

View File

@ -0,0 +1,284 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
namespace phpbb\filesystem;
/**
* Interface for phpBB's filesystem service
*/
interface filesystem_interface
{
/**
* chmod all permissions flag
*
* @var int
*/
const CHMOD_ALL = 7;
/**
* chmod read permissions flag
*
* @var int
*/
const CHMOD_READ = 4;
/**
* chmod write permissions flag
*
* @var int
*/
const CHMOD_WRITE = 2;
/**
* chmod execute permissions flag
*
* @var int
*/
const CHMOD_EXECUTE = 1;
/**
* Change owner group of files/directories
*
* @param string|array|\Traversable $files The file(s)/directorie(s) to change group
* @param string $group The group that should own the files/directories
* @param bool $recursive If the group should be changed recursively
* @throws \phpbb\filesystem\exception\filesystem_exception the filename which triggered the error can be
* retrieved by filesystem_exception::get_filename()
*/
public function chgrp($files, $group, $recursive = false);
/**
* Global function for chmodding directories and files for internal use
*
* The function accepts filesystem_interface::CHMOD_ flags in the permission argument
* or the user can specify octal values (or any integer if it makes sense). All directories will have
* an execution bit appended, if the user group (owner, group or other) has any bit specified.
*
* @param string|array|\Traversable $file The file/directory to be chmodded
* @param int $perms Permissions to set
* @param bool $recursive If the permissions should be changed recursively
* @param bool $force_chmod_link Try to apply permissions to symlinks as well
*
* @throws \phpbb\filesystem\exception\filesystem_exception the filename which triggered the error can be
* retrieved by filesystem_exception::get_filename()
*/
public function chmod($files, $perms = null, $recursive = false, $force_chmod_link = false);
/**
* Change owner group of files/directories
*
* @param string|array|\Traversable $files The file(s)/directorie(s) to change group
* @param string $user The owner user name
* @param bool $recursive Whether change the owner recursively or not
*
* @throws \phpbb\filesystem\exception\filesystem_exception the filename which triggered the error can be
* retrieved by filesystem_exception::get_filename()
*/
public function chown($files, $user, $recursive = false);
/**
* Eliminates useless . and .. components from specified path.
*
* @param string $path Path to clean
*
* @return string Cleaned path
*/
public function clean_path($path);
/**
* Copies a file.
*
* This method only copies the file if the origin file is newer than the target file.
*
* By default, if the target already exists, it is not overridden.
*
* @param string $origin_file The original filename
* @param string $target_file The target filename
* @param bool $override Whether to override an existing file or not
*
* @throws \phpbb\filesystem\exception\filesystem_exception When the file cannot be copied
*/
public function copy($origin_file, $target_file, $override = false);
/**
* Atomically dumps content into a file.
*
* @param string $filename The file to be written to.
* @param string $content The data to write into the file.
*
* @throws \phpbb\filesystem\exception\filesystem_exception When the file cannot be written
*/
public function dump_file($filename, $content);
/**
* Checks the existence of files or directories.
*
* @param string|array|\Traversable $files files/directories to check
*
* @return bool Returns true if all files/directories exist, false otherwise
*/
public function exists($files);
/**
* Checks if a path is absolute or not
*
* @param string $path Path to check
*
* @return bool true if the path is absolute, false otherwise
*/
public function is_absolute_path($path);
/**
* Checks if files/directories are readable
*
* @param string|array|\Traversable $files files/directories to check
* @param bool $recursive Whether or not directories should be checked recursively
*
* @return bool True when the files/directories are readable, otherwise false.
*/
public function is_readable($files, $recursive = false);
/**
* Test if a file/directory is writable
*
* @param string|array|\Traversable $files files/directories to perform write test on
* @param bool $recursive Whether or not directories should be checked recursively
*
* @return bool True when the files/directories are writable, otherwise false.
*/
public function is_writable($files, $recursive = false);
/**
* Given an existing path, convert it to a path relative to a given starting path
*
* @param string $end_path Absolute path of target
* @param string $start_path Absolute path where traversal begins
*
* @return string Path of target relative to starting path
*/
public function make_path_relative($end_path, $start_path);
/**
* Mirrors a directory to another.
*
* @param string $origin_dir The origin directory
* @param string $target_dir The target directory
* @param \Traversable $iterator A Traversable instance
* @param array $options An array of boolean options
* Valid options are:
* - $options['override'] Whether to override an existing file on copy or not (see copy())
* - $options['copy_on_windows'] Whether to copy files instead of links on Windows (see symlink())
* - $options['delete'] Whether to delete files that are not in the source directory (defaults to false)
*
* @throws \phpbb\filesystem\exception\filesystem_exception When the file cannot be copied.
* The filename which triggered the error can be
* retrieved by filesystem_exception::get_filename()
*/
public function mirror($origin_dir, $target_dir, \Traversable $iterator = null, $options = array());
/**
* Creates a directory recursively.
*
* @param string|array|\Traversable $dirs The directory path
* @param int $mode The directory mode
*
* @throws \phpbb\filesystem\exception\filesystem_exception On any directory creation failure
* The filename which triggered the error can be
* retrieved by filesystem_exception::get_filename()
*/
public function mkdir($dirs, $mode = 0777);
/**
* Global function for chmodding directories and files for internal use
*
* This function determines owner and group whom the file belongs to and user and group of PHP and then set safest possible file permissions.
* The function determines owner and group from common.php file and sets the same to the provided file.
* The function uses bit fields to build the permissions.
* The function sets the appropiate execute bit on directories.
*
* Supported constants representing bit fields are:
*
* filesystem_interface::CHMOD_ALL - all permissions (7)
* filesystem_interface::CHMOD_READ - read permission (4)
* filesystem_interface::CHMOD_WRITE - write permission (2)
* filesystem_interface::CHMOD_EXECUTE - execute permission (1)
*
* NOTE: The function uses POSIX extension and fileowner()/filegroup() functions. If any of them is disabled, this function tries to build proper permissions, by calling is_readable() and is_writable() functions.
*
* @param string|array|\Traversable $file The file/directory to be chmodded
* @param int $perms Permissions to set
* @param bool $recursive If the permissions should be changed recursively
* @param bool $force_chmod_link Try to apply permissions to symlinks as well
*
* @throws \phpbb\filesystem\exception\filesystem_exception the filename which triggered the error can be
* retrieved by filesystem_exception::get_filename()
*/
public function phpbb_chmod($file, $perms = null, $recursive = false, $force_chmod_link = false);
/**
* A wrapper for PHP's realpath
*
* Try to resolve realpath when PHP's realpath is not available, or
* known to be buggy.
*
* @param string $path Path to resolve
*
* @return string Resolved path
*/
public function realpath($path);
/**
* Removes files or directories.
*
* @param string|array|\Traversable $files A filename, an array of files, or a \Traversable instance to remove
*
* @throws \phpbb\filesystem\exception\filesystem_exception When removal fails.
* The filename which triggered the error can be
* retrieved by filesystem_exception::get_filename()
*/
public function remove($files);
/**
* Renames a file or a directory.
*
* @param string $origin The origin filename or directory
* @param string $target The new filename or directory
* @param bool $overwrite Whether to overwrite the target if it already exists
*
* @throws \phpbb\filesystem\exception\filesystem_exception When target file or directory already exists,
* or origin cannot be renamed.
*/
public function rename($origin, $target, $overwrite = false);
/**
* Creates a symbolic link or copy a directory.
*
* @param string $origin_dir The origin directory path
* @param string $target_dir The symbolic link name
* @param bool $copy_on_windows Whether to copy files if on Windows
*
* @throws \phpbb\filesystem\exception\filesystem_exception When symlink fails
*/
public function symlink($origin_dir, $target_dir, $copy_on_windows = false);
/**
* Sets access and modification time of file.
*
* @param string|array|\Traversable $files A filename, an array of files, or a \Traversable instance to create
* @param int $time The touch time as a Unix timestamp
* @param int $access_time The access time as a Unix timestamp
*
* @throws \phpbb\filesystem\exception\filesystem_exception When touch fails
*/
public function touch($files, $time = null, $access_time = null);
}

View File

@ -48,14 +48,14 @@ class finder
/**
* Creates a new finder instance with its dependencies
*
* @param \phpbb\filesystem $filesystem Filesystem instance
* @param \phpbb\filesystem\filesystem_interface $filesystem Filesystem instance
* @param string $phpbb_root_path Path to the phpbb root directory
* @param \phpbb\cache\driver\driver_interface $cache A cache instance or null
* @param string $php_ext php file extension
* @param string $cache_name The name of the cache variable, defaults to
* _ext_finder
*/
public function __construct(\phpbb\filesystem $filesystem, $phpbb_root_path = '', \phpbb\cache\driver\driver_interface $cache = null, $php_ext = 'php', $cache_name = '_ext_finder')
public function __construct(\phpbb\filesystem\filesystem_interface $filesystem, $phpbb_root_path = '', \phpbb\cache\driver\driver_interface $cache = null, $php_ext = 'php', $cache_name = '_ext_finder')
{
$this->filesystem = $filesystem;
$this->phpbb_root_path = $phpbb_root_path;

View File

@ -21,7 +21,7 @@ class path_helper
/** @var \phpbb\symfony_request */
protected $symfony_request;
/** @var \phpbb\filesystem */
/** @var \phpbb\filesystem\filesystem_interface */
protected $filesystem;
/** @var \phpbb\request\request_interface */
@ -43,13 +43,13 @@ class path_helper
* Constructor
*
* @param \phpbb\symfony_request $symfony_request
* @param \phpbb\filesystem $filesystem
* @param \phpbb\filesystem\filesystem_interface $filesystem
* @param \phpbb\request\request_interface $request
* @param string $phpbb_root_path Relative path to phpBB root
* @param string $php_ext PHP file extension
* @param mixed $adm_relative_path Relative path admin path to adm/ root
*/
public function __construct(\phpbb\symfony_request $symfony_request, \phpbb\filesystem $filesystem, \phpbb\request\request_interface $request, $phpbb_root_path, $php_ext, $adm_relative_path = null)
public function __construct(\phpbb\symfony_request $symfony_request, \phpbb\filesystem\filesystem_interface $filesystem, \phpbb\request\request_interface $request, $phpbb_root_path, $php_ext, $adm_relative_path = null)
{
$this->symfony_request = $symfony_request;
$this->filesystem = $filesystem;

View File

@ -85,17 +85,24 @@ class router implements RouterInterface
*/
protected $route_collection;
/**
* @var \phpbb\filesystem\filesystem_interface
*/
protected $filesystem;
/**
* Construct method
*
* @param \phpbb\filesystem\filesystem_interface $filesystem Filesystem helper
* @param manager $extension_manager Extension manager
* @param string $phpbb_root_path phpBB root path
* @param string $php_ext PHP file extension
* @param string $environment Name of the current environment
* @param array $routing_files Array of strings containing paths to YAML files holding route information
*/
public function __construct(manager $extension_manager, $phpbb_root_path, $php_ext, $environment, $routing_files = array())
public function __construct(\phpbb\filesystem\filesystem_interface $filesystem, manager $extension_manager, $phpbb_root_path, $php_ext, $environment, $routing_files = array())
{
$this->filesystem = $filesystem;
$this->extension_manager = $extension_manager;
$this->routing_files = $routing_files;
$this->phpbb_root_path = $phpbb_root_path;
@ -148,7 +155,7 @@ class router implements RouterInterface
$this->route_collection = new RouteCollection;
foreach ($this->routing_files as $file_path)
{
$loader = new YamlFileLoader(new FileLocator(phpbb_realpath($base_path)));
$loader = new YamlFileLoader(new FileLocator($this->filesystem->realpath($base_path)));
$this->route_collection->addCollection($loader->load($file_path));
}
}

View File

@ -92,8 +92,8 @@ class session
}
// current directory within the phpBB root (for example: adm)
$root_dirs = explode('/', str_replace('\\', '/', phpbb_realpath($root_path)));
$page_dirs = explode('/', str_replace('\\', '/', phpbb_realpath('./')));
$root_dirs = explode('/', str_replace('\\', '/', $phpbb_filesystem->realpath($root_path)));
$page_dirs = explode('/', str_replace('\\', '/', $phpbb_filesystem->realpath('./')));
$intersection = array_intersect_assoc($root_dirs, $page_dirs);
$root_dirs = array_diff_assoc($root_dirs, $intersection);

View File

@ -20,6 +20,24 @@ class loader extends \Twig_Loader_Filesystem
{
protected $safe_directories = array();
/**
* @var \phpbb\filesystem\filesystem_interface
*/
protected $filesystem;
/**
* Constructor
*
* @param \phpbb\filesystem\filesystem_interface $filesystem
* @param string|array $paths
*/
public function __construct(\phpbb\filesystem\filesystem_interface $filesystem, $paths = array())
{
$this->filesystem = $filesystem;
parent::__construct($paths);
}
/**
* Set safe directories
*
@ -49,7 +67,7 @@ class loader extends \Twig_Loader_Filesystem
*/
public function addSafeDirectory($directory)
{
$directory = phpbb_realpath($directory);
$directory = $this->filesystem->realpath($directory);
if ($directory !== false)
{
@ -118,7 +136,7 @@ class loader extends \Twig_Loader_Filesystem
// can now check if we're within a "safe" directory
// Find the real path of the directory the file is in
$directory = phpbb_realpath(dirname($file));
$directory = $this->filesystem->realpath(dirname($file));
if ($directory === false)
{

View File

@ -18,13 +18,13 @@ namespace phpbb;
*/
class viewonline_helper
{
/** @var \phpbb\filesystem */
/** @var \phpbb\filesystem\filesystem_interface */
protected $filesystem;
/**
* @param \phpbb\filesystem $filesystem
* @param \phpbb\filesystem\filesystem_interface $filesystem phpBB's filesystem service
*/
public function __construct(\phpbb\filesystem $filesystem)
public function __construct(\phpbb\filesystem\filesystem_interface $filesystem)
{
$this->filesystem = $filesystem;
}

View File

@ -35,6 +35,8 @@ class phpbb_avatar_manager_test extends \phpbb_database_test_case
->method('get')
->will($this->returnArgument(0));
$filesystem = new \phpbb\filesystem\filesystem();
// Prepare dependencies for avatar manager and driver
$this->config = new \phpbb\config\config(array());
$cache = $this->getMock('\phpbb\cache\driver\driver_interface');
@ -42,7 +44,7 @@ class phpbb_avatar_manager_test extends \phpbb_database_test_case
new \phpbb\symfony_request(
new phpbb_mock_request()
),
new \phpbb\filesystem(),
$filesystem,
$this->getMock('\phpbb\request\request'),
$phpbb_root_path,
$phpEx
@ -76,7 +78,7 @@ class phpbb_avatar_manager_test extends \phpbb_database_test_case
}
else
{
$cur_avatar = $this->getMock('\phpbb\avatar\driver\\' . $driver, array('get_name'), array($this->config, $phpbb_root_path, $phpEx, $path_helper, $guesser, $cache));
$cur_avatar = $this->getMock('\phpbb\avatar\driver\\' . $driver, array('get_name'), array($this->config, $phpbb_root_path, $phpEx, $filesystem, $path_helper, $guesser, $cache));
}
$cur_avatar->expects($this->any())
->method('get_name')

View File

@ -69,7 +69,7 @@ abstract class phpbb_controller_common_helper_route extends phpbb_test_case
$this->symfony_request = new \phpbb\symfony_request(
$this->request
);
$this->filesystem = new \phpbb\filesystem();
$this->filesystem = new \phpbb\filesystem\filesystem();
$this->phpbb_path_helper = new \phpbb\path_helper(
$this->symfony_request,
$this->filesystem,
@ -84,7 +84,7 @@ abstract class phpbb_controller_common_helper_route extends phpbb_test_case
$container = new phpbb_mock_container_builder();
$cache_path = $phpbb_root_path . 'cache/twig';
$context = new \phpbb\template\context();
$loader = new \phpbb\template\twig\loader('');
$loader = new \phpbb\template\twig\loader($this->filesystem, '');
$twig = new \phpbb\template\twig\environment(
$this->config,
$this->phpbb_path_helper,
@ -113,7 +113,7 @@ abstract class phpbb_controller_common_helper_route extends phpbb_test_case
)
);
$this->router = new phpbb_mock_router($this->extension_manager, dirname(__FILE__) . '/', 'php', PHPBB_ENVIRONMENT);
$this->router = new phpbb_mock_router($this->filesystem, $this->extension_manager, dirname(__FILE__) . '/', 'php', PHPBB_ENVIRONMENT);
$this->router->find_routing_files($this->extension_manager->all_enabled(false));
$this->router->find(dirname(__FILE__) . '/');
// Set correct current phpBB root path

View File

@ -40,7 +40,7 @@ class phpbb_controller_controller_test extends phpbb_test_case
public function test_router_find_files()
{
$router = new \phpbb\routing\router($this->extension_manager, dirname(__FILE__) . '/', 'php', PHPBB_ENVIRONMENT);
$router = new \phpbb\routing\router(new \phpbb\filesystem\filesystem(), $this->extension_manager, dirname(__FILE__) . '/', 'php', PHPBB_ENVIRONMENT);
$router->find_routing_files($this->extension_manager->all_enabled(false));
$routes = $router->find(__DIR__)->get_routes();

View File

@ -22,7 +22,9 @@ class phpbb_dbal_connect_test extends phpbb_database_test_case
public function test_failing_connect()
{
global $phpbb_root_path, $phpEx;
global $phpbb_root_path, $phpEx, $phpbb_filesystem;
$phpbb_filesystem = new phpbb\filesystem\filesystem();
$config = $this->get_database_config();

View File

@ -69,7 +69,7 @@ class phpbb_dbal_migrator_test extends phpbb_database_test_case
$container,
$this->db,
$this->config,
new phpbb\filesystem(),
new phpbb\filesystem\filesystem(),
$user,
'phpbb_ext',
dirname(__FILE__) . '/../../phpBB/',

View File

@ -25,7 +25,8 @@ class extension extends extension_base
{
protected function load_services(ContainerBuilder $container)
{
$loader = new YamlFileLoader($container, new FileLocator(phpbb_realpath($this->ext_path)));
$filesystem = new \phpbb\filesystem\filesystem();
$loader = new YamlFileLoader($container, new FileLocator($filesystem->realpath($this->ext_path)));
$loader->load('environment.yml');
}
}

View File

@ -15,6 +15,15 @@ require_once dirname(__FILE__) . '/../phpBB/includes/functions.php';
class phpbb_error_collector_test extends phpbb_test_case
{
public function setUp()
{
parent::setUp();
global $phpbb_filesystem;
$phpbb_filesystem = new \phpbb\filesystem\filesystem();
}
public function test_collection()
{
$collector = new \phpbb\error_collector(E_ALL | E_STRICT); // php set_error_handler() default

View File

@ -244,7 +244,7 @@ class phpbb_extension_finder_test extends phpbb_test_case
public function test_get_classes_create_cache()
{
$cache = new phpbb_mock_cache;
$finder = new \phpbb\finder(new \phpbb\filesystem(), dirname(__FILE__) . '/', $cache, 'php', '_custom_cache_name');
$finder = new \phpbb\finder(new \phpbb\filesystem\filesystem(), dirname(__FILE__) . '/', $cache, 'php', '_custom_cache_name');
$finder->set_extensions(array_keys($this->extension_manager->all_enabled()));
$files = $finder->suffix('_class.php')->get_files();
@ -284,7 +284,7 @@ class phpbb_extension_finder_test extends phpbb_test_case
);
$finder = new \phpbb\finder(
new \phpbb\filesystem(),
new \phpbb\filesystem\filesystem(),
dirname(__FILE__) . '/',
new phpbb_mock_cache(array(
'_ext_finder' => array(

View File

@ -177,7 +177,7 @@ class phpbb_extension_manager_test extends phpbb_database_test_case
$container,
$db,
$config,
new \phpbb\filesystem(),
new \phpbb\filesystem\filesystem(),
$user,
'phpbb_ext',
dirname(__FILE__) . '/',

View File

@ -51,12 +51,12 @@ class phpbb_extension_metadata_manager_test extends phpbb_database_test_case
$container = new phpbb_mock_container_builder();
$cache_path = $this->phpbb_root_path . 'cache/twig';
$context = new \phpbb\template\context();
$loader = new \phpbb\template\twig\loader('');
$loader = new \phpbb\template\twig\loader(new \phpbb\filesystem\filesystem(), '');
$phpbb_path_helper =new \phpbb\path_helper(
new \phpbb\symfony_request(
new phpbb_mock_request()
),
new \phpbb\filesystem(),
new \phpbb\filesystem\filesystem(),
$this->getMock('\phpbb\request\request'),
$this->phpbb_root_path,
$this->phpEx
@ -98,7 +98,7 @@ class phpbb_extension_metadata_manager_test extends phpbb_database_test_case
$container,
$this->db,
$this->config,
new \phpbb\filesystem(),
new \phpbb\filesystem\filesystem(),
$this->user,
'phpbb_ext',
$this->phpbb_root_path,

View File

@ -18,7 +18,7 @@ class phpbb_filesystem_clean_path_test extends phpbb_test_case
public function setUp()
{
parent::setUp();
$this->filesystem = new \phpbb\filesystem();
$this->filesystem = new \phpbb\filesystem\filesystem();
}
public function clean_path_data()

View File

@ -1,20 +1,28 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
class phpbb_functions_is_absolute_test extends phpbb_test_case
class phpbb_filesystem_is_absolute_test extends phpbb_test_case
{
/** @var \phpbb\filesystem\filesystem_interface */
protected $filesystem;
public function setUp()
{
parent::setUp();
$this->filesystem = new \phpbb\filesystem\filesystem();
}
static public function is_absolute_data()
{
return array(
@ -51,10 +59,10 @@ class phpbb_functions_is_absolute_test extends phpbb_test_case
}
/**
* @dataProvider is_absolute_data
*/
* @dataProvider is_absolute_data
*/
public function test_is_absolute($path, $expected)
{
$this->assertEquals($expected, phpbb_is_absolute($path));
$this->assertEquals($expected, $this->filesystem->is_absolute_path($path));
}
}

View File

@ -0,0 +1,90 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
class phpbb_filesystem_realpath_test extends phpbb_test_case
{
static protected $filesystem_own_realpath;
/** @var \phpbb\filesystem\filesystem_interface */
protected $filesystem;
static public function setUpBeforeClass()
{
parent::setUpBeforeClass();
$reflection_class = new ReflectionClass('\phpbb\filesystem\filesystem');
self::$filesystem_own_realpath = $reflection_class->getMethod('phpbb_own_realpath');
self::$filesystem_own_realpath->setAccessible(true);
}
public function setUp()
{
parent::setUp();
$this->filesystem = new \phpbb\filesystem\filesystem();
}
public function realpath_resolve_absolute_without_symlinks_data()
{
return array(
// Constant data
array(__DIR__, __DIR__),
array(__DIR__ . '/../filesystem/../filesystem', __DIR__),
array(__DIR__ . '/././', __DIR__),
array(__DIR__ . '/non_existent', false),
array(__FILE__, __FILE__),
array(__FILE__ . '../', false),
);
}
public function realpath_resolve_relative_without_symlinks_data()
{
if (!function_exists('getcwd'))
{
return array();
}
$filesystem = new \phpbb\filesystem\filesystem();
$relative_path = $filesystem->make_path_relative(__DIR__, getcwd());
return array(
array($relative_path, __DIR__),
array($relative_path . '../filesystem/../filesystem', __DIR__),
array($relative_path . '././', __DIR__),
array($relative_path . 'realpath_test.php', __FILE__),
);
}
/**
* @dataProvider realpath_resolve_absolute_without_symlinks_data
*/
public function test_realpath_absolute_without_links($path, $expected)
{
$this->assertEquals($expected, self::$filesystem_own_realpath->invoke($this->filesystem, $path));
}
/**
* @dataProvider realpath_resolve_relative_without_symlinks_data
*/
public function test_realpath_relative_without_links($path, $expected)
{
if (!function_exists('getcwd'))
{
$this->markTestSkipped('phpbb_own_realpath() cannot be tested with relative paths: getcwd is not available.');
}
$this->assertEquals($expected, self::$filesystem_own_realpath->invoke($this->filesystem, $path));
}
}

View File

@ -18,6 +18,8 @@ require_once __DIR__ . '/../../phpBB/includes/functions_upload.php';
*/
class phpbb_functional_fileupload_remote_test extends phpbb_functional_test_case
{
protected $filesystem;
public function setUp()
{
parent::setUp();
@ -38,6 +40,7 @@ class phpbb_functional_fileupload_remote_test extends phpbb_functional_test_case
$user = new phpbb_mock_user();
$user->lang = new phpbb_mock_lang();
$this->filesystem = new \phpbb\filesystem\filesystem();
}
public function tearDown()
@ -49,21 +52,21 @@ class phpbb_functional_fileupload_remote_test extends phpbb_functional_test_case
public function test_invalid_extension()
{
$upload = new fileupload('', array('jpg'), 100);
$upload = new fileupload($this->filesystem, '', array('jpg'), 100);
$file = $upload->remote_upload(self::$root_url . 'develop/blank.gif');
$this->assertEquals('URL_INVALID', $file->error[0]);
}
public function test_empty_file()
{
$upload = new fileupload('', array('jpg'), 100);
$upload = new fileupload($this->filesystem, '', array('jpg'), 100);
$file = $upload->remote_upload(self::$root_url . 'develop/blank.jpg');
$this->assertEquals('EMPTY_REMOTE_DATA', $file->error[0]);
}
public function test_successful_upload()
{
$upload = new fileupload('', array('gif'), 1000);
$upload = new fileupload($this->filesystem, '', array('gif'), 1000);
$file = $upload->remote_upload(self::$root_url . 'styles/prosilver/theme/images/forum_read.gif');
$this->assertEquals(0, sizeof($file->error));
$this->assertTrue(file_exists($file->filename));
@ -71,7 +74,7 @@ class phpbb_functional_fileupload_remote_test extends phpbb_functional_test_case
public function test_too_large()
{
$upload = new fileupload('', array('gif'), 100);
$upload = new fileupload($this->filesystem, '', array('gif'), 100);
$file = $upload->remote_upload(self::$root_url . 'styles/prosilver/theme/images/forum_read.gif');
$this->assertEquals(1, sizeof($file->error));
$this->assertEquals('WRONG_FILESIZE', $file->error[0]);

View File

@ -29,7 +29,7 @@ class phpbb_build_url_test extends phpbb_test_case
new \phpbb\symfony_request(
new phpbb_mock_request()
),
new \phpbb\filesystem(),
new \phpbb\filesystem\filesystem(),
$this->getMock('\phpbb\request\request'),
$phpbb_root_path,
'php'

View File

@ -13,7 +13,7 @@
class phpbb_mock_controller_helper extends \phpbb\controller\helper
{
public function __construct(\phpbb\template\template $template, \phpbb\user $user, \phpbb\config\config $config, \phpbb\routing\router $router, \phpbb\symfony_request $symfony_request, \phpbb\request\request_interface $request, \phpbb\filesystem $filesystem, $phpbb_root_path, $php_ext, $phpbb_root_path_ext)
public function __construct(\phpbb\template\template $template, \phpbb\user $user, \phpbb\config\config $config, \phpbb\routing\router $router, \phpbb\symfony_request $symfony_request, \phpbb\request\request_interface $request, \phpbb\filesystem\filesystem_interface $filesystem, $phpbb_root_path, $php_ext, $phpbb_root_path_ext)
{
$this->template = $template;
$this->user = $user;

View File

@ -18,7 +18,7 @@ class phpbb_mock_extension_manager extends \phpbb\extension\manager
$this->phpbb_root_path = $phpbb_root_path;
$this->php_ext = 'php';
$this->extensions = $extensions;
$this->filesystem = new \phpbb\filesystem();
$this->filesystem = new \phpbb\filesystem\filesystem();
$this->container = $container;
}
}

View File

@ -34,11 +34,11 @@ class phpbb_pagination_pagination_test extends phpbb_template_template_test_case
->method('lang')
->will($this->returnCallback(array($this, 'return_callback_implode')));
$filesystem = new \phpbb\filesystem();
$filesystem = new \phpbb\filesystem\filesystem();
$manager = new phpbb_mock_extension_manager(dirname(__FILE__) . '/', array());
$this->config = new \phpbb\config\config(array('enable_mod_rewrite' => '1'));
$router = new phpbb_mock_router($manager, dirname(__FILE__) . '/', 'php', PHPBB_ENVIRONMENT);
$router = new phpbb_mock_router($filesystem, $manager, dirname(__FILE__) . '/', 'php', PHPBB_ENVIRONMENT);
$router->find_routing_files($manager->all_enabled(false));
$router->find(dirname(__FILE__) . '/');

View File

@ -21,14 +21,14 @@ class phpbb_path_helper_test extends phpbb_test_case
{
parent::setUp();
$filesystem = new \phpbb\filesystem();
$filesystem = new \phpbb\filesystem\filesystem();
$this->set_phpbb_root_path($filesystem);
$this->path_helper = new \phpbb\path_helper(
new \phpbb\symfony_request(
new phpbb_mock_request()
),
new \phpbb\filesystem(),
new \phpbb\filesystem\filesystem(),
$this->getMock('\phpbb\request\request'),
$this->phpbb_root_path,
'php'
@ -56,7 +56,7 @@ class phpbb_path_helper_test extends phpbb_test_case
public function basic_update_web_root_path_data()
{
$filesystem = new \phpbb\filesystem();
$filesystem = new \phpbb\filesystem\filesystem();
$this->set_phpbb_root_path($filesystem);
return array(
@ -90,7 +90,7 @@ class phpbb_path_helper_test extends phpbb_test_case
public function update_web_root_path_data()
{
$this->set_phpbb_root_path(new \phpbb\filesystem());
$this->set_phpbb_root_path(new \phpbb\filesystem\filesystem());
return array(
array(
@ -158,7 +158,7 @@ class phpbb_path_helper_test extends phpbb_test_case
$path_helper = new \phpbb\path_helper(
$symfony_request,
new \phpbb\filesystem(),
new \phpbb\filesystem\filesystem(),
$this->getMock('\phpbb\request\request'),
$this->phpbb_root_path,
'php'

View File

@ -46,7 +46,7 @@ abstract class phpbb_security_test_base extends phpbb_test_case
$request = new phpbb_mock_request(array(), array(), array(), $this->server);
$symfony_request = new \phpbb\symfony_request($request);
$phpbb_filesystem = new \phpbb\filesystem();
$phpbb_filesystem = new \phpbb\filesystem\filesystem();
// Set no user and trick a bit to circumvent errors
$user = new \phpbb\user('\phpbb\datetime');

View File

@ -62,7 +62,7 @@ class phpbb_security_redirect_test extends phpbb_security_test_base
new \phpbb\symfony_request(
new phpbb_mock_request()
),
new \phpbb\filesystem(),
new \phpbb\filesystem\filesystem(),
$this->getMock('\phpbb\request\request'),
$this->phpbb_root_path,
'php'

View File

@ -42,7 +42,10 @@ class phpbb_session_check_ban_test extends phpbb_session_test_case
parent::setUp();
// Get session here so that config is mocked correctly
$this->session = $this->session_factory->get_session($this->db);
global $cache, $config, $phpbb_root_path, $phpEx;
global $cache, $config, $phpbb_root_path, $phpEx, $phpbb_filesystem;
$phpbb_filesystem = new \phpbb\filesystem\filesystem();
$this->backup_cache = $cache;
// Change the global cache object for this test because
// the mock cache object does not hit the database as is needed

View File

@ -145,7 +145,7 @@ class phpbb_session_extract_page_test extends phpbb_session_test_case
{
global $symfony_request, $request, $phpbb_filesystem;
$phpbb_filesystem = new \phpbb\filesystem();
$phpbb_filesystem = new \phpbb\filesystem\filesystem();
$server['HTTP_HOST'] = 'localhost';
$server['SERVER_NAME'] = 'localhost';

View File

@ -39,8 +39,9 @@ class phpbb_template_includephp_test extends phpbb_template_template_test_case
{
global $phpbb_root_path;
$filesystem = new \phpbb\filesystem\filesystem();
$path_to_php = str_replace('\\', '/', dirname(__FILE__)) . '/templates/_dummy_include.php.inc';
$this->assertTrue(phpbb_is_absolute($path_to_php));
$this->assertTrue($filesystem->is_absolute_path($path_to_php));
$template_text = "Path is absolute.\n<!-- INCLUDEPHP $path_to_php -->";
$cache_dir = $phpbb_root_path . 'cache/';

View File

@ -34,7 +34,7 @@ class phpbb_template_allfolder_test extends phpbb_template_template_test_case
new \phpbb\symfony_request(
new phpbb_mock_request()
),
new \phpbb\filesystem(),
new \phpbb\filesystem\filesystem(),
$this->getMock('\phpbb\request\request'),
$phpbb_root_path,
$phpEx
@ -54,7 +54,7 @@ class phpbb_template_allfolder_test extends phpbb_template_template_test_case
$container = new phpbb_mock_container_builder();
$cache_path = $phpbb_root_path . 'cache/twig';
$context = new \phpbb\template\context();
$loader = new \phpbb\template\twig\loader('');
$loader = new \phpbb\template\twig\loader(new \phpbb\filesystem\filesystem(), '');
$twig = new \phpbb\template\twig\environment(
$config,
$path_helper,

View File

@ -142,7 +142,7 @@ Zeta test event in all',
new \phpbb\symfony_request(
new phpbb_mock_request()
),
new \phpbb\filesystem(),
new \phpbb\filesystem\filesystem(),
$this->getMock('\phpbb\request\request'),
$phpbb_root_path,
$phpEx
@ -151,7 +151,7 @@ Zeta test event in all',
$container = new phpbb_mock_container_builder();
$cache_path = $phpbb_root_path . 'cache/twig';
$context = new \phpbb\template\context();
$loader = new \phpbb\template\twig\loader('');
$loader = new \phpbb\template\twig\loader(new \phpbb\filesystem\filesystem(), '');
$twig = new \phpbb\template\twig\environment(
$config,
$path_helper,

View File

@ -32,7 +32,7 @@ class phpbb_template_template_includecss_test extends phpbb_template_template_te
new \phpbb\symfony_request(
new phpbb_mock_request()
),
new \phpbb\filesystem(),
new \phpbb\filesystem\filesystem(),
$this->getMock('\phpbb\request\request'),
$phpbb_root_path,
$phpEx
@ -43,7 +43,7 @@ class phpbb_template_template_includecss_test extends phpbb_template_template_te
$container = new phpbb_mock_container_builder();
$cache_path = $phpbb_root_path . 'cache/twig';
$context = new \phpbb\template\context();
$loader = new \phpbb\template\twig\loader('');
$loader = new \phpbb\template\twig\loader(new \phpbb\filesystem\filesystem(), '');
$twig = new \phpbb\template\twig\environment(
$config,
$this->phpbb_path_helper,

View File

@ -71,7 +71,7 @@ class phpbb_template_template_test_case extends phpbb_test_case
new \phpbb\symfony_request(
new phpbb_mock_request()
),
new \phpbb\filesystem(),
new \phpbb\filesystem\filesystem(),
$this->getMock('\phpbb\request\request'),
$phpbb_root_path,
$phpEx
@ -82,7 +82,7 @@ class phpbb_template_template_test_case extends phpbb_test_case
$container = new phpbb_mock_container_builder();
$cache_path = $phpbb_root_path . 'cache/twig';
$context = new \phpbb\template\context();
$loader = new \phpbb\template\twig\loader('');
$loader = new \phpbb\template\twig\loader(new \phpbb\filesystem\filesystem(), '');
$twig = new \phpbb\template\twig\environment(
$config,
$path_helper,
@ -108,6 +108,10 @@ class phpbb_template_template_test_case extends phpbb_test_case
$this->setup_engine();
$this->template->clear_cache();
global $phpbb_filesystem;
$phpbb_filesystem = new \phpbb\filesystem\filesystem();
}
protected function tearDown()

View File

@ -26,7 +26,7 @@ class phpbb_template_template_test_case_with_tree extends phpbb_template_templat
new \phpbb\symfony_request(
new phpbb_mock_request()
),
new \phpbb\filesystem(),
new \phpbb\filesystem\filesystem(),
$this->getMock('\phpbb\request\request'),
$phpbb_root_path,
$phpEx
@ -38,7 +38,7 @@ class phpbb_template_template_test_case_with_tree extends phpbb_template_templat
$container = new phpbb_mock_container_builder();
$cache_path = $phpbb_root_path . 'cache/twig';
$context = new \phpbb\template\context();
$loader = new \phpbb\template\twig\loader('');
$loader = new \phpbb\template\twig\loader(new \phpbb\filesystem\filesystem(), '');
$twig = new \phpbb\template\twig\environment(
$config,
$this->phpbb_path_helper,

View File

@ -58,7 +58,7 @@ abstract class phpbb_database_test_case extends PHPUnit_Extensions_Database_Test
$setup_extensions = static::setup_extensions();
$finder = new \phpbb\finder(new \phpbb\filesystem(), $phpbb_root_path, null, $phpEx);
$finder = new \phpbb\finder(new \phpbb\filesystem\filesystem(), $phpbb_root_path, null, $phpEx);
$finder->core_path('phpbb/db/migration/data/');
if (!empty($setup_extensions))
{

View File

@ -365,7 +365,7 @@ class phpbb_database_test_connection_manager
{
global $phpbb_root_path, $phpEx, $table_prefix;
$finder = new \phpbb\finder(new \phpbb\filesystem(), $phpbb_root_path, null, $phpEx);
$finder = new \phpbb\finder(new \phpbb\filesystem\filesystem(), $phpbb_root_path, null, $phpEx);
$classes = $finder->core_path('phpbb/db/migration/data/')
->get_classes();

View File

@ -254,7 +254,7 @@ class phpbb_functional_test_case extends phpbb_test_case
$container,
$db,
$config,
new phpbb\filesystem(),
new phpbb\filesystem\filesystem(),
$user,
self::$config['table_prefix'] . 'ext',
dirname(__FILE__) . '/',

View File

@ -34,7 +34,7 @@ abstract class phpbb_session_test_case extends phpbb_database_test_case
$symfony_request = new \phpbb\symfony_request(
new phpbb_mock_request()
);
$phpbb_filesystem = new \phpbb\filesystem();
$phpbb_filesystem = new \phpbb\filesystem\filesystem();
$phpbb_path_helper = new \phpbb\path_helper(
$symfony_request,
$phpbb_filesystem,

View File

@ -23,6 +23,7 @@ class phpbb_filespec_test extends phpbb_test_case
const UPLOAD_MAX_FILESIZE = 1000;
private $config;
private $filesystem;
public $path;
protected function setUp()
@ -30,7 +31,7 @@ class phpbb_filespec_test extends phpbb_test_case
// Global $config required by unique_id
// Global $user required by filespec::additional_checks and
// filespec::move_file
global $config, $user;
global $config, $user, $phpbb_filesystem;
if (!is_array($config))
{
@ -75,6 +76,8 @@ class phpbb_filespec_test extends phpbb_test_case
$guessers[2]->set_priority(-2);
$guessers[3]->set_priority(-2);
$this->mimetype_guesser = new \phpbb\mimetype\guesser($guessers);
$this->filesystem = $phpbb_filesystem = new \phpbb\filesystem\filesystem();
}
private function get_filespec($override = array())
@ -88,7 +91,7 @@ class phpbb_filespec_test extends phpbb_test_case
'error' => '',
);
return new filespec(array_merge($upload_ary, $override), null, $this->mimetype_guesser);
return new filespec(array_merge($upload_ary, $override), null, $this->filesystem, $this->mimetype_guesser);
}
protected function tearDown()
@ -198,7 +201,7 @@ class phpbb_filespec_test extends phpbb_test_case
$filespec = $this->get_filespec();
$filespec->clean_filename('unique', self::PREFIX);
$name = $filespec->realname;
$this->assertEquals(strlen($name), 32 + strlen(self::PREFIX));
$this->assertRegExp('#^[A-Za-z0-9]+$#', substr($name, strlen(self::PREFIX)));
$this->assertFalse(isset($filenames[$name]));

View File

@ -20,12 +20,14 @@ class phpbb_fileupload_test extends phpbb_test_case
{
private $path;
private $filesystem;
protected function setUp()
{
// Global $config required by unique_id
// Global $user required by several functions dealing with translations
// Global $request required by form_upload, local_upload and is_valid
global $config, $user, $request;
global $config, $user, $request, $phpbb_filesystem;
if (!is_array($config))
{
@ -40,6 +42,8 @@ class phpbb_fileupload_test extends phpbb_test_case
$request = new phpbb_mock_request();
$this->filesystem = $phpbb_filesystem = new \phpbb\filesystem\filesystem();
$this->path = __DIR__ . '/fixture/';
}
@ -65,7 +69,7 @@ class phpbb_fileupload_test extends phpbb_test_case
public function test_common_checks_invalid_extension()
{
$upload = new fileupload('', array('png'), 100);
$upload = new fileupload($this->filesystem, '', array('png'), 100);
$file = $this->gen_valid_filespec();
$upload->common_checks($file);
$this->assertEquals('DISALLOWED_EXTENSION', $file->error[0]);
@ -73,7 +77,7 @@ class phpbb_fileupload_test extends phpbb_test_case
public function test_common_checks_invalid_filename()
{
$upload = new fileupload('', array('jpg'), 100);
$upload = new fileupload($this->filesystem, '', array('jpg'), 100);
$file = $this->gen_valid_filespec();
$file->realname = 'invalid?';
$upload->common_checks($file);
@ -82,7 +86,7 @@ class phpbb_fileupload_test extends phpbb_test_case
public function test_common_checks_too_large()
{
$upload = new fileupload('', array('jpg'), 100);
$upload = new fileupload($this->filesystem, '', array('jpg'), 100);
$file = $this->gen_valid_filespec();
$file->filesize = 1000;
$upload->common_checks($file);
@ -91,7 +95,7 @@ class phpbb_fileupload_test extends phpbb_test_case
public function test_common_checks_valid_file()
{
$upload = new fileupload('', array('jpg'), 1000);
$upload = new fileupload($this->filesystem, '', array('jpg'), 1000);
$file = $this->gen_valid_filespec();
$upload->common_checks($file);
$this->assertEquals(0, sizeof($file->error));
@ -99,7 +103,7 @@ class phpbb_fileupload_test extends phpbb_test_case
public function test_local_upload()
{
$upload = new fileupload('', array('jpg'), 1000);
$upload = new fileupload($this->filesystem, '', array('jpg'), 1000);
copy($this->path . 'jpg', $this->path . 'jpg.jpg');
$file = $upload->local_upload($this->path . 'jpg.jpg');
@ -109,7 +113,7 @@ class phpbb_fileupload_test extends phpbb_test_case
public function test_move_existent_file()
{
$upload = new fileupload('', array('jpg'), 1000);
$upload = new fileupload($this->filesystem, '', array('jpg'), 1000);
copy($this->path . 'jpg', $this->path . 'jpg.jpg');
$file = $upload->local_upload($this->path . 'jpg.jpg');
@ -121,7 +125,7 @@ class phpbb_fileupload_test extends phpbb_test_case
public function test_move_existent_file_overwrite()
{
$upload = new fileupload('', array('jpg'), 1000);
$upload = new fileupload($this->filesystem, '', array('jpg'), 1000);
copy($this->path . 'jpg', $this->path . 'jpg.jpg');
copy($this->path . 'jpg', $this->path . 'copies/jpg.jpg');
@ -134,7 +138,7 @@ class phpbb_fileupload_test extends phpbb_test_case
public function test_valid_dimensions()
{
$upload = new fileupload('', false, false, 1, 1, 100, 100);
$upload = new fileupload($this->filesystem, '', false, false, 1, 1, 100, 100);
$file1 = $this->gen_valid_filespec();
$file2 = $this->gen_valid_filespec();

View File

@ -17,7 +17,7 @@ class phpbb_viewonline_helper_test extends phpbb_test_case
{
parent::setUp();
$this->viewonline_helper = new \phpbb\viewonline_helper(new \phpbb\filesystem());
$this->viewonline_helper = new \phpbb\viewonline_helper(new \phpbb\filesystem\filesystem());
}
public function session_pages_data()