-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.js
110 lines (104 loc) · 3.94 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
const net = require('net');
const fs = require('fs');
const https = require('https');
var tldCache = {};
if (fs.existsSync(__dirname + '/tlds.json')) {
tldCache = JSON.parse(fs.readFileSync(__dirname + '/tlds.json'));
}
exports.getWhoisServer = async (tld) => {
tld = tld.toLowerCase();
if (typeof tldCache[tld] !== 'undefined') {
return tldCache[tld];
}
else {
let page = await new Promise((resolve, reject) => {
let req = https.request({
hostname: 'www.iana.org',
port: 443,
path: `/domains/root/db/${tld}.html`,
method: 'GET',
headers: {
'User-Agent': 'default/1.0'
}
}, (res) => {
res.setEncoding('utf8');
let responseBody = '';
res.on('data', (chunk) => {
responseBody += chunk;
});
res.on('end', () => {
resolve(responseBody);
});
});
req.on('error', (err) => {
reject(err);
});
req.end();
});
if (page.includes('This page does not exist')) {
return null;
}
else {
let whoisServer = page.match(/\<b\>WHOIS Server:\<\/b\>(.*)/g);
if (whoisServer !== null) {
whoisServer = whoisServer[0].replace(/\<\/?[^>]+\>/g, '').split(':');
if (whoisServer.length <= 1) {
return null;
}
whoisServer = whoisServer[1].trim();
tldCache[tld] = whoisServer;
fs.writeFileSync('./tlds.json', JSON.stringify(tldCache));
}
return whoisServer;
}
}
}
exports.getRawWhois = async (domain, server, port) => {
return new Promise((resolve, reject) => {
let data = '';
let socket = net.createConnection(port, server, () => {
let query = domain;
if (server == 'whois.verisign-grs.com') {
query = '=' + query;
}
socket.write(`${query}\r\n`, 'ascii');
});
socket.setEncoding('utf-8');
socket.on('data', function (response) {
data = data + response;
}).on('close', function (error) {
if (error) data = 'Could not fetch whois data';
return resolve(data);
});
});
}
exports.getWhois = async function (domain, config = {}) {
if (config.hasOwnProperty('tld') && config.tld !== null && config.tld !== '') {
tld = config.tld;
}
else {
tld = domain.split('.').pop();
}
let whoisServers = [];
let whoisServer = (config.hasOwnProperty('whoisServer') && config.whoisServer !== null && config.whoisServer !== '') ? config.whoisServer : await this.getWhoisServer(tld);
if (whoisServer === null) {
return null;
}
whoisServer = /^(http(s?)):\/\//i.test(whoisServer) ? (new URL(whoisServer)).hostname : whoisServer;
whoisServers.push(whoisServer);
let data = await this.getRawWhois(domain, whoisServer, 43);
if (!config.hasOwnProperty('deepWhois') || config.deepWhois) {
let regWhoisServer = data.match(/Registrar WHOIS Server: (.*)/g);
while (regWhoisServer !== null) {
regWhoisServer = regWhoisServer[0].replace(/Registrar WHOIS Server: /g, '').trim();
regWhoisServer = /^(http(s?)):\/\//i.test(regWhoisServer) ? (new URL(regWhoisServer)).hostname : regWhoisServer;
if (whoisServers.includes(regWhoisServer)) {
break;
}
data = await this.getRawWhois(domain, regWhoisServer, 43);
whoisServers.push(regWhoisServer);
regWhoisServer = data.match(/Registrar WHOIS Server: (.*)/g);
}
}
return data;
}