diff --git a/addons/api/addon/abilities/target.js b/addons/api/addon/abilities/target.js
index 977266d63..fb6b30d33 100644
--- a/addons/api/addon/abilities/target.js
+++ b/addons/api/addon/abilities/target.js
@@ -13,6 +13,13 @@ export default class TargetAbility extends ModelAbility {
return this.hasAuthorizedAction('authorize-session');
}
+ /**
+ * @type {boolean}
+ */
+ get canAddHostSources() {
+ return this.hasAuthorizedAction('add-host-sources');
+ }
+
/**
* @type {boolean}
*/
@@ -20,6 +27,13 @@ export default class TargetAbility extends ModelAbility {
return this.hasAuthorizedAction('remove-host-sources');
}
+ /**
+ * @type {boolean}
+ */
+ get canAddCredentialSources() {
+ return this.hasAuthorizedAction('add-credential-sources');
+ }
+
/**
* @type {boolean}
*/
diff --git a/addons/api/mirage/factories/target.js b/addons/api/mirage/factories/target.js
index 7f093115d..6056352d7 100644
--- a/addons/api/mirage/factories/target.js
+++ b/addons/api/mirage/factories/target.js
@@ -15,10 +15,8 @@ export default factory.extend({
'delete',
'authorize-session',
'add-host-sources',
- 'set-host-sources',
'remove-host-sources',
'add-credential-sources',
- 'set-credential-sources',
'remove-credential-sources',
],
diff --git a/addons/api/tests/unit/abilities/target-test.js b/addons/api/tests/unit/abilities/target-test.js
index 4fe4dc23d..bbba31cd8 100644
--- a/addons/api/tests/unit/abilities/target-test.js
+++ b/addons/api/tests/unit/abilities/target-test.js
@@ -15,6 +15,17 @@ module('Unit | Abilities | Target', function (hooks) {
assert.notOk(service.can('connect target', model));
});
+ test('it reflects when a given target may add host sources', function (assert) {
+ assert.expect(2);
+ const service = this.owner.lookup('service:can');
+ const model = {
+ authorized_actions: ['add-host-sources'],
+ };
+ assert.ok(service.can('addHostSources target', model));
+ model.authorized_actions = [];
+ assert.notOk(service.can('addHostSources target', model));
+ });
+
test('it reflects when a given target may remove host sources', function (assert) {
assert.expect(2);
const service = this.owner.lookup('service:can');
@@ -26,6 +37,17 @@ module('Unit | Abilities | Target', function (hooks) {
assert.notOk(service.can('removeHostSources target', model));
});
+ test('it reflects when a given target may add crednetial sources', function (assert) {
+ assert.expect(2);
+ const service = this.owner.lookup('service:can');
+ const model = {
+ authorized_actions: ['add-credential-sources'],
+ };
+ assert.ok(service.can('addCredentialSources target', model));
+ model.authorized_actions = [];
+ assert.notOk(service.can('addCredentialSources target', model));
+ });
+
test('it reflects when a given target may remove crednetial sources', function (assert) {
assert.expect(2);
const service = this.owner.lookup('service:can');
diff --git a/ui/admin/app/templates/scopes/scope/targets/target/-actions.hbs b/ui/admin/app/templates/scopes/scope/targets/target/-actions.hbs
index 3e32c0848..064bdff34 100644
--- a/ui/admin/app/templates/scopes/scope/targets/target/-actions.hbs
+++ b/ui/admin/app/templates/scopes/scope/targets/target/-actions.hbs
@@ -3,14 +3,20 @@
@dropdownRight={{true}}
as |dropdown|
>
-
- {{t 'resources.target.actions.add-host-sources'}}
-
- {{#if (feature-flag 'credential-store')}}
-
- {{t 'resources.target.actions.add-credential-sources'}}
+ {{#if (can 'addHostSources target' @model)}}
+
+ {{t 'resources.target.actions.add-host-sources'}}
{{/if}}
+ {{#if (feature-flag 'credential-store')}}
+ {{#if (can 'addCredentialSources target' @model)}}
+
+ {{t 'resources.target.actions.add-credential-sources'}}
+
+ {{/if}}
+ {{/if}}
{{#if (can 'delete model' @model)}}
item !== 'add-credential-sources'
+ );
+ await visit(urls.credentialSources);
+ assert.notOk(find(`[href="${urls.addCredentialSources}"]`));
+ });
+
test('can select and cancel credential sources to add', async function (assert) {
assert.expect(4);
instances.target.update({ credentialLibraries: [] });
diff --git a/ui/admin/tests/acceptance/targets/host-sources-test.js b/ui/admin/tests/acceptance/targets/host-sources-test.js
index 93a6b166e..a1abc9e72 100644
--- a/ui/admin/tests/acceptance/targets/host-sources-test.js
+++ b/ui/admin/tests/acceptance/targets/host-sources-test.js
@@ -131,6 +131,16 @@ module('Acceptance | targets | host-sources', function (hooks) {
assert.equal(findAll('tbody tr').length, 1);
});
+ test('cannot add host sources without proper authorization', async function (assert) {
+ assert.expect(1);
+ instances.target.authorized_actions =
+ instances.target.authorized_actions.filter(
+ (item) => item !== 'add-host-sources'
+ );
+ await visit(urls.targetHostSources);
+ assert.notOk(find(`[href="${urls.addHostSources}"]`));
+ });
+
test('select and cancel host sets to add', async function (assert) {
assert.expect(4);
const targetHostSetCount = instances.target.hostSets.length;