Skip to content

Commit c42406a

Browse files
committed
Restrict state PATCHing to workspace writers
1 parent f5d144b commit c42406a

File tree

1 file changed

+11
-2
lines changed

1 file changed

+11
-2
lines changed

multinet/api/views/session.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
from rest_framework.response import Response
1212
from rest_framework.viewsets import GenericViewSet
1313

14-
from ..models import NetworkSession, TableSession
14+
from ..models import NetworkSession, TableSession, Workspace, WorkspaceRoleChoice
15+
from ..auth.decorators import require_workspace_permission
1516
from .serializers import NetworkSessionSerializer, TableSessionSerializer
1617
from .common import WorkspaceChildMixin
1718

@@ -38,11 +39,19 @@ class SessionStatePatchSerializer(serializers.Serializer):
3839
class SessionViewSet(
3940
CreateModelMixin, RetrieveModelMixin, DestroyModelMixin, ListModelMixin, GenericViewSet
4041
):
42+
swagger_tags = ['sessions']
43+
4144
@swagger_auto_schema(request_body=SessionStatePatchSerializer)
4245
@action(detail=True, methods=['patch'])
43-
def state(self, request, pk=None):
46+
@require_workspace_permission(WorkspaceRoleChoice.WRITER)
47+
def state(self, request, parent_lookup_workspace__name: str, pk=None):
4448
session = self.get_object()
4549

50+
workspace: Workspace = get_object_or_404(Workspace, name=parent_lookup_workspace__name)
51+
session_ws = session.table.workspace if hasattr(session, 'table') else session.network.workspace
52+
if workspace.id != session_ws:
53+
raise Http404
54+
4655
serializer = SessionStatePatchSerializer(data=request.data)
4756
serializer.is_valid(raise_exception=True)
4857
data = serializer.validated_data['state']

0 commit comments

Comments
 (0)