Skip to content

Commit 925ca9b

Browse files
authored
Merge pull request #347 from maxmind/ugexe/email-nfc
Normalize email addresses to NFC
2 parents d6a12a9 + 11e6d07 commit 925ca9b

3 files changed

Lines changed: 14 additions & 0 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ CHANGELOG
2929
used. For example, `gmali.com` will become `gmail.com`.
3030
* When `hashAddress` is used, all trailing periods are now removed from an
3131
email address domain. Previously only a single period was removed.
32+
* When `hashAddress` is used, the local part of an email address is now
33+
normalized to NFC.
3234

3335
3.3.0 (2023-12-05)
3436
------------------

src/main/java/com/maxmind/minfraud/request/Email.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.nio.charset.StandardCharsets;
88
import java.security.MessageDigest;
99
import java.security.NoSuchAlgorithmException;
10+
import java.text.Normalizer;
1011
import java.util.Arrays;
1112
import java.util.Collections;
1213
import java.util.HashMap;
@@ -422,6 +423,7 @@ private String cleanAddress(String address) {
422423
String localPart = address.substring(0, domainIndex);
423424
String domain = address.substring(domainIndex + 1);
424425

426+
localPart = Normalizer.normalize(localPart, Normalizer.Form.NFC);
425427
domain = cleanDomain(domain);
426428

427429
int stopChar;

src/test/java/com/maxmind/minfraud/request/EmailTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,16 @@ public void testNormalizing() throws NoSuchAlgorithmException {
223223
e = new Builder(false).address("foo@example.com...").hashAddress().build();
224224
assertEquals(toMD5("foo@example.com"), e.getAddress(), "MD5");
225225
assertEquals("example.com...", e.getDomain(), "domain");
226+
227+
e = new Builder().address("example@bu\u0308cher.com").hashAddress().build();
228+
assertEquals("2b21bc76dab3c8b1622837c1d698936c", e.getAddress(), "MD5");
229+
e = new Builder().address("example@b\u00FCcher.com").hashAddress().build();
230+
assertEquals("2b21bc76dab3c8b1622837c1d698936c", e.getAddress(), "MD5");
231+
232+
e = new Builder().address("bu\u0308cher@example.com").hashAddress().build();
233+
assertEquals("53550c712b146287a2d0dd30e5ed6f4b", e.getAddress(), "MD5");
234+
e = new Builder().address("b\u00FCcher@example.com").hashAddress().build();
235+
assertEquals("53550c712b146287a2d0dd30e5ed6f4b", e.getAddress(), "MD5");
226236
}
227237

228238
private String toMD5(String s) throws NoSuchAlgorithmException {

0 commit comments

Comments
 (0)