From 3db779ab27c0c00ca0c4a16cb5b44cca21d29b4f Mon Sep 17 00:00:00 2001 From: Calum Mackervoy <c.mackervoy@gmail.com> Date: Tue, 17 Nov 2020 17:23:11 +0000 Subject: [PATCH 1/4] bugfix: django-guardian conscious anonymous user check --- djangoldp_circle/filters.py | 10 ++++++++-- djangoldp_circle/tests/runner.py | 4 +++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/djangoldp_circle/filters.py b/djangoldp_circle/filters.py index c7d7450..750a39e 100644 --- a/djangoldp_circle/filters.py +++ b/djangoldp_circle/filters.py @@ -2,13 +2,17 @@ from django.db.models import Q from djangoldp.filters import LDPPermissionsFilterBackend from djangoldp_circle.xmpp import get_client_ip, XMPP_SERVERS from rest_framework_guardian.filters import ObjectPermissionsFilter +from django.contrib.auth import get_user_model +from django.conf import settings class CircleFilterBackend(ObjectPermissionsFilter): def filter_queryset(self, request, queryset, view): if get_client_ip(request) in XMPP_SERVERS: return queryset - elif request.user.is_anonymous: + elif request.user.is_anonymous or ( + getattr(settings, 'ANONYMOUS_USER_NAME', True) is not None and + request.user == get_user_model().get_anonymous()): return queryset.filter(status='Public') else: objects = super().filter_queryset(request, queryset, view).values_list('pk') @@ -23,7 +27,9 @@ class CircleMemberFilterBackend(ObjectPermissionsFilter): def filter_queryset(self, request, queryset, view): if get_client_ip(request) in XMPP_SERVERS: return queryset - elif request.user.is_anonymous: + elif request.user.is_anonymous or ( + getattr(settings, 'ANONYMOUS_USER_NAME', True) is not None and + request.user == get_user_model().get_anonymous()): return super().filter_queryset(request, queryset, view) else: objects = super().filter_queryset(request, queryset, view).values_list('pk') diff --git a/djangoldp_circle/tests/runner.py b/djangoldp_circle/tests/runner.py index 82f6e00..86f328f 100644 --- a/djangoldp_circle/tests/runner.py +++ b/djangoldp_circle/tests/runner.py @@ -25,7 +25,9 @@ settings.configure(default_settings=settings_default, }, SEND_BACKLINKS=False, JABBER_DEFAULT_HOST=None, - PERMISSIONS_CACHE=False + PERMISSIONS_CACHE=False, + USER_ANONYMOUS_NAME=None, + SERIALIZER_CACHE=False ) django.setup() -- GitLab From 325e15e990746be8ddf7700483f0d40f48e8fa27 Mon Sep 17 00:00:00 2001 From: Calum Mackervoy <c.mackervoy@gmail.com> Date: Tue, 17 Nov 2020 17:32:46 +0000 Subject: [PATCH 2/4] syntax: solution using guardian utility function --- djangoldp_circle/filters.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/djangoldp_circle/filters.py b/djangoldp_circle/filters.py index 750a39e..2449886 100644 --- a/djangoldp_circle/filters.py +++ b/djangoldp_circle/filters.py @@ -1,9 +1,9 @@ from django.db.models import Q +from django.conf import settings from djangoldp.filters import LDPPermissionsFilterBackend from djangoldp_circle.xmpp import get_client_ip, XMPP_SERVERS from rest_framework_guardian.filters import ObjectPermissionsFilter -from django.contrib.auth import get_user_model -from django.conf import settings +from guardian.utils import get_anonymous_user class CircleFilterBackend(ObjectPermissionsFilter): @@ -12,7 +12,7 @@ class CircleFilterBackend(ObjectPermissionsFilter): return queryset elif request.user.is_anonymous or ( getattr(settings, 'ANONYMOUS_USER_NAME', True) is not None and - request.user == get_user_model().get_anonymous()): + request.user == get_anonymous_user()): return queryset.filter(status='Public') else: objects = super().filter_queryset(request, queryset, view).values_list('pk') @@ -29,7 +29,7 @@ class CircleMemberFilterBackend(ObjectPermissionsFilter): return queryset elif request.user.is_anonymous or ( getattr(settings, 'ANONYMOUS_USER_NAME', True) is not None and - request.user == get_user_model().get_anonymous()): + request.user == get_anonymous_user()): return super().filter_queryset(request, queryset, view) else: objects = super().filter_queryset(request, queryset, view).values_list('pk') -- GitLab From 37b4f0f148081f84d19b8efd6ae2bd79673c20ed Mon Sep 17 00:00:00 2001 From: Calum Mackervoy <c.mackervoy@gmail.com> Date: Tue, 17 Nov 2020 18:00:12 +0000 Subject: [PATCH 3/4] bugfix: fix error in filter logic --- djangoldp_circle/filters.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/djangoldp_circle/filters.py b/djangoldp_circle/filters.py index 2449886..d77d300 100644 --- a/djangoldp_circle/filters.py +++ b/djangoldp_circle/filters.py @@ -30,7 +30,7 @@ class CircleMemberFilterBackend(ObjectPermissionsFilter): elif request.user.is_anonymous or ( getattr(settings, 'ANONYMOUS_USER_NAME', True) is not None and request.user == get_anonymous_user()): - return super().filter_queryset(request, queryset, view) + return view.model.objects.none() else: objects = super().filter_queryset(request, queryset, view).values_list('pk') return queryset.filter( -- GitLab From 90325fb5d7517217014934032ed8ad8ecef639cf Mon Sep 17 00:00:00 2001 From: Calum Mackervoy <c.mackervoy@gmail.com> Date: Tue, 17 Nov 2020 18:21:19 +0000 Subject: [PATCH 4/4] bugfix: fixed issue with tests --- djangoldp_circle/tests/runner.py | 2 +- djangoldp_circle/tests/tests_save.py | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/djangoldp_circle/tests/runner.py b/djangoldp_circle/tests/runner.py index 86f328f..d22816e 100644 --- a/djangoldp_circle/tests/runner.py +++ b/djangoldp_circle/tests/runner.py @@ -26,7 +26,7 @@ settings.configure(default_settings=settings_default, SEND_BACKLINKS=False, JABBER_DEFAULT_HOST=None, PERMISSIONS_CACHE=False, - USER_ANONYMOUS_NAME=None, + ANONYMOUS_USER_NAME=None, SERIALIZER_CACHE=False ) diff --git a/djangoldp_circle/tests/tests_save.py b/djangoldp_circle/tests/tests_save.py index 2bcf56e..8e08ea0 100644 --- a/djangoldp_circle/tests/tests_save.py +++ b/djangoldp_circle/tests/tests_save.py @@ -4,7 +4,7 @@ from datetime import datetime, timedelta from rest_framework.test import APITestCase, APIClient from guardian.shortcuts import assign_perm -from djangoldp_circle.models import Circle, CircleMember +from djangoldp_circle.models import Circle, CircleMember, manage_deleted_owner from djangoldp_circle.tests.models import User @@ -39,6 +39,8 @@ class SaveTestCase(APITestCase): CircleMember.objects.create(circle=self.circle, user=admin_user, is_admin=True) # the owner user was deleted - but there is another admin in the circle + cm = self.circle.members.get(user=self.user) + manage_deleted_owner('', cm) self.user.delete() # a new owner should be set as the other admin user @@ -52,6 +54,9 @@ class SaveTestCase(APITestCase): self.setUpCircle() another_user = self._get_random_user() CircleMember.objects.create(circle=self.circle, user=another_user, is_admin=False) + + cm = self.circle.members.get(user=self.user) + manage_deleted_owner('', cm) self.user.delete() # a new owner should be set as the other (non-admin) user -- GitLab