mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-08-25 18:19:22 +03:00
Merge branch 'master' into UserMailTemplates
# Conflicts: # dev/App/User.js # dev/Common/Enums.js # dev/Screen/User/Settings.js # dev/Settings/Admin/General.js # snappymail/v/0.0.0/app/libraries/RainLoop/Actions.php # snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Admin.php # snappymail/v/0.0.0/app/libraries/RainLoop/Actions/User.php
This commit is contained in:
commit
f7f56b3789
794 changed files with 96444 additions and 74188 deletions
|
|
@ -1,30 +1,28 @@
|
|||
import { Notification } from 'Common/Enums';
|
||||
import { isArray, pInt, pString } from 'Common/Utils';
|
||||
import { serverRequest } from 'Common/Links';
|
||||
import { getNotification } from 'Common/Translator';
|
||||
|
||||
let iJsonErrorCount = 0,
|
||||
iTokenErrorCount = 0;
|
||||
let iJsonErrorCount = 0;
|
||||
|
||||
const getURL = (add = '') => serverRequest('Json') + add,
|
||||
|
||||
checkResponseError = data => {
|
||||
const err = data ? data.ErrorCode : null;
|
||||
if (Notification.InvalidToken === err && 10 < ++iTokenErrorCount) {
|
||||
if (Notification.InvalidToken === err) {
|
||||
alert(getNotification(err));
|
||||
rl.logoutReload();
|
||||
} else {
|
||||
if ([
|
||||
Notification.AuthError,
|
||||
Notification.ConnectionError,
|
||||
Notification.DomainNotAllowed,
|
||||
Notification.AccountNotAllowed,
|
||||
Notification.MailServerError,
|
||||
Notification.UnknownNotification,
|
||||
Notification.UnknownError
|
||||
].includes(err)
|
||||
) {
|
||||
++iJsonErrorCount;
|
||||
}
|
||||
if (data.Logout || 7 < iJsonErrorCount) {
|
||||
} else if ([
|
||||
Notification.AuthError,
|
||||
Notification.ConnectionError,
|
||||
Notification.DomainNotAllowed,
|
||||
Notification.AccountNotAllowed,
|
||||
Notification.MailServerError,
|
||||
Notification.UnknownNotification,
|
||||
Notification.UnknownError
|
||||
].includes(err)
|
||||
) {
|
||||
if (7 < ++iJsonErrorCount) {
|
||||
rl.logoutReload();
|
||||
}
|
||||
}
|
||||
|
|
@ -78,6 +76,45 @@ export class AbstractFetchRemote
|
|||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows quicker visual responses to the user.
|
||||
* Can be used to stream lines of json encoded data, but does not work on all servers.
|
||||
* Apache needs 'flushpackets' like in <Proxy "fcgi://...." flushpackets=on></Proxy>
|
||||
*/
|
||||
streamPerLine(fCallback, sGetAdd) {
|
||||
rl.fetch(getURL(sGetAdd))
|
||||
.then(response => response.body)
|
||||
.then(body => {
|
||||
// Firefox TextDecoderStream is not defined
|
||||
// const reader = body.pipeThrough(new TextDecoderStream()).getReader();
|
||||
const reader = body.getReader(),
|
||||
re = /\r\n|\n|\r/gm,
|
||||
utf8decoder = new TextDecoder();
|
||||
let buffer = '';
|
||||
function processText({ done, value }) {
|
||||
buffer += value ? utf8decoder.decode(value, {stream: true}) : '';
|
||||
for (;;) {
|
||||
let result = re.exec(buffer);
|
||||
if (!result) {
|
||||
if (done) {
|
||||
break;
|
||||
}
|
||||
reader.read().then(processText);
|
||||
return;
|
||||
}
|
||||
fCallback(buffer.slice(0, result.index));
|
||||
buffer = buffer.slice(result.index + 1);
|
||||
re.lastIndex = 0;
|
||||
}
|
||||
if (buffer.length) {
|
||||
// last line didn't end in a newline char
|
||||
fCallback(buffer);
|
||||
}
|
||||
}
|
||||
reader.read().then(processText);
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sAction
|
||||
|
|
@ -86,7 +123,7 @@ export class AbstractFetchRemote
|
|||
* @param {string=} sGetAdd = ''
|
||||
* @param {Array=} aAbortActions = []
|
||||
*/
|
||||
defaultRequest(fCallback, sAction, params, iTimeout, sGetAdd, abortActions) {
|
||||
request(sAction, fCallback, params, iTimeout, sGetAdd, abortActions) {
|
||||
params = params || {};
|
||||
|
||||
const start = Date.now();
|
||||
|
|
@ -119,7 +156,7 @@ export class AbstractFetchRemote
|
|||
}
|
||||
*/
|
||||
if (data.Result) {
|
||||
iJsonErrorCount = iTokenErrorCount = 0;
|
||||
iJsonErrorCount = 0;
|
||||
} else {
|
||||
checkResponseError(data);
|
||||
iError = data.ErrorCode || Notification.UnknownError
|
||||
|
|
@ -141,32 +178,11 @@ export class AbstractFetchRemote
|
|||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
*/
|
||||
noop(fCallback) {
|
||||
this.defaultRequest(fCallback, 'Noop');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
*/
|
||||
getPublicKey(fCallback) {
|
||||
this.defaultRequest(fCallback, 'GetPublicKey');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sVersion
|
||||
*/
|
||||
jsVersion(fCallback, sVersion) {
|
||||
this.defaultRequest(fCallback, 'Version', {
|
||||
Version: sVersion
|
||||
});
|
||||
}
|
||||
|
||||
fastResolve(mData) {
|
||||
return Promise.resolve(mData);
|
||||
this.request('GetPublicKey', fCallback);
|
||||
}
|
||||
|
||||
setTrigger(trigger, value) {
|
||||
|
|
@ -178,7 +194,7 @@ export class AbstractFetchRemote
|
|||
}
|
||||
}
|
||||
|
||||
postRequest(action, fTrigger, params, timeOut) {
|
||||
post(action, fTrigger, params, timeOut) {
|
||||
this.setTrigger(fTrigger, true);
|
||||
return fetchJSON(action, '', params, pInt(timeOut, 30000),
|
||||
data => {
|
||||
|
|
|
|||
|
|
@ -1,206 +1,14 @@
|
|||
import { AbstractFetchRemote } from 'Remote/AbstractFetch';
|
||||
|
||||
class RemoteAdminFetch extends AbstractFetchRemote {
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sLogin
|
||||
* @param {string} sPassword
|
||||
*/
|
||||
adminLogin(fCallback, sLogin, sPassword, sCode) {
|
||||
this.defaultRequest(fCallback, 'AdminLogin', {
|
||||
Login: sLogin,
|
||||
Password: sPassword,
|
||||
TOTP: sCode
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} key
|
||||
* @param {?scalar} value
|
||||
* @param {?Function} fCallback
|
||||
*/
|
||||
adminLogout(fCallback) {
|
||||
this.defaultRequest(fCallback, 'AdminLogout');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {?} oData
|
||||
*/
|
||||
saveAdminConfig(fCallback, oData) {
|
||||
this.defaultRequest(fCallback, 'AdminSettingsUpdate', oData);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {boolean=} bIncludeAliases = true
|
||||
*/
|
||||
domainList(fCallback, bIncludeAliases = true) {
|
||||
this.defaultRequest(fCallback, 'AdminDomainList', {
|
||||
IncludeAliases: bIncludeAliases ? 1 : 0
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
*/
|
||||
packagesList(fCallback) {
|
||||
this.defaultRequest(fCallback, 'AdminPackagesList');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {Object} oPackage
|
||||
*/
|
||||
packageInstall(fCallback, oPackage) {
|
||||
this.defaultRequest(
|
||||
fCallback,
|
||||
'AdminPackageInstall',
|
||||
{
|
||||
Id: oPackage.id,
|
||||
Type: oPackage.type,
|
||||
File: oPackage.file
|
||||
},
|
||||
60000
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {Object} oPackage
|
||||
*/
|
||||
packageDelete(fCallback, oPackage) {
|
||||
this.defaultRequest(fCallback, 'AdminPackageDelete', {
|
||||
Id: oPackage.id
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sName
|
||||
*/
|
||||
domain(fCallback, sName) {
|
||||
this.defaultRequest(fCallback, 'AdminDomainLoad', {
|
||||
Name: sName
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sId
|
||||
*/
|
||||
plugin(fCallback, sId) {
|
||||
this.defaultRequest(fCallback, 'AdminPluginLoad', {
|
||||
Id: sId
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sName
|
||||
*/
|
||||
domainDelete(fCallback, sName) {
|
||||
this.defaultRequest(fCallback, 'AdminDomainDelete', {
|
||||
Name: sName
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sName
|
||||
* @param {boolean} bDisabled
|
||||
*/
|
||||
domainDisable(fCallback, sName, bDisabled) {
|
||||
this.defaultRequest(fCallback, 'AdminDomainDisable', {
|
||||
Name: sName,
|
||||
Disabled: bDisabled ? 1 : 0
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {Object} oConfig
|
||||
*/
|
||||
pluginSettingsUpdate(fCallback, oConfig) {
|
||||
this.defaultRequest(fCallback, 'AdminPluginSettingsUpdate', oConfig);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sId
|
||||
* @param {boolean} bDisabled
|
||||
*/
|
||||
pluginDisable(fCallback, sId, bDisabled) {
|
||||
this.defaultRequest(fCallback, 'AdminPluginDisable', {
|
||||
Id: sId,
|
||||
Disabled: bDisabled ? 1 : 0
|
||||
});
|
||||
}
|
||||
|
||||
createDomainAlias(fCallback, sName, sAlias) {
|
||||
this.defaultRequest(fCallback, 'AdminDomainAliasSave', {
|
||||
Name: sName,
|
||||
Alias: sAlias
|
||||
});
|
||||
}
|
||||
|
||||
createOrUpdateDomain(fCallback, oDomain) {
|
||||
this.defaultRequest(fCallback, 'AdminDomainSave', {
|
||||
Create: oDomain.edit() ? 0 : 1,
|
||||
Name: oDomain.name(),
|
||||
|
||||
IncHost: oDomain.imapServer(),
|
||||
IncPort: oDomain.imapPort(),
|
||||
IncSecure: oDomain.imapSecure(),
|
||||
IncShortLogin: oDomain.imapShortLogin() ? 1 : 0,
|
||||
|
||||
UseSieve: oDomain.useSieve() ? 1 : 0,
|
||||
SieveHost: oDomain.sieveServer(),
|
||||
SievePort: oDomain.sievePort(),
|
||||
SieveSecure: oDomain.sieveSecure(),
|
||||
|
||||
OutHost: oDomain.smtpServer(),
|
||||
OutPort: oDomain.smtpPort(),
|
||||
OutSecure: oDomain.smtpSecure(),
|
||||
OutShortLogin: oDomain.smtpShortLogin() ? 1 : 0,
|
||||
OutAuth: oDomain.smtpAuth() ? 1 : 0,
|
||||
OutSetSender: oDomain.smtpSetSender() ? 1 : 0,
|
||||
OutUsePhpMail: oDomain.smtpPhpMail() ? 1 : 0,
|
||||
|
||||
WhiteList: oDomain.whiteList()
|
||||
});
|
||||
}
|
||||
|
||||
testConnectionForDomain(fCallback, oDomain) {
|
||||
this.defaultRequest(fCallback, 'AdminDomainTest', {
|
||||
Name: oDomain.name(),
|
||||
IncHost: oDomain.imapServer(),
|
||||
IncPort: oDomain.imapPort(),
|
||||
IncSecure: oDomain.imapSecure(),
|
||||
UseSieve: oDomain.useSieve() ? 1 : 0,
|
||||
SieveHost: oDomain.sieveServer(),
|
||||
SievePort: oDomain.sievePort(),
|
||||
SieveSecure: oDomain.sieveSecure(),
|
||||
OutHost: oDomain.smtpServer(),
|
||||
OutPort: oDomain.smtpPort(),
|
||||
OutSecure: oDomain.smtpSecure(),
|
||||
OutAuth: oDomain.smtpAuth() ? 1 : 0,
|
||||
OutUsePhpMail: oDomain.smtpPhpMail() ? 1 : 0
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {?} oData
|
||||
*/
|
||||
testContacts(fCallback, oData) {
|
||||
this.defaultRequest(fCallback, 'AdminContactsTest', oData);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {?} oData
|
||||
*/
|
||||
saveNewAdminPassword(fCallback, oData) {
|
||||
this.defaultRequest(fCallback, 'AdminPasswordUpdate', oData);
|
||||
saveSetting(key, value, fCallback) {
|
||||
this.request('AdminSettingsUpdate', fCallback, {[key]: value});
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,9 @@
|
|||
import { isArray, arrayLength, pString, pInt } from 'Common/Utils';
|
||||
import { pString, pInt, b64EncodeJSONSafe } from 'Common/Utils';
|
||||
|
||||
import {
|
||||
getFolderHash,
|
||||
getFolderInboxName,
|
||||
getFolderUidNext,
|
||||
getFolderFromCacheList,
|
||||
MessageFlagsCache
|
||||
getFolderFromCacheList
|
||||
} from 'Common/Cache';
|
||||
|
||||
import { SettingsGet } from 'Common/Globals';
|
||||
|
|
@ -17,173 +15,7 @@ import { FolderUserStore } from 'Stores/User/Folder';
|
|||
|
||||
import { AbstractFetchRemote } from 'Remote/AbstractFetch';
|
||||
|
||||
import { FolderCollectionModel } from 'Model/FolderCollection';
|
||||
|
||||
//const toUTF8 = window.TextEncoder
|
||||
// ? text => String.fromCharCode(...new TextEncoder().encode(text))
|
||||
// : text => unescape(encodeURIComponent(text)),
|
||||
const urlsafeArray = array => btoa(unescape(encodeURIComponent(array.join('\x00').replace(/\r\n/g, '\n'))))
|
||||
.replace('+', '-')
|
||||
.replace('/', '_')
|
||||
.replace('=', '');
|
||||
|
||||
class RemoteUserFetch extends AbstractFetchRemote {
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
*/
|
||||
folders(fCallback) {
|
||||
this.defaultRequest(
|
||||
fCallback,
|
||||
'Folders',
|
||||
{
|
||||
SentFolder: SettingsGet('SentFolder'),
|
||||
DraftFolder: SettingsGet('DraftFolder'),
|
||||
SpamFolder: SettingsGet('SpamFolder'),
|
||||
TrashFolder: SettingsGet('TrashFolder'),
|
||||
ArchiveFolder: SettingsGet('ArchiveFolder')
|
||||
},
|
||||
null,
|
||||
'',
|
||||
['Folders']
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {FormData} oData
|
||||
*/
|
||||
login(fCallback, oData) {
|
||||
this.defaultRequest(fCallback, 'Login', oData);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
*/
|
||||
contactsSync(fCallback) {
|
||||
this.defaultRequest(fCallback, 'ContactsSync', null, 200000);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {boolean} bEnable
|
||||
* @param {string} sUrl
|
||||
* @param {string} sUser
|
||||
* @param {string} sPassword
|
||||
*/
|
||||
saveContactsSyncData(fCallback, bEnable, sUrl, sUser, sPassword) {
|
||||
this.defaultRequest(fCallback, 'SaveContactsSyncData', {
|
||||
Enable: bEnable ? 1 : 0,
|
||||
Url: sUrl,
|
||||
User: sUser,
|
||||
Password: sPassword
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sEmail
|
||||
* @param {string} sPassword
|
||||
* @param {boolean=} bNew
|
||||
*/
|
||||
accountSetup(fCallback, sEmail, sPassword, bNew = true) {
|
||||
this.defaultRequest(fCallback, 'AccountSetup', {
|
||||
Email: sEmail,
|
||||
Password: sPassword,
|
||||
New: bNew ? 1 : 0
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sEmailToDelete
|
||||
*/
|
||||
accountDelete(fCallback, sEmailToDelete) {
|
||||
this.defaultRequest(fCallback, 'AccountDelete', {
|
||||
EmailToDelete: sEmailToDelete
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {Array} aAccounts
|
||||
* @param {Array} aIdentities
|
||||
*/
|
||||
accountsAndIdentitiesSortOrder(fCallback, aAccounts, aIdentities) {
|
||||
this.defaultRequest(fCallback, 'AccountsAndIdentitiesSortOrder', {
|
||||
Accounts: aAccounts,
|
||||
Identities: aIdentities
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sId
|
||||
* @param {string} sEmail
|
||||
* @param {string} sName
|
||||
* @param {string} sReplyTo
|
||||
* @param {string} sBcc
|
||||
* @param {string} sSignature
|
||||
* @param {boolean} bSignatureInsertBefore
|
||||
*/
|
||||
identityUpdate(fCallback, sId, sEmail, sName, sReplyTo, sBcc, sSignature, bSignatureInsertBefore) {
|
||||
this.defaultRequest(fCallback, 'IdentityUpdate', {
|
||||
Id: sId,
|
||||
Email: sEmail,
|
||||
Name: sName,
|
||||
ReplyTo: sReplyTo,
|
||||
Bcc: sBcc,
|
||||
Signature: sSignature,
|
||||
SignatureInsertBefore: bSignatureInsertBefore ? 1 : 0
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sIdToDelete
|
||||
*/
|
||||
identityDelete(fCallback, sIdToDelete) {
|
||||
this.defaultRequest(fCallback, 'IdentityDelete', {
|
||||
IdToDelete: sIdToDelete
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
*/
|
||||
accountsAndIdentities(fCallback) {
|
||||
this.defaultRequest(fCallback, 'AccountsAndIdentities');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {SieveScriptModel} script
|
||||
*/
|
||||
filtersScriptSave(fCallback, script) {
|
||||
this.defaultRequest(fCallback, 'FiltersScriptSave', script.toJson());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} name
|
||||
*/
|
||||
filtersScriptActivate(fCallback, name) {
|
||||
this.defaultRequest(fCallback, 'FiltersScriptActivate', {name:name});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} name
|
||||
*/
|
||||
filtersScriptDelete(fCallback, name) {
|
||||
this.defaultRequest(fCallback, 'FiltersScriptDelete', {name:name});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
*/
|
||||
filtersGet(fCallback) {
|
||||
this.defaultRequest(fCallback, 'Filters', {});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
|
|
@ -233,23 +65,23 @@ class RemoteUserFetch extends AbstractFetchRemote {
|
|||
*/
|
||||
messageList(fCallback, params, bSilent = false) {
|
||||
const
|
||||
sFolderFullNameRaw = pString(params.Folder),
|
||||
folderHash = getFolderHash(sFolderFullNameRaw),
|
||||
useThreads = AppUserStore.threadsAllowed() && SettingsUserStore.useThreads() ? 1 : 0,
|
||||
inboxUidNext = getFolderInboxName() === sFolderFullNameRaw ? getFolderUidNext(sFolderFullNameRaw) : '';
|
||||
sFolderFullName = pString(params.Folder),
|
||||
folderHash = getFolderHash(sFolderFullName);
|
||||
|
||||
params.Folder = sFolderFullNameRaw;
|
||||
params.ThreadUid = useThreads ? params.ThreadUid : 0;
|
||||
params = Object.assign({
|
||||
Folder: '',
|
||||
Offset: 0,
|
||||
Limit: SettingsUserStore.messagesPerPage(),
|
||||
Search: '',
|
||||
UidNext: inboxUidNext,
|
||||
UseThreads: useThreads,
|
||||
ThreadUid: 0,
|
||||
Sort: FolderUserStore.sortMode()
|
||||
UidNext: getFolderUidNext(sFolderFullName), // Used to check for new messages
|
||||
Sort: FolderUserStore.sortMode(),
|
||||
Hash: folderHash + SettingsGet('AccountHash')
|
||||
}, params);
|
||||
params.Folder = sFolderFullName;
|
||||
if (AppUserStore.threadsAllowed() && SettingsUserStore.useThreads()) {
|
||||
params.UseThreads = 1;
|
||||
} else {
|
||||
params.ThreadUid = 0;
|
||||
}
|
||||
|
||||
let sGetAdd = '';
|
||||
|
||||
|
|
@ -257,13 +89,12 @@ class RemoteUserFetch extends AbstractFetchRemote {
|
|||
sGetAdd = 'MessageList/' +
|
||||
SUB_QUERY_PREFIX +
|
||||
'/' +
|
||||
urlsafeArray([SettingsGet('ProjectHash'),folderHash].concat(Object.values(params)));
|
||||
b64EncodeJSONSafe(params);
|
||||
params = {};
|
||||
}
|
||||
|
||||
this.defaultRequest(
|
||||
this.request('MessageList',
|
||||
fCallback,
|
||||
'MessageList',
|
||||
params,
|
||||
30000,
|
||||
sGetAdd,
|
||||
|
|
@ -273,43 +104,27 @@ class RemoteUserFetch extends AbstractFetchRemote {
|
|||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {Array} aDownloads
|
||||
*/
|
||||
messageUploadAttachments(fCallback, aDownloads) {
|
||||
this.defaultRequest(
|
||||
fCallback,
|
||||
'MessageUploadAttachments',
|
||||
{
|
||||
Attachments: aDownloads
|
||||
},
|
||||
999000
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sFolderFullNameRaw
|
||||
* @param {string} sFolderFullName
|
||||
* @param {number} iUid
|
||||
* @returns {boolean}
|
||||
*/
|
||||
message(fCallback, sFolderFullNameRaw, iUid) {
|
||||
sFolderFullNameRaw = pString(sFolderFullNameRaw);
|
||||
message(fCallback, sFolderFullName, iUid) {
|
||||
sFolderFullName = pString(sFolderFullName);
|
||||
iUid = pInt(iUid);
|
||||
|
||||
if (getFolderFromCacheList(sFolderFullNameRaw) && 0 < iUid) {
|
||||
this.defaultRequest(
|
||||
if (getFolderFromCacheList(sFolderFullName) && 0 < iUid) {
|
||||
this.request('Message',
|
||||
fCallback,
|
||||
'Message',
|
||||
{},
|
||||
null,
|
||||
'Message/' +
|
||||
SUB_QUERY_PREFIX +
|
||||
'/' +
|
||||
urlsafeArray([
|
||||
sFolderFullNameRaw,
|
||||
b64EncodeJSONSafe([
|
||||
sFolderFullName,
|
||||
iUid,
|
||||
SettingsGet('ProjectHash'),
|
||||
AppUserStore.threadsAllowed() && SettingsUserStore.useThreads() ? 1 : 0
|
||||
AppUserStore.threadsAllowed() && SettingsUserStore.useThreads() ? 1 : 0,
|
||||
SettingsGet('AccountHash')
|
||||
]),
|
||||
['Message']
|
||||
);
|
||||
|
|
@ -320,186 +135,12 @@ class RemoteUserFetch extends AbstractFetchRemote {
|
|||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {Array} aExternals
|
||||
*/
|
||||
composeUploadExternals(fCallback, aExternals) {
|
||||
this.defaultRequest(
|
||||
fCallback,
|
||||
'ComposeUploadExternals',
|
||||
{
|
||||
Externals: aExternals
|
||||
},
|
||||
999000
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sUrl
|
||||
* @param {string} sAccessToken
|
||||
*/
|
||||
composeUploadDrive(fCallback, sUrl, sAccessToken) {
|
||||
this.defaultRequest(
|
||||
fCallback,
|
||||
'ComposeUploadDrive',
|
||||
{
|
||||
AccessToken: sAccessToken,
|
||||
Url: sUrl
|
||||
},
|
||||
999000
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} folder
|
||||
* @param {Array=} list = []
|
||||
*/
|
||||
folderInformation(fCallback, folder, list = []) {
|
||||
let request = true;
|
||||
const uids = [];
|
||||
|
||||
if (arrayLength(list)) {
|
||||
request = false;
|
||||
list.forEach(messageListItem => {
|
||||
if (!MessageFlagsCache.getFor(messageListItem.folder, messageListItem.uid)) {
|
||||
uids.push(messageListItem.uid);
|
||||
}
|
||||
|
||||
if (messageListItem.threads.length) {
|
||||
messageListItem.threads.forEach(uid => {
|
||||
if (!MessageFlagsCache.getFor(messageListItem.folder, uid)) {
|
||||
uids.push(uid);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
if (uids.length) {
|
||||
request = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (request) {
|
||||
this.defaultRequest(fCallback, 'FolderInformation', {
|
||||
Folder: folder,
|
||||
FlagsUids: isArray(uids) ? uids : [],
|
||||
UidNext: getFolderInboxName() === folder ? getFolderUidNext(folder) : 0
|
||||
});
|
||||
} else if (SettingsUserStore.useThreads()) {
|
||||
rl.app.reloadFlagsCurrentMessageListAndMessageFromCache();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {Array} aFolders
|
||||
*/
|
||||
folderInformationMultiply(fCallback, aFolders) {
|
||||
this.defaultRequest(fCallback, 'FolderInformationMultiply', {
|
||||
Folders: aFolders
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
*/
|
||||
logout(fCallback) {
|
||||
this.defaultRequest(fCallback, 'Logout');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sFolderFullNameRaw
|
||||
* @param {Array} aUids
|
||||
* @param {boolean} bSetFlagged
|
||||
*/
|
||||
messageSetFlagged(fCallback, sFolderFullNameRaw, aUids, bSetFlagged) {
|
||||
this.defaultRequest(fCallback, 'MessageSetFlagged', {
|
||||
Folder: sFolderFullNameRaw,
|
||||
Uids: aUids.join(','),
|
||||
SetAction: bSetFlagged ? 1 : 0
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sFolderFullNameRaw
|
||||
* @param {Array} aUids
|
||||
* @param {boolean} bSetSeen
|
||||
*/
|
||||
messageSetSeen(fCallback, sFolderFullNameRaw, aUids, bSetSeen) {
|
||||
this.defaultRequest(fCallback, 'MessageSetSeen', {
|
||||
Folder: sFolderFullNameRaw,
|
||||
Uids: aUids.join(','),
|
||||
SetAction: bSetSeen ? 1 : 0
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sFolderFullNameRaw
|
||||
* @param {boolean} bSetSeen
|
||||
* @param {Array} aThreadUids = null
|
||||
*/
|
||||
messageSetSeenToAll(fCallback, sFolderFullNameRaw, bSetSeen, aThreadUids = null) {
|
||||
this.defaultRequest(fCallback, 'MessageSetSeenToAll', {
|
||||
Folder: sFolderFullNameRaw,
|
||||
SetAction: bSetSeen ? 1 : 0,
|
||||
ThreadUids: aThreadUids ? aThreadUids.join(',') : ''
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {Object} oData
|
||||
*/
|
||||
saveMessage(fCallback, oData) {
|
||||
this.defaultRequest(fCallback, 'SaveMessage', oData, 200000);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sMessageFolder
|
||||
* @param {number} iMessageUid
|
||||
* @param {string} sReadReceipt
|
||||
* @param {string} sSubject
|
||||
* @param {string} sText
|
||||
*/
|
||||
sendReadReceiptMessage(fCallback, sMessageFolder, iMessageUid, sReadReceipt, sSubject, sText) {
|
||||
this.defaultRequest(fCallback, 'SendReadReceiptMessage', {
|
||||
MessageFolder: sMessageFolder,
|
||||
MessageUid: iMessageUid,
|
||||
ReadReceipt: sReadReceipt,
|
||||
Subject: sSubject,
|
||||
Text: sText
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {Object} oData
|
||||
*/
|
||||
sendMessage(fCallback, oData) {
|
||||
this.defaultRequest(fCallback, 'SendMessage', oData, 30000);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {Object} oData
|
||||
*/
|
||||
saveSystemFolders(fCallback, oData) {
|
||||
this.defaultRequest(fCallback, 'SystemFoldersUpdate', oData);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {Object} oData
|
||||
*/
|
||||
saveSettings(fCallback, oData) {
|
||||
this.defaultRequest(fCallback, 'SettingsUpdate', oData);
|
||||
this.request('SettingsUpdate', fCallback, oData);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -513,234 +154,15 @@ class RemoteUserFetch extends AbstractFetchRemote {
|
|||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sFolderFullNameRaw
|
||||
*/
|
||||
folderClear(fCallback, sFolderFullNameRaw) {
|
||||
this.defaultRequest(fCallback, 'FolderClear', {
|
||||
Folder: sFolderFullNameRaw
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sFolderFullNameRaw
|
||||
* @param {boolean} bSubscribe
|
||||
*/
|
||||
folderSetSubscribe(fCallback, sFolderFullNameRaw, bSubscribe) {
|
||||
this.defaultRequest(fCallback, 'FolderSubscribe', {
|
||||
Folder: sFolderFullNameRaw,
|
||||
/*
|
||||
folderMove(sPrevFolderFullName, sNewFolderFullName, bSubscribe) {
|
||||
return this.post('FolderMove', FolderUserStore.foldersRenaming, {
|
||||
Folder: sPrevFolderFullName,
|
||||
NewFolder: sNewFolderFullName,
|
||||
Subscribe: bSubscribe ? 1 : 0
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sFolderFullNameRaw
|
||||
* @param {boolean} bCheckable
|
||||
*/
|
||||
folderSetCheckable(fCallback, sFolderFullNameRaw, bCheckable) {
|
||||
this.defaultRequest(fCallback, 'FolderCheckable', {
|
||||
Folder: sFolderFullNameRaw,
|
||||
Checkable: bCheckable ? 1 : 0
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sFolder
|
||||
* @param {string} sToFolder
|
||||
* @param {Array} aUids
|
||||
* @param {string=} sLearning
|
||||
* @param {boolean=} bMarkAsRead
|
||||
*/
|
||||
messagesMove(fCallback, sFolder, sToFolder, aUids, sLearning, bMarkAsRead) {
|
||||
this.defaultRequest(
|
||||
fCallback,
|
||||
'MessageMove',
|
||||
{
|
||||
FromFolder: sFolder,
|
||||
ToFolder: sToFolder,
|
||||
Uids: aUids.join(','),
|
||||
MarkAsRead: bMarkAsRead ? 1 : 0,
|
||||
Learning: sLearning || ''
|
||||
},
|
||||
null,
|
||||
'',
|
||||
['MessageList']
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sFolder
|
||||
* @param {string} sToFolder
|
||||
* @param {Array} aUids
|
||||
*/
|
||||
messagesCopy(fCallback, sFolder, sToFolder, aUids) {
|
||||
this.defaultRequest(fCallback, 'MessageCopy', {
|
||||
FromFolder: sFolder,
|
||||
ToFolder: sToFolder,
|
||||
Uids: aUids.join(',')
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sFolder
|
||||
* @param {Array} aUids
|
||||
*/
|
||||
messagesDelete(fCallback, sFolder, aUids) {
|
||||
this.defaultRequest(
|
||||
fCallback,
|
||||
'MessageDelete',
|
||||
{
|
||||
Folder: sFolder,
|
||||
Uids: aUids.join(',')
|
||||
},
|
||||
null,
|
||||
'',
|
||||
['MessageList']
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
*/
|
||||
appDelayStart(fCallback) {
|
||||
this.defaultRequest(fCallback, 'AppDelayStart');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
*/
|
||||
quota(fCallback) {
|
||||
this.defaultRequest(fCallback, 'Quota');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {number} iOffset
|
||||
* @param {number} iLimit
|
||||
* @param {string} sSearch
|
||||
*/
|
||||
contacts(fCallback, iOffset, iLimit, sSearch) {
|
||||
this.defaultRequest(
|
||||
fCallback,
|
||||
'Contacts',
|
||||
{
|
||||
Offset: iOffset,
|
||||
Limit: iLimit,
|
||||
Search: sSearch
|
||||
},
|
||||
null,
|
||||
'',
|
||||
['Contacts']
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sRequestUid
|
||||
* @param {string} sUid
|
||||
* @param {Array} aProperties
|
||||
*/
|
||||
contactSave(fCallback, sRequestUid, sUid, aProperties) {
|
||||
this.defaultRequest(fCallback, 'ContactSave', {
|
||||
RequestUid: sRequestUid,
|
||||
Uid: sUid,
|
||||
Properties: aProperties
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {Array} aUids
|
||||
*/
|
||||
contactsDelete(fCallback, aUids) {
|
||||
this.defaultRequest(fCallback, 'ContactsDelete', {
|
||||
Uids: aUids.join(',')
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
* @param {string} sQuery
|
||||
* @param {number} iPage
|
||||
*/
|
||||
suggestions(fCallback, sQuery, iPage) {
|
||||
this.defaultRequest(
|
||||
fCallback,
|
||||
'Suggestions',
|
||||
{
|
||||
Query: sQuery,
|
||||
Page: iPage
|
||||
},
|
||||
null,
|
||||
'',
|
||||
['Suggestions']
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {?Function} fCallback
|
||||
*/
|
||||
clearUserBackground(fCallback) {
|
||||
this.defaultRequest(fCallback, 'ClearUserBackground');
|
||||
}
|
||||
|
||||
foldersReload(fCallback) {
|
||||
this.abort('Folders')
|
||||
.postRequest('Folders', FolderUserStore.foldersLoading)
|
||||
.then(data => {
|
||||
data = FolderCollectionModel.reviveFromJson(data.Result);
|
||||
data && data.storeIt();
|
||||
fCallback && fCallback(true);
|
||||
})
|
||||
.catch(() => fCallback && setTimeout(() => fCallback(false), 1));
|
||||
}
|
||||
|
||||
foldersReloadWithTimeout() {
|
||||
this.setTrigger(FolderUserStore.foldersLoading, true);
|
||||
|
||||
clearTimeout(this.foldersTimeout);
|
||||
this.foldersTimeout = setTimeout(() => this.foldersReload(), 500);
|
||||
}
|
||||
|
||||
folderDelete(sFolderFullNameRaw) {
|
||||
return this.postRequest('FolderDelete', FolderUserStore.foldersDeleting, {
|
||||
Folder: sFolderFullNameRaw
|
||||
});
|
||||
}
|
||||
|
||||
folderCreate(sNewFolderName, sParentName) {
|
||||
return this.postRequest('FolderCreate', FolderUserStore.foldersCreating, {
|
||||
Folder: sNewFolderName,
|
||||
Parent: sParentName
|
||||
});
|
||||
}
|
||||
|
||||
folderMove(sPrevFolderFullNameRaw, sNewFolderFullName) {
|
||||
return this.postRequest('FolderMove', FolderUserStore.foldersRenaming, {
|
||||
Folder: sPrevFolderFullNameRaw,
|
||||
NewFolder: sNewFolderFullName
|
||||
});
|
||||
}
|
||||
|
||||
folderRename(sPrevFolderFullNameRaw, sNewFolderName) {
|
||||
return this.postRequest('FolderRename', FolderUserStore.foldersRenaming, {
|
||||
Folder: sPrevFolderFullNameRaw,
|
||||
NewFolderName: sNewFolderName
|
||||
});
|
||||
}
|
||||
|
||||
attachmentsActions(sAction, aHashes, fTrigger) {
|
||||
return this.postRequest('AttachmentsActions', fTrigger, {
|
||||
Do: sAction,
|
||||
Hashes: aHashes
|
||||
});
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
export default new RemoteUserFetch();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue