Skip to content

Commit

Permalink
permissiosn rough draft
Browse files Browse the repository at this point in the history
  • Loading branch information
Jon Walz authored and Jon Walz committed Feb 14, 2024
1 parent fb7c73b commit 63cbfa5
Show file tree
Hide file tree
Showing 6 changed files with 35 additions and 3 deletions.
1 change: 1 addition & 0 deletions addon_service/authorized_storage_account/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ def __init__(self, *args, **kwargs):
many=False,
queryset=UserReference.objects.all(),
related_link_view_name=f"{RESOURCE_NAME}-related",
read_only=True
)
external_storage_service = ExternalStorageServiceField(
queryset=ExternalStorageService.objects.all(),
Expand Down
9 changes: 9 additions & 0 deletions addon_service/authorized_storage_account/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,17 @@
from .models import AuthorizedStorageAccount
from .serializers import AuthorizedStorageAccountSerializer

from addon_service.common.permissions import IsAuthenticated, SessionUserIsAccountOwner
from addon_service.common.viewsets import RetrieveWriteViewSet

class AuthorizedStorageAccountViewSet(RetrieveWriteViewSet):
queryset = AuthorizedStorageAccount.objects.all()
serializer_class = AuthorizedStorageAccountSerializer

def get_permissions(self):
if self.action in ['retrieve', 'update', 'destroy']:
return [SessionUserIsAccountOwner()]
elif self.action == 'create':
return [IsAuthenticated()]
else:
raise RuntimeError #todo, better exception
15 changes: 15 additions & 0 deletions addon_service/common/permissions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@

class SessionUserIsAccountOwner(): #Add appropriate base class

def get_user_uri_for_view(self, view):
raise NotImplementedError('Subclass must implement this')

def has_object_permission(self, request, view, obj):
session_user_uri = request.session.get('user_reference_uri')
return session_user_uri == obj.account_owner.uri


class IsAuthenticated:

def has_permission(self, request, view):
return request.session.get('user_reference_uri') is not None
4 changes: 2 additions & 2 deletions addon_service/external_storage_service/views.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from rest_framework_json_api.views import ReadOnlyViewSet
from rest_framework_json_api.views import ReadOnlyModelViewSet

from .models import ExternalStorageService
from .serializers import ExternalStorageServiceSerializer


class ExternalStorageServiceViewSet(ReadOnlyViewSet):
class ExternalStorageServiceViewSet(ReadOnlyModelViewSet):
queryset = ExternalStorageService.objects.all()
serializer_class = ExternalStorageServiceSerializer
# TODO: permissions_classes
5 changes: 5 additions & 0 deletions addon_service/user_reference/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@
class UserReference(AddonsServiceBaseModel):
user_uri = models.URLField(unique=True, db_index=True, null=False)


@property
def account_owner(self):
return self

@property
def authorized_storage_accounts(self):
return AuthorizedStorageAccount.objects.filter(
Expand Down
4 changes: 3 additions & 1 deletion addon_service/user_reference/views.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
from .models import UserReference
from .serializers import UserReferenceSerializer

from addon_service.common.permissions import SessionUserIsAccountOwner
from addon_service.common.viewsets import RetrieveOnlyViewSet


class UserReferenceViewSet(RetrieveOnlyViewSet):
queryset = UserReference.objects.all()
serializer_class = UserReferenceSerializer
# TODO: permissions_classes
permissions = [SessionUserIsAccountOwner]

0 comments on commit 63cbfa5

Please sign in to comment.