IDNA support (beta)

This commit is contained in:
RainLoop Team 2014-05-13 20:13:55 +04:00
parent 0ca00dec40
commit e82108ac85
31 changed files with 3839 additions and 308 deletions

View file

@ -117,7 +117,7 @@ class Property
// lower
if ($this->IsEmail())
{
$this->Value = \strtolower($this->Value);
$this->Value = \MailSo\Base\Utils::StrToLowerIfAscii($this->Value);
}
// phones clear value for searching

View file

@ -620,7 +620,7 @@ class PdoAddressBook
)
);
$sLast = $this->lastInsertId('rainloop_ab_contacts', 'id_contact');
$sLast = $this->lastInsertId('rainloop_ab_tags', 'id_tag');
if (\is_numeric($sLast) && 0 < (int) $sLast)
{
$mResult = (int) $sLast;
@ -1382,7 +1382,7 @@ class PdoAddressBook
{
if ($aItem && !empty($aItem['prop_value']))
{
$aExists[] = \strtolower(\trim($aItem['prop_value']));
$aExists[] = \MailSo\Base\Utils::StrToLowerIfAscii(\trim($aItem['prop_value']));
}
}
}
@ -1391,7 +1391,7 @@ class PdoAddressBook
$aEmailsToCreate = \array_filter($aEmailsObjects, function ($oItem) use ($aExists, &$aEmailsToUpdate) {
if ($oItem)
{
$sEmail = \strtolower(\trim($oItem->GetEmail()));
$sEmail = \trim($oItem->GetEmail(true));
if (0 < \strlen($sEmail))
{
$aEmailsToUpdate[] = $sEmail;
@ -1408,7 +1408,7 @@ class PdoAddressBook
{
if ($oItem)
{
$sEmailUpdate = \strtolower(\trim($oItem->GetEmail()));
$sEmailUpdate = \trim($oItem->GetEmail(true));
if (0 < \strlen($sEmailUpdate))
{
$aEmailsToUpdate[] = $sEmailUpdate;
@ -1428,7 +1428,7 @@ class PdoAddressBook
{
$oPropEmail = new \RainLoop\Providers\AddressBook\Classes\Property();
$oPropEmail->Type = \RainLoop\Providers\AddressBook\Enumerations\PropertyType::EMAIl;
$oPropEmail->Value = \strtolower(\trim($oEmail->GetEmail()));
$oPropEmail->Value = \trim($oEmail->GetEmail(true));
$oContact->Properties[] = $oPropEmail;
}
@ -1439,7 +1439,7 @@ class PdoAddressBook
$sFullName = $oEmail->GetDisplayName();
if (false !== \strpos($sFullName, ' '))
{
$aNames = explode(' ', $sFullName, 2);
$aNames = \explode(' ', $sFullName, 2);
$sFirst = isset($aNames[0]) ? $aNames[0] : '';
$sLast = isset($aNames[1]) ? $aNames[1] : '';
}

View file

@ -36,12 +36,13 @@ class Domain extends \RainLoop\Providers\AbstractProvider
/**
* @param string $sName
* @param bool $bFindWithWildCard = false
* @param bool $bCheckDisabled = true
*
* @return \RainLoop\Domain|null
*/
public function Load($sName, $bFindWithWildCard = false)
public function Load($sName, $bFindWithWildCard = false, $bCheckDisabled = true)
{
return $this->oDriver->Load($sName, $bFindWithWildCard);
return $this->oDriver->Load($sName, $bFindWithWildCard, $bCheckDisabled);
}
/**

View file

@ -43,7 +43,15 @@ class DefaultDomain implements \RainLoop\Providers\Domain\DomainAdminInterface
return 'default';
}
$sName = \strtolower($sName);
if ($bBack)
{
$sName = \MailSo\Base\Utils::IdnToUtf8($sName, true);
}
else
{
$sName = \MailSo\Base\Utils::IdnToAscii($sName, true);
}
return $bBack ? \str_replace('_wildcard_', '*', $sName) : \str_replace('*', '_wildcard_', $sName);
}
@ -55,6 +63,8 @@ class DefaultDomain implements \RainLoop\Providers\Domain\DomainAdminInterface
*/
public function Disable($sName, $bDisable)
{
$sName = \MailSo\Base\Utils::IdnToAscii($sName, true);
$sFile = '';
if (\file_exists($this->sDomainPath.'/disabled'))
{
@ -111,8 +121,8 @@ class DefaultDomain implements \RainLoop\Providers\Domain\DomainAdminInterface
$aList = \glob($this->sDomainPath.'/*.ini');
foreach ($aList as $sFile)
{
$sName = \strtolower(\substr(\basename($sFile), 0, -4));
if ('default' === $sName || false !== strpos($sName, '_wildcard_'))
$sName = \substr(\basename($sFile), 0, -4);
if ('default' === $sName || false !== \strpos($sName, '_wildcard_'))
{
$aNames[] = $this->codeFileName($sName, true);
}
@ -135,16 +145,16 @@ class DefaultDomain implements \RainLoop\Providers\Domain\DomainAdminInterface
/**
* @param string $sName
* @param bool $bFindWithWildCard = false
* @param bool $bCheckDisabled = true
*
* @return \RainLoop\Domain | null
* @return \RainLoop\Domain|null
*/
public function Load($sName, $bFindWithWildCard = false)
public function Load($sName, $bFindWithWildCard = false, $bCheckDisabled = true)
{
$mResult = null;
$sDisabled = '';
$sFoundedValue = '';
$sName = \strtolower($sName);
$sRealFileName = $this->codeFileName($sName);
@ -154,7 +164,7 @@ class DefaultDomain implements \RainLoop\Providers\Domain\DomainAdminInterface
}
if (\file_exists($this->sDomainPath.'/'.$sRealFileName.'.ini') &&
(0 === \strlen($sDisabled) || false === \strpos(\strtolower(','.$sDisabled.','), \strtolower(','.$sName.','))))
(!$bCheckDisabled || 0 === \strlen($sDisabled) || false === \strpos(','.$sDisabled.',', ','.\MailSo\Base\Utils::IdnToAscii($sName, true).',')))
{
$aDomain = @\parse_ini_file($this->sDomainPath.'/'.$sRealFileName.'.ini');
// fix misspellings (#119)
@ -189,9 +199,10 @@ class DefaultDomain implements \RainLoop\Providers\Domain\DomainAdminInterface
$sNames = $this->getWildcardDomainsLine();
if (0 < \strlen($sNames))
{
if (\RainLoop\Plugins\Helper::ValidateWildcardValues($sName, $sNames, $sFoundedValue) && 0 < \strlen($sFoundedValue))
if (\RainLoop\Plugins\Helper::ValidateWildcardValues(
\MailSo\Base\Utils::IdnToUtf8($sName, true), $sNames, $sFoundedValue) && 0 < \strlen($sFoundedValue))
{
if (0 === \strlen($sDisabled) || false === \strpos(\strtolower(','.$sDisabled.','), \strtolower(','.$sFoundedValue.',')))
if (!$bCheckDisabled || 0 === \strlen($sDisabled) || false === \strpos(','.$sDisabled.',', ','.$sFoundedValue.','))
{
$mResult = $this->Load($sFoundedValue, false);
}
@ -209,8 +220,7 @@ class DefaultDomain implements \RainLoop\Providers\Domain\DomainAdminInterface
*/
public function Save(\RainLoop\Domain $oDomain)
{
$sName = \strtolower($oDomain->Name());
$sRealFileName = $this->codeFileName($sName);
$sRealFileName = $this->codeFileName($oDomain->Name());
if ($this->oCacher)
{
@ -229,7 +239,6 @@ class DefaultDomain implements \RainLoop\Providers\Domain\DomainAdminInterface
public function Delete($sName)
{
$bResult = true;
$sName = \strtolower($sName);
$sRealFileName = $this->codeFileName($sName);
if (0 < \strlen($sName) && \file_exists($this->sDomainPath.'/'.$sRealFileName.'.ini'))
@ -264,8 +273,9 @@ class DefaultDomain implements \RainLoop\Providers\Domain\DomainAdminInterface
foreach ($aList as $sFile)
{
$sName = \strtolower(\substr(\basename($sFile), 0, -4));
$sName = \substr(\basename($sFile), 0, -4);
$sName = $this->codeFileName($sName, true);
if (false === \strpos($sName, '*'))
{
$aResult[] = $sName;
@ -292,15 +302,19 @@ class DefaultDomain implements \RainLoop\Providers\Domain\DomainAdminInterface
$sDisabled = @\file_get_contents($this->sDomainPath.'/disabled');
if (false !== $sDisabled && 0 < strlen($sDisabled))
{
$aDisabledNames = \explode(',', strtolower($sDisabled));
$aDisabledNames = \explode(',', $sDisabled);
$aDisabledNames = \array_unique($aDisabledNames);
foreach ($aDisabledNames as $iIndex => $sValue)
{
$aDisabledNames[$iIndex] = \MailSo\Base\Utils::IdnToUtf8($sValue, true);
}
}
}
$aReturn = array();
foreach ($aResult as $sName)
{
$aReturn[$sName] = !\in_array(\strtolower($sName), $aDisabledNames);
$aReturn[$sName] = !\in_array($sName, $aDisabledNames);
}
return $aReturn;

View file

@ -16,10 +16,11 @@ interface DomainAdminInterface extends DomainInterface
/**
* @param string $sName
* @param bool $bFindWithWildCard = false
* @param bool $bCheckDisabled = true
*
* @return \RainLoop\Domain | null
* @return \RainLoop\Domain|null
*/
public function Load($sName, $bFindWithWildCard = false);
public function Load($sName, $bFindWithWildCard = false, $bCheckDisabled = true);
/**
* @param \RainLoop\Domain $oDomain