Skip to content

Commit 61b50d2

Browse files
committed
refactor(account): Unify email confirmation model
1 parent bd7b69f commit 61b50d2

File tree

3 files changed

+27
-26
lines changed

3 files changed

+27
-26
lines changed

allauth/account/models.py

+21-4
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,8 @@ def set_as_primary(self, conditional=False):
8686
return True
8787

8888
def send_confirmation(self, request=None, signup=False):
89-
if app_settings.EMAIL_CONFIRMATION_HMAC:
90-
confirmation = EmailConfirmationHMAC(self)
91-
else:
92-
confirmation = EmailConfirmation.create(self)
89+
model = get_emailconfirmation_model()
90+
confirmation = model.create(self)
9391
confirmation.send(request, signup=signup)
9492
return confirmation
9593

@@ -156,6 +154,13 @@ def create(cls, email_address):
156154
key = get_adapter().generate_emailconfirmation_key(email_address.email)
157155
return cls._default_manager.create(email_address=email_address, key=key)
158156

157+
@classmethod
158+
def from_key(cls, key):
159+
qs = EmailConfirmation.objects.all_valid()
160+
qs = qs.select_related("email_address__user")
161+
emailconfirmation = qs.filter(key=key.lower()).first()
162+
return emailconfirmation
163+
159164
def key_expired(self):
160165
expiration_date = self.sent + datetime.timedelta(
161166
days=app_settings.EMAIL_CONFIRMATION_EXPIRE_DAYS
@@ -178,6 +183,10 @@ class EmailConfirmationHMAC(EmailConfirmationMixin, object):
178183
def __init__(self, email_address):
179184
self.email_address = email_address
180185

186+
@classmethod
187+
def create(cls, email_address):
188+
return EmailConfirmationHMAC(email_address)
189+
181190
@property
182191
def key(self):
183192
return signing.dumps(obj=self.email_address.pk, salt=app_settings.SALT)
@@ -273,3 +282,11 @@ def deserialize(cls, data):
273282
)
274283
except KeyError:
275284
raise ValueError()
285+
286+
287+
def get_emailconfirmation_model():
288+
if app_settings.EMAIL_CONFIRMATION_HMAC:
289+
model = EmailConfirmationHMAC
290+
else:
291+
model = EmailConfirmation
292+
return model

allauth/account/tests/test_confirm_email.py

+2-14
Original file line numberDiff line numberDiff line change
@@ -79,14 +79,14 @@ def test_login_on_confirm_uuid_user(
7979
confirmation.from_key.return_value = confirmation
8080
mock_perform_login.return_value = HttpResponseRedirect(redirect_to="/")
8181

82-
with patch("allauth.account.views.EmailConfirmationHMAC", confirmation):
82+
with patch("allauth.account.models.EmailConfirmationHMAC", confirmation):
8383
client.post(reverse("account_confirm_email", args=[key]))
8484

8585
assert mock_perform_login.called
8686

8787

8888
def test_email_verification_failed(settings, user_factory, client):
89-
settings.ACCOUNT_EMAIL_CONFIRMATION_HMAC = (False,)
89+
settings.ACCOUNT_EMAIL_CONFIRMATION_HMAC = False
9090
user_factory(email_verified=True, email="[email protected]")
9191
unverified_user = user_factory(email_verified=False, email="[email protected]")
9292
email_address = EmailAddress.objects.get_for_user(
@@ -207,18 +207,6 @@ def test_optional_email_verification(settings, client, db, mailoutbox):
207207
assert len(mailoutbox) == 1
208208

209209

210-
def test_email_confirmation_hmac_falls_back(user_factory, client):
211-
settings.ACCOUNT_EMAIL_CONFIRMATION_HMAC = True
212-
user = user_factory(email_verified=False)
213-
email = EmailAddress.objects.get_for_user(user, user.email)
214-
confirmation = EmailConfirmation.create(email)
215-
confirmation.sent = now()
216-
confirmation.save()
217-
client.post(reverse("account_confirm_email", args=[confirmation.key]))
218-
email = EmailAddress.objects.get(pk=email.pk)
219-
assert email.verified
220-
221-
222210
def test_email_confirmation_hmac(settings, client, user_factory, mailoutbox, rf):
223211
settings.ACCOUNT_EMAIL_CONFIRMATION_HMAC = True
224212
user = user_factory(email_verified=False)

allauth/account/views.py

+4-8
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
from allauth.account.models import (
3737
EmailAddress,
3838
EmailConfirmation,
39-
EmailConfirmationHMAC,
39+
get_emailconfirmation_model,
4040
)
4141
from allauth.account.reauthentication import (
4242
record_authentication,
@@ -435,14 +435,10 @@ def login_on_confirm(self, confirmation):
435435

436436
def get_object(self, queryset=None):
437437
key = self.kwargs["key"]
438-
emailconfirmation = EmailConfirmationHMAC.from_key(key)
438+
model = get_emailconfirmation_model()
439+
emailconfirmation = model.from_key(key)
439440
if not emailconfirmation:
440-
if queryset is None:
441-
queryset = self.get_queryset()
442-
try:
443-
emailconfirmation = queryset.get(key=key.lower())
444-
except EmailConfirmation.DoesNotExist:
445-
raise Http404()
441+
raise Http404()
446442
return emailconfirmation
447443

448444
def get_queryset(self):

0 commit comments

Comments
 (0)