+ service = form.cleaned_data.get('service', None)
+ try:
+ auth_args = dict(username=form.cleaned_data['username'],
+ password=form.cleaned_data['password'])
+ if merge:
+ # We only want to send the merge argument if it's
+ # True. If it it's False, we want it to propagate
+ # through the auth backends properly.
+ auth_args['merge'] = merge
+ user = authenticate(**auth_args)
+ except:
+ # Need to merge the accounts?
+ if merge:
+ # We shouldn't get here...
+ raise
+ else:
+ base_url = reverse('cas_provider_merge')
+ args = dict(
+ success_redirect=success_redirect,
+ username=form.cleaned_data['username'],
+ )
+ if service is not None:
+ args['service'] = service
+ args = urlencode(args)
+
+ url = '%s?%s' % (base_url, args)
+ logging.debug('Redirecting to %s', url)
+ return HttpResponseRedirect(url)
+
+ if user is None:
+ errors.append(_('Incorrect username and/or password.'))
+ else:
+ if user.is_active:
+ auth_login(request, user)
+
+ else: # Not a POST...
+ if merge:
+ form = MergeLoginForm(initial={'service': service, 'username': request.GET.get('username')})
+ else:
+ form = LoginForm(initial={'service': service})
+
+ if user is not None and user.is_authenticated:
+ # We have an authenticated user.
+ if not user.is_active:
+ errors.append(_('This account is disabled. Please contact us if you feel it should be enabled again.'))
+ else:
+ # Send the on_cas_login signal. If we get an HttpResponse, return that.
+ for receiver, response in signals.on_cas_login.send(sender=login, request=request, **kwargs):
+ if isinstance(response, HttpResponse):
+ return response
+
+ if service is None:
+ # Try and pull the service off the session
+ service = request.session.pop('service', service)
+
+ signals.on_cas_login_success.send(sender=login, request=request,
+ service=service, **kwargs)
+
+ if service is None:
+ # Normal internal success redirection.
+ logging.debug('Redirecting to %s', success_redirect)
+ return HttpResponseRedirect(success_redirect)
+ else:
+ if request.GET.get('warn', False):
+ return render(request, warn_template_name, {
+ 'service': service,
+ 'warn': False
+ })
+
+ # Create a service ticket and redirect to the service.