chore: 🤖 add attach and detach storage policy permissions (#2080)
* chore: 🤖 add attach and detach storage policy permissions
This commit is contained in:
1 parent
3810217ce7
commit
3f178363d9
6 files changed
+145
No files matched your search
@@ -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');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
/**
|
||||
* Copyright (c) HashiCorp, Inc.
|
||||
* SPDX-License-Identifier: MPL-2.0
|
||||
*/
|
||||
|
||||
export { default } from 'api/abilities/scope';
|
||||
@@ -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));
|
||||
});
|
||||
});
|
||||
@@ -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));
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user