+ describe('validateProfile', function () {
+ let url, validationOptions;
+ beforeEach(function () {
+ url = 'https://example.com/';
+ validationOptions = {};
+ sinon.stub(dns, 'lookupAsync').resolves([{ family: 4, address: '10.11.12.14' }]);
+ });
+ it('rejects invalid url', async function () {
+ url = 'bad url';
+ await assert.rejects(() => communication.validateProfile(url, validationOptions), ValidationError);
+ });
+ it('covers success', async function () {
+ const result = await communication.validateProfile(url, validationOptions);
+ assert.strictEqual(result.isLoopback, false);
+ });
+ it('rejects invalid', async function () {
+ url = 'ftp://example.com/';
+ await assert.rejects(() => communication.validateProfile(url, validationOptions), ValidationError);
+ });
+
+ }); // validateProfile
+
+ describe('validateClientIdentifier', function () {
+ let url, validationOptions;
+ beforeEach(function () {
+ url = 'https://example.com/';
+ validationOptions = {};
+ sinon.stub(dns, 'lookupAsync').resolves([{ family: 4, address: '10.11.12.13' }]);
+ });
+ it('rejects invalid url', async function () {
+ await assert.rejects(() => communication.validateClientIdentifier('bad url'), ValidationError);
+ });
+ it('rejects invalid scheme', async function () {
+ url = 'ftp://example.com/';
+ await assert.rejects(() => communication.validateClientIdentifier(url, validationOptions), ValidationError);
+ });
+ it('rejects fragment', async function () {
+ url = 'https://example.com/#foo';
+ await assert.rejects(() => communication.validateClientIdentifier(url, validationOptions), ValidationError);
+ });
+ it('rejects username', async function () {
+ url = 'https://user@example.com/';
+ await assert.rejects(() => communication.validateClientIdentifier(url, validationOptions), ValidationError);
+ });
+ it('rejects password', async function () {
+ url = 'https://:foo@example.com/';
+ await assert.rejects(() => communication.validateClientIdentifier(url, validationOptions), ValidationError);
+ });
+ it('rejects relative path', async function () {
+ url = 'https://example.com/client/../sneaky';
+ await assert.rejects(() => communication.validateClientIdentifier(url, validationOptions), ValidationError);
+ });
+ it('rejects ipv4', async function () {
+ url = 'https://10.11.12.13/';
+ await assert.rejects(() => communication.validateClientIdentifier(url, validationOptions), ValidationError);
+ });
+ it('rejects ipv6', async function () {
+ url = 'https://[fd64:defa:00e5:caf4:0dff::ad39]/';
+ await assert.rejects(() => communication.validateClientIdentifier(url, validationOptions), ValidationError);
+ });
+ it('accepts ipv4 loopback', async function () {
+ url = 'https://127.0.0.1/';
+ const result = await communication.validateClientIdentifier(url, validationOptions);
+ assert.strictEqual(result.isLoopback, true);
+ });
+ it('accepts ipv6 loopback', async function () {
+ url = 'https://[::1]/';
+ const result = await communication.validateClientIdentifier(url, validationOptions);
+ assert.strictEqual(result.isLoopback, true);
+ });
+ it('accepts resolved ipv4 loopback', async function () {
+ dns.lookupAsync.resolves([{ family: 4, address: '127.0.0.1' }]);
+ const result = await communication.validateClientIdentifier(url, validationOptions);
+ assert.strictEqual(result.isLoopback, true);
+ });
+ it('accepts resolved ipv6 loopback', async function () {
+ dns.lookupAsync.resolves([{ family: 6, address: '::1' }]);
+ const result = await communication.validateClientIdentifier(url, validationOptions);
+ assert.strictEqual(result.isLoopback, true);
+ });
+ it('covers success', async function () {
+ const result = await communication.validateClientIdentifier(url, validationOptions);
+ assert.strictEqual(result.isLoopback, false);
+ });
+ it('rejects resolution failure', async function () {
+ dns.lookupAsync.rejects(new Error('oh no'));
+ await assert.rejects(() => communication.validateClientIdentifier(url, validationOptions), ValidationError);
+ });
+ it('rejects mismatched resolutions', async function () {
+ dns.lookupAsync.onCall(1).resolves([{ family: 4, address: '10.9.8.7' }]);
+ await assert.rejects(() => communication.validateClientIdentifier(url, validationOptions), ValidationError);
+ });
+ it('ignores unknown dns family', async function () {
+ dns.lookupAsync.resolves([{ family: 5, address: '10.9.8.7' }]);
+ const result = await communication.validateClientIdentifier(url, validationOptions);
+ assert.strictEqual(result.isLoopback, false);
+ });
+ it('covers rooted hostname', async function() {
+ url = 'https://example.com./';
+ const result = await communication.validateClientIdentifier(url, validationOptions);
+ assert.strictEqual(result.isLoopback, false);
+ });
+ it('covers unresolved', async function () {
+ dns.lookupAsync.resolves();
+ const result = await communication.validateClientIdentifier(url, validationOptions);
+ assert.strictEqual(result.isLoopback, false);
+ });
+ }); // validateClientIdentifier
+