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