diff --git a/snappymail/v/0.0.0/app/libraries/MailSo/Base/Utils.php b/snappymail/v/0.0.0/app/libraries/MailSo/Base/Utils.php index 71fe68ed2..133c6b57c 100644 --- a/snappymail/v/0.0.0/app/libraries/MailSo/Base/Utils.php +++ b/snappymail/v/0.0.0/app/libraries/MailSo/Base/Utils.php @@ -165,16 +165,6 @@ abstract class Utils || !\preg_match('/[^\x09\x10\x13\x0A\x0D\x20-\x7E]/', $sValue); } - private static function StrMailDomainToLower(string $sValue) : string - { - $aParts = \explode('@', $sValue); - if ($iLast) { - $iLast = \count($aParts) - 1; - $aParts[$iLast] = \mb_strtolower($aParts[$iLast]); - } - return \implode('@', $aParts); - } - public static function StripSpaces(string $sValue) : string { return static::Trim( @@ -421,19 +411,14 @@ abstract class Utils public static function GetAccountNameFromEmail(string $sEmail) : string { - $sResult = ''; - if (\strlen($sEmail)) { - $iPos = \strrpos($sEmail, '@'); - $sResult = (false === $iPos) ? $sEmail : \substr($sEmail, 0, $iPos); - } - - return $sResult; + $iPos = \strrpos($sEmail, '@'); + return (false === $iPos) ? $sEmail : \substr($sEmail, 0, $iPos); } public static function GetDomainFromEmail(string $sEmail) : string { - $aParts = \explode('@', $sEmail); - return isset($aParts[1]) ? \array_pop($aParts) : ''; + $iPos = \strrpos($sEmail, '@'); + return (false === $iPos) ? '' : \substr($sEmail, $iPos + 1); } public static function GetClearDomainName(string $sDomain) : string @@ -693,17 +678,16 @@ abstract class Utils /** * Converts xn--du8h.snappymail.eu to 📧.snappymail.eu */ - public static function IdnToUtf8(string $sStr, bool $bLowerCase = false) : string + public static function IdnToUtf8(string $sStr) : string { - if (\strlen($sStr) && \preg_match('/(^|\.|@)xn--/i', $sStr)) { + if (\preg_match('/(^|\.|@)xn--/i', $sStr)) { try { $sStr = \SnappyMail\IDN::anyToUtf8($sStr); } catch (\Throwable $oException) {} } - - return $bLowerCase ? static::StrMailDomainToLower($sStr) : $sStr; + return $sStr; } /** diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Model/Domain.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Model/Domain.php index d40b7ca7d..77e2b6060 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Model/Domain.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Model/Domain.php @@ -102,21 +102,26 @@ class Domain implements \JsonSerializable $this->aliasName = \strtolower(\idn_to_ascii($sAliasName)); } - public function ValidateWhiteList(string $sEmail, string $sLogin = '') : bool + public function ValidateWhiteList(string $sEmail, string $sLogin) : bool { $sW = \trim($this->whiteList); - if (\strlen($sW)) - { - $sEmail = \MailSo\Base\Utils::IdnToUtf8($sEmail, true); - $sLogin = \MailSo\Base\Utils::IdnToUtf8($sLogin, true); - - $sW = \preg_replace('/([^\s]+)@[^\s]*/', '$1', $sW); - $sW = ' '.\trim(\preg_replace('/[\s;,\r\n\t]+/', ' ', $sW)).' '; - - $sUserPart = \MailSo\Base\Utils::GetAccountNameFromEmail(\strlen($sLogin) ? $sLogin : $sEmail); - return false !== \stripos($sW, ' '.$sUserPart.' '); + if ($sW) { + $sEmail = \mb_strtolower($sEmail); + $sLogin = \mb_strtolower($sLogin); + $sUserPart = \MailSo\Base\Utils::GetAccountNameFromEmail($sLogin ?: $sEmail); + $sItem = \strtok($sW, " ;,\n"); + while (false !== $sItem) { + $sItem = \mb_strtolower(\idn_to_ascii(\trim($sItem))); + if ($sItem && ( + $sLogin === $sItem || $sEmail === $sItem + || $sUserPart === $sItem || \str_starts_with($sItem, "{$sUserPart}@") + )) { + return true; + } + $sItem = \strtok(" ;,\n"); + } + return false; } - return true; }