/**
  * {@inheritdoc}
  */
 public function run()
 {
     if ($this->iohandler->get_input('submit_ftp', false)) {
         $this->update_helper->include_file('includes/functions_transfer.' . $this->php_ext);
         $method = 'ftp';
         $methods = \transfer::methods();
         if (!in_array($method, $methods, true)) {
             $method = $methods[0];
         }
         $ftp_host = $this->iohandler->get_input('ftp_host', '');
         $ftp_user = $this->iohandler->get_input('ftp_user', '');
         $ftp_pass = htmlspecialchars_decode($this->iohandler->get_input('ftp_pass', ''));
         $ftp_path = $this->iohandler->get_input('ftp_path', '');
         $ftp_port = $this->iohandler->get_input('ftp_port', 21);
         $ftp_time = $this->iohandler->get_input('ftp_timeout', 10);
         $this->installer_config->set('ftp_host', $ftp_host);
         $this->installer_config->set('ftp_user', $ftp_user);
         $this->installer_config->set('ftp_pass', $ftp_pass);
         $this->installer_config->set('ftp_path', $ftp_path);
         $this->installer_config->set('ftp_port', (int) $ftp_port);
         $this->installer_config->set('ftp_timeout', (int) $ftp_time);
         $this->installer_config->set('ftp_method', $method);
     } else {
         $this->iohandler->add_user_form_group('FTP_SETTINGS', array('ftp_host' => array('label' => 'FTP_HOST', 'description' => 'FTP_HOST_EXPLAIN', 'type' => 'text'), 'ftp_user' => array('label' => 'FTP_USERNAME', 'description' => 'FTP_USERNAME_EXPLAIN', 'type' => 'text'), 'ftp_pass' => array('label' => 'FTP_PASSWORD', 'description' => 'FTP_PASSWORD_EXPLAIN', 'type' => 'password'), 'ftp_path' => array('label' => 'FTP_ROOT_PATH', 'description' => 'FTP_ROOT_PATH_EXPLAIN', 'type' => 'text'), 'ftp_port' => array('label' => 'FTP_PORT', 'description' => 'FTP_PORT_EXPLAIN', 'type' => 'text', 'default' => 21), 'ftp_timeout' => array('label' => 'FTP_TIMEOUT', 'description' => 'FTP_TIMEOUT_EXPLAIN', 'type' => 'text', 'default' => 10), 'submit_ftp' => array('label' => 'SUBMIT', 'type' => 'submit')));
         throw new user_interaction_required_exception();
     }
 }
예제 #2
0
 /**
  * Set the compression method
  *
  * @param string	$method	Compression method's file extension
  *
  * @return string	Archive's filename
  */
 public function init($method)
 {
     $this->update_helper->include_file('includes/functions_compress.' . $this->php_ext);
     $archive_filename = 'update_archive_' . time() . '_' . uniqid();
     $path = $this->phpbb_root_path . 'store/' . $archive_filename . '' . $method;
     if ($method === '.zip') {
         $this->compress = new \compress_zip('w', $path);
     } else {
         $this->compress = new \compress_tar('w', $path, $method);
     }
     return $path;
 }
예제 #3
0
 /**
  * Build dependency injection container
  *
  * @throws \phpbb\install\exception\cannot_build_container_exception	When container cannot be built
  */
 protected function build_container()
 {
     // If the container has been already built just return.
     // Although this should never happen
     if ($this->container instanceof \Symfony\Component\DependencyInjection\ContainerInterface) {
         return;
     }
     // Check whether container can be built
     // We need config.php for that so let's check if it has been set up yet
     if (!filesize($this->phpbb_root_path . 'config.' . $this->php_ext)) {
         throw new cannot_build_container_exception();
     }
     $phpbb_config_php_file = new \phpbb\config_php_file($this->phpbb_root_path, $this->php_ext);
     $phpbb_container_builder = new \phpbb\di\container_builder($this->phpbb_root_path, $this->php_ext);
     // For BC with functions that we need during install
     global $phpbb_container, $table_prefix;
     $disable_super_globals = $this->request->super_globals_disabled();
     // This is needed because container_builder::get_env_parameters() uses $_SERVER
     if ($disable_super_globals) {
         $this->request->enable_super_globals();
     }
     $other_config_path = $this->phpbb_root_path . 'install/update/new/config';
     $config_path = is_dir($other_config_path) ? $other_config_path : $this->phpbb_root_path . 'config';
     $this->container = $phpbb_container_builder->with_environment('production')->with_config($phpbb_config_php_file)->with_config_path($config_path)->without_cache()->without_compiled_container()->get_container();
     // Setting request is required for the compatibility globals as those are generated from
     // this container
     $this->container->register('request')->setSynthetic(true);
     $this->container->set('request', $this->request);
     $this->container->register('language')->setSynthetic(true);
     $this->container->set('language', $this->language);
     // Replace cache service, as config gets cached, and we don't want that when we are installing
     if (!is_dir($other_config_path)) {
         $this->container->register('cache.driver')->setSynthetic(true);
         $this->container->set('cache.driver', new dummy());
     }
     $this->container->compile();
     $phpbb_container = $this->container;
     $table_prefix = $phpbb_config_php_file->get('table_prefix');
     // Restore super globals to previous state
     if ($disable_super_globals) {
         $this->request->disable_super_globals();
     }
     // Get compatibilty globals and constants
     $this->update_helper->include_file('includes/compatibility_globals.' . $this->php_ext);
     $this->update_helper->include_file('includes/constants.' . $this->php_ext);
 }
예제 #4
0
 /**
  * {@inheritdoc}
  */
 public function run()
 {
     // Include diff engine
     $this->update_helper->include_file('includes/diff/diff.' . $this->php_ext);
     $this->update_helper->include_file('includes/diff/engine.' . $this->php_ext);
     // Set up basic vars
     $old_path = $this->update_helper->get_path_to_old_update_files();
     $new_path = $this->update_helper->get_path_to_new_update_files();
     $files_to_diff = $this->installer_config->get('update_files', array());
     $files_to_diff = $files_to_diff['update_with_diff'];
     // Set progress bar
     $this->iohandler->set_task_count(count($files_to_diff), true);
     $this->iohandler->set_progress('UPDATE_FILE_DIFF', 0);
     $progress_count = $this->installer_config->get('file_diff_update_count', 0);
     // Recover progress
     $progress_key = $this->installer_config->get('differ_progress_key', -1);
     $progress_recovered = $progress_key === -1;
     $merge_conflicts = $this->installer_config->get('merge_conflict_list', array());
     foreach ($files_to_diff as $key => $filename) {
         if ($progress_recovered === false) {
             if ($progress_key === $key) {
                 $progress_recovered = true;
             }
             continue;
         }
         // Read in files' content
         $file_contents = array();
         // Handle the special case when user created a file with the filename that is now new in the core
         $file_contents[0] = file_exists($old_path . $filename) ? file_get_contents($old_path . $filename) : '';
         $filenames = array($this->phpbb_root_path . $filename, $new_path . $filename);
         foreach ($filenames as $file_to_diff) {
             $file_contents[] = file_get_contents($file_to_diff);
             if ($file_contents[sizeof($file_contents) - 1] === false) {
                 $this->iohandler->add_error_message(array('FILE_DIFFER_ERROR_FILE_CANNOT_BE_READ', $files_to_diff));
                 unset($file_contents);
                 throw new user_interaction_required_exception();
             }
         }
         $diff = new \diff3($file_contents[0], $file_contents[1], $file_contents[2]);
         unset($file_contents);
         // Handle conflicts
         if ($diff->get_num_conflicts() !== 0) {
             $merge_conflicts[] = $filename;
         }
         // Save merged output
         $this->cache->put('_file_' . md5($filename), base64_encode(implode("\n", $diff->merged_output())));
         unset($diff);
         $progress_count++;
         $this->iohandler->set_progress('UPDATE_FILE_DIFF', $progress_count);
         if ($this->installer_config->get_time_remaining() <= 0 || $this->installer_config->get_memory_remaining() <= 0) {
             // Save differ progress
             $this->installer_config->set('differ_progress_key', $key);
             $this->installer_config->set('merge_conflict_list', $merge_conflicts);
             $this->installer_config->set('file_diff_update_count', $progress_count);
             // Request refresh
             throw new resource_limit_reached_exception();
         }
     }
     $this->iohandler->finish_progress('ALL_FILES_DIFFED');
     $this->installer_config->set('merge_conflict_list', $merge_conflicts);
 }
예제 #5
0
 /**
  * Initialize FTP connection
  *
  * @param string	$method
  * @param string	$host
  * @param string	$user
  * @param string	$pass
  * @param string	$path
  * @param int		$port
  * @param int		$timeout
  */
 public function init($method, $host, $user, $pass, $path, $port, $timeout)
 {
     $this->update_helper->include_file('includes/functions_transfer.' . $this->php_ext);
     $this->transfer = new $method($host, $user, $pass, $path, $port, $timeout);
     $this->transfer->open_session();
 }