diff --git a/addons/api/addon/generated/models/account.js b/addons/api/addon/generated/models/account.js index df7012495..1818c0e84 100644 --- a/addons/api/addon/generated/models/account.js +++ b/addons/api/addon/generated/models/account.js @@ -43,4 +43,20 @@ export default class GeneratedAccountModel extends BaseModel { description: 'Current version number of this resource.', }) version; + + // =attributes (password) + @attr('string', { + for: 'password', + isNestedAttribute: true, + description: 'The account login name', + }) + login_name; + + // =attributes (OIDC) + @attr('string', { for: 'oidc', isNestedAttribute: true }) subject; + @attr('string', { for: 'oidc', isNestedAttribute: true }) issuer; + @attr('string', { for: 'oidc', isNestedAttribute: true, readOnly: true }) + email; + @attr('string', { for: 'oidc', isNestedAttribute: true, readOnly: true }) + full_name; } diff --git a/addons/api/addon/generated/models/credential-library.js b/addons/api/addon/generated/models/credential-library.js index a5f63633a..75723f756 100644 --- a/addons/api/addon/generated/models/credential-library.js +++ b/addons/api/addon/generated/models/credential-library.js @@ -44,4 +44,27 @@ export default class GeneratedCredentialLibraryModel extends BaseModel { description: 'Current version number of this resource.', }) version; + + //= attributes (vault) + + @attr('string', { + isNestedAttribute: true, + description: + 'The HTTP method the library uses when requesting credentials from Vault.', + defaultValue: () => 'GET', + }) + http_method; + + @attr('string', { + isNestedAttribute: true, + description: + 'The body of the HTTP request the library sends to Vault when requesting credentials. Only valid if `http_method` is set to `POST`.', + }) + http_request_body; + + @attr('string', { + isNestedAttribute: true, + description: 'The path in Vault to request credentials from.', + }) + path; } diff --git a/addons/api/addon/generated/models/credential-store.js b/addons/api/addon/generated/models/credential-store.js index 51dd4af87..8259b5609 100644 --- a/addons/api/addon/generated/models/credential-store.js +++ b/addons/api/addon/generated/models/credential-store.js @@ -39,4 +39,82 @@ export default class GeneratedCredentialStoreModel extends BaseModel { description: 'Current version number of this resource.', }) version; + + // =attributes (vault) + @attr('string', { + for: 'vault', + isNestedAttribute: true, + description: + "The address to Vault server. This should be a complete URL such as 'https://127.0.0.1:8200'", + }) + address; + + @attr('string', { + for: 'vault', + isNestedAttribute: true, + description: 'The namespace within Vault to use.', + }) + namespace; + + @attr('string', { + for: 'vault', + isNestedAttribute: true, + description: + "A PEM-encoded CA certificate to verify the Vault server's TLS certificate.", + }) + ca_cert; + + @attr('string', { + for: 'vault', + isNestedAttribute: true, + description: + 'Name to use as the SNI host when connecting to Vault via TLS.', + }) + tls_server_name; + + @attr('boolean', { + for: 'vault', + isNestedAttribute: true, + description: 'Whether or not to skip TLS verification.', + }) + tls_skip_verify; + + @attr('string', { + for: 'vault', + isNestedAttribute: true, + description: 'A token used for accessing Vault.', + }) + token; + + @attr('string', { + for: 'vault', + isNestedAttribute: true, + description: 'The Vault token hmac.', + readOnly: true, + }) + token_hmac; + + @attr('string', { + for: 'vault', + isNestedAttribute: true, + description: + 'A PEM-encoded client certificate to use for TLS authentication to the Vault server.', + }) + client_certificate; + + @attr('string', { + for: 'vault', + isNestedAttribute: true, + description: + "A PEM-encoded private key matching the client certificate from 'client_certificate'.", + }) + client_certificate_key; + + @attr('string', { + for: 'vault', + isNestedAttribute: true, + description: 'The Vault client certificate key hmac.', + readOnly: true, + }) + client_certificate_key_hmac; } diff --git a/addons/api/addon/generated/models/managed-group.js b/addons/api/addon/generated/models/managed-group.js index d6502eee6..9b9d2a83d 100644 --- a/addons/api/addon/generated/models/managed-group.js +++ b/addons/api/addon/generated/models/managed-group.js @@ -44,4 +44,13 @@ export default class GeneratedManagedGroupModel extends BaseModel { 'The ID of the Auth Method that is associated with this ManagedGroup', }) auth_method_id; + + // =attributes (OIDC) + + @attr('string', { + isNestedAttribute: true, + description: + 'The boolean expression filter to use to determine membership.', + }) + filter; } diff --git a/addons/api/addon/models/account.js b/addons/api/addon/models/account.js index 9412e18aa..8022c71e6 100644 --- a/addons/api/addon/models/account.js +++ b/addons/api/addon/models/account.js @@ -1,17 +1,10 @@ import GeneratedAccountModel from '../generated/models/account'; -import { fragment } from 'ember-data-model-fragments/attributes'; import { computed } from '@ember/object'; import { equal } from '@ember/object/computed'; export default class AccountModel extends GeneratedAccountModel { // =attributes - /** - * Attributes of this resource, if any, represented as a JSON fragment. - * @type {FragmentAccountAttributesModel} - */ - @fragment('fragment-account-attributes', { defaultValue: {} }) attributes; - /** * @type {boolean} */ @@ -26,9 +19,9 @@ export default class AccountModel extends GeneratedAccountModel { * Convenience for getting username in account. * @type {string} */ - @computed('attributes.{email,full_name,login_name}') + @computed('{email,full_name,login_name}') get accountName() { - const { email, full_name, login_name } = this.attributes; + const { email, full_name, login_name } = this; return email || full_name || login_name; } diff --git a/addons/api/addon/models/credential-library.js b/addons/api/addon/models/credential-library.js index a77e605ba..773478638 100644 --- a/addons/api/addon/models/credential-library.js +++ b/addons/api/addon/models/credential-library.js @@ -1,6 +1,4 @@ import GeneratedCredentialLibraryModel from '../generated/models/credential-library'; -import { attr } from '@ember-data/model'; -import { fragment } from 'ember-data-model-fragments/attributes'; /** * Enum options for credential library. @@ -9,22 +7,4 @@ export const options = { http_method: ['GET', 'POST'], }; -export default class CredentialLibraryModel extends GeneratedCredentialLibraryModel { - // =error attributes - // These attributes exist solely to capture errors on nested fields. - // See the application adapter's error normalization method for - // more information. - - @attr('string', { readOnly: true }) attributes_http_method; - @attr('string', { readOnly: true }) attributes_http_request_body; - @attr('string', { readOnly: true }) attributes_path; - - // =attributes - - /** - * Attributes of this resource, if any, represented as a JSON fragment. - * @type {FragmentCredentialLibraryAttributesModel} - */ - @fragment('fragment-credential-library-attributes', { defaultValue: {} }) - attributes; -} +export default class CredentialLibraryModel extends GeneratedCredentialLibraryModel {} diff --git a/addons/api/addon/models/credential-store.js b/addons/api/addon/models/credential-store.js index 0852da337..67e934874 100644 --- a/addons/api/addon/models/credential-store.js +++ b/addons/api/addon/models/credential-store.js @@ -1,32 +1,9 @@ import GeneratedCredentialStoreModel from '../generated/models/credential-store'; -import { attr } from '@ember-data/model'; -import { fragment } from 'ember-data-model-fragments/attributes'; import { equal } from '@ember/object/computed'; export default class CredentialStoreModel extends GeneratedCredentialStoreModel { - // =error attributes - // These attributes exist solely to capture errors on nested fields. - // See the application adapter's error normalization method for - // more information. - - @attr('string', { readOnly: true }) attributes_address; - @attr('string', { readOnly: true }) attributes_namespace; - @attr('string', { readOnly: true }) attributes_ca_cert; - @attr('string', { readOnly: true }) attributes_tls_server_name; - @attr('string', { readOnly: true }) attributes_tls_skip_verify; - @attr('string', { readOnly: true }) attributes_token; - @attr('string', { readOnly: true }) attributes_client_certificate; - @attr('string', { readOnly: true }) attributes_client_certificate_key; - // =attributes - /** - * Attributes of this resource, if any, represented as a JSON fragment. - * @type {FragmentAuthMethodAttributesModel} - */ - @fragment('fragment-credential-store-attributes', { defaultValue: {} }) - attributes; - /** * @type {boolean} */ diff --git a/addons/api/addon/models/fragment-account-attributes.js b/addons/api/addon/models/fragment-account-attributes.js deleted file mode 100644 index 0297f4399..000000000 --- a/addons/api/addon/models/fragment-account-attributes.js +++ /dev/null @@ -1,17 +0,0 @@ -import Fragment from 'ember-data-model-fragments/fragment'; -import { attr } from '@ember-data/model'; - -export default class FragmentAccountAttributesModel extends Fragment { - // =attributes (password) - @attr('string', { - for: 'password', - description: 'The account login name', - }) - login_name; - - // =attributes (OIDC) - @attr('string', { for: 'oidc' }) subject; - @attr('string', { for: 'oidc' }) issuer; - @attr('string', { for: 'oidc', readOnly: true }) email; - @attr('string', { for: 'oidc', readOnly: true }) full_name; -} diff --git a/addons/api/addon/models/fragment-credential-library-attributes.js b/addons/api/addon/models/fragment-credential-library-attributes.js deleted file mode 100644 index 582922601..000000000 --- a/addons/api/addon/models/fragment-credential-library-attributes.js +++ /dev/null @@ -1,25 +0,0 @@ -import Fragment from 'ember-data-model-fragments/fragment'; -import { attr } from '@ember-data/model'; -import { options } from './credential-library'; - -export default class FragmentCredentialLibraryAttributesModel extends Fragment { - //= attributes (vault) - - @attr('string', { - description: - 'The HTTP method the library uses when requesting credentials from Vault.', - defaultValue: () => options.http_method[0], - }) - http_method; - - @attr('string', { - description: - 'The body of the HTTP request the library sends to Vault when requesting credentials. Only valid if `http_method` is set to `POST`.', - }) - http_request_body; - - @attr('string', { - description: 'The path in Vault to request credentials from.', - }) - path; -} diff --git a/addons/api/addon/models/fragment-credential-store-attributes.js b/addons/api/addon/models/fragment-credential-store-attributes.js deleted file mode 100644 index bbc9e2b9c..000000000 --- a/addons/api/addon/models/fragment-credential-store-attributes.js +++ /dev/null @@ -1,72 +0,0 @@ -import Fragment from 'ember-data-model-fragments/fragment'; -import { attr } from '@ember-data/model'; - -export default class FragmentCredentialStoreAttributesModel extends Fragment { - // =attributes (vault) - @attr('string', { - for: 'vault', - description: - "The address to Vault server. This should be a complete URL such as 'https://127.0.0.1:8200'", - }) - address; - - @attr('string', { - for: 'vault', - description: 'The namespace within Vault to use.', - }) - namespace; - - @attr('string', { - for: 'vault', - description: - "A PEM-encoded CA certificate to verify the Vault server's TLS certificate.", - }) - ca_cert; - - @attr('string', { - for: 'vault', - description: - 'Name to use as the SNI host when connecting to Vault via TLS.', - }) - tls_server_name; - - @attr('boolean', { - for: 'vault', - description: 'Whether or not to skip TLS verification.', - }) - tls_skip_verify; - - @attr('string', { - for: 'vault', - description: 'A token used for accessing Vault.', - }) - token; - - @attr('string', { - for: 'vault', - description: 'The Vault token hmac.', - readOnly: true, - }) - token_hmac; - - @attr('string', { - for: 'vault', - description: - 'A PEM-encoded client certificate to use for TLS authentication to the Vault server.', - }) - client_certificate; - - @attr('string', { - for: 'vault', - description: - "A PEM-encoded private key matching the client certificate from 'client_certificate'.", - }) - client_certificate_key; - - @attr('string', { - for: 'vault', - description: 'The Vault client certificate key hmac.', - readOnly: true, - }) - client_certificate_key_hmac; -} diff --git a/addons/api/addon/models/fragment-managed-group-attributes.js b/addons/api/addon/models/fragment-managed-group-attributes.js deleted file mode 100644 index a4d0583ff..000000000 --- a/addons/api/addon/models/fragment-managed-group-attributes.js +++ /dev/null @@ -1,12 +0,0 @@ -import Fragment from 'ember-data-model-fragments/fragment'; -import { attr } from '@ember-data/model'; - -export default class FragmentManagedGroupAttributesModel extends Fragment { - // =attributes (OIDC) - - @attr('string', { - description: - 'The boolean expression filter to use to determine membership.', - }) - filter; -} diff --git a/addons/api/addon/models/managed-group.js b/addons/api/addon/models/managed-group.js index 5843bb0e5..1dadd2cad 100644 --- a/addons/api/addon/models/managed-group.js +++ b/addons/api/addon/models/managed-group.js @@ -1,18 +1,10 @@ import GeneratedManagedGroupModel from '../generated/models/managed-group'; import { attr } from '@ember-data/model'; -import { fragment } from 'ember-data-model-fragments/attributes'; import { A } from '@ember/array'; export default class ManagedGroupModel extends GeneratedManagedGroupModel { // =attributes - // =error attributes - // These attributes exist solely to capture errors on nested fields. - // See the application adapter's error normalization method for - // more information. - - @attr('string', { readOnly: true }) attributes_filter; - /** * Members is read-only under normal circumstances. But members can * be persisted via calls to `addMembers()` or `removeMembers()`. @@ -23,7 +15,4 @@ export default class ManagedGroupModel extends GeneratedManagedGroupModel { emptyArrayIfMissing: true, }) member_ids; - - @fragment('fragment-managed-group-attributes', { defaultValue: {} }) - attributes; } diff --git a/addons/api/addon/serializers/account.js b/addons/api/addon/serializers/account.js index 4f242aaa9..ecdd12a04 100644 --- a/addons/api/addon/serializers/account.js +++ b/addons/api/addon/serializers/account.js @@ -38,7 +38,7 @@ export default class AccountSerializer extends ApplicationSerializer { delete serialized.attributes; if (isNew) { serialized.attributes = {}; - const { issuer, subject } = snapshot.attr('attributes').record; + const { issuer, subject } = snapshot.record; if (issuer) serialized.attributes.issuer = issuer; if (subject) serialized.attributes.subject = subject; } diff --git a/addons/api/addon/serializers/credential-library.js b/addons/api/addon/serializers/credential-library.js index d1ced9a2b..a59e70c55 100644 --- a/addons/api/addon/serializers/credential-library.js +++ b/addons/api/addon/serializers/credential-library.js @@ -1,3 +1,18 @@ import ApplicationSerializer from './application'; -export default class CredentialLibrarySerializer extends ApplicationSerializer {} +export default class CredentialLibrarySerializer extends ApplicationSerializer { + /** + * @override + * @method serialize + * @param {Snapshot} snapshot + */ + serialize() { + const serialized = super.serialize(...arguments); + if (serialized.attributes) { + // Serialize `http_request_body` only if `http_method` is POST + if (!serialized.attributes?.http_method?.match(/post/i)) + delete serialized.attributes.http_request_body; + } + return serialized; + } +} diff --git a/addons/api/addon/serializers/credential-store.js b/addons/api/addon/serializers/credential-store.js index 602e4601f..ee9a2e97d 100644 --- a/addons/api/addon/serializers/credential-store.js +++ b/addons/api/addon/serializers/credential-store.js @@ -1,3 +1,24 @@ import ApplicationSerializer from './application'; -export default class CredentialStoreSerializer extends ApplicationSerializer {} +export default class CredentialStoreSerializer extends ApplicationSerializer { + /** + * @override + * @method serialize + * @param {Snapshot} snapshot + */ + serialize() { + const serialized = super.serialize(...arguments); + if (serialized.attributes) { + // Token cannot be unset. If it's falsy, it must be removed. + if (!serialized.attributes?.token) delete serialized.attributes.token; + // Client certificate key cannot be unset when certificate is set. + // If it's falsy, it must be removed. + if ( + !serialized.attributes?.client_certificate_key && + serialized.attributes?.client_certificate + ) + delete serialized.attributes.client_certificate_key; + } + return serialized; + } +} diff --git a/addons/api/addon/serializers/fragment-account-attributes.js b/addons/api/addon/serializers/fragment-account-attributes.js deleted file mode 100644 index a9dcb590c..000000000 --- a/addons/api/addon/serializers/fragment-account-attributes.js +++ /dev/null @@ -1,26 +0,0 @@ -import JSONSerializer from '@ember-data/serializer/json'; - -export default class FragmentAccountAttributesSerializer extends JSONSerializer { - /** - * If an attribute is annotated as readOnly in the model, don't serialize it. - * Otherwise delegate to default attribute serializer. - * - * @override - * @method serializeAttribute - * @param {Snapshot} snapshot - * @param {Object} json - * @param {String} key - * @param {Object} attribute - */ - serializeAttribute(snapshot, json, key, attribute) { - const { type, options } = attribute; - let value = super.serializeAttribute(...arguments); - // Convert empty strings to null. - if (type === 'string' && json[key] === '') json[key] = null; - // Do not serialize read-only attributes. - if (options.readOnly) delete json[key]; - // Client secret cannot be unset. If it's falsy, it must be removed. - if (key === 'client_secret' && !json[key]) delete json[key]; - return value; - } -} diff --git a/addons/api/addon/serializers/fragment-credential-library-attributes.js b/addons/api/addon/serializers/fragment-credential-library-attributes.js deleted file mode 100644 index 8d52b101f..000000000 --- a/addons/api/addon/serializers/fragment-credential-library-attributes.js +++ /dev/null @@ -1,27 +0,0 @@ -import JSONSerializer from '@ember-data/serializer/json'; - -export default class FragmentCredentialLibraryAttributesSerializer extends JSONSerializer { - /** - * If an attribute is annotated as readOnly in the model, don't serialize it. - * Otherwise delegate to default attribute serializer. - * Only serialize http_request_body when `http_method` is set to `POST`. - * @override - * @method serializeAttribute - * @param {Snapshot} snapshot - * @param {Object} json - * @param {String} key - * @param {Object} attribute - */ - serializeAttribute(snapshot, json, key, attribute) { - const { type, options } = attribute; - let value = super.serializeAttribute(...arguments); - // Convert empty strings to null. - if (type === 'string' && json[key] === '') json[key] = null; - // Do not serialize read-only attributes. - if (options.readOnly) delete json[key]; - // Do not serialize http_request_body unless http_method is POST - if (key === 'http_request_body' && !json['http_method']?.match(/post/i)) - delete json[key]; - return value; - } -} diff --git a/addons/api/addon/serializers/fragment-credential-store-attributes.js b/addons/api/addon/serializers/fragment-credential-store-attributes.js deleted file mode 100644 index 883a823aa..000000000 --- a/addons/api/addon/serializers/fragment-credential-store-attributes.js +++ /dev/null @@ -1,34 +0,0 @@ -import JSONSerializer from '@ember-data/serializer/json'; - -export default class FragmentCredentialStoreAttributesSerializer extends JSONSerializer { - /** - * If an attribute is annotated as readOnly in the model, don't serialize it. - * Otherwise delegate to default attribute serializer. - * - * @override - * @method serializeAttribute - * @param {Snapshot} snapshot - * @param {Object} json - * @param {String} key - * @param {Object} attribute - */ - serializeAttribute(snapshot, json, key, attribute) { - const { type, options } = attribute; - let value = super.serializeAttribute(...arguments); - // Convert empty strings to null. - if (type === 'string' && json[key] === '') json[key] = null; - // Do not serialize read-only attributes. - if (options.readOnly) delete json[key]; - // Token cannot be unset. If it's falsy, it must be removed. - if (key === 'token' && !json[key]) delete json[key]; - // Client certificate key cannot be unset when certificate is set. - // If it's falsy, it must be removed. - if ( - key === 'client_certificate_key' && - !json[key] && - json['client_certificate'] - ) - delete json[key]; - return value; - } -} diff --git a/addons/api/addon/serializers/fragment-managed-group-attributes.js b/addons/api/addon/serializers/fragment-managed-group-attributes.js deleted file mode 100644 index 230358a20..000000000 --- a/addons/api/addon/serializers/fragment-managed-group-attributes.js +++ /dev/null @@ -1,27 +0,0 @@ -import JSONSerializer from '@ember-data/serializer/json'; - -export default class FragmentManagedGroupAttributesSerializer extends JSONSerializer { - /** - * If an attribute is annotated as readOnly in the model, don't serialize it. - * Otherwise delegate to default attribute serializer. - * @override - * @method serializeAttribute - * @param {Snapshot} snapshot - * @param {Object} json - * @param {String} key - * @param {Object} attribute - */ - serializeAttribute(snapshot, json, key, attribute) { - const { type, options } = attribute; - let value = super.serializeAttribute(...arguments); - // Convert empty string to null. - if (type === 'string' && json[key] === '') json[key] = null; - // Do not serialize read-only attributes. - if (options.readOnly) delete json[key]; - // Version is sent only if it has a non-nullish value - if (key === 'version') { - if (json[key] === null || json[key] === undefined) delete json[key]; - } - return value; - } -} diff --git a/addons/api/app/models/fragment-account-attributes.js b/addons/api/app/models/fragment-account-attributes.js deleted file mode 100644 index 8d0d8f53f..000000000 --- a/addons/api/app/models/fragment-account-attributes.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'api/models/fragment-account-attributes'; diff --git a/addons/api/app/models/fragment-credential-library-attributes.js b/addons/api/app/models/fragment-credential-library-attributes.js deleted file mode 100644 index 04d8f2597..000000000 --- a/addons/api/app/models/fragment-credential-library-attributes.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'api/models/fragment-credential-library-attributes'; diff --git a/addons/api/app/models/fragment-credential-store-attributes.js b/addons/api/app/models/fragment-credential-store-attributes.js deleted file mode 100644 index 642d34069..000000000 --- a/addons/api/app/models/fragment-credential-store-attributes.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'api/models/fragment-credential-store-attributes'; diff --git a/addons/api/app/models/fragment-managed-group-attributes.js b/addons/api/app/models/fragment-managed-group-attributes.js deleted file mode 100644 index 5d7d865ef..000000000 --- a/addons/api/app/models/fragment-managed-group-attributes.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'api/models/fragment-managed-group-attributes'; diff --git a/addons/api/app/serializers/fragment-account-attributes.js b/addons/api/app/serializers/fragment-account-attributes.js deleted file mode 100644 index b37aa8148..000000000 --- a/addons/api/app/serializers/fragment-account-attributes.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'api/serializers/fragment-account-attributes'; diff --git a/addons/api/app/serializers/fragment-credential-library-attributes.js b/addons/api/app/serializers/fragment-credential-library-attributes.js deleted file mode 100644 index d16c81e21..000000000 --- a/addons/api/app/serializers/fragment-credential-library-attributes.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'api/serializers/fragment-credential-library-attributes'; diff --git a/addons/api/app/serializers/fragment-credential-store-attributes.js b/addons/api/app/serializers/fragment-credential-store-attributes.js deleted file mode 100644 index b29c3913a..000000000 --- a/addons/api/app/serializers/fragment-credential-store-attributes.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'api/serializers/fragment-credential-store-attributes'; diff --git a/addons/api/app/serializers/fragment-managed-group-attributes.js b/addons/api/app/serializers/fragment-managed-group-attributes.js deleted file mode 100644 index 1038afc31..000000000 --- a/addons/api/app/serializers/fragment-managed-group-attributes.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from 'api/serializers/fragment-managed-group-attributes'; diff --git a/addons/api/tests/unit/models/account-test.js b/addons/api/tests/unit/models/account-test.js index 4a4b3b0d4..cc4225e89 100644 --- a/addons/api/tests/unit/models/account-test.js +++ b/addons/api/tests/unit/models/account-test.js @@ -17,7 +17,7 @@ module('Unit | Model | account', function (hooks) { type: 'password', }); assert.notOk(model.accountName); - model.attributes.login_name = 'foobar'; + model.login_name = 'foobar'; assert.equal(model.accountName, 'foobar'); }); }); diff --git a/addons/api/tests/unit/models/fragment-credential-library-attributes-test.js b/addons/api/tests/unit/models/fragment-credential-library-attributes-test.js deleted file mode 100644 index 01f649c1e..000000000 --- a/addons/api/tests/unit/models/fragment-credential-library-attributes-test.js +++ /dev/null @@ -1,19 +0,0 @@ -import { module, test } from 'qunit'; -import { setupTest } from 'ember-qunit'; - -module( - 'Unit | Model | fragment credential library attributes', - function (hooks) { - setupTest(hooks); - - // Replace this with your real tests. - test('it exists', function (assert) { - let store = this.owner.lookup('service:store'); - let model = store.createRecord( - 'fragment-credential-library-attributes', - {} - ); - assert.ok(model); - }); - } -); diff --git a/addons/api/tests/unit/models/fragment-credential-store-attributes-test.js b/addons/api/tests/unit/models/fragment-credential-store-attributes-test.js deleted file mode 100644 index 33f21b67b..000000000 --- a/addons/api/tests/unit/models/fragment-credential-store-attributes-test.js +++ /dev/null @@ -1,13 +0,0 @@ -import { module, test } from 'qunit'; -import { setupTest } from 'ember-qunit'; - -module('Unit | Model | fragment credential store attributes', function (hooks) { - setupTest(hooks); - - // Replace this with your real tests. - test('it exists', function (assert) { - let store = this.owner.lookup('service:store'); - let model = store.createRecord('fragment-credential-store-attributes', {}); - assert.ok(model); - }); -}); diff --git a/addons/api/tests/unit/models/fragment-managed-group-attributes-test.js b/addons/api/tests/unit/models/fragment-managed-group-attributes-test.js deleted file mode 100644 index e33479dec..000000000 --- a/addons/api/tests/unit/models/fragment-managed-group-attributes-test.js +++ /dev/null @@ -1,13 +0,0 @@ -import { module, test } from 'qunit'; -import { setupTest } from 'ember-qunit'; - -module('Unit | Model | fragment managed group attributes', function (hooks) { - setupTest(hooks); - - // Replace this with your real tests. - test('it exists', function (assert) { - let store = this.owner.lookup('service:store'); - let model = store.createRecord('fragment-managed-group-attributes', {}); - assert.ok(model); - }); -}); diff --git a/addons/api/tests/unit/serializers/account-test.js b/addons/api/tests/unit/serializers/account-test.js index 7af6a504f..3fc9b58c1 100644 --- a/addons/api/tests/unit/serializers/account-test.js +++ b/addons/api/tests/unit/serializers/account-test.js @@ -13,12 +13,10 @@ module('Unit | Serializer | account', function (hooks) { name: 'Name', auth_method_id: '1', description: 'Description', - attributes: { - issuer: 'issuer', - subject: 'sub', - full_name: 'full_name', - email: 'email', - }, + issuer: 'issuer', + subject: 'sub', + full_name: 'full_name', + email: 'email', version: 1, }); const snapshot = record._createSnapshot(); @@ -49,12 +47,10 @@ module('Unit | Serializer | account', function (hooks) { name: 'Name', auth_method_id: '1', description: 'Description', - attributes: { - issuer: 'issuer', - subject: 'sub', - full_name: 'full_name', - email: 'email', - }, + issuer: 'issuer', + subject: 'sub', + full_name: 'full_name', + email: 'email', version: 1, }, }, @@ -81,9 +77,7 @@ module('Unit | Serializer | account', function (hooks) { name: 'Name', auth_method_id: '1', description: 'Description', - attributes: { - login_name: 'Login Name', - }, + login_name: 'Login Name', version: 1, }); const snapshot = record._createSnapshot(); @@ -109,9 +103,7 @@ module('Unit | Serializer | account', function (hooks) { name: 'Name', auth_method_id: '1', description: 'Description', - attributes: { - login_name: 'Login Name', - }, + login_name: 'Login Name', version: 1, }); const snapshot = record._createSnapshot(); @@ -144,9 +136,7 @@ module('Unit | Serializer | account', function (hooks) { type: 'password', name: 'Name', description: 'Description', - attributes: { - login_name: 'Login Name', - }, + login_name: 'Login Name', auth_method_id: '1', version: 1, }); @@ -170,9 +160,7 @@ module('Unit | Serializer | account', function (hooks) { type: 'password', name: 'Name', description: 'Description', - attributes: { - login_name: 'Login Name', - }, + login_name: 'Login Name', auth_method_id: '1', version: 1, }); diff --git a/addons/api/tests/unit/serializers/credential-library-test.js b/addons/api/tests/unit/serializers/credential-library-test.js index 885474d42..7a5613783 100644 --- a/addons/api/tests/unit/serializers/credential-library-test.js +++ b/addons/api/tests/unit/serializers/credential-library-test.js @@ -12,10 +12,8 @@ module('Unit | Serializer | credential library', function (hooks) { type: 'vault', name: 'Name', description: 'Description', - attributes: { - path: '/vault/path', - http_method: 'GET', - }, + path: '/vault/path', + http_method: 'GET', version: 1, }); const snapshot = record._createSnapshot(); @@ -45,10 +43,8 @@ module('Unit | Serializer | credential library', function (hooks) { type: 'vault', name: 'Name', description: 'Description', - attributes: { - path: '/vault/path', - http_method: 'GET', - }, + path: '/vault/path', + http_method: 'GET', version: 1, }, }, @@ -68,4 +64,66 @@ module('Unit | Serializer | credential library', function (hooks) { version: 1, }); }); + + test('it serializes empty strings to null', function (assert) { + assert.expect(1); + const store = this.owner.lookup('service:store'); + const record = store.createRecord('credential-library', { + http_method: '', + path: null, + }); + let serializedRecord = record.serialize(); + assert.deepEqual(serializedRecord, { + attributes: { + http_method: null, + path: null, + }, + credential_store_id: null, + description: null, + name: null, + type: null, + }); + }); + + test('it does not serialize http_request_body unless http_method is set to POST', function (assert) { + assert.expect(2); + const store = this.owner.lookup('service:store'); + const record = store.createRecord('credential-library', { + http_method: 'GET', + http_request_body: 'body', + }); + let serializedRecord = record.serialize(); + assert.deepEqual( + serializedRecord, + { + attributes: { + http_method: 'GET', + path: null, + }, + credential_store_id: null, + description: null, + name: null, + type: null, + }, + 'http_request_body attribute is not expected' + ); + + record.http_method = 'POST'; + serializedRecord = record.serialize(); + assert.deepEqual( + serializedRecord, + { + attributes: { + http_method: 'POST', + http_request_body: 'body', + path: null, + }, + credential_store_id: null, + description: null, + name: null, + type: null, + }, + 'http_request_body attribute is expected' + ); + }); }); diff --git a/addons/api/tests/unit/serializers/credential-store-test.js b/addons/api/tests/unit/serializers/credential-store-test.js index 6beae653c..fd2415ff2 100644 --- a/addons/api/tests/unit/serializers/credential-store-test.js +++ b/addons/api/tests/unit/serializers/credential-store-test.js @@ -12,16 +12,14 @@ module('Unit | Serializer | credential store', function (hooks) { type: 'vault', name: 'Name', description: 'Description', - attributes: { - address: 'http://localhost:5000', - ca_cert: 'ca-cert-123', - client_certificate: 'client-cert-123', - client_certificate_key: 'client-cert-key-456', - namespace: 'foobar', - tls_server_name: 'yes', - tls_skip_verify: false, - token: 'foo', - }, + address: 'http://localhost:5000', + ca_cert: 'ca-cert-123', + client_certificate: 'client-cert-123', + client_certificate_key: 'client-cert-key-456', + namespace: 'foobar', + tls_server_name: 'yes', + tls_skip_verify: false, + token: 'foo', version: 1, }); const snapshot = record._createSnapshot(); @@ -56,16 +54,14 @@ module('Unit | Serializer | credential store', function (hooks) { type: 'vault', name: 'Name', description: 'Description', - attributes: { - address: 'http://localhost:5000', - ca_cert: 'ca-cert-123', - client_certificate: 'client-cert-123', - client_certificate_key: 'client-cert-key-456', - namespace: 'foobar', - tls_server_name: 'yes', - tls_skip_verify: false, - token: 'foo', - }, + address: 'http://localhost:5000', + ca_cert: 'ca-cert-123', + client_certificate: 'client-cert-123', + client_certificate_key: 'client-cert-key-456', + namespace: 'foobar', + tls_server_name: 'yes', + tls_skip_verify: false, + token: 'foo', version: 1, }, }, @@ -90,4 +86,123 @@ module('Unit | Serializer | credential store', function (hooks) { version: 1, }); }); + + test('it serializes empty strings to null', function (assert) { + assert.expect(1); + const store = this.owner.lookup('service:store'); + const record = store.createRecord('credential-store', { + address: '', + ca_cert: '', + client_certificate: '', + client_certificate_key: '', + namespace: '', + tls_server_name: '', + tls_skip_verify: false, + }); + let serializedRecord = record.serialize(); + assert.deepEqual(serializedRecord, { + attributes: { + address: null, + ca_cert: null, + client_certificate: null, + client_certificate_key: null, + namespace: null, + tls_server_name: null, + tls_skip_verify: false, + }, + description: null, + name: null, + type: null, + }); + }); + + test('it does not serialize token if present but falsy', function (assert) { + assert.expect(1); + const store = this.owner.lookup('service:store'); + const record = store.createRecord('credential-store', { + token: null, + address: 'http://localhost:5000', + ca_cert: 'ca-cert-123', + client_certificate: 'client-cert-123', + client_certificate_key: 'client-cert-key-456', + namespace: 'foobar', + tls_server_name: 'yes', + tls_skip_verify: false, + }); + let serializedRecord = record.serialize(); + assert.deepEqual( + serializedRecord, + { + attributes: { + address: 'http://localhost:5000', + ca_cert: 'ca-cert-123', + client_certificate: 'client-cert-123', + client_certificate_key: 'client-cert-key-456', + namespace: 'foobar', + tls_server_name: 'yes', + tls_skip_verify: false, + }, + description: null, + name: null, + type: null, + }, + 'token attribute is not expected' + ); + }); + + test('it does not serialize client certificate key if present but falsy when client certificate is present', function (assert) { + assert.expect(2); + const store = this.owner.lookup('service:store'); + const record = store.createRecord('credential-store', { + client_certificate: 'client-cert-123', + client_certificate_key: '', + address: 'http://localhost:5000', + token: 'foo', + ca_cert: 'ca-cert-123', + namespace: 'foobar', + tls_server_name: 'yes', + tls_skip_verify: false, + }); + let serializedRecord = record.serialize(); + assert.deepEqual( + serializedRecord, + { + attributes: { + client_certificate: 'client-cert-123', + address: 'http://localhost:5000', + token: 'foo', + ca_cert: 'ca-cert-123', + namespace: 'foobar', + tls_server_name: 'yes', + tls_skip_verify: false, + }, + description: null, + name: null, + type: null, + }, + 'client certificate key attribute is not expected' + ); + + record.client_certificate_key = 'client-cert-key-456'; + serializedRecord = record.serialize(); + assert.deepEqual( + serializedRecord, + { + attributes: { + client_certificate: 'client-cert-123', + client_certificate_key: 'client-cert-key-456', + address: 'http://localhost:5000', + token: 'foo', + ca_cert: 'ca-cert-123', + namespace: 'foobar', + tls_server_name: 'yes', + tls_skip_verify: false, + }, + description: null, + name: null, + type: null, + }, + 'client certificate key attribute is expected' + ); + }); }); diff --git a/addons/api/tests/unit/serializers/fragment-account-attributes-test.js b/addons/api/tests/unit/serializers/fragment-account-attributes-test.js deleted file mode 100644 index 3245f8b80..000000000 --- a/addons/api/tests/unit/serializers/fragment-account-attributes-test.js +++ /dev/null @@ -1,23 +0,0 @@ -import { module, test } from 'qunit'; -import { setupTest } from 'ember-qunit'; - -module('Unit | Serializer | fragment account attributes', function (hooks) { - setupTest(hooks); - - // Replace this with your real tests. - test('it exists', function (assert) { - let store = this.owner.lookup('service:store'); - let serializer = store.serializerFor('fragment-account-attributes'); - - assert.ok(serializer); - }); - - test('it serializes records', function (assert) { - let store = this.owner.lookup('service:store'); - let record = store.createRecord('fragment-account-attributes', {}); - - let serializedRecord = record.serialize(); - - assert.ok(serializedRecord); - }); -}); diff --git a/addons/api/tests/unit/serializers/fragment-credential-library-attributes-test.js b/addons/api/tests/unit/serializers/fragment-credential-library-attributes-test.js deleted file mode 100644 index 72818936c..000000000 --- a/addons/api/tests/unit/serializers/fragment-credential-library-attributes-test.js +++ /dev/null @@ -1,59 +0,0 @@ -import { module, test } from 'qunit'; -import { setupTest } from 'ember-qunit'; - -module( - 'Unit | Serializer | fragment credential library attributes', - function (hooks) { - setupTest(hooks); - - test('it serializes empty strings to null', function (assert) { - assert.expect(1); - const store = this.owner.lookup('service:store'); - const record = store.createRecord( - 'fragment-credential-library-attributes', - { - http_method: '', - path: null, - } - ); - let serializedRecord = record.serialize(); - assert.deepEqual(serializedRecord, { - http_method: null, - path: null, - }); - }); - - test('it does not serialize http_request_body unless http_method is set to POST', function (assert) { - assert.expect(2); - const store = this.owner.lookup('service:store'); - const record = store.createRecord( - 'fragment-credential-library-attributes', - { - http_method: 'GET', - http_request_body: 'body', - } - ); - let serializedRecord = record.serialize(); - assert.deepEqual( - serializedRecord, - { - http_method: 'GET', - path: null, - }, - 'http_request_body attribute is not expected' - ); - - record.http_method = 'POST'; - serializedRecord = record.serialize(); - assert.deepEqual( - serializedRecord, - { - http_method: 'POST', - http_request_body: 'body', - path: null, - }, - 'http_request_body attribute is expected' - ); - }); - } -); diff --git a/addons/api/tests/unit/serializers/fragment-credential-store-attributes-test.js b/addons/api/tests/unit/serializers/fragment-credential-store-attributes-test.js deleted file mode 100644 index cfa00734b..000000000 --- a/addons/api/tests/unit/serializers/fragment-credential-store-attributes-test.js +++ /dev/null @@ -1,117 +0,0 @@ -import { module, test } from 'qunit'; -import { setupTest } from 'ember-qunit'; - -module( - 'Unit | Serializer | fragment credential store attributes', - function (hooks) { - setupTest(hooks); - - test('it serializes empty strings to null', function (assert) { - assert.expect(1); - const store = this.owner.lookup('service:store'); - const record = store.createRecord( - 'fragment-credential-store-attributes', - { - address: '', - ca_cert: '', - client_certificate: '', - client_certificate_key: '', - namespace: '', - tls_server_name: '', - tls_skip_verify: false, - } - ); - let serializedRecord = record.serialize(); - assert.deepEqual(serializedRecord, { - address: null, - ca_cert: null, - client_certificate: null, - client_certificate_key: null, - namespace: null, - tls_server_name: null, - tls_skip_verify: false, - }); - }); - - test('it does not serialize token if present but falsy', function (assert) { - assert.expect(1); - const store = this.owner.lookup('service:store'); - const record = store.createRecord( - 'fragment-credential-store-attributes', - { - token: null, - address: 'http://localhost:5000', - ca_cert: 'ca-cert-123', - client_certificate: 'client-cert-123', - client_certificate_key: 'client-cert-key-456', - namespace: 'foobar', - tls_server_name: 'yes', - tls_skip_verify: false, - } - ); - let serializedRecord = record.serialize(); - assert.deepEqual( - serializedRecord, - { - address: 'http://localhost:5000', - ca_cert: 'ca-cert-123', - client_certificate: 'client-cert-123', - client_certificate_key: 'client-cert-key-456', - namespace: 'foobar', - tls_server_name: 'yes', - tls_skip_verify: false, - }, - 'token attribute is not expected' - ); - }); - - test('it does not serialize client certificate key if present but falsy when client certificate is present', function (assert) { - assert.expect(2); - const store = this.owner.lookup('service:store'); - const record = store.createRecord( - 'fragment-credential-store-attributes', - { - client_certificate: 'client-cert-123', - client_certificate_key: '', - address: 'http://localhost:5000', - token: 'foo', - ca_cert: 'ca-cert-123', - namespace: 'foobar', - tls_server_name: 'yes', - tls_skip_verify: false, - } - ); - let serializedRecord = record.serialize(); - assert.deepEqual( - serializedRecord, - { - client_certificate: 'client-cert-123', - address: 'http://localhost:5000', - token: 'foo', - ca_cert: 'ca-cert-123', - namespace: 'foobar', - tls_server_name: 'yes', - tls_skip_verify: false, - }, - 'client certificate key attribute is not expected' - ); - - record.client_certificate_key = 'client-cert-key-456'; - serializedRecord = record.serialize(); - assert.deepEqual( - serializedRecord, - { - client_certificate: 'client-cert-123', - client_certificate_key: 'client-cert-key-456', - address: 'http://localhost:5000', - token: 'foo', - ca_cert: 'ca-cert-123', - namespace: 'foobar', - tls_server_name: 'yes', - tls_skip_verify: false, - }, - 'client certificate key attribute is expected' - ); - }); - } -); diff --git a/addons/api/tests/unit/serializers/fragment-managed-group-attributes-test.js b/addons/api/tests/unit/serializers/fragment-managed-group-attributes-test.js deleted file mode 100644 index 69af8a3a1..000000000 --- a/addons/api/tests/unit/serializers/fragment-managed-group-attributes-test.js +++ /dev/null @@ -1,21 +0,0 @@ -import { module, test } from 'qunit'; -import { setupTest } from 'ember-qunit'; - -module( - 'Unit | Serializer | fragment managed groups attributes', - function (hooks) { - setupTest(hooks); - - test('it serializes empty string to null', function (assert) { - assert.expect(1); - const store = this.owner.lookup('service:store'); - const record = store.createRecord('fragment-managed-group-attributes', { - filter: '', - }); - const serializedRecord = record.serialize(); - assert.deepEqual(serializedRecord, { - filter: null, - }); - }); - } -); diff --git a/addons/api/tests/unit/serializers/managed-group-test.js b/addons/api/tests/unit/serializers/managed-group-test.js index 029a92dd4..a75ac1dd2 100644 --- a/addons/api/tests/unit/serializers/managed-group-test.js +++ b/addons/api/tests/unit/serializers/managed-group-test.js @@ -41,9 +41,7 @@ module('Unit | Serializer | Managed group', function (hooks) { version: 1, auth_method_id: '1234', type: 'oidc', - attributes: { - filter: 'key=value', - }, + filter: 'key=value', }); const snapshot = record._createSnapshot(); snapshot.adapterOptions = {}; @@ -75,9 +73,7 @@ module('Unit | Serializer | Managed group', function (hooks) { version: undefined, auth_method_id: '1234', type: 'oidc', - attributes: { - filter: 'key=value', - }, + filter: 'key=value', }, }, }); @@ -138,9 +134,7 @@ module('Unit | Serializer | Managed group', function (hooks) { version: 1, auth_method_id: '1234', type: 'oidc', - attributes: { - filter: 'key=value', - }, + filter: 'key=value', }, }, }); diff --git a/ui/admin/app/components/form/account/oidc/index.hbs b/ui/admin/app/components/form/account/oidc/index.hbs index 16cc9c0b8..ef0ac0077 100644 --- a/ui/admin/app/components/form/account/oidc/index.hbs +++ b/ui/admin/app/components/form/account/oidc/index.hbs @@ -15,25 +15,25 @@ {{#unless @model.isNew}} - {{#if @model.errors.attributes_path}} + {{#if @model.errors.path}} - {{#each @model.errors.attributes_path as |error|}} + {{#each @model.errors.path as |error|}} {{error.message}} {{/each}} @@ -81,8 +81,8 @@ <:body> - {{#if @model.errors.attributes_http_request_body}} + {{#if @model.errors.http_request_body}} - {{#each @model.errors.attributes_http_request_body as |error|}} + {{#each @model.errors.http_request_body as |error|}} {{error.message}} {{/each}} diff --git a/ui/admin/app/components/form/credential-library/index.js b/ui/admin/app/components/form/credential-library/index.js index b46e8d803..3faf5f8d3 100644 --- a/ui/admin/app/components/form/credential-library/index.js +++ b/ui/admin/app/components/form/credential-library/index.js @@ -13,8 +13,8 @@ export default class FormCredentialLibraryIndexComponent extends Component { * Only allow HTTP request body field if http_method is set to POST. * @type {boolean} */ - @computed('args.model.attributes.http_method') + @computed('args.model.http_method') get isHttpRequestBodyAllowed() { - return this.args.model.attributes.http_method?.match(/post/i); + return this.args.model.http_method?.match(/post/i); } } diff --git a/ui/admin/app/components/form/credential-store/index.hbs b/ui/admin/app/components/form/credential-store/index.hbs index 8f8850784..1bf4344a0 100644 --- a/ui/admin/app/components/form/credential-store/index.hbs +++ b/ui/admin/app/components/form/credential-store/index.hbs @@ -55,17 +55,17 @@ - {{#if @model.errors.attributes_address}} + {{#if @model.errors.address}} - {{#each @model.errors.attributes_address as |error|}} + {{#each @model.errors.address as |error|}} {{error.message}} {{/each}} @@ -75,17 +75,17 @@ - {{#if @model.errors.attributes_token}} + {{#if @model.errors.token}} - {{#each @model.errors.attributes_token as |error|}} + {{#each @model.errors.token as |error|}} {{error.message}} {{/each}} @@ -94,7 +94,7 @@ {{#unless @model.isNew}} - {{#if @model.errors.attributes_namespace}} + {{#if @model.errors.namespace}} - {{#each @model.errors.attributes_namespace as |error|}} + {{#each @model.errors.namespace as |error|}} {{error.message}} {{/each}} @@ -124,17 +124,17 @@ - {{#if @model.errors.attributes_tls_server_name}} + {{#if @model.errors.tls_server_name}} - {{#each @model.errors.attributes_tls_server_name as |error|}} + {{#each @model.errors.tls_server_name as |error|}} {{error.message}} {{/each}} @@ -144,17 +144,17 @@ - {{#if @model.errors.attributes_tls_skip_verify}} + {{#if @model.errors.tls_skip_verify}} - {{#each @model.errors.attributes_tls_skip_verify as |error|}} + {{#each @model.errors.tls_skip_verify as |error|}} {{error.message}} {{/each}} @@ -164,17 +164,17 @@ - {{#if @model.errors.attributes_client_certificate}} + {{#if @model.errors.client_certificate}} - {{#each @model.errors.attributes_client_certificate as |error|}} + {{#each @model.errors.client_certificate as |error|}} {{error.message}} {{/each}} @@ -184,9 +184,9 @@ - {{#if @model.errors.attributes_client_certificate_key}} + {{#if @model.errors.client_certificate_key}} - {{#each @model.errors.attributes_client_certificate_key as |error|}} + {{#each @model.errors.client_certificate_key as |error|}} {{error.message}} {{/each}} @@ -205,7 +205,7 @@ {{#unless @model.isNew}} - {{#if @model.errors.attributes_ca_cert}} + {{#if @model.errors.ca_cert}} - {{#each @model.errors.attributes_ca_cert as |error|}} + {{#each @model.errors.ca_cert as |error|}} {{error.message}} {{/each}} diff --git a/ui/admin/tests/acceptance/credential-library/create-test.js b/ui/admin/tests/acceptance/credential-library/create-test.js index 06404a49c..d19c0b2b1 100644 --- a/ui/admin/tests/acceptance/credential-library/create-test.js +++ b/ui/admin/tests/acceptance/credential-library/create-test.js @@ -48,6 +48,7 @@ module('Acceptance | credential-libraries | create', function (hooks) { instances.credentialLibrary = this.server.create('credential-library', { scope: instances.scopes.project, credentialStore: instances.credentialStore, + http_method: 'GET', }); // Generate route URLs for resources urls.globalScope = `/scopes/global/scopes`;