Skip to content

Commit 753f34f

Browse files
committed
Merged in [15702] from johnl@taugh.com:
Allow email as well as username when logging in. - Legacy-Id: 15739 Note: SVN reference [15702] has been migrated to Git commit e4dd65d
2 parents 89ef806 + e4dd65d commit 753f34f

2 files changed

Lines changed: 28 additions & 1 deletion

File tree

ietf/ietfauth/tests.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,18 @@ def test_login_and_logout(self):
8484
self.assertEqual(r.status_code, 302)
8585
self.assertEqual(urlsplit(r["Location"])[2], "/foobar")
8686

87+
def test_login_with_different_email(self):
88+
person = PersonFactory(user__username='plain')
89+
email = EmailFactory(person=person)
90+
91+
# try logging in without a next
92+
r = self.client.get(urlreverse(ietf.ietfauth.views.login))
93+
self.assertEqual(r.status_code, 200)
94+
95+
r = self.client.post(urlreverse(ietf.ietfauth.views.login), {"username":email, "password":"plain+password"})
96+
self.assertEqual(r.status_code, 302)
97+
self.assertEqual(urlsplit(r["Location"])[2], urlreverse(ietf.ietfauth.views.profile))
98+
8799
def extract_confirm_url(self, confirm_email):
88100
# dig out confirm_email link
89101
msg = confirm_email.get_payload(decode=True)

ietf/ietfauth/views.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
from django import forms
4242
from django.contrib import messages
4343
from django.conf import settings
44-
from django.contrib.auth import update_session_auth_hash, logout
44+
from django.contrib.auth import update_session_auth_hash, logout, authenticate
4545
from django.contrib.auth.decorators import login_required
4646
from django.contrib.auth.forms import AuthenticationForm
4747
from django.contrib.auth.hashers import identify_hasher
@@ -586,6 +586,21 @@ def login(request, extra_context=None):
586586
form = AuthenticationForm(request, data=request.POST)
587587
username = form.data.get('username')
588588
user = User.objects.filter(username=username).first()
589+
if not user:
590+
# try to find user ID from the email address
591+
email = Email.objects.filter(address=username).first()
592+
if email and email.person and email.person.user:
593+
u2 = email.person.user
594+
# be conservative, only accept this if login is valid
595+
if u2:
596+
pw = form.data.get('password')
597+
au = authenticate(request, username=u2.username, password=pw)
598+
if au:
599+
# kludge to change the querydict
600+
q2 = request.POST.copy()
601+
q2['username'] = u2.username
602+
request.POST = q2
603+
user = u2
589604
#
590605
if user:
591606
try:

0 commit comments

Comments
 (0)