core: delegated group member management (#9254)
* fix API permissions Signed-off-by: Jens Langhammer <jens@goauthentik.io> * fix group member remove notification label Signed-off-by: Jens Langhammer <jens@goauthentik.io> * consistent naming assign vs grant Signed-off-by: Jens Langhammer <jens@goauthentik.io> * only set table search query when searching is enabled Signed-off-by: Jens Langhammer <jens@goauthentik.io> * fix hidden object permissions Signed-off-by: Jens Langhammer <jens@goauthentik.io> * replace checkmark/cross with fa icons Signed-off-by: Jens Langhammer <jens@goauthentik.io> * update website Signed-off-by: Jens Langhammer <jens@goauthentik.io> * add tests Signed-off-by: Jens Langhammer <jens@goauthentik.io> * fix tests and fix permission bug Signed-off-by: Jens Langhammer <jens@goauthentik.io> * fix migrations Signed-off-by: Jens Langhammer <jens@goauthentik.io> * reword Signed-off-by: Jens Langhammer <jens@goauthentik.io> --------- Signed-off-by: Jens Langhammer <jens@goauthentik.io>
This commit is contained in:
		@ -8,7 +8,16 @@ from rest_framework.request import Request
 | 
			
		||||
class ObjectPermissions(DjangoObjectPermissions):
 | 
			
		||||
    """RBAC Permissions"""
 | 
			
		||||
 | 
			
		||||
    def has_object_permission(self, request: Request, view, obj: Model):
 | 
			
		||||
    def has_permission(self, request: Request, view) -> bool:
 | 
			
		||||
        """Always grant permission for object-specific requests
 | 
			
		||||
        as view permission checking is done by `ObjectFilter`,
 | 
			
		||||
        and write permission checking is done by `has_object_permission`"""
 | 
			
		||||
        lookup = getattr(view, "lookup_url_kwarg", None) or getattr(view, "lookup_field", None)
 | 
			
		||||
        if lookup and lookup in view.kwargs:
 | 
			
		||||
            return True
 | 
			
		||||
        return super().has_permission(request, view)
 | 
			
		||||
 | 
			
		||||
    def has_object_permission(self, request: Request, view, obj: Model) -> bool:
 | 
			
		||||
        queryset = self._queryset(view)
 | 
			
		||||
        model_cls = queryset.model
 | 
			
		||||
        perms = self.get_required_object_permissions(request.method, model_cls)
 | 
			
		||||
 | 
			
		||||
@ -121,3 +121,29 @@ class TestAPIPerms(APITestCase):
 | 
			
		||||
            },
 | 
			
		||||
        )
 | 
			
		||||
        self.assertEqual(res.status_code, 403)
 | 
			
		||||
 | 
			
		||||
    def test_update_simple(self):
 | 
			
		||||
        """Test update with permission"""
 | 
			
		||||
        self.client.force_login(self.user)
 | 
			
		||||
        inv = Invitation.objects.create(name=generate_id(), created_by=self.superuser)
 | 
			
		||||
        self.role.assign_permission("authentik_stages_invitation.view_invitation", obj=inv)
 | 
			
		||||
        self.role.assign_permission("authentik_stages_invitation.change_invitation", obj=inv)
 | 
			
		||||
        res = self.client.patch(
 | 
			
		||||
            reverse("authentik_api:invitation-detail", kwargs={"pk": inv.pk}),
 | 
			
		||||
            data={
 | 
			
		||||
                "name": generate_id(),
 | 
			
		||||
            },
 | 
			
		||||
        )
 | 
			
		||||
        self.assertEqual(res.status_code, 200)
 | 
			
		||||
 | 
			
		||||
    def test_update_simple_denied(self):
 | 
			
		||||
        """Test update without assigning permission"""
 | 
			
		||||
        self.client.force_login(self.user)
 | 
			
		||||
        inv = Invitation.objects.create(name=generate_id(), created_by=self.superuser)
 | 
			
		||||
        res = self.client.patch(
 | 
			
		||||
            reverse("authentik_api:invitation-detail", kwargs={"pk": inv.pk}),
 | 
			
		||||
            data={
 | 
			
		||||
                "name": generate_id(),
 | 
			
		||||
            },
 | 
			
		||||
        )
 | 
			
		||||
        self.assertEqual(res.status_code, 403)
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user