Skip to content

Commit 0d31ddf

Browse files
committed
fix(rbac): expand scope definition for missing endpoints
1 parent 7436e7e commit 0d31ddf

File tree

5 files changed

+29
-20
lines changed

5 files changed

+29
-20
lines changed

tracecat/agent/router.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
)
1111
from tracecat.agent.service import AgentManagementService
1212
from tracecat.auth.credentials import RoleACL
13-
from tracecat.auth.types import AccessLevel, Role
13+
from tracecat.auth.types import Role
1414
from tracecat.authz.controls import require_scope
1515
from tracecat.db.dependencies import AsyncDBSession
1616
from tracecat.exceptions import TracecatNotFoundError
@@ -23,7 +23,6 @@
2323
allow_user=True,
2424
allow_service=False,
2525
require_workspace="no",
26-
min_access_level=AccessLevel.ADMIN,
2726
),
2827
]
2928

tracecat/authz/scopes.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@
105105
# Org settings management
106106
"org:settings:read",
107107
"org:settings:manage",
108+
# Registry management (org-level custom actions)
109+
"org:registry:read",
110+
"org:registry:manage",
108111
# Full workspace control across the org
109112
"workspace:read",
110113
"workspace:create",
@@ -149,6 +152,11 @@
149152
"secret:create",
150153
"secret:update",
151154
"secret:delete",
155+
# Organization secrets (org-scoped, not workspace-scoped)
156+
"org:secret:read",
157+
"org:secret:create",
158+
"org:secret:update",
159+
"org:secret:delete",
152160
# Full action execution
153161
"action:*:execute",
154162
}
@@ -172,6 +180,9 @@
172180
# Org settings management
173181
"org:settings:read",
174182
"org:settings:manage",
183+
# Registry management (org-level custom actions)
184+
"org:registry:read",
185+
"org:registry:manage",
175186
# Full workspace control across the org
176187
"workspace:read",
177188
"workspace:create",
@@ -216,6 +227,11 @@
216227
"secret:create",
217228
"secret:update",
218229
"secret:delete",
230+
# Organization secrets (org-scoped, not workspace-scoped)
231+
"org:secret:read",
232+
"org:secret:create",
233+
"org:secret:update",
234+
"org:secret:delete",
219235
# Full action execution
220236
"action:*:execute",
221237
}

tracecat/registry/actions/router.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from tracecat_registry import RegistrySecret
44

55
from tracecat.auth.credentials import RoleACL
6-
from tracecat.auth.types import AccessLevel, Role
6+
from tracecat.auth.types import Role
77
from tracecat.authz.controls import require_scope
88
from tracecat.db.dependencies import AsyncDBSession
99
from tracecat.exceptions import RegistryError
@@ -21,7 +21,7 @@
2121

2222

2323
@router.get("")
24-
@require_scope("workflow:read")
24+
@require_scope("org:registry:read")
2525
async def list_registry_actions(
2626
*,
2727
role: Role = RoleACL(
@@ -45,7 +45,7 @@ async def list_registry_actions(
4545
response_model=RegistryActionRead,
4646
response_model_exclude_unset=True,
4747
)
48-
@require_scope("workflow:read")
48+
@require_scope("org:registry:read")
4949
async def get_registry_action(
5050
*,
5151
role: Role = RoleACL(
@@ -100,14 +100,13 @@ async def get_registry_action(
100100

101101

102102
@router.post("", status_code=status.HTTP_201_CREATED)
103-
@require_scope("org:settings:manage")
103+
@require_scope("org:registry:manage")
104104
async def create_registry_action(
105105
*,
106106
role: Role = RoleACL(
107107
allow_user=True,
108108
allow_service=False,
109109
require_workspace="no",
110-
min_access_level=AccessLevel.ADMIN,
111110
),
112111
session: AsyncDBSession,
113112
params: RegistryActionCreate,
@@ -130,14 +129,13 @@ async def create_registry_action(
130129

131130

132131
@router.patch("/{action_name}", status_code=status.HTTP_204_NO_CONTENT)
133-
@require_scope("org:settings:manage")
132+
@require_scope("org:registry:manage")
134133
async def update_registry_action(
135134
*,
136135
role: Role = RoleACL(
137136
allow_user=True,
138137
allow_service=False,
139138
require_workspace="no",
140-
min_access_level=AccessLevel.ADMIN,
141139
),
142140
session: AsyncDBSession,
143141
params: RegistryActionUpdate,
@@ -153,14 +151,13 @@ async def update_registry_action(
153151

154152

155153
@router.delete("/{action_name}", status_code=status.HTTP_204_NO_CONTENT)
156-
@require_scope("org:settings:manage")
154+
@require_scope("org:registry:manage")
157155
async def delete_registry_action(
158156
*,
159157
role: Role = RoleACL(
160158
allow_user=True,
161159
allow_service=False,
162160
require_workspace="no",
163-
min_access_level=AccessLevel.ADMIN,
164161
),
165162
session: AsyncDBSession,
166163
action_name: str,

tracecat/secrets/router.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from sqlalchemy.exc import IntegrityError
55

66
from tracecat.auth.credentials import RoleACL
7-
from tracecat.auth.types import AccessLevel, Role
7+
from tracecat.auth.types import Role
88
from tracecat.authz.controls import require_scope
99
from tracecat.authz.enums import WorkspaceRole
1010
from tracecat.db.dependencies import AsyncDBSession
@@ -54,7 +54,6 @@
5454
allow_user=True,
5555
allow_service=False,
5656
require_workspace="no",
57-
min_access_level=AccessLevel.ADMIN,
5857
),
5958
]
6059

@@ -225,7 +224,7 @@ async def delete_secret_by_id(
225224

226225

227226
@org_router.get("")
228-
@require_scope("secret:read")
227+
@require_scope("org:secret:read")
229228
async def list_org_secrets(
230229
*,
231230
role: OrgAdminUser,
@@ -251,7 +250,7 @@ async def list_org_secrets(
251250

252251

253252
@org_router.get("/{secret_name}")
254-
@require_scope("secret:read")
253+
@require_scope("org:secret:read")
255254
async def get_org_secret_by_name(
256255
*,
257256
role: OrgAdminUser,
@@ -272,7 +271,7 @@ async def get_org_secret_by_name(
272271

273272

274273
@org_router.post("", status_code=status.HTTP_201_CREATED)
275-
@require_scope("secret:create")
274+
@require_scope("org:secret:create")
276275
async def create_org_secret(
277276
*,
278277
role: OrgAdminUser,
@@ -299,7 +298,7 @@ async def create_org_secret(
299298
"/{secret_id}",
300299
status_code=status.HTTP_204_NO_CONTENT,
301300
)
302-
@require_scope("secret:update")
301+
@require_scope("org:secret:update")
303302
async def update_org_secret_by_id(
304303
*,
305304
role: OrgAdminUser,
@@ -334,7 +333,7 @@ async def update_org_secret_by_id(
334333
"/{secret_id}",
335334
status_code=status.HTTP_204_NO_CONTENT,
336335
)
337-
@require_scope("secret:delete")
336+
@require_scope("org:secret:delete")
338337
async def delete_org_secret_by_id(
339338
*,
340339
role: OrgAdminUser,

tracecat/settings/router.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from tracecat.auth.credentials import RoleACL
66
from tracecat.auth.dependencies import Role
77
from tracecat.auth.enums import AuthType
8-
from tracecat.auth.types import AccessLevel
98
from tracecat.authz.controls import require_scope
109
from tracecat.config import SAML_PUBLIC_ACS_URL
1110
from tracecat.db.dependencies import AsyncDBSession
@@ -36,7 +35,6 @@
3635
allow_user=True,
3736
allow_service=False,
3837
require_workspace="no",
39-
min_access_level=AccessLevel.ADMIN,
4038
),
4139
]
4240

0 commit comments

Comments
 (0)