Projet

Général

Profil

0006-qommon.saml2-use-new-idp-settings-to-fill-user-attri.patch

v3 - Benjamin Dauvergne, 22 octobre 2013 12:32

Télécharger (3,85 ko)

Voir les différences:

Subject: [PATCH 6/6] qommon.saml2: use new idp settings to fill user
 attribute at SAML 2 login

fixes #3852
 wcs/qommon/saml2.ptl |   60 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 60 insertions(+)
wcs/qommon/saml2.ptl
91 91
        code += ':' + response.status.statusCode.statusCode.value
92 92
    return code
93 93

  
94
def get_remote_provider_cfg(profile):
95
    '''Lookup the configuration for a remote provider given a profile'''
96
    remote_provider_key = misc.get_provider_key(profile.remoteProviderId)
97
    return get_cfg('idp', {}).get(remote_provider_key)
98

  
94 99
class Saml2Directory(Directory):
95 100
    _q_exports = ['login',
96 101
            'singleSignOnArtifact', 'singleSignOnPost', 'singleSignOnSOAP', 'singleSignOnRedirect',
......
353 358
            return error_page(_('Unknown error'))
354 359
        return self.sso_after_response(login)
355 360

  
361
    def fill_user_attributes(self, session, login, user):
362
        '''Fill user fields from SAML2 assertion attributes'''
363
        logger = get_logger()
364

  
365
        save = False
366
        idp = get_remote_provider_cfg(login)
367
        # lookup for attributes in assertion and automatically create identity
368
        lasso_session = lasso.Session.newFromDump(session.lasso_session_dump)
369
        try:
370
            assertion = lasso_session.getAssertions(None)[0]
371
        except:
372
            get_logger().warn('failed to lookup assertion')
373
            return user
374

  
375
        d = {}
376
        m = {}
377
        try:
378
            for attribute in assertion.attributeStatement[0].attribute:
379
                try:
380
                    d[attribute.name] = attribute.attributeValue[0].any[0].content
381
                    for attribute_value in attribute.attributeValue:
382
                        l = m.setdefault(attribute.name, [])
383
                        l.append(attribute_value.any[0].content)
384
                except IndexError:
385
                    pass
386
        except IndexError:
387
            pass
388
        logger.debug('fill_user_attributes: received attributes %r', m)
389
        admin_attributes = idp.get('admin-attributes') or {}
390
        if admin_attributes:
391
            is_admin = False
392
            for key, matching_value in admin_attributes.iteritems():
393
                for value in m.get(key, []):
394
                    if value == matching_value:
395
                        is_admin = True
396
            if user.is_admin != is_admin:
397
                user.is_admin = is_admin
398
                if user.is_admin:
399
                    logger.info('giving user %s the admin rights', user.id)
400
                else:
401
                    logger.info('taking user %s the admin rights', user.id)
402
                save = True
403
        attribute_mapping = idp.get('attribute-mapping') or {}
404
        if user.form_data is None:
405
            user.form_data = {}
406
        for key, field_id in attribute_mapping.iteritems():
407
            if key in d and user.form_data.get(field_id) != d[key]:
408
                user.form_data[field_id] = d[key]
409
                logger.info('setting field %s of user %s to value %r', field_id, user.id, d[key])
410
                save = True
411
        if save:
412
            user.store()
413

  
356 414
    def lookup_user(self, session, login = None, name_id = None):
357 415
        if login:
358 416
            ni = login.nameIdentifier.content
......
380 438
            user.lasso_dump = login.identity.dump()
381 439
            user.store()
382 440

  
441
        self.fill_user_attributes(session, login, user)
442

  
383 443
        return user
384 444

  
385 445
    def slo_sp(self, method = None):
386
-