Skip to content

Commit 02ad1e6

Browse files
committed
Do not use punycode to encode or decode the local-part of an addr-spec.
Fixes issue #1012
1 parent cc9ee00 commit 02ad1e6

File tree

3 files changed

+13
-47
lines changed

3 files changed

+13
-47
lines changed

MimeKit/InternetAddress.cs

-3
Original file line numberDiff line numberDiff line change
@@ -367,9 +367,6 @@ internal static bool TryParseLocalPart (byte[] text, ref int index, int endIndex
367367

368368
localpart = token.ToString ();
369369

370-
if (ParseUtils.IsIdnEncoded (localpart))
371-
localpart = MailboxAddress.IdnMapping.Decode (localpart);
372-
373370
return true;
374371
}
375372

MimeKit/MailboxAddress.cs

+3-8
Original file line numberDiff line numberDiff line change
@@ -307,17 +307,12 @@ static string EncodeAddrspec (string addrspec, int at)
307307
{
308308
if (at != -1) {
309309
var domainEncoded = ParseUtils.IsInternational (addrspec, at + 1);
310-
var localEncoded = ParseUtils.IsInternational (addrspec, 0, at);
311310

312-
if (!localEncoded && !domainEncoded)
311+
if (!domainEncoded)
313312
return addrspec;
314313

315-
string local, domain;
316-
317-
if (localEncoded)
318-
local = IdnMapping.Encode (addrspec, 0, at);
319-
else
320-
local = addrspec.Substring (0, at);
314+
var local = addrspec.Substring (0, at);
315+
string domain;
321316

322317
if (domainEncoded)
323318
domain = IdnMapping.Encode (addrspec, at + 1);

UnitTests/MailboxAddressTests.cs

+10-36
Original file line numberDiff line numberDiff line change
@@ -656,27 +656,23 @@ public void TestGetAddress ()
656656

657657
mailbox = new MailboxAddress ("Unit Test", "點看@domain.com");
658658
Assert.That (mailbox.GetAddress (false), Is.EqualTo ("點看@domain.com"), "IDN-decode #1");
659-
Assert.That (mailbox.GetAddress (true), Is.EqualTo (idn.GetAscii ("點看") + "@domain.com"), "IDN-encode #1");
660-
661-
mailbox = new MailboxAddress ("Unit Test", idn.GetAscii ("點看") + "@domain.com");
662-
Assert.That (mailbox.GetAddress (false), Is.EqualTo ("點看@domain.com"), "IDN-decode #2");
663-
Assert.That (mailbox.GetAddress (true), Is.EqualTo (idn.GetAscii ("點看") + "@domain.com"), "IDN-encode #2");
659+
Assert.That (mailbox.GetAddress (true), Is.EqualTo ("點看@domain.com"), "IDN-encode #1");
664660

665661
mailbox = new MailboxAddress ("Unit Test", "user@名がドメイン.com");
666-
Assert.That (mailbox.GetAddress (false), Is.EqualTo ("user@名がドメイン.com"), "IDN-decode #3");
667-
Assert.That (mailbox.GetAddress (true), Is.EqualTo ("user@" + idn.GetAscii ("名がドメイン.com")), "IDN-encode #3");
662+
Assert.That (mailbox.GetAddress (false), Is.EqualTo ("user@名がドメイン.com"), "IDN-decode #2");
663+
Assert.That (mailbox.GetAddress (true), Is.EqualTo ("user@" + idn.GetAscii ("名がドメイン.com")), "IDN-encode #2");
668664

669665
mailbox = new MailboxAddress ("Unit Test", "user@" + idn.GetAscii ("名がドメイン.com"));
670-
Assert.That (mailbox.GetAddress (false), Is.EqualTo ("user@名がドメイン.com"), "IDN-decode #4");
671-
Assert.That (mailbox.GetAddress (true), Is.EqualTo ("user@" + idn.GetAscii ("名がドメイン.com")), "IDN-encode #4");
666+
Assert.That (mailbox.GetAddress (false), Is.EqualTo ("user@名がドメイン.com"), "IDN-decode #3");
667+
Assert.That (mailbox.GetAddress (true), Is.EqualTo ("user@" + idn.GetAscii ("名がドメイン.com")), "IDN-encode #3");
672668

673669
mailbox = new MailboxAddress ("Unit Test", "點看@名がドメイン.com");
674-
Assert.That (mailbox.GetAddress (false), Is.EqualTo ("點看@名がドメイン.com"), "IDN-decode #5");
675-
Assert.That (mailbox.GetAddress (true), Is.EqualTo (idn.GetAscii ("點看") + "@" + idn.GetAscii ("名がドメイン.com")), "IDN-encode #5");
670+
Assert.That (mailbox.GetAddress (false), Is.EqualTo ("點看@名がドメイン.com"), "IDN-decode #4");
671+
Assert.That (mailbox.GetAddress (true), Is.EqualTo ("點看@" + idn.GetAscii ("名がドメイン.com")), "IDN-encode #4");
676672

677-
mailbox = new MailboxAddress ("Unit Test", idn.GetAscii ("點看") + "@" + idn.GetAscii ("名がドメイン.com"));
678-
Assert.That (mailbox.GetAddress (false), Is.EqualTo ("點看@名がドメイン.com"), "IDN-decode #6");
679-
Assert.That (mailbox.GetAddress (true), Is.EqualTo (idn.GetAscii ("點看") + "@" + idn.GetAscii ("名がドメイン.com")), "IDN-encode #6");
673+
mailbox = new MailboxAddress ("Unit Test", "點看@" + idn.GetAscii ("名がドメイン.com"));
674+
Assert.That (mailbox.GetAddress (false), Is.EqualTo ("點看@名がドメイン.com"), "IDN-decode #5");
675+
Assert.That (mailbox.GetAddress (true), Is.EqualTo ("點看@" + idn.GetAscii ("名がドメイン.com")), "IDN-encode #5");
680676
}
681677

682678
[Test]
@@ -694,12 +690,6 @@ public void TestIsInternational ()
694690
encoded = mailbox.ToString (options, true);
695691
Assert.That (encoded, Is.EqualTo ("Unit Test <點看@domain.com>"), "ToString local-part");
696692

697-
// Test IsInternational IDN-encoded local-parts
698-
mailbox = new MailboxAddress ("Unit Test", idn.GetAscii ("點看") + "@domain.com");
699-
Assert.That (mailbox.IsInternational, Is.True, "IsInternational IDN-encoded local-part");
700-
encoded = mailbox.ToString (options, true);
701-
Assert.That (encoded, Is.EqualTo ("Unit Test <點看@domain.com>"), "ToString IDN-encoded local-part");
702-
703693
// Test IsInternational domain
704694
mailbox = new MailboxAddress ("Unit Test", "user@名がドメイン.com");
705695
Assert.That (mailbox.IsInternational, Is.True, "IsInternational domain");
@@ -725,8 +715,6 @@ public void TestIsInternational ()
725715
[Test]
726716
public void TestIdnEncoding ()
727717
{
728-
const string userAscii = "[email protected]";
729-
const string userUnicode = "點看@domain.com";
730718
const string domainAscii = "[email protected]";
731719
const string domainUnicode = "user@名がドメイン.com";
732720
MailboxAddress mailbox;
@@ -744,20 +732,6 @@ public void TestIdnEncoding ()
744732
encoded = MailboxAddress.DecodeAddrspec (domainAscii);
745733
Assert.That (encoded, Is.EqualTo (domainUnicode), "Domain (Decode)");
746734

747-
encoded = MailboxAddress.EncodeAddrspec (userUnicode);
748-
Assert.That (encoded, Is.EqualTo (userAscii), "Local-part (Encode)");
749-
750-
encoded = MailboxAddress.DecodeAddrspec (userAscii);
751-
Assert.That (encoded, Is.EqualTo (userUnicode), "Local-part (Decode)");
752-
753-
mailbox = new MailboxAddress (string.Empty, userAscii);
754-
Assert.That (mailbox.GetAddress (true), Is.EqualTo (userAscii), "Ascii Local-part GetAddress(true)");
755-
Assert.That (mailbox.GetAddress (false), Is.EqualTo (userUnicode), "Ascii Local-part GetAddress(false)");
756-
757-
mailbox = new MailboxAddress (string.Empty, userUnicode);
758-
Assert.That (mailbox.GetAddress (true), Is.EqualTo (userAscii), "Unicode Local-part GetAddress(true)");
759-
Assert.That (mailbox.GetAddress (false), Is.EqualTo (userUnicode), "Unicode Local-part GetAddress(false)");
760-
761735
mailbox = new MailboxAddress (string.Empty, domainAscii);
762736
Assert.That (mailbox.GetAddress (true), Is.EqualTo (domainAscii), "Ascii Domain GetAddress(true)");
763737
Assert.That (mailbox.GetAddress (false), Is.EqualTo (domainUnicode), "Ascii Domain GetAddress(false)");

0 commit comments

Comments
 (0)