chore: 🤖 add attach and detach storage policy permissions (#2080)

* chore: 🤖 add attach and detach storage policy permissions
This commit is contained in:
Dharini Jeeva authored and GitHub committed 2024-01-09 11:39:28 -08:00
1 parent 3810217ce7
commit 3f178363d9
6 files changed
+145

No files matched your search

+28
View File
@@ -0,0 +1,28 @@
/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: MPL-2.0
*/
import ModelAbility from './model';
/**
* Provides abilities for scopes.
*/
export default class ScopeAbility extends ModelAbility {
// =permissions
/**
* Permission that checks whether a policy can be attached to a scope
* @type {boolean}
*/
get canAttachStoragePolicy() {
return this.hasAuthorizedAction('attach-storage-policy');
}
/**
* Permission that checks whether a policy can be detached to a scope
* @type {boolean}
*/
get canDetachStoragePolicy() {
return this.hasAuthorizedAction('detach-storage-policy');
}
}
+6
View File
@@ -0,0 +1,6 @@
/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: MPL-2.0
*/
export { default } from 'api/abilities/scope';
+2
View File
@@ -17,6 +17,8 @@ export default factory.extend({
'read',
'update',
'delete',
'attach-storage-policy',
'detach-storage-policy',
],
authorized_collection_actions() {
@@ -0,0 +1,40 @@
/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: MPL-2.0
*/
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Abilities | Scope', function (hooks) {
setupTest(hooks);
let canService;
hooks.beforeEach(function () {
canService = this.owner.lookup('service:can');
});
test('it exists', function (assert) {
const ability = this.owner.lookup('ability:scope');
assert.ok(ability);
});
test('it reflects when a given scope may attach a policy in global scope', function (assert) {
const model = {
authorized_actions: ['attach-storage-policy'],
};
assert.true(canService.can('attachStoragePolicy scope', model));
model.authorized_actions = [];
assert.false(canService.can('attachStoragePolicy scope', model));
});
test('it reflects when a given scope may remove a policy in org scope', function (assert) {
const model = {
authorized_actions: ['detach-storage-policy'],
};
assert.true(canService.can('detachStoragePolicy scope', model));
model.authorized_actions = [];
assert.false(canService.can('detachStoragePolicy scope', model));
});
});
+20
View File
@@ -47,4 +47,24 @@ export default class OverrideScopeAbility extends OverrideModelAbility {
return super.canList;
}
}
/**
* Attaching a policy is allowed only if the feature flag is enabled
* @type {boolean}
*/
get canAttachStoragePolicy() {
return this.features.isEnabled('ssh-session-recording')
? this.hasAuthorizedAction('attach-storage-policy')
: false;
}
/**
* Deattaching a policy is allowed only if the feature flag is enabled
* @type {boolean}
*/
get canDetachStoragePolicy() {
return this.features.isEnabled('ssh-session-recording')
? this.hasAuthorizedAction('detach-storage-policy')
: false;
}
}
@@ -0,0 +1,49 @@
/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: MPL-2.0
*/
import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';
module('Unit | Abilities | Scope', function (hooks) {
setupTest(hooks);
let features;
let canService;
let store;
hooks.beforeEach(function () {
store = this.owner.lookup('service:store');
canService = this.owner.lookup('service:can');
features = this.owner.lookup('service:features');
});
test('can attach storage policy when authorized', function (assert) {
features.enable('ssh-session-recording');
const scopeModel = store.createRecord('scope', {
authorized_actions: ['attach-storage-policy'],
});
assert.true(canService.can('attachStoragePolicy scope', scopeModel));
});
test('cannot attach storage policy when unauthorized', function (assert) {
features.enable('ssh-session-recording');
const scopeModel = store.createRecord('scope', {
authorized_actions: [],
});
assert.false(canService.can('attachStoragePolicy scope', scopeModel));
});
test('can detach storage policy when authorized', function (assert) {
features.enable('ssh-session-recording');
const scopeModel = store.createRecord('scope', {
authorized_actions: ['detach-storage-policy'],
});
assert.true(canService.can('detachStoragePolicy scope', scopeModel));
});
});