Skip to content

Commit 27170b6

Browse files
authored
Replace KV v2 List route with wildcard instead of dynamic segment (#23620)
* initial work on the LIST route. * fix * changelog * add s * add in prepending forward slash
1 parent b0ce08b commit 27170b6

File tree

5 files changed

+38
-34
lines changed

5 files changed

+38
-34
lines changed

changelog/23620.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:bug
2+
ui: Fixes issue where you could not share the list view URL from the KV v2 secrets engine.
3+
```

ui/lib/kv/addon/routes.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ import buildRoutes from 'ember-engines/routes';
77

88
export default buildRoutes(function () {
99
// There are two list routes because Ember won't let a route param (e.g. *path_to_secret) be blank.
10-
// :path_to_secret is used when we're listing a secret directory. Example { path: '/:beep%2Fboop%2F/directory' });
10+
// *path_to_secret is used when we're listing a secret directory.
11+
// Must use a wildcard for path-to-secret because the value can contain a forward slash if it's a secret directory. Ember's router decodes encoded forward slashes which leads to beep%2fboop becoming beep/boop and messing up routing after copying and pasting the URL.
1112
this.route('list');
12-
this.route('list-directory', { path: '/:path_to_secret/directory' });
13+
this.route('list-directory', { path: '/list/*path_to_secret' });
1314
this.route('create');
1415
this.route('secret', { path: '/:name' }, function () {
1516
this.route('paths');

ui/tests/acceptance/secrets/backend/kv/kv-v2-workflow-create-test.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ module('Acceptance | kv-v2 workflow | secret and version create', function (hook
213213
});
214214
test('creates a secret at a sub-directory (a)', async function (assert) {
215215
const backend = this.backend;
216-
await visit(`/vault/secrets/${backend}/kv/app%2F/directory`);
216+
await visit(`/vault/secrets/${backend}/kv/list/app/`);
217217
assert.dom(PAGE.list.item('first')).exists('Lists first sub-secret');
218218
assert.dom(PAGE.list.item('new')).doesNotExist('Does not show new secret');
219219
await click(PAGE.list.createSecret);
@@ -232,7 +232,7 @@ module('Acceptance | kv-v2 workflow | secret and version create', function (hook
232232
'Redirects to detail after save'
233233
);
234234
await click(PAGE.breadcrumbAtIdx(2));
235-
assert.strictEqual(currentURL(), `/vault/secrets/${backend}/kv/app%2F/directory`, 'sub-dir page');
235+
assert.strictEqual(currentURL(), `/vault/secrets/${backend}/kv/list/app/`, 'sub-dir page');
236236
assert.dom(PAGE.list.item('new')).exists('Lists new secret in sub-dir');
237237
});
238238
test('create new version of secret from older version (a)', async function (assert) {
@@ -390,7 +390,7 @@ module('Acceptance | kv-v2 workflow | secret and version create', function (hook
390390
});
391391
test('creates a secret at a sub-directory (dr)', async function (assert) {
392392
const backend = this.backend;
393-
await visit(`/vault/secrets/${backend}/kv/app%2F/directory`);
393+
await visit(`/vault/secrets/${backend}/kv/list/app/`);
394394
assert.dom(PAGE.list.item()).doesNotExist('Does not list any secrets');
395395
await click(PAGE.list.createSecret);
396396
assert.strictEqual(
@@ -535,7 +535,7 @@ module('Acceptance | kv-v2 workflow | secret and version create', function (hook
535535
});
536536
test('creates a secret at a sub-directory (dlr)', async function (assert) {
537537
const backend = this.backend;
538-
await visit(`/vault/secrets/${backend}/kv/app%2F/directory`);
538+
await visit(`/vault/secrets/${backend}/kv/list/app/`);
539539
assert.dom(PAGE.list.item()).doesNotExist('Does not list any secrets');
540540
await click(PAGE.list.createSecret);
541541
assert.strictEqual(
@@ -704,7 +704,7 @@ module('Acceptance | kv-v2 workflow | secret and version create', function (hook
704704
});
705705
test('creates a secret at a sub-directory (mm)', async function (assert) {
706706
const backend = this.backend;
707-
await visit(`/vault/secrets/${backend}/kv/app%2F/directory`);
707+
await visit(`/vault/secrets/${backend}/kv/list/app/`);
708708
assert.dom(PAGE.list.item('first')).exists('Lists first sub-secret');
709709
assert.dom(PAGE.list.item('new')).doesNotExist('Does not show new secret');
710710
await click(PAGE.list.createSecret);
@@ -941,7 +941,7 @@ module('Acceptance | kv-v2 workflow | secret and version create', function (hook
941941
});
942942
test('creates a secret at a sub-directory (sc)', async function (assert) {
943943
const backend = this.backend;
944-
await visit(`/vault/secrets/${backend}/kv/app%2F/directory`);
944+
await visit(`/vault/secrets/${backend}/kv/list/app/`);
945945
assert.dom(PAGE.list.item()).doesNotExist('Does not list any secrets');
946946
await click(PAGE.list.createSecret);
947947
assert.strictEqual(
@@ -959,7 +959,7 @@ module('Acceptance | kv-v2 workflow | secret and version create', function (hook
959959
'Redirects to detail after save'
960960
);
961961
await click(PAGE.breadcrumbAtIdx(2));
962-
assert.strictEqual(currentURL(), `/vault/secrets/${backend}/kv/app%2F/directory`, 'sub-dir page');
962+
assert.strictEqual(currentURL(), `/vault/secrets/${backend}/kv/list/app/`, 'sub-dir page');
963963
assert.dom(PAGE.list.item()).doesNotExist('Does not list any secrets');
964964
});
965965
test('create new version of secret from older version (sc)', async function (assert) {

ui/tests/acceptance/secrets/backend/kv/kv-v2-workflow-edge-cases-test.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ module('Acceptance | kv-v2 workflow | edge cases', function (hooks) {
8484
// URL correct
8585
assert.strictEqual(
8686
currentURL(),
87-
`/vault/secrets/${backend}/kv/${root}%2F/directory`,
87+
`/vault/secrets/${backend}/kv/list/${root}/`,
8888
'visits list-directory of root'
8989
);
9090

@@ -125,7 +125,7 @@ module('Acceptance | kv-v2 workflow | edge cases', function (hooks) {
125125
await click(PAGE.breadcrumbAtIdx(previousCrumb));
126126
assert.strictEqual(
127127
currentURL(),
128-
`/vault/secrets/${backend}/kv/${root}%2F${subdirectory}%2F/directory`,
128+
`/vault/secrets/${backend}/kv/list/${root}/${subdirectory}/`,
129129
'goes back to subdirectory list'
130130
);
131131
assert.dom(PAGE.list.filter).hasValue(`${root}/${subdirectory}/`);
@@ -136,7 +136,7 @@ module('Acceptance | kv-v2 workflow | edge cases', function (hooks) {
136136
await click(PAGE.breadcrumbAtIdx(previousCrumb));
137137
assert.strictEqual(
138138
currentURL(),
139-
`/vault/secrets/${backend}/kv/${root}%2F/directory`,
139+
`/vault/secrets/${backend}/kv/list/${root}/`,
140140
'goes back to root directory'
141141
);
142142
assert.dom(PAGE.list.item(`${subdirectory}/`)).exists('renders linked block for subdirectory');
@@ -253,7 +253,7 @@ module('Acceptance | kv-v2 workflow | edge cases', function (hooks) {
253253
});
254254

255255
test('no ghost item after editing metadata', async function (assert) {
256-
await visit(`/vault/secrets/${this.backend}/kv/edge/directory`);
256+
await visit(`/vault/secrets/${this.backend}/kv/list/edge/`);
257257
assert.dom(PAGE.list.item()).exists({ count: 2 }, 'two secrets are listed');
258258
await click(PAGE.list.item('two'));
259259
await click(PAGE.secretTab('Metadata'));

ui/tests/acceptance/secrets/backend/kv/kv-v2-workflow-navigation-test.js

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -165,14 +165,14 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
165165

166166
// Navigate through list items
167167
await click(PAGE.list.item('app/'));
168-
assert.strictEqual(currentURL(), `/vault/secrets/${backend}/kv/app%2F/directory`);
168+
assert.strictEqual(currentURL(), `/vault/secrets/${backend}/kv/list/app/`);
169169
assertCorrectBreadcrumbs(assert, ['secret', backend, 'app']);
170170
assert.dom(PAGE.title).hasText(`${backend} Version 2`);
171171
assert.dom(PAGE.list.filter).hasValue('app/', 'List filter input is prefilled');
172172
assert.dom(PAGE.list.item('nested/')).exists('Shows nested secret');
173173

174174
await click(PAGE.list.item('nested/'));
175-
assert.strictEqual(currentURL(), `/vault/secrets/${backend}/kv/app%2Fnested%2F/directory`);
175+
assert.strictEqual(currentURL(), `/vault/secrets/${backend}/kv/list/app/nested/`);
176176
assertCorrectBreadcrumbs(assert, ['secret', backend, 'app', 'nested']);
177177
assert.dom(PAGE.title).hasText(`${backend} Version 2`);
178178
assert.dom(PAGE.list.filter).hasValue('app/nested/', 'List filter input is prefilled');
@@ -189,13 +189,13 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
189189

190190
await click(PAGE.breadcrumbAtIdx(3));
191191
assert.ok(
192-
currentURL().startsWith(`/vault/secrets/${backend}/kv/app%2Fnested%2F/directory`),
192+
currentURL().startsWith(`/vault/secrets/${backend}/kv/list/app/nested/`),
193193
'links back to list directory'
194194
);
195195

196196
await click(PAGE.breadcrumbAtIdx(2));
197197
assert.ok(
198-
currentURL().startsWith(`/vault/secrets/${backend}/kv/app%2F/directory`),
198+
currentURL().startsWith(`/vault/secrets/${backend}/kv/list/app/`),
199199
'links back to list directory'
200200
);
201201

@@ -416,13 +416,13 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
416416

417417
await click(PAGE.breadcrumbAtIdx(3));
418418
assert.ok(
419-
currentURL().startsWith(`/vault/secrets/${backend}/kv/app%2Fnested%2F/directory`),
419+
currentURL().startsWith(`/vault/secrets/${backend}/kv/list/app/nested/`),
420420
'links back to list directory'
421421
);
422422

423423
await click(PAGE.breadcrumbAtIdx(2));
424424
assert.ok(
425-
currentURL().startsWith(`/vault/secrets/${backend}/kv/app%2F/directory`),
425+
currentURL().startsWith(`/vault/secrets/${backend}/kv/list/app/`),
426426
'links back to list directory'
427427
);
428428

@@ -585,7 +585,7 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
585585

586586
// Navigate through list items
587587
await click(PAGE.list.item('app/'));
588-
assert.strictEqual(currentURL(), `/vault/secrets/${backend}/kv/app%2F/directory`);
588+
assert.strictEqual(currentURL(), `/vault/secrets/${backend}/kv/list/app/`);
589589
assertCorrectBreadcrumbs(assert, ['secret', backend, 'app']);
590590
assert.dom(PAGE.title).hasText(`${backend} Version 2`);
591591
assert.dom(PAGE.list.filter).doesNotExist('List filter hidden since no nested list access');
@@ -606,13 +606,13 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
606606

607607
await click(PAGE.breadcrumbAtIdx(3));
608608
assert.ok(
609-
currentURL().startsWith(`/vault/secrets/${backend}/kv/app%2Fnested%2F/directory`),
609+
currentURL().startsWith(`/vault/secrets/${backend}/kv/list/app/nested/`),
610610
'links back to list directory'
611611
);
612612

613613
await click(PAGE.breadcrumbAtIdx(2));
614614
assert.ok(
615-
currentURL().startsWith(`/vault/secrets/${backend}/kv/app%2F/directory`),
615+
currentURL().startsWith(`/vault/secrets/${backend}/kv/list/app/`),
616616
'links back to list directory'
617617
);
618618

@@ -771,14 +771,14 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
771771

772772
// Navigate through list items
773773
await click(PAGE.list.item('app/'));
774-
assert.strictEqual(currentURL(), `/vault/secrets/${backend}/kv/app%2F/directory`);
774+
assert.strictEqual(currentURL(), `/vault/secrets/${backend}/kv/list/app/`);
775775
assertCorrectBreadcrumbs(assert, ['secret', backend, 'app']);
776776
assert.dom(PAGE.title).hasText(`${backend} Version 2`);
777777
assert.dom(PAGE.list.filter).hasValue('app/', 'List filter input is prefilled');
778778
assert.dom(PAGE.list.item('nested/')).exists('Shows nested secret');
779779

780780
await click(PAGE.list.item('nested/'));
781-
assert.strictEqual(currentURL(), `/vault/secrets/${backend}/kv/app%2Fnested%2F/directory`);
781+
assert.strictEqual(currentURL(), `/vault/secrets/${backend}/kv/list/app/nested/`);
782782
assertCorrectBreadcrumbs(assert, ['secret', backend, 'app', 'nested']);
783783
assert.dom(PAGE.title).hasText(`${backend} Version 2`);
784784
assert.dom(PAGE.list.filter).hasValue('app/nested/', 'List filter input is prefilled');
@@ -797,13 +797,13 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
797797

798798
await click(PAGE.breadcrumbAtIdx(3));
799799
assert.ok(
800-
currentURL().startsWith(`/vault/secrets/${backend}/kv/app%2Fnested%2F/directory`),
800+
currentURL().startsWith(`/vault/secrets/${backend}/kv/list/app/nested/`),
801801
'links back to list directory'
802802
);
803803

804804
await click(PAGE.breadcrumbAtIdx(2));
805805
assert.ok(
806-
currentURL().startsWith(`/vault/secrets/${backend}/kv/app%2F/directory`),
806+
currentURL().startsWith(`/vault/secrets/${backend}/kv/list/app/`),
807807
'links back to list directory'
808808
);
809809

@@ -989,13 +989,13 @@ module('Acceptance | kv-v2 workflow | navigation', function (hooks) {
989989

990990
await click(PAGE.breadcrumbAtIdx(3));
991991
assert.ok(
992-
currentURL().startsWith(`/vault/secrets/${backend}/kv/app%2Fnested%2F/directory`),
992+
currentURL().startsWith(`/vault/secrets/${backend}/kv/list/app/nested/`),
993993
'links back to list directory'
994994
);
995995

996996
await click(PAGE.breadcrumbAtIdx(2));
997997
assert.ok(
998-
currentURL().startsWith(`/vault/secrets/${backend}/kv/app%2F/directory`),
998+
currentURL().startsWith(`/vault/secrets/${backend}/kv/list/app/`),
999999
'links back to list directory'
10001000
);
10011001

@@ -1152,14 +1152,14 @@ path "${this.backend}/*" {
11521152

11531153
// Navigate through list items
11541154
await click(PAGE.list.item('app/'));
1155-
assert.strictEqual(currentURL(), `/vault/secrets/${backend}/kv/app%2F/directory`);
1155+
assert.strictEqual(currentURL(), `/vault/secrets/${backend}/kv/list/app/`);
11561156
assertCorrectBreadcrumbs(assert, ['secret', backend, 'app']);
11571157
assert.dom(PAGE.title).hasText(`${backend} Version 2`);
11581158
assert.dom(PAGE.list.filter).hasValue('app/', 'List filter input is prefilled');
11591159
assert.dom(PAGE.list.item('nested/')).exists('Shows nested secret');
11601160

11611161
await click(PAGE.list.item('nested/'));
1162-
assert.strictEqual(currentURL(), `/vault/secrets/${backend}/kv/app%2Fnested%2F/directory`);
1162+
assert.strictEqual(currentURL(), `/vault/secrets/${backend}/kv/list/app/nested/`);
11631163
assertCorrectBreadcrumbs(assert, ['secret', backend, 'app', 'nested']);
11641164
assert.dom(PAGE.title).hasText(`${backend} Version 2`);
11651165
assert.dom(PAGE.list.filter).hasValue('app/nested/', 'List filter input is prefilled');
@@ -1174,12 +1174,12 @@ path "${this.backend}/*" {
11741174
);
11751175
await grantAccess({
11761176
apiPath: `${backend}/data/app/nested/secret`,
1177-
originUrl: `/vault/secrets/${backend}/kv/app%2Fnested%2F/directory`,
1177+
originUrl: `/vault/secrets/${backend}/kv/list/app/nested/`,
11781178
userToken: this.userToken,
11791179
});
11801180
assert.strictEqual(
11811181
currentURL(),
1182-
`/vault/secrets/${backend}/kv/app%2Fnested%2F/directory`,
1182+
`/vault/secrets/${backend}/kv/list/app/nested/`,
11831183
'navigates to list url where secret is'
11841184
);
11851185
await click(PAGE.list.item('secret'));
@@ -1195,13 +1195,13 @@ path "${this.backend}/*" {
11951195

11961196
await click(PAGE.breadcrumbAtIdx(3));
11971197
assert.ok(
1198-
currentURL().startsWith(`/vault/secrets/${backend}/kv/app%2Fnested%2F/directory`),
1198+
currentURL().startsWith(`/vault/secrets/${backend}/kv/list/app/nested/`),
11991199
'links back to list directory'
12001200
);
12011201

12021202
await click(PAGE.breadcrumbAtIdx(2));
12031203
assert.ok(
1204-
currentURL().startsWith(`/vault/secrets/${backend}/kv/app%2F/directory`),
1204+
currentURL().startsWith(`/vault/secrets/${backend}/kv/list/app/`),
12051205
'links back to list directory'
12061206
);
12071207

0 commit comments

Comments
 (0)