Sieve configuration form (Domain)

This commit is contained in:
RainLoop Team 2014-11-20 01:32:20 +04:00
parent ebce312d1a
commit 7841658791
9 changed files with 393 additions and 69 deletions

View file

@ -2984,13 +2984,15 @@ class Actions
$iImapTime = 0;
$iSmtpTime = 0;
$iConnectionTimeout = 5;
$oDomain = $this->DomainProvider()->LoadOrCreateNewFromAction($this, 'domain-test-connection.de');
if ($oDomain)
{
try
{
$oImapClient = \MailSo\Imap\ImapClient::NewInstance()->SetLogger($this->Logger());
$oImapClient->SetTimeOuts(5);
$oImapClient->SetTimeOuts($iConnectionTimeout);
$iTime = \microtime(true);
$oImapClient->Connect($oDomain->IncHost(), $oDomain->IncPort(),
@ -3028,7 +3030,7 @@ class Actions
try
{
$oSmtpClient = \MailSo\Smtp\SmtpClient::NewInstance()->SetLogger($this->Logger());
$oSmtpClient->SetTimeOuts(5);
$oSmtpClient->SetTimeOuts($iConnectionTimeout);
$iTime = \microtime(true);
$oSmtpClient->Connect($oDomain->OutHost(), $oDomain->OutPort(), '127.0.0.1',
@ -6994,6 +6996,7 @@ class Actions
@\header('Content-Type: '.$sContentType);
echo \preg_replace('/^data:[^:]+:/', '', $sData);
unset($sData);
return true;
}
}

View file

@ -152,11 +152,12 @@ class KeyPathHelper
/**
* @param string $sTheme
* @param string $sPluginsHash
* @param string $sPublickHash
*
* @return string
*/
static public function CssCache($sTheme, $sPluginsHash)
static public function CssCache($sTheme, $sPluginsHash, $sPublickHash = '')
{
return '/CssCache/'.$sPluginsHash.'/'.$sTheme.'/'.APP_VERSION.'/';
return '/CssCache/'.$sPluginsHash.'/'.$sPublickHash.'/'.$sTheme.'/'.APP_VERSION.'/';
}
}

View file

@ -63,6 +63,31 @@ class Domain
*/
private $bOutUsePhpMail;
/**
* @var bool
*/
private $bUseSieve;
/**
* @var bool
*/
private $bUseImapServerForSieve;
/**
* @var string
*/
private $sSieveHost;
/**
* @var int
*/
private $iSievePort;
/**
* @var int
*/
private $iSieveSecure;
/**
* @var string
*/
@ -74,6 +99,11 @@ class Domain
* @param int $iIncPort
* @param int $iIncSecure
* @param bool $bIncShortLogin
* @param bool $bUseSieve
* @param bool $bUseImapServerForSieve
* @param string $sSieveHost
* @param int $iSievePort
* @param int $iSieveSecure
* @param string $sOutHost
* @param int $iOutPort
* @param int $iOutSecure
@ -82,20 +112,31 @@ class Domain
* @param bool $bOutUsePhpMail = false
* @param string $sWhiteList = ''
*/
private function __construct($sName, $sIncHost, $iIncPort, $iIncSecure, $bIncShortLogin,
$sOutHost, $iOutPort, $iOutSecure, $bOutShortLogin, $bOutAuth, $bOutUsePhpMail = false, $sWhiteList = '')
private function __construct($sName,
$sIncHost, $iIncPort, $iIncSecure, $bIncShortLogin,
$bUseSieve, $bUseImapServerForSieve, $sSieveHost, $iSievePort, $iSieveSecure,
$sOutHost, $iOutPort, $iOutSecure, $bOutShortLogin, $bOutAuth, $bOutUsePhpMail = false,
$sWhiteList = '')
{
$this->sName = $sName;
$this->sIncHost = $sIncHost;
$this->iIncPort = $iIncPort;
$this->iIncSecure = $iIncSecure;
$this->bIncShortLogin = $bIncShortLogin;
$this->sOutHost = $sOutHost;
$this->iOutPort = $iOutPort;
$this->iOutSecure = $iOutSecure;
$this->bOutShortLogin = $bOutShortLogin;
$this->bOutAuth = $bOutAuth;
$this->bOutUsePhpMail = $bOutUsePhpMail;
$this->bUseSieve = $bUseSieve;
$this->bUseImapServerForSieve = $bUseImapServerForSieve;
$this->sSieveHost = $sSieveHost;
$this->iSievePort = $iSievePort;
$this->iSieveSecure = $iSieveSecure;
$this->sWhiteList = \trim($sWhiteList);
}
@ -105,6 +146,11 @@ class Domain
* @param int $iIncPort
* @param int $iIncSecure
* @param bool $bIncShortLogin
* @param bool $bUseSieve
* @param bool $bUseImapServerForSieve
* @param string $sSieveHost
* @param int $iSievePort
* @param int $iSieveSecure
* @param string $sOutHost
* @param int $iOutPort
* @param int $iOutSecure
@ -117,11 +163,13 @@ class Domain
*/
public static function NewInstance($sName,
$sIncHost, $iIncPort, $iIncSecure, $bIncShortLogin,
$bUseSieve, $bUseImapServerForSieve, $sSieveHost, $iSievePort, $iSieveSecure,
$sOutHost, $iOutPort, $iOutSecure, $bOutShortLogin, $bOutAuth, $bOutUsePhpMail,
$sWhiteList = '')
{
return new self($sName,
$sIncHost, $iIncPort, $iIncSecure, $bIncShortLogin,
$bUseSieve, $bUseImapServerForSieve, $sSieveHost, $iSievePort, $iSieveSecure,
$sOutHost, $iOutPort, $iOutSecure, $bOutShortLogin, $bOutAuth, $bOutUsePhpMail,
$sWhiteList);
}
@ -143,6 +191,11 @@ class Domain
$iIncSecure = self::StrConnectionSecurityTypeToCons(
!empty($aDomain['imap_secure']) ? $aDomain['imap_secure'] : '');
$sSieveHost = empty($aDomain['sieve_host']) ? '' : (string) $aDomain['sieve_host'];
$iSievePort = empty($aDomain['sieve_port']) ? 2000 : (int) $aDomain['sieve_port'];
$iSieveSecure = self::StrConnectionSecurityTypeToCons(
!empty($aDomain['sieve_secure']) ? $aDomain['sieve_secure'] : '');
$sOutHost = empty($aDomain['smtp_host']) ? '' : (string) $aDomain['smtp_host'];
$iOutPort = empty($aDomain['smtp_port']) ? 25 : (int) $aDomain['smtp_port'];
$iOutSecure = self::StrConnectionSecurityTypeToCons(
@ -152,11 +205,15 @@ class Domain
$bOutUsePhpMail = isset($aDomain['smtp_php_mail']) ? (bool) $aDomain['smtp_php_mail'] : false;
$sWhiteList = (string) (isset($aDomain['white_list']) ? $aDomain['white_list'] : '');
$bUseSieve = isset($aDomain['sieve_use']) ? (bool) $aDomain['sieve_use'] : false;
$bUseImapServerForSieve = isset($aDomain['sieve_use_imap_server']) ? (bool) $aDomain['sieve_use_imap_server'] : ytir;
$bIncShortLogin = isset($aDomain['imap_short_login']) ? (bool) $aDomain['imap_short_login'] : false;
$bOutShortLogin = isset($aDomain['smtp_short_login']) ? (bool) $aDomain['smtp_short_login'] : false;
$oDomain = self::NewInstance($sName,
$sIncHost, $iIncPort, $iIncSecure, $bIncShortLogin,
$bUseSieve, $bUseImapServerForSieve, $sSieveHost, $iSievePort, $iSieveSecure,
$sOutHost, $iOutPort, $iOutSecure, $bOutShortLogin, $bOutAuth, $bOutUsePhpMail,
$sWhiteList);
}
@ -177,6 +234,7 @@ class Domain
public function Normalize()
{
$this->sIncHost = \trim($this->sIncHost);
$this->sSieveHost = \trim($this->sSieveHost);
$this->sOutHost = \trim($this->sOutHost);
$this->sWhiteList = \trim($this->sWhiteList);
@ -185,6 +243,11 @@ class Domain
$this->iIncPort = 143;
}
if ($this->iSievePort <= 0)
{
$this->iSievePort = 2000;
}
if ($this->iOutPort <= 0)
{
$this->iOutPort = 25;
@ -197,11 +260,16 @@ class Domain
public function ToIniString()
{
$this->Normalize();
return implode("\n", array(
return \implode("\n", array(
'imap_host = "'.$this->encodeIniString($this->sIncHost).'"',
'imap_port = '.$this->iIncPort,
'imap_secure = "'.self::ConstConnectionSecurityTypeToStr($this->iIncSecure).'"',
'imap_short_login = '.($this->bIncShortLogin ? 'On' : 'Off'),
'sieve_use = '.($this->bUseSieve ? 'On' : 'Off'),
'sieve_use_imap_server = '.($this->bUseImapServerForSieve ? 'On' : 'Off'),
'sieve_host = "'.$this->encodeIniString($this->sSieveHost).'"',
'sieve_port = '.$this->iSievePort,
'sieve_secure = "'.self::ConstConnectionSecurityTypeToStr($this->iSieveSecure).'"',
'smtp_host = "'.$this->encodeIniString($this->sOutHost).'"',
'smtp_port = '.$this->iOutPort,
'smtp_secure = "'.self::ConstConnectionSecurityTypeToStr($this->iOutSecure).'"',
@ -258,6 +326,8 @@ class Domain
* @param int $iIncPort
* @param int $iIncSecure
* @param bool $bIncShortLogin
* @param bool $bUseSieve
* @param bool $bUseImapServerForSieve
* @param string $sOutHost
* @param int $iOutPort
* @param int $iOutSecure
@ -270,6 +340,7 @@ class Domain
*/
public function UpdateInstance(
$sIncHost, $iIncPort, $iIncSecure, $bIncShortLogin,
$bUseSieve, $bUseImapServerForSieve, $sSieveHost, $iSievePort, $iSieveSecure,
$sOutHost, $iOutPort, $iOutSecure, $bOutShortLogin, $bOutAuth, $bOutUsePhpMail,
$sWhiteList = '')
{
@ -277,12 +348,20 @@ class Domain
$this->iIncPort = $iIncPort;
$this->iIncSecure = $iIncSecure;
$this->bIncShortLogin = $bIncShortLogin;
$this->bUseSieve = $bUseSieve;
$this->bUseImapServerForSieve = $bUseImapServerForSieve;
$this->sSieveHost = \MailSo\Base\Utils::IdnToAscii($sSieveHost);
$this->iSievePort = $iSievePort;
$this->iSieveSecure = $iSieveSecure;
$this->sOutHost = \MailSo\Base\Utils::IdnToAscii($sOutHost);
$this->iOutPort = $iOutPort;
$this->iOutSecure = $iOutSecure;
$this->bOutShortLogin = $bOutShortLogin;
$this->bOutAuth = $bOutAuth;
$this->bOutUsePhpMail = $bOutUsePhpMail;
$this->sWhiteList = \trim($sWhiteList);
return $this;
@ -328,6 +407,46 @@ class Domain
return $this->bIncShortLogin;
}
/**
* @return bool
*/
public function UseSieve()
{
return $this->bUseSieve;
}
/**
* @return bool
*/
public function UseImapServerForSieve()
{
return $this->bUseImapServerForSieve;
}
/**
* @return string
*/
public function SieveHost()
{
return $this->sSieveHost;
}
/**
* @return int
*/
public function SievePort()
{
return $this->iSievePort;
}
/**
* @return int
*/
public function SieveSecure()
{
return $this->iSieveSecure;
}
/**
* @return string
*/
@ -421,6 +540,11 @@ class Domain
'IncPort' => $this->IncPort(),
'IncSecure' => $this->IncSecure(),
'IncShortLogin' => $this->IncShortLogin(),
'UseSieve' => $this->UseSieve(),
'UseImapServerForSieve' => $this->UseImapServerForSieve(),
'SieveHost' => $bAjax ? \MailSo\Base\Utils::IdnToUtf8($this->SieveHost()) : $this->SieveHost(),
'SievePort' => $this->SievePort(),
'SieveSecure' => $this->SieveSecure(),
'OutHost' => $bAjax ? \MailSo\Base\Utils::IdnToUtf8($this->OutHost()) : $this->OutHost(),
'OutPort' => $this->OutPort(),
'OutSecure' => $this->OutSecure(),

View file

@ -129,6 +129,11 @@ class Domain extends \RainLoop\Providers\AbstractProvider
$iIncPort = (int) $oActions->GetActionParam('IncPort', 143);
$iIncSecure = (int) $oActions->GetActionParam('IncSecure', \MailSo\Net\Enumerations\ConnectionSecurityType::NONE);
$bIncShortLogin = '1' === (string) $oActions->GetActionParam('IncShortLogin', '0');
$bUseSieve = '1' === (string) $oActions->GetActionParam('UseSieve', '0');
$bUseImapServerForSieve = '1' === (string) $oActions->GetActionParam('UseImapServerForSieve', '1');
$sSieveHost = (string) $oActions->GetActionParam('SieveHost', '');
$iSievePort = (int) $oActions->GetActionParam('SievePort', 2000);
$iSieveSecure = (int) $oActions->GetActionParam('SieveSecure', \MailSo\Net\Enumerations\ConnectionSecurityType::NONE);
$sOutHost = (string) $oActions->GetActionParam('OutHost', '');
$iOutPort = (int) $oActions->GetActionParam('OutPort', 25);
$iOutSecure = (int) $oActions->GetActionParam('OutSecure', \MailSo\Net\Enumerations\ConnectionSecurityType::NONE);
@ -155,6 +160,7 @@ class Domain extends \RainLoop\Providers\AbstractProvider
{
$oDomain->UpdateInstance(
$sIncHost, $iIncPort, $iIncSecure, $bIncShortLogin,
$bUseSieve, $bUseImapServerForSieve, $sSieveHost, $iSievePort, $iSieveSecure,
$sOutHost, $iOutPort, $iOutSecure, $bOutShortLogin, $bOutAuth, $bOutUsePhpMail,
$sWhiteList);
}
@ -163,6 +169,7 @@ class Domain extends \RainLoop\Providers\AbstractProvider
{
$oDomain = \RainLoop\Model\Domain::NewInstance(0 < strlen($sNameForTest) ? $sNameForTest : $sName,
$sIncHost, $iIncPort, $iIncSecure, $bIncShortLogin,
$bUseSieve, $bUseImapServerForSieve, $sSieveHost, $iSievePort, $iSieveSecure,
$sOutHost, $iOutPort, $iOutSecure, $bOutShortLogin, $bOutAuth, $bOutUsePhpMail,
$sWhiteList);
}

View file

@ -1,5 +1,6 @@
<div class="popups">
<div class="modal hide b-domain-content g-ui-user-select-none" data-bind="modal: modalVisibility, css: {'domain-edit': edit, 'domain-white-list-page': whiteListPage}">
<div class="modal hide b-domain-content g-ui-user-select-none"
data-bind="modal: modalVisibility, css: {'domain-edit': edit, 'domain-second-page': 'main' !== page()}">
<div class="modal-header">
<button type="button" class="close" data-bind="command: cancelCommand">&times;</button>
<h3 data-bind="text: headerText"></h3>
@ -20,48 +21,124 @@
<div class="span5" data-bind="css: { 'testing-done': testingDone, 'testing-error': testingImapError }">
<div class="legend imap-header">
<span data-placement="bottom" data-bind="tooltip3: testingImapErrorDesc">
IMAP
<span data-bind="text: sieveSettings() ? 'SIEVE' : 'IMAP'">IMAP</span>
</span>
</div>
<div class="row">
<div class="span3">
Server
<br />
<input type="text" class="span3" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
data-bind="textInput: imapServer, hasfocus: imapServerFocus" />
<div data-bind="visible: !sieveSettings()">
<div class="row">
<div class="span3">
Server
<br />
<input type="text" class="span3" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
data-bind="textInput: imapServer, hasfocus: imapServerFocus" />
</div>
<div class="span1">
Port
<br />
<input type="text" class="span1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
data-bind="textInput: imapPort" />
</div>
</div>
<div class="span1">
Port
<br />
<input type="text" class="span1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
data-bind="textInput: imapPort" />
<br />
<div class="row">
<div class="span4">
Secure
<br />
<select class="span2" data-bind="value: imapSecure">
<option value="0">None</option>
<option value="1">SSL/TLS</option>
<option value="2">STARTTLS</option>
</select>
</div>
</div>
<br />
<div class="row">
<div class="span5">
<div data-bind="component: {
name: 'Checkbox',
params: {
label: 'Use short login',
value: imapShortLogin,
inline: true
}
}"></div>
&nbsp;&nbsp;
<span style="color: #aaa">(user@domain.com &rarr; user)</span>
</div>
</div>
<br />
<br />
<div class="row" data-bind="visible: allowSieve">
<div class="span5">
<span data-bind="command: sieveCommand">
<i class="icon-filter"></i>
&nbsp;
<a href="#" class="g-ui-link">Sieve configuration</a>
</span>
</div>
</div>
</div>
<br />
<div class="row">
<div class="span4">
Secure
<br />
<select class="span2" data-bind="value: imapSecure">
<option value="0">None</option>
<option value="1">SSL/TLS</option>
<option value="2">STARTTLS</option>
</select>
<div data-bind="visible: sieveSettings">
<div class="row">
<div class="span5">
<div data-bind="component: {
name: 'Checkbox',
params: {
label: 'use Sieve for this domain',
value: useSieve
}
}"></div>
</div>
</div>
</div>
<br />
<div class="row">
<div class="span5">
<div data-bind="component: {
name: 'Checkbox',
params: {
label: 'Use short login',
value: imapShortLogin,
inline: true
}
}"></div>
&nbsp;&nbsp;
<span style="color: #aaa">(user@domain.com &rarr; user)</span>
<div class="row" data-bind="visible: useSieve">
<div class="span5">
<div data-bind="component: {
name: 'Checkbox',
params: {
label: 'use IMAP Server',
value: useImapServerForSieve
}
}"></div>
</div>
</div>
<div data-bind="visible: !useImapServerForSieve() && useSieve()">
<br />
<div class="row">
<div class="span3">
Server
<br />
<input type="text" class="span3" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
data-bind="textInput: sieveServer, hasfocus: sieveServerFocus" />
</div>
<div class="span1">
Port
<br />
<input type="text" class="span1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
data-bind="textInput: sievePort" />
</div>
</div>
<br />
<div class="row">
<div class="span4">
Secure
<br />
<select class="span2" data-bind="value: sieveSecure">
<option value="0">None</option>
<option value="1">SSL/TLS</option>
<option value="2">STARTTLS</option>
</select>
</div>
</div>
</div>
<br />
<div class="row">
<div class="span5">
<span data-bind="command: sieveCommand">
<i class="icon-left"></i>
&nbsp;
<a href="#" class="g-ui-link">Back to IMAP settings</a>
</span>
</div>
</div>
</div>
</div>
@ -138,7 +215,7 @@
</div>
</div>
</div>
<div class="span10">
<div class="span10" data-bind="visible: 'white-list' === page()">
<div class="legend white-list-header">
White List
</div>
@ -152,18 +229,22 @@
</form>
</div>
<div class="modal-footer">
<a class="btn button-test-connection pull-left" data-bind="command: testConnectionCommand, css: {
<a class="btn button-test-connection pull-left" data-bind="visible: 'main' === page(), command: testConnectionCommand, css: {
'btn-success': testingDone() && !testingImapError() && !testingSmtpError(),
'btn-danger': testingDone() && (testingImapError() || testingSmtpError()) }">
<i data-bind="css: {'icon-info': !testing(), 'icon-spinner animated': testing(), 'icon-white': testingDone()}"></i>
&nbsp;&nbsp;
Test
</a>
<a class="btn button-white-list pull-left" data-bind="command: whiteListCommand">
<i data-bind="css: {'icon-users': !whiteListPage(), 'icon-left': whiteListPage()}"></i>
<a class="btn button-white-list pull-left" data-bind="command: whiteListCommand, visible: 'main' === page()">
<i class="icon-users"></i>
&nbsp;&nbsp;
<span data-bind="visible: !whiteListPage()">White List</span>
<span data-bind="visible: whiteListPage()">Back</span>
White List
</a>
<a class="btn button-white-list pull-left" data-bind="command: backCommand, visible: 'main' !== page()">
<i class="icon-left"></i>
&nbsp;&nbsp;
Back
</a>
<a class="btn buttonClose" data-bind="command: cancelCommand">
<i class="icon-remove"></i>