forked from CGM_Public/pretix_original
Used Django's token generator for passwort resets
This commit is contained in:
@@ -147,9 +147,7 @@ class PasswordForgotForm(forms.Form):
|
|||||||
def clean_email(self):
|
def clean_email(self):
|
||||||
email = self.cleaned_data['email']
|
email = self.cleaned_data['email']
|
||||||
try:
|
try:
|
||||||
self.cleaned_data['user'] = User.objects.get(
|
self.cleaned_data['user'] = User.objects.get(email=email)
|
||||||
email=email, event__isnull=True
|
|
||||||
)
|
|
||||||
return email
|
return email
|
||||||
except User.DoesNotExist:
|
except User.DoesNotExist:
|
||||||
raise forms.ValidationError(
|
raise forms.ValidationError(
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
{% load i18n %}{% blocktrans with event=event.name url=url %}Hello,
|
{% load i18n %}{% blocktrans with event=event.name url=url|safe %}Hello,
|
||||||
|
|
||||||
you requested a new password. Please go to the following page to reset your password:
|
you requested a new password. Please go to the following page to reset your password:
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ from django.contrib import messages
|
|||||||
from django.contrib.auth import (
|
from django.contrib.auth import (
|
||||||
authenticate, login, logout, update_session_auth_hash,
|
authenticate, login, logout, update_session_auth_hash,
|
||||||
)
|
)
|
||||||
|
from django.contrib.auth.tokens import default_token_generator
|
||||||
from django.core import signing
|
from django.core import signing
|
||||||
from django.core.signing import BadSignature, SignatureExpired
|
from django.core.signing import BadSignature, SignatureExpired
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
@@ -170,12 +171,6 @@ class EventForgot(EventViewMixin, TemplateView):
|
|||||||
event=self.request.event.slug)
|
event=self.request.event.slug)
|
||||||
return super().get(request, *args, **kwargs)
|
return super().get(request, *args, **kwargs)
|
||||||
|
|
||||||
def generate_token(self, user):
|
|
||||||
return signing.dumps({
|
|
||||||
"type": "reset",
|
|
||||||
"user": user.id
|
|
||||||
})
|
|
||||||
|
|
||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs):
|
||||||
if self.form.is_valid():
|
if self.form.is_valid():
|
||||||
user = self.form.cleaned_data['user']
|
user = self.form.cleaned_data['user']
|
||||||
@@ -187,7 +182,7 @@ class EventForgot(EventViewMixin, TemplateView):
|
|||||||
'url': build_absolute_uri('presale:event.forgot.recover', kwargs={
|
'url': build_absolute_uri('presale:event.forgot.recover', kwargs={
|
||||||
'event': self.request.event.slug,
|
'event': self.request.event.slug,
|
||||||
'organizer': self.request.event.organizer.slug,
|
'organizer': self.request.event.organizer.slug,
|
||||||
}) + '?token=' + self.generate_token(user),
|
}) + '?id=%d&token=%s' % (user.id, default_token_generator.make_token(user)),
|
||||||
},
|
},
|
||||||
self.request.event, locale=user.locale
|
self.request.event, locale=user.locale
|
||||||
)
|
)
|
||||||
@@ -216,9 +211,8 @@ class EventRecover(EventViewMixin, TemplateView):
|
|||||||
|
|
||||||
error_messages = {
|
error_messages = {
|
||||||
'invalid': _('You clicked on an invalid link. Please check that you copied the full '
|
'invalid': _('You clicked on an invalid link. Please check that you copied the full '
|
||||||
'web address into your address bar.'),
|
'web address into your address bar. Please note that the link is only valid '
|
||||||
'expired': _('This password recovery link has expired. Please request a new e-mail and '
|
'for three days and that the link can only be used once.'),
|
||||||
'use the recovery link within 24 hours.'),
|
|
||||||
'unknownuser': _('We were unable to find the user you requested a new password for.')
|
'unknownuser': _('We were unable to find the user you requested a new password for.')
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -228,22 +222,13 @@ class EventRecover(EventViewMixin, TemplateView):
|
|||||||
organizer=self.request.event.organizer.slug,
|
organizer=self.request.event.organizer.slug,
|
||||||
event=self.request.event.slug)
|
event=self.request.event.slug)
|
||||||
try:
|
try:
|
||||||
self.get_user()
|
user = User.objects.get(id=self.request.GET.get('id'))
|
||||||
except User.DoesNotExist:
|
except User.DoesNotExist:
|
||||||
return self.invalid('unknownuser')
|
return self.invalid('unknownuser')
|
||||||
except SignatureExpired:
|
if not default_token_generator.check_token(user, self.request.GET.get('token')):
|
||||||
return self.invalid('expired')
|
|
||||||
except BadSignature:
|
|
||||||
return self.invalid('invalid')
|
return self.invalid('invalid')
|
||||||
return super().get(request, *args, **kwargs)
|
return super().get(request, *args, **kwargs)
|
||||||
|
|
||||||
def get_user(self):
|
|
||||||
token = signing.loads(self.request.GET.get('token', ''),
|
|
||||||
max_age=3600 * 24)
|
|
||||||
if token['type'] != 'reset':
|
|
||||||
raise BadSignature()
|
|
||||||
return User.objects.get(id=token['user'])
|
|
||||||
|
|
||||||
def invalid(self, msg):
|
def invalid(self, msg):
|
||||||
messages.error(self.request, self.error_messages[msg])
|
messages.error(self.request, self.error_messages[msg])
|
||||||
return redirect('presale:event.forgot',
|
return redirect('presale:event.forgot',
|
||||||
@@ -253,17 +238,14 @@ class EventRecover(EventViewMixin, TemplateView):
|
|||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs):
|
||||||
if self.form.is_valid():
|
if self.form.is_valid():
|
||||||
try:
|
try:
|
||||||
user = self.get_user()
|
user = User.objects.get(id=self.request.GET.get('id'))
|
||||||
except User.DoesNotExist:
|
except User.DoesNotExist:
|
||||||
return self.invalid('unknownuser')
|
return self.invalid('unknownuser')
|
||||||
except SignatureExpired:
|
if not default_token_generator.check_token(user, self.request.GET.get('token')):
|
||||||
return self.invalid('expired')
|
|
||||||
except BadSignature:
|
|
||||||
return self.invalid('invalid')
|
return self.invalid('invalid')
|
||||||
else:
|
user.set_password(self.form.cleaned_data['password'])
|
||||||
user.set_password(self.form.cleaned_data['password'])
|
user.save()
|
||||||
user.save()
|
messages.success(request, _('You can now login using your new password.'))
|
||||||
messages.success(request, _('You can now login using your new password.'))
|
|
||||||
return redirect('presale:event.checkout.login',
|
return redirect('presale:event.checkout.login',
|
||||||
organizer=self.request.event.organizer.slug,
|
organizer=self.request.event.organizer.slug,
|
||||||
event=self.request.event.slug)
|
event=self.request.event.slug)
|
||||||
|
|||||||
Reference in New Issue
Block a user