+ return _cas2_error_response(INVALID_TICKET)
+
+ if ticket.service != service:
+ return _cas2_error_response(INVALID_SERVICE)
+
+
+ pgtIouId = None
+ proxies = ()
+ if pgtUrl is not None:
+ pgt = generate_proxy_granting_ticket(pgtUrl, ticket)
+ if pgt:
+ pgtIouId = pgt.pgtiou
+
+ while pgt:
+ proxies += (pgt.serviceTicket.service,)
+ pgt = pgt.serviceTicket.proxyGrantingTicket if hasattr(pgt.serviceTicket, 'proxyGrantingTicket') else None
+
+
+ user = ticket.user
+ return _cas2_sucess_response(user, pgtIouId, proxies)
+
+
+def service_validate(request):
+ """Validate ticket via CAS v.2 protocol"""
+ service = request.GET.get('service', None)
+ ticket_string = request.GET.get('ticket', None)
+ pgtUrl = request.GET.get('pgtUrl', None)
+ if ticket_string.startswith('PT-'):
+ return _cas2_error_response(INVALID_TICKET, "serviceValidate cannot verify proxy tickets")
+ else:
+ return ticket_validate(service, ticket_string, pgtUrl)
+
+
+def proxy_validate(request):
+ """Validate ticket via CAS v.2 protocol"""
+ service = request.GET.get('service', None)
+ ticket_string = request.GET.get('ticket', None)
+ pgtUrl = request.GET.get('pgtUrl', None)
+ return ticket_validate(service, ticket_string, pgtUrl)
+
+def generate_proxy_granting_ticket(pgt_url, ticket):
+ proxy_callback_good_status = (200, 202, 301, 302, 304)
+ uri = list(urlparse.urlsplit(pgt_url))
+
+ pgt = ProxyGrantingTicket()
+ pgt.serviceTicket = ticket
+
+ if hasattr(ticket, 'proxyGrantingTicket'):
+ # here we got a proxy ticket! tata!
+ pgt.pgt = ticket.proxyGrantingTicket
+
+ params = {'pgtId': pgt.ticket, 'pgtIou': pgt.pgtiou}
+
+ query = dict(urlparse.parse_qsl(uri[4]))
+ query.update(params)
+
+ uri[4] = urlencode(query)
+
+
+ try:
+ response = urllib2.urlopen(urlparse.urlunsplit(uri))
+ except urllib2.HTTPError, e:
+ if not e.code in proxy_callback_good_status:
+ return
+ except urllib2.URLError, e:
+ return
+
+ pgt.save()
+ return pgt
+
+
+def _cas2_proxy_success(pt):
+ return HttpResponse(proxy_success(pt))
+
+def _cas2_sucess_response(user, pgt = None, proxies = None):
+ return HttpResponse(auth_success_response(user, pgt, proxies), mimetype='text/xml')
+
+def _cas2_error_response(code, message = None):
+ return HttpResponse(u''''<cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas">
+ <cas:authenticationFailure code="%(code)s">
+ %(message)s