Skip to content

Commit b33e2a3

Browse files
committed
feat: load policy in role and permissions views
1 parent ee25f8a commit b33e2a3

1 file changed

Lines changed: 24 additions & 11 deletions

File tree

openedx_authz/rest_api/v1/views.py

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
from rest_framework.views import APIView
1616

1717
from openedx_authz import api
18+
from openedx_authz.api.data import ScopeData
19+
from openedx_authz.engine.enforcer import AuthzEnforcer
20+
from openedx_authz.engine.filter import Filter
1821
from openedx_authz.rest_api.data import RoleOperationError, RoleOperationStatus
1922
from openedx_authz.rest_api.decorators import authz_permissions, view_auth_classes
2023
from openedx_authz.rest_api.utils import (
@@ -103,13 +106,16 @@ def post(self, request: HttpRequest) -> Response:
103106
"""Validate one or more permissions for the authenticated user."""
104107
serializer = PermissionValidationSerializer(data=request.data, many=True)
105108
serializer.is_valid(raise_exception=True)
109+
data = serializer.validated_data
110+
111+
AuthzEnforcer.get_enforcer().load_policy()
106112

107113
username = request.user.username
108114
response_data = []
109-
for perm in serializer.validated_data:
115+
for permission in data:
110116
try:
111-
action = perm["action"]
112-
scope = perm["scope"]
117+
action = permission["action"]
118+
scope = permission["scope"]
113119
allowed = api.is_user_allowed(username, action, scope)
114120
response_data.append({"action": action, "scope": scope, "allowed": allowed})
115121
except ValueError as e:
@@ -257,6 +263,9 @@ def get(self, request: HttpRequest) -> Response:
257263
serializer.is_valid(raise_exception=True)
258264
query_params = serializer.validated_data
259265

266+
flt = Filter(v2=[ScopeData(external_key=query_params["scope"]).namespaced_key])
267+
AuthzEnforcer.get_enforcer().load_filtered_policy(flt)
268+
260269
user_role_assignments = api.get_all_user_role_assignments_in_scope(query_params["scope"])
261270
usernames = {assignment.subject.username for assignment in user_role_assignments}
262271
context = {"user_map": get_user_map(usernames)}
@@ -282,15 +291,16 @@ def put(self, request: HttpRequest) -> Response:
282291
"""Assign multiple users to a specific role within a scope."""
283292
serializer = AddUsersToRoleWithScopeSerializer(data=request.data)
284293
serializer.is_valid(raise_exception=True)
294+
data = serializer.validated_data
295+
296+
AuthzEnforcer.get_enforcer().load_policy()
285297

286-
role = serializer.validated_data["role"]
287-
scope = serializer.validated_data["scope"]
288298
completed, errors = [], []
289-
for user_identifier in serializer.validated_data["users"]:
299+
for user_identifier in data["users"]:
290300
response_dict = {"user_identifier": user_identifier}
291301
try:
292302
user = get_user_by_username_or_email(user_identifier)
293-
result = api.assign_role_to_user_in_scope(user.username, role, scope)
303+
result = api.assign_role_to_user_in_scope(user.username, data["role"], data["scope"])
294304
if result:
295305
response_dict["status"] = RoleOperationStatus.ROLE_ADDED
296306
completed.append(response_dict)
@@ -327,17 +337,18 @@ def put(self, request: HttpRequest) -> Response:
327337
@authz_permissions(["manage_library_team"])
328338
def delete(self, request: HttpRequest) -> Response:
329339
"""Remove multiple users from a specific role within a scope."""
340+
AuthzEnforcer.get_enforcer().load_policy()
341+
330342
serializer = RemoveUsersFromRoleWithScopeSerializer(data=request.query_params)
331343
serializer.is_valid(raise_exception=True)
344+
data = serializer.validated_data
332345

333-
role = serializer.validated_data["role"]
334-
scope = serializer.validated_data["scope"]
335346
completed, errors = [], []
336-
for user_identifier in serializer.validated_data["users"]:
347+
for user_identifier in data["users"]:
337348
response_dict = {"user_identifier": user_identifier}
338349
try:
339350
user = get_user_by_username_or_email(user_identifier)
340-
result = api.unassign_role_from_user(user.username, role, scope)
351+
result = api.unassign_role_from_user(user.username, data["role"], data["scope"])
341352
if result:
342353
response_dict["status"] = RoleOperationStatus.ROLE_REMOVED
343354
completed.append(response_dict)
@@ -434,6 +445,8 @@ def get(self, request: HttpRequest) -> Response:
434445
serializer.is_valid(raise_exception=True)
435446
query_params = serializer.validated_data
436447

448+
AuthzEnforcer.get_enforcer().load_policy()
449+
437450
generic_scope = get_generic_scope(query_params["scope"])
438451
roles = api.get_role_definitions_in_scope(generic_scope)
439452
response_data = []

0 commit comments

Comments
 (0)