mirror of
https://github.com/the-djmaze/snappymail.git
synced 2024-09-20 07:35:55 +08:00
Change handling of (token) errors due to #1706
This commit is contained in:
parent
02ea6c4359
commit
d00c953c88
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -184,6 +184,9 @@ export const
|
|||
|| '';
|
||||
},
|
||||
|
||||
getErrorMessage = (code, data) =>
|
||||
getNotification(code) || data?.messageAdditional || data?.message || data,
|
||||
|
||||
/**
|
||||
* @param {*} code
|
||||
* @returns {string}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) : ''
|
||||
));
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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'));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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]);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -828,7 +828,7 @@ class Actions
|
|||
$sError = Enumerations\UploadError::getUserMessage($iError, $iClientError);
|
||||
|
||||
if (!empty($sError)) {
|
||||
$aResponse['ErrorCode'] = $iClientError;
|
||||
$aResponse['code'] = $iClientError;
|
||||
$aResponse['Error'] = $sError;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
]);
|
||||
}
|
||||
|
|
|
@ -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');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue