Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 7 |
CRAP | |
0.00% |
0 / 97 |
file_updater | |
0.00% |
0 / 1 |
|
0.00% |
0 / 7 |
420.00 | |
0.00% |
0 / 97 |
__construct | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 4 |
|||
delete_file | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 3 |
|||
create_new_file | |
0.00% |
0 / 1 |
42.00 | |
0.00% |
0 / 33 |
|||
update_file | |
0.00% |
0 / 1 |
42.00 | |
0.00% |
0 / 33 |
|||
make_dir | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 8 |
|||
write_file | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 13 |
|||
get_method_name | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 3 |
<?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\install\helper\file_updater; | |
use phpbb\filesystem\exception\filesystem_exception; | |
use phpbb\filesystem\filesystem; | |
use phpbb\install\exception\file_updater_failure_exception; | |
/** | |
* File updater for direct filesystem access | |
*/ | |
class file_updater implements file_updater_interface | |
{ | |
/** | |
* @var filesystem | |
*/ | |
protected $filesystem; | |
/** | |
* @var string | |
*/ | |
protected $phpbb_root_path; | |
/** | |
* Constructor | |
* | |
* @param filesystem $filesystem | |
* @param string $phpbb_root_path | |
*/ | |
public function __construct(filesystem $filesystem, $phpbb_root_path) | |
{ | |
$this->filesystem = $filesystem; | |
$this->phpbb_root_path = $phpbb_root_path; | |
} | |
/** | |
* {@inheritdoc} | |
* | |
* @throws file_updater_failure_exception When the file is not writable | |
* @throws filesystem_exception When the filesystem class fails | |
*/ | |
public function delete_file($path_to_file) | |
{ | |
$this->filesystem->remove($this->phpbb_root_path . $path_to_file); | |
} | |
/** | |
* {@inheritdoc} | |
* | |
* @throws file_updater_failure_exception When the file is not writable | |
* @throws filesystem_exception When the filesystem class fails | |
*/ | |
public function create_new_file($path_to_file_to_create, $source, $create_from_content = false) | |
{ | |
$path_to_file_to_create = $this->phpbb_root_path . $path_to_file_to_create; | |
$dir = dirname($path_to_file_to_create); | |
if (!$this->filesystem->exists($dir)) | |
{ | |
$this->make_dir($dir); | |
} | |
$original_dir_perms = false; | |
if (!$this->filesystem->is_writable($dir)) | |
{ | |
// Extract last 9 bits we actually need | |
$original_dir_perms = @fileperms($dir) & 511; | |
$this->filesystem->phpbb_chmod($dir, filesystem::CHMOD_ALL); | |
} | |
if (!$create_from_content) | |
{ | |
try | |
{ | |
$this->filesystem->copy($source, $path_to_file_to_create); | |
} | |
catch (filesystem_exception $e) | |
{ | |
$this->write_file($path_to_file_to_create, $source, $create_from_content); | |
} | |
} | |
else | |
{ | |
$this->write_file($path_to_file_to_create, $source, $create_from_content); | |
} | |
if ($original_dir_perms !== false) | |
{ | |
$this->filesystem->phpbb_chmod($dir, $original_dir_perms); | |
} | |
} | |
/** | |
* {@inheritdoc} | |
* | |
* @throws file_updater_failure_exception When the file is not writable | |
* @throws filesystem_exception When the filesystem class fails | |
*/ | |
public function update_file($path_to_file_to_update, $source, $create_from_content = false) | |
{ | |
$path_to_file_to_update = $this->phpbb_root_path . $path_to_file_to_update; | |
$original_file_perms = false; | |
// Maybe necessary for binary files | |
$dir = dirname($path_to_file_to_update); | |
if (!$this->filesystem->exists($dir)) | |
{ | |
$this->make_dir($dir); | |
} | |
if (!$this->filesystem->is_writable($path_to_file_to_update)) | |
{ | |
// Extract last 9 bits we actually need | |
$original_file_perms = @fileperms($path_to_file_to_update) & 511; | |
$this->filesystem->phpbb_chmod($path_to_file_to_update, filesystem::CHMOD_WRITE); | |
} | |
if (!$create_from_content) | |
{ | |
try | |
{ | |
$this->filesystem->copy($source, $path_to_file_to_update, true); | |
} | |
catch (filesystem_exception $e) | |
{ | |
$this->write_file($path_to_file_to_update, $source, $create_from_content); | |
} | |
} | |
else | |
{ | |
$this->write_file($path_to_file_to_update, $source, $create_from_content); | |
} | |
if ($original_file_perms !== false) | |
{ | |
$this->filesystem->phpbb_chmod($path_to_file_to_update, $original_file_perms); | |
} | |
} | |
/** | |
* Creates directory structure | |
* | |
* @param string $path Path to the directory where the file should be placed (and non-existent) | |
*/ | |
private function make_dir($path) | |
{ | |
if (is_dir($path)) | |
{ | |
return; | |
} | |
$path = str_replace(DIRECTORY_SEPARATOR, '/', $path); | |
$this->filesystem->mkdir($path, 493); // 493 === 0755 | |
} | |
/** | |
* Fallback function for file writing | |
* | |
* @param string $path_to_file Path to the file's location | |
* @param string $source Path to file to copy or string with the new file's content | |
* @param bool|false $create_from_content Whether or not to use $source as the content, false by default | |
* | |
* @throws file_updater_failure_exception When the file is not writable | |
*/ | |
private function write_file($path_to_file, $source, $create_from_content = false) | |
{ | |
if (!$create_from_content) | |
{ | |
$source = @file_get_contents($source); | |
} | |
$file_pointer = @fopen($path_to_file, 'w'); | |
if (!is_resource($file_pointer)) | |
{ | |
throw new file_updater_failure_exception(); | |
} | |
@fwrite($file_pointer, $source); | |
@fclose($file_pointer); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function get_method_name() | |
{ | |
return 'direct_file'; | |
} | |
} |