[ Index ]

PHP Cross Reference of phpBB-3.2.11-deutsch

title

Body

[close]

/phpbb/install/helper/file_updater/ -> file_updater.php (source)

   1  <?php
   2  /**
   3   *
   4   * This file is part of the phpBB Forum Software package.
   5   *
   6   * @copyright (c) phpBB Limited <https://www.phpbb.com>
   7   * @license GNU General Public License, version 2 (GPL-2.0)
   8   *
   9   * For full copyright and license information, please see
  10   * the docs/CREDITS.txt file.
  11   *
  12   */
  13  
  14  namespace phpbb\install\helper\file_updater;
  15  
  16  use phpbb\filesystem\exception\filesystem_exception;
  17  use phpbb\filesystem\filesystem;
  18  use phpbb\install\exception\file_updater_failure_exception;
  19  
  20  /**
  21   * File updater for direct filesystem access
  22   */
  23  class file_updater implements file_updater_interface
  24  {
  25      /**
  26       * @var filesystem
  27       */
  28      protected $filesystem;
  29  
  30      /**
  31       * @var string
  32       */
  33      protected $phpbb_root_path;
  34  
  35      /**
  36       * Constructor
  37       *
  38       * @param filesystem    $filesystem
  39       * @param string        $phpbb_root_path
  40       */
  41  	public function __construct(filesystem $filesystem, $phpbb_root_path)
  42      {
  43          $this->filesystem        = $filesystem;
  44          $this->phpbb_root_path    = $phpbb_root_path;
  45      }
  46  
  47      /**
  48       * {@inheritdoc}
  49       *
  50       * @throws file_updater_failure_exception    When the file is not writable
  51       * @throws filesystem_exception                When the filesystem class fails
  52       */
  53  	public function delete_file($path_to_file)
  54      {
  55          $this->filesystem->remove($this->phpbb_root_path . $path_to_file);
  56      }
  57  
  58      /**
  59       * {@inheritdoc}
  60       *
  61       * @throws file_updater_failure_exception    When the file is not writable
  62       * @throws filesystem_exception                When the filesystem class fails
  63       */
  64  	public function create_new_file($path_to_file_to_create, $source, $create_from_content = false)
  65      {
  66          $path_to_file_to_create = $this->phpbb_root_path . $path_to_file_to_create;
  67  
  68          $dir = dirname($path_to_file_to_create);
  69          if (!$this->filesystem->exists($dir))
  70          {
  71              $this->make_dir($dir);
  72          }
  73  
  74          $original_dir_perms = false;
  75  
  76          if (!$this->filesystem->is_writable($dir))
  77          {
  78              // Extract last 9 bits we actually need
  79              $original_dir_perms = @fileperms($dir) & 511;
  80              $this->filesystem->phpbb_chmod($dir, filesystem::CHMOD_ALL);
  81          }
  82  
  83          if (!$create_from_content)
  84          {
  85              try
  86              {
  87                  $this->filesystem->copy($source, $path_to_file_to_create);
  88              }
  89              catch (filesystem_exception $e)
  90              {
  91                  $this->write_file($path_to_file_to_create, $source, $create_from_content);
  92              }
  93          }
  94          else
  95          {
  96              $this->write_file($path_to_file_to_create, $source, $create_from_content);
  97          }
  98  
  99          if ($original_dir_perms !== false)
 100          {
 101              $this->filesystem->phpbb_chmod($dir, $original_dir_perms);
 102          }
 103      }
 104  
 105      /**
 106       * {@inheritdoc}
 107       *
 108       * @throws file_updater_failure_exception    When the file is not writable
 109       * @throws filesystem_exception                When the filesystem class fails
 110       */
 111  	public function update_file($path_to_file_to_update, $source, $create_from_content = false)
 112      {
 113          $path_to_file_to_update = $this->phpbb_root_path . $path_to_file_to_update;
 114          $original_file_perms = false;
 115  
 116          // Maybe necessary for binary files
 117          $dir = dirname($path_to_file_to_update);
 118          if (!$this->filesystem->exists($dir))
 119          {
 120              $this->make_dir($dir);
 121          }
 122  
 123          if (!$this->filesystem->is_writable($path_to_file_to_update))
 124          {
 125              // Extract last 9 bits we actually need
 126              $original_file_perms = @fileperms($path_to_file_to_update) & 511;
 127              $this->filesystem->phpbb_chmod($path_to_file_to_update, filesystem::CHMOD_WRITE);
 128          }
 129  
 130          if (!$create_from_content)
 131          {
 132              try
 133              {
 134                  $this->filesystem->copy($source, $path_to_file_to_update, true);
 135              }
 136              catch (filesystem_exception $e)
 137              {
 138                  $this->write_file($path_to_file_to_update, $source, $create_from_content);
 139              }
 140          }
 141          else
 142          {
 143              $this->write_file($path_to_file_to_update, $source, $create_from_content);
 144          }
 145  
 146          if ($original_file_perms !== false)
 147          {
 148              $this->filesystem->phpbb_chmod($path_to_file_to_update, $original_file_perms);
 149          }
 150      }
 151  
 152      /**
 153       * Creates directory structure
 154       *
 155       * @param string    $path    Path to the directory where the file should be placed (and non-existent)
 156       */
 157  	private function make_dir($path)
 158      {
 159          if (is_dir($path))
 160          {
 161              return;
 162          }
 163  
 164          $path = str_replace(DIRECTORY_SEPARATOR, '/', $path);
 165          $this->filesystem->mkdir($path, 493); // 493 === 0755
 166      }
 167  
 168      /**
 169       * Fallback function for file writing
 170       *
 171       * @param string        $path_to_file            Path to the file's location
 172       * @param string        $source                    Path to file to copy or string with the new file's content
 173       * @param bool|false    $create_from_content    Whether or not to use $source as the content, false by default
 174       *
 175       * @throws file_updater_failure_exception    When the file is not writable
 176       */
 177  	private function write_file($path_to_file, $source, $create_from_content = false)
 178      {
 179          if (!$create_from_content)
 180          {
 181              $source = @file_get_contents($source);
 182          }
 183  
 184          $file_pointer = @fopen($path_to_file, 'w');
 185  
 186          if (!is_resource($file_pointer))
 187          {
 188              throw new file_updater_failure_exception();
 189          }
 190  
 191          @fwrite($file_pointer, $source);
 192          @fclose($file_pointer);
 193      }
 194  
 195      /**
 196       * {@inheritdoc}
 197       */
 198  	public function get_method_name()
 199      {
 200          return 'direct_file';
 201      }
 202  }


Generated: Wed Nov 11 20:33:01 2020 Cross-referenced by PHPXref 0.7.1