UNPKG

socksv5

Version:

SOCKS protocol version 5 server and client implementations for node.js

258 lines (199 loc) 7.73 kB
var sprintf = require('sprintf').sprintf; var chai = require('chai'); var should = chai.should(); var expect = chai.expect; var v6 = require('../ipv6').v6; // A convenience function to convert a list of IPv6 address notations // to v6.Address instances function notationsToAddresseses(notations) { var addresses = []; notations.forEach(function (notation) { addresses.push(new v6.Address(notation)); }); return addresses; } describe('v6', function () { describe('A correct address', function () { var topic = new v6.Address('a::b'); it('contains no uppercase letters', function () { /[A-Z]/.test(topic.address).should.equal(false); }); it('validates as correct', function () { topic.isCorrect().should.equal(true); should.equal(topic.correctForm(), 'a::b'); }); }); describe('An address with a subnet', function () { var topic = new v6.Address('ffff::/64'); it('is contained by an identical address with an identical subnet', function () { var same = new v6.Address('ffff::/64'); topic.isInSubnet(same).should.equal(true); }); }); describe('Small subnets', function () { var topic = new v6.Address('ffff::/64'); it('is contained by larger subnets', function () { for (var i = 63; i > 0; i--) { var larger = new v6.Address(sprintf('ffff::/%d', i)); topic.isInSubnet(larger).should.equal(true); } }); }); describe('Large subnets', function () { var topic = new v6.Address('ffff::/8'); it('is not contained by smaller subnets', function () { for (var i = 9; i <= 128; i++) { var smaller = new v6.Address(sprintf('ffff::/%d', i)); topic.isInSubnet(smaller).should.equal(false); } }); }); describe('A canonical address', function () { var topic = new v6.Address('000a:0000:0000:0000:0000:0000:0000:000b'); it('is 39 characters long', function () { should.equal(topic.address.length, 39); }); it('validates as canonical', function () { topic.isCanonical().should.equal(true); should.equal(topic.canonicalForm(), '000a:0000:0000:0000:0000:0000:0000:000b'); }); }); describe('A v4-in-v6 address', function () { var topic = new v6.Address('::192.168.0.1'); it('validates', function () { topic.isValid().should.equal(true); }); it('is v4', function () { topic.is4().should.equal(true); }); }); describe('An address with a subnet', function () { var topic = new v6.Address('a:b::/48'); it('validates', function () { topic.isValid().should.equal(true); }); it('parses the subnet', function () { should.equal(topic.subnet, '/48'); }); it('is in its own subnet', function () { topic.isInSubnet(new v6.Address('a:b::/48')).should.equal(true); }); it('is not in another subnet', function () { topic.isInSubnet(new v6.Address('a:c::/48')).should.equal(false); }); }); describe('An address with a zone', function () { var topic = new v6.Address('a::b%abcdefg'); it('validates', function () { topic.isValid().should.equal(true); }); it('parses the zone', function () { should.equal(topic.zone, '%abcdefg'); }); }); describe('A teredo address', function () { var topic = new v6.Address('2001:0000:ce49:7601:e866:efff:62c3:fffe'); it('validates as Teredo', function () { topic.isTeredo().should.equal(true); }); it('contains valid Teredo information', function () { var teredo = topic.teredo(); should.equal(teredo.prefix, '2001:0000'); should.equal(teredo.server4, '206.73.118.1'); should.equal(teredo.flags, '1110100001100110'); should.equal(teredo.udpPort, '4096'); should.equal(teredo.client4, '157.60.0.1'); }); }); describe('A 6to4 address', function () { var topic = new v6.Address('2002:ce49:7601:1:2de:adff:febe:eeef'); it('validates as 6to4', function () { topic.is6to4().should.equal(true); }); it('contains valid 6to4 information', function () { var six2four = topic.six2four(); should.equal(six2four.prefix, '2002'); should.equal(six2four.gateway, '206.73.118.1'); }); }); describe('A different notation of the same address', function () { var addresses = notationsToAddresseses([ "2001:db8:0:0:1:0:0:1/128", "2001:db8:0:0:1:0:0:1/128%eth0", "2001:db8:0:0:1:0:0:1%eth0", "2001:db8:0:0:1:0:0:1", "2001:0db8:0:0:1:0:0:1", "2001:db8::1:0:0:1", "2001:db8::0:1:0:0:1", "2001:0db8::1:0:0:1", "2001:db8:0:0:1::1", "2001:db8:0000:0:1::1", "2001:DB8:0:0:1::1" ]); it('is parsed to the same result', function () { addresses.forEach(function (topic) { should.equal(topic.correctForm(), '2001:db8::1:0:0:1'); should.equal(topic.canonicalForm(), '2001:0db8:0000:0000:0001:0000:0000:0001'); should.equal(topic.v4inv6(), '2001:db8::1:0:0.0.0.1'); should.equal(topic.decimal(), '08193:03512:00000:00000:00001:00000:00000:00001'); should.equal(topic.binaryZeroPad(), '0010000000000001000011011011100000000000000000000000000000000000' + '0000000000000001000000000000000000000000000000000000000000000001'); }); }); }); describe('Address inside a URL or inside a URL with a port', function () { it('should work with a host address', function () { var obj = v6.Address.fromURL('2001:db8::5'); expect(obj.address.valid).to.equal(true); expect(obj.address.address).to.equal('2001:db8::5'); expect(obj.port).to.equal(null); }); it('should work with a basic URL', function () { var obj = v6.Address.fromURL('http://2001:db8::5/foo'); expect(obj.address.isValid()).to.equal(true); expect(obj.address.address).equal('2001:db8::5'); expect(obj.port).to.equal(null); }); it('should work with a URL with a port', function () { var obj = v6.Address.fromURL('http://[2001:db8::5]:80/foo'); expect(obj.address.isValid()).to.equal(true); expect(obj.address.address).to.equal('2001:db8::5'); expect(obj.port).to.equal(80); }); it('should work with a URL with a long port number', function () { var obj = v6.Address.fromURL('http://[2001:db8::5]:65536/foo'); expect(obj.address.isValid()).to.equal(true); expect(obj.address.address).to.equal('2001:db8::5'); expect(obj.port).to.equal(65536); }); it('should work with a address with a port', function () { var obj = v6.Address.fromURL('[2001:db8::5]:80'); expect(obj.address.isValid()).to.equal(true); expect(obj.address.address).to.equal('2001:db8::5'); expect(obj.port).to.equal(80); }); it('should work with a address with a long port', function () { var obj = v6.Address.fromURL('[2001:db8::5]:65536'); expect(obj.address.isValid()).to.equal(true); expect(obj.address.address).to.equal('2001:db8::5'); expect(obj.port).to.equal(65536); }); it('should parse the address but fail with an invalid port', function () { var obj = v6.Address.fromURL('[2001:db8::5]:65537'); expect(obj.address.isValid()).to.equal(true); expect(obj.address.address).to.equal('2001:db8::5'); expect(obj.port).to.equal(null); }); it('should fail with an invalid address and not return a port', function () { var obj = v6.Address.fromURL('[2001:db8:z:5]:65536'); expect(obj.error).to.equal('failed to parse address with port'); expect(obj.port).to.equal(null); }); }); });