Blame view

vendor/yiisoft/yii2/validators/EmailValidator.php 4.21 KB
abf1649b   andryeyev   Чистая установка ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
  <?php
  /**
   * @link http://www.yiiframework.com/
   * @copyright Copyright (c) 2008 Yii Software LLC
   * @license http://www.yiiframework.com/license/
   */
  
  namespace yii\validators;
  
  use Yii;
  use yii\base\InvalidConfigException;
  use yii\web\JsExpression;
  use yii\helpers\Json;
  
  /**
   * EmailValidator validates that the attribute value is a valid email address.
   *
   * @author Qiang Xue <qiang.xue@gmail.com>
   * @since 2.0
   */
  class EmailValidator extends Validator
  {
      /**
       * @var string the regular expression used to validate the attribute value.
       * @see http://www.regular-expressions.info/email.html
       */
      public $pattern = '/^[a-zA-Z0-9!#$%&\'*+\\/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&\'*+\\/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?$/';
      /**
       * @var string the regular expression used to validate email addresses with the name part.
       * This property is used only when [[allowName]] is true.
       * @see allowName
       */
      public $fullPattern = '/^[^@]*<[a-zA-Z0-9!#$%&\'*+\\/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&\'*+\\/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?>$/';
      /**
       * @var boolean whether to allow name in the email address (e.g. "John Smith <john.smith@example.com>"). Defaults to false.
       * @see fullPattern
       */
      public $allowName = false;
      /**
       * @var boolean whether to check whether the email's domain exists and has either an A or MX record.
       * Be aware that this check can fail due to temporary DNS problems even if the email address is
       * valid and an email would be deliverable. Defaults to false.
       */
      public $checkDNS = false;
      /**
       * @var boolean whether validation process should take into account IDN (internationalized domain
       * names). Defaults to false meaning that validation of emails containing IDN will always fail.
       * Note that in order to use IDN validation you have to install and enable `intl` PHP extension,
       * otherwise an exception would be thrown.
       */
      public $enableIDN = false;
  
  
      /**
       * @inheritdoc
       */
      public function init()
      {
          parent::init();
          if ($this->enableIDN && !function_exists('idn_to_ascii')) {
              throw new InvalidConfigException('In order to use IDN validation intl extension must be installed and enabled.');
          }
          if ($this->message === null) {
              $this->message = Yii::t('yii', '{attribute} is not a valid email address.');
          }
      }
  
      /**
       * @inheritdoc
       */
      protected function validateValue($value)
      {
          // make sure string length is limited to avoid DOS attacks
          if (!is_string($value) || strlen($value) >= 320) {
              $valid = false;
          } elseif (!preg_match('/^(.*<?)(.*)@(.*?)(>?)$/', $value, $matches)) {
              $valid = false;
          } else {
              $domain = $matches[3];
              if ($this->enableIDN) {
                  $value = $matches[1] . idn_to_ascii($matches[2]) . '@' . idn_to_ascii($domain) . $matches[4];
              }
              $valid = preg_match($this->pattern, $value) || $this->allowName && preg_match($this->fullPattern, $value);
              if ($valid && $this->checkDNS) {
                  $valid = checkdnsrr($domain, 'MX') || checkdnsrr($domain, 'A');
              }
          }
  
          return $valid ? null : [$this->message, []];
      }
  
      /**
       * @inheritdoc
       */
      public function clientValidateAttribute($model, $attribute, $view)
      {
          $options = [
              'pattern' => new JsExpression($this->pattern),
              'fullPattern' => new JsExpression($this->fullPattern),
              'allowName' => $this->allowName,
              'message' => Yii::$app->getI18n()->format($this->message, [
                  'attribute' => $model->getAttributeLabel($attribute),
              ], Yii::$app->language),
              'enableIDN' => (bool) $this->enableIDN,
          ];
          if ($this->skipOnEmpty) {
              $options['skipOnEmpty'] = 1;
          }
  
          ValidationAsset::register($view);
          if ($this->enableIDN) {
              PunycodeAsset::register($view);
          }
  
          return 'yii.validation.email(value, messages, ' . Json::htmlEncode($options) . ');';
      }
  }