diff --git a/core/modules/config/src/Form/ConfigImportForm.php b/core/modules/config/src/Form/ConfigImportForm.php index c16dfe8..733e1d1 100644 --- a/core/modules/config/src/Form/ConfigImportForm.php +++ b/core/modules/config/src/Form/ConfigImportForm.php @@ -72,6 +72,11 @@ public function buildForm(array $form, FormStateInterface $form_state) { * {@inheritdoc} */ public function validateForm(array &$form, FormStateInterface $form_state) { + $directory = config_get_config_directory(CONFIG_SYNC_DIRECTORY); + if (!is_writable($directory)) { + $form_state->setErrorByName('import_tarball', $this->t('The directory %directory is not writable.', ['%directory' => $directory])); + } + $file_upload = $this->getRequest()->files->get('files[import_tarball]', NULL, TRUE); if ($file_upload && $file_upload->isValid()) { $form_state->setValue('import_tarball', $file_upload->getRealPath()); diff --git a/core/modules/config/src/Tests/ConfigImportUploadTest.php b/core/modules/config/src/Tests/ConfigImportUploadTest.php index 33f6171..da1e159 100644 --- a/core/modules/config/src/Tests/ConfigImportUploadTest.php +++ b/core/modules/config/src/Tests/ConfigImportUploadTest.php @@ -50,6 +50,12 @@ function testImport() { $edit = array('files[import_tarball]' => drupal_realpath($text_file->uri)); $this->drupalPostForm('admin/config/development/configuration/full/import', $edit, t('Upload')); $this->assertText(t('Could not extract the contents of the tar file')); + + // Make the sync directory read-only. + $directory = config_get_config_directory(CONFIG_SYNC_DIRECTORY); + \Drupal::service('file_system')->chmod($directory, 0555); + $this->drupalPostForm('admin/config/development/configuration/full/import', $edit, t('Upload')); + $this->assertRaw(t('The directory %directory is not writable.', ['%directory' => $directory])); } }