Skip to content
Snippets Groups Projects
Select Git revision
  • 1c82540aeea7636a6cfd25acfdd28c1029f5669f
  • main default protected
  • 75389691-a67c-422a-91e9-aa58bfb5-main-patch-32205
  • test-pipe
  • extended-scripts
  • structured-badges
  • guix-pipeline
  • cabal-pipeline
8 results

CheckMap.hs

Blame
  • 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)