|
4 | 4 | # All rights reserved. |
5 | 5 |
|
6 | 6 | from base64 import b64decode, b64encode |
| 7 | +from datetime import datetime |
| 8 | +from datetime import timedelta |
| 9 | +from freezegun import freeze_time |
7 | 10 | import json |
8 | 11 | from os.path import dirname, join, exists |
9 | 12 | import unittest |
@@ -434,11 +437,77 @@ def testIsInValidNoStatement(self): |
434 | 437 |
|
435 | 438 | settings.set_strict(True) |
436 | 439 | response_2 = OneLogin_Saml2_Response(settings, xml) |
437 | | - try: |
438 | | - valid = response_2.is_valid(self.get_request_data()) |
439 | | - self.assertFalse(valid) |
440 | | - except Exception as e: |
441 | | - self.assertEqual('There is no AttributeStatement on the Response', e.message) |
| 440 | + self.assertFalse(response_2.is_valid(self.get_request_data())) |
| 441 | + self.assertEqual('There is no AttributeStatement on the Response', response_2.get_error()) |
| 442 | + |
| 443 | + def testIsValidOptionalStatement(self): |
| 444 | + """ |
| 445 | + Tests the is_valid method of the OneLogin_Saml2_Response |
| 446 | + Case AttributeStatement is optional |
| 447 | + """ |
| 448 | + # shortcut |
| 449 | + json_settings = self.loadSettingsJSON() |
| 450 | + # ensure valid entityid |
| 451 | + json_settings['sp']['entityId'] = 'https://pitbulk.no-ip.org/newonelogin/demo1/metadata.php' |
| 452 | + json_settings['idp']['entityId'] = 'https://pitbulk.no-ip.org/simplesaml/saml2/idp/metadata.php' |
| 453 | + json_settings['idp']['x509cert'] = """ |
| 454 | +MIICVzCCAcACCQDIVHaNSBYL6TANBgkqhkiG9w0BAQsFADBwMQswCQYDVQQGEwJG |
| 455 | +UjEOMAwGA1UECAwFUGFyaXMxDjAMBgNVBAcMBVBhcmlzMRYwFAYDVQQKDA1Ob3Zh |
| 456 | +cG9zdCBURVNUMSkwJwYJKoZIhvcNAQkBFhpmbG9yZW50LnBpZ291dEBub3ZhcG9z |
| 457 | +dC5mcjAeFw0xNDAyMTMxMzUzNDBaFw0xNTAyMTMxMzUzNDBaMHAxCzAJBgNVBAYT |
| 458 | +AkZSMQ4wDAYDVQQIDAVQYXJpczEOMAwGA1UEBwwFUGFyaXMxFjAUBgNVBAoMDU5v |
| 459 | +dmFwb3N0IFRFU1QxKTAnBgkqhkiG9w0BCQEWGmZsb3JlbnQucGlnb3V0QG5vdmFw |
| 460 | +b3N0LmZyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQChLFHn3LnN4JQ/7WCd |
| 461 | +YupxkUgcNOQnPF+yll+/DPpux9npfY059PIUatB8X7kCn5i8tRwIy/ikHJR6Mr8+ |
| 462 | +MPvc6VOZDxPNdZvMo/8lhxrbN3Jdrw3whZmU/KPR9F3BdFdu+SLzrMl1TDUZlPtY |
| 463 | +9XzUFXcqN8IXcy8TJzCBeNey3QIDAQABMA0GCSqGSIb3DQEBCwUAA4GBACtJ8feG |
| 464 | +ze1NHB5Vw18jMUPvHo7H3Gwmj6ZDAXQlaiAXMuNBxNXVWVwifl6V+nW3w9Qa7Feo |
| 465 | +/nZ/O4TUOH1nz+adklcCD4QpZaEIbmAbriPWJKgb4LWGhqQruwYR7ItTR1MNX9gL |
| 466 | +bP0z0zvDEQnnt/VUWFEBLSJq4Z4Nre8LFmS2 |
| 467 | +""".strip() |
| 468 | + |
| 469 | + settings = OneLogin_Saml2_Settings(json_settings) |
| 470 | + settings.set_strict(True) |
| 471 | + |
| 472 | + # want AttributeStatement True by default |
| 473 | + self.assertTrue(settings.get_security_data()['wantAttributeStatement']) |
| 474 | + |
| 475 | + xml = self.file_contents(join(self.data_path, 'responses', 'invalids', 'signed_assertion_response.xml.base64')) |
| 476 | + |
| 477 | + not_on_or_after = datetime.strptime('2014-03-31T08:37:16Z', '%Y-%m-%dT%H:%M:%SZ') |
| 478 | + not_on_or_after -= timedelta(seconds=150) |
| 479 | + |
| 480 | + response = OneLogin_Saml2_Response(settings, xml) |
| 481 | + with freeze_time(not_on_or_after): |
| 482 | + self.assertFalse(response.is_valid({ |
| 483 | + 'https': 'on', |
| 484 | + 'http_host': 'pitbulk.no-ip.org', |
| 485 | + 'script_name': 'newonelogin/demo1/index.php?acs' |
| 486 | + })) |
| 487 | + self.assertEqual('There is no AttributeStatement on the Response', response.get_error()) |
| 488 | + |
| 489 | + security = settings.get_security_data() |
| 490 | + self.assertTrue(security['wantAttributeStatement']) |
| 491 | + |
| 492 | + # change wantAttributeStatement to optional |
| 493 | + json_settings['security']['wantAttributeStatement'] = False |
| 494 | + settings = OneLogin_Saml2_Settings(json_settings) |
| 495 | + settings.set_strict(True) |
| 496 | + |
| 497 | + # check settings |
| 498 | + self.assertFalse(settings.get_security_data()['wantAttributeStatement']) |
| 499 | + |
| 500 | + response = OneLogin_Saml2_Response(settings, xml) |
| 501 | + response.is_valid(self.get_request_data()) |
| 502 | + |
| 503 | + # check response |
| 504 | + with freeze_time(not_on_or_after): |
| 505 | + self.assertTrue(response.is_valid({ |
| 506 | + 'https': 'on', |
| 507 | + 'http_host': 'pitbulk.no-ip.org', |
| 508 | + 'script_name': 'newonelogin/demo1/index.php?acs' |
| 509 | + })) |
| 510 | + self.assertIsNone(response.get_error()) |
442 | 511 |
|
443 | 512 | def testIsInValidNoKey(self): |
444 | 513 | """ |
|
0 commit comments