+
+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
+ pgt.targetService = pgt_url
+
+ 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[3] = 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">