diff --git a/module/Core/functions/functions.php b/module/Core/functions/functions.php index deea5f5f..5b6657d1 100644 --- a/module/Core/functions/functions.php +++ b/module/Core/functions/functions.php @@ -17,6 +17,7 @@ const MIN_SHORT_CODES_LENGTH = 4; const DEFAULT_REDIRECT_STATUS_CODE = StatusCodeInterface::STATUS_FOUND; const DEFAULT_REDIRECT_CACHE_LIFETIME = 30; const LOCAL_LOCK_FACTORY = 'Shlinkio\Shlink\LocalLockFactory'; +const CUSTOM_SLUGS_REGEXP = '/[^A-Za-z0-9._~]+/'; function generateRandomShortCode(int $length): string { diff --git a/module/Core/src/Validation/ShortUrlMetaInputFilter.php b/module/Core/src/Validation/ShortUrlMetaInputFilter.php index 4503117c..6d0cfffe 100644 --- a/module/Core/src/Validation/ShortUrlMetaInputFilter.php +++ b/module/Core/src/Validation/ShortUrlMetaInputFilter.php @@ -12,6 +12,7 @@ use Laminas\Validator; use Shlinkio\Shlink\Common\Validation; use Shlinkio\Shlink\Core\Util\CocurSymfonySluggerBridge; +use const Shlinkio\Shlink\Core\CUSTOM_SLUGS_REGEXP; use const Shlinkio\Shlink\Core\MIN_SHORT_CODES_LENGTH; class ShortUrlMetaInputFilter extends InputFilter @@ -49,8 +50,8 @@ class ShortUrlMetaInputFilter extends InputFilter // empty, is by using the deprecated setContinueIfEmpty $customSlug = $this->createInput(self::CUSTOM_SLUG, false)->setContinueIfEmpty(true); $customSlug->getFilterChain()->attach(new Validation\SluggerFilter(new CocurSymfonySluggerBridge(new Slugify([ - 'regexp' => '/[^A-Za-z0-9._~]+/', - 'lowercase' => false, + 'regexp' => CUSTOM_SLUGS_REGEXP, + 'lowercase' => false, // We want to keep it case sensitive ])))); $customSlug->getValidatorChain()->attach(new Validator\NotEmpty([ Validator\NotEmpty::STRING,