mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-07-13 03:27:39 +03:00
Added "[labs] imap_show_login_alert" setting
Small fixes
This commit is contained in:
parent
f749d77fff
commit
43d1794423
81 changed files with 132 additions and 48 deletions
|
|
@ -128,6 +128,17 @@
|
||||||
margin-top: -2px;
|
margin-top: -2px;
|
||||||
margin-left: -2px;
|
margin-left: -2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.white {
|
||||||
|
|
||||||
|
border-color: #fff;
|
||||||
|
border-top-color: #999;
|
||||||
|
|
||||||
|
&.animated {
|
||||||
|
border-color: transparent;
|
||||||
|
border-top-color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
html.no-cssanimations .icon-spinner {
|
html.no-cssanimations .icon-spinner {
|
||||||
|
|
|
||||||
|
|
@ -75,6 +75,14 @@
|
||||||
|
|
||||||
this.submitRequest = ko.observable(false);
|
this.submitRequest = ko.observable(false);
|
||||||
this.submitError = ko.observable('');
|
this.submitError = ko.observable('');
|
||||||
|
this.submitErrorAddidional = ko.observable('');
|
||||||
|
|
||||||
|
this.submitError.subscribe(function (sValue) {
|
||||||
|
if ('' === sValue)
|
||||||
|
{
|
||||||
|
this.submitErrorAddidional('');
|
||||||
|
}
|
||||||
|
}, this);
|
||||||
|
|
||||||
this.allowLanguagesOnLogin = Data.allowLanguagesOnLogin;
|
this.allowLanguagesOnLogin = Data.allowLanguagesOnLogin;
|
||||||
|
|
||||||
|
|
@ -178,6 +186,13 @@
|
||||||
{
|
{
|
||||||
this.submitError(Utils.getNotification(Enums.Notification.UnknownError));
|
this.submitError(Utils.getNotification(Enums.Notification.UnknownError));
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (oData.ErrorMessageAdditional)
|
||||||
|
{
|
||||||
|
this.submitErrorAddidional(oData.ErrorMessageAdditional);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ if (!\defined('RAINLOOP_APP_LIBRARIES_PATH'))
|
||||||
if (!defined('RL_BACKWARD_CAPABILITY'))
|
if (!defined('RL_BACKWARD_CAPABILITY'))
|
||||||
{
|
{
|
||||||
\define('RL_BACKWARD_CAPABILITY', true);
|
\define('RL_BACKWARD_CAPABILITY', true);
|
||||||
include_once RAINLOOP_APP_PATH.'src/RainLoop/Common/BackwardCapability/Account.php';
|
include_once RAINLOOP_APP_LIBRARIES_PATH.'RainLoop/Common/BackwardCapability/Account.php';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -19,49 +19,45 @@ if (!\defined('RAINLOOP_APP_LIBRARIES_PATH'))
|
||||||
*
|
*
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
function RainLoopSplAutoloadRegisterFunction($sClassName)
|
function rainLoopSplAutoloadNamespaces()
|
||||||
{
|
{
|
||||||
if (0 === \strpos($sClassName, 'RainLoop') && false !== \strpos($sClassName, '\\'))
|
return RAINLOOP_INCLUDE_AS_API_DEF ? array('RainLoop') :
|
||||||
{
|
array('RainLoop', 'Facebook', 'GuzzleHttp', 'Symfony', 'PHPThumb', 'Sabre');
|
||||||
return include RAINLOOP_APP_PATH.'src/RainLoop/'.\str_replace('\\', '/', \substr($sClassName, 9)).'.php';
|
|
||||||
}
|
|
||||||
else if (!RAINLOOP_INCLUDE_AS_API_DEF)
|
|
||||||
{
|
|
||||||
if (0 === \strpos($sClassName, 'Facebook') && false !== \strpos($sClassName, '\\'))
|
|
||||||
{
|
|
||||||
return include RAINLOOP_APP_LIBRARIES_PATH.'Facebook/'.\str_replace('\\', '/', \substr($sClassName, 9)).'.php';
|
|
||||||
}
|
|
||||||
else if (0 === \strpos($sClassName, 'GuzzleHttp') && false !== \strpos($sClassName, '\\'))
|
|
||||||
{
|
|
||||||
return include RAINLOOP_APP_LIBRARIES_PATH.'GuzzleHttp/'.\str_replace('\\', '/', \substr($sClassName, 11)).'.php';
|
|
||||||
}
|
|
||||||
else if (0 === \strpos($sClassName, 'Symfony') && false !== \strpos($sClassName, '\\'))
|
|
||||||
{
|
|
||||||
return include RAINLOOP_APP_LIBRARIES_PATH.'Symfony/'.\str_replace('\\', '/', \substr($sClassName, 8)).'.php';
|
|
||||||
}
|
|
||||||
else if (0 === \strpos($sClassName, 'PHPThumb') && false !== \strpos($sClassName, '\\'))
|
|
||||||
{
|
|
||||||
return include RAINLOOP_APP_LIBRARIES_PATH.'PHPThumb/'.\str_replace('\\', '/', \substr($sClassName, 9)).'.php';
|
|
||||||
}
|
|
||||||
else if (0 === \strpos($sClassName, 'Sabre') && false !== \strpos($sClassName, '\\'))
|
|
||||||
{
|
|
||||||
if (!RAINLOOP_MB_SUPPORTED && !defined('RL_MB_FIXED'))
|
|
||||||
{
|
|
||||||
\define('RL_MB_FIXED', true);
|
|
||||||
include_once RAINLOOP_APP_PATH.'src/RainLoop/Common/MbStringFix.php';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return include RAINLOOP_APP_LIBRARIES_PATH.'Sabre/'.\str_replace('\\', '/', \substr($sClassName, 6)).'.php';
|
/**
|
||||||
|
* @param string $sClassName
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
function rainLoopSplAutoloadRegisterFunction($sClassName)
|
||||||
|
{
|
||||||
|
if ($sClassName && '\\' === $sClassName[0])
|
||||||
|
{
|
||||||
|
$sClassName = \substr($sClassName, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (rainLoopSplAutoloadNamespaces() as $sNamespaceName)
|
||||||
|
{
|
||||||
|
if (0 === \strpos($sClassName, $sNamespaceName.'\\'))
|
||||||
|
{
|
||||||
|
if ('Sabre' === $sNamespaceName && !RAINLOOP_MB_SUPPORTED && !defined('RL_MB_FIXED'))
|
||||||
|
{
|
||||||
|
\define('RL_MB_FIXED', true);
|
||||||
|
include_once RAINLOOP_APP_LIBRARIES_PATH.'RainLoop/Common/MbStringFix.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
return include RAINLOOP_APP_LIBRARIES_PATH.\strtr($sClassName, '\\', '/').'.php';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
\spl_autoload_register('RainLoopSplAutoloadRegisterFunction', false);
|
\spl_autoload_register('rainLoopSplAutoloadRegisterFunction', false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (\class_exists('RainLoop\Service'))
|
if (\class_exists('RainLoop\Api'))
|
||||||
{
|
{
|
||||||
if (!\class_exists('MailSo\Version'))
|
if (!\class_exists('MailSo\Version'))
|
||||||
{
|
{
|
||||||
|
|
@ -90,7 +86,7 @@ if (\class_exists('RainLoop\Service'))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (\function_exists('RainLoopSplAutoloadRegisterFunction'))
|
else if (\function_exists('rainLoopSplAutoloadRegisterFunction'))
|
||||||
{
|
{
|
||||||
\spl_autoload_unregister('RainLoopSplAutoloadRegisterFunction');
|
\spl_autoload_unregister('rainLoopSplAutoloadRegisterFunction');
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,4 +16,22 @@ namespace MailSo\Imap\Exceptions;
|
||||||
* @package Imap
|
* @package Imap
|
||||||
* @subpackage Exceptions
|
* @subpackage Exceptions
|
||||||
*/
|
*/
|
||||||
class NegativeResponseException extends \MailSo\Imap\Exceptions\ResponseException {}
|
class NegativeResponseException extends \MailSo\Imap\Exceptions\ResponseException
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getAlertFromStatus()
|
||||||
|
{
|
||||||
|
$sResult = '';
|
||||||
|
|
||||||
|
$oResponse = $this->GetLastResponse();
|
||||||
|
if ($oResponse && $oResponse->IsStatusResponse && !empty($oResponse->HumanReadable) &&
|
||||||
|
isset($oResponse->OptionalResponse[0]) && 'ALERT' === $oResponse->OptionalResponse[0])
|
||||||
|
{
|
||||||
|
$sResult = $oResponse->HumanReadable;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sResult;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1525,6 +1525,18 @@ class Actions
|
||||||
{
|
{
|
||||||
throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::ConnectionError, $oException);
|
throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::ConnectionError, $oException);
|
||||||
}
|
}
|
||||||
|
catch (\MailSo\Imap\Exceptions\LoginBadCredentialsException $oException)
|
||||||
|
{
|
||||||
|
if ($this->Config()->Get('labs', 'imap_show_login_alert', true))
|
||||||
|
{
|
||||||
|
throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError,
|
||||||
|
$oException, $oException->getAlertFromStatus());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError, $oException);
|
||||||
|
}
|
||||||
|
}
|
||||||
catch (\Exception $oException)
|
catch (\Exception $oException)
|
||||||
{
|
{
|
||||||
throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError, $oException);
|
throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::AuthError, $oException);
|
||||||
|
|
@ -7739,10 +7751,11 @@ class Actions
|
||||||
* @param string $sActionName
|
* @param string $sActionName
|
||||||
* @param int $iErrorCode = null
|
* @param int $iErrorCode = null
|
||||||
* @param string $sErrorMessage = null
|
* @param string $sErrorMessage = null
|
||||||
|
* @param string $sAdditionalErrorMessage = null
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function FalseResponse($sActionName, $iErrorCode = null, $sErrorMessage = null)
|
public function FalseResponse($sActionName, $iErrorCode = null, $sErrorMessage = null, $sAdditionalErrorMessage = null)
|
||||||
{
|
{
|
||||||
$mResult = false;
|
$mResult = false;
|
||||||
$this->Plugins()
|
$this->Plugins()
|
||||||
|
|
@ -7755,6 +7768,7 @@ class Actions
|
||||||
{
|
{
|
||||||
$aAdditionalParams['ErrorCode'] = (int) $iErrorCode;
|
$aAdditionalParams['ErrorCode'] = (int) $iErrorCode;
|
||||||
$aAdditionalParams['ErrorMessage'] = null === $sErrorMessage ? '' : (string) $sErrorMessage;
|
$aAdditionalParams['ErrorMessage'] = null === $sErrorMessage ? '' : (string) $sErrorMessage;
|
||||||
|
$aAdditionalParams['ErrorMessageAdditional'] = null === $sAdditionalErrorMessage ? '' : (string) $sAdditionalErrorMessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
$aResponseItem = $this->mainDefaultResponse($sActionName, $mResult, $aAdditionalParams);
|
$aResponseItem = $this->mainDefaultResponse($sActionName, $mResult, $aAdditionalParams);
|
||||||
|
|
@ -7773,15 +7787,23 @@ class Actions
|
||||||
{
|
{
|
||||||
$iErrorCode = null;
|
$iErrorCode = null;
|
||||||
$sErrorMessage = null;
|
$sErrorMessage = null;
|
||||||
|
$sErrorMessageAdditional = null;
|
||||||
|
|
||||||
if ($oException instanceof \RainLoop\Exceptions\ClientException)
|
if ($oException instanceof \RainLoop\Exceptions\ClientException)
|
||||||
{
|
{
|
||||||
$iErrorCode = $oException->getCode();
|
$iErrorCode = $oException->getCode();
|
||||||
$sErrorMessage = null;
|
$sErrorMessage = null;
|
||||||
|
|
||||||
if ($iErrorCode === \RainLoop\Notifications::ClientViewError)
|
if ($iErrorCode === \RainLoop\Notifications::ClientViewError)
|
||||||
{
|
{
|
||||||
$sErrorMessage = $oException->getMessage();
|
$sErrorMessage = $oException->getMessage();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$sErrorMessageAdditional = $oException->getAdditionalMessage();
|
||||||
|
if (empty($sErrorMessageAdditional))
|
||||||
|
{
|
||||||
|
$sErrorMessageAdditional = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -7799,7 +7821,7 @@ class Actions
|
||||||
$this->Logger()->WriteException($oException);
|
$this->Logger()->WriteException($oException);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->FalseResponse($sActionName, $iErrorCode, $sErrorMessage);
|
return $this->FalseResponse($sActionName, $iErrorCode, $sErrorMessage, $sErrorMessageAdditional);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -267,6 +267,7 @@ Enables caching in the system'),
|
||||||
'imap_message_list_date_filter' => array(0),
|
'imap_message_list_date_filter' => array(0),
|
||||||
'imap_large_thread_limit' => array(100),
|
'imap_large_thread_limit' => array(100),
|
||||||
'imap_folder_list_limit' => array(200),
|
'imap_folder_list_limit' => array(200),
|
||||||
|
'imap_show_login_alert' => array(true),
|
||||||
'smtp_show_server_errors' => array(false),
|
'smtp_show_server_errors' => array(false),
|
||||||
'curl_proxy' => array(''),
|
'curl_proxy' => array(''),
|
||||||
'curl_proxy_auth' => array(''),
|
'curl_proxy_auth' => array(''),
|
||||||
|
|
@ -0,0 +1,32 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace RainLoop\Exceptions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @category RainLoop
|
||||||
|
* @package Exceptions
|
||||||
|
*/
|
||||||
|
class ClientException extends Exception
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $sAdditionalMessage;
|
||||||
|
|
||||||
|
public function __construct($iCode, $oPrevious = null, $sAdditionalMessage = '')
|
||||||
|
{
|
||||||
|
parent::__construct(\RainLoop\Notifications::GetNotificationsMessage($iCode, $oPrevious),
|
||||||
|
$iCode, $oPrevious);
|
||||||
|
|
||||||
|
$this->sAdditionalMessage = $sAdditionalMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getAdditionalMessage()
|
||||||
|
{
|
||||||
|
return $this->sAdditionalMessage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace RainLoop\Exceptions;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @category RainLoop
|
|
||||||
* @package Exceptions
|
|
||||||
*/
|
|
||||||
class ClientException extends Exception
|
|
||||||
{
|
|
||||||
public function __construct($iCode, $oPrevious = null)
|
|
||||||
{
|
|
||||||
parent::__construct(\RainLoop\Notifications::GetNotificationsMessage($iCode, $oPrevious), $iCode, $oPrevious);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -15,6 +15,10 @@
|
||||||
<div class="alert alertError" data-bind="visible: '' !== submitError()">
|
<div class="alert alertError" data-bind="visible: '' !== submitError()">
|
||||||
<button type="button" class="close" data-bind="click: function () { submitError('') }">×</button>
|
<button type="button" class="close" data-bind="click: function () { submitError('') }">×</button>
|
||||||
<span data-bind="text: submitError"></span>
|
<span data-bind="text: submitError"></span>
|
||||||
|
<div data-bind="visible: '' !== submitErrorAddidional()">
|
||||||
|
<br />
|
||||||
|
<span data-bind="text: submitErrorAddidional"></span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<form class="wrapper loginForm thm-login" action="#/" data-bind="submit: submitForm">
|
<form class="wrapper loginForm thm-login" action="#/" data-bind="submit: submitForm">
|
||||||
{{INCLUDE/TopControlGroup/PLACE}}
|
{{INCLUDE/TopControlGroup/PLACE}}
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<a class="btn btn-danger buttonClear" data-bind="command: clearCommand">
|
<a class="btn btn-danger buttonClear" data-bind="command: clearCommand">
|
||||||
<i class="icon-fire" data-bind="css: {'icon-fire': !clearingProcess(), 'icon-spinner animated': clearingProcess()}" ></i>
|
<i class="icon-fire" data-bind="css: {'icon-fire': !clearingProcess(), 'icon-spinner animated white': clearingProcess()}" ></i>
|
||||||
|
|
||||||
<span class="i18n" data-i18n-text="POPUPS_CLEAR_FOLDER/BUTTON_CLEAR"></span>
|
<span class="i18n" data-i18n-text="POPUPS_CLEAR_FOLDER/BUTTON_CLEAR"></span>
|
||||||
</a>
|
</a>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue