From f39961bbf5b1fa45459deb2601c8189fe9e99576 Mon Sep 17 00:00:00 2001 From: Lisbet Alvarez <107949262+lisbet-alvarez@users.noreply.github.com> Date: Mon, 3 Nov 2025 14:28:25 -0800 Subject: [PATCH] Add password type to models and mirage (#3039) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 🎸 add new password type to cred models + mirage * test: 💍 fix * refactor: 💡 update target mirage trait * chore: 🤖 add missing attr type --- .../api/addon/generated/models/credential.js | 4 ++-- addons/api/addon/models/credential-library.js | 3 +++ addons/api/addon/models/credential.js | 5 ++++- .../api/mirage/factories/credential-store.js | 2 +- addons/api/mirage/factories/credential.js | 12 ++++++++---- addons/api/mirage/factories/target.js | 18 ++++++++++++------ .../form/credential/password/index.hbs | 4 ++++ ...cted-application-credential-sources-test.js | 5 +++++ 8 files changed, 39 insertions(+), 14 deletions(-) create mode 100644 ui/admin/app/components/form/credential/password/index.hbs diff --git a/addons/api/addon/generated/models/credential.js b/addons/api/addon/generated/models/credential.js index 9e271a443..acaace5bd 100644 --- a/addons/api/addon/generated/models/credential.js +++ b/addons/api/addon/generated/models/credential.js @@ -59,9 +59,9 @@ export default class GeneratedCredentialModel extends BaseModel { }) username; - // =attributes (username_password, username_password_domain) + // =attributes (username_password, username_password_domain, password) @attr('string', { - for: ['username_password', 'username_password_domain'], + for: ['username_password', 'username_password_domain', 'password'], isNestedAttribute: true, isSecret: true, description: 'The password for credential.', diff --git a/addons/api/addon/models/credential-library.js b/addons/api/addon/models/credential-library.js index 8bb68bd52..b66491bbf 100644 --- a/addons/api/addon/models/credential-library.js +++ b/addons/api/addon/models/credential-library.js @@ -8,6 +8,7 @@ import { TYPE_CREDENTIAL_SSH_PRIVATE_KEY, TYPE_CREDENTIAL_USERNAME_PASSWORD_DOMAIN, TYPE_CREDENTIAL_USERNAME_PASSWORD, + TYPE_CREDENTIAL_PASSWORD, } from 'api/models/credential'; /** * Enum options for credential library. @@ -19,6 +20,7 @@ export const options = { TYPE_CREDENTIAL_SSH_PRIVATE_KEY, TYPE_CREDENTIAL_USERNAME_PASSWORD, TYPE_CREDENTIAL_USERNAME_PASSWORD_DOMAIN, + TYPE_CREDENTIAL_PASSWORD, ], mapping_overrides: { username_password: ['username_attribute', 'password_attribute'], @@ -32,6 +34,7 @@ export const options = { 'password_attribute', 'domain_attribute', ], + password: ['password_attribute'], }, }; diff --git a/addons/api/addon/models/credential.js b/addons/api/addon/models/credential.js index 146dcbf75..51cb74fa0 100644 --- a/addons/api/addon/models/credential.js +++ b/addons/api/addon/models/credential.js @@ -12,13 +12,16 @@ import GeneratedCredentialModel from '../generated/models/credential'; export const TYPE_CREDENTIAL_USERNAME_PASSWORD = 'username_password'; export const TYPE_CREDENTIAL_SSH_PRIVATE_KEY = 'ssh_private_key'; export const TYPE_CREDENTIAL_JSON = 'json'; -export const TYPE_CREDENTIAL_USERNAME_PASSWORD_DOMAIN = 'username_password_domain'; +export const TYPE_CREDENTIAL_USERNAME_PASSWORD_DOMAIN = + 'username_password_domain'; +export const TYPE_CREDENTIAL_PASSWORD = 'password'; export const TYPES_CREDENTIAL = Object.freeze([ TYPE_CREDENTIAL_USERNAME_PASSWORD, TYPE_CREDENTIAL_SSH_PRIVATE_KEY, TYPE_CREDENTIAL_USERNAME_PASSWORD_DOMAIN, TYPE_CREDENTIAL_JSON, + TYPE_CREDENTIAL_PASSWORD, ]); export default class CredentialModel extends GeneratedCredentialModel { diff --git a/addons/api/mirage/factories/credential-store.js b/addons/api/mirage/factories/credential-store.js index c6941f688..756b45739 100644 --- a/addons/api/mirage/factories/credential-store.js +++ b/addons/api/mirage/factories/credential-store.js @@ -65,7 +65,7 @@ export default factory.extend({ break; case 'static': default: - server.createList('credential', 3, { + server.createList('credential', 5, { scope, credentialStore, }); diff --git a/addons/api/mirage/factories/credential.js b/addons/api/mirage/factories/credential.js index c7349fb97..cfd1000d8 100644 --- a/addons/api/mirage/factories/credential.js +++ b/addons/api/mirage/factories/credential.js @@ -12,6 +12,8 @@ import { TYPE_CREDENTIAL_SSH_PRIVATE_KEY, TYPE_CREDENTIAL_USERNAME_PASSWORD, TYPE_CREDENTIAL_USERNAME_PASSWORD_DOMAIN, + TYPE_CREDENTIAL_JSON, + TYPE_CREDENTIAL_PASSWORD, } from 'api/models/credential'; const types = [...TYPES_CREDENTIAL]; @@ -20,14 +22,16 @@ export default factory.extend({ type: (i) => types[i % types.length], id() { switch (this.type) { - case 'ssh_private_key': + case TYPE_CREDENTIAL_SSH_PRIVATE_KEY: return generatedId('credspk_'); - case 'username_password': + case TYPE_CREDENTIAL_USERNAME_PASSWORD: return generatedId('credup_'); - case 'json': + case TYPE_CREDENTIAL_JSON: return generatedId('credjson_'); - case 'username_password_domain': + case TYPE_CREDENTIAL_USERNAME_PASSWORD_DOMAIN: return generatedId('credupd_'); + case TYPE_CREDENTIAL_PASSWORD: + return generatedId('credp_'); } }, authorized_actions: () => diff --git a/addons/api/mirage/factories/target.js b/addons/api/mirage/factories/target.js index c29767132..16331009c 100644 --- a/addons/api/mirage/factories/target.js +++ b/addons/api/mirage/factories/target.js @@ -17,7 +17,9 @@ import { TYPE_CREDENTIAL_USERNAME_PASSWORD_DOMAIN, TYPE_CREDENTIAL_USERNAME_PASSWORD, TYPE_CREDENTIAL_JSON, + TYPE_CREDENTIAL_PASSWORD, } from 'api/models/credential'; +import { TYPE_CREDENTIAL_LIBRARY_VAULT_LDAP } from 'api/models/credential-library'; const randomBoolean = (chance = 0.5) => Math.random() < chance; const randomFilter = () => @@ -111,7 +113,9 @@ export default factory.extend({ server.schema.credentialLibraries, (cred) => cred.scopeId === scope.id && - cred.credential_type !== TYPE_CREDENTIAL_USERNAME_PASSWORD_DOMAIN, + cred.credential_type !== TYPE_CREDENTIAL_USERNAME_PASSWORD_DOMAIN && + cred.credential_type !== TYPE_CREDENTIAL_PASSWORD && + cred.type !== TYPE_CREDENTIAL_LIBRARY_VAULT_LDAP, ); const filteredCredentials = selectItems( server.schema.credentials, @@ -119,6 +123,7 @@ export default factory.extend({ cred.scopeId === scope.id && ![ TYPE_CREDENTIAL_JSON, + TYPE_CREDENTIAL_PASSWORD, TYPE_CREDENTIAL_USERNAME_PASSWORD_DOMAIN, ].includes(cred.type), ); @@ -127,11 +132,12 @@ export default factory.extend({ const filteredCredentialLibrariesForRDP = selectItems( server.schema.credentialLibraries, (cred) => - cred.scopeId === scope.id && - [ - TYPE_CREDENTIAL_USERNAME_PASSWORD_DOMAIN, - TYPE_CREDENTIAL_USERNAME_PASSWORD, - ].includes(cred.credential_type), + (cred.scopeId === scope.id && + [ + TYPE_CREDENTIAL_USERNAME_PASSWORD_DOMAIN, + TYPE_CREDENTIAL_USERNAME_PASSWORD, + ].includes(cred.credential_type)) || + cred.type == TYPE_CREDENTIAL_LIBRARY_VAULT_LDAP, ); const filteredCredentialsForRDP = selectItems( server.schema.credentials, diff --git a/ui/admin/app/components/form/credential/password/index.hbs b/ui/admin/app/components/form/credential/password/index.hbs new file mode 100644 index 000000000..e76257cef --- /dev/null +++ b/ui/admin/app/components/form/credential/password/index.hbs @@ -0,0 +1,4 @@ +{{! + Copyright (c) HashiCorp, Inc. + SPDX-License-Identifier: BUSL-1.1 +}} \ No newline at end of file diff --git a/ui/admin/tests/acceptance/targets/injected-application-credential-sources-test.js b/ui/admin/tests/acceptance/targets/injected-application-credential-sources-test.js index c0789177f..49e4b00c8 100644 --- a/ui/admin/tests/acceptance/targets/injected-application-credential-sources-test.js +++ b/ui/admin/tests/acceptance/targets/injected-application-credential-sources-test.js @@ -15,6 +15,7 @@ import { TYPE_CREDENTIAL_USERNAME_PASSWORD, TYPE_CREDENTIAL_USERNAME_PASSWORD_DOMAIN, TYPE_CREDENTIAL_JSON, + TYPE_CREDENTIAL_PASSWORD, } from 'api/models/credential'; import { setRunOptions } from 'ember-a11y-testing/test-support'; @@ -121,6 +122,7 @@ module( (cred) => ![ TYPE_CREDENTIAL_JSON, + TYPE_CREDENTIAL_PASSWORD, TYPE_CREDENTIAL_USERNAME_PASSWORD_DOMAIN, ].includes(cred.type), ); @@ -130,6 +132,7 @@ module( (cred) => { return ( cred.credential_type !== TYPE_CREDENTIAL_USERNAME_PASSWORD_DOMAIN && + cred.credential_type !== TYPE_CREDENTIAL_PASSWORD && cred.type !== TYPE_CREDENTIAL_LIBRARY_VAULT_LDAP ); }, @@ -191,6 +194,7 @@ module( this.server.schema.credentialLibraries.where((c) => { return ( c.credential_type !== TYPE_CREDENTIAL_USERNAME_PASSWORD_DOMAIN && + c.credential_type !== TYPE_CREDENTIAL_PASSWORD && c.type !== TYPE_CREDENTIAL_LIBRARY_VAULT_LDAP ); }).models.length; @@ -200,6 +204,7 @@ module( (cred) => ![ TYPE_CREDENTIAL_USERNAME_PASSWORD_DOMAIN, + TYPE_CREDENTIAL_PASSWORD, TYPE_CREDENTIAL_JSON, ].includes(cred.type), ).models.length;