1
|
import sys
|
2
|
from quixote import get_response, redirect
|
3
|
from quixote.directory import Directory
|
4
|
from quixote.errors import TraversalError
|
5
|
|
6
|
import admin
|
7
|
import liberty
|
8
|
import saml2
|
9
|
|
10
|
import errors
|
11
|
import logger
|
12
|
import misc
|
13
|
import template
|
14
|
from form import *
|
15
|
|
16
|
from users import User
|
17
|
|
18
|
class SiteUI(Directory):
|
19
|
|
20
|
_q_exports = ["", "login", "liberty"]
|
21
|
|
22
|
liberty = liberty.RootDirectory()
|
23
|
|
24
|
def __init__(self, component):
|
25
|
self.name = component
|
26
|
|
27
|
def _q_index(self):
|
28
|
return 'todo'
|
29
|
|
30
|
def login [html] (self):
|
31
|
logger.info('login')
|
32
|
idps = misc.cfg.get('idp', {})
|
33
|
|
34
|
if len(idps) == 0:
|
35
|
return template.error_page(_('SSO support is not yet configured'))
|
36
|
|
37
|
if len(idps) == 1 or len([x for x in idps.values() if not x.get('hide', False)]) == 1:
|
38
|
# if there is only one visible IdP, perform login automatically on
|
39
|
# this one.
|
40
|
server = misc.get_lasso_server('liberty')
|
41
|
for x in server.providerIds:
|
42
|
key_provider_id = x.replace(str('://'), str('-')).replace(str('/'), str('-'))
|
43
|
if not idps.get(key_provider_id, {}).get('hide', False):
|
44
|
return self.liberty.perform_login(x)
|
45
|
|
46
|
server = misc.get_lasso_server('saml2')
|
47
|
for x in server.providerIds:
|
48
|
key_provider_id = x.replace(str('://'), str('-')).replace(str('/'), str('-'))
|
49
|
if not idps.get(key_provider_id, {}).get('hide', False):
|
50
|
return self.saml.perform_login(x)
|
51
|
|
52
|
form = Form(enctype='multipart/form-data')
|
53
|
options = []
|
54
|
# XXX: use intro cookie to get preferred value
|
55
|
value = None
|
56
|
providers = {}
|
57
|
for kidp, idp in misc.cfg.get('idp', {}).items():
|
58
|
if idp.get('hide'):
|
59
|
continue
|
60
|
p = lasso.Provider(lasso.PROVIDER_ROLE_IDP,
|
61
|
misc.get_abs_path(idp['metadata']),
|
62
|
misc.get_abs_path(idp['publickey']), None)
|
63
|
providers[p.providerId] = p
|
64
|
|
65
|
include_protocol = True
|
66
|
if len([x for x in providers.values() if
|
67
|
x.getProtocolConformance() == lasso.PROTOCOL_SAML_2_0]) in (0, len(providers)):
|
68
|
include_protocol = False
|
69
|
|
70
|
for p in providers.values():
|
71
|
label = misc.get_provider_label(p)
|
72
|
if include_protocol:
|
73
|
if p.getProtocolConformance() == lasso.PROTOCOL_SAML_2_0:
|
74
|
label = '%s (SAML 2.0)' % label
|
75
|
else:
|
76
|
label = '%s (Liberty ID-FF 1.2)' % label
|
77
|
options.append((p.providerId, label))
|
78
|
if not value:
|
79
|
value = p.providerId
|
80
|
form.add(RadiobuttonsWidget, 'idp', value = value, options = options, delim = '<br/>')
|
81
|
form.add_submit('submit', _('Submit'))
|
82
|
|
83
|
if form.is_submitted() and not form.has_errors():
|
84
|
idp = form.get_widget('idp').parse()
|
85
|
p = providers[form.get_widget('idp').parse()]
|
86
|
if p.getProtocolConformance() == lasso.PROTOCOL_SAML_2_0:
|
87
|
return self.saml.perform_login(idp)
|
88
|
else:
|
89
|
return self.liberty.perform_login(idp)
|
90
|
|
91
|
template.html_top(_('Login'))
|
92
|
'<p>%s</p>' % _('Select the identity provider you want to use.')
|
93
|
form.render()
|