Bug 1231592 - Implement mail.imap.force_select for misbehaving IMAP servers. Use UidExpunge(). r=jorgk, sr=rkent DONTBUILD

This commit is contained in:
Gene Smith 2017-03-15 14:42:00 +01:00
Родитель e8f1969b62
Коммит df71ce2067
2 изменённых файлов: 37 добавлений и 7 удалений

Просмотреть файл

@ -320,6 +320,7 @@ static bool gHideOtherUsersFromList = false;
static bool gUseEnvelopeCmd = false; static bool gUseEnvelopeCmd = false;
static bool gUseLiteralPlus = true; static bool gUseLiteralPlus = true;
static bool gExpungeAfterDelete = false; static bool gExpungeAfterDelete = false;
static bool gForceSelect = true; // bug 1231592
static bool gCheckDeletedBeforeExpunge = false; //bug 235004 static bool gCheckDeletedBeforeExpunge = false; //bug 235004
static int32_t gResponseTimeout = 60; static int32_t gResponseTimeout = 60;
@ -366,8 +367,9 @@ nsresult nsImapProtocol::GlobalInitialization(nsIPrefBranch *aPrefBranch)
aPrefBranch->GetIntPref("mail.imap.expunge_threshold_number", aPrefBranch->GetIntPref("mail.imap.expunge_threshold_number",
&gExpungeThreshold); &gExpungeThreshold);
aPrefBranch->GetIntPref("mailnews.tcptimeout", &gResponseTimeout); aPrefBranch->GetIntPref("mailnews.tcptimeout", &gResponseTimeout);
nsCOMPtr<nsIXULAppInfo> appInfo(do_GetService(XULAPPINFO_SERVICE_CONTRACTID)); aPrefBranch->GetBoolPref("mail.imap.force_select", &gForceSelect);
nsCOMPtr<nsIXULAppInfo> appInfo(do_GetService(XULAPPINFO_SERVICE_CONTRACTID));
if (appInfo) if (appInfo)
{ {
nsCString appName, appVersion; nsCString appName, appVersion;
@ -2543,6 +2545,14 @@ void nsImapProtocol::ProcessSelectedStateURL()
} }
else else
{ {
// For some misbehaving imap servers, we must send imap SELECT even when
// already SELECTed on same mailbox.
if (gForceSelect)
{
SelectMailbox(mailboxName.get());
selectIssued = true;
}
// get new message counts, if any, from server // get new message counts, if any, from server
if (m_needNoop) if (m_needNoop)
{ {
@ -3008,20 +3018,37 @@ void nsImapProtocol::ProcessSelectedStateURL()
(ImapOnlineCopyState) ImapOnlineCopyStateType::kFailedCopy; (ImapOnlineCopyState) ImapOnlineCopyStateType::kFailedCopy;
if (m_imapMailFolderSink) if (m_imapMailFolderSink)
m_imapMailFolderSink->OnlineCopyCompleted(this, copyState); m_imapMailFolderSink->OnlineCopyCompleted(this, copyState);
// Don't mark message 'Deleted' for AOL servers or standard imap servers
// Don't mark msg 'Deleted' for aol servers since we already issued 'xaol-move' cmd. // that support MOVE since we already issued an 'xaol-move' or 'move' command.
if (GetServerStateParser().LastCommandSuccessful() && if (GetServerStateParser().LastCommandSuccessful() &&
(m_imapAction == nsIImapUrl::nsImapOnlineMove) && (m_imapAction == nsIImapUrl::nsImapOnlineMove) &&
!(GetServerStateParser().ServerIsAOLServer() || !(GetServerStateParser().ServerIsAOLServer() ||
GetServerStateParser().GetCapabilityFlag() & kHasMoveCapability)) GetServerStateParser().GetCapabilityFlag() & kHasMoveCapability))
{ {
// Simulate MOVE for servers that don't support MOVE: do COPY-DELETE-EXPUNGE.
Store(messageIdString, "+FLAGS (\\Deleted \\Seen)", Store(messageIdString, "+FLAGS (\\Deleted \\Seen)",
bMessageIdsAreUids); bMessageIdsAreUids);
bool storeSuccessful = GetServerStateParser().LastCommandSuccessful(); bool storeSuccessful = GetServerStateParser().LastCommandSuccessful();
if (storeSuccessful)
if (gExpungeAfterDelete && storeSuccessful) {
Expunge(); if(gExpungeAfterDelete)
{
// This will expunge all emails marked as deleted in mailbox,
// not just the ones marked as deleted above.
Expunge();
}
else
{
// Check if UIDPLUS capable so we can just expunge emails we just
// copied and marked as deleted. This prevents expunging emails
// that other clients may have marked as deleted in the mailbox
// and don't want them to disappear.
if (GetServerStateParser().GetCapabilityFlag() & kUidplusCapability)
{
UidExpunge(messageIdString);
}
}
}
if (m_imapMailFolderSink) if (m_imapMailFolderSink)
{ {
copyState = storeSuccessful ? (ImapOnlineCopyState) ImapOnlineCopyStateType::kSuccessfulDelete copyState = storeSuccessful ? (ImapOnlineCopyState) ImapOnlineCopyStateType::kSuccessfulDelete

Просмотреть файл

@ -109,6 +109,9 @@ pref("mail.imap.hdr_chunk_size", 200);
// Should we filter imap messages based on new messages since the previous // Should we filter imap messages based on new messages since the previous
// highest UUID seen instead of unread? // highest UUID seen instead of unread?
pref("mail.imap.filter_on_new", true); pref("mail.imap.filter_on_new", true);
// Force send of extra/redundant imap SELECT before FETCH if needed by
// some misbehaving imap servers.
pref("mail.imap.force_select", true);
// if true, we assume that a user access a folder in the other users namespace // if true, we assume that a user access a folder in the other users namespace
// is acting as a delegate for that folder, and wishes to use the other users // is acting as a delegate for that folder, and wishes to use the other users