|
1 | 1 | """Permission handlers for the Meet core app.""" |
2 | 2 |
|
| 3 | +from django.conf import settings |
| 4 | + |
3 | 5 | from rest_framework import permissions |
4 | 6 |
|
5 | | -from ..models import RoleChoices |
| 7 | +from ..models import Recording, RecordingStatusChoices, RoleChoices |
6 | 8 |
|
7 | 9 | ACTION_FOR_METHOD_TO_PERMISSION = { |
8 | 10 | "versions_detail": {"DELETE": "versions_destroy", "GET": "versions_retrieve"} |
@@ -99,6 +101,43 @@ def has_object_permission(self, request, view, obj): |
99 | 101 | return obj.is_administrator_or_owner(request.user) |
100 | 102 |
|
101 | 103 |
|
| 104 | +class HasRecordingPermission(IsAuthenticated): |
| 105 | + """Check if user has permission to start/stop recording based on mode and settings.""" |
| 106 | + |
| 107 | + message = "You do not have permission to perform this recording action." |
| 108 | + |
| 109 | + def _get_permission_level(self, mode): |
| 110 | + """Return the permission level for the given mode.""" |
| 111 | + if mode == "screen_recording": |
| 112 | + return getattr(settings, "RECORDING_SCREEN_PERMISSION", "admin_owner") |
| 113 | + elif mode == "transcript": |
| 114 | + return getattr(settings, "RECORDING_TRANSCRIPT_PERMISSION", "admin_owner") |
| 115 | + return "admin_owner" |
| 116 | + |
| 117 | + def has_object_permission(self, request, view, obj): |
| 118 | + """Check object-level permissions based on recording mode.""" |
| 119 | + mode = request.data.get("mode") |
| 120 | + |
| 121 | + # For stop-recording, get mode from active recording |
| 122 | + if not mode: |
| 123 | + try: |
| 124 | + recording = Recording.objects.get( |
| 125 | + room=obj, status=RecordingStatusChoices.ACTIVE |
| 126 | + ) |
| 127 | + mode = recording.mode |
| 128 | + except Recording.DoesNotExist: |
| 129 | + # No active recording, let the view handle the error |
| 130 | + return True |
| 131 | + |
| 132 | + permission_level = self._get_permission_level(mode) |
| 133 | + |
| 134 | + if permission_level == "authenticated": |
| 135 | + # Already authenticated via IsAuthenticated.has_permission |
| 136 | + return True |
| 137 | + # admin_owner |
| 138 | + return obj.is_administrator_or_owner(request.user) |
| 139 | + |
| 140 | + |
102 | 141 | class HasLiveKitRoomAccess(permissions.BasePermission): |
103 | 142 | """Check if authenticated user's LiveKit token is for the specific room.""" |
104 | 143 |
|
|
0 commit comments