ExtensionArgumentValidator.php 2.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
<?php
namespace T3o\TerFe2\Validation\Validator;

/*
 * This file is part of the TYPO3 CMS project.
 *
 * It is free software; you can redistribute it and/or modify it under
 * the terms of the GNU General Public License, either version 2
 * of the License, or any later version.
 *
 * For the full copyright and license information, please read the
 * LICENSE.txt file that was distributed with this source code.
 *
 * The TYPO3 project - inspiring people to share!
 */

use GuzzleHttp\Exception\RequestException;
use T3o\TerFe2\Domain\Model\Extension;
use TYPO3\CMS\Core\Http\RequestFactory;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Validation\Validator\AbstractValidator;

/**
 * Validator for composer name on packagist.org
 */
class ExtensionArgumentValidator extends AbstractValidator
{
    /**
     * Returns false, if given composer name is not registered on packagist.org
     *
     * @param mixed $value The value that should be validated
32
     * @return bool TRUE if the value is valid, FALSE if an error occured
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
     */
    public function isValid($value)
    {
        if (!$value instanceof Extension) {
            $this->addError('This argument is not of type Extension.', 1527537602);
            return false;
        }
        if (empty($value->getComposerName())) {
            return true;
        }

        if (!$this->composerNameMatchesComposerNameInLatestVersion($value)) {
            $this->addError('This composer name does not match composer name in last version of uploaded extension.', 1527538363);
            return false;
        }
        if (!$this->isRegisteredOnPackagist($value->getComposerName())) {
            $this->addError('This composer name is not registered on packagist.org.', 1527500413);
            return false;
        }
        return true;
    }

    private function composerNameMatchesComposerNameInLatestVersion(Extension $extension)
    {
        return $extension->getLastVersion() !== null && $extension->getComposerName() === $extension->getLastVersion()->getComposerName();
    }

    private function isRegisteredOnPackagist(string $composerName): bool
    {
        $requestFactory = GeneralUtility::makeInstance(RequestFactory::class);
        try {
            $response = $requestFactory->request(
                'https://packagist.org/packages/' . $composerName,
                'HEAD',
                [
                    'connect_timeout' => 2,
                    'allow_redirects' => false,
                ]
            );
            return $response->getStatusCode() === 200;
        } catch (RequestException $e) {
            return false;
        }
    }
}