aws-cdk
Version:
CDK Toolkit, the command line tool for CDK apps
148 lines • 18.4 kB
JavaScript
;
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=