-
Notifications
You must be signed in to change notification settings - Fork 4.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
UI: Fix oidc auth method missing default_role field #28539
Changes from 5 commits
669a524
ab05502
eba0a7f
525762f
c9113ce
73191e9
e617fbc
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
```release-note:bug | ||
ui: fix `default_role` input missing from oidc auth method configuration form | ||
``` |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -136,26 +136,27 @@ export function filterPathsByItemType(pathInfo: PathsInfo, itemType: string): Pa | |
* This object maps model names to the openAPI path that hydrates the model, given the backend path. | ||
*/ | ||
const OPENAPI_POWERED_MODELS = { | ||
'role-ssh': (backend: string) => `/v1/${backend}/roles/example?help=1`, | ||
'auth-config/azure': (backend: string) => `/v1/auth/${backend}/config?help=1`, | ||
'auth-config/cert': (backend: string) => `/v1/auth/${backend}/config?help=1`, | ||
'auth-config/gcp': (backend: string) => `/v1/auth/${backend}/config?help=1`, | ||
'auth-config/github': (backend: string) => `/v1/auth/${backend}/config?help=1`, | ||
'auth-config/jwt': (backend: string) => `/v1/auth/${backend}/config?help=1`, | ||
'auth-config/kubernetes': (backend: string) => `/v1/auth/${backend}/config?help=1`, | ||
'auth-config/ldap': (backend: string) => `/v1/auth/${backend}/config?help=1`, | ||
'auth-config/oidc': (backend: string) => `/v1/auth/${backend}/config?help=1`, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this is the only new one! |
||
'auth-config/okta': (backend: string) => `/v1/auth/${backend}/config?help=1`, | ||
'auth-config/radius': (backend: string) => `/v1/auth/${backend}/config?help=1`, | ||
'kmip/config': (backend: string) => `/v1/${backend}/config?help=1`, | ||
'kmip/role': (backend: string) => `/v1/${backend}/scope/example/role/example?help=1`, | ||
'pki/role': (backend: string) => `/v1/${backend}/roles/example?help=1`, | ||
'pki/tidy': (backend: string) => `/v1/${backend}/config/auto-tidy?help=1`, | ||
'pki/sign-intermediate': (backend: string) => `/v1/${backend}/issuer/example/sign-intermediate?help=1`, | ||
'pki/certificate/generate': (backend: string) => `/v1/${backend}/issue/example?help=1`, | ||
'pki/certificate/sign': (backend: string) => `/v1/${backend}/sign/example?help=1`, | ||
'pki/config/acme': (backend: string) => `/v1/${backend}/config/acme?help=1`, | ||
'pki/config/cluster': (backend: string) => `/v1/${backend}/config/cluster?help=1`, | ||
'pki/config/urls': (backend: string) => `/v1/${backend}/config/urls?help=1`, | ||
'pki/role': (backend: string) => `/v1/${backend}/roles/example?help=1`, | ||
'pki/sign-intermediate': (backend: string) => `/v1/${backend}/issuer/example/sign-intermediate?help=1`, | ||
'pki/tidy': (backend: string) => `/v1/${backend}/config/auto-tidy?help=1`, | ||
'role-ssh': (backend: string) => `/v1/${backend}/roles/example?help=1`, | ||
}; | ||
|
||
export function getHelpUrlForModel(modelType: string, backend: string) { | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -32,7 +32,7 @@ | |
aria-label={{or @name "masked input"}} | ||
{{on "change" this.onChange}} | ||
{{on "keyup" (fn this.handleKeyUp @name)}} | ||
data-test-textarea={{or @name ""}} | ||
data-test-input={{or @name ""}} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a lot of logic in tests because this selector differed from the standard pattern, updated it and relevant selectors to make future tests easier to write There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I've also run into this. Thank you! |
||
/> | ||
{{/if}} | ||
{{#if @allowCopy}} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,216 @@ | ||
/** | ||
* Copyright (c) HashiCorp, Inc. | ||
* SPDX-License-Identifier: BUSL-1.1 | ||
*/ | ||
|
||
import { module, test } from 'qunit'; | ||
import { setupApplicationTest } from 'ember-qunit'; | ||
import { v4 as uuidv4 } from 'uuid'; | ||
|
||
import { login } from 'vault/tests/helpers/auth/auth-helpers'; | ||
import { visit } from '@ember/test-helpers'; | ||
import { deleteAuthCmd, runCmd } from 'vault/tests/helpers/commands'; | ||
import testHelper from './test-helper'; | ||
import { GENERAL } from 'vault/tests/helpers/general-selectors'; | ||
|
||
// These models use openAPI so we assert the form inputs using an acceptance test | ||
// The default selector is to use GENERAL.inputByAttr() | ||
// custom fields should be added to the this.customSelectorss object | ||
module('Acceptance | auth enable tune form test', function (hooks) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I only added tests for azure, jwt, oidc, okta and ldap for now. We can expand as needed |
||
setupApplicationTest(hooks); | ||
hooks.beforeEach(async function () { | ||
// these tend to be the same across models because they share the same mount-config model | ||
// if necessary, they can be overridden in the individual module | ||
this.mountFields = [ | ||
'path', | ||
'description', | ||
'local', | ||
'sealWrap', | ||
'config.listingVisibility', | ||
'config.defaultLeaseTtl', | ||
'config.maxLeaseTtl', | ||
'config.tokenType', | ||
'config.auditNonHmacRequestKeys', | ||
'config.auditNonHmacResponseKeys', | ||
'config.passthroughRequestHeaders', | ||
'config.allowedResponseHeaders', | ||
'config.pluginVersion', | ||
]; | ||
}); | ||
|
||
module('azure', function (hooks) { | ||
hooks.beforeEach(async function () { | ||
this.type = 'azure'; | ||
this.path = `${this.type}-${uuidv4()}`; | ||
this.tuneFields = [ | ||
'environment', | ||
'identityTokenAudience', | ||
'identityTokenTtl', | ||
'maxRetries', | ||
'maxRetryDelay', | ||
'resource', | ||
'retryDelay', | ||
'rootPasswordTtl', | ||
'tenantId', | ||
]; | ||
this.tuneToggles = { 'Azure Options': ['clientId', 'clientSecret'] }; | ||
await login(); | ||
return visit('/vault/settings/auth/enable'); | ||
}); | ||
hooks.afterEach(async function () { | ||
await runCmd(deleteAuthCmd(this.path), false); | ||
}); | ||
testHelper(test); | ||
}); | ||
|
||
module('jwt', function (hooks) { | ||
hooks.beforeEach(async function () { | ||
this.type = 'jwt'; | ||
this.path = `${this.type}-${uuidv4()}`; | ||
this.customSelectors = { | ||
providerConfig: `${GENERAL.fieldByAttr('providerConfig')} textarea`, | ||
}; | ||
this.tuneFields = [ | ||
'defaultRole', | ||
'jwksCaPem', | ||
'jwksUrl', | ||
'namespaceInState', | ||
'oidcDiscoveryUrl', | ||
'oidcResponseMode', | ||
'oidcResponseTypes', | ||
'providerConfig', | ||
'unsupportedCriticalCertExtensions', | ||
]; | ||
this.tuneToggles = { | ||
'JWT Options': [ | ||
'oidcClientId', | ||
'oidcClientSecret', | ||
'oidcDiscoveryCaPem', | ||
'jwtValidationPubkeys', | ||
'jwtSupportedAlgs', | ||
'boundIssuer', | ||
], | ||
}; | ||
await login(); | ||
return visit('/vault/settings/auth/enable'); | ||
}); | ||
hooks.afterEach(async function () { | ||
await runCmd(deleteAuthCmd(this.path), false); | ||
}); | ||
testHelper(test); | ||
}); | ||
|
||
module('ldap', function (hooks) { | ||
hooks.beforeEach(async function () { | ||
this.type = 'ldap'; | ||
this.path = `${this.type}-${uuidv4()}`; | ||
this.tuneFields = [ | ||
'url', | ||
'caseSensitiveNames', | ||
'connectionTimeout', | ||
'dereferenceAliases', | ||
'maxPageSize', | ||
'passwordPolicy', | ||
'requestTimeout', | ||
'tokenBoundCidrs', | ||
'tokenExplicitMaxTtl', | ||
'tokenMaxTtl', | ||
'tokenNoDefaultPolicy', | ||
'tokenNumUses', | ||
'tokenPeriod', | ||
'tokenPolicies', | ||
'tokenTtl', | ||
'tokenType', | ||
'usePre111GroupCnBehavior', | ||
'usernameAsAlias', | ||
]; | ||
this.tuneToggles = { | ||
'LDAP Options': [ | ||
'starttls', | ||
'insecureTls', | ||
'discoverdn', | ||
'denyNullBind', | ||
'tlsMinVersion', | ||
'tlsMaxVersion', | ||
'certificate', | ||
'clientTlsCert', | ||
'clientTlsKey', | ||
'userattr', | ||
'upndomain', | ||
'anonymousGroupSearch', | ||
], | ||
'Customize User Search': ['binddn', 'userdn', 'bindpass', 'userfilter'], | ||
'Customize Group Membership Search': ['groupfilter', 'groupattr', 'groupdn', 'useTokenGroups'], | ||
}; | ||
await login(); | ||
return visit('/vault/settings/auth/enable'); | ||
}); | ||
hooks.afterEach(async function () { | ||
await runCmd(deleteAuthCmd(this.path), false); | ||
}); | ||
testHelper(test); | ||
}); | ||
|
||
module('oidc', function (hooks) { | ||
hooks.beforeEach(async function () { | ||
this.type = 'oidc'; | ||
this.path = `${this.type}-${uuidv4()}`; | ||
this.customSelectors = { | ||
providerConfig: `${GENERAL.fieldByAttr('providerConfig')} textarea`, | ||
}; | ||
this.tuneFields = [ | ||
'oidcDiscoveryUrl', | ||
'defaultRole', | ||
'jwksCaPem', | ||
'jwksUrl', | ||
'oidcResponseMode', | ||
'oidcResponseTypes', | ||
'namespaceInState', | ||
'providerConfig', | ||
'unsupportedCriticalCertExtensions', | ||
]; | ||
this.tuneToggles = { | ||
'OIDC Options': [ | ||
'oidcClientId', | ||
'oidcClientSecret', | ||
'oidcDiscoveryCaPem', | ||
'jwtValidationPubkeys', | ||
'jwtSupportedAlgs', | ||
'boundIssuer', | ||
], | ||
}; | ||
await login(); | ||
return visit('/vault/settings/auth/enable'); | ||
}); | ||
hooks.afterEach(async function () { | ||
await runCmd(deleteAuthCmd(this.path), false); | ||
}); | ||
testHelper(test); | ||
}); | ||
|
||
module('okta', function (hooks) { | ||
hooks.beforeEach(async function () { | ||
this.type = 'okta'; | ||
this.path = `${this.type}-${uuidv4()}`; | ||
this.tuneFields = [ | ||
'orgName', | ||
'tokenBoundCidrs', | ||
'tokenExplicitMaxTtl', | ||
'tokenMaxTtl', | ||
'tokenNoDefaultPolicy', | ||
'tokenNumUses', | ||
'tokenPeriod', | ||
'tokenPolicies', | ||
'tokenTtl', | ||
'tokenType', | ||
]; | ||
this.tuneToggles = { Options: ['apiToken', 'baseUrl', 'bypassOktaMfa'] }; | ||
await login(); | ||
return visit('/vault/settings/auth/enable'); | ||
}); | ||
hooks.afterEach(async function () { | ||
await runCmd(deleteAuthCmd(this.path), false); | ||
}); | ||
testHelper(test); | ||
}); | ||
}); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
/** | ||
* Copyright (c) HashiCorp, Inc. | ||
* SPDX-License-Identifier: BUSL-1.1 | ||
*/ | ||
|
||
import { click, currentURL, fillIn } from '@ember/test-helpers'; | ||
import { GENERAL } from 'vault/tests/helpers/general-selectors'; | ||
|
||
const SELECTORS = { | ||
mountType: (name) => `[data-test-mount-type="${name}"]`, | ||
submit: '[data-test-mount-submit]', | ||
}; | ||
|
||
const assertFields = (assert, fields, customSelectors = {}) => { | ||
fields.forEach((param) => { | ||
if (Object.keys(customSelectors).includes(param)) { | ||
assert.dom(customSelectors[param]).exists(); | ||
} else { | ||
assert.dom(GENERAL.inputByAttr(param)).exists(); | ||
} | ||
}); | ||
}; | ||
export default (test) => { | ||
test('it renders mount fields', async function (assert) { | ||
await click(SELECTORS.mountType(this.type)); | ||
await click(GENERAL.toggleGroup('Method Options')); | ||
assertFields(assert, this.mountFields, this.customSelectors); | ||
}); | ||
|
||
test('it renders tune fields', async function (assert) { | ||
// enable auth method to check tune fields | ||
await click(SELECTORS.mountType(this.type)); | ||
await fillIn(GENERAL.inputByAttr('path'), this.path); | ||
await click(SELECTORS.submit); | ||
assert.strictEqual( | ||
currentURL(), | ||
`/vault/settings/auth/configure/${this.path}/configuration`, | ||
`${this.type}: it mounts navigates to tune form` | ||
); | ||
|
||
assertFields(assert, this.tuneFields, this.customSelectors); | ||
|
||
for (const toggle in this.tuneToggles) { | ||
const fields = this.tuneToggles[toggle]; | ||
await click(GENERAL.toggleGroup(toggle)); | ||
assertFields(assert, fields, this.customSelectors); | ||
} | ||
}); | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
alphabetized!