1. from django.http import HttpResponseRedirect
  2. from django.http import HttpResponseServerError
  3. from lxml import etree
  4. import urllib2
  5.  
  6. AUTH_URL = "https://webauth.arizona.edu/webauth"
  7. CAS_NS = {'cas': 'http://www.yale.edu/tp/cas'}
  8.  
  9. def webauth_required(function):
  10.   def _dec(view_func):
  11.     def _view(request, *args, **kwargs):
  12.       if request.session.get('webauth', False):
  13.         return view_func(request, *args, **kwargs)
  14.       ticket = request.GET.get("ticket", False)
  15.       if ticket:
  16.         try:
  17.           url = request.session.get('url', '')
  18.           handle = urllib2.urlopen(AUTH_URL + "/serviceValidate?service=" + url + "&ticket=" + ticket)
  19.         except IOError, e:
  20.           return HttpResponseServerError()
  21.     tree = etree.parse(handle)
  22.     request.session['webauth'] = len(tree.xpath('//cas:authenticationSuccess', namespaces=CAS_NS))
  23.     if request.session.get('webauth', False):
  24.       request.session['netid'] = tree.xpath('//cas:user', namespaces=CAS_NS)[0].text
  25.           return view_func(request, *args, **kwargs)
  26.       else:
  27.         request.session['url'] = urllib2.quote(request.build_absolute_uri())
  28.         return HttpResponseRedirect(AUTH_URL + "/login?service=" + request.session['url'])
  29.     _view.__name__ = view_func.__name__
  30.     _view.__dict__ = view_func.__dict__
  31.     _view.__doc__ = view_func.__doc__
  32.    
  33.     return _view
  34.   return _dec(function)
  35.  
  36.