Commit fc92470a authored by Michal Čihař's avatar Michal Čihař

Allow login using email

- customizes our auth backend to accept email in addition to username
- fixes #383
parent 00cefeb5
......@@ -27,10 +27,10 @@ from django.dispatch.dispatcher import receiver
from django.contrib.auth.backends import ModelBackend
class AnonymousUserBackend(ModelBackend):
class WeblateUserBackend(ModelBackend):
'''
Authentication backend which allows to control anonymous user
permissions.
permissions and to login using email.
'''
def get_all_permissions(self, user_obj, obj=None):
......@@ -44,19 +44,27 @@ class AnonymousUserBackend(ModelBackend):
anon_user = User.objects.get(username=ANONYMOUS_USER_NAME)
user_obj._perm_cache = self.get_all_permissions(anon_user)
return user_obj._perm_cache
return super(AnonymousUserBackend, self).get_all_permissions(
return super(WeblateUserBackend, self).get_all_permissions(
user_obj, obj
)
def authenticate(self, username=None, password=None, **kwargs):
'''
Prohibits login for anonymous user.
Prohibits login for anonymous user and allows to login by email.
'''
if username == ANONYMOUS_USER_NAME:
return False
return super(AnonymousUserBackend, self).authenticate(
username, password, **kwargs
)
if '@' in username:
kwargs = {'email': username}
else:
kwargs = {'username': username}
try:
user = User.objects.get(**kwargs)
if user.check_password(password):
return user
except User.DoesNotExist:
return None
def has_perm(self, user_obj, perm, obj=None):
'''
......
......@@ -20,6 +20,7 @@
from django import forms
from django.utils.translation import ugettext_lazy as _, get_language
from django.contrib.auth.forms import AuthenticationForm
from accounts.models import Profile, VerifiedEmail
from lang.models import Language
......@@ -387,3 +388,12 @@ class ResetForm(EmailForm):
_('User with this email address was not found.')
)
return users[0]
class LoginForm(AuthenticationForm):
def __init__(self, *args, **kwargs):
super(LoginForm, self).__init__(*args, **kwargs)
self.fields['username'].label = _('Username or email')
self.fields['password'].label = _('Password')
......@@ -32,7 +32,8 @@ from django.views.generic import TemplateView
from urllib import urlencode
from accounts.forms import (
RegistrationForm, PasswordForm, PasswordChangeForm, EmailForm, ResetForm
RegistrationForm, PasswordForm, PasswordChangeForm, EmailForm, ResetForm,
LoginForm
)
from social.backends.utils import load_backends
from social.apps.django_app.utils import BACKENDS
......@@ -257,6 +258,7 @@ def weblate_login(request):
return login(
request,
template_name='accounts/login.html',
authentication_form=LoginForm,
extra_context={
'login_backends': [
x for x in load_backends(BACKENDS).keys() if x != 'email'
......
......@@ -54,7 +54,7 @@ For example, enabling authentication against GitHub:
AUTHENTICATION_BACKENDS = (
'social.backends.github.GithubOAuth2',
'social.backends.email.EmailAuth',
'accounts.auth.AnonymousUserBackend',
'accounts.auth.WeblateUserBackend',
)
# Social auth backends setup
......
......@@ -171,7 +171,7 @@ AUTHENTICATION_BACKENDS = (
'social.backends.email.EmailAuth',
#'social.backends.github.GithubOAuth2',
#'social.backends.suse.OpenSUSEOpenId',
'accounts.auth.AnonymousUserBackend',
'accounts.auth.WeblateUserBackend',
)
# Social auth backends setup
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment