. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License version 3. * * In accordance with Section 7(b) of the GNU Affero General Public License version 3, * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ namespace Espo\Tools\UserSecurity\Password; use SensitiveParameter; class Checker { private const SPECIAL_CHARACTERS = "'-!\"#$%&()*,./:;?@[]^_`{|}~+<=>"; public function __construct( private ConfigProvider $configProvider, ) {} public function checkStrength(#[SensitiveParameter] string $password): bool { $minLength = $this->configProvider->getStrengthLength(); if ($minLength) { if (mb_strlen($password) < $minLength) { return false; } } $requiredLetterCount = $this->configProvider->getStrengthLetterCount(); if ($requiredLetterCount) { $letterCount = 0; foreach (str_split($password) as $c) { if (ctype_alpha($c)) { $letterCount++; } } if ($letterCount < $requiredLetterCount) { return false; } } $requiredNumberCount = $this->configProvider->getStrengthNumberCount(); if ($requiredNumberCount) { $numberCount = 0; foreach (str_split($password) as $c) { if (is_numeric($c)) { $numberCount++; } } if ($numberCount < $requiredNumberCount) { return false; } } $bothCases = $this->configProvider->getStrengthBothCases(); if ($bothCases) { $ucCount = 0; $lcCount = 0; foreach (str_split($password) as $c) { if (ctype_alpha($c) && $c === mb_strtoupper($c)) { $ucCount++; } if (ctype_alpha($c) && $c === mb_strtolower($c)) { $lcCount++; } } if (!$ucCount || !$lcCount) { return false; } } $specialCharacterCount = $this->configProvider->getStrengthSpecialCharacterCount(); if ($specialCharacterCount) { $realSpecialCharacterCount = 0; foreach (str_split($password) as $c) { if (str_contains(self::SPECIAL_CHARACTERS, $c)) { $realSpecialCharacterCount++; } } if ($realSpecialCharacterCount < $specialCharacterCount) { return false; } } return true; } }