Projet

Général

Profil

Télécharger (6,47 ko) Statistiques
| Branche: | Révision:

root / larpe / trunk / larpe / root.ptl @ ebf37dd5

1
import os
2
import lasso
3

    
4
from quixote import get_publisher, get_response, get_session, redirect, get_session_manager
5
from quixote.directory import Directory
6
from quixote.util import StaticDirectory
7

    
8
import admin
9
import liberty_root
10
import saml2
11

    
12
import errors
13
import logger
14
import misc
15
import template
16
from form import *
17

    
18
from users import User
19

    
20
import httplib
21
from quixote.form import Form, StringWidget, PasswordWidget, \
22
     RadiobuttonsWidget, SingleSelectWidget, MultipleSelectWidget, \
23
     CheckboxWidget, FileWidget
24

    
25
class RootDirectory(Directory):
26
    _q_exports = ['', 'admin', 'login', 'logout', 'liberty', 'token', 'saml']
27

    
28
    def _q_index (self):
29
        return 'Nothing to see here yet'
30

    
31
    def login [html] (self):
32
        logger.info('login')
33
        idps = misc.cfg.get('idp', {})
34

    
35
        if len(idps) == 0:
36
            return template.error_page(_('SSO support is not yet configured'))
37

    
38
        if len(idps) == 1 or len([x for x in idps.values() if not x.get('hide', False)]) == 1:
39
            # if there is only one visible IdP, perform login automatically on
40
            # this one.
41
            server = misc.get_lasso_server('liberty')
42
            for x in server.providerIds:
43
                key_provider_id = x.replace(str('://'), str('-')).replace(str('/'), str('-'))
44
                if not idps.get(key_provider_id, {}).get('hide', False):
45
                    return self.liberty.perform_login(x)
46

    
47
            server = misc.get_lasso_server('saml2')
48
            for x in server.providerIds:
49
                key_provider_id = x.replace(str('://'), str('-')).replace(str('/'), str('-'))
50
                if not idps.get(key_provider_id, {}).get('hide', False):
51
                    return self.saml.perform_login(x)
52

    
53
        form = Form(enctype='multipart/form-data')
54
        options = []
55
        # XXX: use intro cookie to get preferred value
56
        value = None
57
        providers = {}
58
        for kidp, idp in misc.cfg.get('idp', {}).items():
59
            if idp.get('hide'):
60
                continue
61
            p = lasso.Provider(lasso.PROVIDER_ROLE_IDP,
62
                    misc.get_abs_path(idp['metadata']),
63
                    misc.get_abs_path(idp['publickey']), None)
64
            providers[p.providerId] = p
65

    
66
        include_protocol = True
67
        if len([x for x in providers.values() if 
68
                x.getProtocolConformance() == lasso.PROTOCOL_SAML_2_0]) in (0, len(providers)):
69
            include_protocol = False
70

    
71
        for p in providers.values():
72
            label = misc.get_provider_label(p)
73
            if include_protocol:
74
                if p.getProtocolConformance() == lasso.PROTOCOL_SAML_2_0:
75
                    label = '%s (SAML 2.0)' % label
76
                else:
77
                    label = '%s (Liberty ID-FF 1.2)' % label
78
            options.append((p.providerId, label))
79
            if not value:
80
                value = p.providerId
81
        form.add(RadiobuttonsWidget, 'idp', value = value, options = options, delim = '<br/>')
82
        form.add_submit('submit', _('Submit'))
83

    
84
        if form.is_submitted() and not form.has_errors():
85
            idp = form.get_widget('idp').parse()
86
            p = providers[form.get_widget('idp').parse()]
87
            if p.getProtocolConformance() == lasso.PROTOCOL_SAML_2_0:
88
                return self.saml.perform_login(idp)
89
            else:
90
                return self.liberty.perform_login(idp)
91

    
92
        template.html_top(_('Login'))
93
        '<p>%s</p>' % _('Select the identity provider you want to use.')
94
        form.render()
95

    
96
    def logout(self):
97
        logger.info('logout')
98
        session = get_session()
99
        if not session:
100
            return redirect('/')
101
        # add settings to disable single logout?
102
        #   (and to set it as none/get/soap?)
103
        return self.liberty.singleLogout()
104

    
105
    def token [html] (self):
106
        if not get_request().user:
107
            raise errors.AccessUnauthorizedError()
108

    
109
        form = Form(enctype='multipart/form-data')
110
        form.add(StringWidget, 'token', title = _('Identification Token'),
111
                required = True, size = 30)
112
        form.add_submit('submit', _('Submit'))
113
        form.add_submit('cancel', _('Cancel'))
114

    
115
        if form.get_widget('cancel').parse():
116
            return redirect('.')
117

    
118
        if not form.is_submitted() or form.has_errors():
119
            template.html_top(_('Identification Token'))
120
            '<p>' # XXX: include explanation (?)
121
            _('Please enter your identification token.')
122
            '</p>'
123
            form.render()
124
        else:
125
            session = get_session()
126
            if get_request().user:
127
                lasso_dump = get_request().user.lasso_dump
128
            else:
129
                return template.error_page('No Lasso Identity Dump (???)')
130
            token = form.get_widget('token').parse()
131
            users_with_token = list(User.select(lambda x: x.identification_token == token))
132
            if len(users_with_token) == 0:
133
                return template.error_page(_('Unknown Token'))
134

    
135
            user = users_with_token[0]
136
            user.name_identifiers.append(session.name_identifier)
137
            user.lasso_dump = str(lasso_dump)
138
            user.identification_token = None
139
            user.store()
140

    
141
            old_name = session.user
142
            session.set_user(user.id)
143

    
144
            return redirect('.')
145

    
146

    
147
    def _q_traverse(self, path):
148
        session = get_session()
149
        if session:
150
            get_request().user = session.get_user()
151
        else:
152
            get_request().user = None
153

    
154
        response = get_response()
155
        response.filter = {}
156
        if not hasattr(response, 'breadcrumb'):
157
            response.breadcrumb = [ ('', _('Home')) ]
158

    
159
        try:
160
            return Directory._q_traverse(self, path)
161
        except errors.TraversalError:
162
            pass
163

    
164
#        return self._q_index()
165
        return forms.root.RootDirectory()._q_traverse(path)
166

    
167
    def _q_lookup(self, component):
168
#        return SiteUI(component)
169
#        if component == 'themes':
170
#            dirname = os.path.join(get_publisher().data_dir, 'themes')
171
#            return StaticDirectory(dirname, follow_symlinks = True)
172

    
173
        # is this a category ?
174
#        try:
175
#            category = Category.get_by_urlname(component)
176
#        except KeyError:
177
#            pass
178
#        else:
179
#            return forms.root.RootDirectory(category)
180

    
181
        # or a form ?
182
#        return forms.root.RootDirectory()._q_lookup(component)
183
		return self._q_index()
184

    
185
    admin = admin.RootDirectory()
186
    saml = saml2.RootDirectory()
187
    liberty = liberty_root.LibertyRootDirectory()
(14-14/20)