Projet

Général

Profil

0001-WIP-support-federation-file-loading-19396.patch

Paul Marillonnet, 16 octobre 2017 18:29

Télécharger (5,24 ko)

Voir les différences:

Subject: [PATCH] WIP support federation file loading (#19396)

 mellon/adapters.py     |  4 ++++
 mellon/app_settings.py | 20 ++++++++++++++++++--
 mellon/utils.py        | 17 +++++++++++++++++
 tests/test_utils.py    | 24 ++++++++++++++++++++++++
 4 files changed, 63 insertions(+), 2 deletions(-)
mellon/adapters.py
30 30
    def get_identity_providers_setting(self):
31 31
        return app_settings.IDENTITY_PROVIDERS
32 32

  
33
    def get_federations(self):  # XXX only local files supported at the moment
34
        for federation in getattr(app_settings, 'FEDERATIONS', []):
35
            yield federation
36

  
33 37
    def get_idps(self):
34 38
        for i, idp in enumerate(self.get_identity_providers_setting()):
35 39
            if 'METADATA_URL' in idp and 'METADATA' not in idp:
mellon/app_settings.py
36 36
        'LOGIN_URL': 'mellon_login',
37 37
        'LOGOUT_URL': 'mellon_logout',
38 38
        'ARTIFACT_RESOLVE_TIMEOUT': 10.0,
39
        'FEDERATIONS': [],
39 40
    }
40 41

  
41 42
    @property
43
    def FEDERATIONS(self):
44
        from django.conf import settings
45
        if settings.hasattr('MELLON_FEDERATIONS'):
46
            federations = settings.MELLON_FEDERATIONS
47
        if isinstance(federations, dict):
48
            federations = [federations]
49
        return federations
50

  
51
    @property
42 52
    def IDENTITY_PROVIDERS(self):
43 53
        from django.conf import settings
54
        idps = []
44 55
        try:
45
            idps = settings.MELLON_IDENTITY_PROVIDERS
56
            if hasattr(settings, 'MELLON_IDENTITY_PROVIDERS'):
57
                idps = settings.MELLON_IDENTITY_PROVIDERS
58
            elif not hasattr(settings, 'MELLON_FEDERATIONS'):
59
                raise AttributeError
46 60
        except AttributeError:
47 61
            from django.core.exceptions import ImproperlyConfigured
48
            raise ImproperlyConfigured('The MELLON_IDENTITY_PROVIDERS setting is mandatory')
62
            raise ImproperlyConfigured('Either the MELLON_IDENTITY_PROVIDERS '
63
                                       'or the MELLON_FEDERATIONS settings '
64
                                       'are mandatory')
49 65
        if isinstance(idps, dict):
50 66
            idps = [idps]
51 67
        return idps
mellon/utils.py
83 83
                logger.error(u'bad metadata in idp %r', idp['ENTITY_ID'])
84 84
                logger.debug(u'lasso error: %s', e)
85 85
                continue
86
        for federation in get_federations():
87
            try:
88
                server.loadMetadata(lasso.PROVIDER_ROLE_IDP,
89
                                    federation, None, None,
90
                                    lasso.SERVER_LOAD_METADATA_FLAG_DEFAULT)
91

  
92
            except lasso.Error, e:
93
                logger.error(u'bad metadata for federation %r', federation)
94
                logger.debug(u'lasso error: %s', e)
95
                continue
86 96
        cache[root] = server
87 97
        settings._MELLON_SERVER_CACHE = cache
88 98
    return settings._MELLON_SERVER_CACHE.get(root)
......
112 122
                yield idp
113 123

  
114 124

  
125
def get_federations():
126
    for adapter in get_adapters():
127
        if hasattr(adapter, 'get_federations'):
128
            for federations in adapter.get_federations():
129
                yield federations
130

  
131

  
115 132
def flatten_datetime(d):
116 133
    d = d.copy()
117 134
    for key, value in d.iteritems():
tests/test_utils.py
9 9
from mellon.utils import create_server, create_metadata, iso8601_to_datetime, flatten_datetime
10 10
import mellon.utils
11 11
from xml_utils import assert_xml_constraints
12
from tempfile import mkstemp
13
from os import remove
14
from requests import get as rget
12 15

  
13 16
from utils import error_500, metadata_response
14 17

  
......
39 42
    assert 'failed with error' in caplog.text
40 43

  
41 44

  
45
def test_load_federation(mocker, rf, private_settings, caplog):
46
    response = rget('https://metadata.federation.renater.fr/renater/main/main-idps-renater-metadata.xml')
47
    _, tmpname = mkstemp('', 'mellontmp', '/tmp/', False)
48
    tmpfile = open(tmpname, 'wb')
49
    tmpcontent = response.content
50
    tmpfile.write(tmpcontent)
51
    tmpfile.close()
52
    response.close()
53

  
54
    private_settings.MELLON_FEDERATIONS = [tmpname]
55

  
56
    request = rf.get('/')
57
    assert 'failed with error' not in caplog.text
58
    with HTTMock(error_500):
59
        server = create_server(request)
60
    assert server.providers > 100
61

  
62
    # Cleanup
63
    remove(tmpname)
64

  
65

  
42 66
def test_create_server_invalid_metadata(mocker, rf, private_settings, caplog):
43 67
    private_settings.MELLON_IDENTITY_PROVIDERS = [
44 68
        {
45
-