mirror of
https://github.com/smogon/pokemon-showdown.git
synced 2026-05-06 13:47:24 -05:00
56 lines
1.4 KiB
JavaScript
56 lines
1.4 KiB
JavaScript
/**
|
|
* DNSBL support [OPTIONAL]
|
|
* Pokemon Showdown - http://pokemonshowdown.com/
|
|
*
|
|
* This file controls support for DNSBLs. It's optional, so it can be
|
|
* removed entirely safely.
|
|
*
|
|
* DNSBLs are DNS-based blackhole lists, which list IPs known for
|
|
* running proxies, spamming, or other abuse. By default, PS will lock
|
|
* users using these IPs.
|
|
*
|
|
* @license MIT license
|
|
*/
|
|
|
|
const BLOCKLISTS = ['sbl.spamhaus.org', 'rbl.efnetrbl.org'];
|
|
|
|
var dns = require('dns');
|
|
|
|
var dnsblCache = exports.cache = {
|
|
'127.0.0.1': false
|
|
};
|
|
|
|
/**
|
|
* Dnsbl.query(ip, callback)
|
|
*
|
|
* Calls callback(blocklist), where blocklist is the blocklist domain
|
|
* if the passed IP is in a blocklist, or boolean false if the IP is
|
|
* not in any blocklist.
|
|
*/
|
|
exports.query = function queryDnsbl(ip, callback) {
|
|
if (ip in dnsblCache) {
|
|
callback(dnsblCache[ip]);
|
|
return;
|
|
}
|
|
var reversedIpDot = ip.split('.').reverse().join('.') + '.';
|
|
queryDnsblLoop(ip, callback, reversedIpDot, 0);
|
|
};
|
|
|
|
function queryDnsblLoop(ip, callback, reversedIpDot, index) {
|
|
if (index >= BLOCKLISTS.length) {
|
|
// not in any blocklist
|
|
callback(dnsblCache[ip] = false);
|
|
return;
|
|
}
|
|
var blocklist = BLOCKLISTS[index];
|
|
dns.resolve4(reversedIpDot + blocklist, function (err, addresses) {
|
|
if (!err) {
|
|
// blocked
|
|
callback(dnsblCache[ip] = blocklist);
|
|
} else {
|
|
// not blocked, try next blocklist
|
|
queryDnsblLoop(ip, callback, reversedIpDot, index + 1);
|
|
}
|
|
});
|
|
}
|