Skip to content
Snippets Groups Projects
Commit 3ee886e8 authored by Adam G-H's avatar Adam G-H
Browse files

Issue #3267603 by phenaproxima: Prevent updates in a multisite

parent 942ecfae
No related branches found
No related tags found
No related merge requests found
......@@ -85,6 +85,12 @@ services:
- '@package_manager.validator.file_system'
tags:
- { name: event_subscriber }
automatic_updates.validator.multisite:
class: Drupal\automatic_updates\Validator\PackageManagerReadinessCheck
arguments:
- '@package_manager.validator.multisite'
tags:
- { name: event_subscriber }
automatic_updates.cron_frequency_validator:
class: Drupal\automatic_updates\Validator\CronFrequencyValidator
arguments:
......
......@@ -120,6 +120,13 @@ services:
- '@string_translation'
tags:
- { name: event_subscriber }
package_manager.validator.multisite:
class: Drupal\package_manager\Validator\MultisiteValidator
arguments:
- '@package_manager.path_locator'
- '@string_translation'
tags:
- { name: event_subscriber }
package_manager.excluded_paths_subscriber:
class: Drupal\package_manager\EventSubscriber\ExcludedPathsSubscriber
arguments:
......
<?php
namespace Drupal\package_manager\Validator;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\StringTranslation\TranslationInterface;
use Drupal\package_manager\Event\PreCreateEvent;
use Drupal\package_manager\Event\PreOperationStageEvent;
use Drupal\package_manager\PathLocator;
/**
* Checks that the current site is not part of a multisite.
*/
class MultisiteValidator implements PreOperationStageValidatorInterface {
use StringTranslationTrait;
/**
* The path locator service.
*
* @var \Drupal\package_manager\PathLocator
*/
protected $pathLocator;
/**
* Constructs a new MultisiteValidator.
*
* @param \Drupal\package_manager\PathLocator $path_locator
* The path locator service.
* @param \Drupal\Core\StringTranslation\TranslationInterface $translation
* The string translation service.
*/
public function __construct(PathLocator $path_locator, TranslationInterface $translation) {
$this->pathLocator = $path_locator;
$this->setStringTranslation($translation);
}
/**
* {@inheritdoc}
*/
public function validateStagePreOperation(PreOperationStageEvent $event): void {
if ($this->isMultisite()) {
$event->addError([
$this->t('Multisites are not supported by Package Manager.'),
]);
}
}
/**
* Detects if the current site is part of a multisite.
*
* @return bool
* TRUE if the current site is part of a multisite, otherwise FALSE.
*
* @todo Make this smarter in https://www.drupal.org/node/3267646.
*/
protected function isMultisite(): bool {
$web_root = $this->pathLocator->getWebRoot();
if ($web_root) {
$web_root .= '/';
}
return file_exists($this->pathLocator->getProjectRoot() . '/' . $web_root . 'sites/sites.php');
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
return [
PreCreateEvent::class => 'validateStagePreOperation',
];
}
}
<?php
namespace Drupal\Tests\package_manager\Kernel;
use Drupal\package_manager\Event\PreCreateEvent;
use Drupal\package_manager\ValidationResult;
/**
* @covers \Drupal\package_manager\Validator\MultisiteValidator
*
* @group package_manager
*/
class MultisiteValidatorTest extends PackageManagerKernelTestBase {
/**
* Data provider for ::testMultisite().
*
* @return array[]
* Sets of arguments to pass to the test method.
*/
public function providerMultisite(): array {
return [
'multisite' => [
TRUE,
[
ValidationResult::createError([
'Multisites are not supported by Package Manager.',
]),
],
],
'not multisite' => [
FALSE,
[],
],
];
}
/**
* Tests that Package Manager flags an error if run in a multisite.
*
* @param bool $is_multisite
* Whether the validator will be in a multisite.
* @param \Drupal\package_manager\ValidationResult[] $expected_results
* The expected validation results.
*
* @dataProvider providerMultisite
*/
public function testMultisite(bool $is_multisite, array $expected_results = []): void {
$this->createTestProject();
// If we should simulate a multisite, ensure there is a sites.php in the
// test project.
// @see \Drupal\package_manager\Validator\MultisiteValidator::isMultisite()
if ($is_multisite) {
$project_root = $this->container->get('package_manager.path_locator')
->getProjectRoot();
touch($project_root . '/sites/sites.php');
}
$this->assertResults($expected_results, PreCreateEvent::class);
}
}
......@@ -50,6 +50,7 @@ class PackageManagerReadinessChecksTest extends AutomaticUpdatesKernelTestBase {
'Pending updates validator' => ['package_manager.validator.pending_updates'],
'File system validator' => ['package_manager.validator.file_system'],
'Composer settings validator' => ['package_manager.validator.composer_settings'],
'Multisite validator' => ['package_manager.validator.multisite'],
];
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment