Skip to content

Commit 1498edc

Browse files
committed
Added QuirksMode detection unit tests
1 parent 19c4357 commit 1498edc

File tree

8 files changed

+119
-8
lines changed

8 files changed

+119
-8
lines changed

MailKit/Net/Imap/ImapEngine.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,13 +100,14 @@ enum ImapQuirksMode {
100100
Exchange2007,
101101
GMail,
102102
hMailServer,
103+
iCloud,
103104
ProtonMail,
104105
QQMail,
105106
SmarterMail,
106-
SunMicrosystems,
107107
UW,
108108
Yahoo,
109-
Yandex
109+
Yandex,
110+
Zoho
110111
}
111112

112113
class ImapFolderNameComparer : IEqualityComparer<string>
@@ -694,16 +695,18 @@ void DetectQuirksMode (string text)
694695
QuirksMode = ImapQuirksMode.Exchange;
695696
else if (text.StartsWith ("Gimap ready", StringComparison.Ordinal))
696697
QuirksMode = ImapQuirksMode.GMail;
697-
else if (text.Contains ("QQMail IMAP4 Server ready"))
698+
else if (text.Contains ("QQMail "))
698699
QuirksMode = ImapQuirksMode.QQMail;
699700
else if (text.StartsWith ("IMAPrev1", StringComparison.Ordinal)) // https://github.com/hmailserver/hmailserver/blob/master/hmailserver/source/Server/IMAP/IMAPConnection.cpp#L127
700701
QuirksMode = ImapQuirksMode.hMailServer;
701702
else if (text.Contains (" IMAP4rev1 2007f.") || text.Contains (" Panda IMAP "))
702703
QuirksMode = ImapQuirksMode.UW;
703704
else if (text.Contains ("SmarterMail"))
704705
QuirksMode = ImapQuirksMode.SmarterMail;
705-
else if (text.Contains ("Yandex IMAP4rev1 "))
706+
else if (text.Contains ("Yandex "))
706707
QuirksMode = ImapQuirksMode.Yandex;
708+
else if (text.Contains ("Zoho Mail "))
709+
QuirksMode = ImapQuirksMode.Zoho;
707710
}
708711

709712
/// <summary>
@@ -1425,8 +1428,8 @@ void ProcessCapabilityToken (string atom)
14251428
QuirksMode = ImapQuirksMode.GMail;
14261429
} else if (atom.Equals ("XSTOP", StringComparison.OrdinalIgnoreCase)) {
14271430
QuirksMode = ImapQuirksMode.ProtonMail;
1428-
} else if (atom.Equals ("X-SUN-IMAP", StringComparison.OrdinalIgnoreCase)) {
1429-
QuirksMode = ImapQuirksMode.SunMicrosystems;
1431+
} else if (atom.Equals ("XAPPLEPUSHSERVICE", StringComparison.OrdinalIgnoreCase)) {
1432+
QuirksMode = ImapQuirksMode.iCloud;
14301433
} else if (atom.Equals ("XYMHIGHESTMODSEQ", StringComparison.OrdinalIgnoreCase)) {
14311434
QuirksMode = ImapQuirksMode.Yahoo;
14321435
}

MailKit/Net/Imap/ImapFolder.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,7 @@ ImapCommand QueueOpenCommand (FolderAccess access, uint uidValidity, ulong highe
354354

355355
string qresync;
356356

357-
if ((Engine.Capabilities & ImapCapabilities.Annotate) != 0 && Engine.QuirksMode != ImapQuirksMode.SunMicrosystems)
357+
if ((Engine.Capabilities & ImapCapabilities.Annotate) != 0 && Engine.QuirksMode != ImapQuirksMode.iCloud)
358358
qresync = string.Format (CultureInfo.InvariantCulture, "(ANNOTATE QRESYNC ({0} {1}", uidValidity, highestModSeq);
359359
else
360360
qresync = string.Format (CultureInfo.InvariantCulture, "(QRESYNC ({0} {1}", uidValidity, highestModSeq);
@@ -573,7 +573,7 @@ ImapCommand QueueOpenCommand (FolderAccess access, CancellationToken cancellatio
573573

574574
if ((Engine.Capabilities & ImapCapabilities.CondStore) != 0)
575575
@params += "CONDSTORE";
576-
if ((Engine.Capabilities & ImapCapabilities.Annotate) != 0 && Engine.QuirksMode != ImapQuirksMode.SunMicrosystems)
576+
if ((Engine.Capabilities & ImapCapabilities.Annotate) != 0 && Engine.QuirksMode != ImapQuirksMode.iCloud)
577577
@params += " ANNOTATE";
578578

579579
if (@params.Length > 0)

UnitTests/Net/Imap/ImapClientTests.cs

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7565,5 +7565,107 @@ public void TestLowercaseImapResponses ()
75657565
Assert.That (client.Inbox, Is.Not.Null, "Inbox");
75667566
}
75677567
}
7568+
7569+
static void TestQuirksModeDetectionBasedOnGreeting (string greeting, string capability, ImapQuirksMode quirksMode)
7570+
{
7571+
var commands = new List<ImapReplayCommand> {
7572+
new ImapReplayCommand ("", greeting),
7573+
};
7574+
7575+
if (capability != null)
7576+
commands.Add (new ImapReplayCommand ("A00000000 CAPABILITY\r\n", capability));
7577+
7578+
using (var client = new ImapClient () { TagPrefix = 'A' }) {
7579+
try {
7580+
client.Connect (new ImapReplayStream (commands, false), "localhost", 143, SecureSocketOptions.None);
7581+
} catch (Exception ex) {
7582+
Assert.Fail ($"Did not expect an exception in Connect: {ex}");
7583+
}
7584+
7585+
Assert.That (client.IsConnected, Is.True, "Client failed to connect.");
7586+
7587+
var engine = (ImapEngine) client.SyncRoot;
7588+
7589+
Assert.That (engine.QuirksMode, Is.EqualTo (quirksMode), "QuirksMode");
7590+
}
7591+
}
7592+
7593+
[Test]
7594+
public void TestQuirksModeDetectionCourier ()
7595+
{
7596+
TestQuirksModeDetectionBasedOnGreeting ("courier.greeting.txt", null, ImapQuirksMode.Courier);
7597+
}
7598+
7599+
[Test]
7600+
public void TestQuirksModeDetectionCyrus ()
7601+
{
7602+
TestQuirksModeDetectionBasedOnGreeting ("cyrus.greeting.txt", null, ImapQuirksMode.Cyrus);
7603+
}
7604+
7605+
[Test]
7606+
public void TestQuirksModeDetectionDomino ()
7607+
{
7608+
TestQuirksModeDetectionBasedOnGreeting ("domino.greeting.txt", "domino.capability.txt", ImapQuirksMode.Domino);
7609+
}
7610+
7611+
[Test]
7612+
public void TestQuirksModeDetectionDovecot ()
7613+
{
7614+
TestQuirksModeDetectionBasedOnGreeting ("dovecot.greeting.txt", null, ImapQuirksMode.Dovecot);
7615+
}
7616+
7617+
[Test]
7618+
public void TestQuirksModeDetectionExchange2003 ()
7619+
{
7620+
TestQuirksModeDetectionBasedOnGreeting ("exchange.greeting-2003.txt", "exchange.capability-preauth.txt", ImapQuirksMode.Exchange2003);
7621+
}
7622+
7623+
[Test]
7624+
public void TestQuirksModeDetectionExchange2007 ()
7625+
{
7626+
TestQuirksModeDetectionBasedOnGreeting ("exchange.greeting-2007.txt", "exchange.capability-preauth.txt", ImapQuirksMode.Exchange2007);
7627+
}
7628+
7629+
[Test]
7630+
public void TestQuirksModeDetectionGMail ()
7631+
{
7632+
TestQuirksModeDetectionBasedOnGreeting ("gmail.greeting.txt", "gmail.capability.txt", ImapQuirksMode.GMail);
7633+
}
7634+
7635+
[Test]
7636+
public void TestQuirksModeDetectionQQMail ()
7637+
{
7638+
TestQuirksModeDetectionBasedOnGreeting ("qqmail.greeting.txt", null, ImapQuirksMode.QQMail);
7639+
}
7640+
7641+
[Test]
7642+
public void TestQuirksModeDetectionSmarterMail ()
7643+
{
7644+
TestQuirksModeDetectionBasedOnGreeting ("smartermail.greeting.txt", "common.capability.txt", ImapQuirksMode.SmarterMail);
7645+
}
7646+
7647+
[Test]
7648+
public void TestQuirksModeDetectionUW ()
7649+
{
7650+
TestQuirksModeDetectionBasedOnGreeting ("uw.greeting.txt", null, ImapQuirksMode.UW);
7651+
}
7652+
7653+
[Test]
7654+
public void TestQuirksModeDetectionYahooMail ()
7655+
{
7656+
TestQuirksModeDetectionBasedOnGreeting ("yahoo.greeting.txt", "yahoo.capabilities.txt", ImapQuirksMode.Yahoo);
7657+
}
7658+
7659+
[Test]
7660+
public void TestQuirksModeDetectionYandex ()
7661+
{
7662+
TestQuirksModeDetectionBasedOnGreeting ("yandex.greeting.txt", "yandex.capability.txt", ImapQuirksMode.Yandex);
7663+
}
7664+
7665+
[Test]
7666+
public void TestQuirksModeDetectionZoho ()
7667+
{
7668+
TestQuirksModeDetectionBasedOnGreeting ("zoho.greeting.txt", "zoho.capability.txt", ImapQuirksMode.Zoho);
7669+
}
75687670
}
75697671
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
* OK [CAPABILITY XAPPLEPUSHSERVICE IMAP4 IMAP4rev1 SASL-IR AUTH=ATOKEN AUTH=PLAIN] (2313B20-3ff771b405ab) pv50p00im-tygg10010601.me.com
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
* CAPABILITY IMAP4rev1 AUTH=PLAIN AUTH=LOGIN ID XSTOP APPENDLIMIT
2+
A######## OK CAPABILITY Complete
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
* OK [CAPABILITY IMAP4rev1 STARTTLS AUTH=PLAIN AUTH=LOGIN ID APPENDLIMIT] IMAP4rev1 Service Ready
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
* OK [CAPABILITY IMAP4 IMAP4rev1 ID AUTH=PLAIN AUTH=LOGIN NAMESPACE] QQMail IMAP4Server ready
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
* OK IMAP4rev1 SmarterMail

0 commit comments

Comments
 (0)