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: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427: 428: 429: 430: 431: 432: 433: 434: 435: 436: 437: 438: 439: 440: 441: 442: 443: 444: 445: 446: 447: 448: 449: 450: 451: 452: 453: 454: 455: 456: 457: 458: 459: 460: 461: 462: 463: 464: 465: 466: 467: 468: 469: 470: 471: 472: 473: 474: 475: 476: 477: 478: 479: 480: 481: 482: 483: 484: 485: 486: 487: 488: 489: 490: 491: 492: 493: 494: 495: 496: 497: 498: 499: 500: 501: 502: 503: 504: 505: 506: 507: 508: 509: 510: 511: 512: 513: 514: 515: 516: 517: 518: 519: 520: 521: 522: 523: 524: 525: 526: 527: 528: 529: 530: 531: 532: 533: 534: 535: 536: 537: 538: 539: 540: 541: 542: 543: 544: 545: 546: 547: 548: 549: 550: 551: 552: 553: 554: 555: 556: 557: 558:
<?php
/**
* MvcCore
*
* This source file is subject to the BSD 3 License
* For the full copyright and license information, please view
* the LICENSE.md file that are distributed with this source code.
*
* @copyright Copyright (c) 2016 Tom Flidr (https://github.com/mvccore)
* @license https://mvccore.github.io/docs/mvccore/5.0.0/LICENCE.md
*/
namespace MvcCore\Ext\Forms\Validators;
/**
* Responsibility: Validate raw user password by configured password strength
* rules. Password still could contain very dangerous
* characters for XSS, SQL or any other attacks. Be careful!!!
* This doesn't escape everything. It only check if configured
* character groups are presented and how much and that's all.
*/
class Password extends \MvcCore\Ext\Forms\Validator {
/**
* Default minimum password characters length - 12.
*/
const MIN_LENGTH = 12;
/**
* Default maximum password characters length - 255.
*/
const MAX_LENGTH = 255;
/**
* Default special characters collection - !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~.
*/
const SPECIAL_CHARS = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~';
/**
* Default lower case chars count presented in password - 1;
*/
const MIN_LOWERCASE_CHARS_COUNT = 1;
/**
* Default upper case chars count presented in password - 1;
*/
const MIN_UPPERCASE_CHARS_COUNT = 1;
/**
* Default digit chars count presented in password - 1;
*/
const MIN_DIGIT_CHARS_COUNT = 1;
/**
* Default special chars count presented in password - 1;
*/
const MIN_SPECIAL_CHARS_COUNT = 1;
/**
* Error message index(es).
* @var int
*/
const ERROR_MIN_LENGTH = 0;
const ERROR_MAX_LENGTH = 1;
const ERROR_LOWERCASE_CHARS = 2;
const ERROR_LOWERCASE_CHARS_MIN = 3;
const ERROR_UPPERCASE_CHARS = 4;
const ERROR_UPPERCASE_CHARS_MIN = 5;
const ERROR_DIGIT_CHARS = 6;
const ERROR_DIGIT_CHARS_MIN = 7;
const ERROR_SPECIAL_CHARS = 8;
const ERROR_SPECIAL_CHARS_MIN = 9;
/**
* Global minimum password characters length, default value is 12.
* @var int
*/
protected $mustHaveMinLength = self::MIN_LENGTH;
/**
* Global maximum password characters length, default value is 255.
* @var int
*/
protected $mustHaveMaxLength = self::MAX_LENGTH;
/**
* Password strength rule to have any lower case character presented in password.
* Default value is `TRUE` to must have lower case character in password.
* Lower case characters from latin alphabet: abcdefghijklmnopqrstuvwxyz.
* @var bool
*/
protected $mustHaveLowerCaseChars = TRUE;
/**
* Password strength rule to have minimum lower case characters count presented in password.
* Default value is `1` to must have at least one lower case character in password.
* Lower case characters from latin alphabet: abcdefghijklmnopqrstuvwxyz.
* @var int
*/
protected $mustHaveLowerCaseCharsCount = self::MIN_LOWERCASE_CHARS_COUNT;
/**
* Password strength rule to have any upper case character presented in password.
* Default value is `TRUE` to must have upper case character in password.
* Upper case characters from latin alphabet: ABCDEFGHIJKLMNOPQRSTUVWXYZ.
* @var bool
*/
protected $mustHaveUpperCaseChars = TRUE;
/**
* Password strength rule to have minimum upper case characters count presented in password.
* Default value is `1` to must have at least one upper case character in password.
* Upper case characters from latin alphabet: ABCDEFGHIJKLMNOPQRSTUVWXYZ.
* @var int
*/
protected $mustHaveUpperCaseCharsCount = self::MIN_UPPERCASE_CHARS_COUNT;
/**
* Password strength rule to have any digit presented in password.
* Default value is `TRUE` to must have digit characters in password.
* Digit (arabian) characters from arabian alphabet: 0123456789.
* @var bool
*/
protected $mustHaveDigits = TRUE;
/**
* Password strength rule to have minimum digits count presented in password.
* Default value is `1` to must have at least one digit character in password.
* Digit (arabian) characters from arabian alphabet: 0123456789.
* @var int
*/
protected $mustHaveDigitsCount = self::MIN_DIGIT_CHARS_COUNT;
/**
* Password strength rule to have any special character presented in password.
* Default value is `TRUE` to must have special character in password.
* Default special characters are: !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~.
*
* It's possible to configure own collection of special characters to check
* if any of them is presented in password by method:
* `$validator->SetSpecialChars('...');` or by constructor configuration record:
* `new \MvcCore\Ext\Forms\Validators\Password(['specialChars' => '...']);
* @var bool
*/
protected $mustHaveSpecialChars = TRUE;
/**
* Password strength rule to have minimum special characters count presented in password.
* Default value is `1` to must have at least one special character in password.
* Default special characters are: !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~.
*
* It's possible to configure own collection of special characters to check
* if any of them is presented in password by method:
* `$validator->SetSpecialChars('...');` or by constructor configuration record:
* `new \MvcCore\Ext\Forms\Validators\Password(['specialChars' => '...']);
* @var int
*/
protected $mustHaveSpecialCharsCount = self::MIN_SPECIAL_CHARS_COUNT;
/**
* Special characters collection to check if any of them is presented in password.
* Default special characters are: !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~.
*
* It's possible to configure own collection of special characters to check
* if any of them is presented in password by method:
* `$validator->SetSpecialChars('...');` or by constructor configuration record:
* `new \MvcCore\Ext\Forms\Validators\Password(['specialChars' => '...']);
* @var string
*/
protected $specialChars = self::SPECIAL_CHARS;
/**
* Validation failure message template definitions.
* @var array
*/
protected static $errorMessages = [
self::ERROR_MIN_LENGTH => "Password must have a minimum length of {1} characters.",
self::ERROR_MAX_LENGTH => "Password must have a maximum length of {1} characters.",
self::ERROR_LOWERCASE_CHARS => "Password must contain lower case characters ({1}).",
self::ERROR_LOWERCASE_CHARS_MIN => "Password must contain at minimum {1} lower case characters ({2}).",
self::ERROR_UPPERCASE_CHARS => "Password must contain upper case characters ({1}).",
self::ERROR_UPPERCASE_CHARS_MIN => "Password must contain at minimum {1} upper case characters ({2}).",
self::ERROR_DIGIT_CHARS => "Password must contain digits ({1}).",
self::ERROR_DIGIT_CHARS_MIN => "Password must contain at minimum {1} digits ({2}).",
self::ERROR_SPECIAL_CHARS => "Password must contain special characters ( {1} ).",
self::ERROR_SPECIAL_CHARS_MIN => "Password must contain at minimum {1} special characters ( {2} ).",
];
/**
* Get global minimum password characters length, default value is 12.
* @return int
*/
public function GetMustHaveMinLength () {
return $this->mustHaveMinLength;
}
/**
* Set global minimum password characters length, default value is 12.
* @param int $mustHaveMinLength
* @return \MvcCore\Ext\Forms\Validators\Password
*/
public function SetMustHaveMinLength ($mustHaveMinLength = self::MIN_LENGTH) {
/** @var $this \MvcCore\Ext\Forms\Validator */
$this->mustHaveMinLength = $mustHaveMinLength;
return $this;
}
/**
* Get global maximum password characters length, default value is 255.
* @return int
*/
public function GetMustHaveMaxLength () {
return $this->mustHaveMaxLength;
}
/**
* Set global maximum password characters length, default value is 255.
* @param int $mustHaveMaxLength
* @return \MvcCore\Ext\Forms\Validators\Password
*/
public function SetMustHaveMaxLength ($mustHaveMaxLength = self::MAX_LENGTH) {
/** @var $this \MvcCore\Ext\Forms\Validator */
$this->mustHaveMaxLength = $mustHaveMaxLength;
return $this;
}
/**
* Get password strength rule to have any lower case character presented in password.
* Default value is `TRUE` to must have lower case character in password.
* Lower case characters from latin alphabet: abcdefghijklmnopqrstuvwxyz.
*
* This function returns array with the rule `boolean` as first item and
* second item is minimum lower case characters count i n password as `integer`.
* If you set function first argument to `FALSE`, function returns only array
* `[TRUE]`, if the rule is `TRUE` or an empty array `[]` if the rule is `FALSE`.
* @param bool $getWithMinCount
* @return array
*/
public function GetMustHaveLowerCaseChars ($getWithMinCount = TRUE) {
if ($getWithMinCount)
return [$this->mustHaveLowerCaseChars, $this->mustHaveLowerCaseCharsCount];
return $this->mustHaveLowerCaseChars ? [TRUE] : [];
}
/**
* Set password strength rule to have any lower case character presented in password.
* Default value is `TRUE` to must have lower case character in password.
* Lower case characters from latin alphabet: abcdefghijklmnopqrstuvwxyz.
*
* Function has second argument to set minimum lower case characters in password.
* Default value is at least one lower case character in password.
* @param bool $mustHaveLowerCaseChars
* @param int $minCount
* @return \MvcCore\Ext\Forms\Validators\Password
*/
public function SetMustHaveLowerCaseChars ($mustHaveLowerCaseChars = TRUE, $minCount = self::MIN_LOWERCASE_CHARS_COUNT) {
/** @var $this \MvcCore\Ext\Forms\Validator */
$this->mustHaveLowerCaseChars = $mustHaveLowerCaseChars;
$this->mustHaveLowerCaseCharsCount = $minCount;
return $this;
}
/**
* Get password strength rule to have any upper case character presented in password.
* Default value is `TRUE` to must have upper case character in password.
* Upper case characters from latin alphabet: abcdefghijklmnopqrstuvwxyz.
*
* This function returns array with the rule `boolean` as first item and
* second item is minimum upper case characters count i n password as `integer`.
* If you set function first argument to `FALSE`, function returns only array
* `[TRUE]`, if the rule is `TRUE` or an empty array `[]` if the rule is `FALSE`.
* @param bool $getWithMinCount
* @return array
*/
public function GetMustHaveUpperCaseChars ($getWithMinCount = TRUE) {
if ($getWithMinCount)
return [$this->mustHaveUpperCaseChars, $this->mustHaveUpperCaseCharsCount];
return $this->mustHaveUpperCaseChars ? [TRUE] : [];
}
/**
* Set password strength rule to have any upper case character presented in password.
* Default value is `TRUE` to must have upper case character in password.
* Upper case characters from latin alphabet: abcdefghijklmnopqrstuvwxyz.
*
* Function has second argument to set minimum upper case characters in password.
* Default value is at least one upper case character in password.
* @param bool $mustHaveUpperCaseChars
* @param int $minCount
* @return \MvcCore\Ext\Forms\Validators\Password
*/
public function SetMustHaveUpperCaseChars ($mustHaveUpperCaseChars = TRUE, $minCount = self::MIN_UPPERCASE_CHARS_COUNT) {
/** @var $this \MvcCore\Ext\Forms\Validator */
$this->mustHaveUpperCaseChars = $mustHaveUpperCaseChars;
$this->mustHaveUpperCaseCharsCount = $minCount;
return $this;
}
/**
* Get password strength rule to have any digit presented in password.
* Default value is `TRUE` to must have digit characters in password.
* Digit (arabian) characters from arabian alphabet: 0123456789.
*
* This function returns array with the rule `boolean` as first item and
* second item is minimum digit characters count i n password as `integer`.
* If you set function first argument to `FALSE`, function returns only array
* `[TRUE]`, if the rule is `TRUE` or an empty array `[]` if the rule is `FALSE`.
* @param bool $getWithMinCount
* @return array|bool
*/
public function GetMustHaveDigits ($getWithMinCount = TRUE) {
if ($getWithMinCount)
return [$this->mustHaveDigits, $this->mustHaveDigitsCount];
return $this->mustHaveDigits ? [TRUE] : [];
}
/**
* Set password strength rule to have any digit presented in password.
* Default value is `TRUE` to must have digit characters in password.
* Digit (arabian) characters from arabian alphabet: 0123456789.
*
* Function has second argument to set minimum digit characters in password.
* Default value is at least one digit character in password.
* @param bool $mustHaveDigits
* @param int $minCount
* @return \MvcCore\Ext\Forms\Validators\Password
*/
public function SetMustHaveDigits ($mustHaveDigits = TRUE, $minCount = self::MIN_DIGIT_CHARS_COUNT) {
/** @var $this \MvcCore\Ext\Forms\Validator */
$this->mustHaveDigits = $mustHaveDigits;
$this->mustHaveDigitsCount = $minCount;
return $this;
}
/**
* Get password strength rule to have any special character presented in password.
* Default value is `TRUE` to must have special character in password.
* Default special characters are: !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~.
*
* This function returns array with the rule `boolean` as first item and
* second item is minimum special characters count i n password as `integer`.
* If you set function first argument to `FALSE`, function returns only array
* `[TRUE]`, if the rule is `TRUE` or an empty array `[]` if the rule is `FALSE`.
*
* It's possible to configure own collection of special characters to check
* if any of them is presented in password by method:
* `$validator->SetSpecialChars('...');` or by constructor configuration record:
* `new \MvcCore\Ext\Forms\Validators\Password(['specialChars' => '...']);
* @param bool $getWithMinCount
* @return array|bool
*/
public function GetMustHaveSpecialChars ($getWithMinCount = TRUE) {
if ($getWithMinCount)
return [$this->mustHaveSpecialChars, $this->mustHaveSpecialCharsCount];
return $this->mustHaveSpecialChars;
}
/**
* Set password strength rule to have any special character presented in password.
* Default value is `TRUE` to must have special character in password.
* Default special characters are: !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~.
*
* Function has second argument to set minimum special characters in password.
* Default value is at least one digit character in password.
*
* It's possible to configure own collection of special characters to check
* if any of them is presented in password by method:
* `$validator->SetSpecialChars('...');` or by constructor configuration record:
* `new \MvcCore\Ext\Forms\Validators\Password(['specialChars' => '...']);
* @param bool $mustHaveSpecialChars
* @param int $minCount
* @return \MvcCore\Ext\Forms\Validators\Password
*/
public function SetMustHaveSpecialChars ($mustHaveSpecialChars = TRUE, $minCount = self::MIN_SPECIAL_CHARS_COUNT) {
/** @var $this \MvcCore\Ext\Forms\Validator */
$this->mustHaveSpecialChars = $mustHaveSpecialChars;
$this->mustHaveSpecialCharsCount = $minCount;
return $this;
}
/**
* Get special characters collection to check if any of them is presented in password.
* Default special characters are: !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~.
* @return string
*/
public function GetSpecialChars () {
return $this->specialChars;
}
/**
* Set special characters collection to check if any of them is presented in password.
* Default special characters are: !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~.
*
* It's possible to configure own collection of special characters to check
* if any of them is presented in password by this method:
* `$validator->SetSpecialChars('...');` or by constructor configuration record:
* `new \MvcCore\Ext\Forms\Validators\Password(['specialChars' => '...']);
* @param string $specialChars
* @return \MvcCore\Ext\Forms\Validators\Password
*/
public function SetSpecialChars ($specialChars = self::SPECIAL_CHARS) {
/** @var $this \MvcCore\Ext\Forms\Validator */
$this->specialChars = $specialChars;
return $this;
}
/**
* Create new password strength rules validator instance.
* This validator accepts first argument to be an array with camel case
* keyed records representing protected properties (password strength rules)
* you need to configure.
* Example:
* ```
* $validator = new \MvcCore\Ext\Forms\Validators\Password([
* 'mustHaveMinLength' => 12,
* 'mustHaveMaxLength' => 255,
* 'mustHaveLowerCaseChars' => TRUE,
* 'mustHaveLowerCaseCharsCount' => 1,
* 'mustHaveUpperCaseChars' => TRUE,
* 'mustHaveUpperCaseCharsCount' => 1,
* 'mustHaveDigits' => TRUE,
* 'mustHaveDigitsCount' => 1,
* 'mustHaveSpecialChars' => TRUE,
* 'mustHaveSpecialCharsCount' => 1,
* 'specialChars' => '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~',
* );
* ```
* @param array $cfg
* @return void
*/
public function __construct (array $cfg = []) {
foreach ($cfg as $propertyName => $propertyValue) {
if (!property_exists($this, $propertyName)) {
$this->throwNewInvalidArgumentException(
'Property `'.$propertyName.'` is not possible '
.'to configure by constructor `$cfg` param. '
. 'There is only possible to configure properties: `'
. implode('`, `', [
'mustHaveMinLength:int',
'mustHaveMaxLength:int',
'mustHaveLowerCaseChars:bool',
'mustHaveLowerCaseCharsCount:int',
'mustHaveUpperCaseChars:bool',
'mustHaveUpperCaseCharsCount:int',
'mustHaveDigits:bool',
'mustHaveDigitsCount:int',
'mustHaveSpecialChars:bool',
'mustHaveSpecialCharsCount:int',
'specialChars:string',
]) . '`.'
);
} else {
settype($propertyValue, gettype($this->{$propertyName}));
$this->{$propertyName} = $propertyValue;
}
}
}
/**
* Validate raw user password by configured rules. Password still could contain
* very dangerous characters for XSS, SQL or any other attacks. Be careful!!!
* @param string|array $rawSubmittedValue Raw submitted value from user.
* @return string|NULL Safe submitted value or `NULL` if not possible to return safe value.
*/
public function Validate ($rawSubmittedValue) {
$password = trim((string) $rawSubmittedValue);
$passwordLength = mb_strlen($password);
if ($passwordLength === 0) return NULL;
// check password global minimum and maximum length:
if ($passwordLength < $this->mustHaveMinLength)
$this->field->AddValidationError(
static::GetErrorMessage(static::ERROR_MIN_LENGTH),
[$this->mustHaveMinLength]
);
if ($passwordLength > $this->mustHaveMaxLength) {
$password = mb_substr($password, 0, $this->mustHaveMaxLength);
$this->field->AddValidationError(
static::GetErrorMessage(static::ERROR_MAX_LENGTH),
[$this->mustHaveMaxLength]
);
}
// check password lower case characters and minimum lower case characters count if necessary:
if ($this->mustHaveLowerCaseChars) {
$lowerCaseChars = preg_replace('#[^a-z]#', '', $password);
$lowerCaseCharsCount = strlen($lowerCaseChars);
if ($this->mustHaveLowerCaseCharsCount > 1 && $lowerCaseCharsCount < $this->mustHaveLowerCaseCharsCount) {
$this->field->AddValidationError(
static::GetErrorMessage(static::ERROR_LOWERCASE_CHARS_MIN),
[$this->mustHaveLowerCaseCharsCount, '[a-z]']
);
} else if ($lowerCaseCharsCount === 0) {
$this->field->AddValidationError(
static::GetErrorMessage(static::ERROR_LOWERCASE_CHARS),
['[a-z]']
);
}
}
// check password upper case characters and minimum upper case characters count if necessary:
if ($this->mustHaveUpperCaseChars) {
$upperCaseChars = preg_replace('#[^A-Z]#', '', $password);
$upperCaseCharsCount = strlen($upperCaseChars);
if ($this->mustHaveUpperCaseCharsCount > 1 && $upperCaseCharsCount < $this->mustHaveUpperCaseCharsCount) {
$this->field->AddValidationError(
static::GetErrorMessage(static::ERROR_UPPERCASE_CHARS_MIN),
[$this->mustHaveUpperCaseCharsCount, '[A-Z]']
);
} else if ($upperCaseCharsCount === 0) {
$this->field->AddValidationError(
static::GetErrorMessage(static::ERROR_UPPERCASE_CHARS),
['[A-Z]']
);
}
}
// check password digit characters and minimum digit characters count if necessary:
if ($this->mustHaveDigits) {
$digitChars = preg_replace('#[^0-9]#', '', $password);
$digitCharsCount = strlen($digitChars);
if ($this->mustHaveDigitsCount > 1 && $digitCharsCount < $this->mustHaveDigitsCount) {
$this->field->AddValidationError(
static::GetErrorMessage(static::ERROR_DIGIT_CHARS_MIN),
[$this->mustHaveDigitsCount, '[0-9]']
);
} else if ($digitCharsCount === 0) {
$this->field->AddValidationError(
static::GetErrorMessage(static::ERROR_DIGIT_CHARS),
['[0-9]']
);
}
}
// check password special characters and minimum special characters count if necessary:
if ($this->mustHaveSpecialChars) {
$specialCharsArr = str_split($this->specialChars);
$passwordCharsArr = str_split($password);
$specialChars = array_intersect($passwordCharsArr, $specialCharsArr);
$specialCharsCount = count($specialChars);
if ($this->mustHaveSpecialCharsCount > 1 && $specialCharsCount < $this->mustHaveSpecialCharsCount) {
$this->field->AddValidationError(
static::GetErrorMessage(static::ERROR_SPECIAL_CHARS_MIN),
[$this->mustHaveSpecialCharsCount, htmlspecialchars($this->specialChars, ENT_QUOTES)]
);
} else if ($specialCharsCount === 0) {
$this->field->AddValidationError(
static::GetErrorMessage(static::ERROR_SPECIAL_CHARS),
[htmlspecialchars($this->specialChars, ENT_QUOTES)]
);
}
}
return $password;
}
}