mirror of
https://github.com/shlinkio/shlink.git
synced 2025-02-16 10:14:54 -06:00
Ensured default domain redirects cannot be edited through regular approach
This commit is contained in:
parent
9abf611d63
commit
7c06633a67
@ -10,6 +10,7 @@ use Shlinkio\Shlink\Core\Domain\Model\DomainItem;
|
|||||||
use Shlinkio\Shlink\Core\Domain\Repository\DomainRepositoryInterface;
|
use Shlinkio\Shlink\Core\Domain\Repository\DomainRepositoryInterface;
|
||||||
use Shlinkio\Shlink\Core\Entity\Domain;
|
use Shlinkio\Shlink\Core\Entity\Domain;
|
||||||
use Shlinkio\Shlink\Core\Exception\DomainNotFoundException;
|
use Shlinkio\Shlink\Core\Exception\DomainNotFoundException;
|
||||||
|
use Shlinkio\Shlink\Core\Exception\InvalidDomainException;
|
||||||
use Shlinkio\Shlink\Core\Options\NotFoundRedirectOptions;
|
use Shlinkio\Shlink\Core\Options\NotFoundRedirectOptions;
|
||||||
use Shlinkio\Shlink\Rest\ApiKey\Role;
|
use Shlinkio\Shlink\Rest\ApiKey\Role;
|
||||||
use Shlinkio\Shlink\Rest\Entity\ApiKey;
|
use Shlinkio\Shlink\Rest\Entity\ApiKey;
|
||||||
@ -78,12 +79,17 @@ class DomainService implements DomainServiceInterface
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws DomainNotFoundException
|
* @throws DomainNotFoundException
|
||||||
|
* @throws InvalidDomainException
|
||||||
*/
|
*/
|
||||||
public function configureNotFoundRedirects(
|
public function configureNotFoundRedirects(
|
||||||
string $authority,
|
string $authority,
|
||||||
NotFoundRedirects $notFoundRedirects,
|
NotFoundRedirects $notFoundRedirects,
|
||||||
?ApiKey $apiKey = null
|
?ApiKey $apiKey = null
|
||||||
): Domain {
|
): Domain {
|
||||||
|
if ($authority === $this->defaultDomain) {
|
||||||
|
throw InvalidDomainException::forDefaultDomainRedirects();
|
||||||
|
}
|
||||||
|
|
||||||
$domain = $this->getPersistedDomain($authority, $apiKey);
|
$domain = $this->getPersistedDomain($authority, $apiKey);
|
||||||
$domain->configureNotFoundRedirects($notFoundRedirects);
|
$domain->configureNotFoundRedirects($notFoundRedirects);
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@ use Shlinkio\Shlink\Core\Config\NotFoundRedirects;
|
|||||||
use Shlinkio\Shlink\Core\Domain\Model\DomainItem;
|
use Shlinkio\Shlink\Core\Domain\Model\DomainItem;
|
||||||
use Shlinkio\Shlink\Core\Entity\Domain;
|
use Shlinkio\Shlink\Core\Entity\Domain;
|
||||||
use Shlinkio\Shlink\Core\Exception\DomainNotFoundException;
|
use Shlinkio\Shlink\Core\Exception\DomainNotFoundException;
|
||||||
|
use Shlinkio\Shlink\Core\Exception\InvalidDomainException;
|
||||||
use Shlinkio\Shlink\Rest\Entity\ApiKey;
|
use Shlinkio\Shlink\Rest\Entity\ApiKey;
|
||||||
|
|
||||||
interface DomainServiceInterface
|
interface DomainServiceInterface
|
||||||
@ -31,6 +32,7 @@ interface DomainServiceInterface
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws DomainNotFoundException If the API key is restricted to one domain and a different one is provided
|
* @throws DomainNotFoundException If the API key is restricted to one domain and a different one is provided
|
||||||
|
* @throws InvalidDomainException If default domain is provided
|
||||||
*/
|
*/
|
||||||
public function configureNotFoundRedirects(
|
public function configureNotFoundRedirects(
|
||||||
string $authority,
|
string $authority,
|
||||||
|
33
module/Core/src/Exception/InvalidDomainException.php
Normal file
33
module/Core/src/Exception/InvalidDomainException.php
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Shlinkio\Shlink\Core\Exception;
|
||||||
|
|
||||||
|
use Fig\Http\Message\StatusCodeInterface;
|
||||||
|
use Mezzio\ProblemDetails\Exception\CommonProblemDetailsExceptionTrait;
|
||||||
|
use Mezzio\ProblemDetails\Exception\ProblemDetailsExceptionInterface;
|
||||||
|
|
||||||
|
class InvalidDomainException extends DomainException implements ProblemDetailsExceptionInterface
|
||||||
|
{
|
||||||
|
use CommonProblemDetailsExceptionTrait;
|
||||||
|
|
||||||
|
private const TITLE = 'Invalid domain';
|
||||||
|
private const TYPE = 'INVALID_DOMAIN';
|
||||||
|
|
||||||
|
private function __construct(string $message)
|
||||||
|
{
|
||||||
|
parent::__construct($message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function forDefaultDomainRedirects(): self
|
||||||
|
{
|
||||||
|
$e = new self('You cannot configure default domain\'s redirects this way. Use the configuration or env vars.');
|
||||||
|
$e->detail = $e->getMessage();
|
||||||
|
$e->title = self::TITLE;
|
||||||
|
$e->type = self::TYPE;
|
||||||
|
$e->status = StatusCodeInterface::STATUS_BAD_REQUEST;
|
||||||
|
|
||||||
|
return $e;
|
||||||
|
}
|
||||||
|
}
|
@ -15,6 +15,7 @@ use Shlinkio\Shlink\Core\Domain\Model\DomainItem;
|
|||||||
use Shlinkio\Shlink\Core\Domain\Repository\DomainRepositoryInterface;
|
use Shlinkio\Shlink\Core\Domain\Repository\DomainRepositoryInterface;
|
||||||
use Shlinkio\Shlink\Core\Entity\Domain;
|
use Shlinkio\Shlink\Core\Entity\Domain;
|
||||||
use Shlinkio\Shlink\Core\Exception\DomainNotFoundException;
|
use Shlinkio\Shlink\Core\Exception\DomainNotFoundException;
|
||||||
|
use Shlinkio\Shlink\Core\Exception\InvalidDomainException;
|
||||||
use Shlinkio\Shlink\Core\Options\NotFoundRedirectOptions;
|
use Shlinkio\Shlink\Core\Options\NotFoundRedirectOptions;
|
||||||
use Shlinkio\Shlink\Rest\ApiKey\Model\ApiKeyMeta;
|
use Shlinkio\Shlink\Rest\ApiKey\Model\ApiKeyMeta;
|
||||||
use Shlinkio\Shlink\Rest\ApiKey\Model\RoleDefinition;
|
use Shlinkio\Shlink\Rest\ApiKey\Model\RoleDefinition;
|
||||||
@ -213,4 +214,15 @@ class DomainServiceTest extends TestCase
|
|||||||
yield 'domain not found and author API key' => [null, $authorApiKey];
|
yield 'domain not found and author API key' => [null, $authorApiKey];
|
||||||
yield 'domain found and author API key' => [$domain, $authorApiKey];
|
yield 'domain found and author API key' => [$domain, $authorApiKey];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @test */
|
||||||
|
public function anExceptionIsThrowsWhenTryingToEditRedirectsForDefaultDomain(): void
|
||||||
|
{
|
||||||
|
$this->expectException(InvalidDomainException::class);
|
||||||
|
$this->expectExceptionMessage(
|
||||||
|
'You cannot configure default domain\'s redirects this way. Use the configuration or env vars.',
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->domainService->configureNotFoundRedirects('default.com', NotFoundRedirects::withoutRedirects());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
24
module/Core/test/Exception/InvalidDomainExceptionTest.php
Normal file
24
module/Core/test/Exception/InvalidDomainExceptionTest.php
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace ShlinkioTest\Shlink\Core\Exception;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use Shlinkio\Shlink\Core\Exception\InvalidDomainException;
|
||||||
|
|
||||||
|
class InvalidDomainExceptionTest extends TestCase
|
||||||
|
{
|
||||||
|
/** @test */
|
||||||
|
public function configuresTheExceptionAsExpected(): void
|
||||||
|
{
|
||||||
|
$e = InvalidDomainException::forDefaultDomainRedirects();
|
||||||
|
$expected = 'You cannot configure default domain\'s redirects this way. Use the configuration or env vars.';
|
||||||
|
|
||||||
|
self::assertEquals($expected, $e->getMessage());
|
||||||
|
self::assertEquals($expected, $e->getDetail());
|
||||||
|
self::assertEquals('Invalid domain', $e->getTitle());
|
||||||
|
self::assertEquals('INVALID_DOMAIN', $e->getType());
|
||||||
|
self::assertEquals(400, $e->getStatus());
|
||||||
|
}
|
||||||
|
}
|
@ -23,8 +23,6 @@ class DomainRedirectsAction extends AbstractRestAction
|
|||||||
|
|
||||||
public function handle(ServerRequestInterface $request): ResponseInterface
|
public function handle(ServerRequestInterface $request): ResponseInterface
|
||||||
{
|
{
|
||||||
// TODO Do not allow to set redirects for default domain. Or do allow. Check if there could be any issue
|
|
||||||
|
|
||||||
/** @var array $body */
|
/** @var array $body */
|
||||||
$body = $request->getParsedBody();
|
$body = $request->getParsedBody();
|
||||||
$requestData = DomainRedirectsRequest::fromRawData($body);
|
$requestData = DomainRedirectsRequest::fromRawData($body);
|
||||||
|
Loading…
Reference in New Issue
Block a user