Skip to content

Commit c911424

Browse files
authored
[FC-0099] feat: add default policy and fix tests (openedx#92)
1 parent 7ad3981 commit c911424

10 files changed

Lines changed: 500 additions & 676 deletions

File tree

CHANGELOG.rst

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,20 @@ Unreleased
1616

1717
*
1818

19+
0.5.0 - 2025-10-21
20+
******************
21+
22+
Added
23+
=====
24+
25+
* Default policy for Content Library roles and permissions.
26+
27+
Fixed
28+
=====
29+
30+
* Add plugin_settings in test settings.
31+
* Update permissions for RoleListView.
32+
1933
0.4.1 - 2025-10-16
2034
******************
2135

openedx_authz/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44

55
import os
66

7-
__version__ = "0.4.1"
7+
__version__ = "0.5.0"
88

99
ROOT_DIRECTORY = os.path.dirname(os.path.abspath(__file__))

openedx_authz/engine/config/authz.policy

Lines changed: 37 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,52 +9,62 @@
99
# For role definitions use: lib^*, course^*, org^* to specify the scope of the role
1010

1111
# Library Admin Role Policies
12-
p, role^library_admin, act^delete_library, lib^*, allow
13-
p, role^library_admin, act^publish_library, lib^*, allow
14-
p, role^library_admin, act^manage_library_team, lib^*, allow
12+
p, role^library_admin, act^view_library, lib^*, allow
1513
p, role^library_admin, act^manage_library_tags, lib^*, allow
16-
p, role^library_admin, act^delete_library_content, lib^*, allow
14+
p, role^library_admin, act^delete_library, lib^*, allow
15+
p, role^library_admin, act^edit_library_content, lib^*, allow
1716
p, role^library_admin, act^publish_library_content, lib^*, allow
18-
p, role^library_admin, act^delete_library_collection, lib^*, allow
19-
p, role^library_admin, act^create_library, lib^*, allow
17+
p, role^library_admin, act^reuse_library_content, lib^*, allow
18+
p, role^library_admin, act^view_library_team, lib^*, allow
19+
p, role^library_admin, act^manage_library_team, lib^*, allow
2020
p, role^library_admin, act^create_library_collection, lib^*, allow
21+
p, role^library_admin, act^edit_library_collection, lib^*, allow
22+
p, role^library_admin, act^delete_library_collection, lib^*, allow
2123

2224
# Library Author Role Policies
23-
p, role^library_author, act^delete_library_content, lib^*, allow
24-
p, role^library_author, act^publish_library_content, lib^*, allow
25-
p, role^library_author, act^edit_library, lib^*, allow
25+
p, role^library_author, act^view_library, lib^*, allow
2626
p, role^library_author, act^manage_library_tags, lib^*, allow
27+
p, role^library_author, act^edit_library_content, lib^*, allow
28+
p, role^library_author, act^publish_library_content, lib^*, allow
29+
p, role^library_author, act^reuse_library_content, lib^*, allow
30+
p, role^library_author, act^view_library_team, lib^*, allow
2731
p, role^library_author, act^create_library_collection, lib^*, allow
2832
p, role^library_author, act^edit_library_collection, lib^*, allow
2933
p, role^library_author, act^delete_library_collection, lib^*, allow
3034

31-
# Library Collaborator Role Policies
32-
p, role^library_collaborator, act^edit_library, lib^*, allow
33-
p, role^library_collaborator, act^delete_library_content, lib^*, allow
34-
p, role^library_collaborator, act^manage_library_tags, lib^*, allow
35-
p, role^library_collaborator, act^create_library_collection, lib^*, allow
36-
p, role^library_collaborator, act^edit_library_collection, lib^*, allow
37-
p, role^library_collaborator, act^delete_library_collection, lib^*, allow
35+
# Library Contributor Role Policies
36+
p, role^library_contributor, act^view_library, lib^*, allow
37+
p, role^library_contributor, act^manage_library_tags, lib^*, allow
38+
p, role^library_contributor, act^edit_library_content, lib^*, allow
39+
p, role^library_contributor, act^reuse_library_content, lib^*, allow
40+
p, role^library_contributor, act^view_library_team, lib^*, allow
41+
p, role^library_contributor, act^create_library_collection, lib^*, allow
42+
p, role^library_contributor, act^edit_library_collection, lib^*, allow
43+
p, role^library_contributor, act^delete_library_collection, lib^*, allow
3844

3945
# Library User Role Policies
4046
p, role^library_user, act^view_library, lib^*, allow
41-
p, role^library_user, act^view_library_team, lib^*, allow
4247
p, role^library_user, act^reuse_library_content, lib^*, allow
48+
p, role^library_user, act^view_library_team, lib^*, allow
4349

4450
# Action Inheritance (g2) - format: g2 = granted_action, implied_action
4551
# Higher-level permissions automatically grant lower-level permissions
4652
# If a user has the granted_action, they also have the implied_action
4753
# Example: g2, act^delete_library, act^view_library means delete permission includes view permission
48-
g2, act^delete_library, act^view_library
49-
g2, act^edit_library, act^view_library
50-
g2, act^create_library, act^view_library
51-
g2, act^publish_library, act^view_library
54+
# Library
55+
g2, act^manage_library_tags, act^edit_library_content
56+
g2, act^delete_library, act^edit_library_content
57+
58+
# Content
59+
g2, act^publish_library_content, act^edit_library_content
60+
g2, act^edit_library_content, act^view_library
61+
g2, act^reuse_library_content, act^view_library
62+
g2, act^publish_library_content, act^view_library
63+
64+
# Team
5265
g2, act^manage_library_team, act^view_library_team
53-
g2, act^manage_library_tags, act^view_library_tags
66+
67+
# Collections
5468
g2, act^delete_library_collection, act^edit_library_collection
55-
g2, act^edit_library_collection, act^view_library_collection
5669
g2, act^create_library_collection, act^edit_library_collection
57-
g2, act^edit_library_content, act^view_library_content
58-
g2, act^delete_library_content, act^edit_library_content
59-
g2, act^publish_library_content, act^view_library_content
60-
g2, act^reuse_library_content, act^view_library_content
70+
g2, act^edit_library_collection, act^view_library

openedx_authz/management/commands/load_policies.py

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import os
1010

1111
import casbin
12+
import click
1213
from django.core.management.base import BaseCommand
1314

1415
from openedx_authz import ROOT_DIRECTORY
@@ -49,6 +50,11 @@ def add_arguments(self, parser) -> None:
4950
default=None,
5051
help="Path to the Casbin model configuration file",
5152
)
53+
parser.add_argument(
54+
"--clear-existing",
55+
action="store_true",
56+
help="Flag to clear existing policies before loading new ones",
57+
)
5258

5359
def handle(self, *args, **options):
5460
"""Execute the policy loading command.
@@ -73,8 +79,21 @@ def handle(self, *args, **options):
7379
ROOT_DIRECTORY, "engine", "config", "model.conf"
7480
)
7581

82+
target_enforcer = AuthzEnforcer.get_enforcer()
83+
84+
if options.get("clear_existing"):
85+
target_enforcer.load_policy()
86+
if click.confirm(click.style('Do you want to delete existing roles? '
87+
'(This will also delete the assignments related to those roles)',
88+
fg='yellow', bold=True), default=False):
89+
self._delete_existing_roles(target_enforcer)
90+
91+
if click.confirm(click.style('Do you want to delete existing permissions inheritance?',
92+
fg='yellow', bold=True), default=False):
93+
self._delete_permissions_inheritance(target_enforcer)
94+
7695
source_enforcer = casbin.Enforcer(model_file_path, policy_file_path)
77-
self.migrate_policies(source_enforcer, AuthzEnforcer.get_enforcer())
96+
self.migrate_policies(source_enforcer, target_enforcer)
7897

7998
def migrate_policies(self, source_enforcer, target_enforcer):
8099
"""Migrate policies from the source enforcer to the target enforcer.
@@ -88,3 +107,27 @@ def migrate_policies(self, source_enforcer, target_enforcer):
88107
target_enforcer: The Casbin enforcer instance to migrate policies to.
89108
"""
90109
migrate_policy_between_enforcers(source_enforcer, target_enforcer)
110+
111+
def _delete_existing_roles(self, target_enforcer):
112+
"""Delete existing roles from the target enforcer.
113+
114+
Args:
115+
target_enforcer: The Casbin enforcer instance to delete roles from.
116+
"""
117+
list_of_roles = target_enforcer.get_all_subjects()
118+
for role in list_of_roles:
119+
result = target_enforcer.delete_role(role)
120+
if result:
121+
click.echo(f"Deleted role: {role}")
122+
123+
def _delete_permissions_inheritance(self, target_enforcer):
124+
"""Delete existing permissions inheritance from the target enforcer.
125+
126+
Args:
127+
target_enforcer: The Casbin enforcer instance to delete permissions inheritance from.
128+
"""
129+
list_of_permissions = target_enforcer.get_named_grouping_policy("g2")
130+
for permission in list(list_of_permissions):
131+
result = target_enforcer.remove_named_grouping_policy("g2", *permission)
132+
if result:
133+
click.echo(f"Deleted permission inheritance: {permission}")

0 commit comments

Comments
 (0)