diff --git a/README.md b/README.md index 4a1ae85985..49cb02897a 100644 --- a/README.md +++ b/README.md @@ -14,10 +14,11 @@ domains directly by opening a pull request. ## Database -There are three key data files in this project: +There are four key data files in this project: - [free.txt](https://github.com/willwhite/freemail/blob/master/data/free.txt) contains a list of domains that are known to provide free email service - [disposable.txt](https://github.com/willwhite/freemail/blob/master/data/disposable.txt) contains a list of domains that are known to provide disposable email service +- [reserved.txt](https://github.com/willwhite/freemail/blob/master/data/reserved.txt) contains [IANA reserved and special-use domains](http://www.iana.org/domains/reserved) that should not be used for real email - [blacklist.txt](https://github.com/willwhite/freemail/blob/master/data/blacklist.txt) contains a list of domains that this project will refuse to add to either list Domains may only be a member of one list. @@ -47,6 +48,10 @@ freemail.isDisposable('smith@gmail.com'); > false freemail.isDisposable('jack@mailinater.com'); > true +freemail.isReserved('smith@example.com'); +> true +freemail.isReserved('smith@gmail.com'); +> false ``` diff --git a/data/reserved.txt b/data/reserved.txt new file mode 100644 index 0000000000..9f248dd116 --- /dev/null +++ b/data/reserved.txt @@ -0,0 +1,10 @@ +example +example.com +example.net +example.org +invalid +localhost +test +home.arpa +local +onion diff --git a/index.js b/index.js index f5cc7f64e0..d2cc5dba62 100644 --- a/index.js +++ b/index.js @@ -3,6 +3,7 @@ var tldjs = require('tldjs'); var disposable = fs.readFileSync(__dirname + '/data/disposable.txt').toString().split('\n'); var free = fs.readFileSync(__dirname + '/data/free.txt').toString().split('\n').concat(disposable); +var reserved = fs.readFileSync(__dirname + '/data/reserved.txt').toString().split('\n').filter(Boolean); function isFree(email) { if (typeof email !== 'string') throw new TypeError('email must be a string'); @@ -16,7 +17,17 @@ function isDisposable(email) { return disposable.indexOf(domain) !== -1; } +function isReserved(email) { + if (typeof email !== 'string') throw new TypeError('email must be a string'); + var host = email.split('@').pop().toLowerCase(); + // tldjs returns null for single-label hosts such as localhost, so fall back to the raw host. + var domain = tldjs.getDomain(host) || host; + if (reserved.indexOf(domain) !== -1) return true; + return reserved.indexOf(domain.split('.').pop()) !== -1; +} + module.exports = { isFree: isFree, - isDisposable: isDisposable + isDisposable: isDisposable, + isReserved: isReserved }; diff --git a/test/test.js b/test/test.js index 83efd41a49..204adeab5b 100644 --- a/test/test.js +++ b/test/test.js @@ -30,3 +30,23 @@ test('gmail.com should not be disposable', function(t) { t.plan(1); t.equal(freemail.isDisposable('smith@gmail.com'), false); }); + +test('example.com should be reserved', function(t) { + t.plan(1); + t.equal(freemail.isReserved('smith@example.com'), true); +}); + +test('localhost should be reserved', function(t) { + t.plan(1); + t.equal(freemail.isReserved('localhost'), true); +}); + +test('foo.test should be reserved via reserved tld', function(t) { + t.plan(1); + t.equal(freemail.isReserved('smith@foo.test'), true); +}); + +test('gmail.com should not be reserved', function(t) { + t.plan(1); + t.equal(freemail.isReserved('smith@gmail.com'), false); +});