diff --git a/dev/Admin/Contacts.js b/dev/Admin/Contacts.js index f494848b4..eebab46bc 100644 --- a/dev/Admin/Contacts.js +++ b/dev/Admin/Contacts.js @@ -21,11 +21,13 @@ function AdminContacts() this.testing = ko.observable(false); this.testContactsSuccess = ko.observable(false); this.testContactsError = ko.observable(false); + this.testContactsErrorMessage = ko.observable(''); this.testContactsCommand = Utils.createCommand(this, function () { this.testContactsSuccess(false); this.testContactsError(false); + this.testContactsErrorMessage(''); this.testing(true); RL.remote().testContacts(this.onTestContactsResponse, { @@ -45,13 +47,18 @@ Utils.addSettingsViewModel(AdminContacts, 'AdminSettingsContacts', 'Contacts', ' AdminContacts.prototype.onTestContactsResponse = function (sResult, oData) { - if (Enums.StorageResultType.Success === sResult && oData && oData.Result) + this.testContactsSuccess(false); + this.testContactsError(false); + this.testContactsErrorMessage(''); + + if (Enums.StorageResultType.Success === sResult && oData && oData.Result && oData.Result.Result) { this.testContactsSuccess(true); } else { this.testContactsError(true); + this.testContactsErrorMessage(oData.Result.Message || ''); } this.testing(false); @@ -61,6 +68,7 @@ AdminContacts.prototype.onShow = function () { this.testContactsSuccess(false); this.testContactsError(false); + this.testContactsErrorMessage(''); }; AdminContacts.prototype.onBuild = function () diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php index 8802bc944..a95c91392 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php @@ -228,6 +228,16 @@ class Utils return !\preg_match('/[^\x09\x10\x13\x0A\x0D\x20-\x7E]/', $sValue); } + /** + * @param string $sValue + * + * @return bool + */ + public static function IsUtf8($sValue) + { + return (bool) \preg_match('//u', $sValue); + } + /** * @param int $iSize * @param int $iRound @@ -831,55 +841,55 @@ class Utils { return \json_encode($mInput, defined('JSON_UNESCAPED_UNICODE') ? JSON_UNESCAPED_UNICODE : 0); - if (\is_null($mInput)) - { - return 'null'; - } - else if ($mInput === false) - { - return 'false'; - } - else if ($mInput === true) - { - return 'true'; - } - else if (\is_scalar($mInput)) - { - if (\is_float($mInput)) - { - $mInput = \str_replace(',', '.', \strval($mInput)); - } - - return '"'.\MailSo\Base\Utils::InlineRebuildStringToJsString($mInput).'"'; - } - - $bIsList = true; - for ($iIndex = 0, \reset($mInput), $iLen = \count($mInput); $iIndex < $iLen; $iIndex++, \next($mInput)) - { - if (\key($mInput) !== $iIndex) - { - $bIsList = false; - break; - } - } - - $aResult = array(); - if ($bIsList) - { - foreach ($mInput as $mValue) - { - $aResult[] = \MailSo\Base\Utils::Php2js($mValue); - } - return '['.\join(',', $aResult).']'; - } - else - { - foreach ($mInput as $sKey => $mValue) - { - $aResult[] = \MailSo\Base\Utils::Php2js($sKey).':'.\MailSo\Base\Utils::Php2js($mValue); - } - return '{'.\join(',', $aResult).'}'; - } +// if (\is_null($mInput)) +// { +// return 'null'; +// } +// else if ($mInput === false) +// { +// return 'false'; +// } +// else if ($mInput === true) +// { +// return 'true'; +// } +// else if (\is_scalar($mInput)) +// { +// if (\is_float($mInput)) +// { +// $mInput = \str_replace(',', '.', \strval($mInput)); +// } +// +// return '"'.\MailSo\Base\Utils::InlineRebuildStringToJsString($mInput).'"'; +// } +// +// $bIsList = true; +// for ($iIndex = 0, \reset($mInput), $iLen = \count($mInput); $iIndex < $iLen; $iIndex++, \next($mInput)) +// { +// if (\key($mInput) !== $iIndex) +// { +// $bIsList = false; +// break; +// } +// } +// +// $aResult = array(); +// if ($bIsList) +// { +// foreach ($mInput as $mValue) +// { +// $aResult[] = \MailSo\Base\Utils::Php2js($mValue); +// } +// return '['.\join(',', $aResult).']'; +// } +// else +// { +// foreach ($mInput as $sKey => $mValue) +// { +// $aResult[] = \MailSo\Base\Utils::Php2js($sKey).':'.\MailSo\Base\Utils::Php2js($mValue); +// } +// return '{'.\join(',', $aResult).'}'; +// } } /** diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php index b885063b5..9511c5c85 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -1942,7 +1942,11 @@ class Actions $this->setConfigFromParams($oConfig, 'ContactsPdoUser', 'contacts', 'pdo_user', 'string'); $this->setConfigFromParams($oConfig, 'ContactsPdoPassword', 'contacts', 'pdo_password', 'dummy'); - return $this->DefaultResponse(__FUNCTION__, $this->PersonalAddressBookProvider(null, true)->Test()); + $sTestMessage = $this->PersonalAddressBookProvider(null, true)->Test(); + return $this->DefaultResponse(__FUNCTION__, array( + 'Result' => '' === $sTestMessage, + 'Message' => \MailSo\Base\Utils::Utf8Clear($sTestMessage, '?') + )); } /** diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Common/PdoAbstract.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Common/PdoAbstract.php index f8e989c8c..2f0f369bc 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Common/PdoAbstract.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Common/PdoAbstract.php @@ -72,7 +72,7 @@ abstract class PdoAbstract $oPdo = false; try { - $oPdo = new \PDO($sDsn, $sDbLogin, $sDbPassword); + $oPdo = @new \PDO($sDsn, $sDbLogin, $sDbPassword); if ($oPdo) { $oPdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/PersonalAddressBook.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/PersonalAddressBook.php index c00fe194a..5d35af879 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/PersonalAddressBook.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/PersonalAddressBook.php @@ -24,13 +24,13 @@ class PersonalAddressBook extends \RainLoop\Providers\AbstractProvider } /** - * @return bool + * @return string */ public function Test() { \sleep(1); return $this->oDriver instanceof \RainLoop\Providers\PersonalAddressBook\PersonalAddressBookInterface ? - $this->oDriver->Test() : false; + $this->oDriver->Test() : 'Personal address book driver is not allowed'; } /** diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/PersonalAddressBook/PdoPersonalAddressBook.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/PersonalAddressBook/PdoPersonalAddressBook.php index 0d39bb2ce..b6d9ff739 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/PersonalAddressBook/PdoPersonalAddressBook.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/PersonalAddressBook/PdoPersonalAddressBook.php @@ -752,8 +752,31 @@ class PdoPersonalAddressBook */ public function Test() { - $this->Sync(); - return 0 < $this->getVersion('mysql-pab-version'); + $sResult = ''; + try + { + $this->Sync(); + + if (0 >= $this->getVersion('mysql-pab-version')) + { + $sResult = 'Unknown database error'; + } + } + catch (\Exception $oException) + { + $sResult = $oException->getMessage(); + if (!empty($sResult) && !\MailSo\Base\Utils::IsAscii($sResult) && !\MailSo\Base\Utils::IsUtf8($sResult)) + { + $sResult = @\utf8_encode($sResult); + } + + if (!\is_string($sResult) || empty($sResult)) + { + $sResult = 'Unknown database error'; + } + } + + return $sResult; } /** diff --git a/rainloop/v/0.0.0/app/templates/Views/AdminSettingsContacts.html b/rainloop/v/0.0.0/app/templates/Views/AdminSettingsContacts.html index 7d3cacc1e..ea421f56f 100644 --- a/rainloop/v/0.0.0/app/templates/Views/AdminSettingsContacts.html +++ b/rainloop/v/0.0.0/app/templates/Views/AdminSettingsContacts.html @@ -59,5 +59,12 @@ +