%PDF- %PDF-
| Direktori : /www/varak.net/mail2.varak.net_old/libraries/afterlogic/common/net/protocols/ |
| Current File : //www/varak.net/mail2.varak.net_old/libraries/afterlogic/common/net/protocols/imap4.php |
<?php
/*
* Copyright 2004-2014, AfterLogic Corp.
* Licensed under AGPLv3 license or AfterLogic license
* if commercial version of the product was purchased.
* See the LICENSE file for a full license statement.
*/
CApi::Inc('common.net.abstract');
/**
* @package Api
* @subpackage Net
*/
class CApiImap4MailProtocol extends CApiNetAbstract
{
/**
* @var array
*/
protected $aCapa;
public function __construct($sHost, $iPort, $bUseSsl = false, $iConnectTimeOut = null, $iSocketTimeOut = null)
{
parent::__construct($sHost, $iPort, $bUseSsl, $iConnectTimeOut, $iSocketTimeOut);
$this->aCapa = null;
}
/**
* @return bool
*/
public function Connect()
{
$bResult = false;
if (parent::Connect())
{
$bResult = $this->CheckResponse('*', $this->GetResponse('*'));
}
return $bResult;
}
/**
* @param string $sIncCapa
* @param bool $bForce = false
* @return bool
*/
public function IsSupported($sIncCapa, $bForce = false)
{
if (null === $this->aCapa || $bForce)
{
$sTag = $this->getNextTag();
if ($this->WriteLine($sTag.' CAPABILITY'))
{
$sResponse = $this->GetResponse($sTag);
if ($this->CheckResponse($sTag, $sResponse))
{
$this->aCapa = array();
$aCapasLineArray = explode("\n", $sResponse);
foreach ($aCapasLineArray as $sCapasLine)
{
$sCapa = strtoupper(trim($sCapasLine));
if (substr($sCapa, 0, 12) === '* CAPABILITY')
{
$sCapa = substr($sCapa, 12);
$aArray = explode(' ', $sCapa);
foreach ($aArray as $sSubLine)
{
if (strlen($sSubLine) > 0)
{
$this->aCapa[] = $sSubLine;
}
}
}
}
}
}
}
return is_array($this->aCapa) && in_array($sIncCapa, $this->aCapa);
}
/**
* @param string $sLogin
* @param string $sPassword
* @param string $sLoginAuthKey = ''
* @param string $sProxyAuthUser = ''
* @return bool
*/
public function Login($sLogin, $sPassword, $sLoginAuthKey = '', $sProxyAuthUser = '')
{
$bReturn = false;
$bPlain = ((bool) CApi::GetConf('login.enable-plain-auth', false)) && $this->IsSupported('AUTH=PLAIN');
if ($bPlain)
{
$sAuth = base64_encode($sLoginAuthKey."\0".$sLogin."\0".$sPassword);
$sTag = $this->getNextTag();
$this->WriteLine($sTag.' AUTHENTICATE PLAIN');
if (strtok(trim($this->ReadLine()), ' ') == '+')
{
$this->WriteLine($sAuth);
$bReturn = $this->CheckResponse($sTag, $this->GetResponse($sTag));
}
}
else
{
$bReturn = $this->SendCommand('LOGIN '.
$this->escapeString($sLogin, true).' '.$this->escapeString($sPassword, true));
if ($bReturn && 0 < strlen($sProxyAuthUser))
{
$bReturn = $this->SendCommand('LOGIN '.
$this->escapeString($sLogin, true).' '.$this->escapeString($sPassword, true));
}
}
return $bReturn;
}
/**
* @param string $sLogin
* @param string $sPassword
* @return bool
*/
public function ConnectAndLogin($sLogin, $sPassword)
{
return $this->Connect() && $this->Login($sLogin, $sPassword);
}
/**
* @return bool
*/
public function Disconnect()
{
return parent::Disconnect();
}
/**
* @return bool
*/
public function Logout()
{
return $this->SendCommand('LOGOUT');
}
/**
* @return bool
*/
public function LogoutAndDisconnect()
{
return $this->Logout() && $this->Disconnect();
}
/**
* @return bool
*/
public function GetNamespace()
{
$sNamespace = '';
$sTag = $this->getNextTag();
if ($this->WriteLine($sTag.' NAMESPACE'))
{
$sResponse = $this->GetResponse($sTag);
if ($this->CheckResponse($sTag, $sResponse))
{
$a = array();
if (false !== preg_match_all('/NAMESPACE \(\(".*?"\)\)/', $sResponse, $a)
&& isset($a[0][0]) && is_string($a[0][0]))
{
$b = array();
if (false !== preg_match('/\(\("([^"]*)" "/', $a[0][0], $b) && isset($b[1]))
{
$sNamespace = trim($b[1]);
}
}
}
}
return $sNamespace;
}
/**
* @param string $sCmd
* @return bool
*/
public function SendLine($sCmd)
{
$sTag = $this->getNextTag();
return $this->WriteLine($sTag.' '.$sCmd);
}
/**
* @param string $sCmd
* @param array $aHideValues = array()
* @return bool
*/
public function SendCommand($sCmd, $aHideValues = array())
{
$sTag = $this->getNextTag();
if ($this->WriteLine($sTag.' '.$sCmd, $aHideValues))
{
return $this->CheckResponse($sTag, $this->GetResponse($sTag));
}
return false;
}
/**
* @param string $sTag
* @return string
*/
public function GetResponse($sTag)
{
$aResponse = array();
$iLen = strlen($sTag);
while(true)
{
$sLine = $this->ReadLine();
if ($sLine == false)
{
break;
}
if (substr($sLine, 0, $iLen) === $sTag)
{
$aResponse[] = $sLine;
break;
}
$aResponse[] = $sLine;
}
return trim(implode('', $aResponse));
}
/**
* @param string $sTag
* @param string $sResponse
* @return bool
*/
public function CheckResponse($sTag, $sResponse)
{
return ('OK' === substr($sResponse, strpos($sResponse, $sTag.' ') + strlen($sTag) + 1, 2));
}
/**
* @staticvar int $sTag
* @return string
*/
protected function getNextTag()
{
static $sTag = 1;
return 'TAG'.($sTag++);
}
/**
* @param string $sLineForEscape
* @param bool $bAddQuot = false
* @return string
*/
protected function escapeString($sLineForEscape, $bAddQuot = false)
{
$sReturn = str_replace(array('\\', '"'), array('\\\\', '\\"'), $sLineForEscape);
return ($bAddQuot) ? '"'.$sReturn.'"' : $sReturn;
}
}