mirror of
https://github.com/shlinkio/shlink.git
synced 2025-02-25 18:45:27 -06:00
Added validation to not found redirects for domain
This commit is contained in:
parent
20f70b8b07
commit
9f25979b4c
@ -92,7 +92,7 @@ class DomainRedirectsCommand extends Command
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
$this->domainService->configureNotFoundRedirects($domainAuthority, new NotFoundRedirects(
|
$this->domainService->configureNotFoundRedirects($domainAuthority, NotFoundRedirects::withRedirects(
|
||||||
$ask(
|
$ask(
|
||||||
'URL to redirect to when a user hits this domain\'s base URL',
|
'URL to redirect to when a user hits this domain\'s base URL',
|
||||||
$domain?->baseUrlRedirect(),
|
$domain?->baseUrlRedirect(),
|
||||||
|
@ -40,7 +40,7 @@ class DomainRedirectsCommandTest extends TestCase
|
|||||||
$findDomain = $this->domainService->findByAuthority($domainAuthority)->willReturn($domain);
|
$findDomain = $this->domainService->findByAuthority($domainAuthority)->willReturn($domain);
|
||||||
$configureRedirects = $this->domainService->configureNotFoundRedirects(
|
$configureRedirects = $this->domainService->configureNotFoundRedirects(
|
||||||
$domainAuthority,
|
$domainAuthority,
|
||||||
new NotFoundRedirects('foo.com', null, 'baz.com'),
|
NotFoundRedirects::withRedirects('foo.com', null, 'baz.com'),
|
||||||
)->willReturn(Domain::withAuthority(''));
|
)->willReturn(Domain::withAuthority(''));
|
||||||
|
|
||||||
$this->commandTester->setInputs(['foo.com', '', 'baz.com']);
|
$this->commandTester->setInputs(['foo.com', '', 'baz.com']);
|
||||||
@ -71,12 +71,12 @@ class DomainRedirectsCommandTest extends TestCase
|
|||||||
{
|
{
|
||||||
$domainAuthority = 'example.com';
|
$domainAuthority = 'example.com';
|
||||||
$domain = Domain::withAuthority($domainAuthority);
|
$domain = Domain::withAuthority($domainAuthority);
|
||||||
$domain->configureNotFoundRedirects(new NotFoundRedirects('foo.com', 'bar.com', 'baz.com'));
|
$domain->configureNotFoundRedirects(NotFoundRedirects::withRedirects('foo.com', 'bar.com', 'baz.com'));
|
||||||
|
|
||||||
$findDomain = $this->domainService->findByAuthority($domainAuthority)->willReturn($domain);
|
$findDomain = $this->domainService->findByAuthority($domainAuthority)->willReturn($domain);
|
||||||
$configureRedirects = $this->domainService->configureNotFoundRedirects(
|
$configureRedirects = $this->domainService->configureNotFoundRedirects(
|
||||||
$domainAuthority,
|
$domainAuthority,
|
||||||
new NotFoundRedirects(null, 'edited.com', 'baz.com'),
|
NotFoundRedirects::withRedirects(null, 'edited.com', 'baz.com'),
|
||||||
)->willReturn($domain);
|
)->willReturn($domain);
|
||||||
|
|
||||||
$this->commandTester->setInputs(['2', '1', 'edited.com', '0']);
|
$this->commandTester->setInputs(['2', '1', 'edited.com', '0']);
|
||||||
@ -105,7 +105,7 @@ class DomainRedirectsCommandTest extends TestCase
|
|||||||
$findDomain = $this->domainService->findByAuthority($domainAuthority)->willReturn($domain);
|
$findDomain = $this->domainService->findByAuthority($domainAuthority)->willReturn($domain);
|
||||||
$configureRedirects = $this->domainService->configureNotFoundRedirects(
|
$configureRedirects = $this->domainService->configureNotFoundRedirects(
|
||||||
$domainAuthority,
|
$domainAuthority,
|
||||||
new NotFoundRedirects(),
|
NotFoundRedirects::withoutRedirects(),
|
||||||
)->willReturn($domain);
|
)->willReturn($domain);
|
||||||
|
|
||||||
$this->commandTester->setInputs([$domainAuthority, '', '', '']);
|
$this->commandTester->setInputs([$domainAuthority, '', '', '']);
|
||||||
@ -132,7 +132,7 @@ class DomainRedirectsCommandTest extends TestCase
|
|||||||
$findDomain = $this->domainService->findByAuthority($domainAuthority)->willReturn($domain);
|
$findDomain = $this->domainService->findByAuthority($domainAuthority)->willReturn($domain);
|
||||||
$configureRedirects = $this->domainService->configureNotFoundRedirects(
|
$configureRedirects = $this->domainService->configureNotFoundRedirects(
|
||||||
$domainAuthority,
|
$domainAuthority,
|
||||||
new NotFoundRedirects(),
|
NotFoundRedirects::withoutRedirects(),
|
||||||
)->willReturn($domain);
|
)->willReturn($domain);
|
||||||
|
|
||||||
$this->commandTester->setInputs(['1', '', '', '']);
|
$this->commandTester->setInputs(['1', '', '', '']);
|
||||||
@ -162,7 +162,7 @@ class DomainRedirectsCommandTest extends TestCase
|
|||||||
$findDomain = $this->domainService->findByAuthority($domainAuthority)->willReturn($domain);
|
$findDomain = $this->domainService->findByAuthority($domainAuthority)->willReturn($domain);
|
||||||
$configureRedirects = $this->domainService->configureNotFoundRedirects(
|
$configureRedirects = $this->domainService->configureNotFoundRedirects(
|
||||||
$domainAuthority,
|
$domainAuthority,
|
||||||
new NotFoundRedirects(),
|
NotFoundRedirects::withoutRedirects(),
|
||||||
)->willReturn($domain);
|
)->willReturn($domain);
|
||||||
|
|
||||||
$this->commandTester->setInputs(['2', $domainAuthority, '', '', '']);
|
$this->commandTester->setInputs(['2', $domainAuthority, '', '', '']);
|
||||||
|
@ -36,7 +36,7 @@ class ListDomainsCommandTest extends TestCase
|
|||||||
public function allDomainsAreProperlyPrinted(array $input, string $expectedOutput): void
|
public function allDomainsAreProperlyPrinted(array $input, string $expectedOutput): void
|
||||||
{
|
{
|
||||||
$bazDomain = Domain::withAuthority('baz.com');
|
$bazDomain = Domain::withAuthority('baz.com');
|
||||||
$bazDomain->configureNotFoundRedirects(new NotFoundRedirects(
|
$bazDomain->configureNotFoundRedirects(NotFoundRedirects::withRedirects(
|
||||||
null,
|
null,
|
||||||
'https://foo.com/baz-domain/regular',
|
'https://foo.com/baz-domain/regular',
|
||||||
'https://foo.com/baz-domain/invalid',
|
'https://foo.com/baz-domain/invalid',
|
||||||
|
@ -8,13 +8,26 @@ use JsonSerializable;
|
|||||||
|
|
||||||
final class NotFoundRedirects implements JsonSerializable
|
final class NotFoundRedirects implements JsonSerializable
|
||||||
{
|
{
|
||||||
public function __construct(
|
private function __construct(
|
||||||
private ?string $baseUrlRedirect = null,
|
private ?string $baseUrlRedirect,
|
||||||
private ?string $regular404Redirect = null,
|
private ?string $regular404Redirect,
|
||||||
private ?string $invalidShortUrlRedirect = null,
|
private ?string $invalidShortUrlRedirect,
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function withRedirects(
|
||||||
|
?string $baseUrlRedirect = null,
|
||||||
|
?string $regular404Redirect = null,
|
||||||
|
?string $invalidShortUrlRedirect = null,
|
||||||
|
): self {
|
||||||
|
return new self($baseUrlRedirect, $regular404Redirect, $invalidShortUrlRedirect);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function withoutRedirects(): self
|
||||||
|
{
|
||||||
|
return new self(null, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
public function baseUrlRedirect(): ?string
|
public function baseUrlRedirect(): ?string
|
||||||
{
|
{
|
||||||
return $this->baseUrlRedirect;
|
return $this->baseUrlRedirect;
|
||||||
|
@ -0,0 +1,50 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Shlinkio\Shlink\Core\Domain\Validation;
|
||||||
|
|
||||||
|
use Laminas\InputFilter\InputFilter;
|
||||||
|
use Laminas\Validator;
|
||||||
|
use Shlinkio\Shlink\Common\Validation;
|
||||||
|
|
||||||
|
class DomainRedirectsInputFilter extends InputFilter
|
||||||
|
{
|
||||||
|
use Validation\InputFactoryTrait;
|
||||||
|
|
||||||
|
public const DOMAIN = 'domain';
|
||||||
|
public const BASE_URL_REDIRECT = 'baseUrlRedirect';
|
||||||
|
public const REGULAR_404_REDIRECT = 'regular404Redirect';
|
||||||
|
public const INVALID_SHORT_URL_REDIRECT = 'invalidShortUrlRedirect';
|
||||||
|
|
||||||
|
private function __construct()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function withData(array $data): self
|
||||||
|
{
|
||||||
|
$instance = new self();
|
||||||
|
|
||||||
|
$instance->initializeInputs();
|
||||||
|
$instance->setData($data);
|
||||||
|
|
||||||
|
return $instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function initializeInputs(): void
|
||||||
|
{
|
||||||
|
$domain = $this->createInput(self::DOMAIN);
|
||||||
|
$domain->getValidatorChain()->attach(new Validator\NotEmpty([
|
||||||
|
Validator\NotEmpty::OBJECT,
|
||||||
|
Validator\NotEmpty::SPACE,
|
||||||
|
Validator\NotEmpty::NULL,
|
||||||
|
Validator\NotEmpty::EMPTY_ARRAY,
|
||||||
|
Validator\NotEmpty::BOOLEAN,
|
||||||
|
]));
|
||||||
|
$this->add($domain);
|
||||||
|
|
||||||
|
$this->add($this->createInput(self::BASE_URL_REDIRECT, false));
|
||||||
|
$this->add($this->createInput(self::REGULAR_404_REDIRECT, false));
|
||||||
|
$this->add($this->createInput(self::INVALID_SHORT_URL_REDIRECT, false));
|
||||||
|
}
|
||||||
|
}
|
@ -45,7 +45,7 @@ class DomainRepositoryTest extends DatabaseTestCase
|
|||||||
$this->getEntityManager()->persist($detachedDomain);
|
$this->getEntityManager()->persist($detachedDomain);
|
||||||
|
|
||||||
$detachedWithRedirects = Domain::withAuthority('detached-with-redirects.com');
|
$detachedWithRedirects = Domain::withAuthority('detached-with-redirects.com');
|
||||||
$detachedWithRedirects->configureNotFoundRedirects(new NotFoundRedirects('foo.com', 'bar.com'));
|
$detachedWithRedirects->configureNotFoundRedirects(NotFoundRedirects::withRedirects('foo.com', 'bar.com'));
|
||||||
$this->getEntityManager()->persist($detachedWithRedirects);
|
$this->getEntityManager()->persist($detachedWithRedirects);
|
||||||
|
|
||||||
$this->getEntityManager()->flush();
|
$this->getEntityManager()->flush();
|
||||||
@ -101,7 +101,7 @@ class DomainRepositoryTest extends DatabaseTestCase
|
|||||||
$this->getEntityManager()->persist($detachedDomain);
|
$this->getEntityManager()->persist($detachedDomain);
|
||||||
|
|
||||||
$detachedWithRedirects = Domain::withAuthority('detached-with-redirects.com');
|
$detachedWithRedirects = Domain::withAuthority('detached-with-redirects.com');
|
||||||
$detachedWithRedirects->configureNotFoundRedirects(new NotFoundRedirects('foo.com', 'bar.com'));
|
$detachedWithRedirects->configureNotFoundRedirects(NotFoundRedirects::withRedirects('foo.com', 'bar.com'));
|
||||||
$this->getEntityManager()->persist($detachedWithRedirects);
|
$this->getEntityManager()->persist($detachedWithRedirects);
|
||||||
|
|
||||||
$this->getEntityManager()->flush();
|
$this->getEntityManager()->flush();
|
||||||
|
@ -183,7 +183,7 @@ class DomainServiceTest extends TestCase
|
|||||||
$persist = $this->em->persist($foundDomain ?? Argument::type(Domain::class));
|
$persist = $this->em->persist($foundDomain ?? Argument::type(Domain::class));
|
||||||
$flush = $this->em->flush();
|
$flush = $this->em->flush();
|
||||||
|
|
||||||
$result = $this->domainService->configureNotFoundRedirects($authority, new NotFoundRedirects(
|
$result = $this->domainService->configureNotFoundRedirects($authority, NotFoundRedirects::withRedirects(
|
||||||
'foo.com',
|
'foo.com',
|
||||||
'bar.com',
|
'bar.com',
|
||||||
'baz.com',
|
'baz.com',
|
||||||
|
@ -6,6 +6,8 @@ namespace Shlinkio\Shlink\Rest\Action\Domain\Request;
|
|||||||
|
|
||||||
use Shlinkio\Shlink\Core\Config\NotFoundRedirectConfigInterface;
|
use Shlinkio\Shlink\Core\Config\NotFoundRedirectConfigInterface;
|
||||||
use Shlinkio\Shlink\Core\Config\NotFoundRedirects;
|
use Shlinkio\Shlink\Core\Config\NotFoundRedirects;
|
||||||
|
use Shlinkio\Shlink\Core\Domain\Validation\DomainRedirectsInputFilter;
|
||||||
|
use Shlinkio\Shlink\Core\Exception\ValidationException;
|
||||||
|
|
||||||
use function array_key_exists;
|
use function array_key_exists;
|
||||||
|
|
||||||
@ -30,17 +32,33 @@ class DomainRedirectsRequest
|
|||||||
return $instance;
|
return $instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws ValidationException
|
||||||
|
*/
|
||||||
private function validateAndInit(array $payload): void
|
private function validateAndInit(array $payload): void
|
||||||
{
|
{
|
||||||
// TODO Validate data
|
$inputFilter = DomainRedirectsInputFilter::withData($payload);
|
||||||
$this->baseUrlRedirectWasProvided = array_key_exists('baseUrlRedirect', $payload);
|
if (! $inputFilter->isValid()) {
|
||||||
$this->regular404RedirectWasProvided = array_key_exists('regular404Redirect', $payload);
|
throw ValidationException::fromInputFilter($inputFilter);
|
||||||
$this->invalidShortUrlRedirectWasProvided = array_key_exists('invalidShortUrlRedirect', $payload);
|
}
|
||||||
|
|
||||||
$this->authority = $payload['domain'];
|
$this->baseUrlRedirectWasProvided = array_key_exists(
|
||||||
$this->baseUrlRedirect = $payload['baseUrlRedirect'] ?? null;
|
DomainRedirectsInputFilter::BASE_URL_REDIRECT,
|
||||||
$this->regular404Redirect = $payload['regular404Redirect'] ?? null;
|
$payload,
|
||||||
$this->invalidShortUrlRedirect = $payload['invalidShortUrlRedirect'] ?? null;
|
);
|
||||||
|
$this->regular404RedirectWasProvided = array_key_exists(
|
||||||
|
DomainRedirectsInputFilter::REGULAR_404_REDIRECT,
|
||||||
|
$payload,
|
||||||
|
);
|
||||||
|
$this->invalidShortUrlRedirectWasProvided = array_key_exists(
|
||||||
|
DomainRedirectsInputFilter::INVALID_SHORT_URL_REDIRECT,
|
||||||
|
$payload,
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->authority = $inputFilter->getValue(DomainRedirectsInputFilter::DOMAIN);
|
||||||
|
$this->baseUrlRedirect = $inputFilter->getValue(DomainRedirectsInputFilter::BASE_URL_REDIRECT);
|
||||||
|
$this->regular404Redirect = $inputFilter->getValue(DomainRedirectsInputFilter::REGULAR_404_REDIRECT);
|
||||||
|
$this->invalidShortUrlRedirect = $inputFilter->getValue(DomainRedirectsInputFilter::INVALID_SHORT_URL_REDIRECT);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function authority(): string
|
public function authority(): string
|
||||||
@ -50,7 +68,7 @@ class DomainRedirectsRequest
|
|||||||
|
|
||||||
public function toNotFoundRedirects(?NotFoundRedirectConfigInterface $defaults = null): NotFoundRedirects
|
public function toNotFoundRedirects(?NotFoundRedirectConfigInterface $defaults = null): NotFoundRedirects
|
||||||
{
|
{
|
||||||
return new NotFoundRedirects(
|
return NotFoundRedirects::withRedirects(
|
||||||
$this->baseUrlRedirectWasProvided ? $this->baseUrlRedirect : $defaults?->baseUrlRedirect(),
|
$this->baseUrlRedirectWasProvided ? $this->baseUrlRedirect : $defaults?->baseUrlRedirect(),
|
||||||
$this->regular404RedirectWasProvided ? $this->regular404Redirect : $defaults?->regular404Redirect(),
|
$this->regular404RedirectWasProvided ? $this->regular404Redirect : $defaults?->regular404Redirect(),
|
||||||
$this->invalidShortUrlRedirectWasProvided
|
$this->invalidShortUrlRedirectWasProvided
|
||||||
|
@ -20,7 +20,7 @@ class DomainFixture extends AbstractFixture
|
|||||||
$manager->persist(Domain::withAuthority('this_domain_is_detached.com'));
|
$manager->persist(Domain::withAuthority('this_domain_is_detached.com'));
|
||||||
|
|
||||||
$detachedWithRedirects = Domain::withAuthority('detached-with-redirects.com');
|
$detachedWithRedirects = Domain::withAuthority('detached-with-redirects.com');
|
||||||
$detachedWithRedirects->configureNotFoundRedirects(new NotFoundRedirects('foo.com', 'bar.com'));
|
$detachedWithRedirects->configureNotFoundRedirects(NotFoundRedirects::withRedirects('foo.com', 'bar.com'));
|
||||||
$manager->persist($detachedWithRedirects);
|
$manager->persist($detachedWithRedirects);
|
||||||
|
|
||||||
$manager->flush();
|
$manager->flush();
|
||||||
|
Loading…
Reference in New Issue
Block a user