dns2 2.0.5 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/test/index.js DELETED
@@ -1,402 +0,0 @@
1
- const assert = require('assert');
2
- const test = require('./test');
3
- const { Packet, createDOHServer, createServer, TCPClient, DOHClient, UDPClient } = require('..');
4
- const http = require('http');
5
- const tcp = require('net');
6
- const udp = require('dgram');
7
-
8
- /* TODO: below is unused, either delete or use
9
- const request = Buffer.from([
10
- 0x29, 0x64, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00,
11
- 0x00, 0x00, 0x00, 0x00, 0x06, 0x67, 0x6f, 0x6f,
12
- 0x67, 0x6c, 0x65, 0x03, 0x63, 0x6f, 0x6d, 0x00,
13
- 0x00, 0x01, 0x00, 0x01]);
14
- */
15
-
16
- const response = Buffer.from([
17
- 0x29, 0x64, 0x81, 0x80, 0x00, 0x01, 0x00, 0x01,
18
- 0x00, 0x00, 0x00, 0x00, 0x03, 0x77, 0x77, 0x77,
19
- 0x01, 0x7a, 0x02, 0x63, 0x6e, 0x00, 0x00, 0x01,
20
- 0x00, 0x01, 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01,
21
- 0x00, 0x00, 0x01, 0x90, 0x00, 0x04, 0x36, 0xde,
22
- 0x3c, 0xfc ]);
23
-
24
- test('Name#encode', function() {
25
- const name = Packet.Name.encode('www.google.com');
26
- const pattern = [ 3, 'w', 'w', 'w', 5, 'g', 'o', 'o', 'g', 'l', 'e', 3, 'c', 'o', 'm', '0' ];
27
- assert.equal(name.length, pattern.length);
28
- });
29
-
30
- test('Name#decode', function() {
31
- const reader = new Packet.Reader(response, 8 * 12);
32
- let name = Packet.Name.decode(reader);
33
- assert.equal(name, 'www.z.cn');
34
-
35
- reader.offset = 8 * 26;
36
- name = Packet.Name.decode(reader);
37
- assert.equal(reader.offset, 8 * 28);
38
- assert.equal(name, 'www.z.cn');
39
- });
40
-
41
- test('Header#encode', function() {
42
- const header = new Packet.Header({ id: 0x2964, qr: 1 });
43
- header.qdcount = 1;
44
- header.ancount = 2;
45
- assert.deepEqual(header.toBuffer(), Buffer.from([
46
- 0x29, 0x64, 0x80, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00 ]));
47
- });
48
-
49
- test('Header#parse', function() {
50
- const header = Packet.Header.parse(response);
51
- assert.equal(header.id, 0x2964);
52
- assert.equal(header.qr, 1);
53
- assert.equal(header.opcode, 0);
54
- assert.equal(header.aa, 0);
55
- assert.equal(header.tc, 0);
56
- assert.equal(header.rd, 1);
57
- assert.equal(header.z, 0);
58
- assert.equal(header.rcode, 0);
59
- assert.equal(header.qdcount, 1);
60
- assert.equal(header.ancount, 1);
61
- assert.equal(header.nscount, 0);
62
- assert.equal(header.arcount, 0);
63
- });
64
-
65
- test('Question#encode', function() {
66
- const question = new Packet.Question({
67
- name : 'google.com',
68
- type : Packet.TYPE.A,
69
- class : Packet.CLASS.IN,
70
- });
71
- //
72
- assert.deepEqual(question.toBuffer(), Buffer.from([
73
- 0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x03,
74
- 0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01,
75
- ]));
76
- });
77
-
78
- test('Question#decode', function() {
79
- const question = new Packet.Question('google.com',
80
- Packet.TYPE.A, Packet.CLASS.IN);
81
- assert.deepEqual(question.toBuffer(), Buffer.from([
82
- 0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x03,
83
- 0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01,
84
- ]));
85
- });
86
-
87
- //
88
- test('Package#toIPv6', function() {
89
- assert.equal(Packet.toIPv6([ 10756, 20034, 512, 0, 0, 0, 0, 803 ]), '2a04:4e42:200::323');
90
- assert.equal(Packet.toIPv6([ 10755, 45248, 3, 208, 0, 0, 5057, 61441 ]), '2a03:b0c0:3:d0::13c1:f001');
91
- assert.equal(Packet.toIPv6([ 10752, 5200, 16387, 2055, 0, 0, 0, 8206 ]), '2a00:1450:4003:807::200e');
92
- assert.equal(Packet.toIPv6([ 9734, 18176, 12552, 0, 0, 0, 44098, 10984 ]), '2606:4700:3108::ac42:2ae8');
93
- });
94
-
95
- test('Packet#parse', function() {
96
- const packet = Packet.parse(response);
97
- assert.equal(packet.questions[0].name, 'www.z.cn');
98
- assert.equal(packet.questions[0].type, Packet.TYPE.A);
99
- assert.equal(packet.questions[0].class, Packet.CLASS.IN);
100
- assert.equal(packet.answers[0].class, Packet.TYPE.A);
101
- assert.equal(packet.answers[0].class, Packet.CLASS.IN);
102
- assert.equal(packet.answers[0].address, '54.222.60.252');
103
- });
104
-
105
- test('Packet#encode', function() {
106
- const response = new Packet();
107
- //
108
- response.header.qr = 1;
109
- response.answers.push({
110
- name : 'lsong.org',
111
- type : Packet.TYPE.A,
112
- class : Packet.CLASS.IN,
113
- ttl : 300,
114
- address : '127.0.0.1',
115
- });
116
-
117
- response.answers.push({
118
- name : 'lsong.org',
119
- type : Packet.TYPE.AAAA,
120
- class : Packet.CLASS.IN,
121
- ttl : 300,
122
- address : '2001:db8::ff00:42:8329',
123
- });
124
-
125
- response.answers.push({
126
- name : 'lsong.org',
127
- type : Packet.TYPE.CNAME,
128
- class : Packet.CLASS.IN,
129
- ttl : 300,
130
- domain : 'sfo1.lsong.org',
131
- });
132
-
133
- response.answers.push({
134
- name : 'lsong.org',
135
- type : Packet.TYPE.PTR,
136
- class : Packet.CLASS.IN,
137
- ttl : 300,
138
- domain : 'sfo1.lsong.org',
139
- });
140
-
141
- response.authorities.push({
142
- name : 'lsong.org',
143
- type : Packet.TYPE.MX,
144
- class : Packet.CLASS.IN,
145
- ttl : 300,
146
- exchange : 'mail.lsong.org',
147
- priority : 5,
148
- });
149
-
150
- response.authorities.push({
151
- name : 'lsong.org',
152
- type : Packet.TYPE.NS,
153
- class : Packet.CLASS.IN,
154
- ttl : 300,
155
- ns : 'ns1.lsong.org',
156
- });
157
-
158
- response.additionals.push({
159
- name : 'lsong.org',
160
- type : Packet.TYPE.SOA,
161
- class : Packet.CLASS.IN,
162
- ttl : 300,
163
- primary : 'lsong.org',
164
- admin : 'admin@lsong.org',
165
- serial : 2016121301,
166
- refresh : 300,
167
- retry : 3,
168
- expiration : 10,
169
- minimum : 10,
170
- });
171
- //
172
- response.additionals.push({
173
- name : 'lsong.org',
174
- type : Packet.TYPE.TXT,
175
- class : Packet.CLASS.IN,
176
- ttl : 300,
177
- data : '#v=spf1 include:_spf.google.com ~all',
178
- });
179
-
180
- assert.deepEqual(Packet.parse(response.toBuffer()), response);
181
- });
182
-
183
- test('Packet#encode array of character strings', function() {
184
- const response = new Packet();
185
- //
186
- const dkim = [ 'v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsD6Th73ZDKkFAntNZDbx',
187
- 'Eh8VV2DSMs3re6v9/gXoT3dGcbSsuUMpfLzP5MWp4sW5cPyZxEGSiC03ZVIcCca0GRAuX9b1M0Qy25wLmPq',
188
- '8eT129mhwbeX50xTaXqq63A/oDM0QOPe1IeBMfPnR9tWXxvEzZKvVbmTlMY5bf+3QHLqmaEihnGlXh2LRVZ',
189
- 'be2EMlYo18YM4LU/LkZKe06rxlq38W22TL7964tr7jmOZ+huXf2iLSg4nc4UzLwb2aOdOA+w4c87h+HW/L8',
190
- '0548pFguF46TKc0C0egZ+oll3Y8zySYrbkVrWFrcpnrw5qDiRVHEjxqZSubSYX+16TjNcJg9QIDAQAB' ];
191
-
192
- response.header.qr = 1;
193
- response.answers.push({
194
- name : 'lsong.org',
195
- type : Packet.TYPE.TXT,
196
- class : Packet.CLASS.IN,
197
- ttl : 300,
198
- data : dkim,
199
- });
200
-
201
- assert.equal(Packet.parse(response.toBuffer()).answers[0].data, dkim.join(''));
202
- });
203
-
204
- test('EDNS.ECS#encode', function() {
205
- const query = new Packet.Resource.EDNS([
206
- new Packet.Resource.EDNS.ECS('10.11.12.13/24'),
207
- ]);
208
-
209
- const b = Packet.Resource.encode(query);
210
- assert.deepEqual(b, Buffer.from([
211
- 0x00, 0x00, 0x29, 0x02, 0x00, 0x00, 0x00, 0x00,
212
- 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x08, 0x00,
213
- 0x01, 0x18, 0x00, 0x0a, 0x0b, 0x0c, 0x0d ]));
214
- });
215
-
216
- test('EDNS#decode', function() {
217
- const buffer = Buffer.from([ 0x00, 0x08, 0x00, 0x08, 0x00, 0x01, 0x18, 0x00, 0x0a, 0x0b, 0x0c, 0x0d ]);
218
- const reader = new Packet.Reader(buffer);
219
- const record = Packet.Resource.EDNS.decode(reader, buffer.length);
220
-
221
- assert.equal(record.rdata.length, 1);
222
- assert.equal(record.rdata[0].ednsCode, 8);
223
- assert.equal(record.rdata[0].family, 1);
224
- assert.equal(record.rdata[0].sourcePrefixLength, 24);
225
- assert.equal(record.rdata[0].scopePrefixLength, 0);
226
- assert.equal(record.rdata[0].ip, '10.11.12.13');
227
-
228
- const query = new Packet.Resource.EDNS([
229
- new Packet.Resource.EDNS.ECS('10.20.0.0/16'),
230
- ]);
231
- const encoded = Packet.Resource.encode(query);
232
- const decoded = Packet.Resource.decode(encoded);
233
- delete decoded.name;
234
-
235
- assert.deepEqual(decoded, query);
236
- });
237
-
238
- test('EDNS#decode multiple', function() {
239
- const query = new Packet.Resource.EDNS([
240
- new Packet.Resource.EDNS.ECS('10.0.0.0/8'),
241
- new Packet.Resource.EDNS.ECS('10.9.0.0/16'),
242
- new Packet.Resource.EDNS.ECS('10.9.8.0/24'),
243
- new Packet.Resource.EDNS.ECS('10.9.8.7/32'),
244
- ]);
245
- const encoded = Packet.Resource.encode(query);
246
- const decoded = Packet.Resource.decode(encoded);
247
- delete decoded.name;
248
-
249
- assert.deepEqual(decoded, query);
250
- });
251
-
252
- test('server/doh#cors - default', async function() {
253
- const server = createDOHServer();
254
- const { port } = await new Promise(resolve => {
255
- server.on('listening', resolve);
256
- server.listen();
257
- });
258
- const { headers } = await get(`http://localhost:${port}`);
259
- assert.equal(headers['access-control-allow-origin'], '*');
260
- server.server.close();
261
- });
262
-
263
- test('server/doh#cors - no cors', async function() {
264
- const server = createDOHServer({
265
- cors: false,
266
- });
267
- const { port } = await new Promise(resolve => {
268
- server.on('listening', resolve);
269
- server.listen();
270
- });
271
- const { headers } = await get(`http://localhost:${port}`);
272
- assert.equal(headers['access-control-allow-origin'], undefined);
273
- server.server.close();
274
- });
275
-
276
- test('server/doh#cors - cors origin', async function() {
277
- const server = createDOHServer({
278
- cors: 'some.domain',
279
- });
280
- const { port } = await new Promise(resolve => {
281
- server.on('listening', resolve);
282
- server.listen();
283
- });
284
- const { headers } = await get(`http://localhost:${port}`);
285
- assert.equal(headers['access-control-allow-origin'], 'some.domain');
286
- assert.equal(headers.vary, 'Origin');
287
- server.server.close();
288
- });
289
-
290
- test('server/doh#cors - cors function', async function() {
291
- const server = createDOHServer({
292
- cors(domain) {
293
- if (domain === 'a.domain') {
294
- return true;
295
- } else if (domain === 'b.domain') {
296
- return false;
297
- }
298
- throw new Error(`Unexpected domain: ${domain}`);
299
- },
300
- });
301
- const { port } = await new Promise(resolve => {
302
- server.on('listening', resolve);
303
- server.listen();
304
- });
305
- let headers = (await get(`http://localhost:${port}`, { headers: { origin: 'a.domain' } })).headers;
306
- assert.equal(headers['access-control-allow-origin'], 'a.domain');
307
- assert.equal(headers.vary, 'Origin');
308
- headers = (await get(`http://localhost:${port}`, { headers: { origin: 'b.domain' } })).headers;
309
- assert.equal(headers['access-control-allow-origin'], 'false');
310
- assert.equal(headers.vary, 'Origin');
311
- server.server.close();
312
- });
313
-
314
- test('server/all#simple-request', async() => {
315
- const server = createServer({
316
- doh : true,
317
- tcp : true,
318
- udp : true,
319
- handle(request, send, _info) {
320
- const [ question ] = request.questions;
321
- assert.deepEqual(request.questions, [ { name: 'test.com', type: 1, class: 1 } ]);
322
- const response = Packet.createResponseFromRequest(request);
323
- response.answers.push({
324
- name : question.name,
325
- type : Packet.TYPE.TXT,
326
- class : Packet.CLASS.IN,
327
- ttl : 300,
328
- data : [ 'Hello World' ],
329
- });
330
- send(response);
331
- },
332
- });
333
- const servers = await server.listen();
334
- assert.ok(servers.udp.port > 1000);
335
- assert.ok(servers.tcp.port > 1000);
336
- assert.ok(servers.doh.port > 1000);
337
- const doh = DOHClient({ dns: `127.0.0.1:${servers.doh.port}`, http: true });
338
- const tcp = TCPClient({ dns: '127.0.0.1', port: servers.tcp.port });
339
- const udp = UDPClient({ dns: '127.0.0.1', port: servers.udp.port });
340
- const expected = [ { name: 'test.com', ttl: 300, type: 16, class: 1, data: 'Hello World' } ];
341
- assert.deepEqual((await doh('test.com')).answers, expected);
342
- assert.deepEqual((await tcp('test.com')).answers, expected);
343
- assert.deepEqual((await udp('test.com')).answers, expected);
344
- await server.close();
345
- });
346
-
347
- test('server/all#invalid-request', async() => {
348
- const server = createServer({
349
- doh : true,
350
- tcp : true,
351
- udp : true,
352
- handle : () => {},
353
- });
354
- const servers = await server.listen();
355
- assert.ok(servers.udp.port > 1000);
356
- assert.ok(servers.tcp.port > 1000);
357
- assert.ok(servers.doh.port > 1000);
358
-
359
- const errors = [];
360
- server.on('requestError', (e) => {
361
- errors.push(e);
362
- });
363
-
364
- const tcpSocket = tcp.connect({ port: servers.tcp.port, host: '127.0.0.1' });
365
- tcpSocket.on('connect', () => tcpSocket.end('INVALID'));
366
-
367
- const udpSocket = udp.createSocket('udp4');
368
- udpSocket.send('INVALID', servers.udp.port, '127.0.0.1', () => udpSocket.close());
369
-
370
- const dohConn = http.get(`http://127.0.0.1:${servers.doh.port}/dns-query?dns=INVALID`, {
371
- headers: { accept: 'application/dns-message' },
372
- }).on('error', () => {});
373
-
374
- await Promise.all([
375
- new Promise((resolve) => tcpSocket.on('close', resolve)),
376
- new Promise((resolve) => udpSocket.on('close', resolve)),
377
- new Promise((resolve) => dohConn.on('close', resolve)),
378
- ]);
379
-
380
- assert.equal(errors.length, 3);
381
-
382
- await server.close();
383
- });
384
-
385
- function get(url, options) {
386
- return new Promise((resolve, reject) => {
387
- try {
388
- const req = http.get(url, options, res => {
389
- const result = [];
390
- res.on('data', data => result.push(data));
391
- res.once('error', reject);
392
- res.once('end', () => resolve({
393
- body : Buffer.concat(result),
394
- headers : res.headers,
395
- }));
396
- });
397
- req.on('error', reject);
398
- } catch (err) {
399
- reject(err);
400
- }
401
- });
402
- }
package/test/test.js DELETED
@@ -1,34 +0,0 @@
1
- const { inspect } = require('util');
2
-
3
- let previous = Promise.resolve();
4
-
5
- /**
6
- * super tiny testing framework
7
- *
8
- * @author Liu song <hi@lsong.org>
9
- * @github https://github.com/song940
10
- */
11
- const test = (title, fn) => {
12
- previous = previous.then(async() => {
13
- try {
14
- await fn();
15
- console.log(color(` ✔ ${title}`, 32));
16
- } catch (err) {
17
- console.error(color(` ✘ ${title}`, 31));
18
- console.log();
19
- console.log(color(` ${err.name}: ${err.message}`, 31));
20
- console.error(color(` expected: ${inspect(err.expected)}`, 32));
21
- console.error(color(` actual: ${inspect(err.actual)}`, 31));
22
- console.log(err.stack);
23
- console.log();
24
- process.exit(1);
25
- }
26
- });
27
- return previous;
28
- };
29
-
30
- function color(str, c) {
31
- return `\x1b[${c}m${str}\x1b[0m`;
32
- }
33
-
34
- module.exports = test;