Skip to content

Commit 067ae17

Browse files
fix: do not set user template var in ietfauth views (ietf-tools#4216)
Lets the `user` variable pick up `request.user`. Fixes ietf-tools#3568
1 parent 10e251f commit 067ae17

3 files changed

Lines changed: 25 additions & 11 deletions

File tree

ietf/ietfauth/tests.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
from ietf.mailinglists.models import Subscribed
3838
from ietf.meeting.factories import MeetingFactory
3939
from ietf.nomcom.factories import NomComFactory
40-
from ietf.person.factories import PersonFactory, EmailFactory
40+
from ietf.person.factories import PersonFactory, EmailFactory, UserFactory
4141
from ietf.person.models import Person, Email, PersonalApiKey
4242
from ietf.review.factories import ReviewRequestFactory, ReviewAssignmentFactory
4343
from ietf.review.models import ReviewWish, UnavailablePeriod
@@ -433,10 +433,20 @@ def test_reset_password(self):
433433
self.assertEqual(r.status_code, 200)
434434
self.assertEqual(len(outbox), 1)
435435

436-
# go to change password page
436+
# goto change password page, logged in as someone else
437437
confirm_url = self.extract_confirm_url(outbox[-1])
438+
other_user = UserFactory()
439+
self.client.login(username=other_user.username, password=other_user.username + '+password')
440+
r = self.client.get(confirm_url)
441+
self.assertEqual(r.status_code, 403)
442+
443+
# sign out and go back to change password page
444+
self.client.logout()
438445
r = self.client.get(confirm_url)
439446
self.assertEqual(r.status_code, 200)
447+
q = PyQuery(r.content)
448+
self.assertNotIn(user.username, q('.nav').text(),
449+
'user should not appear signed in while resetting password')
440450

441451
# password mismatch
442452
r = self.client.post(confirm_url, { 'password': 'secret', 'password_confirmation': 'nosecret' })

ietf/ietfauth/views.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
from django.core.exceptions import ObjectDoesNotExist, ValidationError
5656
from django.urls import reverse as urlreverse
5757
from django.utils.safestring import mark_safe
58-
from django.http import Http404, HttpResponseRedirect #, HttpResponse,
58+
from django.http import Http404, HttpResponseRedirect, HttpResponseForbidden
5959
from django.shortcuts import render, redirect, get_object_or_404
6060
from django.utils.encoding import force_bytes
6161

@@ -303,7 +303,6 @@ def profile(request):
303303
person_form = get_person_form(instance=person)
304304

305305
return render(request, 'registration/edit_profile.html', {
306-
'user': request.user,
307306
'person': person,
308307
'person_form': person_form,
309308
'roles': roles,
@@ -462,7 +461,11 @@ def confirm_password_reset(request, auth):
462461
raise Http404("Invalid or expired auth")
463462

464463
user = get_object_or_404(User, username=username, password__endswith=password, last_login=last_login)
465-
464+
if request.user.is_authenticated and request.user != user:
465+
return HttpResponseForbidden(
466+
f'This password reset link is not for the signed-in user. '
467+
f'Please <a href="{urlreverse("django.contrib.auth.views.logout")}">sign out</a> and try again.'
468+
)
466469
success = False
467470
if request.method == 'POST':
468471
form = PasswordForm(request.POST)
@@ -483,7 +486,7 @@ def confirm_password_reset(request, auth):
483486
hasher = getattr(hlib, hashername)
484487
return render(request, 'registration/change_password.html', {
485488
'form': form,
486-
'user': user,
489+
'update_user': user,
487490
'success': success,
488491
'hasher': hasher,
489492
})
@@ -647,7 +650,6 @@ def change_password(request):
647650
hasher = getattr(hlib, hashername)
648651
return render(request, 'registration/change_password.html', {
649652
'form': form,
650-
'user': user,
651653
'success': success,
652654
'hasher': hasher,
653655
})
@@ -685,10 +687,7 @@ def change_username(request):
685687
else:
686688
form = ChangeUsernameForm(request.user)
687689

688-
return render(request, 'registration/change_username.html', {
689-
'form': form,
690-
'user': user,
691-
})
690+
return render(request, 'registration/change_username.html', {'form': form})
692691

693692

694693

ietf/templates/registration/change_password.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@
2424
{% endif %}
2525
{% else %}
2626
<h1>Change password</h1>
27+
{% if update_user and update_user != user %}
28+
<div class="alert alert-info my-3">
29+
This will change the password for user {{ update_user }}.
30+
</div>
31+
{% endif %}
2732
<form method="post" class="my-3">
2833
{% csrf_token %}
2934
{% bootstrap_form form %}

0 commit comments

Comments
 (0)