[ Index ]

PHP Cross Reference of phpBB-3.2.11-deutsch

title

Body

[close]

/phpbb/install/module/update_database/task/ -> update_extensions.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\module\update_database\task;
  15  
  16  use phpbb\install\exception\resource_limit_reached_exception;
  17  use phpbb\install\helper\container_factory;
  18  use phpbb\install\helper\config;
  19  use phpbb\install\helper\iohandler\iohandler_interface;
  20  use phpbb\install\helper\update_helper;
  21  use phpbb\install\task_base;
  22  use Symfony\Component\Finder\Finder;
  23  
  24  /**
  25   * Installs extensions that exist in ext folder upon install
  26   */
  27  class update_extensions extends task_base
  28  {
  29      /**
  30       * @var \phpbb\cache\driver\driver_interface
  31       */
  32      protected $cache;
  33  
  34      /**
  35       * @var config
  36       */
  37      protected $install_config;
  38  
  39      /**
  40       * @var iohandler_interface
  41       */
  42      protected $iohandler;
  43  
  44      /** @var update_helper */
  45      protected $update_helper;
  46  
  47      /**
  48       * @var \phpbb\config\db
  49       */
  50      protected $config;
  51  
  52      /**
  53       * @var \phpbb\log\log_interface
  54       */
  55      protected $log;
  56  
  57      /**
  58       * @var \phpbb\user
  59       */
  60      protected $user;
  61  
  62      /** @var \phpbb\extension\manager */
  63      protected $extension_manager;
  64  
  65      /** @var Finder */
  66      protected $finder;
  67  
  68      /** @var string Extension table */
  69      protected $extension_table;
  70  
  71      /** @var \phpbb\db\driver\driver_interface */
  72      protected $db;
  73  
  74      /**
  75       * @var array    List of default extensions to update, grouped by version
  76       *                they were added
  77       */
  78      static public $default_extensions_update = [
  79          '3.2.0-RC2' => ['phpbb/viglink']
  80      ];
  81  
  82      /**
  83       * Constructor
  84       *
  85       * @param container_factory            $container
  86       * @param config                    $install_config
  87       * @param iohandler_interface        $iohandler
  88       * @param $update_helper            $update_helper
  89       * @param string                    $phpbb_root_path phpBB root path
  90       */
  91  	public function __construct(container_factory $container, config $install_config, iohandler_interface $iohandler, update_helper $update_helper, $phpbb_root_path)
  92      {
  93          $this->install_config    = $install_config;
  94          $this->iohandler        = $iohandler;
  95          $this->extension_table = $container->get_parameter('tables.ext');
  96  
  97          $this->log                = $container->get('log');
  98          $this->user                = $container->get('user');
  99          $this->extension_manager = $container->get('ext.manager');
 100          $this->cache                = $container->get('cache.driver');
 101          $this->config            = $container->get('config');
 102          $this->db                = $container->get('dbal.conn');
 103          $this->update_helper = $update_helper;
 104          $this->finder = new Finder();
 105          $this->finder->in($phpbb_root_path . 'ext/')
 106              ->ignoreUnreadableDirs()
 107              ->depth('< 3')
 108              ->files()
 109              ->name('composer.json');
 110  
 111          // Make sure asset version exists in config. Otherwise we might try to
 112          // insert the assets_version setting into the database and cause a
 113          // duplicate entry error.
 114          if (!isset($this->config['assets_version']))
 115          {
 116              $this->config['assets_version'] = 0;
 117          }
 118  
 119          parent::__construct(true);
 120      }
 121  
 122      /**
 123       * {@inheritdoc}
 124       */
 125  	public function run()
 126      {
 127          $this->user->session_begin();
 128          $this->user->setup(array('common', 'acp/common', 'cli'));
 129  
 130          $update_info = $this->install_config->get('update_info_unprocessed', []);
 131          $version_from = !empty($update_info) ? $update_info['version']['from'] : $this->config['version_update_from'];
 132  
 133          if (!empty($version_from))
 134          {
 135              $update_extensions = $this->iohandler->get_input('update-extensions', []);
 136  
 137              // Create list of default extensions that need to be enabled in update
 138              $default_update_extensions = [];
 139              foreach (self::$default_extensions_update as $version => $extensions)
 140              {
 141                  if ($this->update_helper->phpbb_version_compare($version_from, $version, '<'))
 142                  {
 143                      $default_update_extensions = array_merge($default_update_extensions, $extensions);
 144                  }
 145              }
 146  
 147              $all_available_extensions = $this->extension_manager->all_available();
 148              $i = $this->install_config->get('update_extensions_index', 0);
 149              $available_extensions = array_slice($all_available_extensions, $i);
 150  
 151              // Update available extensions
 152              foreach ($available_extensions as $ext_name => $ext_path)
 153              {
 154                  // Update extensions if:
 155                  //    1) Extension is currently enabled
 156                  //    2) Extension was implicitly defined as needing an update
 157                  //    3) Extension was newly added as default phpBB extension in
 158                  //        this update and should be enabled by default.
 159                  if ($this->extension_manager->is_enabled($ext_name) ||
 160                      in_array($ext_name, $update_extensions) ||
 161                      in_array($ext_name, $default_update_extensions)
 162                  )
 163                  {
 164                      try
 165                      {
 166                          $extension_enabled = $this->extension_manager->is_enabled($ext_name);
 167                          if ($extension_enabled)
 168                          {
 169                              $this->extension_manager->disable($ext_name);
 170                          }
 171                          $this->extension_manager->enable($ext_name);
 172                          $extensions = $this->get_extensions();
 173  
 174                          if (isset($extensions[$ext_name]) && $extensions[$ext_name]['ext_active'])
 175                          {
 176                              // Create log
 177                              $this->log->add('admin', ANONYMOUS, '', 'LOG_EXT_UPDATE', time(), array($ext_name));
 178                              $this->iohandler->add_success_message(array('CLI_EXTENSION_UPDATE_SUCCESS', $ext_name));
 179                          }
 180                          else
 181                          {
 182                              $this->iohandler->add_log_message('CLI_EXTENSION_UPDATE_FAILURE', array($ext_name));
 183                          }
 184  
 185                          // Disable extensions if it was disabled by the admin before
 186                          if (!$extension_enabled && !in_array($ext_name, $default_update_extensions))
 187                          {
 188                              $this->extension_manager->disable($ext_name);
 189                          }
 190                      }
 191                      catch (\Exception $e)
 192                      {
 193                          // Add fail log and continue
 194                          $this->iohandler->add_log_message('CLI_EXTENSION_UPDATE_FAILURE', array($ext_name));
 195                      }
 196                  }
 197  
 198                  $i++;
 199  
 200                  // Stop execution if resource limit is reached
 201                  if ($this->install_config->get_time_remaining() <= 0 || $this->install_config->get_memory_remaining() <= 0)
 202                  {
 203                      break;
 204                  }
 205              }
 206  
 207              $this->install_config->set('update_extensions_index', $i);
 208  
 209              if ($i < count($all_available_extensions))
 210              {
 211                  throw new resource_limit_reached_exception();
 212              }
 213          }
 214  
 215          $this->config->delete('version_update_from');
 216  
 217          $this->cache->purge();
 218  
 219          $this->config->increment('assets_version', 1);
 220      }
 221  
 222      /**
 223       * {@inheritdoc}
 224       */
 225  	static public function get_step_count()
 226      {
 227          return 1;
 228      }
 229  
 230      /**
 231       * {@inheritdoc}
 232       */
 233  	public function get_task_lang_name()
 234      {
 235          return 'TASK_UPDATE_EXTENSIONS';
 236      }
 237  
 238      /**
 239       * Get extensions from database
 240       *
 241       * @return array List of extensions
 242       */
 243  	private function get_extensions()
 244      {
 245          $sql = 'SELECT *
 246              FROM ' . $this->extension_table;
 247  
 248          $result = $this->db->sql_query($sql);
 249          $extensions_row = $this->db->sql_fetchrowset($result);
 250          $this->db->sql_freeresult($result);
 251  
 252          $extensions = array();
 253  
 254          foreach ($extensions_row as $extension)
 255          {
 256              $extensions[$extension['ext_name']] = $extension;
 257          }
 258  
 259          ksort($extensions);
 260  
 261          return $extensions;
 262      }
 263  }


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