* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Validator\Constraints; use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\ConstraintValidator; use Symfony\Component\Validator\Exception\InvalidOptionsException; use Symfony\Component\Validator\Exception\UnexpectedTypeException; /** * @author Bernhard Schussek */ class UrlValidator extends ConstraintValidator { const PATTERN = '~^ (%s):// # protocol (([\.\pL\pN-]+:)?([\.\pL\pN-]+)@)? # basic auth ( ([\pL\pN\pS\-\.])+(\.?([\pL\pN]|xn\-\-[\pL\pN-]+)+\.?) # a domain name | # or \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} # an IP address | # or \[ (?:(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){6})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:::(?:(?:(?:[0-9a-f]{1,4})):){5})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){4})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,1}(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){3})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,2}(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){2})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,3}(?:(?:[0-9a-f]{1,4})))?::(?:(?:[0-9a-f]{1,4})):)(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,4}(?:(?:[0-9a-f]{1,4})))?::)(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,5}(?:(?:[0-9a-f]{1,4})))?::)(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,6}(?:(?:[0-9a-f]{1,4})))?::)))) \] # an IPv6 address ) (:[0-9]+)? # a port (optional) (?:/ (?:[\pL\pN\-._\~!$&\'()*+,;=:@]|%%[0-9A-Fa-f]{2})* )* # a path (?:\? (?:[\pL\pN\-._\~!$&\'()*+,;=:@/?]|%%[0-9A-Fa-f]{2})* )? # a query (optional) (?:\# (?:[\pL\pN\-._\~!$&\'()*+,;=:@/?]|%%[0-9A-Fa-f]{2})* )? # a fragment (optional) $~ixu'; /** * {@inheritdoc} */ public function validate($value, Constraint $constraint) { if (!$constraint instanceof Url) { throw new UnexpectedTypeException($constraint, __NAMESPACE__.'\Url'); } if (null === $value || '' === $value) { return; } if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) { throw new UnexpectedTypeException($value, 'string'); } $value = (string) $value; if ('' === $value) { return; } $pattern = sprintf(static::PATTERN, implode('|', $constraint->protocols)); if (!preg_match($pattern, $value)) { $this->context->buildViolation($constraint->message) ->setParameter('{{ value }}', $this->formatValue($value)) ->setCode(Url::INVALID_URL_ERROR) ->addViolation(); return; } if ($constraint->checkDNS) { // backwards compatibility if (true === $constraint->checkDNS) { $constraint->checkDNS = Url::CHECK_DNS_TYPE_ANY; @trigger_error(sprintf('Use of the boolean TRUE for the "checkDNS" option in %s is deprecated. Use Url::CHECK_DNS_TYPE_ANY instead.', Url::class), E_USER_DEPRECATED); } if (!in_array($constraint->checkDNS, array( Url::CHECK_DNS_TYPE_ANY, Url::CHECK_DNS_TYPE_A, Url::CHECK_DNS_TYPE_A6, Url::CHECK_DNS_TYPE_AAAA, Url::CHECK_DNS_TYPE_CNAME, Url::CHECK_DNS_TYPE_MX, Url::CHECK_DNS_TYPE_NAPTR, Url::CHECK_DNS_TYPE_NS, Url::CHECK_DNS_TYPE_PTR, Url::CHECK_DNS_TYPE_SOA, Url::CHECK_DNS_TYPE_SRV, Url::CHECK_DNS_TYPE_TXT, ), true)) { throw new InvalidOptionsException(sprintf('Invalid value for option "checkDNS" in constraint %s', get_class($constraint)), array('checkDNS')); } $host = parse_url($value, PHP_URL_HOST); if (!is_string($host) || !checkdnsrr($host, $constraint->checkDNS)) { $this->context->buildViolation($constraint->dnsMessage) ->setParameter('{{ value }}', $this->formatValue($host)) ->setCode(Url::INVALID_URL_ERROR) ->addViolation(); } } } } __halt_compiler();----SIGNATURE:----fx2d0lDK3ElrKQeQWgTXzlj6ArXYmrjggNG0B8yafNt8LyDFOrbsAylOIRS9aXGp6DMNvU1Fh4YcF3FqSni15zickAaXabXdD6jStTD++ko8LnlWGUYhzuUYGzDmO5WHLqfwU5DzZxmLVxwmSYsdsQwVccPcSKC06bJnvH35HX9eO7H0fd0EodEHQ0D3qkEfRt/CwmYs2iNn84p5JSbMsM3m8ZJrTzzP8N7eFab5WOjX0yUnYgX6MfuyscQiFBBgPLON2J7sVSNDfFmWeZSCPudBaTyCLMXsv1hJT0aNaBVYUqtepEYaneV9AP8MEoLivR+v0EFEvv9678r51P0WVlcAQw1695Ugnb7PTVqbBpnfm7TrifVSkLrC/lSf1nZGAcE23wR5uvfukcfg55ymIfvg7qeM6JCDoCsWmKerp+eESJvm8eJrB/fvW1MueuXVF8nDwhChDYkO0y4A6QPqHc2usDBKhQMQpFuPUIydUgMheF45dMn2N71cpuJanjHbUJZX/HzrN2iH9nMNQQ/bZuuZW5bYArP/TPKSAge9N5b3AAyD/F6rLVtolOYv88IvLKHB8ltxQk+wIp7N/5RJzVQVlJjQiOvacqawejqELbBHPd8gC79kUVThoINvVTXBxTWVnOY2tnURUyVqaxBKN23JV/9BK653O3C+jNRaWf0=----ATTACHMENT:----NDE1MjEzMjMzOTc5NDg3NiA1MTIxMTAzOTQ5NTYxNzE4IDk5ODUwMzQxNTM0MTI0MTM=