Select Git revision
CheckMap.hs
auth.py 4.52 KiB
import logging
from django.conf import settings
from django.contrib import messages
from django.contrib.auth import login, views as auth_views
from django.contrib.sites.shortcuts import get_current_site
from django.core.mail import EmailMessage
from django.shortcuts import redirect, render
from django.template.loader import render_to_string
from django.urls import reverse, reverse_lazy
from django.utils.encoding import force_bytes, force_text
from django.utils.http import urlsafe_base64_decode, urlsafe_base64_encode
from core.models import PlatformUser, UserCommunicationChannel
from ..forms import SignUpForm
from ..tokens import channel_activation_token
from .utils import extend_context, get_conference
logger = logging.getLogger(__name__)
class LoginView(auth_views.LoginView):
template_name = 'backoffice/login.html'
def get_success_url(self):
return reverse('backoffice:index')
class LogoutView(auth_views.LogoutView):
next_page = reverse_lazy('backoffice:index')
def signup(request):
if request.method == 'POST':
form = SignUpForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.is_active = False
user.save()
channel = user.communication_channels.create(
channel=UserCommunicationChannel.Channel.MAIL,
address=form.cleaned_data['email'],
)
channel.save()
try:
subject = 'Activate Your RC3 Platform Account'
body = render_to_string('registration/account_activation_email.txt', {
'user': user,
'domain': get_current_site(request).domain,
'uid': urlsafe_base64_encode(force_bytes(user.pk)).decode('utf-8'),
'cid': channel.id,
'token': channel_activation_token.make_token(channel),
})
message = EmailMessage(
to=[user.email],
subject=subject,
body=body,
reply_to=settings.MAIL_REPLY_TO,
)
result = message.send()
logger.info('Sent account activation mail to "' + user.email + '" for ' + user.username + ' = ' + str(result))
return redirect('backoffice:account_activation_sent')
except Exception:
logger.exception('sending account activation mail failed')
user.delete()
else:
form = SignUpForm()
return render(request, 'registration/signup.html', extend_context(request, conference=None, context={
'form': form,
}))
def signup_done(request):
conference = get_conference(request)
if conference is None:
return redirect('backoffice:conference_selection')
return render(request, 'registration/signup_done.html', extend_context(request, conference=conference, context={
'active_page': 'profile',
}))
def signup_activate(request, uidb64, channel_id, token):
try:
uid = force_text(urlsafe_base64_decode(uidb64))
user = PlatformUser.objects.get(pk=uid)
channel = user.communication_channels.get(id=channel_id)
except Exception as err:
messages.warning(request, 'Invalid activation code.')
logger.warning(f'Account activation failed (user={user}, uidb64={uidb64}, channel={channel_id}, token={token}): {err}')
return redirect('backoffice:signup')
if not channel_activation_token.check_token(channel, token):
messages.warning(request, 'Invalid activation code.')
logger.warning(f'Account activation failed (user={user}, uidb64={uidb64}, channel={channel_id}, token={token}) due to invalid token.')
return redirect('backoffice:signup')
if channel.channel != UserCommunicationChannel.Channel.MAIL or user.email is None or user.email != channel.address:
messages.warning(request, 'Not an account registration.')
logger.warning(f'Account activation failed for non-registration-channel (user={user}, uidb64={uidb64}, channel={channel_id}, token={token})')
return redirect('backoffice:signup')
# first time registration: user.email was still set to the mail communication channel's address
user.is_active = True
user.email = None
channel.is_verified = True
user.save()
channel.save()
login(request, user)
messages.success(request, 'Activation code OK')
logger.info(f'Account activated successfully: {user.username}')
return redirect('backoffice:index', request=request)