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

@ -1883,4 +1883,62 @@ class Utils
'.aero .asia .biz .cat .com .coop .edu .gov .info .int .jobs .mil .mobi .museum .name .net .org .pro .tel .travel .xxx .ac .ad .ae .af .ag .ai .al .am .an .ao .aq .ar .as .at .au .aw .ax .az .ba .bb .bd .be .bf .bg .bh .bi .bj .bm .bn .bo .br .bs .bt .bv .bw .by .bz .ca .cc .cd .cf .cg .ch .ci .ck .cl .cm .cn .co .cr .cs .cu .cv .cx .cy .cz .dd .de .dj .dk .dm .do .dz .ec .ee .eg .er .es .et .eu .fi .fj .fk .fm .fo .fr .ga .gb .gd .ge .gf .gg .gh .gi .gl .gm .gn .gp .gq .gr .gs .gt .gu .gw .gy .hk .hm .hn .hr .ht .hu .id .ie .il .im .in .io .iq .ir .is .it .je .jm .jo .jp .ke .kg .kh .ki .km .kn .kp .kr .kw .ky .kz .la .lb .lc .li .lk .lr .ls .lt .lu .lv .ly .ma .mc .md .me .mg .mh .mk .ml .mm .mn .mo .mp .mq .mr .ms .mt .mu .mv .mw .mx .my .mz .na .nc .ne .nf .ng .ni .nl .no .np .nr .nu .nz .om .pa .pe .pf .pg .ph .pk .pl .pm .pn .pr .ps .pt .pw .py .qa .re .ro .rs .ru . .rw .sa .sb .sc .sd .se .sg .sh .si .sj .sk .sl .sm .sn .so .sr .st .su .sv .sy .sz .tc .td .tf .tg .th .tj .tk .tl .tm .tn .to .tp .tr .tt .tv .tw .tz .ua .ug .uk .us .uy .uz .va .vc .ve .vg .vi .vn .vu .wf .ws .ye .yt .za .zm .zw'
));
}
/**
* @return \Net_IDNA2
*/
private static function idn()
{
static $oIdn = null;
if (null === $oIdn)
{
include_once MAILSO_LIBRARY_ROOT_PATH.'Vendors/NET/IDNA2.php';
$oIdn = new \Net_IDNA2();
}
return $oIdn;
}
/**
* @param string $sDomain
* @param bool $bLowerIfAscii = false
*
* @return string
*/
public static function IdnToUtf8($sDomain, $bLowerIfAscii = false)
{
if ($sDomain && \preg_match('/(^|\.)xn--/i', $sDomain))
{
try
{
$sDomain = self::idn()->decode($sDomain);
}
catch (\Exception $oException) {}
}
$sDomain = $bLowerIfAscii ? \MailSo\Base\Utils::StrToLowerIfAscii($sDomain) : $sDomain;
return $sDomain;
}
/**
* @param string $sDomain
* @param bool $bLowerIfAscii = false
*
* @return string
*/
public static function IdnToAscii($sDomain, $bLowerIfAscii = false)
{
$sDomain = $bLowerIfAscii ? \MailSo\Base\Utils::StrToLowerIfAscii($sDomain) : $sDomain;
if ($sDomain && \preg_match('/[^\x20-\x7E]/', $sDomain))
{
try
{
$sDomain = self::idn()->encode($sDomain);
}
catch (\Exception $oException) {}
}
return $sDomain;
}
}

View file

@ -188,6 +188,7 @@ class ImapClient extends \MailSo\Net\NetClient
}
$sLogin = \trim($sLogin);
$sLogin = \MailSo\Base\Utils::IdnToAscii($sLogin);
$sPassword = $sPassword;
$this->sLogginedUser = $sLogin;

View file

@ -39,7 +39,7 @@ class Email
throw new \MailSo\Base\Exceptions\InvalidArgumentException();
}
$this->sEmail = \trim($sEmail);
$this->sEmail = \MailSo\Base\Utils::IdnToAscii(\trim($sEmail), true);
$this->sDisplayName = \trim($sDisplayName);
$this->sRemark = \trim($sRemark);
}
@ -176,6 +176,7 @@ class Email
}
$sEmail = \trim(\trim($sEmail), '<>');
$sName = \trim(\trim($sName), '"');
$sName = \trim($sName, '\'');
$sComment = \trim(\trim($sComment), '()');
@ -188,11 +189,13 @@ class Email
}
/**
* @param bool $bIdn = false
*
* @return string
*/
public function GetEmail()
public function GetEmail($bIdn = false)
{
return $this->sEmail;
return $bIdn ? \MailSo\Base\Utils::IdnToUtf8($this->sEmail) : $this->sEmail;
}
/**
@ -216,31 +219,36 @@ class Email
*/
public function GetAccountName()
{
return \MailSo\Base\Utils::GetAccountNameFromEmail($this->sEmail);
return \MailSo\Base\Utils::GetAccountNameFromEmail($this->GetEmail(false));
}
/**
* @param bool $bIdn = false
*
* @return string
*/
public function GetDomain()
public function GetDomain($bIdn = false)
{
return \MailSo\Base\Utils::GetDomainFromEmail($this->sEmail);
return \MailSo\Base\Utils::GetDomainFromEmail($this->GetEmail($bIdn));
}
/**
* @param bool $bIdn = false
*
* @return array
*/
public function ToArray()
public function ToArray($bIdn = false)
{
return array($this->sDisplayName, $this->sEmail, $this->sRemark);
return array($this->sDisplayName, $this->GetEmail($bIdn), $this->sRemark);
}
/**
* @param bool $bConvertSpecialsName = false
* @param bool $bIdn = false
*
* @return string
*/
public function ToString($bConvertSpecialsName = false)
public function ToString($bConvertSpecialsName = false, $bIdn = false)
{
$sReturn = '';
@ -263,8 +271,7 @@ class Email
if (0 < \strlen($this->sEmail))
{
$sReturn = $this->sEmail;
$sReturn = $this->GetEmail($bIdn);
if (0 < \strlen($sDisplayName.$sRemark))
{
$sReturn = $sDisplayName.' <'.$sReturn.'> '.$sRemark;

View file

@ -100,16 +100,17 @@ class EmailCollection extends \MailSo\Base\Collection
/**
* @param bool $bConvertSpecialsName = false
* @param bool $bIdn = false
*
* @return string
*/
public function ToString($bConvertSpecialsName = false)
public function ToString($bConvertSpecialsName = false, $bIdn = false)
{
$aReturn = $aEmails = array();
$aEmails =& $this->GetAsArray();
foreach ($aEmails as /* @var $oEmail \MailSo\Mime\Email */ $oEmail)
{
$aReturn[] = $oEmail->ToString($bConvertSpecialsName);
$aReturn[] = $oEmail->ToString($bConvertSpecialsName, $bIdn);
}
return \implode(', ', $aReturn);

View file

@ -228,7 +228,7 @@ class Header
$oEmailCollection = \MailSo\Mime\EmailCollection::NewInstance($this->sFullValue);
if ($oEmailCollection && 0 < $oEmailCollection->Count())
{
$sResult = $oEmailCollection->ToString(true);
$sResult = $oEmailCollection->ToString(true, false);
}
}

View file

@ -191,7 +191,7 @@ class Message
}
/**
* @param string $sHeader
* @param string $sHeaderName
* @param string $sValue
*
* @return \MailSo\Mime\Message

View file

@ -173,6 +173,8 @@ class SmtpClient extends \MailSo\Net\NetClient
*/
public function Login($sLogin, $sPassword)
{
$sLogin = \MailSo\Base\Utils::IdnToAscii($sLogin);
if ($this->IsAuthSupported('LOGIN'))
{
try
@ -299,6 +301,7 @@ class SmtpClient extends \MailSo\Net\NetClient
*/
public function MailFrom($sFrom, $sSizeIfSupported = '')
{
$sFrom = \MailSo\Base\Utils::IdnToAscii($sFrom, true);
$sCmd = 'FROM:<'.$sFrom.'>';
$sSizeIfSupported = (string) $sSizeIfSupported;
@ -333,6 +336,7 @@ class SmtpClient extends \MailSo\Net\NetClient
\MailSo\Log\Enumerations\Type::ERROR, true);
}
$sTo = \MailSo\Base\Utils::IdnToAscii($sTo, true);
$this->sendRequestWithCheck('RCPT', array(250, 251), 'TO:<'.$sTo.'>');
$this->bRcpt = true;

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,5 @@
<?php
class Net_IDNA2_Exception extends Exception
{
}

View file

@ -0,0 +1,10 @@
<?php
//require_once 'Net/IDNA2/Exception.php';
defined('MAILSO_LIBRARY_ROOT_PATH') || die();
require_once MAILSO_LIBRARY_ROOT_PATH.'Vendors/Net/IDNA2/Exception.php';
class Net_IDNA2_Exception_Nameprep extends Net_IDNA2_Exception
{
}