Skip to content

Commit 548a385

Browse files
committed
Fix hasattr impersonator usage
1 parent c2769d7 commit 548a385

File tree

3 files changed

+30
-11
lines changed

3 files changed

+30
-11
lines changed

plain-auth/plain/auth/views.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@
2323
if TYPE_CHECKING:
2424
from plain.http import Request
2525

26+
try:
27+
from plain.admin.impersonate import get_request_impersonator
28+
except ImportError:
29+
get_request_impersonator: Any = None
30+
2631

2732
class LoginRequired(Exception):
2833
def __init__(self, login_url: str | None = None, redirect_field_name: str = "next"):
@@ -65,14 +70,17 @@ def check_auth(self) -> None:
6570
if self.admin_required:
6671
# At this point, we know user is authenticated (from check above)
6772
# Check if impersonation is active
68-
if impersonator := getattr(self, "impersonator", None):
69-
# Impersonators should be able to view admin pages while impersonating.
70-
# There's probably never a case where an impersonator isn't admin, but it can be configured.
71-
if not impersonator.is_admin:
72-
raise PermissionDenied(
73-
"You do not have permission to access this page."
74-
)
75-
elif not self.user.is_admin:
73+
if get_request_impersonator:
74+
if impersonator := get_request_impersonator(self.request):
75+
# Impersonators should be able to view admin pages while impersonating.
76+
# There's probably never a case where an impersonator isn't admin, but it can be configured.
77+
if not impersonator.is_admin:
78+
raise PermissionDenied(
79+
"You do not have permission to access this page."
80+
)
81+
return
82+
83+
if not self.user.is_admin:
7684
# Show a 404 so we don't expose admin urls to non-admin users
7785
raise Http404()
7886

plain-pageviews/plain/pageviews/models.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@
2222
except ImportError:
2323
get_request_session: Any = None
2424

25+
try:
26+
from plain.admin.impersonate import get_request_impersonator
27+
except ImportError:
28+
get_request_impersonator: Any = None
29+
2530

2631
@models.register_model
2732
class Pageview(models.Model):
@@ -89,7 +94,7 @@ def create_from_request(
8994
Returns:
9095
Pageview instance or None if user is being impersonated
9196
"""
92-
if getattr(request, "impersonator", None):
97+
if get_request_impersonator and get_request_impersonator(request):
9398
return None
9499

95100
if url is None:

plain-toolbar/plain/toolbar/toolbar.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@
2121
except ImportError:
2222
get_request_user: Any = None
2323

24+
try:
25+
from plain.admin.impersonate import get_request_impersonator
26+
except ImportError:
27+
get_request_impersonator: Any = None
28+
2429

2530
class Toolbar:
2631
def __init__(self, context: Context) -> None:
@@ -32,8 +37,9 @@ def should_render(self) -> bool:
3237
if settings.DEBUG:
3338
return True
3439

35-
if impersonator := getattr(self.request, "impersonator", None):
36-
return getattr(impersonator, "is_admin", False)
40+
if get_request_impersonator:
41+
if impersonator := get_request_impersonator(self.request):
42+
return getattr(impersonator, "is_admin", False)
3743

3844
user = get_request_user(self.request) if get_request_user else None
3945
if user:

0 commit comments

Comments
 (0)