From 8956e4c77a1ba60a8e5d276d3aab4799fed45628 Mon Sep 17 00:00:00 2001 From: Gene Hightower Date: Tue, 16 Mar 2021 22:34:16 -0700 Subject: [PATCH] Switch from isemail package to smtp-address-parser for more correct RFC-5321 / RFC-6531 Mailbox address syntax check. --- README.md | 3 +- formats/idn-email.js | 10 +++++-- formats/iri.js | 12 +++++++- index.test.js | 1 + package-lock.json | 67 ++++++++++++++++++++++++++++++++++++++------ package.json | 2 +- 6 files changed, 81 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index e79e340..8ece73c 100644 --- a/README.md +++ b/README.md @@ -111,8 +111,7 @@ when writing the unit tests for IRI-references. Consider: ### idn-email -[`isemail`](https://www.npmjs.com/package/isemail) is used to check the validity -of the email. +[`smtp-address-parser`](https://www.npmjs.com/package/smtp-address-parser) is used to check the validity of the email. ### idn-hostname diff --git a/formats/idn-email.js b/formats/idn-email.js index 673933f..070aa35 100644 --- a/formats/idn-email.js +++ b/formats/idn-email.js @@ -1,5 +1,11 @@ -const { validate } = require('isemail'); +const { parse } = require('smtp-address-parser'); module.exports = value => { - return validate(value); + try { + parse(value); + return true; + } + catch { + return false; + } }; diff --git a/formats/iri.js b/formats/iri.js index 818e837..c919fd3 100644 --- a/formats/iri.js +++ b/formats/iri.js @@ -1,7 +1,17 @@ const { parse } = require('uri-js'); -const { validate } = require('isemail'); +const { addressParser } = require('smtp-address-parser'); const schemes = require('schemes'); +function validate (address) { + try { + addressParser(address); + return true; + } + catch { + return false; + } +} + module.exports = value => { const iri = parse(value); if (iri.scheme === 'mailto' && iri.to.every(validate)) { diff --git a/index.test.js b/index.test.js index 7d103d7..a7bcb97 100644 --- a/index.test.js +++ b/index.test.js @@ -99,6 +99,7 @@ describe('load types', function() { assert.ok(validate('квіточка@пошта.укр')); assert.ok(validate('Dörte@Sörensen.example.com')); assert.ok(validate('John.Doe@example.com')); + assert.ok(validate('"John Doe"@example.com')); }); it('reject invalid idn-emails', function() { diff --git a/package-lock.json b/package-lock.json index ec91437..aa9e070 100644 --- a/package-lock.json +++ b/package-lock.json @@ -191,6 +191,11 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -227,6 +232,11 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, + "discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=" + }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -488,14 +498,6 @@ "has-symbols": "^1.0.1" } }, - "isemail": { - "version": "3.2.0", - "resolved": "https://pkgs.dev.azure.com/tfs-gss/_packaging/tfs-gss/npm/registry/isemail/-/isemail-3.2.0.tgz", - "integrity": "sha1-WTEKAhkxqfsGu7UeFVzgs/I2gyw=", - "requires": { - "punycode": "2.x.x" - } - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -599,12 +601,28 @@ "yargs-unparser": "1.6.0" } }, + "moo": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz", + "integrity": "sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==" + }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, + "nearley": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", + "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", + "requires": { + "commander": "^2.19.0", + "moo": "^0.5.0", + "railroad-diagrams": "^1.0.0", + "randexp": "0.4.6" + } + }, "node-environment-flags": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", @@ -717,6 +735,20 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, + "railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=" + }, + "randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "requires": { + "discontinuous-range": "1.0.0", + "ret": "~0.1.10" + } + }, "readdirp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", @@ -738,6 +770,11 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, "schemes": { "version": "1.1.1", "resolved": "https://pkgs.dev.azure.com/tfs-gss/_packaging/tfs-gss/npm/registry/schemes/-/schemes-1.1.1.tgz", @@ -758,6 +795,15 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "smtp-address-parser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/smtp-address-parser/-/smtp-address-parser-1.0.2.tgz", + "integrity": "sha512-ZCrHHmI2ylWFFnjzIXK60BClnyPe4CM01IISO+59totbAzFnwHd+qvPbS8VQEp6CxiqrnTQlFBsKGPuaboOGyA==", + "requires": { + "nearley": "^2.20.1", + "typescript": "^4.2.3" + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -849,6 +895,11 @@ "is-number": "^7.0.0" } }, + "typescript": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", + "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==" + }, "uri-js": { "version": "4.2.2", "resolved": "https://pkgs.dev.azure.com/tfs-gss/_packaging/tfs-gss/npm/registry/uri-js/-/uri-js-4.2.2.tgz", diff --git a/package.json b/package.json index 5e29a5b..9f35303 100644 --- a/package.json +++ b/package.json @@ -12,9 +12,9 @@ "license": "MIT", "repository": "https://github.com/luzlab/ajv-formats-draft2019.git", "dependencies": { - "isemail": "^3.2.0", "punycode": "^2.1.1", "schemes": "^1.1.1", + "smtp-address-parser": "^1.0.2", "uri-js": "^4.2.2" }, "peerDependencies": {