Skip to content

Commit

Permalink
Merge 1e35740 into aadabf6
Browse files Browse the repository at this point in the history
  • Loading branch information
JulianGodd committed Oct 3, 2023
2 parents aadabf6 + 1e35740 commit 42a4d93
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 24 deletions.
36 changes: 36 additions & 0 deletions django_su/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,43 @@

from django.conf import settings
from django.utils.module_loading import import_string
from django.contrib.auth import (
BACKEND_SESSION_KEY,
SESSION_KEY,
authenticate,
login,
)

def su_in(request, user_id):
'''
Returns: a User Object or None
'''
if not request.user.has_perm("auth.change_user"):
return None

userobj = authenticate(request=request, su=True, user_id=user_id)
if not userobj:
return None

exit_users_pk = request.session.get("exit_users_pk", default=[])
exit_users_pk.append(
(request.session[SESSION_KEY], request.session[BACKEND_SESSION_KEY])
)

maintain_last_login = hasattr(userobj, "last_login")
if maintain_last_login:
last_login = userobj.last_login

try:
if not custom_login_action(request, userobj):
login(request, userobj)
request.session["exit_users_pk"] = exit_users_pk
finally:
if maintain_last_login:
userobj.last_login = last_login
userobj.save(update_fields=["last_login"])

return userobj

def su_login_callback(user):
if hasattr(settings, "SU_LOGIN"):
Expand Down
26 changes: 2 additions & 24 deletions django_su/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,6 @@

from django.conf import settings
from django.contrib.auth import (
BACKEND_SESSION_KEY,
SESSION_KEY,
authenticate,
get_user_model,
login,
)
Expand All @@ -17,7 +14,7 @@
from django.views.decorators.http import require_http_methods

from .forms import UserSuForm
from .utils import custom_login_action, su_login_callback
from .utils import custom_login_action, su_login_callback, su_in


User = get_user_model()
Expand All @@ -27,28 +24,9 @@
@require_http_methods(["POST"])
@user_passes_test(su_login_callback)
def login_as_user(request, user_id):
userobj = authenticate(request=request, su=True, user_id=user_id)
if not userobj:
if not su_in(request, user_id):
raise Http404("User not found")

exit_users_pk = request.session.get("exit_users_pk", default=[])
exit_users_pk.append(
(request.session[SESSION_KEY], request.session[BACKEND_SESSION_KEY])
)

maintain_last_login = hasattr(userobj, "last_login")
if maintain_last_login:
last_login = userobj.last_login

try:
if not custom_login_action(request, userobj):
login(request, userobj)
request.session["exit_users_pk"] = exit_users_pk
finally:
if maintain_last_login:
userobj.last_login = last_login
userobj.save(update_fields=["last_login"])

if hasattr(settings, "SU_REDIRECT_LOGIN"):
warnings.warn(
"SU_REDIRECT_LOGIN is deprecated, use SU_LOGIN_REDIRECT_URL",
Expand Down

0 comments on commit 42a4d93

Please sign in to comment.