PHP WebShell
Текущая директория: /opt/BitGoJS/modules/bitgo/dist/test/v2/unit
Просмотр файла: auth.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const nock = require("nock");
require("should");
const sinon = require("sinon");
const src_1 = require("../../../src");
describe('Auth', () => {
let sandbox;
beforeEach(() => {
sandbox = sinon.createSandbox();
});
afterEach(() => {
sandbox.restore();
});
describe('Auth V3', () => {
it('should set auth version to 3 when initializing a bitgo object with explicit auth version 3', () => {
const bitgo = new src_1.BitGo({ authVersion: 3 });
bitgo.getAuthVersion().should.eql(3);
});
it('should pass "3.0" as the bitgo-auth-version header when auth v3 is enabled', async () => {
const url = 'https://bitgo.invalid';
const bitgo = new src_1.BitGo({ authVersion: 3 });
const scope = nock(url, {
reqheaders: {
'bitgo-auth-version': '3.0',
},
})
.get('/')
.reply(200);
await bitgo.get(url).should.eventually.have.property('status', 200);
scope.done();
});
it('should reject responses outside the response validity window', async () => {
const url = 'https://bitgo.invalid';
const bitgo = new src_1.BitGo({ authVersion: 3, accessToken: `v2x${'0'.repeat(64)}` });
const verifyResponseStub = sinon.stub(bitgo, 'verifyResponse').returns({
isValid: true,
isInResponseValidityWindow: false,
expectedHmac: '',
signatureSubject: '',
verificationTime: 0,
});
const scope = nock(url).get('/').reply(200);
await bitgo
.get(url)
.should.be.rejectedWith('server response outside response validity time window, possible man-in-the-middle-attack');
verifyResponseStub.restore();
scope.done();
});
it('should accept responses within the response validity window', async () => {
const url = 'https://bitgo.invalid';
const bitgo = new src_1.BitGo({ authVersion: 3, accessToken: `v2x${'0'.repeat(64)}` });
const verifyResponseStub = sinon.stub(bitgo, 'verifyResponse').returns({
isValid: true,
isInResponseValidityWindow: true,
expectedHmac: '',
signatureSubject: '',
verificationTime: 0,
});
const scope = nock(url).get('/').reply(200);
await bitgo.get(url).should.eventually.have.property('status', 200);
verifyResponseStub.restore();
scope.done();
});
it('should include the auth version in the hmac subject', async () => {
const url = 'https://bitgo.invalid';
const accessToken = `v2x${'0'.repeat(64)}`;
const bitgo = new src_1.BitGo({ authVersion: 3, accessToken });
const crypto = require('crypto');
const createHmacSpy = sinon.spy(crypto, 'createHmac');
const updateSpy = sinon.spy(crypto.Hmac.prototype, 'update');
const verifyResponseStub = sinon.stub(bitgo, 'verifyResponse').returns({
isValid: true,
isInResponseValidityWindow: true,
expectedHmac: '',
signatureSubject: '',
verificationTime: 0,
});
const scope = nock(url).get('/').reply(200);
await bitgo.get(url).should.eventually.have.property('status', 200);
createHmacSpy.firstCall.calledWith('sha256', accessToken).should.be.true();
updateSpy.firstCall.calledWith(sinon.match('3.0')).should.be.true();
createHmacSpy.restore();
verifyResponseStub.restore();
scope.done();
});
});
describe('Auth V2', () => {
it('should default to auth version 2 when initializing a bitgo object', () => {
const bitgo = new src_1.BitGo();
bitgo.getAuthVersion().should.eql(2);
});
it('should pass "2.0" as the bitgo-auth-version header when auth v2 is enabled', async () => {
const url = 'https://bitgo.invalid';
const bitgo = new src_1.BitGo();
const scope = nock(url, {
reqheaders: {
'bitgo-auth-version': '2.0',
},
})
.get('/')
.reply(200);
await bitgo.get(url).should.eventually.have.property('status', 200);
scope.done();
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdjIvdW5pdC9hdXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkJBQTZCO0FBQzdCLGtCQUFnQjtBQUNoQiwrQkFBK0I7QUFFL0Isc0NBQXFDO0FBRXJDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO0lBQ3BCLElBQUksT0FBTyxDQUFDO0lBQ1osVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLE9BQU8sR0FBRyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDSCxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7UUFDdkIsRUFBRSxDQUFDLDRGQUE0RixFQUFFLEdBQUcsRUFBRTtZQUNwRyxNQUFNLEtBQUssR0FBRyxJQUFJLFdBQUssQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDRFQUE0RSxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzFGLE1BQU0sR0FBRyxHQUFHLHVCQUF1QixDQUFDO1lBQ3BDLE1BQU0sS0FBSyxHQUFHLElBQUksV0FBSyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFNUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDdEIsVUFBVSxFQUFFO29CQUNWLG9CQUFvQixFQUFFLEtBQUs7aUJBQzVCO2FBQ0YsQ0FBQztpQkFDQyxHQUFHLENBQUMsR0FBRyxDQUFDO2lCQUNSLEtBQUss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QUFFLENBQUM7UUFDZixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7UUFDdkIsRUFBRSxDQUFDLG1FQUFtRSxFQUFFLEdBQUcsRUFBRTtZQUMzRSxNQUFNLEtBQUssR0FBRyxJQUFJLFdBQUssRUFBRSxDQUFDO1lBQzFCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDRFQUE0RSxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzFGLE1BQU0sR0FBRyxHQUFHLHVCQUF1QixDQUFDO1lBQ3BDLE1BQU0sS0FBSyxHQUFHLElBQUksV0FBSyxFQUFFLENBQUM7WUFFMUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDdEIsVUFBVSxFQUFFO29CQUNWLG9CQUFvQixFQUFFLEtBQUs7aUJBQzVCO2FBQ0YsQ0FBQztpQkFDQyxHQUFHLENBQUMsR0FBRyxDQUFDO2lCQUNSLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVkLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3BFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIG5vY2sgZnJvbSAnbm9jayc7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5cbmltcG9ydCB7IEJpdEdvIH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcblxuZGVzY3JpYmUoJ0F1dGgnLCAoKSA9PiB7XG4gIGxldCBzYW5kYm94O1xuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBzYW5kYm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICB9KTtcbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBzYW5kYm94LnJlc3RvcmUoKTtcbiAgfSk7XG4gIGRlc2NyaWJlKCdBdXRoIFYzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgc2V0IGF1dGggdmVyc2lvbiB0byAzIHdoZW4gaW5pdGlhbGl6aW5nIGEgYml0Z28gb2JqZWN0IHdpdGggZXhwbGljaXQgYXV0aCB2ZXJzaW9uIDMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBiaXRnbyA9IG5ldyBCaXRHbyh7IGF1dGhWZXJzaW9uOiAzIH0pO1xuICAgICAgYml0Z28uZ2V0QXV0aFZlcnNpb24oKS5zaG91bGQuZXFsKDMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXNzIFwiMy4wXCIgYXMgdGhlIGJpdGdvLWF1dGgtdmVyc2lvbiBoZWFkZXIgd2hlbiBhdXRoIHYzIGlzIGVuYWJsZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSAnaHR0cHM6Ly9iaXRnby5pbnZhbGlkJztcbiAgICAgIGNvbnN0IGJpdGdvID0gbmV3IEJpdEdvKHsgYXV0aFZlcnNpb246IDMgfSk7XG5cbiAgICAgIGNvbnN0IHNjb3BlID0gbm9jayh1cmwsIHtcbiAgICAgICAgcmVxaGVhZGVyczoge1xuICAgICAgICAgICdiaXRnby1hdXRoLXZlcnNpb24nOiAnMy4wJyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAgIC5nZXQoJy8nKVxuICAgICAgICAucmVwbHkoMjAwKTtcblxuICAgICAgYXdhaXQgYml0Z28uZ2V0KHVybCkuc2hvdWxkLmV2ZW50dWFsbHkuaGF2ZS5wcm9wZXJ0eSgnc3RhdHVzJywgMjAwKTtcbiAgICAgIHNjb3BlLmRvbmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IHJlc3BvbnNlcyBvdXRzaWRlIHRoZSByZXNwb25zZSB2YWxpZGl0eSB3aW5kb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSAnaHR0cHM6Ly9iaXRnby5pbnZhbGlkJztcbiAgICAgIGNvbnN0IGJpdGdvID0gbmV3IEJpdEdvKHsgYXV0aFZlcnNpb246IDMsIGFjY2Vzc1Rva2VuOiBgdjJ4JHsnMCcucmVwZWF0KDY0KX1gIH0pO1xuXG4gICAgICBjb25zdCB2ZXJpZnlSZXNwb25zZVN0dWIgPSBzaW5vbi5zdHViKGJpdGdvLCAndmVyaWZ5UmVzcG9uc2UnKS5yZXR1cm5zKHtcbiAgICAgICAgaXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgaXNJblJlc3BvbnNlVmFsaWRpdHlXaW5kb3c6IGZhbHNlLFxuICAgICAgICBleHBlY3RlZEhtYWM6ICcnLFxuICAgICAgICBzaWduYXR1cmVTdWJqZWN0OiAnJyxcbiAgICAgICAgdmVyaWZpY2F0aW9uVGltZTogMCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzY29wZSA9IG5vY2sodXJsKS5nZXQoJy8nKS5yZXBseSgyMDApO1xuXG4gICAgICBhd2FpdCBiaXRnb1xuICAgICAgICAuZ2V0KHVybClcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICAgJ3NlcnZlciByZXNwb25zZSBvdXRzaWRlIHJlc3BvbnNlIHZhbGlkaXR5IHRpbWUgd2luZG93LCBwb3NzaWJsZSBtYW4taW4tdGhlLW1pZGRsZS1hdHRhY2snXG4gICAgICAgICk7XG4gICAgICB2ZXJpZnlSZXNwb25zZVN0dWIucmVzdG9yZSgpO1xuICAgICAgc2NvcGUuZG9uZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgcmVzcG9uc2VzIHdpdGhpbiB0aGUgcmVzcG9uc2UgdmFsaWRpdHkgd2luZG93JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXJsID0gJ2h0dHBzOi8vYml0Z28uaW52YWxpZCc7XG4gICAgICBjb25zdCBiaXRnbyA9IG5ldyBCaXRHbyh7IGF1dGhWZXJzaW9uOiAzLCBhY2Nlc3NUb2tlbjogYHYyeCR7JzAnLnJlcGVhdCg2NCl9YCB9KTtcblxuICAgICAgY29uc3QgdmVyaWZ5UmVzcG9uc2VTdHViID0gc2lub24uc3R1YihiaXRnbywgJ3ZlcmlmeVJlc3BvbnNlJykucmV0dXJucyh7XG4gICAgICAgIGlzVmFsaWQ6IHRydWUsXG4gICAgICAgIGlzSW5SZXNwb25zZVZhbGlkaXR5V2luZG93OiB0cnVlLFxuICAgICAgICBleHBlY3RlZEhtYWM6ICcnLFxuICAgICAgICBzaWduYXR1cmVTdWJqZWN0OiAnJyxcbiAgICAgICAgdmVyaWZpY2F0aW9uVGltZTogMCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzY29wZSA9IG5vY2sodXJsKS5nZXQoJy8nKS5yZXBseSgyMDApO1xuXG4gICAgICBhd2FpdCBiaXRnby5nZXQodXJsKS5zaG91bGQuZXZlbnR1YWxseS5oYXZlLnByb3BlcnR5KCdzdGF0dXMnLCAyMDApO1xuICAgICAgdmVyaWZ5UmVzcG9uc2VTdHViLnJlc3RvcmUoKTtcbiAgICAgIHNjb3BlLmRvbmUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW5jbHVkZSB0aGUgYXV0aCB2ZXJzaW9uIGluIHRoZSBobWFjIHN1YmplY3QnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB1cmwgPSAnaHR0cHM6Ly9iaXRnby5pbnZhbGlkJztcbiAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYHYyeCR7JzAnLnJlcGVhdCg2NCl9YDtcbiAgICAgIGNvbnN0IGJpdGdvID0gbmV3IEJpdEdvKHsgYXV0aFZlcnNpb246IDMsIGFjY2Vzc1Rva2VuIH0pO1xuXG4gICAgICBjb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbiAgICAgIGNvbnN0IGNyZWF0ZUhtYWNTcHkgPSBzaW5vbi5zcHkoY3J5cHRvLCAnY3JlYXRlSG1hYycpO1xuICAgICAgY29uc3QgdXBkYXRlU3B5ID0gc2lub24uc3B5KGNyeXB0by5IbWFjLnByb3RvdHlwZSwgJ3VwZGF0ZScpO1xuXG4gICAgICBjb25zdCB2ZXJpZnlSZXNwb25zZVN0dWIgPSBzaW5vbi5zdHViKGJpdGdvLCAndmVyaWZ5UmVzcG9uc2UnKS5yZXR1cm5zKHtcbiAgICAgICAgaXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgaXNJblJlc3BvbnNlVmFsaWRpdHlXaW5kb3c6IHRydWUsXG4gICAgICAgIGV4cGVjdGVkSG1hYzogJycsXG4gICAgICAgIHNpZ25hdHVyZVN1YmplY3Q6ICcnLFxuICAgICAgICB2ZXJpZmljYXRpb25UaW1lOiAwLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNjb3BlID0gbm9jayh1cmwpLmdldCgnLycpLnJlcGx5KDIwMCk7XG5cbiAgICAgIGF3YWl0IGJpdGdvLmdldCh1cmwpLnNob3VsZC5ldmVudHVhbGx5LmhhdmUucHJvcGVydHkoJ3N0YXR1cycsIDIwMCk7XG5cbiAgICAgIGNyZWF0ZUhtYWNTcHkuZmlyc3RDYWxsLmNhbGxlZFdpdGgoJ3NoYTI1NicsIGFjY2Vzc1Rva2VuKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgdXBkYXRlU3B5LmZpcnN0Q2FsbC5jYWxsZWRXaXRoKHNpbm9uLm1hdGNoKCczLjAnKSkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGNyZWF0ZUhtYWNTcHkucmVzdG9yZSgpO1xuICAgICAgdmVyaWZ5UmVzcG9uc2VTdHViLnJlc3RvcmUoKTtcbiAgICAgIHNjb3BlLmRvbmUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0F1dGggVjInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBkZWZhdWx0IHRvIGF1dGggdmVyc2lvbiAyIHdoZW4gaW5pdGlhbGl6aW5nIGEgYml0Z28gb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgYml0Z28gPSBuZXcgQml0R28oKTtcbiAgICAgIGJpdGdvLmdldEF1dGhWZXJzaW9uKCkuc2hvdWxkLmVxbCgyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFzcyBcIjIuMFwiIGFzIHRoZSBiaXRnby1hdXRoLXZlcnNpb24gaGVhZGVyIHdoZW4gYXV0aCB2MiBpcyBlbmFibGVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXJsID0gJ2h0dHBzOi8vYml0Z28uaW52YWxpZCc7XG4gICAgICBjb25zdCBiaXRnbyA9IG5ldyBCaXRHbygpO1xuXG4gICAgICBjb25zdCBzY29wZSA9IG5vY2sodXJsLCB7XG4gICAgICAgIHJlcWhlYWRlcnM6IHtcbiAgICAgICAgICAnYml0Z28tYXV0aC12ZXJzaW9uJzogJzIuMCcsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgICAuZ2V0KCcvJylcbiAgICAgICAgLnJlcGx5KDIwMCk7XG5cbiAgICAgIGF3YWl0IGJpdGdvLmdldCh1cmwpLnNob3VsZC5ldmVudHVhbGx5LmhhdmUucHJvcGVydHkoJ3N0YXR1cycsIDIwMCk7XG4gICAgICBzY29wZS5kb25lKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!