summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Pott2018-06-01 06:58:28 (GMT)
committerAlex Pott2018-06-01 06:58:28 (GMT)
commit175fa94bc8c322e75dedc094833de4cd47222cdc (patch)
treee19ba1c7b6b78675239500f5f0f0cadadeb43a9b
parentf290f49f6dd26d226daa3b31cb1d95707a00d519 (diff)
Issue #2562845 by quietone, rakesh.gectcr, iMiksu, Jo Fitzgerald, maxocub, heddn, mikeryan, alexpott, phenaproxima, jhodgdon: Validate file path on Credential form
-rw-r--r--core/modules/migrate_drupal_ui/src/Form/CredentialForm.php106
-rw-r--r--core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeExecuteTestBase.php23
2 files changed, 101 insertions, 28 deletions
diff --git a/core/modules/migrate_drupal_ui/src/Form/CredentialForm.php b/core/modules/migrate_drupal_ui/src/Form/CredentialForm.php
index cd767cc..deeebe5 100644
--- a/core/modules/migrate_drupal_ui/src/Form/CredentialForm.php
+++ b/core/modules/migrate_drupal_ui/src/Form/CredentialForm.php
@@ -2,9 +2,12 @@
namespace Drupal\migrate_drupal_ui\Form;
+use Drupal\Component\Utility\UrlHelper;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\RendererInterface;
use Drupal\Core\TempStore\PrivateTempStoreFactory;
+use GuzzleHttp\ClientInterface;
+use GuzzleHttp\Exception\TransferException;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
@@ -22,16 +25,33 @@ class CredentialForm extends MigrateUpgradeFormBase {
protected $renderer;
/**
+ * The HTTP client to fetch the files with.
+ *
+ * @var \GuzzleHttp\ClientInterface
+ */
+ protected $httpClient;
+
+ /**
+ * An array of error information.
+ *
+ * @var array
+ */
+ protected $errors = [];
+
+ /**
* CredentialForm constructor.
*
* @param \Drupal\Core\Render\RendererInterface $renderer
* The renderer service.
* @param \Drupal\Core\TempStore\PrivateTempStoreFactory $tempstore_private
* The private tempstore factory.
+ * @param \GuzzleHttp\ClientInterface $http_client
+ * A Guzzle client object.
*/
- public function __construct(RendererInterface $renderer, PrivateTempStoreFactory $tempstore_private) {
+ public function __construct(RendererInterface $renderer, PrivateTempStoreFactory $tempstore_private, ClientInterface $http_client) {
parent::__construct($tempstore_private);
$this->renderer = $renderer;
+ $this->httpClient = $http_client;
}
/**
@@ -40,7 +60,8 @@ class CredentialForm extends MigrateUpgradeFormBase {
public static function create(ContainerInterface $container) {
return new static(
$container->get('renderer'),
- $container->get('tempstore.private')
+ $container->get('tempstore.private'),
+ $container->get('http_client')
);
}
@@ -75,6 +96,11 @@ class CredentialForm extends MigrateUpgradeFormBase {
$default_options = [];
+ $form['help'] = [
+ '#type' => 'item',
+ '#description' => $this->t('Provide the information to access the Drupal site you want to upgrade. Files can be imported into the upgraded site as well. See the <a href=":url">Upgrade documentation for more detailed instructions</a>.', [':url' => 'https://www.drupal.org/upgrade/migrate']),
+ ];
+
$form['version'] = [
'#type' => 'radios',
'#default_value' => 7,
@@ -145,6 +171,7 @@ class CredentialForm extends MigrateUpgradeFormBase {
':input[name="version"]' => ['value' => '6'],
],
],
+ '#element_validate' => ['::validatePaths'],
];
$form['source']['source_base_path'] = [
@@ -156,6 +183,7 @@ class CredentialForm extends MigrateUpgradeFormBase {
':input[name="version"]' => ['value' => '7'],
],
],
+ '#element_validate' => ['::validatePaths'],
];
$form['source']['source_private_file_path'] = [
@@ -168,6 +196,7 @@ class CredentialForm extends MigrateUpgradeFormBase {
':input[name="version"]' => ['value' => '7'],
],
],
+ '#element_validate' => ['::validatePaths'],
];
return $form;
@@ -177,7 +206,6 @@ class CredentialForm extends MigrateUpgradeFormBase {
* {@inheritdoc}
*/
public function validateForm(array &$form, FormStateInterface $form_state) {
-
// Retrieve the database driver from the form, use reflection to get the
// namespace, and then construct a valid database array the same as in
// settings.php.
@@ -194,35 +222,61 @@ class CredentialForm extends MigrateUpgradeFormBase {
// Validate the driver settings and just end here if we have any issues.
if ($errors = $drivers[$driver]->validateDatabaseSettings($database)) {
foreach ($errors as $name => $message) {
- $form_state->setErrorByName($name, $message);
+ $this->errors[$name] = $message;
}
- return;
}
-
- try {
- $connection = $this->getConnection($database);
- $version = (string) $this->getLegacyDrupalVersion($connection);
- if (!$version) {
- $form_state->setErrorByName($database['driver'] . '][0', $this->t('Source database does not contain a recognizable Drupal version.'));
+ else {
+ try {
+ $connection = $this->getConnection($database);
+ $version = (string) $this->getLegacyDrupalVersion($connection);
+ if (!$version) {
+ $this->errors[$database['driver'] . '][database'] = $this->t('Source database does not contain a recognizable Drupal version.');
+ }
+ elseif ($version !== (string) $form_state->getValue('version')) {
+ $this->errors['version'] = $this->t('Source database is Drupal version @version but version @selected was selected.',
+ [
+ '@version' => $version,
+ '@selected' => $form_state->getValue('version'),
+ ]);
+ }
+ else {
+ // Setup migrations and save form data to private store.
+ $this->setupMigrations($database, $form_state);
+ }
}
- elseif ($version !== (string) $form_state->getValue('version')) {
- $form_state->setErrorByName($database['driver'] . '][0', $this->t('Source database is Drupal version @version but version @selected was selected.', [
- '@version' => $version,
- '@selected' => $form_state->getValue('version'),
- ]));
+ catch (\Exception $e) {
+ $this->errors[$database['driver'] . '][database'] = $e->getMessage();
}
- else {
- // Setup migrations and save form data to private store.
- $this->setupMigrations($database, $form_state);
+ }
+
+ // Display all errors as a list of items.
+ if ($this->errors) {
+ $form_state->setError($form, $this->t('<h3>Resolve all issues below to continue the upgrade.</h3>'));
+ foreach ($this->errors as $name => $message) {
+ $form_state->setErrorByName($name, $message);
}
}
- catch (\Exception $e) {
- $error_message = [
- '#title' => $this->t('Resolve the issue below to continue the upgrade.'),
- '#theme' => 'item_list',
- '#items' => [$e->getMessage()],
- ];
- $form_state->setErrorByName($database['driver'] . '][0', $this->renderer->renderPlain($error_message));
+ }
+
+ /**
+ * The #element_validate handler for the source path elements.
+ *
+ * Ensures that entered path can be read.
+ */
+ public function validatePaths($element, FormStateInterface $form_state) {
+ if ($source = $element['#value']) {
+ $msg = $this->t('Unable to read from @title.', ['@title' => $element['#title']]);
+ if (UrlHelper::isExternal($source)) {
+ try {
+ $this->httpClient->head($source);
+ }
+ catch (TransferException $e) {
+ $this->errors[$element['#name']] = $msg . ' ' . $e->getMessage();
+ }
+ }
+ elseif (!file_exists($source) || (!is_dir($source)) || (!is_readable($source))) {
+ $this->errors[$element['#name']] = $msg;
+ }
}
}
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeExecuteTestBase.php b/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeExecuteTestBase.php
index 22ec01c..bb822b9 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeExecuteTestBase.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeExecuteTestBase.php
@@ -68,16 +68,35 @@ abstract class MigrateUpgradeExecuteTestBase extends MigrateUpgradeTestBase {
// Ensure submitting the form with invalid database credentials gives us a
// nice warning.
$this->drupalPostForm(NULL, [$driver . '[database]' => 'wrong'] + $edits, t('Review upgrade'));
- $session->pageTextContains('Resolve the issue below to continue the upgrade.');
+ $session->pageTextContains('Resolve all issues below to continue the upgrade.');
$this->drupalPostForm(NULL, $edits, t('Review upgrade'));
// Ensure we get errors about missing modules.
- $session->pageTextContains(t('Resolve the issue below to continue the upgrade'));
+ $session->pageTextContains(t('Resolve all issues below to continue the upgrade.'));
$session->pageTextContains(t('The no_source_module plugin must define the source_module property.'));
// Uninstall the module causing the missing module error messages.
$this->container->get('module_installer')->uninstall(['migration_provider_test'], TRUE);
+ // Test the file sources.
+ $this->drupalGet('/upgrade');
+ $this->drupalPostForm(NULL, [], t('Continue'));
+ if ($version == 6) {
+ $paths['d6_source_base_path'] = DRUPAL_ROOT . '/wrong-path';
+ }
+ else {
+ $paths['source_base_path'] = 'https://example.com/wrong-path';
+ $paths['source_private_file_path'] = DRUPAL_ROOT . '/wrong-path';
+ }
+ $this->drupalPostForm(NULL, $paths + $edits, t('Review upgrade'));
+ if ($version == 6) {
+ $session->responseContains('Unable to read from Files directory.');
+ }
+ else {
+ $session->responseContains('Unable to read from Public files directory.');
+ $session->responseContains('Unable to read from Private file directory.');
+ }
+
// Restart the upgrade process.
$this->drupalGet('/upgrade');
$session->responseContains('Upgrade a site by importing its files and the data from its database into a clean and empty new install of Drupal 8.');