diff --git a/src/backend/role_permission.py b/src/backend/role_permission.py index 5348e9cb721fb2af23d048d5439a0559c673b4f2..17c646f0630b5bae55649b3469a39b481bbd62cd 100644 --- a/src/backend/role_permission.py +++ b/src/backend/role_permission.py @@ -11,14 +11,14 @@ class IsProvider(BasePermission): """ def has_permission(self, request, view): - return bool(has_permission(request.user, Roles.CREATE_PROVIDER)) + return bool(request.user.has_perm(Roles.CREATE_PROVIDER)) class IsProviderManager(BasePermission): def has_permission(self, request, view): - return bool(has_permission(request.user, Roles.MANAGE_PROVIDER_KEYS)) + return bool(request.user.has_perm(Roles.MANAGE_PROVIDER_KEYS)) class IsAnalyst(BasePermission): def has_permission(self, request, view): - return bool(has_permission(request.user, Roles.MANAGE_ANALYTICS_TOKENS)) + return bool(request.user.has_perm( Roles.MANAGE_ANALYTICS_TOKENS)) diff --git a/src/backend/roles.py b/src/backend/roles.py index d31aebab3e4a9fc9b8383d7a50b62f4160a2461a..b8ac23807b2ffbe0d0864641c28d33d2fbce062b 100644 --- a/src/backend/roles.py +++ b/src/backend/roles.py @@ -3,14 +3,14 @@ from strenum import StrEnum class Roles(StrEnum): - CREATE_USER = 'create_user', - EDIT_USER = 'edit_user', - CREATE_PROVIDER = 'create_provider', - CHANGE_PROVIDER = 'change_provider', - MANAGE_PROVIDER_KEYS = 'manage_provider_keys', - MANAGE_ANALYTICS_TOKENS = 'manage_analytics_tokens', - CREATE_USER_CONSENT = 'create_user_consent', - REQUEST_USER_DATA = 'request_user_data', + CREATE_USER = 'users.create_user', + EDIT_USER = 'users.edit_user', + CREATE_PROVIDER = 'users.create_provider', + CHANGE_PROVIDER = 'users.change_provider', + MANAGE_PROVIDER_KEYS = 'users.manage_provider_keys', + MANAGE_ANALYTICS_TOKENS = 'users.manage_analytics_tokens', + CREATE_USER_CONSENT = 'users.create_user_consent', + REQUEST_USER_DATA = 'users.request_user_data', class PolarisAdministrator(AbstractUserRole): diff --git a/src/backend/urls.py b/src/backend/urls.py index 9a7e20b45d645f6f7abc75d343b6f41af38bc813..090ac67932c333abaa1e6e6335e8dd7c5efb312c 100644 --- a/src/backend/urls.py +++ b/src/backend/urls.py @@ -67,11 +67,11 @@ urlpatterns = [ re_path(r"^saml2/meta(?:data)?/?$", views.MetadataView.as_view(), name="sso-saml2-meta"), re_path(r"^sso-dev/?$", views.DevView.as_view(), name="sso-dev"), - path("app/de/", render_angular_de), - path("app/en/", render_angular_en), - re_path(r'^app/de/(?P<path>.*)$', serve,{'document_root': os.path.join(settings.BASE_DIR, "frontend/dist/frontend/de")}), - re_path(r"^$", detect_lang_redirect), - re_path(r"^(?:.*)/?$", detect_lang_redirect), + # path("app/de/", render_angular_de), + # path("app/en/", render_angular_en), + # re_path(r'^app/de/(?P<path>.*)$', serve,{'document_root': os.path.join(settings.BASE_DIR, "frontend/dist/frontend/de")}), + # re_path(r"^$", detect_lang_redirect), + # re_path(r"^(?:.*)/?$", detect_lang_redirect), ] if settings.DEBUG == "True": diff --git a/src/requirements.txt b/src/requirements.txt index 66b80ae5be66e250260714abb68b6ea38472215e..86f247a097365616aec6f5b68c72fe8b1846c639 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -103,5 +103,5 @@ watchdog==2.2.1 wcwidth==0.2.5 whitenoise==6.3.0 wrapt==1.14.1 -zeep==4.2.1 +zeep==4.3.1 zipp==1.0.0 diff --git a/src/users/models.py b/src/users/models.py index 6f52c18746185e2db52d8ef53d1d3a6a59fe823e..d82ee3db4e47bf646c565efda37228822c4f5dbd 100644 --- a/src/users/models.py +++ b/src/users/models.py @@ -1,7 +1,7 @@ from datetime import date from django.conf import settings -from django.contrib.auth.models import AbstractUser +from django.contrib.auth.models import AbstractUser, Permission from django.db import models from django.utils.translation import gettext_lazy as _ @@ -24,3 +24,25 @@ class CustomUser(AbstractUser): def __str__(self): return f"Custom user {self.id}: {self.email}" + + def has_perm(self, perm, obj=None): + """ + Custom permission check: + - Includes direct user permissions + - Includes group-based permissions + """ + if self.is_superuser: # Superuser has all permissions + return True + + # Check direct user permissions + if self.user_permissions.filter(codename=perm.split(".")[-1]).exists(): + return True + + # Check group-based permissions + group_permissions = Permission.objects.filter(group__user=self).values_list( + "codename", flat=True + ) + if perm.split(".")[-1] in group_permissions: + return True + + return False \ No newline at end of file diff --git a/src/users/views.py b/src/users/views.py index d4927929d4e8d3cd28e4fb0ae79ff15ed253b100..c708f7b952553d1515e3298c12ee8be873b16dd8 100644 --- a/src/users/views.py +++ b/src/users/views.py @@ -30,7 +30,7 @@ class CreateUserView(APIView): parser_class = (JsonUploadParser,) def put(self, request, format=None): - if has_permission(request.user, Roles.CREATE_USER): + if request.user.has_perm(Roles.CREATE_USER): email = request.data.get("email", None) password = request.data.get("password", None) assign_provider_role = request.data.get("assign_provider_role", None) @@ -161,12 +161,14 @@ class UserListView(APIView): permission_classes = (IsAuthenticated,) def get(self, request): - if has_permission(request.user, Roles.EDIT_USER): + if request.user.has_perm(Roles.EDIT_USER): users = CustomUser.objects.all() users = UserSerializer(users, many=True).data return JsonResponse(users, safe=False, status=status.HTTP_200_OK) + return JsonResponse({"status": "error", "message": 'not permissions'}, + status=status.HTTP_401_UNAUTHORIZED) class GroupListView(APIView): @@ -199,7 +201,7 @@ class PermissionsUpdateView(APIView): permission_classes = (IsAuthenticated,) def post(self, request, user_id): - if not has_permission(request.user, Roles.EDIT_USER): + if not request.user.has_perm(Roles.EDIT_USER): return JsonResponse({"status": "error", "message": 'not permissions'}, status=status.HTTP_401_UNAUTHORIZED) try: