diff --git a/addons/api/addon/serializers/credential.js b/addons/api/addon/serializers/credential.js index 8b6ddb419..adedd2522 100644 --- a/addons/api/addon/serializers/credential.js +++ b/addons/api/addon/serializers/credential.js @@ -2,20 +2,41 @@ import ApplicationSerializer from './application'; import { copy } from 'ember-copy'; export default class CredentialSerializer extends ApplicationSerializer { - serialize() { - const serialized = super.serialize(...arguments); - delete serialized['attributes']['password_hmac']; - if (serialized.type === 'username_password') { - delete serialized['attributes']['private_key']; - delete serialized['attributes']['passphrase']; + /** + * @override + * @method serialize + * @param {Snapshot} snapshot + */ + serialize(snapshot) { + switch (snapshot.record.type) { + case 'username_password': + return this.serializeUsernamePassword(...arguments); + case 'ssh_private_key': + default: + return this.serializeSSHPrivateKey(...arguments); } + } + + serializeUsernamePassword() { + const serialized = super.serialize(...arguments); + // Remove non-username_password type attributes + delete serialized['attributes']['private_key']; + delete serialized['attributes']['passphrase']; + return serialized; + } + + serializeSSHPrivateKey() { + const serialized = super.serialize(...arguments); + // Remove non-ssh_private_key type attributes + delete serialized['attributes']['password']; return serialized; } normalize(typeClass, hash, ...rest) { const normalizedHash = copy(hash, true); const normalized = super.normalize(typeClass, normalizedHash, ...rest); - normalized['data']['attributes']['password'] = ''; + // Remove passphrase as we don't track it after being created/updated + delete normalized['data']['attributes']['passphrase']; return normalized; } } diff --git a/addons/api/tests/unit/serializers/credential-test.js b/addons/api/tests/unit/serializers/credential-test.js index 92c29913b..7daf66aeb 100644 --- a/addons/api/tests/unit/serializers/credential-test.js +++ b/addons/api/tests/unit/serializers/credential-test.js @@ -4,17 +4,18 @@ import { setupTest } from 'ember-qunit'; module('Unit | Serializer | credential', function (hooks) { setupTest(hooks); - test('it serializes correctly on create', function (assert) { + test('it serializes username_password type correctly on create', function (assert) { assert.expect(1); const store = this.owner.lookup('service:store'); const serializer = store.serializerFor('credential'); const record = store.createRecord('credential', { password: 'pass', username: 'user', - credential_store_id: 'cs_i7p1eu0Nw8', + credential_store_id: 'csst_i7p1eu0Nw8', type: 'username_password', name: 'Name', description: 'Description', + version: 1, }); const snapshot = record._createSnapshot(); const serializedRecord = serializer.serialize(snapshot); @@ -24,25 +25,57 @@ module('Unit | Serializer | credential', function (hooks) { password: 'pass', username: 'user', }, - credential_store_id: 'cs_i7p1eu0Nw8', + credential_store_id: 'csst_i7p1eu0Nw8', type: 'username_password', name: 'Name', description: 'Description', + version: 1, }); }); - test('it normalizes credential record', async function (assert) { + test('it serializes ssh_private_key type correctly on create', function (assert) { + assert.expect(1); + const store = this.owner.lookup('service:store'); + const serializer = store.serializerFor('credential'); + const record = store.createRecord('credential', { + passphrase: 'passphrasesaresosecure', + private_key: 'superPriveKey', + username: 'user', + credential_store_id: 'csst_i7p1eu0Nw8', + type: 'ssh_private_key', + name: 'Name', + description: 'Description', + version: 1, + }); + const snapshot = record._createSnapshot(); + const serializedRecord = serializer.serialize(snapshot); + + assert.deepEqual(serializedRecord, { + attributes: { + passphrase: 'passphrasesaresosecure', + private_key: 'superPriveKey', + username: 'user', + }, + credential_store_id: 'csst_i7p1eu0Nw8', + type: 'ssh_private_key', + name: 'Name', + description: 'Description', + version: 1, + }); + }); + + test('it normalizes "username_password" type credential record', async function (assert) { assert.expect(1); const store = this.owner.lookup('service:store'); const serializer = store.serializerFor('credential'); const credentialModelClass = store.createRecord('credential').constructor; const payload = { - id: 'cred_123', + id: 'credup_123', version: 1, type: 'username_password', attributes: { username: 'username', - password: '12345678', + password_hmac: 'completenonsense', }, }; const normalized = serializer.normalize(credentialModelClass, payload); @@ -50,14 +83,44 @@ module('Unit | Serializer | credential', function (hooks) { assert.deepEqual(normalized, { data: { attributes: { - password: '', type: 'username_password', username: 'username', version: 1, }, - id: 'cred_123', - relationships: {}, type: 'credential', + id: 'credup_123', + relationships: {}, + }, + }); + }); + + test('it normalizes "ssh_private_key" type credential record', async function (assert) { + assert.expect(1); + const store = this.owner.lookup('service:store'); + const serializer = store.serializerFor('credential'); + const credentialModelClass = store.createRecord('credential').constructor; + const payload = { + id: 'credspk_123', + version: 1, + type: 'ssh_private_key', + attributes: { + username: 'username', + passphrase: 'random', + private_key_hmac: 'completenonsense', + }, + }; + const normalized = serializer.normalize(credentialModelClass, payload); + + assert.deepEqual(normalized, { + data: { + attributes: { + type: 'ssh_private_key', + username: 'username', + version: 1, + }, + type: 'credential', + id: 'credspk_123', + relationships: {}, }, }); });