From abcb3d39fe45ade86aea1e40c4d36eb86c767bb6 Mon Sep 17 00:00:00 2001 From: peppelinux Date: Sat, 19 Jun 2021 14:35:46 +0200 Subject: [PATCH] feat: Dynamic ACR response check - fixed https://github.com/italia/spid-sp-test/issues/47 --- setup.py | 2 +- src/spid_sp_test/indicepa.py | 2 +- src/spid_sp_test/response.py | 32 ++- src/spid_sp_test/responses/response_mods.py | 7 + src/spid_sp_test/responses/settings.py | 206 ++++++++++---------- 5 files changed, 143 insertions(+), 106 deletions(-) create mode 100644 src/spid_sp_test/responses/response_mods.py diff --git a/setup.py b/setup.py index aa29d5b..86f962b 100644 --- a/setup.py +++ b/setup.py @@ -10,7 +10,7 @@ def readme(): setup( name='spid_sp_test', - version='0.6.13', + version='0.7.0', description="SAML2 SPID Service Provider validation tool that can be run from the command line", long_description=readme(), long_description_content_type='text/markdown', diff --git a/src/spid_sp_test/indicepa.py b/src/spid_sp_test/indicepa.py index b494871..d4363c1 100644 --- a/src/spid_sp_test/indicepa.py +++ b/src/spid_sp_test/indicepa.py @@ -1,5 +1,5 @@ -import requests import logging +import requests API_URL = 'https://indicepa.gov.it/PortaleServices/api/aoo' diff --git a/src/spid_sp_test/response.py b/src/spid_sp_test/response.py index f9d0817..255dc90 100644 --- a/src/spid_sp_test/response.py +++ b/src/spid_sp_test/response.py @@ -1,5 +1,6 @@ import base64 import datetime +import importlib import json import logging import random @@ -48,7 +49,8 @@ def __init__(self, response_attrs={}, authnreq_attrs={}, attributes={}, - template_path='./templates'): + template_path='./templates', + status_codes=None): try: self.conf = deepcopy( @@ -58,6 +60,10 @@ def __init__(self, except KeyError: raise Exception(f'Test {conf} doesn\'t exists') + # rewrite, eg: response_mods + if status_codes: + self.conf['status_codes'] = self.status_codes + self.attributes = attributes self.authnreq_attrs = authnreq_attrs self.response_attrs = response_attrs @@ -139,6 +145,13 @@ def __init__(self, *args, **kwargs): self.html_path = kwargs.get('html_path') self.no_send_response = kwargs.get('no_send_response') self.kwargs = kwargs + self.status_codes = None + + def get_acr(self): + _acr = self.authnreq_etree.xpath( + '//RequestedAuthnContext/AuthnContextClassRef') + if _acr: + return _acr[0].text def do_authnrequest(self): self.authn_request_data = get_authn_request(self.authn_request_url) @@ -152,6 +165,9 @@ def do_authnrequest(self): self.authnreq_issuer = self.authnreq_etree.xpath( "/AuthnRequest/Issuer")[0].attrib['NameQualifier'] now = datetime.datetime.utcnow() + + self.acr = self.get_acr() + self.response_attrs = { 'ResponseID': saml_rnd_id(), 'AuthnRequestID': self.authnreq_attrs['ID'], @@ -165,7 +181,7 @@ def do_authnrequest(self): 'SessionIndex': saml_rnd_id(), 'Issuer': self.issuer, 'Audience': self.authnreq_issuer, - 'AuthnContextClassRef': settings.DEFAULT_RESPONSE['AuthnContextClassRef'], + 'AuthnContextClassRef': self.acr or settings.DEFAULT_RESPONSE['AuthnContextClassRef'], 'IssueInstantMillis': now.strftime('%Y-%m-%dT%H:%M:%S.%f') } self.relay_state = self.kwargs.get('relay_state') @@ -241,7 +257,8 @@ def load_test(self, test_name=None, attributes={}, response_attrs={}): authnreq_attrs=self.authnreq_attrs, attributes=attributes, response_attrs=response_attrs or self.response_attrs, - template_path=self.template_path + template_path=self.template_path, + status_codes=self.status_codes ) conf = settings.RESPONSE_TESTS[test_name] if conf.get('response'): @@ -250,6 +267,15 @@ def load_test(self, test_name=None, attributes={}, response_attrs={}): f'Test {test_name}: overwriting {k} with {v}' ) spid_response.response_attrs[k] = v + + # response dinamyc mods and rewrites (plugins) + if conf.get('response_mods'): + for mod_func in conf['response_mods']: + n1, _, n2 = mod_func.rpartition('.') + module = importlib.import_module(n1) + func = getattr(module, n2) + func(self, spid_response) + return spid_response def check_response(self, res, msg: str, attendeds=[]): diff --git a/src/spid_sp_test/responses/response_mods.py b/src/spid_sp_test/responses/response_mods.py new file mode 100644 index 0000000..a1e950b --- /dev/null +++ b/src/spid_sp_test/responses/response_mods.py @@ -0,0 +1,7 @@ +from spid_sp_test.response import SpidSpResponse, SpidSpResponseCheck +from . settings import HTTP_STATUS_ERROR_CODES + + +def dynamic_acr(check:SpidSpResponseCheck, response_obj:SpidSpResponse, **kwargs): + if check.get_acr() != check.response_attrs['AuthnContextClassRef']: + response_obj.conf['status_codes'] = HTTP_STATUS_ERROR_CODES diff --git a/src/spid_sp_test/responses/settings.py b/src/spid_sp_test/responses/settings.py index a6c7eb6..17700c7 100644 --- a/src/spid_sp_test/responses/settings.py +++ b/src/spid_sp_test/responses/settings.py @@ -10,6 +10,8 @@ "expirationDate": "date" } +HTTP_STATUS_ERROR_CODES = [400, 401, 403, 500] + ATTRIBUTES = { "spidCode": "AGID-001", "name": "SpidValidator", @@ -109,21 +111,21 @@ "2": { "name": "02. Response non firmata", "description": "Response non firmata. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-02.xml", "response": {}, }, "3": { "name": "03. Response - Assertion non firmata", "description": "Response firmata, Assertion non firmata. (L'assertion deve essere sempre firmata, la response può essere firmata). Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-03.xml", "response": {}, }, "4": { "name": "04. Response - Firma non valida", "description": "Response firmata con certificato diverso da quello registrato su SP. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "base.xml", "response": {}, "sign_credentials": { @@ -134,7 +136,7 @@ "8": { "name": "08. Response - ID non specificato", "description": "Attributo ID non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-08.xml", "response": { "ResponseID": None @@ -143,7 +145,7 @@ "9": { "name": "09. Response - ID mancante", "description": "Attributo ID mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-09.xml", "response": { "ResponseID": None @@ -152,14 +154,14 @@ "10": { "name": "10. Response - Version diverso da 2.0", "description": "Attributo Version diverso da 2.0. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-10.xml", "response": {}, }, "11": { "name": "11. Response - IssueInstant non specificato", "description": "Attributo IssueInstant non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-11.xml", "response": { "IssueInstant": "", @@ -168,21 +170,21 @@ "12": { "name": "12. Response - IssueInstant mancante", "description": "Attributo IssueInstant mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-12.xml", "response": {}, }, "13": { "name": "13. Response - Formato IssueInstant non corretto", "description": "Attributo IssueInstant avente formato non corretto. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-13.xml", "response": {}, }, "14": { "name": "14. Response - IssueInstant precedente Request", "description": "Attributo IssueInstant precedente a IssueInstant della request. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "base.xml", "response": { "IssueInstant": "2018-01-01T00:00:00Z", @@ -191,7 +193,7 @@ "15": { "name": "15. Response - IssueInstant successivo Request", "description": "Attributo IssueInstant successivo all'istante di ricezione. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "base.xml", "response": { "IssueInstant": "2099-01-01T00:00:00Z", @@ -200,7 +202,7 @@ "16": { "name": "16. Response - InResponseTo non specificato", "description": "Attributo InResponseTo non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-16.xml", "response": { "InResponseTo": "" @@ -209,14 +211,14 @@ "17": { "name": "17. Response - InResponseTo mancante", "description": "Attributo InResponseTo mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-17.xml", "response": {}, }, "18": { "name": "18. Response - InResponseTo diverso da Request", "description": "Attributo InResponseTo diverso da ID request. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "base.xml", "response": { "AuthnRequestID": "inresponsetodiversodaidrequest", @@ -225,21 +227,21 @@ "19": { "name": "19. Response - Destination non specificato", "description": "Attributo Destination non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-19.xml", "response": {}, }, "20": { "name": "20. Response - Destination mancante", "description": "Attributo Destination mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-20.xml", "response": {}, }, "21": { "name": "21. Response - Destination diverso da AssertionConsumerServiceURL", "description": "Attributo Destination diverso da AssertionConsumerServiceURL. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-21.xml", "response": { "AssertionConsumerURL": "diversodaassertionconsumerserviceurl" @@ -248,21 +250,21 @@ "22": { "name": "22. Response - Elemento Status non specificato", "description": "Elemento Status non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-22.xml", "response": {}, }, "23": { "name": "23. Response - Elemento Status mancante", "description": "Elemento Status mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-23.xml", "response": {}, }, "24": { "name": "24. Response - Elemento StatusCode non specificato", "description": "Elemento StatusCode non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-24.xml", "response": {}, }, @@ -270,42 +272,42 @@ # "25": { # "name": "25. Response - Elemento StatusCode mancante", # "description": "Elemento StatusCode mancante. Risultato atteso: KO", - # "status_codes": [400, 403, 500], + # "status_codes": HTTP_STATUS_ERROR_CODES, # "path": "case-25.xml", # "response": {}, # }, "26": { "name": "26. Response - Elemento StatusCode diverso da success (non valido)", "description": "Elemento StatusCode diverso da Success (non valido). Risultato atteso: KO. il S.P. deve mostrare schermata di errore", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-26.xml", "response": {}, }, "27": { "name": "27. Response - Elemento Issuer non specificato", "description": "Elemento Issuer non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-27.xml", "response": {}, }, "28": { "name": "28. Response - Elemento Issuer mancante", "description": "Elemento Issuer mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-28.xml", "response": {}, }, "29": { "name": "29. Response - Elemento Assertion Issuer diverso da EntityID IdP", "description": "Elemento Issuer diverso da EntityID IdP. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-29.xml", "response": {}, }, "30": { "name": "30. Response - Attributo Format di Issuer diverso", "description": "L'attributo Format di Issuer deve essere omesso o assumere valore urn:oasis:names:tc:SAML:2.0:nameid-format:entity. In questo test il valore è diverso. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-30.xml", "response": {}, }, @@ -319,7 +321,7 @@ "32": { "name": "32. Response - Elemento Assertion mancante", "description": "Elemento Assertion mancante ed esito positivo autenticazione. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-32.xml", "response": { "AssertionID": None @@ -328,7 +330,7 @@ "33": { "name": "33. Assertion - Attributo ID non specificato", "description": "Attributo ID dell'Assertion non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-33.xml", "response": { "AssertionID": None @@ -337,7 +339,7 @@ "34": { "name": "34. Assertion - Attributo ID mancante", "description": "Attributo ID dell'Assertion mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-34.xml", "response": { "AssertionID": None @@ -346,217 +348,217 @@ "35": { "name": "35. Assertion - Attributo Version diverso da 2.0", "description": "Attributo Version dell'Assertion diverso da 2.0. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-35.xml", "response": {}, }, "36": { "name": "36. Assertion - Attributo IssueInstant non specificato", "description": "Attributo IssueInstant dell'Assertion non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-36.xml", "response": {}, }, "37": { "name": "37. Assertion - Attributo IssueInstant mancante", "description": "Attributo IssueInstant dell'Assertion mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-37.xml", "response": {}, }, "38": { "name": "38. Assertion - Attributo IssueInstant avente formato non corretto", "description": "Attributo IssueInstant dell'Assertion avente formato non corretto. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-38.xml", "response": {}, }, "39": { "name": "39. Assertion - Attributo IssueInstant precedente a IssueInstant della Request", "description": "Attributo IssueInstant dell'Assertion precedente a IssueInstant della Request. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-39.xml", "response": {}, }, "40": { "name": "40. Assertion - Attributo IssueInstant successivo a IssueInstant della Request", "description": "Attributo IssueInstant dell'Assertion successivo a IssueInstant della Request. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-40.xml", "response": {}, }, "41": { "name": "41. Assertion - Elemento Subject non specificato", "description": "Elemento Subject dell'Assertion non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-41.xml", "response": {}, }, "42": { "name": "42. Assertion - Elemento Subject mancante", "description": "Elemento Subject dell'Assertion mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-42.xml", "response": {}, }, "43": { "name": "43. Assertion - Elemento NameID non specificato", "description": "Elemento NameID dell'Assertion non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-43.xml", "response": {}, }, "44": { "name": "44. Assertion - Elemento NameID mancante", "description": "Elemento NameID dell'Assertion mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-44.xml", "response": {}, }, "45": { "name": "45. Assertion - Attributo Format di NameID non specificato", "description": "Attributo Format dell'elemento NameID dell'Assertion non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-45.xml", "response": {}, }, "46": { "name": "46. Assertion - Attributo Format di NameID mancante", "description": "Attributo Format dell'elemento NameID dell'Assertion mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-46.xml", "response": {}, }, "47": { "name": "47. Assertion - Attributo Format di NameID diverso", "description": "Attributo Format di NameID dell'Assertion diverso da urn:oasis:names:tc:SAML:2.0:nameidformat:transient. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-47.xml", "response": {}, }, "48": { "name": "48. Assertion - Attributo NameQualifier di NameID non specificato", "description": "Attributo NameQualifier di NameID dell'Assertion non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-48.xml", "response": {}, }, "49": { "name": "49. Assertion - Attributo NameQualifier di NameID mancante", "description": "Attributo NameQualifier di NameID dell'Assertion mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-49.xml", "response": {}, }, "51": { "name": "51. Assertion - Elemento SubjectConfirmation non specificato", "description": "Elemento SubjectConfirmation dell'Assertion non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-51.xml", "response": {}, }, "52": { "name": "52. Assertion - Elemento SubjectConfirmation mancante", "description": "Elemento SubjectConfirmation dell'Assertion mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-52.xml", "response": {}, }, "53": { "name": "53. Assertion - Attributo Method di SubjectConfirmation non specificato", "description": "Attributo Method di SubjectConfirmation dell'Assertion non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-53.xml", "response": {}, }, "54": { "name": "54. Assertion - Attributo Method di SubjectConfirmation mancante", "description": "Attributo Method di SubjectConfirmation dell'Assertion mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-54.xml", "response": {}, }, "55": { "name": "55. Assertion - Attributo Method di SubjectConfirmation diverso", "description": "Attributo Method di SubjectConfirmation dell'Assertion diverso da urn:oasis:names:tc:SAML:2.0:cm:bearer. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-55.xml", "response": {}, }, "56": { "name": "56. Assertion - Elemento SubjectConfirmationData mancante", "description": "Elemento SubjectConfirmationData dell'Assertion mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-56.xml", "response": {}, }, "57": { "name": "57. Assertion - Attributo Recipient di SubjectConfirmationData non specificato", "description": "Attributo Recipient di SubjectConfirmationData dell'Assertion non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-57.xml", "response": {}, }, "58": { "name": "58. Assertion - Attributo Recipient di SubjectConfirmationData mancante", "description": "Attributo Recipient di SubjectConfirmationData dell'Assertion mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-58.xml", "response": {}, }, "59": { "name": "59. Assertion - Attributo Recipient di SubjectConfirmationData diverso", "description": "Attributo Recipient di SubjectConfirmationData dell'Assertion diverso da AssertionConsumerServiceURL. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-59.xml", "response": {}, }, "60": { "name": "60. Assertion - Attributo InResponseTo di SubjectConfirmationData non specificato", "description": "Attributo InResponseTo di SubjectConfirmationData dell'Assertion non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-60.xml", "response": {}, }, "61": { "name": "61. Assertion - Attributo InResponseTo di SubjectConfirmationData mancante", "description": "Attributo InResponseTo di SubjectConfirmationData dell'Assertion mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-61.xml", "response": {}, }, "62": { "name": "62. Assertion - Attributo InResponseTo di SubjectConfirmationData diverso da ID request", "description": "Attributo InResponseTo di SubjectConfirmationData dell'Assertion diverso da ID request. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-62.xml", "response": {}, }, "63": { "name": "63. Assertion - Attributo NotOnOrAfter di SubjectConfirmationData non specificato", "description": "Attributo NotOnOrAfter di SubjectConfirmationData dell'Assertion non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-63.xml", "response": {}, }, "64": { "name": "64. Assertion - Attributo NotOnOrAfter di SubjectConfirmationData mancante", "description": "Attributo NotOnOrAfter di SubjectConfirmationData mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-64.xml", "response": {}, }, "65": { "name": "65. Assertion - Attributo NotOnOrAfter di SubjectConfirmationData avente formato non corretto", "description": "Attributo NotOnOrAfter di SubjectConfirmationData avente formato non corretto. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-65.xml", "response": {}, }, "66": { "name": "66. Assertion - Attributo NotOnOrAfter di SubjectConfirmationData precedente all'istante di ricezione della response", "description": "Attributo NotOnOrAfter di SubjectConfirmationData precedente all'istante di ricezione della response. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-66.xml", "response": {}, }, @@ -564,7 +566,7 @@ # "67": { # "name": "67. Assertion - Elemento Issuer non specificato", # "description": "Elemento Issuer dell'Assertion non specificato. Risultato atteso: KO", - # "status_codes": [400, 403, 500], + # "status_codes": HTTP_STATUS_ERROR_CODES, # "path": "case-67.xml", # "response": {}, # @@ -573,112 +575,112 @@ "68": { "name": "68. Assertion - Elemento Issuer mancante", "description": "Elemento Issuer dell'Assertion mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-68.xml", "response": {}, }, "69": { "name": "69. Assertion - Elemento Issuer diverso da EntityID IdP", "description": "Elemento Issuer dell'Assertion diverso da EntityID IdP. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-69.xml", "response": {}, }, "70": { "name": "70. Assertion - Attributo Format di Issuer non specificato", "description": "Attributo Format di Issuer dell'Assertion non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-70.xml", "response": {}, }, "71": { "name": "71. Assertion - Attributo Format di Issuer mancante", "description": "Attributo Format di Issuer dell'Assertion mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-71.xml", "response": {}, }, "72": { "name": "72. Assertion - Attributo Format di Issuer diverso", "description": "L'attributo Format di Issuer dell'Assertion deve essere presente con il valore urn:oasis:names:tc:SAML:2.0:nameid-format:entity. In questo test, invece, il valore è diverso. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-72.xml", "response": {}, }, "73": { "name": "73. Assertion - Elemento Conditions non specificato", "description": "Elemento Conditions dell'Assertion non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-73.xml", "response": {}, }, "74": { "name": "74. Assertion - Elemento Conditions mancante", "description": "Elemento Conditions dell'Assertion mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-74.xml", "response": {}, }, "75": { "name": "75. Assertion - Attributo NotBefore di Condition non specificato", "description": "Attributo NotBefore di Condition dell'Assertion non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-75.xml", "response": {}, }, "76": { "name": "76. Assertion - Attributo NotBefore di Condition mancante", "description": "Attributo NotBefore di Condition dell'Assertion mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-76.xml", "response": {}, }, "77": { "name": "77. Assertion - Attributo NotBefore di Condition avente formato non corretto", "description": "Attributo NotBefore di Condition dell'Assertion avente formato non corretto. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-77.xml", "response": {}, }, "78": { "name": "78. Assertion - Attributo NotBefore di Condition successivo all'instante di ricezione della response", "description": "Attributo NotBefore di Condition dell'Assertion successivo all'instante di ricezione della response. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-78.xml", "response": {}, }, "79": { "name": "79. Assertion - Attributo NotOnOrAfter di Condition non specificato", "description": "Attributo NotOnOrAfter di Condition dell'Assertion non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-79.xml", "response": {}, }, "80": { "name": "80. Assertion - Attributo NotOnOrAfter di Condition mancante", "description": "Attributo NotOnOrAfter di Condition dell'Assertion mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-80.xml", "response": {}, }, "81": { "name": "81. Assertion - Attributo NotOnOrAfter di Condition avente formato non corretto", "description": "Attributo NotOnOrAfter di Condition dell'Assertion avente formato non corretto. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-81.xml", "response": {}, }, "82": { "name": "82. Assertion - Attributo NotOnOrAfter di Condition precedente all'istante di ricezione della response", "description": "Attributo NotOnOrAfter di Condition dell'Assertion precedente all'istante di ricezione della response. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-82.xml", "response": {}, }, "83": { "name": "83. Assertion - Elemento AudienceRestriction di Condition non specificato", "description": "Elemento AudienceRestriction di Condition dell'Assertion non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-83.xml", "response": {}, }, @@ -686,49 +688,49 @@ # "84": { # "name": "84. Assertion - Elemento AudienceRestriction di Condition mancante", # "description": "Elemento AudienceRestriction di Condition dell'Assertion mancante. Risultato atteso: KO", - # "status_codes": [400, 403, 500], + # "status_codes": HTTP_STATUS_ERROR_CODES, # "path": "case-84.xml", # "response": {}, # }, "85": { "name": "85. Assertion - Elemento Audience di AudienceRestriction di Condition non specificato", "description": "Elemento Audience di AudienceRestriction di Condition dell'Assertion non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-85.xml", "response": {}, }, "86": { "name": "86. Assertion - Elemento Audience di AudienceRestriction di Condition mancante", "description": "Elemento Audience di AudienceRestriction di Condition dell'Assertion mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-86.xml", "response": {}, }, "87": { "name": "87. Assertion - Elemento Audience di AudienceRestriction di Condition diverso da Entity Id del Service Provider", "description": "Elemento Audience di AudienceRestriction di Condition dell'Assertion diverso da Entity Id del Service Provider. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-87.xml", "response": {}, }, "88": { "name": "88. Assertion - Elemento AuthStatement non specificato", "description": "Elemento AuthStatement dell'Assertion non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-88.xml", "response": {}, }, "89": { "name": "89. Assertion - Elemento AuthStatement mancante", "description": "Elemento AuthStatement dell'Assertion mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-89.xml", "response": {}, }, "90": { "name": "90. Assertion - Elemento AuthnContext di AuthStatement non specificato", "description": "Elemento AuthnContext di AuthStatement dell'Assertion non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-90.xml", "response": {}, }, @@ -736,57 +738,59 @@ # "91": { # "name": "91. Assertion - Elemento AuthnContext di AuthStatement mancante", # "description": "Elemento AuthnContext di AuthStatement dell'Assertion mancante. Risultato atteso: KO", - # "status_codes": [400, 403, 500], + # "status_codes": HTTP_STATUS_ERROR_CODES, # "path": "case-91.xml", # "response": {}, # }, "92": { "name": "92. Assertion - Elemento AuthContextClassRef di AuthnContext di AuthStatement non specificato", "description": "Elemento AuthContextClassRef di AuthnContext di AuthStatement dell'Assertion non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-92.xml", "response": {}, }, "93": { "name": "93. Assertion - Elemento AuthContextClassRef di AuthnContext di AuthStatement mancante", "description": "Elemento AuthContextClassRef di AuthnContext di AuthStatement dell'Assertion mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-93.xml", "response": {}, }, "94": { "name": "94. Assertion - Elemento AuthContextClassRef impostato su https://www.spid.gov.it/SpidL1", - "description": "Elemento AuthContextClassRef impostato su https://www.spid.gov.it/SpidL1. Risultato atteso: fare attenzione al livello richiesto sulla request.", + "description": "Elemento AuthContextClassRef impostato su https://www.spid.gov.it/SpidL1. Il SP ha accettato un ACR diverso o inferiore.", "status_codes": [200], "path": "base.xml", "response": { - "AuthnContextClassRef": "https://www.spid.gov.it/SpidL1", "Attributes": ATTRIBUTES }, + "response_mods": ['spid_sp_test.responses.response_mods.dynamic_acr'] }, "95": { "name": "95. Assertion - Elemento AuthContextClassRef impostato su https://www.spid.gov.it/SpidL2", - "description": "Elemento AuthContextClassRef impostato su https://www.spid.gov.it/SpidL2. Risultato atteso: fare attenzione al livello richiesto sulla request.", + "description": "Elemento AuthContextClassRef impostato su https://www.spid.gov.it/SpidL2. Il SP ha accettato un ACR diverso o inferiore.", "status_codes": [200], "path": "base.xml", "response": { "AuthnContextClassRef": "https://www.spid.gov.it/SpidL2", }, + "response_mods": ['spid_sp_test.responses.response_mods.dynamic_acr'] }, "96": { "name": "96. Assertion - Elemento AuthContextClassRef impostato su https://www.spid.gov.it/SpidL3", - "description": "Elemento AuthContextClassRef impostato su https://www.spid.gov.it/SpidL3. Risultato atteso: fare attenzione al livello richiesto sulla request.", + "description": "Elemento AuthContextClassRef impostato su https://www.spid.gov.it/SpidL3. Il SP ha accettato un ACR diverso o inferiore.", "status_codes": [200], "path": "base.xml", "response": { "AuthnContextClassRef": "https://www.spid.gov.it/SpidL3", }, + "response_mods": ['spid_sp_test.responses.response_mods.dynamic_acr'] }, "97": { "name": "97. Assertion - Elemento AuthContextClassRef impostato ad un valore non previsto", "description": "Elemento AuthContextClassRef impostato ad un valore non previsto. Es. specifica precedente. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "base.xml", "response": { "AuthnContextClassRef": "urn:oasis:names:tc:SAML:2.0:ac:classes:SpidL1", @@ -795,14 +799,14 @@ "98": { "name": "98. Assertion - Elemento AttributeStatement presente, ma sottoelemento Attribute mancante ", "description": "Elemento AttributeStatement presente, ma sottoelemento Attribute mancante. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-98.xml", "response": {}, }, "99": { "name": "99. Assertion - Elemento AttributeStatement presente, con sottoelemento Attribute non specificato", "description": "Elemento AttributeStatement presente, ma sottoelemento Attribute non specificato. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-99.xml", "response": {}, }, @@ -810,7 +814,7 @@ "100": { "name": "100. Assertion - Firma diversa", "description": "Assertion firmata con certificato diverso. Risultato atteso: KO", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "base.xml", "response": {}, "sign_credentials": { @@ -834,7 +838,7 @@ "104": { "name": "104. Anomalie utente - Ripetuta sottomissione di credenziali errate (Anomalia 19)", "description": "Elemento StatusCode ErrorCode nr19. Autenticazione fallita per ripetuta sottomissione di credenziali errate. Risultato atteso: KO. il S.P. deve mostrare schermata di errore", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-anomalie-utente.xml", "response": { "StatusCode": "urn:oasis:names:tc:SAML:2.0:status:Responder", @@ -845,7 +849,7 @@ "105": { "name": "105. Anomalie utente - Utente privo di credenziali compatibili (Anomalia 20)", "description": "Elemento StatusCode ErrorCode nr20. Utente privo di credenziali compatibili con il livello richiesto dal fornitore del servizio. Risultato atteso: KO. il S.P. deve mostrare schermata di errore", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-anomalie-utente.xml", "response": { "StatusCode": "urn:oasis:names:tc:SAML:2.0:status:Responder", @@ -856,7 +860,7 @@ "106": { "name": "106. Anomalie utente - Timeout (Anomalia 21)", "description": "Elemento StatusCode ErrorCode nr21. Timeout durante l'autenticazione utente. Risultato atteso: KO. il S.P. deve mostrare schermata di errore", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-anomalie-utente.xml", "response": { "StatusCode": "urn:oasis:names:tc:SAML:2.0:status:Responder", @@ -867,7 +871,7 @@ "107": { "name": "107. Anomalie utente - Consenso negato (Anomalia 22)", "description": "Elemento StatusCode ErrorCode nr22. Utente nega il consenso all'invio di dati al SP in caso di sessione vigente. Risultato atteso: KO. il S.P. deve mostrare schermata di errore", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-anomalie-utente.xml", "response": { "StatusCode": "urn:oasis:names:tc:SAML:2.0:status:Responder", @@ -878,7 +882,7 @@ "108": { "name": "108. Anomalie utente - Credenziali bloccate (Anomalia 23)", "description": "Elemento StatusCode ErrorCode nr23. Utente con identità sospesa/revocata o con credenziali bloccate. Risultato atteso: KO. il S.P. deve mostrare schermata di errore", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-anomalie-utente.xml", "response": { "StatusCode": "urn:oasis:names:tc:SAML:2.0:status:Responder", @@ -904,7 +908,7 @@ "111": { "name": "111. Anomalie utente - Processo di autenticazione annullato dall'utente (Anomalia 25)", "description": "Elemento StatusCode ErrorCode nr25. Processo di autenticazione annullato dall'utente. Risultato atteso: KO. il S.P. deve mostrare schermata di errore", - "status_codes": [400, 403, 500], + "status_codes": HTTP_STATUS_ERROR_CODES, "path": "case-anomalie-utente.xml", "response": { "StatusCode": "urn:oasis:names:tc:SAML:2.0:status:Responder",