diff --git a/src/saml2/__init__.py b/src/saml2/__init__.py index 0fa9e49c7..46c97e263 100644 --- a/src/saml2/__init__.py +++ b/src/saml2/__init__.py @@ -42,9 +42,32 @@ logger = logging.getLogger(__name__) + NAMESPACE = 'urn:oasis:names:tc:SAML:2.0:assertion' # TEMPLATE = '{urn:oasis:names:tc:SAML:2.0:assertion}%s' -# XSI_NAMESPACE = 'http://www.w3.org/2001/XMLSchema-instance' +SAMLP_NAMESPACE = 'urn:oasis:names:tc:SAML:2.0:protocol' +XSI_NAMESPACE = 'http://www.w3.org/2001/XMLSchema-instance' +XS_NAMESPACE = 'http://www.w3.org/2001/XMLSchema' +MD_NAMESPACE = "urn:oasis:names:tc:SAML:2.0:metadata" +MDUI_NAMESPACE = "urn:oasis:names:tc:SAML:metadata:ui" +DS_NAMESPACE = 'http://www.w3.org/2000/09/xmldsig#' +XENC_NAMESPACE = "http://www.w3.org/2001/04/xmlenc#" +ALG_NAMESPACE = "urn:oasis:names:tc:SAML:metadata:algsupport" +MDATTR_NAMESPACE = "urn:oasis:names:tc:SAML:metadata:attribute" +IDPDISC = "urn:oasis:names:tc:SAML:profiles:SSO:idp-discovery-protocol" + +OASIS_DEFAULT_NS_PREFIXES = {'saml': NAMESPACE, + 'samlp': SAMLP_NAMESPACE, + 'ds': DS_NAMESPACE, + 'xsi': XSI_NAMESPACE, + 'xs': XS_NAMESPACE, + 'mdui': MDUI_NAMESPACE, + 'md': MD_NAMESPACE, + 'xenc': XENC_NAMESPACE, + 'alg': ALG_NAMESPACE, + 'mdattr': MDATTR_NAMESPACE, + 'idpdisc': IDPDISC +} NAMEID_FORMAT_EMAILADDRESS = ( "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress") @@ -548,7 +571,8 @@ def _to_element_tree(self): self._add_members_to_element_tree(new_tree) return new_tree - def register_prefix(self, nspair): + @staticmethod + def register_prefix(nspair): """ Register with ElementTree a set of namespaces @@ -676,11 +700,8 @@ def fixup(name): del elem.attrib[key] def to_string_force_namespace(self, nspair): - elem = self._to_element_tree() - self.set_prefixes(elem, nspair) - return ElementTree.tostring(elem, encoding="UTF-8") def to_string(self, nspair=None): @@ -1032,3 +1053,6 @@ def is_required_attribute(cls, attr): :return: True if required """ return cls.c_attributes[attr][REQUIRED] + +# this register preferred prefix namespaces +SamlBase.register_prefix(OASIS_DEFAULT_NS_PREFIXES) diff --git a/tests/test_02_saml.py b/tests/test_02_saml.py index fe5bbb707..fb8209f72 100644 --- a/tests/test_02_saml.py +++ b/tests/test_02_saml.py @@ -226,11 +226,11 @@ def test_to_string_nspair(self): foo = saml2.make_vals("lions", AttributeValue, part=True) txt = foo.to_string().decode('utf-8') nsstr = foo.to_string({"saml": saml.NAMESPACE}).decode('utf-8') - assert nsstr != txt + assert nsstr == txt # this must be the same print(txt) print(nsstr) assert "saml:AttributeValue" in nsstr - assert "saml:AttributeValue" not in txt + assert "saml:AttributeValue" in txt # this must be contained def test_set_text_empty(self): av = AttributeValue() diff --git a/tests/test_12_s_utils.py b/tests/test_12_s_utils.py index cd1be8e90..ea89a6e51 100644 --- a/tests/test_12_s_utils.py +++ b/tests/test_12_s_utils.py @@ -20,25 +20,25 @@ XML_HEADER = '\n' SUCCESS_STATUS_NO_HEADER = ( - '') + 'Value="urn:oasis:names:tc:SAML:2.0:status:Success" />') SUCCESS_STATUS = '%s%s' % (XML_HEADER, SUCCESS_STATUS_NO_HEADER) ERROR_STATUS_NO_HEADER = ( - 'Error resolving ' - 'principal') + '/>Error resolving ' + 'principal') ERROR_STATUS_NO_HEADER_EMPTY = ( - '') + '/>') ERROR_STATUS = '%s%s' % (XML_HEADER, ERROR_STATUS_NO_HEADER) ERROR_STATUS_EMPTY = '%s%s' % (XML_HEADER, ERROR_STATUS_NO_HEADER_EMPTY) diff --git a/tests/test_42_enc.py b/tests/test_42_enc.py index 97bdf8ea6..d15d62a8c 100644 --- a/tests/test_42_enc.py +++ b/tests/test_42_enc.py @@ -12,7 +12,7 @@ __author__ = 'roland' -TMPL_NO_HEADER = """my-rsa-key""" +TMPL_NO_HEADER = """my-rsa-key""" TMPL = "\n%s" % TMPL_NO_HEADER IDENTITY = {"eduPersonAffiliation": ["staff", "member"], diff --git a/tests/test_51_client.py b/tests/test_51_client.py index c1d525311..032e2a3d7 100644 --- a/tests/test_51_client.py +++ b/tests/test_51_client.py @@ -1536,7 +1536,7 @@ def test_do_logout_post(self): _dic = unpack_form(info["data"]) res = self.server.parse_logout_request(_dic["SAMLRequest"], BINDING_HTTP_POST) - assert b'_foo' in res.xmlstr + assert b'_foo' in res.xmlstr def test_do_logout_session_expired(self): # information about the user from an IdP @@ -1566,7 +1566,7 @@ def test_do_logout_session_expired(self): _dic = unpack_form(info["data"]) res = self.server.parse_logout_request(_dic["SAMLRequest"], BINDING_HTTP_POST) - assert b'_foo' in res.xmlstr + assert b'_foo' in res.xmlstr def test_signature_wants(self): @@ -3113,7 +3113,7 @@ def test_do_logout_post(self): _dic = unpack_form(info["data"]) res = self.server.parse_logout_request(_dic["SAMLRequest"], BINDING_HTTP_POST) - assert b'_foo' in res.xmlstr + assert b'_foo' in res.xmlstr def test_do_logout_session_expired(self): # information about the user from an IdP @@ -3143,7 +3143,7 @@ def test_do_logout_session_expired(self): _dic = unpack_form(info["data"]) res = self.server.parse_logout_request(_dic["SAMLRequest"], BINDING_HTTP_POST) - assert b'_foo' in res.xmlstr + assert b'_foo' in res.xmlstr # Below can only be done with dummy Server IDP = "urn:mace:example.com:saml:roland:idp" diff --git a/tests/test_88_nsprefix.py b/tests/test_88_nsprefix.py index 4f652a54f..83efe53a6 100644 --- a/tests/test_88_nsprefix.py +++ b/tests/test_88_nsprefix.py @@ -10,13 +10,15 @@ def test_nsprefix(): status_message = samlp.StatusMessage() status_message.text = "OK" - + + status_message.register_prefix(nspair={"samla": saml.NAMESPACE, + "samla": samlp.NAMESPACE}) txt = "%s" % status_message - assert "ns0:StatusMessage" in txt + assert "samla:StatusMessage" in txt - status_message.register_prefix({"saml2": saml.NAMESPACE, - "saml2p": samlp.NAMESPACE}) + status_message.register_prefix(nspair={"saml2p": samlp.NAMESPACE, + "saml2": saml.NAMESPACE}) txt = "%s" % status_message @@ -42,4 +44,4 @@ def test_nsprefix2(): assert "saml2:Issuer" in txt if __name__ == "__main__": - test_nsprefix2() \ No newline at end of file + test_nsprefix2()