Skip to content

Commit

Permalink
Fixed behavior when allauth not used. (#285)
Browse files Browse the repository at this point in the history
  • Loading branch information
noamkush committed Jul 22, 2021
1 parent 8dfe635 commit 3d21042
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 35 deletions.
8 changes: 1 addition & 7 deletions dj_rest_auth/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,9 @@
from allauth.account.utils import (filter_users_by_email,
user_pk_to_url_str, user_username)
from allauth.utils import build_absolute_uri
else:
from django.contrib.auth.forms import PasswordResetForm as DefaultPasswordResetForm
from django.contrib.auth.tokens import default_token_generator


class PasswordResetForm(DefaultPasswordResetForm):
class AllAuthPasswordResetForm(DefaultPasswordResetForm):
def clean_email(self):
"""
Invalid email should not raise error, as this would leak users
Expand All @@ -29,9 +26,6 @@ def clean_email(self):
return self.cleaned_data["email"]

def save(self, request, **kwargs):
if 'allauth' not in settings.INSTALLED_APPS:
return super().save(request, **kwargs)
# for allauth
current_site = get_current_site(request)
email = self.cleaned_data['email']
token_generator = kwargs.get('token_generator', default_token_generator)
Expand Down
40 changes: 22 additions & 18 deletions dj_rest_auth/serializers.py
Original file line number Diff line number Diff line change
@@ -1,30 +1,20 @@
from django.conf import settings
from django.contrib.auth import authenticate, get_user_model
from django.contrib.auth.forms import SetPasswordForm
from django.contrib.auth.forms import SetPasswordForm, PasswordResetForm
from django.urls import exceptions as url_exceptions
from django.utils.encoding import force_str
from django.utils.module_loading import import_string
from django.utils.translation import gettext_lazy as _
from rest_framework import exceptions, serializers
from rest_framework.exceptions import ValidationError

if 'allauth' in settings.INSTALLED_APPS:
from allauth.account.forms import default_token_generator
from allauth.account.utils import url_str_to_user_pk as uid_decoder
else:
from django.contrib.auth.tokens import default_token_generator
from django.utils.http import urlsafe_base64_decode as uid_decoder

try:
from django.utils.translation import gettext_lazy as _
except ImportError:
from django.utils.translation import gettext_lazy as _

from .forms import PasswordResetForm
from .forms import AllAuthPasswordResetForm
from .models import TokenModel

# Get the UserModel
UserModel = get_user_model()


class LoginSerializer(serializers.Serializer):
username = serializers.CharField(required=False, allow_blank=True)
email = serializers.EmailField(required=False, allow_blank=True)
Expand All @@ -34,8 +24,6 @@ def authenticate(self, **kwargs):
return authenticate(self.context['request'], **kwargs)

def _validate_email(self, email, password):
user = None

if email and password:
user = self.authenticate(email=email, password=password)
else:
Expand Down Expand Up @@ -229,10 +217,15 @@ class PasswordResetSerializer(serializers.Serializer):
"""
email = serializers.EmailField()

password_reset_form_class = PasswordResetForm

reset_form = None

@property
def password_reset_form_class(self):
if 'allauth' in settings.INSTALLED_APPS:
return AllAuthPasswordResetForm
else:
return PasswordResetForm

def get_email_options(self):
"""Override this method to change default e-mail options"""
return {}
Expand All @@ -246,6 +239,11 @@ def validate_email(self, value):
return value

def save(self):
if 'allauth' in settings.INSTALLED_APPS:
from allauth.account.forms import default_token_generator
else:
from django.contrib.auth.tokens import default_token_generator

request = self.context.get('request')
# Set some values to trigger the send_email method.
opts = {
Expand Down Expand Up @@ -278,6 +276,12 @@ def custom_validation(self, attrs):
pass

def validate(self, attrs):
if 'allauth' in settings.INSTALLED_APPS:
from allauth.account.forms import default_token_generator
from allauth.account.utils import url_str_to_user_pk as uid_decoder
else:
from django.contrib.auth.tokens import default_token_generator
from django.utils.http import urlsafe_base64_decode as uid_decoder

# Decode the uidb64 (allauth use base36) to uid to get User object
try:
Expand Down
22 changes: 12 additions & 10 deletions dj_rest_auth/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from django.conf import settings
from django.contrib.auth import get_user_model
from django.core import mail
from django.test import TestCase, override_settings
from django.test import TestCase, modify_settings, override_settings
from django.utils.encoding import force_str
from rest_framework import status
from rest_framework.test import APIRequestFactory
Expand Down Expand Up @@ -79,7 +79,7 @@ def _generate_uid_and_token(self, user):
result['uid'] = user_pk_to_url_str(user)
else:
from django.utils.encoding import force_bytes
from django.contrib.auth.tokens import default_token_generator
from django.contrib.auth.tokens import default_token_generator
from django.utils.http import urlsafe_base64_encode
result['uid'] = urlsafe_base64_encode(force_bytes(user.pk))
result['token'] = default_token_generator.make_token(user)
Expand Down Expand Up @@ -176,10 +176,8 @@ def test_login_jwt(self):
self.assertEqual('access_token' in self.response.json.keys(), True)
self.token = self.response.json['access_token']

@modify_settings(INSTALLED_APPS={'remove': ['allauth', 'allauth.account']})
def test_login_by_email(self):
# starting test without allauth app
settings.INSTALLED_APPS.remove('allauth')

payload = {
'email': self.EMAIL.lower(),
'password': self.PASS,
Expand Down Expand Up @@ -221,9 +219,6 @@ def test_login_by_email(self):
# test empty payload
self.post(self.login_url, data={}, status_code=400)

# bring back allauth
settings.INSTALLED_APPS.append('allauth')

def test_password_change(self):
login_payload = {
'username': self.USERNAME,
Expand Down Expand Up @@ -314,7 +309,7 @@ def test_password_change_with_old_password(self):
login_payload['password'] = new_password_payload['new_password1']
self.post(self.login_url, data=login_payload, status_code=200)

def test_password_reset(self):
def _password_reset(self):
user = get_user_model().objects.create_user(self.USERNAME, self.EMAIL, self.PASS)

# call password reset
Expand Down Expand Up @@ -369,6 +364,13 @@ def test_password_reset(self):
}
self.post(self.login_url, data=payload, status_code=200)

def test_password_reset_allauth(self):
self._password_reset()

@modify_settings(INSTALLED_APPS={'remove': ['allauth', 'allauth.account']})
def test_password_reset_no_allauth(self):
self._password_reset()

def test_password_reset_with_email_in_different_case(self):
get_user_model().objects.create_user(self.USERNAME, self.EMAIL.lower(), self.PASS)

Expand Down Expand Up @@ -631,9 +633,9 @@ def test_cookie_authentication(self):
resp = self.get('/protected-view/')
self.assertEquals(resp.status_code, 200)

@modify_settings(INSTALLED_APPS={'remove': ['rest_framework_simplejwt.token_blacklist']})
@override_settings(REST_USE_JWT=True)
def test_blacklisting_not_installed(self):
settings.INSTALLED_APPS.remove('rest_framework_simplejwt.token_blacklist')
payload = {
'username': self.USERNAME,
'password': self.PASS,
Expand Down

0 comments on commit 3d21042

Please sign in to comment.