Security update to Drupal 8.4.6
[yaffs-website] / web / core / modules / link / src / Plugin / Validation / Constraint / LinkTypeConstraintValidator.php
1 <?php
2
3 namespace Drupal\link\Plugin\Validation\Constraint;
4
5 use Drupal\link\LinkItemInterface;
6 use Symfony\Component\Validator\Constraint;
7 use Symfony\Component\Validator\ConstraintValidator;
8
9 /**
10  * Constraint validator for links receiving data allowed by its settings.
11  */
12 class LinkTypeConstraintValidator extends ConstraintValidator {
13
14   /**
15    * {@inheritdoc}
16    */
17   public function validate($value, Constraint $constraint) {
18     if (isset($value)) {
19       $uri_is_valid = TRUE;
20
21       /** @var $link_item \Drupal\link\LinkItemInterface */
22       $link_item = $value;
23       $link_type = $link_item->getFieldDefinition()->getSetting('link_type');
24
25       // Try to resolve the given URI to a URL. It may fail if it's schemeless.
26       try {
27         $url = $link_item->getUrl();
28       }
29       catch (\InvalidArgumentException $e) {
30         $uri_is_valid = FALSE;
31       }
32
33       // If the link field doesn't support both internal and external links,
34       // check whether the URL (a resolved URI) is in fact violating either
35       // restriction.
36       if ($uri_is_valid && $link_type !== LinkItemInterface::LINK_GENERIC) {
37         if (!($link_type & LinkItemInterface::LINK_EXTERNAL) && $url->isExternal()) {
38           $uri_is_valid = FALSE;
39         }
40         if (!($link_type & LinkItemInterface::LINK_INTERNAL) && !$url->isExternal()) {
41           $uri_is_valid = FALSE;
42         }
43       }
44
45       if (!$uri_is_valid) {
46         $this->context->addViolation($constraint->message, ['@uri' => $link_item->uri]);
47       }
48     }
49   }
50
51 }