new iri django-cas-ng version, customize CASClient, update ldt to resize some user's fields
authorymh <ymh.work@gmail.com>
Wed, 16 Sep 2015 18:17:49 +0200
changeset 127 0de175cdcb7f
parent 126 d23705b04d7b
child 128 13ae6ab93b84
new iri django-cas-ng version, customize CASClient, update ldt to resize some user's fields
server/src/remie/apps.py
server/src/remie/cas.py
server/src/remieplt/settings/__init__.py
server/src/requirement.txt
server/virtualenv/res/lib/lib_create_env.py
server/virtualenv/res/src/django-cas-ng-3.4.2.tar.gz
--- a/server/src/remie/apps.py	Tue Sep 15 15:12:08 2015 +0200
+++ b/server/src/remie/apps.py	Wed Sep 16 18:17:49 2015 +0200
@@ -10,5 +10,4 @@
     verbose_name = 'REMIE'
 
     def ready(self):
-        from django_cas_ng import backends
-        backends._verify_cas2 = REMIE_verify_cas2
+        pass
--- a/server/src/remie/cas.py	Tue Sep 15 15:12:08 2015 +0200
+++ b/server/src/remie/cas.py	Wed Sep 16 18:17:49 2015 +0200
@@ -1,21 +1,31 @@
+from django.conf import settings
+from django.contrib.auth import get_user_model
 from django.utils.six.moves import urllib_parse
 from django.utils.six.moves.urllib_request import urlopen, Request
+from django_cas_ng.cas.CASClientV2
 import logging
 
+
 logger = logging.getLogger(__name__)
 
 
-def REMIE_verify_cas2(ticket, service):
-    """Verifies CAS 2.0+ XML-based authentication ticket.
-    Returns username on success and None on failure.
-    """
+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
 
-    params = [('ticket', ticket), ('service', service)]
-    url = (urllib_parse.urljoin(settings.CAS_SERVER_URL, 'serviceValidate') + '?' +
+    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:
@@ -24,8 +34,45 @@
         logger.debug(response)
         tree = ElementTree.fromstring(response)
         if tree[0].tag.endswith('authenticationSuccess'):
-            return tree[0][0].text, None
+            attributes = {}
+            for element in tree[0]:
+                if element.tag.endswith('user'):
+                    user = element.text
+                elif element.tag.endswith('nom'):
+                    attributes['lastname'] = element.text
+                elif element.tag.endswith('prenom'):
+                    attributes['firstname'] = element.text
+                elif element.tag.endswith('proxyGrantingTicket'):
+                    pgtiou = element.text
+            return user, attributes, pgtiou
         else:
-            return None, None
+            return None, None, None
     finally:
         page.close()
+
+    def get_or_create_user(self, username, attributes):
+        """get or create a user
+        Return (created, user).
+        The returned user can be `None`.
+        """
+        if not username:
+            return None, False
+
+        User = get_user_model()
+
+        if attributes is None:
+            attributes = {}
+
+        try:
+            user = User.objects.get(**{User.USERNAME_FIELD: username})
+            created = False
+        except User.DoesNotExist:
+            # check if we want to create new users, if we don't fail auth
+            create = getattr(settings, 'CAS_CREATE_USER', True)
+            if not create:
+                return None, False
+            # user will have an "unusable" password
+            user = User.objects.create_user(username=username, password='', firstname=attributes.get('firstname',''), lastname=attributes.get('lastname', ''))
+            user.save()
+            created = True
+        return created, user
--- a/server/src/remieplt/settings/__init__.py	Tue Sep 15 15:12:08 2015 +0200
+++ b/server/src/remieplt/settings/__init__.py	Wed Sep 16 18:17:49 2015 +0200
@@ -196,6 +196,7 @@
 EMPTY_MEDIA_EXTERNALID = None
 
 CAS_URLPARAMETER_NAME = "casticket"
+CAS_VERSION = "remie.cas.CASClientRemie"
 
 SOCIAL_AUTH_COMPLETE_URL_NAME  = 'complete'
 SOCIAL_AUTH_ASSOCIATE_URL_NAME = 'associate_complete'
@@ -241,6 +242,7 @@
 
 #Cors headers for API
 CORS_ORIGIN_ALLOW_ALL = True
+CORS_EXPOSE_HEADERS = ('Location',)
 
 
 MAX_TAG_LENGTH = 255
--- a/server/src/requirement.txt	Tue Sep 15 15:12:08 2015 +0200
+++ b/server/src/requirement.txt	Wed Sep 16 18:17:49 2015 +0200
@@ -1,1 +1,1 @@
-ldt (==1.59)
+ldt (==1.59.1)
--- a/server/virtualenv/res/lib/lib_create_env.py	Tue Sep 15 15:12:08 2015 +0200
+++ b/server/virtualenv/res/lib/lib_create_env.py	Wed Sep 16 18:17:49 2015 +0200
@@ -54,7 +54,7 @@
     'PYJWT' : { 'setup': 'pyjwt', 'url': 'https://github.com/jpadilla/pyjwt/archive/1.1.0.tar.gz', 'local' : 'pyjwt-1.1.0.tar.gz', 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}},
     'PYTHON-MIMEPARSE': { 'setup': 'python-mimeparse', 'url': 'https://pypi.python.org/packages/source/p/python-mimeparse/python-mimeparse-0.1.4.tar.gz', 'local' : 'python-mimeparse-0.1.4.tar.gz', 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}},
     'REQUESTS-OAUTHLIB': { 'setup': 'requests-oauthlib', 'url': 'https://github.com/requests/requests-oauthlib/archive/v0.5.0.tar.gz', 'local' : 'requests-oauthlib-0.5.0.tar.gz', 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}},
-    'DJANGO_CAS_NG': {'setup': 'django-cas-ng', 'url': 'https://github.com/mingchen/django-cas-ng/archive/v3.4.2.tar.gz', 'local':'django-cas-ng-3.4.2.tar.gz', 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}},
+    'DJANGO_CAS_NG': {'setup': 'django-cas-ng', 'url': 'https://github.com/IRI-Research/django-cas-ng/archive/customize-cas-client.tar.gz', 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}},
     'DJANGO_URL_SHORTENER': {'setup': 'django-url-shortener', 'url': 'https://github.com/IRI-Research/django-url-shortener/archive/0.1.1.tar.gz', 'local': 'django-url-shortener-0.1.1.tar.gz', 'install': {'method': 'pip', 'option_str': None, 'dict_extra_env': None}},
 }
 
Binary file server/virtualenv/res/src/django-cas-ng-3.4.2.tar.gz has changed