permission-node: rename and adjust policy return type to reduce nesting

Signed-off-by: MT Lewis <mtlewis@users.noreply.github.com>
This commit is contained in:
MT Lewis
2021-11-30 14:48:56 +00:00
parent 0d568fb4f1
commit e7851efa9e
8 changed files with 49 additions and 49 deletions
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/plugin-permission-node': minor
'@backstage/plugin-permission-backend': patch
---
Rename and adjust permission policy return type to reduce nesting
@@ -161,12 +161,10 @@ describe('createRouter', () => {
beforeEach(() => {
policy.handle.mockReturnValueOnce({
result: AuthorizeResult.CONDITIONAL,
pluginId: 'test-plugin',
resourceType: 'test-resource-1',
conditions: {
pluginId: 'test-plugin',
resourceType: 'test-resource-1',
conditions: {
anyOf: [{ rule: 'test-rule', params: ['abc'] }],
},
anyOf: [{ rule: 'test-rule', params: ['abc'] }],
},
});
});
@@ -265,11 +263,9 @@ describe('createRouter', () => {
it('returns a 500 error if the policy returns a different resourceType', async () => {
policy.handle.mockReturnValueOnce({
result: AuthorizeResult.CONDITIONAL,
conditions: {
pluginId: 'test-plugin',
resourceType: 'test-resource-2',
conditions: {},
},
pluginId: 'test-plugin',
resourceType: 'test-resource-2',
conditions: {},
});
const response = await request(app)
@@ -80,7 +80,7 @@ const handleRequest = async (
if (response.result === AuthorizeResult.CONDITIONAL) {
// Sanity check that any resource provided matches the one expected by the permission
if (request.permission.resourceType !== response.conditions.resourceType) {
if (request.permission.resourceType !== response.resourceType) {
throw new Error(
`Invalid resource conditions returned from permission policy for permission ${request.permission.name}`,
);
@@ -92,7 +92,9 @@ const handleRequest = async (
...(await permissionIntegrationClient.applyConditions(
{
resourceRef,
...response.conditions,
pluginId: response.pluginId,
resourceType: response.resourceType,
conditions: response.conditions,
},
authHeader,
)),
@@ -102,10 +104,7 @@ const handleRequest = async (
return {
id,
result: AuthorizeResult.CONDITIONAL,
// TODO(mtlewis): this .conditions.conditions situation is a bit awkward. I think it's
// worth exploring a bit of reorganization of the ConditionalPolicyResult type so that
// the naming of property chains like this makes a bit more sense.
conditions: response.conditions.conditions,
conditions: response.conditions,
};
}
+10 -14
View File
@@ -32,13 +32,11 @@ export type Condition<TRule> = TRule extends PermissionRule<
: never;
// @public
export type ConditionalPolicyResult = {
export type ConditionalPolicyDecision = {
result: AuthorizeResult.CONDITIONAL;
conditions: {
pluginId: string;
resourceType: string;
conditions: PermissionCriteria<PermissionCondition>;
};
pluginId: string;
resourceType: string;
conditions: PermissionCriteria<PermissionCondition>;
};
// @public
@@ -63,11 +61,9 @@ export const createConditionExports: <
rules: TRules;
}) => {
conditions: Conditions<TRules>;
createConditions: (conditions: PermissionCriteria<PermissionCondition>) => {
pluginId: string;
resourceType: string;
conditions: PermissionCriteria<PermissionCondition>;
};
createPolicyDecision: (
conditions: PermissionCriteria<PermissionCondition>,
) => ConditionalPolicyDecision;
};
// @public
@@ -103,7 +99,7 @@ export interface PermissionPolicy {
handle(
request: PolicyAuthorizeRequest,
user?: BackstageIdentity,
): Promise<PolicyResult>;
): Promise<PolicyDecision>;
}
// @public
@@ -122,9 +118,9 @@ export type PermissionRule<
export type PolicyAuthorizeRequest = Omit<AuthorizeRequest, 'resourceRef'>;
// @public
export type PolicyResult =
export type PolicyDecision =
| {
result: AuthorizeResult.ALLOW | AuthorizeResult.DENY;
}
| ConditionalPolicyResult;
| ConditionalPolicyDecision;
```
@@ -14,6 +14,7 @@
* limitations under the License.
*/
import { AuthorizeResult } from '@backstage/plugin-permission-common';
import { createConditionExports } from './createConditionExports';
const testIntegration = () =>
@@ -63,11 +64,14 @@ describe('createConditionExports', () => {
describe('createConditions', () => {
it('wraps conditions in an object with resourceType and pluginId', () => {
const { createConditions } = testIntegration();
const { createPolicyDecision } = testIntegration();
expect(
createConditions({ allOf: [{ rule: 'testRule1', params: ['a', 1] }] }),
createPolicyDecision({
allOf: [{ rule: 'testRule1', params: ['a', 1] }],
}),
).toEqual({
result: AuthorizeResult.CONDITIONAL,
pluginId: 'test-plugin',
resourceType: 'test-resource',
conditions: {
@@ -15,9 +15,11 @@
*/
import {
AuthorizeResult,
PermissionCondition,
PermissionCriteria,
} from '@backstage/plugin-permission-common';
import { ConditionalPolicyDecision } from '../policy';
import { PermissionRule } from '../types';
import { createConditionFactory } from './createConditionFactory';
@@ -73,11 +75,9 @@ export const createConditionExports = <
rules: TRules;
}): {
conditions: Conditions<TRules>;
createConditions: (conditions: PermissionCriteria<PermissionCondition>) => {
pluginId: string;
resourceType: string;
conditions: PermissionCriteria<PermissionCondition>;
};
createPolicyDecision: (
conditions: PermissionCriteria<PermissionCondition>,
) => ConditionalPolicyDecision;
} => {
const { pluginId, resourceType, rules } = options;
@@ -89,9 +89,10 @@ export const createConditionExports = <
}),
{} as Conditions<TRules>,
),
createConditions: (
createPolicyDecision: (
conditions: PermissionCriteria<PermissionCondition>,
) => ({
result: AuthorizeResult.CONDITIONAL,
pluginId,
resourceType,
conditions,
+2 -2
View File
@@ -15,8 +15,8 @@
*/
export type {
ConditionalPolicyResult,
ConditionalPolicyDecision,
PermissionPolicy,
PolicyAuthorizeRequest,
PolicyResult,
PolicyDecision,
} from './types';
+7 -9
View File
@@ -48,13 +48,11 @@ export type PolicyAuthorizeRequest = Omit<AuthorizeRequest, 'resourceRef'>;
* identifiers needed to evaluate the returned conditions.
* @public
*/
export type ConditionalPolicyResult = {
export type ConditionalPolicyDecision = {
result: AuthorizeResult.CONDITIONAL;
conditions: {
pluginId: string;
resourceType: string;
conditions: PermissionCriteria<PermissionCondition>;
};
pluginId: string;
resourceType: string;
conditions: PermissionCriteria<PermissionCondition>;
};
/**
@@ -62,9 +60,9 @@ export type ConditionalPolicyResult = {
*
* @public
*/
export type PolicyResult =
export type PolicyDecision =
| { result: AuthorizeResult.ALLOW | AuthorizeResult.DENY }
| ConditionalPolicyResult;
| ConditionalPolicyDecision;
/**
* A policy to evaluate authorization requests for any permissioned action performed in Backstage.
@@ -86,5 +84,5 @@ export interface PermissionPolicy {
handle(
request: PolicyAuthorizeRequest,
user?: BackstageIdentity,
): Promise<PolicyResult>;
): Promise<PolicyDecision>;
}