@contractspec/lib.identity-rbac 1.57.0 → 1.58.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/contracts/index.js +1045 -0
- package/dist/browser/contracts/organization.js +655 -0
- package/dist/browser/contracts/rbac.js +599 -0
- package/dist/browser/contracts/user.js +235 -0
- package/dist/browser/entities/index.js +464 -0
- package/dist/browser/entities/organization.js +150 -0
- package/dist/browser/entities/rbac.js +124 -0
- package/dist/browser/entities/user.js +168 -0
- package/dist/browser/events.js +374 -0
- package/dist/browser/identity-rbac.capability.js +28 -0
- package/dist/browser/identity-rbac.feature.js +67 -0
- package/dist/browser/index.js +2099 -0
- package/dist/browser/policies/engine.js +154 -0
- package/dist/browser/policies/index.js +154 -0
- package/dist/contracts/index.d.ts +4 -4
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +1045 -4
- package/dist/contracts/organization.d.ts +758 -764
- package/dist/contracts/organization.d.ts.map +1 -1
- package/dist/contracts/organization.js +653 -602
- package/dist/contracts/rbac.d.ts +517 -523
- package/dist/contracts/rbac.d.ts.map +1 -1
- package/dist/contracts/rbac.js +597 -481
- package/dist/contracts/user.d.ts +513 -519
- package/dist/contracts/user.d.ts.map +1 -1
- package/dist/contracts/user.js +222 -319
- package/dist/entities/index.d.ts +164 -169
- package/dist/entities/index.d.ts.map +1 -1
- package/dist/entities/index.js +462 -33
- package/dist/entities/organization.d.ts +58 -63
- package/dist/entities/organization.d.ts.map +1 -1
- package/dist/entities/organization.js +145 -145
- package/dist/entities/rbac.d.ts +62 -67
- package/dist/entities/rbac.d.ts.map +1 -1
- package/dist/entities/rbac.js +119 -132
- package/dist/entities/user.d.ts +66 -71
- package/dist/entities/user.d.ts.map +1 -1
- package/dist/entities/user.js +164 -189
- package/dist/events.d.ts +537 -543
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +343 -651
- package/dist/identity-rbac.capability.d.ts +2 -7
- package/dist/identity-rbac.capability.d.ts.map +1 -1
- package/dist/identity-rbac.capability.js +29 -29
- package/dist/identity-rbac.feature.d.ts +1 -6
- package/dist/identity-rbac.feature.d.ts.map +1 -1
- package/dist/identity-rbac.feature.js +66 -193
- package/dist/index.d.ts +6 -12
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2100 -14
- package/dist/node/contracts/index.js +1045 -0
- package/dist/node/contracts/organization.js +655 -0
- package/dist/node/contracts/rbac.js +599 -0
- package/dist/node/contracts/user.js +235 -0
- package/dist/node/entities/index.js +464 -0
- package/dist/node/entities/organization.js +150 -0
- package/dist/node/entities/rbac.js +124 -0
- package/dist/node/entities/user.js +168 -0
- package/dist/node/events.js +374 -0
- package/dist/node/identity-rbac.capability.js +28 -0
- package/dist/node/identity-rbac.feature.js +67 -0
- package/dist/node/index.js +2099 -0
- package/dist/node/policies/engine.js +154 -0
- package/dist/node/policies/index.js +154 -0
- package/dist/policies/engine.d.ts +98 -101
- package/dist/policies/engine.d.ts.map +1 -1
- package/dist/policies/engine.js +151 -164
- package/dist/policies/index.d.ts +2 -2
- package/dist/policies/index.d.ts.map +1 -0
- package/dist/policies/index.js +154 -2
- package/package.json +149 -40
- package/dist/contracts/organization.js.map +0 -1
- package/dist/contracts/rbac.js.map +0 -1
- package/dist/contracts/user.js.map +0 -1
- package/dist/entities/index.js.map +0 -1
- package/dist/entities/organization.js.map +0 -1
- package/dist/entities/rbac.js.map +0 -1
- package/dist/entities/user.js.map +0 -1
- package/dist/events.js.map +0 -1
- package/dist/identity-rbac.capability.js.map +0 -1
- package/dist/identity-rbac.feature.js.map +0 -1
- package/dist/policies/engine.js.map +0 -1
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
// src/policies/engine.ts
|
|
2
|
+
var Permission = {
|
|
3
|
+
USER_CREATE: "user.create",
|
|
4
|
+
USER_READ: "user.read",
|
|
5
|
+
USER_UPDATE: "user.update",
|
|
6
|
+
USER_DELETE: "user.delete",
|
|
7
|
+
USER_LIST: "user.list",
|
|
8
|
+
USER_MANAGE: "user.manage",
|
|
9
|
+
ORG_CREATE: "org.create",
|
|
10
|
+
ORG_READ: "org.read",
|
|
11
|
+
ORG_UPDATE: "org.update",
|
|
12
|
+
ORG_DELETE: "org.delete",
|
|
13
|
+
ORG_LIST: "org.list",
|
|
14
|
+
MEMBER_INVITE: "member.invite",
|
|
15
|
+
MEMBER_REMOVE: "member.remove",
|
|
16
|
+
MEMBER_UPDATE_ROLE: "member.update_role",
|
|
17
|
+
MEMBER_LIST: "member.list",
|
|
18
|
+
MANAGE_MEMBERS: "org.manage_members",
|
|
19
|
+
TEAM_CREATE: "team.create",
|
|
20
|
+
TEAM_UPDATE: "team.update",
|
|
21
|
+
TEAM_DELETE: "team.delete",
|
|
22
|
+
TEAM_MANAGE: "team.manage",
|
|
23
|
+
ROLE_CREATE: "role.create",
|
|
24
|
+
ROLE_UPDATE: "role.update",
|
|
25
|
+
ROLE_DELETE: "role.delete",
|
|
26
|
+
ROLE_ASSIGN: "role.assign",
|
|
27
|
+
ROLE_REVOKE: "role.revoke",
|
|
28
|
+
BILLING_VIEW: "billing.view",
|
|
29
|
+
BILLING_MANAGE: "billing.manage",
|
|
30
|
+
PROJECT_CREATE: "project.create",
|
|
31
|
+
PROJECT_READ: "project.read",
|
|
32
|
+
PROJECT_UPDATE: "project.update",
|
|
33
|
+
PROJECT_DELETE: "project.delete",
|
|
34
|
+
PROJECT_MANAGE: "project.manage",
|
|
35
|
+
ADMIN_ACCESS: "admin.access",
|
|
36
|
+
ADMIN_IMPERSONATE: "admin.impersonate"
|
|
37
|
+
};
|
|
38
|
+
var StandardRole = {
|
|
39
|
+
OWNER: {
|
|
40
|
+
name: "owner",
|
|
41
|
+
description: "Organization owner with full access",
|
|
42
|
+
permissions: Object.values(Permission)
|
|
43
|
+
},
|
|
44
|
+
ADMIN: {
|
|
45
|
+
name: "admin",
|
|
46
|
+
description: "Administrator with most permissions",
|
|
47
|
+
permissions: [
|
|
48
|
+
Permission.USER_READ,
|
|
49
|
+
Permission.USER_LIST,
|
|
50
|
+
Permission.ORG_READ,
|
|
51
|
+
Permission.ORG_UPDATE,
|
|
52
|
+
Permission.MEMBER_INVITE,
|
|
53
|
+
Permission.MEMBER_REMOVE,
|
|
54
|
+
Permission.MEMBER_UPDATE_ROLE,
|
|
55
|
+
Permission.MEMBER_LIST,
|
|
56
|
+
Permission.MANAGE_MEMBERS,
|
|
57
|
+
Permission.TEAM_CREATE,
|
|
58
|
+
Permission.TEAM_UPDATE,
|
|
59
|
+
Permission.TEAM_DELETE,
|
|
60
|
+
Permission.TEAM_MANAGE,
|
|
61
|
+
Permission.PROJECT_CREATE,
|
|
62
|
+
Permission.PROJECT_READ,
|
|
63
|
+
Permission.PROJECT_UPDATE,
|
|
64
|
+
Permission.PROJECT_DELETE,
|
|
65
|
+
Permission.PROJECT_MANAGE,
|
|
66
|
+
Permission.BILLING_VIEW
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
MEMBER: {
|
|
70
|
+
name: "member",
|
|
71
|
+
description: "Regular organization member",
|
|
72
|
+
permissions: [
|
|
73
|
+
Permission.USER_READ,
|
|
74
|
+
Permission.ORG_READ,
|
|
75
|
+
Permission.MEMBER_LIST,
|
|
76
|
+
Permission.PROJECT_READ,
|
|
77
|
+
Permission.PROJECT_CREATE
|
|
78
|
+
]
|
|
79
|
+
},
|
|
80
|
+
VIEWER: {
|
|
81
|
+
name: "viewer",
|
|
82
|
+
description: "Read-only access",
|
|
83
|
+
permissions: [
|
|
84
|
+
Permission.USER_READ,
|
|
85
|
+
Permission.ORG_READ,
|
|
86
|
+
Permission.MEMBER_LIST,
|
|
87
|
+
Permission.PROJECT_READ
|
|
88
|
+
]
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
class RBACPolicyEngine {
|
|
93
|
+
roleCache = new Map;
|
|
94
|
+
bindingCache = new Map;
|
|
95
|
+
async checkPermission(input, bindings) {
|
|
96
|
+
const { userId, orgId, permission } = input;
|
|
97
|
+
const now = new Date;
|
|
98
|
+
const userBindings = bindings.filter((b) => b.targetType === "user" && b.targetId === userId);
|
|
99
|
+
const orgBindings = orgId ? bindings.filter((b) => b.targetType === "organization" && b.targetId === orgId) : [];
|
|
100
|
+
const allBindings = [...userBindings, ...orgBindings];
|
|
101
|
+
const activeBindings = allBindings.filter((b) => !b.expiresAt || b.expiresAt > now);
|
|
102
|
+
if (activeBindings.length === 0) {
|
|
103
|
+
return {
|
|
104
|
+
allowed: false,
|
|
105
|
+
reason: "No active role bindings found"
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
for (const binding of activeBindings) {
|
|
109
|
+
if (binding.role.permissions.includes(permission)) {
|
|
110
|
+
return {
|
|
111
|
+
allowed: true,
|
|
112
|
+
matchedRole: binding.role.name
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
allowed: false,
|
|
118
|
+
reason: `No role grants the "${permission}" permission`
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
async getPermissions(userId, orgId, bindings) {
|
|
122
|
+
const now = new Date;
|
|
123
|
+
const userBindings = bindings.filter((b) => b.targetType === "user" && b.targetId === userId);
|
|
124
|
+
const orgBindings = orgId ? bindings.filter((b) => b.targetType === "organization" && b.targetId === orgId) : [];
|
|
125
|
+
const allBindings = [...userBindings, ...orgBindings];
|
|
126
|
+
const activeBindings = allBindings.filter((b) => !b.expiresAt || b.expiresAt > now);
|
|
127
|
+
const permissions = new Set;
|
|
128
|
+
const roles = [];
|
|
129
|
+
for (const binding of activeBindings) {
|
|
130
|
+
roles.push(binding.role);
|
|
131
|
+
for (const perm of binding.role.permissions) {
|
|
132
|
+
permissions.add(perm);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return { permissions, roles };
|
|
136
|
+
}
|
|
137
|
+
async hasAnyPermission(userId, orgId, permissions, bindings) {
|
|
138
|
+
const { permissions: userPerms } = await this.getPermissions(userId, orgId, bindings);
|
|
139
|
+
return permissions.some((p) => userPerms.has(p));
|
|
140
|
+
}
|
|
141
|
+
async hasAllPermissions(userId, orgId, permissions, bindings) {
|
|
142
|
+
const { permissions: userPerms } = await this.getPermissions(userId, orgId, bindings);
|
|
143
|
+
return permissions.every((p) => userPerms.has(p));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function createRBACEngine() {
|
|
147
|
+
return new RBACPolicyEngine;
|
|
148
|
+
}
|
|
149
|
+
export {
|
|
150
|
+
createRBACEngine,
|
|
151
|
+
StandardRole,
|
|
152
|
+
RBACPolicyEngine,
|
|
153
|
+
Permission
|
|
154
|
+
};
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
// src/policies/engine.ts
|
|
2
|
+
var Permission = {
|
|
3
|
+
USER_CREATE: "user.create",
|
|
4
|
+
USER_READ: "user.read",
|
|
5
|
+
USER_UPDATE: "user.update",
|
|
6
|
+
USER_DELETE: "user.delete",
|
|
7
|
+
USER_LIST: "user.list",
|
|
8
|
+
USER_MANAGE: "user.manage",
|
|
9
|
+
ORG_CREATE: "org.create",
|
|
10
|
+
ORG_READ: "org.read",
|
|
11
|
+
ORG_UPDATE: "org.update",
|
|
12
|
+
ORG_DELETE: "org.delete",
|
|
13
|
+
ORG_LIST: "org.list",
|
|
14
|
+
MEMBER_INVITE: "member.invite",
|
|
15
|
+
MEMBER_REMOVE: "member.remove",
|
|
16
|
+
MEMBER_UPDATE_ROLE: "member.update_role",
|
|
17
|
+
MEMBER_LIST: "member.list",
|
|
18
|
+
MANAGE_MEMBERS: "org.manage_members",
|
|
19
|
+
TEAM_CREATE: "team.create",
|
|
20
|
+
TEAM_UPDATE: "team.update",
|
|
21
|
+
TEAM_DELETE: "team.delete",
|
|
22
|
+
TEAM_MANAGE: "team.manage",
|
|
23
|
+
ROLE_CREATE: "role.create",
|
|
24
|
+
ROLE_UPDATE: "role.update",
|
|
25
|
+
ROLE_DELETE: "role.delete",
|
|
26
|
+
ROLE_ASSIGN: "role.assign",
|
|
27
|
+
ROLE_REVOKE: "role.revoke",
|
|
28
|
+
BILLING_VIEW: "billing.view",
|
|
29
|
+
BILLING_MANAGE: "billing.manage",
|
|
30
|
+
PROJECT_CREATE: "project.create",
|
|
31
|
+
PROJECT_READ: "project.read",
|
|
32
|
+
PROJECT_UPDATE: "project.update",
|
|
33
|
+
PROJECT_DELETE: "project.delete",
|
|
34
|
+
PROJECT_MANAGE: "project.manage",
|
|
35
|
+
ADMIN_ACCESS: "admin.access",
|
|
36
|
+
ADMIN_IMPERSONATE: "admin.impersonate"
|
|
37
|
+
};
|
|
38
|
+
var StandardRole = {
|
|
39
|
+
OWNER: {
|
|
40
|
+
name: "owner",
|
|
41
|
+
description: "Organization owner with full access",
|
|
42
|
+
permissions: Object.values(Permission)
|
|
43
|
+
},
|
|
44
|
+
ADMIN: {
|
|
45
|
+
name: "admin",
|
|
46
|
+
description: "Administrator with most permissions",
|
|
47
|
+
permissions: [
|
|
48
|
+
Permission.USER_READ,
|
|
49
|
+
Permission.USER_LIST,
|
|
50
|
+
Permission.ORG_READ,
|
|
51
|
+
Permission.ORG_UPDATE,
|
|
52
|
+
Permission.MEMBER_INVITE,
|
|
53
|
+
Permission.MEMBER_REMOVE,
|
|
54
|
+
Permission.MEMBER_UPDATE_ROLE,
|
|
55
|
+
Permission.MEMBER_LIST,
|
|
56
|
+
Permission.MANAGE_MEMBERS,
|
|
57
|
+
Permission.TEAM_CREATE,
|
|
58
|
+
Permission.TEAM_UPDATE,
|
|
59
|
+
Permission.TEAM_DELETE,
|
|
60
|
+
Permission.TEAM_MANAGE,
|
|
61
|
+
Permission.PROJECT_CREATE,
|
|
62
|
+
Permission.PROJECT_READ,
|
|
63
|
+
Permission.PROJECT_UPDATE,
|
|
64
|
+
Permission.PROJECT_DELETE,
|
|
65
|
+
Permission.PROJECT_MANAGE,
|
|
66
|
+
Permission.BILLING_VIEW
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
MEMBER: {
|
|
70
|
+
name: "member",
|
|
71
|
+
description: "Regular organization member",
|
|
72
|
+
permissions: [
|
|
73
|
+
Permission.USER_READ,
|
|
74
|
+
Permission.ORG_READ,
|
|
75
|
+
Permission.MEMBER_LIST,
|
|
76
|
+
Permission.PROJECT_READ,
|
|
77
|
+
Permission.PROJECT_CREATE
|
|
78
|
+
]
|
|
79
|
+
},
|
|
80
|
+
VIEWER: {
|
|
81
|
+
name: "viewer",
|
|
82
|
+
description: "Read-only access",
|
|
83
|
+
permissions: [
|
|
84
|
+
Permission.USER_READ,
|
|
85
|
+
Permission.ORG_READ,
|
|
86
|
+
Permission.MEMBER_LIST,
|
|
87
|
+
Permission.PROJECT_READ
|
|
88
|
+
]
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
class RBACPolicyEngine {
|
|
93
|
+
roleCache = new Map;
|
|
94
|
+
bindingCache = new Map;
|
|
95
|
+
async checkPermission(input, bindings) {
|
|
96
|
+
const { userId, orgId, permission } = input;
|
|
97
|
+
const now = new Date;
|
|
98
|
+
const userBindings = bindings.filter((b) => b.targetType === "user" && b.targetId === userId);
|
|
99
|
+
const orgBindings = orgId ? bindings.filter((b) => b.targetType === "organization" && b.targetId === orgId) : [];
|
|
100
|
+
const allBindings = [...userBindings, ...orgBindings];
|
|
101
|
+
const activeBindings = allBindings.filter((b) => !b.expiresAt || b.expiresAt > now);
|
|
102
|
+
if (activeBindings.length === 0) {
|
|
103
|
+
return {
|
|
104
|
+
allowed: false,
|
|
105
|
+
reason: "No active role bindings found"
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
for (const binding of activeBindings) {
|
|
109
|
+
if (binding.role.permissions.includes(permission)) {
|
|
110
|
+
return {
|
|
111
|
+
allowed: true,
|
|
112
|
+
matchedRole: binding.role.name
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
allowed: false,
|
|
118
|
+
reason: `No role grants the "${permission}" permission`
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
async getPermissions(userId, orgId, bindings) {
|
|
122
|
+
const now = new Date;
|
|
123
|
+
const userBindings = bindings.filter((b) => b.targetType === "user" && b.targetId === userId);
|
|
124
|
+
const orgBindings = orgId ? bindings.filter((b) => b.targetType === "organization" && b.targetId === orgId) : [];
|
|
125
|
+
const allBindings = [...userBindings, ...orgBindings];
|
|
126
|
+
const activeBindings = allBindings.filter((b) => !b.expiresAt || b.expiresAt > now);
|
|
127
|
+
const permissions = new Set;
|
|
128
|
+
const roles = [];
|
|
129
|
+
for (const binding of activeBindings) {
|
|
130
|
+
roles.push(binding.role);
|
|
131
|
+
for (const perm of binding.role.permissions) {
|
|
132
|
+
permissions.add(perm);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return { permissions, roles };
|
|
136
|
+
}
|
|
137
|
+
async hasAnyPermission(userId, orgId, permissions, bindings) {
|
|
138
|
+
const { permissions: userPerms } = await this.getPermissions(userId, orgId, bindings);
|
|
139
|
+
return permissions.some((p) => userPerms.has(p));
|
|
140
|
+
}
|
|
141
|
+
async hasAllPermissions(userId, orgId, permissions, bindings) {
|
|
142
|
+
const { permissions: userPerms } = await this.getPermissions(userId, orgId, bindings);
|
|
143
|
+
return permissions.every((p) => userPerms.has(p));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function createRBACEngine() {
|
|
147
|
+
return new RBACPolicyEngine;
|
|
148
|
+
}
|
|
149
|
+
export {
|
|
150
|
+
createRBACEngine,
|
|
151
|
+
StandardRole,
|
|
152
|
+
RBACPolicyEngine,
|
|
153
|
+
Permission
|
|
154
|
+
};
|
|
@@ -1,133 +1,130 @@
|
|
|
1
|
-
//#region src/policies/engine.d.ts
|
|
2
1
|
/**
|
|
3
2
|
* Standard permissions for identity-rbac module.
|
|
4
3
|
*/
|
|
5
|
-
declare const Permission: {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
4
|
+
export declare const Permission: {
|
|
5
|
+
readonly USER_CREATE: "user.create";
|
|
6
|
+
readonly USER_READ: "user.read";
|
|
7
|
+
readonly USER_UPDATE: "user.update";
|
|
8
|
+
readonly USER_DELETE: "user.delete";
|
|
9
|
+
readonly USER_LIST: "user.list";
|
|
10
|
+
readonly USER_MANAGE: "user.manage";
|
|
11
|
+
readonly ORG_CREATE: "org.create";
|
|
12
|
+
readonly ORG_READ: "org.read";
|
|
13
|
+
readonly ORG_UPDATE: "org.update";
|
|
14
|
+
readonly ORG_DELETE: "org.delete";
|
|
15
|
+
readonly ORG_LIST: "org.list";
|
|
16
|
+
readonly MEMBER_INVITE: "member.invite";
|
|
17
|
+
readonly MEMBER_REMOVE: "member.remove";
|
|
18
|
+
readonly MEMBER_UPDATE_ROLE: "member.update_role";
|
|
19
|
+
readonly MEMBER_LIST: "member.list";
|
|
20
|
+
readonly MANAGE_MEMBERS: "org.manage_members";
|
|
21
|
+
readonly TEAM_CREATE: "team.create";
|
|
22
|
+
readonly TEAM_UPDATE: "team.update";
|
|
23
|
+
readonly TEAM_DELETE: "team.delete";
|
|
24
|
+
readonly TEAM_MANAGE: "team.manage";
|
|
25
|
+
readonly ROLE_CREATE: "role.create";
|
|
26
|
+
readonly ROLE_UPDATE: "role.update";
|
|
27
|
+
readonly ROLE_DELETE: "role.delete";
|
|
28
|
+
readonly ROLE_ASSIGN: "role.assign";
|
|
29
|
+
readonly ROLE_REVOKE: "role.revoke";
|
|
30
|
+
readonly BILLING_VIEW: "billing.view";
|
|
31
|
+
readonly BILLING_MANAGE: "billing.manage";
|
|
32
|
+
readonly PROJECT_CREATE: "project.create";
|
|
33
|
+
readonly PROJECT_READ: "project.read";
|
|
34
|
+
readonly PROJECT_UPDATE: "project.update";
|
|
35
|
+
readonly PROJECT_DELETE: "project.delete";
|
|
36
|
+
readonly PROJECT_MANAGE: "project.manage";
|
|
37
|
+
readonly ADMIN_ACCESS: "admin.access";
|
|
38
|
+
readonly ADMIN_IMPERSONATE: "admin.impersonate";
|
|
40
39
|
};
|
|
41
|
-
type PermissionKey = (typeof Permission)[keyof typeof Permission];
|
|
40
|
+
export type PermissionKey = (typeof Permission)[keyof typeof Permission];
|
|
42
41
|
/**
|
|
43
42
|
* Standard role definitions.
|
|
44
43
|
*/
|
|
45
|
-
declare const StandardRole: {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
44
|
+
export declare const StandardRole: {
|
|
45
|
+
readonly OWNER: {
|
|
46
|
+
readonly name: "owner";
|
|
47
|
+
readonly description: "Organization owner with full access";
|
|
48
|
+
readonly permissions: ("user.create" | "user.read" | "user.update" | "user.delete" | "user.list" | "user.manage" | "org.create" | "org.read" | "org.update" | "org.delete" | "org.list" | "member.invite" | "member.remove" | "member.update_role" | "member.list" | "org.manage_members" | "team.create" | "team.update" | "team.delete" | "team.manage" | "role.create" | "role.update" | "role.delete" | "role.assign" | "role.revoke" | "billing.view" | "billing.manage" | "project.create" | "project.read" | "project.update" | "project.delete" | "project.manage" | "admin.access" | "admin.impersonate")[];
|
|
49
|
+
};
|
|
50
|
+
readonly ADMIN: {
|
|
51
|
+
readonly name: "admin";
|
|
52
|
+
readonly description: "Administrator with most permissions";
|
|
53
|
+
readonly permissions: readonly ["user.read", "user.list", "org.read", "org.update", "member.invite", "member.remove", "member.update_role", "member.list", "org.manage_members", "team.create", "team.update", "team.delete", "team.manage", "project.create", "project.read", "project.update", "project.delete", "project.manage", "billing.view"];
|
|
54
|
+
};
|
|
55
|
+
readonly MEMBER: {
|
|
56
|
+
readonly name: "member";
|
|
57
|
+
readonly description: "Regular organization member";
|
|
58
|
+
readonly permissions: readonly ["user.read", "org.read", "member.list", "project.read", "project.create"];
|
|
59
|
+
};
|
|
60
|
+
readonly VIEWER: {
|
|
61
|
+
readonly name: "viewer";
|
|
62
|
+
readonly description: "Read-only access";
|
|
63
|
+
readonly permissions: readonly ["user.read", "org.read", "member.list", "project.read"];
|
|
64
|
+
};
|
|
66
65
|
};
|
|
67
66
|
/**
|
|
68
67
|
* Permission check input.
|
|
69
68
|
*/
|
|
70
|
-
interface PermissionCheckInput {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
69
|
+
export interface PermissionCheckInput {
|
|
70
|
+
userId: string;
|
|
71
|
+
orgId?: string;
|
|
72
|
+
permission: PermissionKey | string;
|
|
74
73
|
}
|
|
75
74
|
/**
|
|
76
75
|
* Permission check result.
|
|
77
76
|
*/
|
|
78
|
-
interface PermissionCheckResult {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
77
|
+
export interface PermissionCheckResult {
|
|
78
|
+
allowed: boolean;
|
|
79
|
+
reason?: string;
|
|
80
|
+
matchedRole?: string;
|
|
82
81
|
}
|
|
83
82
|
/**
|
|
84
83
|
* Role with permissions.
|
|
85
84
|
*/
|
|
86
|
-
interface RoleWithPermissions {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
85
|
+
export interface RoleWithPermissions {
|
|
86
|
+
id: string;
|
|
87
|
+
name: string;
|
|
88
|
+
permissions: string[];
|
|
90
89
|
}
|
|
91
90
|
/**
|
|
92
91
|
* Policy binding for permission evaluation.
|
|
93
92
|
*/
|
|
94
|
-
interface PolicyBindingForEval {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
93
|
+
export interface PolicyBindingForEval {
|
|
94
|
+
roleId: string;
|
|
95
|
+
role: RoleWithPermissions;
|
|
96
|
+
targetType: 'user' | 'organization';
|
|
97
|
+
targetId: string;
|
|
98
|
+
expiresAt?: Date | null;
|
|
100
99
|
}
|
|
101
100
|
/**
|
|
102
101
|
* RBAC Policy Engine for permission checks.
|
|
103
102
|
*/
|
|
104
|
-
declare class RBACPolicyEngine {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
103
|
+
export declare class RBACPolicyEngine {
|
|
104
|
+
private roleCache;
|
|
105
|
+
private bindingCache;
|
|
106
|
+
/**
|
|
107
|
+
* Check if a user has a specific permission.
|
|
108
|
+
*/
|
|
109
|
+
checkPermission(input: PermissionCheckInput, bindings: PolicyBindingForEval[]): Promise<PermissionCheckResult>;
|
|
110
|
+
/**
|
|
111
|
+
* Get all permissions for a user in a context.
|
|
112
|
+
*/
|
|
113
|
+
getPermissions(userId: string, orgId: string | undefined, bindings: PolicyBindingForEval[]): Promise<{
|
|
114
|
+
permissions: Set<string>;
|
|
115
|
+
roles: RoleWithPermissions[];
|
|
116
|
+
}>;
|
|
117
|
+
/**
|
|
118
|
+
* Check if user has any of the specified permissions.
|
|
119
|
+
*/
|
|
120
|
+
hasAnyPermission(userId: string, orgId: string | undefined, permissions: string[], bindings: PolicyBindingForEval[]): Promise<boolean>;
|
|
121
|
+
/**
|
|
122
|
+
* Check if user has all of the specified permissions.
|
|
123
|
+
*/
|
|
124
|
+
hasAllPermissions(userId: string, orgId: string | undefined, permissions: string[], bindings: PolicyBindingForEval[]): Promise<boolean>;
|
|
126
125
|
}
|
|
127
126
|
/**
|
|
128
127
|
* Create a new RBAC policy engine instance.
|
|
129
128
|
*/
|
|
130
|
-
declare function createRBACEngine(): RBACPolicyEngine;
|
|
131
|
-
//#endregion
|
|
132
|
-
export { Permission, PermissionCheckInput, PermissionCheckResult, PermissionKey, PolicyBindingForEval, RBACPolicyEngine, RoleWithPermissions, StandardRole, createRBACEngine };
|
|
129
|
+
export declare function createRBACEngine(): RBACPolicyEngine;
|
|
133
130
|
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/policies/engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkDb,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC;AAEzE;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;CAoDf,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,aAAa,GAAG,MAAM,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,mBAAmB,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,cAAc,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACzB;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,YAAY,CAA6C;IAEjE;;OAEG;IACG,eAAe,CACnB,KAAK,EAAE,oBAAoB,EAC3B,QAAQ,EAAE,oBAAoB,EAAE,GAC/B,OAAO,CAAC,qBAAqB,CAAC;IA6CjC;;OAEG;IACG,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,QAAQ,EAAE,oBAAoB,EAAE,GAC/B,OAAO,CAAC;QACT,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACzB,KAAK,EAAE,mBAAmB,EAAE,CAAC;KAC9B,CAAC;IAkCF;;OAEG;IACG,gBAAgB,CACpB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,WAAW,EAAE,MAAM,EAAE,EACrB,QAAQ,EAAE,oBAAoB,EAAE,GAC/B,OAAO,CAAC,OAAO,CAAC;IAUnB;;OAEG;IACG,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,WAAW,EAAE,MAAM,EAAE,EACrB,QAAQ,EAAE,oBAAoB,EAAE,GAC/B,OAAO,CAAC,OAAO,CAAC;CASpB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,gBAAgB,CAEnD"}
|