UNPKG

aws-cdk

Version:

CDK Toolkit, the command line tool for CDK apps

148 lines 18.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const credential_plugins_1 = require("../../../lib/api/aws-auth/credential-plugins"); const provider_caching_1 = require("../../../lib/api/aws-auth/provider-caching"); const mode_1 = require("../../../lib/api/plugin/mode"); const plugin_1 = require("../../../lib/api/plugin/plugin"); (0, plugin_1.markTesting)(); let host; let credentialPlugins; beforeEach(() => { host = new plugin_1.PluginHost(); credentialPlugins = new credential_plugins_1.CredentialPlugins(host); jest.resetModules(); jest.useFakeTimers(); }); const THE_PLUGIN = 'the-plugin'; test('plugin can return V3 compatible credentials', async () => { // GIVEN mockCredentialFunction(() => Promise.resolve({ accessKeyId: 'keyid', secretAccessKey: 'secret', })); // WHEN const creds = await fetchNow(); await expect(creds).toEqual(expect.objectContaining({ accessKeyId: 'keyid', })); }); test('plugin can return V3 compatible credentials that expire', async () => { // GIVEN const mockProducer = jest.fn().mockImplementation(() => Promise.resolve({ accessKeyId: 'keyid', secretAccessKey: 'secret', sessionToken: 'session', expiration: new Date(Date.now() + 300000), // 5 minutes from now })); mockCredentialFunction(mockProducer); // WHEN await fetchNow(); await fetchNow(); expect(mockProducer).toHaveBeenCalledTimes(1); // Caching jest.advanceTimersByTime(300000); // 5 minutes into the future we go await fetchNow(); expect(mockProducer).toHaveBeenCalledTimes(2); // Cache busted }); test('provider returning expiring credentials must keep returning the same object type', async () => { // GIVEN const mockProducer = jest.fn() .mockImplementationOnce(() => Promise.resolve({ accessKeyId: 'keyid', secretAccessKey: 'secret', sessionToken: 'session', expiration: new Date(Date.now() + 300000), // 5 minutes from now })) .mockImplementationOnce(() => Promise.resolve(() => Promise.resolve({ accessKeyId: 'akid' }))); mockCredentialFunction(mockProducer); // WHEN await fetchNow(); jest.advanceTimersByTime(300000); // Make the credentials expire await expect(fetchNow()).rejects.toThrow(/Plugin initially returned static V3/); }); test('plugin can return V3 compatible credential-provider', async () => { // GIVEN mockCredentialFunction(() => Promise.resolve(() => Promise.resolve({ accessKeyId: 'keyid', secretAccessKey: 'secret', }))); // WHEN const creds = await fetchNow(); await expect(creds).toEqual(expect.objectContaining({ accessKeyId: 'keyid', })); }); test('plugin can return V2 compatible credential-provider', async () => { // GIVEN let getPromise = jest.fn().mockResolvedValue(undefined); mockCredentialFunction(() => Promise.resolve({ accessKeyId: 'keyid', secretAccessKey: 'secret', expired: false, getPromise, })); // WHEN const creds = await fetchNow(); await expect(creds).toEqual(expect.objectContaining({ accessKeyId: 'keyid', })); expect(getPromise).toHaveBeenCalled(); }); test('plugin can return V2 compatible credential-provider with initially empty keys', async () => { // GIVEN mockCredentialFunction(() => Promise.resolve({ accessKeyId: '', secretAccessKey: '', expired: false, getPromise() { this.accessKeyId = 'keyid'; return Promise.resolve({}); }, })); // WHEN const creds = await fetchNow(); await expect(creds).toEqual(expect.objectContaining({ accessKeyId: 'keyid', })); }); test('plugin must not return something that is not a credential', async () => { // GIVEN mockCredentialFunction(() => Promise.resolve({ nothing: 'burger', })); // THEN await expect(fetchNow()).rejects.toThrow(/Plugin returned a value that/); }); test('token expiration is allowed to be null', () => { expect((0, provider_caching_1.credentialsAboutToExpire)({ accessKeyId: 'key', secretAccessKey: 'secret', // This is not allowed according to the `.d.ts` contract, but it can happen in reality expiration: null, })).toEqual(false); }); function mockCredentialFunction(p) { mockCredentialPlugin({ name: 'test', canProvideCredentials() { return Promise.resolve(true); }, isAvailable() { return Promise.resolve(true); }, getProvider(...args) { return p(...args); }, }); } function mockCredentialPlugin(p) { jest.mock(THE_PLUGIN, () => { return { version: '1', init(h) { h.registerCredentialProviderSource(p); }, }; }, { virtual: true }); host.load(THE_PLUGIN); } async function fetchNow() { const prov = await credentialPlugins.fetchCredentialsFor('1111', mode_1.Mode.ForReading); return prov?.credentials(); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlZGVudGlhbC1wbHVnaW4udGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNyZWRlbnRpYWwtcGx1Z2luLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxxRkFBaUY7QUFDakYsaUZBQXNGO0FBQ3RGLHVEQUFvRDtBQUNwRCwyREFBeUU7QUFFekUsSUFBQSxvQkFBVyxHQUFFLENBQUM7QUFFZCxJQUFJLElBQWdCLENBQUM7QUFDckIsSUFBSSxpQkFBb0MsQ0FBQztBQUV6QyxVQUFVLENBQUMsR0FBRyxFQUFFO0lBQ2QsSUFBSSxHQUFHLElBQUksbUJBQVUsRUFBRSxDQUFDO0lBQ3hCLGlCQUFpQixHQUFHLElBQUksc0NBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3BCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztBQUN2QixDQUFDLENBQUMsQ0FBQztBQUVILE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQztBQUVoQyxJQUFJLENBQUMsNkNBQTZDLEVBQUUsS0FBSyxJQUFJLEVBQUU7SUFDN0QsUUFBUTtJQUNSLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDM0MsV0FBVyxFQUFFLE9BQU87UUFDcEIsZUFBZSxFQUFFLFFBQVE7S0FDMUIsQ0FBQyxDQUFDLENBQUM7SUFFSixPQUFPO0lBQ1AsTUFBTSxLQUFLLEdBQUcsTUFBTSxRQUFRLEVBQUUsQ0FBQztJQUUvQixNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1FBQ2xELFdBQVcsRUFBRSxPQUFPO0tBQ3JCLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMseURBQXlELEVBQUUsS0FBSyxJQUFJLEVBQUU7SUFDekUsUUFBUTtJQUNSLE1BQU0sWUFBWSxHQUFHLElB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SSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN4QixDQUFDO0FBRUQsS0FBSyxVQUFVLFFBQVE7SUFDckIsTUFBTSxJQUFJLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsV0FBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2xGLE9BQU8sSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDcmVkZW50aWFsUHJvdmlkZXJTb3VyY2UsIFNES3YzQ29tcGF0aWJsZUNyZWRlbnRpYWxzIH0gZnJvbSAnQGF3cy1jZGsvY2xpLXBsdWdpbi1jb250cmFjdCc7XG5pbXBvcnQgeyBDcmVkZW50aWFsUGx1Z2lucyB9IGZyb20gJy4uLy4uLy4uL2xpYi9hcGkvYXdzLWF1dGgvY3JlZGVudGlhbC1wbHVnaW5zJztcbmltcG9ydCB7IGNyZWRlbnRpYWxzQWJvdXRUb0V4cGlyZSB9IGZyb20gJy4uLy4uLy4uL2xpYi9hcGkvYXdzLWF1dGgvcHJvdmlkZXItY2FjaGluZyc7XG5pbXBvcnQgeyBNb2RlIH0gZnJvbSAnLi4vLi4vLi4vbGliL2FwaS9wbHVnaW4vbW9kZSc7XG5pbXBvcnQgeyBQbHVnaW5Ib3N0LCBtYXJrVGVzdGluZyB9IGZyb20gJy4uLy4uLy4uL2xpYi9hcGkvcGx1Z2luL3BsdWdpbic7XG5cbm1hcmtUZXN0aW5nKCk7XG5cbmxldCBob3N0OiBQbHVnaW5Ib3N0O1xubGV0IGNyZWRlbnRpYWxQbHVnaW5zOiBDcmVkZW50aWFsUGx1Z2lucztcblxuYmVmb3JlRWFjaCgoKSA9PiB7XG4gIGhvc3QgPSBuZXcgUGx1Z2luSG9zdCgpO1xuICBjcmVkZW50aWFsUGx1Z2lucyA9IG5ldyBDcmVkZW50aWFsUGx1Z2lucyhob3N0KTtcbiAgamVzdC5yZXNldE1vZHVsZXMoKTtcbiAgamVzdC51c2VGYWtlVGltZXJzKCk7XG59KTtcblxuY29uc3QgVEhFX1BMVUdJTiA9ICd0aGUtcGx1Z2luJztcblxudGVzdCgncGx1Z2luIGNhbiByZXR1cm4gVjMgY29tcGF0aWJsZSBjcmVkZW50aWFscycsIGFzeW5jICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgbW9ja0NyZWRlbnRpYWxGdW5jdGlvbigoKSA9PiBQcm9taXNlLnJlc29sdmUoe1xuICAgIGFjY2Vzc0tleUlkOiAna2V5aWQnLFxuICAgIHNlY3JldEFjY2Vzc0tleTogJ3NlY3JldCcsXG4gIH0pKTtcblxuICAvLyBXSEVOXG4gIGNvbnN0IGNyZWRzID0gYXdhaXQgZmV0Y2hOb3coKTtcblxuICBhd2FpdCBleHBlY3QoY3JlZHMpLnRvRXF1YWwoZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgIGFjY2Vzc0tleUlkOiAna2V5aWQnLFxuICB9KSk7XG59KTtcblxudGVzdCgncGx1Z2luIGNhbiByZXR1cm4gVjMgY29tcGF0aWJsZSBjcmVkZW50aWFscyB0aGF0IGV4cGlyZScsIGFzeW5jICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgY29uc3QgbW9ja1Byb2R1Y2VyID0gamVzdC5mbigpLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiBQcm9taXNlLnJlc29sdmUoe1xuICAgIGFjY2Vzc0tleUlkOiAna2V5aWQnLFxuICAgIHNlY3JldEFjY2Vzc0tleTogJ3NlY3JldCcsXG4gICAgc2Vzc2lvblRva2VuOiAnc2Vzc2lvbicsXG4gICAgZXhwaXJhdGlvbjogbmV3IERhdGUoRGF0ZS5ub3coKSArIDMwMF8wMDApLCAvLyA1IG1pbnV0ZXMgZnJvbSBub3dcbiAgfSBzYXRpc2ZpZXMgU0RLdjNDb21wYXRpYmxlQ3JlZGVudGlhbHMpKTtcbiAgbW9ja0NyZWRlbnRpYWxGdW5jdGlvbihtb2NrUHJvZHVjZXIpO1xuXG4gIC8vIFdIRU5cbiAgYXdhaXQgZmV0Y2hOb3coKTtcbiAgYXdhaXQgZmV0Y2hOb3coKTtcbiAgZXhwZWN0KG1vY2tQcm9kdWNlcikudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpOyAvLyBDYWNoaW5nXG5cbiAgamVzdC5hZHZhbmNlVGltZXJzQnlUaW1lKDMwMF8wMDApOyAvLyA1IG1pbnV0ZXMgaW50byB0aGUgZnV0dXJlIHdlIGdvXG4gIGF3YWl0IGZldGNoTm93KCk7XG4gIGV4cGVjdChtb2NrUHJvZHVjZXIpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygyKTsgLy8gQ2FjaGUgYnVzdGVkXG59KTtcblxudGVzdCgncHJvdmlkZXIgcmV0dXJuaW5nIGV4cGlyaW5nIGNyZWRlbnRpYWxzIG11c3Qga2VlcCByZXR1cm5pbmcgdGhlIHNhbWUgb2JqZWN0IHR5cGUnLCBhc3luYyAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IG1vY2tQcm9kdWNlciA9IGplc3QuZm4oKVxuICAgIC5tb2NrSW1wbGVtZW50YXRpb25PbmNlKCgpID0+IFByb21pc2UucmVzb2x2ZSh7XG4gICAgICBhY2Nlc3NLZXlJZDogJ2tleWlkJyxcbiAgICAgIHNlY3JldEFjY2Vzc0tleTogJ3NlY3JldCcsXG4gICAgICBzZXNzaW9uVG9rZW46ICdzZXNzaW9uJyxcbiAgICAgIGV4cGlyYXRpb246IG5ldyBEYXRlKERhdGUubm93KCkgKyAzMDBfMDAwKSwgLy8gNSBtaW51dGVzIGZyb20gbm93XG4gICAgfSBzYXRpc2ZpZXMgU0RLdjNDb21wYXRpYmxlQ3JlZGVudGlhbHMpKVxuICAgIC5tb2NrSW1wbGVtZW50YXRpb25PbmNlKCgpID0+IFByb21pc2UucmVzb2x2ZSgoKSA9PiBQcm9taXNlLnJlc29sdmUoeyBhY2Nlc3NLZXlJZDogJ2FraWQnIH0pKSk7XG4gIG1vY2tDcmVkZW50aWFsRnVuY3Rpb24obW9ja1Byb2R1Y2VyKTtcblxuICAvLyBXSEVOXG4gIGF3YWl0IGZldGNoTm93KCk7XG4gIGplc3QuYWR2YW5jZVRpbWVyc0J5VGltZSgzMDBfMDAwKTsgLy8gTWFrZSB0aGUgY3JlZGVudGlhbHMgZXhwaXJlXG4gIGF3YWl0IGV4cGVjdChmZXRjaE5vdygpKS5yZWplY3RzLnRvVGhyb3coL1BsdWdpbiBpbml0aWFsbHkgcmV0dXJuZWQgc3RhdGljIFYzLyk7XG59KTtcblxudGVzdCgncGx1Z2luIGNhbiByZXR1cm4gVjMgY29tcGF0aWJsZSBjcmVkZW50aWFsLXByb3ZpZGVyJywgYXN5bmMgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBtb2NrQ3JlZGVudGlhbEZ1bmN0aW9uKCgpID0+IFByb21pc2UucmVzb2x2ZSgoKSA9PiBQcm9taXNlLnJlc29sdmUoe1xuICAgIGFjY2Vzc0tleUlkOiAna2V5aWQnLFxuICAgIHNlY3JldEFjY2Vzc0tleTogJ3NlY3JldCcsXG4gIH0pKSk7XG5cbiAgLy8gV0hFTlxuICBjb25zdCBjcmVkcyA9IGF3YWl0IGZldGNoTm93KCk7XG5cbiAgYXdhaXQgZXhwZWN0KGNyZWRzKS50b0VxdWFsKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICBhY2Nlc3NLZXlJZDogJ2tleWlkJyxcbiAgfSkpO1xufSk7XG5cbnRlc3QoJ3BsdWdpbiBjYW4gcmV0dXJuIFYyIGNvbXBhdGlibGUgY3JlZGVudGlhbC1wcm92aWRlcicsIGFzeW5jICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgbGV0IGdldFByb21pc2UgPSBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUodW5kZWZpbmVkKTtcblxuICBtb2NrQ3JlZGVudGlhbEZ1bmN0aW9uKCgpID0+IFByb21pc2UucmVzb2x2ZSh7XG4gICAgYWNjZXNzS2V5SWQ6ICdrZXlpZCcsXG4gICAgc2VjcmV0QWNjZXNzS2V5OiAnc2VjcmV0JyxcbiAgICBleHBpcmVkOiBmYWxzZSxcbiAgICBnZXRQcm9taXNlLFxuICB9KSk7XG5cbiAgLy8gV0hFTlxuICBjb25zdCBjcmVkcyA9IGF3YWl0IGZldGNoTm93KCk7XG5cbiAgYXdhaXQgZXhwZWN0KGNyZWRzKS50b0VxdWFsKGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICBhY2Nlc3NLZXlJZDogJ2tleWlkJyxcbiAgfSkpO1xuICBleHBlY3QoZ2V0UHJvbWlzZSkudG9IYXZlQmVlbkNhbGxlZCgpO1xufSk7XG5cbnRlc3QoJ3BsdWdpbiBjYW4gcmV0dXJuIFYyIGNvbXBhdGlibGUgY3JlZGVudGlhbC1wcm92aWRlciB3aXRoIGluaXRpYWxseSBlbXB0eSBrZXlzJywgYXN5bmMgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBtb2NrQ3JlZGVudGlhbEZ1bmN0aW9uKCgpID0+IFByb21pc2UucmVzb2x2ZSh7XG4gICAgYWNjZXNzS2V5SWQ6ICcnLFxuICAgIHNlY3JldEFjY2Vzc0tleTogJycsXG4gICAgZXhwaXJlZDogZmFsc2UsXG4gICAgZ2V0UHJvbWlzZSgpIHtcbiAgICAgIHRoaXMuYWNjZXNzS2V5SWQgPSAna2V5aWQnO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgfSxcbiAgfSkpO1xuXG4gIC8vIFdIRU5cbiAgY29uc3QgY3JlZHMgPSBhd2FpdCBmZXRjaE5vdygpO1xuXG4gIGF3YWl0IGV4cGVjdChjcmVkcykudG9FcXVhbChleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgYWNjZXNzS2V5SWQ6ICdrZXlpZCcsXG4gIH0pKTtcbn0pO1xuXG50ZXN0KCdwbHVnaW4gbXVzdCBub3QgcmV0dXJuIHNvbWV0aGluZyB0aGF0IGlzIG5vdCBhIGNyZWRlbnRpYWwnLCBhc3luYyAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIG1vY2tDcmVkZW50aWFsRnVuY3Rpb24oKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICBub3RoaW5nOiAnYnVyZ2VyJyxcbiAgfSBhcyBhbnkpKTtcblxuICAvLyBUSEVOXG4gIGF3YWl0IGV4cGVjdChmZXRjaE5vdygpKS5yZWplY3RzLnRvVGhyb3coL1BsdWdpbiByZXR1cm5lZCBhIHZhbHVlIHRoYXQvKTtcbn0pO1xuXG50ZXN0KCd0b2tlbiBleHBpcmF0aW9uIGlzIGFsbG93ZWQgdG8gYmUgbnVsbCcsICgpID0+IHtcbiAgZXhwZWN0KGNyZWRlbnRpYWxzQWJvdXRUb0V4cGlyZSh7XG4gICAgYWNjZXNzS2V5SWQ6ICdrZXknLFxuICAgIHNlY3JldEFjY2Vzc0tleTogJ3NlY3JldCcsXG4gICAgLy8gVGhpcyBpcyBub3QgYWxsb3dlZCBhY2NvcmRpbmcgdG8gdGhlIGAuZC50c2AgY29udHJhY3QsIGJ1dCBpdCBjYW4gaGFwcGVuIGluIHJlYWxpdHlcbiAgICBleHBpcmF0aW9uOiBudWxsIGFzIGFueSxcbiAgfSkpLnRvRXF1YWwoZmFsc2UpO1xufSk7XG5cbmZ1bmN0aW9uIG1vY2tDcmVkZW50aWFsRnVuY3Rpb24ocDogQ3JlZGVudGlhbFByb3ZpZGVyU291cmNlWydnZXRQcm92aWRlciddKSB7XG4gIG1vY2tDcmVkZW50aWFsUGx1Z2luKHtcbiAgICBuYW1lOiAndGVzdCcsXG4gICAgY2FuUHJvdmlkZUNyZWRlbnRpYWxzKCkgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpOyB9LFxuICAgIGlzQXZhaWxhYmxlKCkgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpOyB9LFxuICAgIGdldFByb3ZpZGVyKC4uLmFyZ3M6IFBhcmFtZXRlcnM8Q3JlZGVudGlhbFByb3ZpZGVyU291cmNlWydnZXRQcm92aWRlciddPikge1xuICAgICAgcmV0dXJuIHAoLi4uYXJncyk7XG4gICAgfSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1vY2tDcmVkZW50aWFsUGx1Z2luKHA6IENyZWRlbnRpYWxQcm92aWRlclNvdXJjZSkge1xuICBqZXN0Lm1vY2soVEhFX1BMVUdJTiwgKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICB2ZXJzaW9uOiAnMScsXG4gICAgICBpbml0KGg6IFBsdWdpbkhvc3QpIHtcbiAgICAgICAgaC5yZWdpc3RlckNyZWRlbnRpYWxQcm92aWRlclNvdXJjZShwKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfSwgeyB2aXJ0dWFsOiB0cnVlIH0pO1xuXG4gIGhvc3QubG9hZChUSEVfUExVR0lOKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hOb3coKSB7XG4gIGNvbnN0IHByb3YgPSBhd2FpdCBjcmVkZW50aWFsUGx1Z2lucy5mZXRjaENyZWRlbnRpYWxzRm9yKCcxMTExJywgTW9kZS5Gb3JSZWFkaW5nKTtcbiAgcmV0dXJuIHByb3Y/LmNyZWRlbnRpYWxzKCk7XG59XG4iXX0=