Compare commits
3 commits
Author | SHA1 | Date | |
---|---|---|---|
|
0065d0cdec | ||
|
78f1013ab1 | ||
|
377cad94ae |
13 changed files with 171 additions and 8 deletions
0
allauth_archiens/__init__.py
Normal file
0
allauth_archiens/__init__.py
Normal file
6
allauth_archiens/admin.py
Normal file
6
allauth_archiens/admin.py
Normal file
|
@ -0,0 +1,6 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
8
allauth_archiens/apps.py
Normal file
8
allauth_archiens/apps.py
Normal file
|
@ -0,0 +1,8 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class AllauthArchiensConfig(AppConfig):
|
||||
name = 'allauth_archiens'
|
0
allauth_archiens/migrations/__init__.py
Normal file
0
allauth_archiens/migrations/__init__.py
Normal file
6
allauth_archiens/models.py
Normal file
6
allauth_archiens/models.py
Normal file
|
@ -0,0 +1,6 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import models
|
||||
|
||||
# Create your models here.
|
80
allauth_archiens/provider.py
Normal file
80
allauth_archiens/provider.py
Normal file
|
@ -0,0 +1,80 @@
|
|||
from allauth_ens.providers.clipper.provider import ClipperProvider
|
||||
import ldap
|
||||
|
||||
class LongTermClipperProvider(ClipperProvider):
|
||||
id = 'longterm_clipper'
|
||||
|
||||
def extract_uid(self, data):
|
||||
# Normalize UID
|
||||
uid, _ = data
|
||||
uid = uid.lower().strip()
|
||||
more_data = self.get_ldap_infos(uid)
|
||||
uid = "%s_%s" % (uid, more_data.get("annee", "00"))
|
||||
print(uid)
|
||||
return uid
|
||||
|
||||
def get_ldap_infos(self, clipper):
|
||||
if hasattr(self, "_ldap_infos"):
|
||||
return self._ldap_infos
|
||||
data = {}
|
||||
assert clipper.isalnum()
|
||||
try:
|
||||
ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT,
|
||||
ldap.OPT_X_TLS_NEVER)
|
||||
l = ldap.initialize("ldaps://ldap.spi.ens.fr:636")
|
||||
l.set_option(ldap.OPT_REFERRALS, 0)
|
||||
l.set_option(ldap.OPT_PROTOCOL_VERSION, 3)
|
||||
l.set_option(ldap.OPT_X_TLS, ldap.OPT_X_TLS_DEMAND)
|
||||
l.set_option(ldap.OPT_X_TLS_DEMAND, True)
|
||||
l.set_option(ldap.OPT_DEBUG_LEVEL, 255)
|
||||
l.set_option(ldap.OPT_NETWORK_TIMEOUT, 10)
|
||||
l.set_option(ldap.OPT_TIMEOUT, 10)
|
||||
|
||||
info = l.search_s('dc=spi,dc=ens,dc=fr',
|
||||
ldap.SCOPE_SUBTREE,
|
||||
('(uid=%s)' % (clipper,)),
|
||||
[str("cn"),
|
||||
str("mailRoutingAddress"),
|
||||
str("homeDirectory") ])
|
||||
|
||||
if len(info) > 0:
|
||||
infos = info[0][1]
|
||||
|
||||
# Nom
|
||||
data['nom'] = infos.get('cn', [''])[0].decode("utf-8")
|
||||
|
||||
# Parsing du homeDirectory pour la promotion
|
||||
annee = '00'
|
||||
promotion = 'Inconnue'
|
||||
|
||||
if 'homeDirectory' in infos:
|
||||
dirs = infos['homeDirectory'][0].split('/')
|
||||
if dirs[1] == 'users':
|
||||
annee = dirs[2]
|
||||
dep = dirs[3]
|
||||
dep = dict(DEPARTEMENTS_DEFAUT).get(dep.lower(), '')
|
||||
promotion = u'%s %s' % (dep, annee)
|
||||
data['annee'] = annee
|
||||
data['promotion'] = promotion
|
||||
|
||||
# Mail
|
||||
pmail = infos.get('mailRoutingAddress', [])
|
||||
data['email'] = '{}@clipper.ens.fr'.format(clipper.strip().lower()) if len(pmail) == 0 else pmail[0]
|
||||
|
||||
|
||||
except ldap.LDAPError:
|
||||
pass
|
||||
|
||||
self._ldap_infos = data
|
||||
return data
|
||||
|
||||
def extract_common_fields(self, data):
|
||||
common = super(ClipperProvider, self).extract_common_fields(data)
|
||||
infos = self.get_ldap_infos(common['username'])
|
||||
common['email'] = infos.get('email',
|
||||
'{}@clipper.ens.fr'.format(common['username'].strip().lower()))
|
||||
common['name'] = infos.get('nom', common['username'])
|
||||
return common
|
||||
|
||||
|
||||
provider_classes = [LongTermClipperProvider]
|
6
allauth_archiens/tests.py
Normal file
6
allauth_archiens/tests.py
Normal file
|
@ -0,0 +1,6 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
6
allauth_archiens/urls.py
Normal file
6
allauth_archiens/urls.py
Normal file
|
@ -0,0 +1,6 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from allauth_cas.urls import default_urlpatterns
|
||||
|
||||
from .provider import LongTermClipperProvider
|
||||
|
||||
urlpatterns = default_urlpatterns(LongTermClipperProvider)
|
15
allauth_archiens/views.py
Normal file
15
allauth_archiens/views.py
Normal file
|
@ -0,0 +1,15 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from allauth_cas import views
|
||||
|
||||
from .provider import LongTermClipperProvider
|
||||
|
||||
|
||||
class LongTermClipperCASAdapter(views.CASAdapter):
|
||||
provider_id = LongTermClipperProvider.id
|
||||
url = 'https://cas.eleves.ens.fr'
|
||||
version = 3
|
||||
|
||||
|
||||
login = views.CASLoginView.adapter_view(LongTermClipperCASAdapter)
|
||||
callback = views.CASCallbackView.adapter_view(LongTermClipperCASAdapter)
|
||||
logout = views.CASLogoutView.adapter_view(LongTermClipperCASAdapter)
|
|
@ -9,7 +9,7 @@ v1_api.register(api.AuteurResource())
|
|||
|
||||
urlpatterns = [
|
||||
url(r'^$', views.index, name='index'),
|
||||
url(r'^perso/$', views.perso, name='perso'),
|
||||
url(r'^compte/profil/$', views.perso, name='perso'),
|
||||
url(r'^faq/$', views.faq, name='faq'),
|
||||
url(r'^stage/nouveau/$', views.manage_stage, name='stage_ajout'),
|
||||
url(r'^stage/(?P<pk>\w+)/$', views.StageView.as_view(), name='stage'),
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
#coding: utf-8
|
||||
"""
|
||||
Django settings for experiENS project.
|
||||
|
||||
|
@ -11,6 +12,7 @@ https://docs.djangoproject.com/en/1.7/ref/settings/
|
|||
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
||||
import os
|
||||
from django.core.urlresolvers import reverse_lazy
|
||||
from django.contrib import messages
|
||||
|
||||
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
|
||||
|
||||
|
@ -29,11 +31,20 @@ INSTALLED_APPS = (
|
|||
'django.contrib.messages',
|
||||
'django.contrib.staticfiles',
|
||||
'django.contrib.gis',
|
||||
'django.contrib.sites',
|
||||
|
||||
'django_elasticsearch_dsl',
|
||||
|
||||
'widget_tweaks',
|
||||
'allauth_ens',
|
||||
'allauth',
|
||||
'allauth.account',
|
||||
'allauth.socialaccount',
|
||||
'allauth_cas',
|
||||
# 'allauth_ens.providers.clipper',
|
||||
'allauth_archiens',
|
||||
|
||||
'tastypie',
|
||||
'django_cas_ng',
|
||||
'braces',
|
||||
'tinymce',
|
||||
'taggit',
|
||||
|
@ -67,6 +78,7 @@ TEMPLATES = [
|
|||
'django.template.context_processors.static',
|
||||
'django.template.context_processors.tz',
|
||||
'django.contrib.messages.context_processors.messages',
|
||||
'django.template.context_processors.request',
|
||||
],
|
||||
},
|
||||
},
|
||||
|
@ -101,9 +113,12 @@ STATIC_URL = '/static/'
|
|||
|
||||
AUTHENTICATION_BACKENDS = (
|
||||
'django.contrib.auth.backends.ModelBackend',
|
||||
'experiENS.auth.ENSCASBackend',
|
||||
'allauth.account.auth_backends.AuthenticationBackend',
|
||||
# 'experiENS.auth.ENSCASBackend',
|
||||
)
|
||||
|
||||
SITE_ID = 1
|
||||
|
||||
CAS_SERVER_URL = "https://cas.eleves.ens.fr/" #SPI CAS
|
||||
CAS_VERIFY_URL = "https://cas.eleves.ens.fr/"
|
||||
CAS_IGNORE_REFERER = True
|
||||
|
@ -114,3 +129,19 @@ CAS_VERSION = 'CAS_2_SAML_1_0'
|
|||
|
||||
LOGIN_URL = reverse_lazy('login')
|
||||
LOGOUT_URL = reverse_lazy('logout')
|
||||
LOGIN_REDIRECT_URL = reverse_lazy('avisstage:perso')
|
||||
ACCOUNT_HOME_URL = reverse_lazy('avisstage:perso')
|
||||
ACCOUNT_DETAILS_URL = reverse_lazy('avisstage:profil_edit')
|
||||
|
||||
SOCIALACCOUNT_PROVIDERS = {
|
||||
# …
|
||||
|
||||
'clipper': {
|
||||
|
||||
# These settings control whether a message containing a link to
|
||||
# disconnect from the CAS server is added when users log out.
|
||||
'MESSAGE_SUGGEST_LOGOUT_ON_LOGOUT': True,
|
||||
'MESSAGE_SUGGEST_LOGOUT_ON_LOGOUT_LEVEL': messages.INFO,
|
||||
|
||||
},
|
||||
}
|
||||
|
|
|
@ -2,13 +2,17 @@ from django.conf import settings
|
|||
from django.conf.urls import include, url
|
||||
from django.contrib import admin
|
||||
|
||||
from django_cas_ng import views as django_cas_views
|
||||
#from django_cas_ng import views as django_cas_views
|
||||
from allauth_ens.views import capture_login, capture_logout
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^', include('avisstage.urls', namespace='avisstage')),
|
||||
url(r'^compte/', include('allauth.urls')),
|
||||
|
||||
url(r'^login/$', django_cas_views.login, name = "login"),
|
||||
url(r'^logout/$', django_cas_views.logout, name = "logout"),
|
||||
url(r'^login/$', capture_login, name="login"),
|
||||
url(r'^logout/$', capture_logout, name="logout"),
|
||||
# url(r'^login/$', django_cas_views.login, name = "login"),
|
||||
# url(r'^logout/$', django_cas_views.logout, name = "logout"),
|
||||
url(r'^tinymce/', include('tinymce.urls')),
|
||||
url(r'^taggit_autosuggest/', include('taggit_autosuggest.urls')),
|
||||
url(r'^admin/', include(admin.site.urls)),
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
django
|
||||
django==1.11.*
|
||||
django-cas-ng
|
||||
django-taggit
|
||||
python-ldap
|
||||
|
@ -8,4 +8,5 @@ django-taggit-autosuggest
|
|||
pytz
|
||||
django-tastypie
|
||||
lxml
|
||||
git+https://github.com/sabricot/django-elasticsearch-dsl
|
||||
git+https://github.com/sabricot/django-elasticsearch-dsl#egg=django_elasticsearch_dsl
|
||||
django-allauth-ens
|
||||
|
|
Loading…
Reference in a new issue