SymlinkValidator.php

Namespace

Drupal\package_manager\Validator

File

core/modules/package_manager/src/Validator/SymlinkValidator.php

View source
<?php

declare (strict_types=1);
namespace Drupal\package_manager\Validator;

use Drupal\package_manager\Event\PreOperationStageEvent;
use Drupal\package_manager\Event\PreRequireEvent;
use Drupal\package_manager\PathLocator;
use PhpTuf\ComposerStager\API\Exception\PreconditionException;
use PhpTuf\ComposerStager\API\Path\Factory\PathFactoryInterface;
use PhpTuf\ComposerStager\API\Path\Factory\PathListFactoryInterface;
use PhpTuf\ComposerStager\API\Precondition\Service\NoUnsupportedLinksExistInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Flags errors if unsupported symbolic links are detected.
 *
 * @see https://github.com/php-tuf/composer-stager/tree/develop/src/Domain/Service/Precondition#symlinks
 *
 * @internal
 *   This is an internal part of Package Manager and may be changed or removed
 *   at any time without warning. External code should not interact with this
 *   class.
 */
final class SymlinkValidator implements EventSubscriberInterface {
    use BaseRequirementValidatorTrait;
    public function __construct(PathLocator $pathLocator, NoUnsupportedLinksExistInterface $precondition, PathFactoryInterface $pathFactory, PathListFactoryInterface $pathListFactory) {
    }
    
    /**
     * Flags errors if the project root or stage directory contain symbolic links.
     */
    public function validate(PreOperationStageEvent $event) : void {
        if ($event instanceof PreRequireEvent) {
            // We don't need to check symlinks again during PreRequireEvent; this was
            // already just validated during PreCreateEvent.
            return;
        }
        $active_dir = $this->pathFactory
            ->create($this->pathLocator
            ->getProjectRoot());
        // The precondition requires us to pass both an active and stage directory,
        // so if the stage hasn't been created or claimed yet, use the directory
        // that contains this file, which contains only a few files and no symlinks,
        // as the stage directory. The precondition itself doesn't care if the
        // directory actually exists or not.
        $stage_dir = __DIR__;
        if ($event->stage
            ->stageDirectoryExists()) {
            $stage_dir = $event->stage
                ->getStageDirectory();
        }
        $stage_dir = $this->pathFactory
            ->create($stage_dir);
        // Return early if no excluded paths were collected because this validator
        // is dependent on knowing which paths to exclude when searching for
        // symlinks.
        // @see \Drupal\package_manager\StatusCheckTrait::runStatusCheck()
        if ($event->excludedPaths === NULL) {
            return;
        }
        // The list of excluded paths is immutable, but the precondition may need to
        // mutate it, so convert it back to a normal, mutable path list.
        $exclusions = $this->pathListFactory
            ->create(...$event->excludedPaths
            ->getAll());
        try {
            $this->precondition
                ->assertIsFulfilled($active_dir, $stage_dir, $exclusions);
        } catch (PreconditionException $e) {
            $event->addErrorFromThrowable($e);
        }
    }

}

Classes

Title Deprecated Summary
SymlinkValidator Flags errors if unsupported symbolic links are detected.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.