1
|
# mandayejs - saml reverse proxy
|
2
|
# Copyright (C) 2015 Entr'ouvert
|
3
|
#
|
4
|
# This program is free software: you can redistribute it and/or modify it
|
5
|
# under the terms of the GNU Affero General Public License as published
|
6
|
# by the Free Software Foundation, either version 3 of the License, or
|
7
|
# (at your option) any later version.
|
8
|
#
|
9
|
# This program is distributed in the hope that it will be useful,
|
10
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
# GNU Affero General Public License for more details.
|
13
|
#
|
14
|
# You should have received a copy of the GNU Affero General Public License
|
15
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
16
|
|
17
|
from __future__ import unicode_literals
|
18
|
|
19
|
import os
|
20
|
from importlib import import_module
|
21
|
|
22
|
from django.conf import settings
|
23
|
from django.conf.urls import patterns, url
|
24
|
from django.http import Http404
|
25
|
from django.core.exceptions import ImproperlyConfigured
|
26
|
from django.core.urlresolvers import resolve
|
27
|
from django.utils.text import slugify
|
28
|
|
29
|
|
30
|
def get_app_settings():
|
31
|
module_name, app_settings = tuple(settings.SITE_APP.rsplit('.', 1))
|
32
|
module = import_module(module_name)
|
33
|
return getattr(module, app_settings)()
|
34
|
|
35
|
|
36
|
def app_web_services(request, path):
|
37
|
app = get_app_settings()
|
38
|
if hasattr(app, 'urlpatterns'):
|
39
|
view, args, kwargs = resolve(request.path, urlconf=app)
|
40
|
return view(request, *args, **kwargs)
|
41
|
raise Http404
|
42
|
|
43
|
|
44
|
# App Settings
|
45
|
class AppSettingsMeta(type):
|
46
|
|
47
|
REQUIRED_KEYS = [
|
48
|
'SITE_LOGIN_PATH',
|
49
|
'SITE_LOCATORS',
|
50
|
'SITE_AUTH_CHECKER',
|
51
|
'SITE_AUTH_COOKIE_KEYS',
|
52
|
]
|
53
|
|
54
|
def __new__(cls, name, bases, dct):
|
55
|
if name != 'AppSettings':
|
56
|
if AppSettings in bases: # Avoid checking keys for inherited classes
|
57
|
|
58
|
missing_key = set(cls.REQUIRED_KEYS).difference(set(dct.keys())) or None
|
59
|
if missing_key:
|
60
|
raise ImproperlyConfigured('{} is mandatory'.format(missing_key.pop()))
|
61
|
|
62
|
if not set(('SITE_FORCE_REDIRECT_URL', 'SITE_FORCE_REDIRECT_LOCATOR')).intersection(set(dct.keys())):
|
63
|
raise ImproperlyConfigured(
|
64
|
'one of these settings ({}) must be defined'
|
65
|
.format(('SITE_FORCE_REDIRECT_URL', 'SITE_FORCE_REDIRECT_LOCATOR')))
|
66
|
|
67
|
# Default form submit element
|
68
|
if not dct.get('SITE_FORM_SUBMIT_ELEMENT', None):
|
69
|
dct['SITE_FORM_SUBMIT_ELEMENT'] = 'input[type=submit], button'
|
70
|
|
71
|
return super(AppSettingsMeta, cls).__new__(cls, name, bases, dct)
|
72
|
|
73
|
|
74
|
class AppSettings(object):
|
75
|
__metaclass__ = AppSettingsMeta
|
76
|
|
77
|
def __getattribute__(self, name):
|
78
|
value = getattr(settings, name, None)
|
79
|
if value is not None:
|
80
|
return value
|
81
|
return super(AppSettings, self).__getattribute__(name)
|
82
|
|
83
|
def get_name(self):
|
84
|
name = getattr(settings, 'SITE_APP_NAME', None)
|
85
|
if name:
|
86
|
return name
|
87
|
return type(self).__name__
|
88
|
|
89
|
def get_slug(self):
|
90
|
return slugify(type(self).__name__)
|
91
|
|
92
|
|
93
|
# Test App Settings
|
94
|
class Test(AppSettings):
|
95
|
SITE_LOGIN_PATH = '/'
|
96
|
SITE_LOCATORS = [
|
97
|
{
|
98
|
'id': '#login',
|
99
|
'label': 'Login',
|
100
|
'name': 'login',
|
101
|
'kind': 'string',
|
102
|
},
|
103
|
{
|
104
|
'id': '#password',
|
105
|
'label': 'Password',
|
106
|
'name': 'password',
|
107
|
'kind': 'password'
|
108
|
}
|
109
|
]
|
110
|
SITE_AUTH_CHECKER = 'js/test/auth.checker.js'
|
111
|
SITE_AUTH_COOKIE_KEYS = ['test']
|
112
|
SITE_FORCE_REDIRECT_URL = '/whatever'
|
113
|
|
114
|
|
115
|
# Duonet App Settings
|
116
|
class Duonet(AppSettings):
|
117
|
SITE_LOGIN_PATH = '/'
|
118
|
SITE_LOCATORS = [
|
119
|
{
|
120
|
'id': '#txtNomFoyer',
|
121
|
'label': 'Nom de famille',
|
122
|
'name': 'txtNomFoyer',
|
123
|
'kind': 'string',
|
124
|
'required': True,
|
125
|
'help': '',
|
126
|
},
|
127
|
{
|
128
|
'id': '#txtDateNaissance',
|
129
|
'label': 'Date de naissance',
|
130
|
'name': 'txtDateNaissance',
|
131
|
'kind': 'date',
|
132
|
'required': True,
|
133
|
'help': 'exemple 16/06/2008'
|
134
|
},
|
135
|
{
|
136
|
'id': '#txtCode',
|
137
|
'label': 'Mot de passe',
|
138
|
'name': 'txtCode',
|
139
|
'kind': 'password',
|
140
|
'required': True,
|
141
|
'help': ''
|
142
|
},
|
143
|
]
|
144
|
SITE_AUTH_CHECKER = 'duonet/js/auth.checker.js'
|
145
|
SITE_AUTH_COOKIE_KEYS = [
|
146
|
'ASP.NET_SessionId',
|
147
|
]
|
148
|
SITE_APP_SCRIPTS = [
|
149
|
'duonet/js/duonet.js',
|
150
|
]
|
151
|
|
152
|
SITE_FORCE_REDIRECT_URL = '/Connect.aspx'
|
153
|
|
154
|
SITE_FORM_SUBMIT_ELEMENT = 'input[type=submit]'
|
155
|
|
156
|
SITE_LOGOUT_LOCATOR = '#lnkDisconnect'
|
157
|
|
158
|
|
159
|
# Archimed App Settings
|
160
|
class Archimed(AppSettings):
|
161
|
SITE_LOGIN_PATH = '/'
|
162
|
SITE_LOCATORS = [
|
163
|
{
|
164
|
'id': '#carte',
|
165
|
'label': 'Identifiant',
|
166
|
'name': 'carte',
|
167
|
'kind': 'string',
|
168
|
'required': True,
|
169
|
'help': '',
|
170
|
},
|
171
|
{
|
172
|
'id': '#code',
|
173
|
'label': 'Mot de passe',
|
174
|
'name': 'code',
|
175
|
'kind': 'password',
|
176
|
'required': True,
|
177
|
'help': ''
|
178
|
},
|
179
|
]
|
180
|
SITE_AUTH_CHECKER = 'archimed/js/auth.checker.js'
|
181
|
SITE_AUTH_COOKIE_KEYS = [
|
182
|
'S_ARCHIMED_CRYSTAL_AUTH'
|
183
|
]
|
184
|
|
185
|
SITE_APP_SCRIPTS = [
|
186
|
'archimed/js/archimed.js'
|
187
|
]
|
188
|
|
189
|
SITE_FORCE_REDIRECT_LOCATOR = '.connectBox'
|
190
|
|
191
|
SITE_WS_ENDPOINT = {
|
192
|
'account_details': '/DEFAULT/Ermes/Services/ILSClient.svc/RetrieveAccount',
|
193
|
}
|
194
|
|
195
|
urlpatterns = patterns(
|
196
|
'',
|
197
|
url(
|
198
|
r'account/(?P<username>\w+)/$',
|
199
|
'mandayejs.applications.views.archimed_account_details',
|
200
|
name='archimed-account-details'),
|
201
|
)
|
202
|
|
203
|
SITE_LOGOUT_LOCATOR = '.account_logoff'
|
204
|
|
205
|
|
206
|
# Arpege App Settings
|
207
|
class Arpege(AppSettings):
|
208
|
SITE_LOGIN_PATH = '/index.do'
|
209
|
SITE_LOCATORS = [
|
210
|
{
|
211
|
'id': '#cdfmll',
|
212
|
'label': 'Code famille',
|
213
|
'name': 'cdfmll',
|
214
|
'kind': 'string',
|
215
|
'required': True,
|
216
|
'help': '',
|
217
|
},
|
218
|
{
|
219
|
'id': '#mtdpss',
|
220
|
'label': 'Mot de passe',
|
221
|
'name': 'mtdpss',
|
222
|
'kind': 'password',
|
223
|
'required': True,
|
224
|
'help': '',
|
225
|
}
|
226
|
]
|
227
|
SITE_AUTH_CHECKER = 'arpege/js/auth.checker.js'
|
228
|
SITE_AUTH_COOKIE_KEYS = [
|
229
|
'JSESSIONID',
|
230
|
]
|
231
|
|
232
|
SITE_APP_SCRIPTS = [
|
233
|
'arpege/js/arpege.js',
|
234
|
]
|
235
|
|
236
|
SITE_FORCE_REDIRECT_LOCATOR = '.formulaire'
|
237
|
|
238
|
SITE_LOGOUT_LOCATOR = '#espace-login form input[type=submit]'
|
239
|
|
240
|
|
241
|
class Imuse(AppSettings):
|
242
|
SITE_LOGIN_PATH = 'extranet/login/gen_index_groupe.php?nav=autre'
|
243
|
|
244
|
SITE_LOCATORS = [
|
245
|
{
|
246
|
'id': '#INDEX_USER_ID',
|
247
|
'label': 'Identifiant',
|
248
|
'name': 'INDEX_USER_ID',
|
249
|
'kind': 'string',
|
250
|
'required': True,
|
251
|
'help': ''
|
252
|
},
|
253
|
{
|
254
|
'id': '#INDEX_USER_PWD',
|
255
|
'label': 'Mot de passe',
|
256
|
'name': 'INDEX_USER_PWD',
|
257
|
'kind': 'password',
|
258
|
'required': True,
|
259
|
'help': ''
|
260
|
}
|
261
|
]
|
262
|
|
263
|
SITE_AUTH_CHECKER = 'imuse/js/auth.checker.js'
|
264
|
|
265
|
SITE_AUTH_COOKIE_KEYS = [
|
266
|
'iMuse-extranet'
|
267
|
]
|
268
|
|
269
|
SITE_FORCE_REDIRECT_LOCATOR = '#INDEX_TBL_LOGIN'
|
270
|
|
271
|
SITE_FORM_SUBMIT_ELEMENT = '#INDEX_BT_LOGIN'
|
272
|
|
273
|
|
274
|
class Sezhame(AppSettings):
|
275
|
SITE_LOGIN_PATH = '/sezhame/page/connexion-abonne?destination=user'
|
276
|
|
277
|
SITE_LOCATORS = [
|
278
|
{
|
279
|
'id': '#edit-user',
|
280
|
'label': 'Numero de cqrte',
|
281
|
'name': 'edit-user',
|
282
|
'kind': 'string',
|
283
|
'required': True,
|
284
|
'help': ''
|
285
|
},
|
286
|
{
|
287
|
'id': '#edit-password',
|
288
|
'label': 'Mot de passe',
|
289
|
'name': 'edit-password',
|
290
|
'kind': 'password',
|
291
|
'required': True,
|
292
|
'help': ''
|
293
|
}
|
294
|
]
|
295
|
|
296
|
SITE_AUTH_CHECKER = 'sezhame/js/auth.checker.js'
|
297
|
|
298
|
SITE_AUTH_COOKIE_KEYS = [
|
299
|
'SESSf36da25307ad6240a58ddd4f4b138952',
|
300
|
'ASPSESSIONIDQSDRASTR'
|
301
|
]
|
302
|
|
303
|
SITE_FORCE_REDIRECT_LOCATOR = '#dk-opac15-login-form'
|
304
|
|
305
|
|
306
|
class Teamnet(AppSettings):
|
307
|
SITE_LOGIN_PATH = '/auth/teamnetauth'
|
308
|
|
309
|
SITE_LOCATORS = [
|
310
|
{
|
311
|
'id': '#login',
|
312
|
'label': 'Mon identifiant',
|
313
|
'name': 'login',
|
314
|
'kind': 'string',
|
315
|
'required': True,
|
316
|
'help': ''
|
317
|
},
|
318
|
{
|
319
|
'id': '#mdp',
|
320
|
'label': 'Mon mot de passe',
|
321
|
'name': 'mdp',
|
322
|
'kind': 'password',
|
323
|
'required': True,
|
324
|
'help': ''
|
325
|
}
|
326
|
]
|
327
|
|
328
|
SITE_FORM_SUBMIT_ELEMENT = "input[type=submit][value='Me connecter']"
|
329
|
|
330
|
SITE_AUTH_CHECKER = 'teamnet/js/auth.checker.js'
|
331
|
|
332
|
SITE_AUTH_COOKIE_KEYS = [
|
333
|
'JSESSIONID',
|
334
|
]
|
335
|
|
336
|
SITE_FORCE_REDIRECT_LOCATOR = '#loginForm'
|
337
|
|
338
|
SITE_LOGOUT_LOCATOR = ".infoUtilisateur[alt=Deconnexion]"
|