Skip to content

Commit 720380a

Browse files
committed
Fix corner case for remote object
1 parent 7161a4d commit 720380a

File tree

2 files changed

+19
-4
lines changed

2 files changed

+19
-4
lines changed

ansible_base/rbac/api/views.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
from ..models import DABContentType, DABPermission, get_evaluation_model
3434
from ..remote import RemoteObject, get_resource_prefix
35+
from ..policies import check_content_obj_permission
3536

3637

3738
def list_combine_values(data: dict[Type[Model], list[str]]) -> list[str]:
@@ -242,8 +243,11 @@ def get_data_from_url(self):
242243
else:
243244
self.related_object = model_cls(content_type=self.content_type, object_id=object_id)
244245

245-
if not self.request.user.has_obj_perm(self.related_object, 'view'):
246-
raise NotFound
246+
try:
247+
if not self.request.user.has_obj_perm(self.related_object, 'view'):
248+
raise NotFound
249+
except RuntimeError:
250+
check_content_obj_permission(self.request.user, self.related_object)
247251

248252
return (self.permission, self.content_type, self.related_object)
249253

ansible_base/rbac/policies.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@
77

88
from ansible_base.lib.utils.settings import get_setting
99
from ansible_base.rbac.evaluations import has_super_permission
10-
from ansible_base.rbac.models import ObjectRole
10+
from ansible_base.rbac.models import ObjectRole, DABPermission
1111
from ansible_base.rbac.permission_registry import permission_registry
1212
from ansible_base.rbac.validators import permissions_allowed_for_role
13+
from ansible_base.rbac.remote import RemoteObject
1314

1415

1516
def visible_users(request_user, queryset=None, always_show_superusers=True, always_show_self=True) -> QuerySet:
@@ -78,7 +79,17 @@ def check_content_obj_permission(request_user, obj) -> None:
7879
on objects, so we firstly look to a simple matter of having change permission
7980
If that is not available, then we check all object-level permissions.
8081
"""
81-
if 'change' in obj._meta.default_permissions:
82+
if isinstance(obj, RemoteObject):
83+
permissions = DABPermission.objects.filter(content_type=obj.content_type)
84+
for permission in permissions:
85+
if permission.codename.startswith('change'):
86+
if not request_user.has_obj_perm(obj, 'change'):
87+
raise PermissionDenied
88+
return
89+
for permission in permissions:
90+
if not request_user.has_obj_perm(obj, permission.codename):
91+
raise PermissionDenied
92+
elif 'change' in obj._meta.default_permissions:
8293
# Model has no change permission, so user must have all permissions for the applicable model
8394
if not request_user.has_obj_perm(obj, 'change'):
8495
raise PermissionDenied

0 commit comments

Comments
 (0)