0001-WIP-support-federation-file-loading-19396.patch
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 |
- |