Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 6 |
CRAP | |
0.00% |
0 / 135 |
| UpdateManagerInstall | |
0.00% |
0 / 1 |
|
0.00% |
0 / 6 |
552 | |
0.00% |
0 / 135 |
| __construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
|||
| getFormId | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| create | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 6 |
|||
| buildForm | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 37 |
|||
| validateForm | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 5 |
|||
| submitForm | |
0.00% |
0 / 1 |
272 | |
0.00% |
0 / 81 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\update\Form\UpdateManagerInstall. | |
| */ | |
| namespace Drupal\update\Form; | |
| use Drupal\Core\Extension\ModuleHandlerInterface; | |
| use Drupal\Core\FileTransfer\Local; | |
| use Drupal\Core\Form\FormBase; | |
| use Drupal\Core\Form\FormStateInterface; | |
| use Drupal\Core\Updater\Updater; | |
| use Symfony\Component\DependencyInjection\ContainerInterface; | |
| use Symfony\Component\HttpFoundation\Response; | |
| /** | |
| * Configure update settings for this site. | |
| */ | |
| class UpdateManagerInstall extends FormBase { | |
| /** | |
| * The module handler. | |
| * | |
| * @var \Drupal\Core\Extension\ModuleHandlerInterface | |
| */ | |
| protected $moduleHandler; | |
| /** | |
| * The root location under which installed projects will be saved. | |
| * | |
| * @var string | |
| */ | |
| protected $root; | |
| /** | |
| * The site path. | |
| * | |
| * @var string | |
| */ | |
| protected $sitePath; | |
| /** | |
| * Constructs a new UpdateManagerInstall. | |
| * | |
| * @param string $root | |
| * The root location under which installed projects will be saved. | |
| * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler | |
| * The module handler. | |
| * @param string $site_path | |
| * The site path. | |
| */ | |
| public function __construct($root, ModuleHandlerInterface $module_handler, $site_path) { | |
| $this->root = $root; | |
| $this->moduleHandler = $module_handler; | |
| $this->sitePath = $site_path; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getFormId() { | |
| return 'update_manager_install_form'; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public static function create(ContainerInterface $container) { | |
| return new static( | |
| $container->get('update.root'), | |
| $container->get('module_handler'), | |
| $container->get('site.path') | |
| ); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function buildForm(array $form, FormStateInterface $form_state) { | |
| $this->moduleHandler->loadInclude('update', 'inc', 'update.manager'); | |
| if (!_update_manager_check_backends($form, 'install')) { | |
| return $form; | |
| } | |
| $form['help_text'] = array( | |
| '#prefix' => '<p>', | |
| '#markup' => $this->t('You can find <a href=":module_url">modules</a> and <a href=":theme_url">themes</a> on <a href=":drupal_org_url">drupal.org</a>. The following file extensions are supported: %extensions.', array( | |
| ':module_url' => 'https://www.drupal.org/project/modules', | |
| ':theme_url' => 'https://www.drupal.org/project/themes', | |
| ':drupal_org_url' => 'https://www.drupal.org', | |
| '%extensions' => archiver_get_extensions(), | |
| )), | |
| '#suffix' => '</p>', | |
| ); | |
| $form['project_url'] = array( | |
| '#type' => 'url', | |
| '#title' => $this->t('Install from a URL'), | |
| '#description' => $this->t('For example: %url', array('%url' => 'http://ftp.drupal.org/files/projects/name.tar.gz')), | |
| ); | |
| $form['information'] = array( | |
| '#prefix' => '<strong>', | |
| '#markup' => $this->t('Or'), | |
| '#suffix' => '</strong>', | |
| ); | |
| $form['project_upload'] = array( | |
| '#type' => 'file', | |
| '#title' => $this->t('Upload a module or theme archive to install'), | |
| '#description' => $this->t('For example: %filename from your local computer', array('%filename' => 'name.tar.gz')), | |
| ); | |
| $form['actions'] = array('#type' => 'actions'); | |
| $form['actions']['submit'] = array( | |
| '#type' => 'submit', | |
| '#button_type' => 'primary', | |
| '#value' => $this->t('Install'), | |
| ); | |
| return $form; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function validateForm(array &$form, FormStateInterface $form_state) { | |
| $uploaded_file = $this->getRequest()->files->get('files[project_upload]', NULL, TRUE); | |
| if (!($form_state->getValue('project_url') XOR !empty($uploaded_file))) { | |
| $form_state->setErrorByName('project_url', $this->t('You must either provide a URL or upload an archive file to install.')); | |
| } | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function submitForm(array &$form, FormStateInterface $form_state) { | |
| $local_cache = NULL; | |
| if ($form_state->getValue('project_url')) { | |
| $local_cache = update_manager_file_get($form_state->getValue('project_url')); | |
| if (!$local_cache) { | |
| drupal_set_message($this->t('Unable to retrieve Drupal project from %url.', array('%url' => $form_state->getValue('project_url'))), 'error'); | |
| return; | |
| } | |
| } | |
| elseif ($_FILES['files']['name']['project_upload']) { | |
| $validators = array('file_validate_extensions' => array(archiver_get_extensions())); | |
| if (!($finfo = file_save_upload('project_upload', $validators, NULL, 0, FILE_EXISTS_REPLACE))) { | |
| // Failed to upload the file. file_save_upload() calls | |
| // drupal_set_message() on failure. | |
| return; | |
| } | |
| $local_cache = $finfo->getFileUri(); | |
| } | |
| $directory = _update_manager_extract_directory(); | |
| try { | |
| $archive = update_manager_archive_extract($local_cache, $directory); | |
| } | |
| catch (\Exception $e) { | |
| drupal_set_message($e->getMessage(), 'error'); | |
| return; | |
| } | |
| $files = $archive->listContents(); | |
| if (!$files) { | |
| drupal_set_message($this->t('Provided archive contains no files.'), 'error'); | |
| return; | |
| } | |
| // Unfortunately, we can only use the directory name to determine the | |
| // project name. Some archivers list the first file as the directory (i.e., | |
| // MODULE/) and others list an actual file (i.e., MODULE/README.TXT). | |
| $project = strtok($files[0], '/\\'); | |
| $archive_errors = $this->moduleHandler->invokeAll('verify_update_archive', array($project, $local_cache, $directory)); | |
| if (!empty($archive_errors)) { | |
| drupal_set_message(array_shift($archive_errors), 'error'); | |
| // @todo: Fix me in D8: We need a way to set multiple errors on the same | |
| // form element and have all of them appear! | |
| if (!empty($archive_errors)) { | |
| foreach ($archive_errors as $error) { | |
| drupal_set_message($error, 'error'); | |
| } | |
| } | |
| return; | |
| } | |
| // Make sure the Updater registry is loaded. | |
| drupal_get_updaters(); | |
| $project_location = $directory . '/' . $project; | |
| try { | |
| $updater = Updater::factory($project_location, $this->root); | |
| } | |
| catch (\Exception $e) { | |
| drupal_set_message($e->getMessage(), 'error'); | |
| return; | |
| } | |
| try { | |
| $project_title = Updater::getProjectTitle($project_location); | |
| } | |
| catch (\Exception $e) { | |
| drupal_set_message($e->getMessage(), 'error'); | |
| return; | |
| } | |
| if (!$project_title) { | |
| drupal_set_message($this->t('Unable to determine %project name.', array('%project' => $project)), 'error'); | |
| } | |
| if ($updater->isInstalled()) { | |
| drupal_set_message($this->t('%project is already installed.', array('%project' => $project_title)), 'error'); | |
| return; | |
| } | |
| $project_real_location = drupal_realpath($project_location); | |
| $arguments = array( | |
| 'project' => $project, | |
| 'updater_name' => get_class($updater), | |
| 'local_url' => $project_real_location, | |
| ); | |
| // If the owner of the directory we extracted is the same as the owner of | |
| // our configuration directory (e.g. sites/default) where we're trying to | |
| // install the code, there's no need to prompt for FTP/SSH credentials. | |
| // Instead, we instantiate a Drupal\Core\FileTransfer\Local and invoke | |
| // update_authorize_run_install() directly. | |
| if (fileowner($project_real_location) == fileowner($this->sitePath)) { | |
| $this->moduleHandler->loadInclude('update', 'inc', 'update.authorize'); | |
| $filetransfer = new Local($this->root); | |
| $response = call_user_func_array('update_authorize_run_install', array_merge(array($filetransfer), $arguments)); | |
| if ($response instanceof Response) { | |
| $form_state->setResponse($response); | |
| } | |
| } | |
| // Otherwise, go through the regular workflow to prompt for FTP/SSH | |
| // credentials and invoke update_authorize_run_install() indirectly with | |
| // whatever FileTransfer object authorize.php creates for us. | |
| else { | |
| // The page title must be passed here to ensure it is initially used when | |
| // authorize.php loads for the first time with the FTP/SSH credentials | |
| // form. | |
| system_authorized_init('update_authorize_run_install', drupal_get_path('module', 'update') . '/update.authorize.inc', $arguments, $this->t('Update manager')); | |
| $form_state->setRedirectUrl(system_authorized_get_url()); | |
| } | |
| } | |
| } |