mirror of
https://github.com/optim-enterprises-bv/vault.git
synced 2025-10-30 02:02:43 +00:00
* KMSE: Key Model / Adapter / Serializer setup (#13638) * First pass model * KMS key adapter (create/update), serializer, model * Add last rotated and provider to key * KeyEdit secret-edit component, and more key model stuff * add formatDate param support to infotablerow * Add keymgmt key to routes and options-for-backend * Rename keymgmt-key to keymgmt/key * Add test, cleanup * Add mirage handler for kms * Address PR comments * KMS Providers (#13797) * adds pagination-controls component * adds kms provider model, adapter and serializer * adds kms provider-edit component * updates secrets routes to handle itemType query param for kms * updates kms key adapter to query by provider * adds tests for provider-edit component * refactors kms provider adapter to account for dynamic path * adds model-validations-helper util * removes keymgmt from supported-secret-backends * fixes issue generating url for fetching keys for a provider * updates modelType method on secret-edit route to accept options object as arg rather than transition * adds additional checks to ensure queryParams are defined in options object for modelType method * UI/keymgmt distribute key (#13840) * Add distribution details on key page, and empty states if no permissions * Allow search-select component to return object so parent can tell when new item was created * Add stringarray transform * Distribute component first pass * Refactor distribute component for use with internal object rather than ember-data model * Specific permission denied errors on key edit * Allow inline errors on search-select component * Style updates for form errors * Styling and error messages on distribute component * Allow block template on inline alert so we can add doc links * Add distribute action, flash messages, cleanup * Cleanup & Add tests * More cleanup * Address PR comments * Move disable operations logic to commponent class * KMSE Enable/Config (#14835) * adds keymgmt secrets engine as supported backend * adds comment to check on keymgmt as member of adp module * updates kms provider to use model-validations decorator * fixes lint errors and tests Co-authored-by: Chelsea Shaw <82459713+hashishaw@users.noreply.github.com>
153 lines
6.1 KiB
JavaScript
153 lines
6.1 KiB
JavaScript
import { module, test } from 'qunit';
|
|
import { setupRenderingTest } from 'ember-qunit';
|
|
import Pretender from 'pretender';
|
|
import { render, settled, select } from '@ember/test-helpers';
|
|
import { create } from 'ember-cli-page-object';
|
|
import { hbs } from 'ember-cli-htmlbars';
|
|
import { typeInSearch, clickTrigger } from 'ember-power-select/test-support/helpers';
|
|
import searchSelect from '../../../pages/components/search-select';
|
|
|
|
const SELECTORS = {
|
|
form: '[data-test-keymgmt-distribution-form]',
|
|
keySection: '[data-test-keymgmt-dist-key]',
|
|
keyTypeSection: '[data-test-keymgmt-dist-keytype]',
|
|
providerInput: '[data-test-keymgmt-dist-provider]',
|
|
operationsSection: '[data-test-keymgmt-dist-operations]',
|
|
protectionsSection: '[data-test-keymgmt-dist-protections]',
|
|
errorKey: '[data-test-keymgmt-error="key"]',
|
|
errorNewKey: '[data-test-keymgmt-error="new-key"]',
|
|
errorProvider: '[data-test-keymgmt-error="provider"]',
|
|
inlineError: '[data-test-keymgmt-error]',
|
|
};
|
|
|
|
const ssComponent = create(searchSelect);
|
|
|
|
module('Integration | Component | keymgmt/distribute', function (hooks) {
|
|
setupRenderingTest(hooks);
|
|
|
|
hooks.beforeEach(function () {
|
|
this.set('backend', 'keymgmt');
|
|
this.set('providers', ['provider-aws', 'provider-gcp', 'provider-azure']);
|
|
this.server = new Pretender(function () {
|
|
this.get('/v1/keymgmt/key', (response) => {
|
|
return [
|
|
response,
|
|
{ 'Content-Type': 'application/json' },
|
|
JSON.stringify({
|
|
data: {
|
|
keys: ['example-1', 'example-2', 'example-3'],
|
|
},
|
|
}),
|
|
];
|
|
});
|
|
this.get('/v1/keymgmt/key/:name', (response) => {
|
|
const name = response.params.name;
|
|
return [
|
|
response,
|
|
{ 'Content-Type': 'application/json' },
|
|
JSON.stringify({
|
|
data: {
|
|
name,
|
|
type: 'aes256-gcm96', // incompatible with azurekeyvault only
|
|
},
|
|
}),
|
|
];
|
|
});
|
|
this.get('/v1/keymgmt/kms/:name', (response) => {
|
|
const name = response.params.name;
|
|
let provider;
|
|
switch (name) {
|
|
case 'provider-aws':
|
|
provider = 'awskms';
|
|
break;
|
|
case 'provider-azure':
|
|
provider = 'azurekeyvault';
|
|
break;
|
|
default:
|
|
provider = 'gcpckms';
|
|
break;
|
|
}
|
|
return [
|
|
response,
|
|
{ 'Content-Type': 'application/json' },
|
|
JSON.stringify({
|
|
data: {
|
|
name,
|
|
provider,
|
|
},
|
|
}),
|
|
];
|
|
});
|
|
});
|
|
});
|
|
|
|
hooks.afterEach(function () {
|
|
this.server.shutdown();
|
|
});
|
|
|
|
test('it does not render without @backend attr', async function (assert) {
|
|
await render(hbs`<Keymgmt::Distribute />`);
|
|
assert.dom(SELECTORS.form).doesNotExist('Form does not exist');
|
|
});
|
|
|
|
test('it does not allow operation selection until valid key and provider selected', async function (assert) {
|
|
await render(hbs`<Keymgmt::Distribute @backend="keymgmt" @providers={{providers}} />`);
|
|
assert.dom(SELECTORS.operationsSection).hasAttribute('disabled');
|
|
await clickTrigger();
|
|
await settled();
|
|
assert.equal(ssComponent.options.length, 3, 'shows all key options');
|
|
await ssComponent.selectOption();
|
|
await settled();
|
|
assert.dom(SELECTORS.operationsSection).hasAttribute('disabled');
|
|
await select(SELECTORS.providerInput, 'provider-aws');
|
|
await settled();
|
|
assert.dom(SELECTORS.operationsSection).doesNotHaveAttribute('disabled');
|
|
await select(SELECTORS.providerInput, 'provider-azure');
|
|
assert.dom(SELECTORS.operationsSection).hasAttribute('disabled');
|
|
assert.dom(SELECTORS.inlineError).exists({ count: 1 }, 'only shows single error');
|
|
assert.dom(SELECTORS.errorProvider).exists('Shows key/provider match error on provider');
|
|
});
|
|
test('it shows key type select field if new key created', async function (assert) {
|
|
await render(hbs`<Keymgmt::Distribute @backend="keymgmt" @providers={{providers}} />`);
|
|
assert.dom(SELECTORS.keyTypeSection).doesNotExist('Key Type section is not rendered by default');
|
|
// Add new item on search-select
|
|
await clickTrigger();
|
|
await settled();
|
|
await typeInSearch('new-key');
|
|
await ssComponent.selectOption();
|
|
assert.dom(SELECTORS.keyTypeSection).exists('Key Type selector is shown');
|
|
});
|
|
test('it hides the provider field if passed from the parent', async function (assert) {
|
|
await render(hbs`<Keymgmt::Distribute @backend="keymgmt" @provider="provider-azure" />`);
|
|
assert.dom(SELECTORS.providerInput).doesNotExist('Provider input is hidden');
|
|
// Select existing key
|
|
await clickTrigger();
|
|
await settled();
|
|
await ssComponent.selectOption();
|
|
await settled();
|
|
assert.dom(SELECTORS.inlineError).exists({ count: 1 }, 'only shows single error');
|
|
assert.dom(SELECTORS.errorKey).exists('Shows error on key selector when key/provider mismatch');
|
|
// Remove selection
|
|
await ssComponent.deleteButtons.objectAt(0).click();
|
|
await settled();
|
|
// Select new key
|
|
await clickTrigger();
|
|
await settled();
|
|
await typeInSearch('new-key');
|
|
await ssComponent.selectOption();
|
|
await select(SELECTORS.keyTypeSection, 'ecdsa-p256');
|
|
assert.dom(SELECTORS.inlineError).exists({ count: 1 }, 'only shows single error');
|
|
assert.dom(SELECTORS.errorNewKey).exists('Shows error on key type');
|
|
});
|
|
test('it hides the key field if passed from the parent', async function (assert) {
|
|
await render(hbs`<Keymgmt::Distribute @backend="keymgmt" @providers={{providers}} @key="example-1" />`);
|
|
assert.dom(SELECTORS.providerInput).exists('Provider input shown');
|
|
assert.dom(SELECTORS.keySection).doesNotExist('Key input not shown');
|
|
await select(SELECTORS.providerInput, 'provider-azure');
|
|
assert.dom(SELECTORS.inlineError).exists({ count: 1 }, 'only shows single error');
|
|
assert.dom(SELECTORS.errorProvider).exists('Shows error due to key/provider mismatch');
|
|
await select(SELECTORS.providerInput, 'provider-aws');
|
|
assert.dom(SELECTORS.inlineError).doesNotExist('Error goes away when key/provider compatible');
|
|
});
|
|
});
|