server/src/remie/cas.py
author ymh <ymh.work@gmail.com>
Wed, 16 Sep 2015 22:22:17 +0200
changeset 144 2e0b20ef77ce
parent 142 8d5035e5adaf
child 147 51e129ee6086
permissions -rw-r--r--
Added tag 00.00.20 for changeset f0d620be6ee2

from django.utils.six.moves import urllib_parse
from django.utils.six.moves.urllib_request import urlopen, Request
from django_cas_ng.cas import CASClientV2
import logging


logger = logging.getLogger(__name__)


class CASClientRemie(CASClientV2):

    def verify_ticket(self, ticket):
        """Verifies CAS 2.0+ XML-based authentication ticket."""
        try:
            from xml.etree import ElementTree
        except ImportError:
            from elementtree import ElementTree

        user = None
        pgtiou = None

        params = [('ticket', ticket), ('service', self.service_url)]
        if self.proxy_callback:
            params.append(('pgtUrl', self.proxy_callback))

        url = (urllib_parse.urljoin(self.server_url, 'serviceValidate') + '?' +
               urllib_parse.urlencode(params))
        page = urlopen(url)
        try:
            response = page.read()
            logger.debug("Verify CAS response : ")
            logger.debug(response)
            tree = ElementTree.fromstring(response)
            if tree[0].tag.endswith('authenticationSuccess'):
                attributes = {}
                for element in tree[0]:
                    if element.tag.endswith('user'):
                        user = element.text
                    elif element.tag.endswith(':nom'):
                        attributes['last_name'] = element.text
                    elif element.tag.endswith(':prenom'):
                        attributes['first_name'] = element.text
                    elif element.tag.endswith('proxyGrantingTicket'):
                        pgtiou = element.text
                return user, attributes, pgtiou
            else:
                return None, None, None
        finally:
            page.close()