From d00c953c888e18b2c894b03076df6d5525b8ff76 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Fri, 16 Aug 2024 22:05:15 +0200 Subject: [PATCH] Change handling of (token) errors due to #1706 --- dev/App/User.js | 10 +++++---- dev/Common/Folders.js | 2 +- dev/Common/Translator.js | 3 +++ dev/Model/FolderCollection.js | 2 +- dev/Remote/AbstractFetch.js | 12 +++++----- dev/Settings/Admin/Packages.js | 6 ++--- dev/Settings/User/Themes.js | 6 ++--- dev/Sieve/View/Script.js | 2 +- dev/Stores/User/Contact.js | 2 +- dev/Stores/User/GnuPG.js | 2 +- dev/Stores/User/Pgp.js | 2 +- dev/View/Popup/Account.js | 2 +- dev/View/Popup/Compose.js | 12 +++++----- dev/View/Popup/Contacts.js | 6 ++--- dev/View/Popup/Identity.js | 4 ++-- dev/View/Popup/OpenPgpImport.js | 2 +- dev/View/Popup/SMimeImport.js | 4 ++-- dev/View/User/Login.js | 4 ++-- dev/View/User/SystemDropDown.js | 2 +- dev/boot.js | 6 ++--- dev/sieve.js | 4 ++-- .../0.0.0/app/libraries/RainLoop/Actions.php | 2 +- .../libraries/RainLoop/Actions/Response.php | 20 ++++++++--------- .../app/libraries/RainLoop/ServiceActions.php | 22 ++++++++++++------- .../v/0.0.0/app/libraries/RainLoop/Utils.php | 10 ++++----- 25 files changed, 80 insertions(+), 69 deletions(-) diff --git a/dev/App/User.js b/dev/App/User.js index cfac93231..197e1f238 100644 --- a/dev/App/User.js +++ b/dev/App/User.js @@ -27,7 +27,7 @@ import { getFolderFromCacheList } from 'Common/Cache'; -import { i18n, reloadTime } from 'Common/Translator'; +import { i18n, reloadTime, getErrorMessage } from 'Common/Translator'; import { SettingsUserStore } from 'Stores/User/Settings'; import { NotificationUserStore } from 'Stores/User/Notification'; @@ -150,7 +150,8 @@ export class AppUser extends AbstractApp { logout() { Remote.request('Logout', (iError, data) => - iError ? alert(data) : rl.logoutReload(Settings.app('customLogoutLink')) + iError ? alert('Logout error: ' + getErrorMessage(iError, data)) + : rl.logoutReload(Settings.app('customLogoutLink')) ); } @@ -183,9 +184,9 @@ export class AppUser extends AbstractApp { SettingsUserStore.init(); ContactUserStore.init(); - loadFolders(value => { + loadFolders((success, error) => { try { - if (value) { + if (success) { startScreens([ MailBoxUserScreen, SettingsUserScreen @@ -227,6 +228,7 @@ export class AppUser extends AbstractApp { setTimeout(() => mailToHelper(SettingsGet('mailToEmail')), 500); } else { this.logout(); + alert('Folders error: ' + getErrorMessage(0, error)) } } catch (e) { console.error(e); diff --git a/dev/Common/Folders.js b/dev/Common/Folders.js index e7d42e2c7..3e397d112 100644 --- a/dev/Common/Folders.js +++ b/dev/Common/Folders.js @@ -198,7 +198,7 @@ dropFilesInFolder = (sFolderFullName, files) => { data.append('folder', sFolderFullName); data.append('appendFile', file); Remote.request('FolderAppend', (iError, data)=>{ - iError && console.error(data.ErrorMessage); + iError && console.error(data.message); 0 == --count && FolderUserStore.currentFolderFullName() == sFolderFullName && MessagelistUserStore.reload(true, true); diff --git a/dev/Common/Translator.js b/dev/Common/Translator.js index 8124a7933..b4953291f 100644 --- a/dev/Common/Translator.js +++ b/dev/Common/Translator.js @@ -184,6 +184,9 @@ export const || ''; }, + getErrorMessage = (code, data) => + getNotification(code) || data?.messageAdditional || data?.message || data, + /** * @param {*} code * @returns {string} diff --git a/dev/Model/FolderCollection.js b/dev/Model/FolderCollection.js index 735ea7ddc..228b4c502 100644 --- a/dev/Model/FolderCollection.js +++ b/dev/Model/FolderCollection.js @@ -104,7 +104,7 @@ export const // Repeat every 15 minutes? // this.foldersTimeout = setTimeout(loadFolders, 900000); }) - .catch(() => fCallback && setTimeout(fCallback, 1, false)); + .catch(e => fCallback && setTimeout(fCallback, 1, false, e)); }; export class FolderCollectionModel extends AbstractCollectionModel diff --git a/dev/Remote/AbstractFetch.js b/dev/Remote/AbstractFetch.js index 087e8032f..f05af9915 100644 --- a/dev/Remote/AbstractFetch.js +++ b/dev/Remote/AbstractFetch.js @@ -8,9 +8,9 @@ let iJsonErrorCount = 0; const getURL = (add = '') => serverRequest('Json') + pString(add), checkResponseError = data => { - const err = data ? data.ErrorCode : null; + const err = data ? data.code : null; if (Notifications.InvalidToken === err) { - console.error(getNotification(err) + ` (${data.ErrorMessageAdditional})`); + console.error(getNotification(err) + ` (${data.messageAdditional})`); // alert(getNotification(err)); setTimeout(rl.logoutReload, 5000); } else if ([ @@ -144,7 +144,7 @@ export class AbstractFetchRemote iJsonErrorCount = 0; } else { checkResponseError(data); - iError = data.ErrorCode || Notifications.UnknownError + iError = data.code || Notifications.UnknownError } } @@ -196,7 +196,7 @@ export class AbstractFetchRemote return Promise.reject(new FetchError(Notifications.JsonParse)); } - if (111 === data?.ErrorCode && rl.app.ask && await rl.app.ask.cryptkey()) { + if (111 === data?.code && rl.app.ask && await rl.app.ask.cryptkey()) { return this.post(action, fTrigger, params, timeOut); } /* @@ -222,8 +222,8 @@ export class AbstractFetchRemote if (!data.Result || action !== data.Action) { checkResponseError(data); return Promise.reject(new FetchError( - data ? data.ErrorCode : 0, - data ? (data.ErrorMessageAdditional || data.ErrorMessage) : '' + data ? data.code : 0, + data ? (data.messageAdditional || data.message) : '' )); } diff --git a/dev/Settings/Admin/Packages.js b/dev/Settings/Admin/Packages.js index 76286d5e6..e0b202d6c 100644 --- a/dev/Settings/Admin/Packages.js +++ b/dev/Settings/Admin/Packages.js @@ -68,7 +68,7 @@ export class AdminSettingsPackages extends AbstractViewSettings { if (iError) { this.packagesError( getNotification(install ? Notifications.CantInstallPackage : Notifications.CantDeletePackage) - + (data.ErrorMessage ? ':\n' + data.ErrorMessage : '') + + (data.message ? ':\n' + data.message : '') ); } else if (data.Result.Reload) { location.reload(); @@ -113,8 +113,8 @@ export class AdminSettingsPackages extends AbstractViewSettings { if (iError) { plugin.enabled(disable); this.packagesError( - (Notifications.UnsupportedPluginPackage === iError && data?.ErrorMessage) - ? data.ErrorMessage + (Notifications.UnsupportedPluginPackage === iError && data?.message) + ? data.message : getNotification(iError) ); } diff --git a/dev/Settings/User/Themes.js b/dev/Settings/User/Themes.js index 041680901..ed4fb33bb 100644 --- a/dev/Settings/User/Themes.js +++ b/dev/Settings/User/Themes.js @@ -99,8 +99,8 @@ export class UserSettingsThemes /*extends AbstractViewSettings*/ { themeBackground.hash(data?.Result?.hash || ''); if (!themeBackground.name() || !themeBackground.hash()) { let errorMsg = ''; - if (data.ErrorCode) { - switch (data.ErrorCode) { + if (data.code) { + switch (data.code) { case UploadErrorCode.FileIsTooBig: errorMsg = i18n('SETTINGS_THEMES/ERROR_FILE_IS_TOO_BIG'); break; @@ -111,7 +111,7 @@ export class UserSettingsThemes /*extends AbstractViewSettings*/ { } } - themeBackground.error(errorMsg || data.ErrorMessage || i18n('SETTINGS_THEMES/ERROR_UNKNOWN')); + themeBackground.error(errorMsg || data.message || i18n('SETTINGS_THEMES/ERROR_UNKNOWN')); } }); } diff --git a/dev/Sieve/View/Script.js b/dev/Sieve/View/Script.js index edae504a1..047eae50f 100644 --- a/dev/Sieve/View/Script.js +++ b/dev/Sieve/View/Script.js @@ -78,7 +78,7 @@ export class SieveScriptPopupView extends rl.pluginPopupView { if (iError) { self.saveError(true); - self.errorText(data?.ErrorMessageAdditional || getNotification(iError)); + self.errorText(data?.messageAdditional || getNotification(iError)); } else { script.exists() || scripts.push(script); script.exists(true); diff --git a/dev/Stores/User/Contact.js b/dev/Stores/User/Contact.js index 89f1b01dd..c95af029a 100644 --- a/dev/Stores/User/Contact.js +++ b/dev/Stores/User/Contact.js @@ -39,7 +39,7 @@ ContactUserStore.sync = fResultFunc => { line = JSON.parse(line); if ('ContactsSync' === line.Action) { ContactUserStore.syncing(false); - fResultFunc?.(line.ErrorCode, line); + fResultFunc?.(line.code, line); } } catch (e) { ContactUserStore.syncing(false); diff --git a/dev/Stores/User/GnuPG.js b/dev/Stores/User/GnuPG.js index 843f4d5a9..3b9c85785 100644 --- a/dev/Stores/User/GnuPG.js +++ b/dev/Stores/User/GnuPG.js @@ -57,7 +57,7 @@ export const GnuPGUserStore = new class { (iError, oData) => { if (oData) { if (iError) { - alert(oData.ErrorMessage); + alert(oData.message); } else if (oData.Result) { isPrivate ? this.privateKeys.remove(key) diff --git a/dev/Stores/User/Pgp.js b/dev/Stores/User/Pgp.js index 8b56a83ca..648843eea 100644 --- a/dev/Stores/User/Pgp.js +++ b/dev/Stores/User/Pgp.js @@ -61,7 +61,7 @@ export const if (gnuPG && oData?.Result/* && (oData.Result.imported || oData.Result.secretimported)*/) { GnuPGUserStore.loadKeyrings(); } - iError && alert(oData.ErrorMessage); + iError && alert(oData.message); }, { key, gnuPG, backup } diff --git a/dev/View/Popup/Account.js b/dev/View/Popup/Account.js index e79cb8116..8e36b14f4 100644 --- a/dev/View/Popup/Account.js +++ b/dev/View/Popup/Account.js @@ -36,7 +36,7 @@ export class AccountPopupView extends AbstractViewPopup { this.submitRequest(false); if (iError) { this.submitError(getNotification(iError)); - this.submitErrorAdditional(data?.ErrorMessageAdditional); + this.submitErrorAdditional(data?.messageAdditional); } else { loadAccountsAndIdentities(); this.close(); diff --git a/dev/View/Popup/Compose.js b/dev/View/Popup/Compose.js index 3a875d587..581ad9f21 100644 --- a/dev/View/Popup/Compose.js +++ b/dev/View/Popup/Compose.js @@ -499,8 +499,8 @@ export class ComposePopupView extends AbstractViewPopup { const sendFailed = (iError, data) => { this.sendError(true); this.sendErrorDesc( - getNotification(iError, data?.ErrorMessage, Notifications.CantSendMessage) - + "\n" + (data?.ErrorMessageAdditional || data?.ErrorMessage) + getNotification(iError, data?.message, Notifications.CantSendMessage) + + "\n" + (data?.messageAdditional || data?.message) ); }; try { @@ -530,8 +530,8 @@ export class ComposePopupView extends AbstractViewPopup { if (Notifications.CantSaveMessage === iError) { this.sendSuccessButSaveError(true); let msg = i18n('COMPOSE/SAVED_ERROR_ON_SEND'); - if (data?.ErrorMessageAdditional) { - msg = msg + "\n" + data?.ErrorMessageAdditional; + if (data?.messageAdditional) { + msg = msg + "\n" + data?.messageAdditional; } this.savedErrorDesc(msg); } else { @@ -1151,7 +1151,7 @@ export class ComposePopupView extends AbstractViewPopup { .on('onComplete', (id, result, data) => { const attachment = this.getAttachmentById(id), response = data?.Result || {}, - errorCode = response.ErrorCode, + errorCode = response.code, attachmentJson = result && response.Attachment; let error = ''; @@ -1167,7 +1167,7 @@ export class ComposePopupView extends AbstractViewPopup { .waiting(false) .uploading(false) .complete(true) - .error(error + '\n' + response.ErrorMessage); + .error(error + '\n' + response.message); } else if (attachmentJson) { attachment .waiting(false) diff --git a/dev/View/Popup/Contacts.js b/dev/View/Popup/Contacts.js index 342a6d504..2f75d0070 100644 --- a/dev/View/Popup/Contacts.js +++ b/dev/View/Popup/Contacts.js @@ -116,7 +116,7 @@ export class ContactsPopupView extends AbstractViewPopup { Remote.request('ContactsDelete', (iError, oData) => { if (iError) { - alert(oData?.ErrorMessage || getNotification(iError)); + alert(oData?.message || getNotification(iError)); } else { const page = this.contactsPage(); if (page > Math.max(1, Math.ceil((this.contactsCount() - count) / CONTACTS_PER_PAGE))) { @@ -181,7 +181,7 @@ export class ContactsPopupView extends AbstractViewPopup { Remote.request('ContactSave', (iError, oData) => { if (iError) { - alert(oData?.ErrorMessage || getNotification(iError)); + alert(oData?.message || getNotification(iError)); } else if (oData.Result.ResultID) { if (contact.id()) { contact.id(oData.Result.ResultID); @@ -245,7 +245,7 @@ export class ContactsPopupView extends AbstractViewPopup { if (iError) { // console.error(data); - alert(data?.ErrorMessage || getNotification(iError)); + alert(data?.message || getNotification(iError)); } else if (arrayLength(data.Result.List)) { data.Result.List.forEach(item => { item = ContactModel.reviveFromJson(item); diff --git a/dev/View/Popup/Identity.js b/dev/View/Popup/Identity.js index 58459f3a8..f061da0ed 100644 --- a/dev/View/Popup/Identity.js +++ b/dev/View/Popup/Identity.js @@ -54,7 +54,7 @@ export class IdentityPopupView extends AbstractViewPopup { identity.smimeKey(oData.Result.pkey); identity.smimeCertificate(oData.Result.x509); } else { - this.submitError(oData.ErrorMessage); + this.submitError(oData.message); } }, { name: identity.name(), @@ -81,7 +81,7 @@ export class IdentityPopupView extends AbstractViewPopup { if (oData.Result) { identity.smimeKey(oData.Result); } else { - this.submitError(oData.ErrorMessage); + this.submitError(oData.message); } }, { privateKey: identity.smimeKey(), diff --git a/dev/View/Popup/OpenPgpImport.js b/dev/View/Popup/OpenPgpImport.js index 896cc0829..3765b38e9 100644 --- a/dev/View/Popup/OpenPgpImport.js +++ b/dev/View/Popup/OpenPgpImport.js @@ -35,7 +35,7 @@ export class OpenPgpImportPopupView extends AbstractViewPopup { const fn = () => Remote.request('PgpSearchKey', (iError, oData) => { if (iError) { - this.key(oData.ErrorMessage); + this.key(oData.message); } else { this.key(oData.Result); } diff --git a/dev/View/Popup/SMimeImport.js b/dev/View/Popup/SMimeImport.js index 7ebf721f9..c686c7570 100644 --- a/dev/View/Popup/SMimeImport.js +++ b/dev/View/Popup/SMimeImport.js @@ -29,8 +29,8 @@ export class SMimeImportPopupView extends AbstractViewPopup { (iError, oData) => { if (iError) { this.pemError(true); - this.pemErrorMessage(getNotification(iError, oData?.ErrorMessage)); -// oData?.ErrorMessageAdditional; + this.pemErrorMessage(getNotification(iError, oData?.message)); +// oData?.messageAdditional; } else { this.close(); } diff --git a/dev/View/User/Login.js b/dev/View/User/Login.js index 6449f83fa..f80262252 100644 --- a/dev/View/User/Login.js +++ b/dev/View/User/Login.js @@ -118,9 +118,9 @@ export class LoginUserView extends AbstractViewLogin { if (Notifications.InvalidInputArgument == iError) { iError = Notifications.AuthError; } - this.submitError(getNotification(iError, oData?.ErrorMessage, + this.submitError(getNotification(iError, oData?.message, Notifications.UnknownError)); - this.submitErrorAdditional(oData?.ErrorMessageAdditional || oData?.message); + this.submitErrorAdditional(oData?.messageAdditional || oData?.message); } else { rl.setData(oData.Result); } diff --git a/dev/View/User/SystemDropDown.js b/dev/View/User/SystemDropDown.js index 1b10b4fcd..34a7880a6 100644 --- a/dev/View/User/SystemDropDown.js +++ b/dev/View/User/SystemDropDown.js @@ -59,7 +59,7 @@ export class SystemDropDownUserView extends AbstractViewRight { (iError/*, oData*/) => { if (iError) { AccountUserStore.loading(false); - alert(getNotification(iError).replace('%EMAIL%', email)); + alert('Account error: ' + getNotification(iError).replace('%EMAIL%', email)); if (account.isAdditional()) { showScreenPopup(AccountPopupView, [account]); } diff --git a/dev/boot.js b/dev/boot.js index 8d8c8f9df..f8c9ac381 100644 --- a/dev/boot.js +++ b/dev/boot.js @@ -123,9 +123,9 @@ window.rl = { return Promise.reject(Notifications.JsonParse); return { Result: false, - ErrorCode: 952, // Notifications.JsonParse - ErrorMessage: e.message, - ErrorMessageAdditional: data + code: 952, // Notifications.JsonParse + message: e.message, + messageAdditional: data } } */ diff --git a/dev/sieve.js b/dev/sieve.js index 33a8dec9e..122eb2e6c 100644 --- a/dev/sieve.js +++ b/dev/sieve.js @@ -57,7 +57,7 @@ window.Sieve = { Remote.request('FiltersScriptDelete', (iError, data) => iError - ? setError(data?.ErrorMessageAdditional || getNotification(iError)) + ? setError(data?.messageAdditional || getNotification(iError)) : scripts.remove(script) , {name:script.name()} @@ -69,7 +69,7 @@ window.Sieve = { Remote.request('FiltersScriptActivate', (iError, data) => iError - ? setError(data?.ErrorMessageAdditional || iError) + ? setError(data?.messageAdditional || iError) : scripts.forEach(script => script.active(script.name() === name)) , {name:name} diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions.php index a9013c2c1..848601c32 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -828,7 +828,7 @@ class Actions $sError = Enumerations\UploadError::getUserMessage($iError, $iClientError); if (!empty($sError)) { - $aResponse['ErrorCode'] = $iClientError; + $aResponse['code'] = $iClientError; $aResponse['Error'] = $sError; } } diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Response.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Response.php index 260c2177f..84310f213 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Response.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Response.php @@ -13,11 +13,11 @@ trait Response public function DefaultResponse($mResult, array $aAdditionalParams = array(), string $sActionName = '') : array { if (false === $mResult) { - if (!isset($aAdditionalParams['ErrorCode'])) { - $aAdditionalParams['ErrorCode'] = 0; + if (!isset($aAdditionalParams['code'])) { + $aAdditionalParams['code'] = 0; } - if (!isset($aAdditionalParams['ErrorMessage'])) { - $aAdditionalParams['ErrorMessage'] = ''; + if (!isset($aAdditionalParams['message'])) { + $aAdditionalParams['message'] = ''; } } @@ -36,9 +36,9 @@ trait Response public function FalseResponse(int $iErrorCode = 0, string $sErrorMessage = '', string $sAdditionalErrorMessage = '') : array { return $this->DefaultResponse(false, [ - 'ErrorCode' => $iErrorCode, - 'ErrorMessage' => $sErrorMessage, - 'ErrorMessageAdditional' => $sAdditionalErrorMessage + 'code' => $iErrorCode, + 'message' => $sErrorMessage, + 'messageAdditional' => $sAdditionalErrorMessage ]); } @@ -62,9 +62,9 @@ trait Response $this->logException($oException->getPrevious() ?: $oException); return $this->DefaultResponse(false, [ - 'ErrorCode' => $iErrorCode, - 'ErrorMessage' => $sErrorMessage, - 'ErrorMessageAdditional' => $sErrorMessageAdditional, + 'code' => $iErrorCode, + 'message' => $sErrorMessage, + 'messageAdditional' => $sErrorMessageAdditional, 'ExceptionCode' => $iExceptionCode ]); } diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/ServiceActions.php b/snappymail/v/0.0.0/app/libraries/RainLoop/ServiceActions.php index c1cc47628..205d9f703 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/ServiceActions.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/ServiceActions.php @@ -94,14 +94,20 @@ class ServiceActions throw new Exceptions\ClientException(Notifications::InvalidInputArgument, null, 'Action unknown'); } - $token = Utils::GetCsrfToken(); - if (isset($_SERVER['HTTP_X_SM_TOKEN'])) { - if ($_SERVER['HTTP_X_SM_TOKEN'] !== $token) { - throw new Exceptions\ClientException(Notifications::InvalidToken, null, 'HTTP Token mismatch'); - } - } else if ($this->oHttp->IsPost()) { - if (empty($_POST['XToken']) || $_POST['XToken'] !== $token) { - throw new Exceptions\ClientException(Notifications::InvalidToken, null, 'XToken Token mismatch'); + if ('Logout' !== $sAction) { + $token = Utils::GetCsrfToken(); + if (isset($_SERVER['HTTP_X_SM_TOKEN'])) { + if ($_SERVER['HTTP_X_SM_TOKEN'] !== $token) { + $sEmail = $this->oActions->getAccountFromToken(false)->Email(); + $this->oActions->logWrite("{$_SERVER['HTTP_X_SM_TOKEN']} !== {$token} for {$sEmail}", \LOG_ERROR, 'Token'); + throw new Exceptions\ClientException(Notifications::InvalidToken, null, 'HTTP Token mismatch'); + } + } else if ($this->oHttp->IsPost()) { + if (empty($_POST['XToken']) || $_POST['XToken'] !== $token) { + $sEmail = $this->oActions->getAccountFromToken(false)->Email(); + $this->oActions->logWrite("{$_POST['XToken']} !== {$token} for {$sEmail}", \LOG_ERROR, 'XToken'); + throw new Exceptions\ClientException(Notifications::InvalidToken, null, 'XToken mismatch'); + } } } diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Utils.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Utils.php index 32ce103af..a2542efb5 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Utils.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Utils.php @@ -70,11 +70,11 @@ class Utils { $oActions = \RainLoop\Api::Actions(); $oAccount = $oActions->getAccountFromToken(false); +// $oAccount = $oActions->getMainAccountFromToken(false); if ($oAccount) { - return '2-' . \sha1(APP_SALT.$oAccount->Hash()); - } - $oAccount = $oActions->getMainAccountFromToken(false); - if ($oAccount) { + if ($oAccount instanceof \RainLoop\Model\AdditionalAccount) { + return '2-' . \sha1(APP_SALT.$oAccount->Hash()); + } return '1-' . \sha1(APP_SALT.$oAccount->Hash()); } $sToken = \SnappyMail\Cookies::get(self::CONNECTION_TOKEN); @@ -82,7 +82,7 @@ class Utils $sToken = \MailSo\Base\Utils::Sha1Rand(APP_SALT); \SnappyMail\Cookies::set(self::CONNECTION_TOKEN, $sToken, \time() + 3600 * 24 * 30); } - return \sha1('Connection'.APP_SALT.$sToken.'Token'.APP_SALT); + return '0-' . \sha1('Connection'.APP_SALT.$sToken.'Token'.APP_SALT); } public static function GetCsrfToken() : string