+ return render_to_response(template_name, {'url': url}, \
+ context_instance=RequestContext(request))
+
+
+def service_validate(request):
+ """Validate ticket via CAS v.2 protocol"""
+ service = request.GET.get('service', None)
+ ticket_string = request.GET.get('ticket', None)
+ if service is None or ticket_string is None:
+ return _cas2_error_response(INVALID_REQUEST)
+
+ try:
+ ticket = ServiceTicket.objects.get(ticket=ticket_string)
+ except ServiceTicket.DoesNotExist:
+ return _cas2_error_response(INVALID_TICKET)
+
+ if settings.CAS_CHECK_SERVICE and ticket.service != service:
+ ticket.delete()
+ return _cas2_error_response(INVALID_SERVICE)
+
+ username = ticket.user.username
+ ticket.delete()
+ return _cas2_sucess_response(username)
+
+
+def _cas2_error_response(code):
+ return HttpResponse(u''''<cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
+ <cas:authenticationFailure code="%(code)s">
+ %(message)s
+ </cas:authenticationFailure>
+ </cas:serviceResponse>''' % {
+ 'code': code,
+ 'message': dict(ERROR_MESSAGES).get(code)
+ }, mimetype='text/xml')
+
+
+def _cas2_sucess_response(username):
+ return HttpResponse(u'''<cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
+ <cas:authenticationSuccess>
+ <cas:user>%(username)s</cas:user>
+ </cas:authenticationSuccess>
+ </cas:serviceResponse>''' % {'username': username}, mimetype='text/xml')