Fixes redirects to KV engine when secret is a directory (#24281)

* fix

* changelog

* Update 24281.txt

* add test coverage

* dont make assumptions about list
This commit is contained in:
Angel Garbarino
2023-11-30 13:46:39 -07:00
committed by GitHub
parent f5622a677a
commit 9ddc33ab98
4 changed files with 15 additions and 1 deletions

3
changelog/24281.txt Normal file
View File

@@ -0,0 +1,3 @@
```release-note:bug
ui: Correctly handle directory redirects from pre 1.15.0 Kv v2 list view urls.
```

View File

@@ -140,7 +140,7 @@ export default class DashboardQuickActionsCard extends Component {
@action @action
navigateToPage() { navigateToPage() {
let route = this.searchSelectParams.route; let route = this.searchSelectParams.route;
// If search-select falls back to stringInput, paramVlue is a string not object // If search-select falls back to stringInput, paramValue is a string not object
let param = this.paramValue.id || this.paramValue; let param = this.paramValue.id || this.paramValue;
// kv has a special use case where if the paramValue ends in a '/' you should // kv has a special use case where if the paramValue ends in a '/' you should

View File

@@ -11,6 +11,7 @@ import { allEngines, isAddonEngine } from 'vault/helpers/mountable-secret-engine
import { inject as service } from '@ember/service'; import { inject as service } from '@ember/service';
import { normalizePath } from 'vault/utils/path-encoding-helpers'; import { normalizePath } from 'vault/utils/path-encoding-helpers';
import { assert } from '@ember/debug'; import { assert } from '@ember/debug';
import { pathIsDirectory } from 'kv/utils/kv-breadcrumbs';
const SUPPORTED_BACKENDS = supportedSecretBackends(); const SUPPORTED_BACKENDS = supportedSecretBackends();
@@ -77,6 +78,9 @@ export default Route.extend({
return this.router.replaceWith('vault.cluster.secrets.backend.list', secret + '/'); return this.router.replaceWith('vault.cluster.secrets.backend.list', secret + '/');
} }
if (isAddonEngine(type, secretEngine.version)) { if (isAddonEngine(type, secretEngine.version)) {
if (engineRoute === 'kv.list' && pathIsDirectory(secret)) {
return this.router.transitionTo('vault.cluster.secrets.backend.kv.list-directory', backend, secret);
}
return this.router.transitionTo(`vault.cluster.secrets.backend.${engineRoute}`, backend); return this.router.transitionTo(`vault.cluster.secrets.backend.${engineRoute}`, backend);
} }
const modelType = this.getModelType(backend, tab); const modelType = this.getModelType(backend, tab);

View File

@@ -207,6 +207,13 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
await click(PAGE.breadcrumbAtIdx(1)); await click(PAGE.breadcrumbAtIdx(1));
assert.ok(currentURL().startsWith(`/vault/secrets/${backend}/kv/list`), 'links back to list root'); assert.ok(currentURL().startsWith(`/vault/secrets/${backend}/kv/list`), 'links back to list root');
}); });
test('is redirects to nested secret using old non-engine url (a)', async function (assert) {
// Reported bug, backported fix https://github.com/hashicorp/vault/pull/24281
assert.expect(1);
const backend = this.backend;
await visit(`/vault/secrets/${backend}/list/app/`);
assert.strictEqual(currentURL(), `/vault/secrets/${backend}/kv/list/app/`);
});
test('versioned secret nav, tabs, breadcrumbs (a)', async function (assert) { test('versioned secret nav, tabs, breadcrumbs (a)', async function (assert) {
assert.expect(45); assert.expect(45);
const backend = this.backend; const backend = this.backend;