diff --git a/changelog/29498.txt b/changelog/29498.txt new file mode 100644 index 0000000000..b2cad9629a --- /dev/null +++ b/changelog/29498.txt @@ -0,0 +1,3 @@ +```release-note:bug +ui/database: Fixes 'cannot update static username' error when updating static role's rotation period +``` \ No newline at end of file diff --git a/ui/app/adapters/database/role.js b/ui/app/adapters/database/role.js index 964d716edb..c46a733655 100644 --- a/ui/app/adapters/database/role.js +++ b/ui/app/adapters/database/role.js @@ -195,10 +195,19 @@ export default ApplicationAdapter.extend({ async updateRecord(store, type, snapshot) { const serializer = store.serializerFor(type.modelName); - const data = serializer.serialize(snapshot); + const serializedData = serializer.serialize(snapshot); const roleType = snapshot.attr('type'); const backend = snapshot.attr('backend'); const id = snapshot.attr('name'); + let data = {}; + if (roleType === 'static') { + data = { + ...serializedData, + username: snapshot.attr('username'), // username is required for updating a static role + }; + } else { + data = serializedData; + } return this.ajax(this.urlFor(backend, id, roleType), 'POST', { data }).then(() => data); }, diff --git a/ui/tests/integration/components/database-role-edit-test.js b/ui/tests/integration/components/database-role-edit-test.js index 15cfe3c74d..113bd818bc 100644 --- a/ui/tests/integration/components/database-role-edit-test.js +++ b/ui/tests/integration/components/database-role-edit-test.js @@ -9,6 +9,7 @@ import { render } from '@ember/test-helpers'; import { hbs } from 'ember-cli-htmlbars'; import { setupMirage } from 'ember-cli-mirage/test-support'; import { capabilitiesStub } from 'vault/tests/helpers/stubs'; +import { click, fillIn } from '@ember/test-helpers'; module('Integration | Component | database-role-edit', function (hooks) { setupRenderingTest(hooks); @@ -20,6 +21,7 @@ module('Integration | Component | database-role-edit', function (hooks) { modelName: 'database/role', database: ['my-mongodb-database'], backend: 'database', + username: 'staticTestUser', type: 'static', name: 'my-static-role', id: 'my-static-role', @@ -36,6 +38,26 @@ module('Integration | Component | database-role-edit', function (hooks) { this.modelDynamic = this.store.peekRecord('database/role', 'my-dynamic-role'); }); + test('it should let user edit a static role when given update capability', async function (assert) { + this.server.post('/sys/capabilities-self', capabilitiesStub('database/static-creds/my-role', ['update'])); + + this.server.post(`/database/static-roles/my-static-role`, (schema, req) => { + assert.true(true, 'request made to update static role'); + assert.propEqual( + JSON.parse(req.requestBody), + { + username: 'staticTestUser', + rotation_period: '1728000s', // 20 days in seconds + }, + 'it updates static role with correct payload' + ); + }); + + await render(hbs``); + await fillIn('[data-test-ttl-value="Rotation period"]', '20'); + await click('[data-test-secret-save]'); + }); + test('it should show Get credentials button when a user has the correct policy', async function (assert) { this.server.post('/sys/capabilities-self', capabilitiesStub('database/static-creds/my-role', ['read'])); await render(hbs``);