Merge pull request #177 from martenson/neutral-language

use neutral language for naming and describing assets in this repo
This commit is contained in:
Martin Cech 2018-10-16 11:02:00 -04:00 committed by GitHub
commit c14d8320fc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 42 additions and 42 deletions

View File

@ -3,21 +3,21 @@ List of disposable email domains
[![Licensed under CC0](https://licensebuttons.net/p/zero/1.0/88x31.png)](https://creativecommons.org/publicdomain/zero/1.0/) [![Licensed under CC0](https://licensebuttons.net/p/zero/1.0/88x31.png)](https://creativecommons.org/publicdomain/zero/1.0/)
This repo contains a [list of disposable and temporary email address domains](disposable_email_blacklist.conf) often used to register dummy users in order to spam/abuse some services. This repo contains a [list of disposable and temporary email address domains](disposable_email_blocklist.conf) often used to register dummy users in order to spam/abuse some services.
Originally collected to filter new user registration at https://usegalaxy.org and later merged with other lists found online. I cannot guarantee all of these can still be considered disposable but they probably were at one point in time. Originally collected to filter new user registration at https://usegalaxy.org and later merged with other lists found online. I cannot guarantee all of these can still be considered disposable but they probably were at one point in time.
Whitelist Allowlist
========= =========
The file [whitelist.conf](whitelist.conf) gathers email domains that are often identified as disposable but in fact are not. The file [allowlist.conf](allowlist.conf) gathers email domains that are often identified as disposable but in fact are not.
Example Usage Example Usage
============= =============
**Python** **Python**
```Python ```Python
blacklist = ('disposable_email_blacklist.conf') blocklist = ('disposable_email_blocklist.conf')
blacklist_content = [line.rstrip() for line in blacklist.readlines()] blocklist_content = [line.rstrip() for line in blocklist.readlines()]
if email.split('@')[1] in blacklist_content: if email.split('@')[1] in blocklist_content:
message = "Please enter your permanent email address." message = "Please enter your permanent email address."
return (False, message) return (False, message)
else: else:
@ -26,8 +26,8 @@ else:
Available as [PyPI module](https://pypi.org/project/disposable-email-domains) thanks to [@di](https://github.com/di) Available as [PyPI module](https://pypi.org/project/disposable-email-domains) thanks to [@di](https://github.com/di)
```python ```python
>>> from disposable_email_domains import blacklist >>> from disposable_email_domains import blacklist as blocklist
>>> 'bearsarefuzzy.com' in blacklist >>> 'bearsarefuzzy.com' in blocklist
True True
``` ```
@ -36,9 +36,9 @@ True
1. Make sure the passed email is valid. You can check that with [filter_var](https://secure.php.net/manual/en/function.filter-var.php) 1. Make sure the passed email is valid. You can check that with [filter_var](https://secure.php.net/manual/en/function.filter-var.php)
2. Make sure you have the mbstring extension installed on your server 2. Make sure you have the mbstring extension installed on your server
```php ```php
function isDisposableEmail($email, $blacklist_path = null) { function isDisposableEmail($email, $blocklist_path = null) {
if (!$blacklist_path) $blacklist_path = __DIR__ . '/disposable_email_blacklist.conf'; if (!$blocklist_path) $blocklist_path = __DIR__ . '/disposable_email_blocklist.conf';
$disposable_domains = file($blacklist_path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); $disposable_domains = file($blocklist_path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$domain = mb_strtolower(explode('@', trim($email))[1]); $domain = mb_strtolower(explode('@', trim($email))[1]);
return in_array($domain, $disposable_domains); return in_array($domain, $disposable_domains);
} }
@ -47,12 +47,12 @@ function isDisposableEmail($email, $blacklist_path = null) {
In resource model, usually it is `user.rb` In resource model, usually it is `user.rb`
```Ruby ```Ruby
before_validation :reject_email_blacklist before_validation :reject_email_blocklist
def reject_email_blacklist def reject_email_blocklist
blacklist = File.read('config/disposable_email_blacklist.conf').split("\n") blocklist = File.read('config/disposable_email_blocklist.conf').split("\n")
if blacklist.include?(email.split('@')[1]) if blocklist.include?(email.split('@')[1])
   errors[:email] << 'invalid email'    errors[:email] << 'invalid email'
return false return false
else else
@ -68,7 +68,7 @@ end
const readline = require('readline'), const readline = require('readline'),
fs = require('fs'); fs = require('fs');
const input = fs.createReadStream('./disposable_email_blacklist.conf'), const input = fs.createReadStream('./disposable_email_blocklist.conf'),
output = [], output = [],
rl = readline.createInterface({input}); rl = readline.createInterface({input});
@ -82,7 +82,7 @@ rl.on('line', (line) => {
rl.on('close', () => { rl.on('close', () => {
try { try {
const json = JSON.stringify(output); const json = JSON.stringify(output);
fs.writeFile('disposable_email_blacklist.json', json, () => console.log('--- FINISHED ---')); fs.writeFile('disposable_email_blocklist.json', json, () => console.log('--- FINISHED ---'));
} catch (e) { } catch (e) {
console.log(e); console.log(e);
} }
@ -91,20 +91,20 @@ rl.on('close', () => {
**C#** **C#**
```C# ```C#
private static readonly Lazy<HashSet<string>> _emailBlackList = new Lazy<HashSet<string>>(() => private static readonly Lazy<HashSet<string>> _emailBlockList = new Lazy<HashSet<string>>(() =>
{ {
var lines = File.ReadLines("disposable_email_blacklist.conf") var lines = File.ReadLines("disposable_email_blocklist.conf")
.Where(line => !string.IsNullOrWhiteSpace(line) && !line.TrimStart().StartsWith("//")); .Where(line => !string.IsNullOrWhiteSpace(line) && !line.TrimStart().StartsWith("//"));
return new HashSet<string>(lines, StringComparer.OrdinalIgnoreCase); return new HashSet<string>(lines, StringComparer.OrdinalIgnoreCase);
}); });
private static bool IsBlacklisted(string domain) => _emailBlackList.Value.Contains(domain); private static bool IsBlocklisted(string domain) => _emailBlockList.Value.Contains(domain);
... ...
var addr = new MailAddress(email); var addr = new MailAddress(email);
if (IsBlacklisted(addr.Host))) if (IsBlocklisted(addr.Host)))
throw new ApplicationException("Email is blacklisted."); throw new ApplicationException("Email is blocklisted.");
``` ```
Contributing Contributing
@ -113,11 +113,11 @@ Feel free to create PR with additions or request removal of some domain (with re
Use Use
`$ cat disposable_email_blacklist.conf your_file | tr '[:upper:]' '[:lower:]' | sort -f | uniq -i > new_file.conf` `$ cat disposable_email_blocklist.conf your_file | tr '[:upper:]' '[:lower:]' | sort -f | uniq -i > new_file.conf`
`$ comm -23 new_file.conf whitelist.conf > disposable_email_blacklist.conf` `$ comm -23 new_file.conf allowlist.conf > disposable_email_blocklist.conf`
to add contents of another file in the same format (only second level domains on new line without @). It also converts uppercase to lowercase, sorts, removes duplicates and removes whitelisted domains. to add contents of another file in the same format (only second level domains on new line without @). It also converts uppercase to lowercase, sorts, removes duplicates and removes allowlisted domains.
Changelog Changelog
============ ============
@ -126,4 +126,4 @@ Changelog
* 12/6/16 - Available as [PyPI module](https://pypi.org/project/disposable-email-domains) thanks to [@di](https://github.com/di) * 12/6/16 - Available as [PyPI module](https://pypi.org/project/disposable-email-domains) thanks to [@di](https://github.com/di)
* 7/27/16 - Converted all domains to the second level. This means that starting from [this commit](https://github.com/martenson/disposable-email-domains/commit/61ae67aacdab0b19098de2e13069d7c35b74017a) the implementers should take care of matching the second level domain names properly i.e. `@xxx.yyy.zzz` should match `yyy.zzz` in blacklist more info in [#46](https://github.com/martenson/disposable-email-domains/issues/46) * 7/27/16 - Converted all domains to the second level. This means that starting from [this commit](https://github.com/martenson/disposable-email-domains/commit/61ae67aacdab0b19098de2e13069d7c35b74017a) the implementers should take care of matching the second level domain names properly i.e. `@xxx.yyy.zzz` should match `yyy.zzz` in blocklist more info in [#46](https://github.com/martenson/disposable-email-domains/issues/46)

View File

@ -1,6 +1,6 @@
#!/usr/bin/env python #!/usr/bin/env python
"""Verify the integrity of the domain blacklist """Verify the integrity of the domain blocklist
""" """
import io import io
@ -11,11 +11,11 @@ from publicsuffixlist import PublicSuffixList
from requests import get from requests import get
blacklist = "disposable_email_blacklist.conf" blocklist = "disposable_email_blocklist.conf"
whitelist = "whitelist.conf" allowlist = "allowlist.conf"
files = { files = {
filename: open(filename).read().splitlines() for filename in [whitelist, blacklist] filename: open(filename).read().splitlines() for filename in [allowlist, blocklist]
} }
@ -44,7 +44,7 @@ def check_for_public_suffixes(filename):
print( print(
"At least one valid public suffix found in {!r}, please " "At least one valid public suffix found in {!r}, please "
"remove it. See https://publicsuffix.org for details on why this " "remove it. See https://publicsuffix.org for details on why this "
"shouldn't be blacklisted.".format(filename) "shouldn't be blocklisted.".format(filename)
) )
sys.exit(1) sys.exit(1)
@ -91,19 +91,19 @@ def check_for_intersection(filename_a, filename_b):
if __name__ == "__main__": if __name__ == "__main__":
# Check if any domains have a public suffix # Check if any domains have a public suffix
check_for_public_suffixes(blacklist) check_for_public_suffixes(blocklist)
# Check if any domains are not lowercase # Check if any domains are not lowercase
check_for_non_lowercase(whitelist) check_for_non_lowercase(allowlist)
check_for_non_lowercase(blacklist) check_for_non_lowercase(blocklist)
# Check if any domains are duplicated in the same list # Check if any domains are duplicated in the same list
check_for_duplicates(whitelist) check_for_duplicates(allowlist)
check_for_duplicates(blacklist) check_for_duplicates(blocklist)
# Check if any lists are not sorted # Check if any lists are not sorted
check_sort_order(whitelist) check_sort_order(allowlist)
check_sort_order(blacklist) check_sort_order(blocklist)
# Check if any domains are in both the whitelist and blacklist # Check if any domains are in both the allowlist and blocklist
check_for_intersection(whitelist, blacklist) check_for_intersection(allowlist, blocklist)