@@ -269,12 +269,126 @@ def testMergeSettings(self):
269269 settings_result = OneLogin_Saml2_IdPMetadataParser .merge_settings ({}, None )
270270
271271 xml_idp_metadata = self .file_contents (join (self .data_path , 'metadata' , 'idp_metadata.xml' ))
272+
273+ # Parse XML metadata.
272274 data = OneLogin_Saml2_IdPMetadataParser .parse (xml_idp_metadata )
275+
276+ # Read base settings.
273277 settings = self .loadSettingsJSON ()
278+
279+ # Merge settings from XML metadata into base settings,
280+ # let XML metadata have priority if there are conflicting
281+ # attributes.
274282 settings_result = OneLogin_Saml2_IdPMetadataParser .merge_settings (settings , data )
275- expected_data = {u'sp' : {'NameIDFormat' : 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress' }, u'idp' : {'singleSignOnService' : {'url' : 'https://app.onelogin.com/trust/saml2/http-post/sso/383123' }, 'entityId' : 'https://app.onelogin.com/saml/metadata/383123' , 'x509cert' : 'MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJVUzET\n MBEGA1UECAwKQ2FsaWZvcm5pYTEVMBMGA1UEBwwMU2FudGEgTW9uaWNhMREwDwYD\n VQQKDAhPbmVMb2dpbjEZMBcGA1UEAwwQYXBwLm9uZWxvZ2luLmNvbTAeFw0xMzA2\n MDUxNzE2MjBaFw0xODA2MDUxNzE2MjBaMGcxCzAJBgNVBAYTAlVTMRMwEQYDVQQI\n DApDYWxpZm9ybmlhMRUwEwYDVQQHDAxTYW50YSBNb25pY2ExETAPBgNVBAoMCE9u\n ZUxvZ2luMRkwFwYDVQQDDBBhcHAub25lbG9naW4uY29tMIIBIjANBgkqhkiG9w0B\n AQEFAAOCAQ8AMIIBCgKCAQEAse8rnep4qL2GmhH10pMQyJ2Jae+AQHyfgVjaQZ7Z\n 0QQog5jX91vcJRSMi0XWJnUtOr6lF0dq1+yckjZ92wyLrH+7fvngNO1aV4Mjk9sT\n gf+iqMrae6y6fRxDt9PXrEFVjvd3vv7QTJf2FuIPy4vVP06Dt8EMkQIr8rmLmU0m\n Tr1k2DkrdtdlCuNFTXuAu3QqfvNCRrRwfNObn9MP6JeOUdcGLJsBjGF8exfcN1SF\n zRF0JFr3dmOlx761zK5liD0T1sYWnDquatj/JD9fZMbKecBKni1NglH/LVd+b6aJ\n UAr5LulERULUjLqYJRKW31u91/4Qazdo9tbvwqyFxaoUrwIDAQABo4HUMIHRMAwG\n A1UdEwEB/wQCMAAwHQYDVR0OBBYEFPWcXvQSlTXnzZD2xziuoUvrrDedMIGRBgNV\n HSMEgYkwgYaAFPWcXvQSlTXnzZD2xziuoUvrrDedoWukaTBnMQswCQYDVQQGEwJV\n UzETMBEGA1UECAwKQ2FsaWZvcm5pYTEVMBMGA1UEBwwMU2FudGEgTW9uaWNhMREw\n DwYDVQQKDAhPbmVMb2dpbjEZMBcGA1UEAwwQYXBwLm9uZWxvZ2luLmNvbYIBATAO\n BgNVHQ8BAf8EBAMCBPAwDQYJKoZIhvcNAQEFBQADggEBAB/8xe3rzqXQVxzHyAHu\n AuPa73ClDoL1cko0Fp8CGcqEIyj6Te9gx5z6wyfv+Lo8RFvBLlnB1lXqbC+fTGcV\n gG/4oKLJ5UwRFxInqpZPnOAudVNnd0PYOODn9FWs6u+OTIQIaIcPUv3MhB9lwHIJ\n sTk/bs9xcru5TPyLIxLLd6ib/pRceKH2mTkzUd0DYk9CQNXXeoGx/du5B9nh3ClP\n TbVakRzl3oswgI5MQIphYxkW70SopEh4kOFSRE1ND31NNIq1YrXlgtkguQBFsZWu\n QOPR6cEwFZzP0tHTYbI839WgxX6hfhIUTUz6mLqq4+3P4BG3+1OXeVDg63y8Uh78\n 1sE=' }, u'strict' : False , u'contactPerson' : {u'technical' : {u'givenName' : u'technical_name' , u'emailAddress' : u'technical@example.com' }, u'support' : {u'givenName' : u'support_name' , u'emailAddress' : u'support@example.com' }}, u'debug' : False , u'organization' : {u'en-US' : {u'url' : u'http://sp.example.com' , u'displayname' : u'SP test' , u'name' : u'sp_test' }}, u'security' : {u'signMetadata' : False , u'wantAssertionsSigned' : False , u'authnRequestsSigned' : False }, u'custom_base_path' : u'../../../tests/data/customPath/' }
276- self .assertEqual (expected_data , settings_result )
277283
278- expected_data2 = {'sp' : {u'singleLogoutService' : {u'url' : u'http://stuff.com/endpoints/endpoints/sls.php' }, u'assertionConsumerService' : {u'url' : u'http://stuff.com/endpoints/endpoints/acs.php' }, u'entityId' : u'http://stuff.com/endpoints/metadata.php' , u'NameIDFormat' : u'urn:oasis:names:tc:SAML:2.0:nameid-format:unspecified' }, 'idp' : {u'singleLogoutService' : {u'url' : u'http://idp.example.com/SingleLogoutService.php' }, u'entityId' : u'http://idp.example.com/' , u'x509cert' : u'MIICgTCCAeoCCQCbOlrWDdX7FTANBgkqhkiG9w0BAQUFADCBhDELMAkGA1UEBhMCTk8xGDAWBgNVBAgTD0FuZHJlYXMgU29sYmVyZzEMMAoGA1UEBxMDRm9vMRAwDgYDVQQKEwdVTklORVRUMRgwFgYDVQQDEw9mZWlkZS5lcmxhbmcubm8xITAfBgkqhkiG9w0BCQEWEmFuZHJlYXNAdW5pbmV0dC5ubzAeFw0wNzA2MTUxMjAxMzVaFw0wNzA4MTQxMjAxMzVaMIGEMQswCQYDVQQGEwJOTzEYMBYGA1UECBMPQW5kcmVhcyBTb2xiZXJnMQwwCgYDVQQHEwNGb28xEDAOBgNVBAoTB1VOSU5FVFQxGDAWBgNVBAMTD2ZlaWRlLmVybGFuZy5ubzEhMB8GCSqGSIb3DQEJARYSYW5kcmVhc0B1bmluZXR0Lm5vMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDivbhR7P516x/S3BqKxupQe0LONoliupiBOesCO3SHbDrl3+q9IbfnfmE04rNuMcPsIxB161TdDpIesLCn7c8aPHISKOtPlAeTZSnb8QAu7aRjZq3+PbrP5uW3TcfCGPtKTytHOge/OlJbo078dVhXQ14d1EDwXJW1rRXuUt4C8QIDAQABMA0GCSqGSIb3DQEBBQUAA4GBACDVfp86HObqY+e8BUoWQ9+VMQx1ASDohBjwOsg2WykUqRXF+dLfcUH9dWR63CtZIKFDbStNomPnQz7nbK+onygwBspVEbnHuUihZq3ZUdmumQqCw4Uvs/1Uvq3orOo/WJVhTyvLgFVK2QarQ4/67OZfHd7R+POBXhophSMv1ZOo' , u'singleSignOnService' : {u'url' : u'http://idp.example.com/SSOService.php' }}, u'strict' : False , u'contactPerson' : {u'technical' : {u'givenName' : u'technical_name' , u'emailAddress' : u'technical@example.com' }, u'support' : {u'givenName' : u'support_name' , u'emailAddress' : u'support@example.com' }}, u'debug' : False , u'organization' : {u'en-US' : {u'url' : u'http://sp.example.com' , u'displayname' : u'SP test' , u'name' : u'sp_test' }}, u'security' : {u'signMetadata' : False , u'wantAssertionsSigned' : False , u'authnRequestsSigned' : False }, u'custom_base_path' : u'../../../tests/data/customPath/' }
284+ # Generate readable JSON representation:
285+ # print("%s" % json.dumps(settings_result, indent=2).replace(r'\n', r'\\n'))
286+
287+ expected_settings_json = """
288+ {
289+ "custom_base_path": "../../../tests/data/customPath/",
290+ "contactPerson": {
291+ "support": {
292+ "emailAddress": "support@example.com",
293+ "givenName": "support_name"
294+ },
295+ "technical": {
296+ "emailAddress": "technical@example.com",
297+ "givenName": "technical_name"
298+ }
299+ },
300+ "idp": {
301+ "singleSignOnService": {
302+ "url": "https://app.onelogin.com/trust/saml2/http-post/sso/383123",
303+ "binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
304+ },
305+ "entityId": "https://app.onelogin.com/saml/metadata/383123",
306+ "singleLogoutService": {
307+ "url": "http://idp.example.com/SingleLogoutService.php"
308+ },
309+ "x509cert": "MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJVUzET\\ nMBEGA1UECAwKQ2FsaWZvcm5pYTEVMBMGA1UEBwwMU2FudGEgTW9uaWNhMREwDwYD\\ nVQQKDAhPbmVMb2dpbjEZMBcGA1UEAwwQYXBwLm9uZWxvZ2luLmNvbTAeFw0xMzA2\\ nMDUxNzE2MjBaFw0xODA2MDUxNzE2MjBaMGcxCzAJBgNVBAYTAlVTMRMwEQYDVQQI\\ nDApDYWxpZm9ybmlhMRUwEwYDVQQHDAxTYW50YSBNb25pY2ExETAPBgNVBAoMCE9u\\ nZUxvZ2luMRkwFwYDVQQDDBBhcHAub25lbG9naW4uY29tMIIBIjANBgkqhkiG9w0B\\ nAQEFAAOCAQ8AMIIBCgKCAQEAse8rnep4qL2GmhH10pMQyJ2Jae+AQHyfgVjaQZ7Z\\ n0QQog5jX91vcJRSMi0XWJnUtOr6lF0dq1+yckjZ92wyLrH+7fvngNO1aV4Mjk9sT\\ ngf+iqMrae6y6fRxDt9PXrEFVjvd3vv7QTJf2FuIPy4vVP06Dt8EMkQIr8rmLmU0m\\ nTr1k2DkrdtdlCuNFTXuAu3QqfvNCRrRwfNObn9MP6JeOUdcGLJsBjGF8exfcN1SF\\ nzRF0JFr3dmOlx761zK5liD0T1sYWnDquatj/JD9fZMbKecBKni1NglH/LVd+b6aJ\\ nUAr5LulERULUjLqYJRKW31u91/4Qazdo9tbvwqyFxaoUrwIDAQABo4HUMIHRMAwG\\ nA1UdEwEB/wQCMAAwHQYDVR0OBBYEFPWcXvQSlTXnzZD2xziuoUvrrDedMIGRBgNV\\ nHSMEgYkwgYaAFPWcXvQSlTXnzZD2xziuoUvrrDedoWukaTBnMQswCQYDVQQGEwJV\\ nUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEVMBMGA1UEBwwMU2FudGEgTW9uaWNhMREw\\ nDwYDVQQKDAhPbmVMb2dpbjEZMBcGA1UEAwwQYXBwLm9uZWxvZ2luLmNvbYIBATAO\\ nBgNVHQ8BAf8EBAMCBPAwDQYJKoZIhvcNAQEFBQADggEBAB/8xe3rzqXQVxzHyAHu\\ nAuPa73ClDoL1cko0Fp8CGcqEIyj6Te9gx5z6wyfv+Lo8RFvBLlnB1lXqbC+fTGcV\\ ngG/4oKLJ5UwRFxInqpZPnOAudVNnd0PYOODn9FWs6u+OTIQIaIcPUv3MhB9lwHIJ\\ nsTk/bs9xcru5TPyLIxLLd6ib/pRceKH2mTkzUd0DYk9CQNXXeoGx/du5B9nh3ClP\\ nTbVakRzl3oswgI5MQIphYxkW70SopEh4kOFSRE1ND31NNIq1YrXlgtkguQBFsZWu\\ nQOPR6cEwFZzP0tHTYbI839WgxX6hfhIUTUz6mLqq4+3P4BG3+1OXeVDg63y8Uh78\\ n1sE="
310+ },
311+ "sp": {
312+ "NameIDFormat": "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress",
313+ "entityId": "http://stuff.com/endpoints/metadata.php",
314+ "assertionConsumerService": {
315+ "url": "http://stuff.com/endpoints/endpoints/acs.php"
316+ },
317+ "singleLogoutService": {
318+ "url": "http://stuff.com/endpoints/endpoints/sls.php"
319+ }
320+ },
321+ "security": {
322+ "wantAssertionsSigned": false,
323+ "authnRequestsSigned": false,
324+ "signMetadata": false
325+ },
326+ "debug": false,
327+ "organization": {
328+ "en-US": {
329+ "displayname": "SP test",
330+ "url": "http://sp.example.com",
331+ "name": "sp_test"
332+ }
333+ },
334+ "strict": false
335+ }
336+ """
337+ expected_settings = json .loads (expected_settings_json )
338+ self .assertEqual (expected_settings , settings_result )
339+
340+ # Commute merge operation. As the order determines which settings
341+ # dictionary has priority, here we expect a different result.
279342 settings_result2 = OneLogin_Saml2_IdPMetadataParser .merge_settings (data , settings )
280- self .assertEqual (expected_data2 , settings_result2 )
343+ expected_settings2_json = """
344+ {
345+ "debug": false,
346+ "idp": {
347+ "singleLogoutService": {
348+ "url": "http://idp.example.com/SingleLogoutService.php"
349+ },
350+ "singleSignOnService": {
351+ "url": "http://idp.example.com/SSOService.php",
352+ "binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
353+ },
354+ "entityId": "http://idp.example.com/",
355+ "x509cert": "MIICgTCCAeoCCQCbOlrWDdX7FTANBgkqhkiG9w0BAQUFADCBhDELMAkGA1UEBhMCTk8xGDAWBgNVBAgTD0FuZHJlYXMgU29sYmVyZzEMMAoGA1UEBxMDRm9vMRAwDgYDVQQKEwdVTklORVRUMRgwFgYDVQQDEw9mZWlkZS5lcmxhbmcubm8xITAfBgkqhkiG9w0BCQEWEmFuZHJlYXNAdW5pbmV0dC5ubzAeFw0wNzA2MTUxMjAxMzVaFw0wNzA4MTQxMjAxMzVaMIGEMQswCQYDVQQGEwJOTzEYMBYGA1UECBMPQW5kcmVhcyBTb2xiZXJnMQwwCgYDVQQHEwNGb28xEDAOBgNVBAoTB1VOSU5FVFQxGDAWBgNVBAMTD2ZlaWRlLmVybGFuZy5ubzEhMB8GCSqGSIb3DQEJARYSYW5kcmVhc0B1bmluZXR0Lm5vMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDivbhR7P516x/S3BqKxupQe0LONoliupiBOesCO3SHbDrl3+q9IbfnfmE04rNuMcPsIxB161TdDpIesLCn7c8aPHISKOtPlAeTZSnb8QAu7aRjZq3+PbrP5uW3TcfCGPtKTytHOge/OlJbo078dVhXQ14d1EDwXJW1rRXuUt4C8QIDAQABMA0GCSqGSIb3DQEBBQUAA4GBACDVfp86HObqY+e8BUoWQ9+VMQx1ASDohBjwOsg2WykUqRXF+dLfcUH9dWR63CtZIKFDbStNomPnQz7nbK+onygwBspVEbnHuUihZq3ZUdmumQqCw4Uvs/1Uvq3orOo/WJVhTyvLgFVK2QarQ4/67OZfHd7R+POBXhophSMv1ZOo"
356+ },
357+ "security": {
358+ "authnRequestsSigned": false,
359+ "wantAssertionsSigned": false,
360+ "signMetadata": false
361+ },
362+ "contactPerson": {
363+ "technical": {
364+ "emailAddress": "technical@example.com",
365+ "givenName": "technical_name"
366+ },
367+ "support": {
368+ "emailAddress": "support@example.com",
369+ "givenName": "support_name"
370+ }
371+ },
372+ "strict": false,
373+ "sp": {
374+ "singleLogoutService": {
375+ "url": "http://stuff.com/endpoints/endpoints/sls.php"
376+ },
377+ "assertionConsumerService": {
378+ "url": "http://stuff.com/endpoints/endpoints/acs.php"
379+ },
380+ "entityId": "http://stuff.com/endpoints/metadata.php",
381+ "NameIDFormat": "urn:oasis:names:tc:SAML:2.0:nameid-format:unspecified"
382+ },
383+ "custom_base_path": "../../../tests/data/customPath/",
384+ "organization": {
385+ "en-US": {
386+ "displayname": "SP test",
387+ "url": "http://sp.example.com",
388+ "name": "sp_test"
389+ }
390+ }
391+ }
392+ """
393+ expected_settings2 = json .loads (expected_settings2_json )
394+ self .assertEqual (expected_settings2 , settings_result2 )
0 commit comments