#!/usr/bin/env python
import unittest, sys, sha, base64
from ZSI import _get_element_nsuri_name
from ZSI.parse import ParsedSoap
from ZSI.wstools.c14n import Canonicalize
from ZSI.wstools.Namespaces import WSA200403, SOAP
from cStringIO import StringIO
class CanonicalizeFromTestCase(unittest.TestCase):
"c14n tests, this has nothing to do with ws-addressing."
def setUp(self):
self.ps = ParsedSoap(XML_INST1)
self.el = filter(lambda el: _get_element_nsuri_name(el) == (WSA200403.ADDRESS, "From"),
self.ps.header_elements)[0]
def tearDown(self):
del self.ps
del self.el
def check_c14n(self):
"""http://www.w3.org/TR/xml-c14n
"""
s = StringIO()
Canonicalize(self.el, s, unsuppressedPrefixes=None)
cxml = s.getvalue()
d1 = base64.encodestring(sha.sha(C14N_INC1).digest()).strip()
d2 = base64.encodestring(sha.sha(cxml).digest()).strip()
self.assertEqual(d1, d2)
self.assertEqual(d1, C14N_INC1_DIGEST)
def check_c14n_exc(self):
"""http://www.w3.org/TR/xml-exc-c14n/
"""
s = StringIO()
Canonicalize(self.el, s, unsuppressedPrefixes=[])
cxml = s.getvalue()
d1 = base64.encodestring(sha.sha(C14N_EXCL1).digest()).strip()
d2 = base64.encodestring(sha.sha(cxml).digest()).strip()
self.assertEqual(d1, C14N_EXCL1_DIGEST)
self.assertEqual(d1, d2)
def check_c14n_exc2_unsuppressed(self):
"""http://www.w3.org/TR/xml-exc-c14n/
The method of canonicalization described in this specification receives
an InclusiveNamespaces PrefixList parameter, which lists namespace prefixes
that are handled in the manner described by the Canonical XML Recommendation
"""
s = StringIO()
Canonicalize(self.el, s, unsuppressedPrefixes=['xsi', 'xsd'])
cxml = s.getvalue()
d1 = base64.encodestring(sha.sha(C14N_EXCL2).digest()).strip()
d2 = base64.encodestring(sha.sha(cxml).digest()).strip()
self.assertEqual(d1, C14N_EXCL2_DIGEST)
self.assertEqual(d1, d2)
def check_c14n_exc3(self):
"""http://www.w3.org/TR/xml-exc-c14n/
tests if a namespace defined in a parent node to the top node
to be canonicalized is added when discovered that this namespace
is used.
"""
self.ps = ParsedSoap(XML_INST2)
self.el = self.ps.body
s = StringIO()
Canonicalize(self.el, s, unsuppressedPrefixes=[])
cxml = s.getvalue()
print cxml
d1 = base64.encodestring(sha.sha(C14N_EXCL3).digest()).strip()
d2 = base64.encodestring(sha.sha(cxml).digest()).strip()
self.assertEqual(d1, C14N_EXCL3_DIGEST)
self.assertEqual(d1, d2)
def xcheck_c14n_exc4(self):
RCVDIGEST = "jhTbi7gWlY9oLqsRr+EZ0bokRFA="
CALDIGEST = "IkMyI4zCDlK41qE7sZxvkFHJioU="
d1 = base64.encodestring(sha.sha(WRONG).digest()).strip()
d2 = base64.encodestring(sha.sha(CORRECT).digest()).strip()
ps = ParsedSoap(XML_INST4)
el = filter(lambda el: _get_element_nsuri_name(el) == (WSA200403.ADDRESS, "MessageID"),
ps.header_elements)[0]
s = StringIO()
Canonicalize(el, s, unsuppressedPrefixes=[])
cxml = s.getvalue()
print "-- "*20
print cxml
print "-- "*20
d3 = base64.encodestring(sha.sha(cxml).digest()).strip()
self.assertEqual(d1, RCVDIGEST)
self.assertEqual(d2, CALDIGEST)
self.assertEqual(d3, CALDIGEST)
def makeTestSuite():
suite = unittest.TestSuite()
#suite.addTest(unittest.makeSuite(CanonicalizeFromTestCase, "check"))
suite.addTest(unittest.makeSuite(CanonicalizeFromTestCase, "xcheck"))
return suite
C14N_EXCL1_DIGEST = "xSOXT+dlQwo5uT9PbK08of6W9PM="
C14N_EXCL1 = """http://bosshog.lbl.gov:9999/wsrf/services/SecureCounterService10577413"""
C14N_INC1_DIGEST = "qdU4f7/+BeHV/JlVGIPM90fNeV8="
C14N_INC1 = """http://bosshog.lbl.gov:9999/wsrf/services/SecureCounterService10577413"""
C14N_EXCL2_DIGEST = "+IEqF6DRo36Bh93A06S7C4Cmcuo="
C14N_EXCL2 = """http://bosshog.lbl.gov:9999/wsrf/services/SecureCounterService10577413"""
C14N_EXCL3_DIGEST = "VJvTr+Mx3TeWsQY6iwGbhAJ9/eA="
C14N_EXCL3 = """http://131.243.2.147:8888/wsrf/services/DelegationService8adaa710-ba01-11da-bc99-cbed73daa755"""
XML_INST1 = """
m9pihAqIBdcdk7ytDvccj89eWi8=
ofD+Ket5kzR2u/5jWKbFTMtmigk=
SoQ7RlJa3r94weDWBuWAg/BvydQ=
z6sCEkkRJrCuY/C0S5b+46WfyMs=
+IEqF6DRo36Bh93A06S7C4Cmcuo=
NFltkKAJpmMkPbJQj5MW1qVceto=
AAAAAAAAAAMAAAvZTrXlZjRSO7tP12tId+lehprEKgk=
3b1ef410-ab3d-11da-9436-88b687faed94uuid:3d592ca0-ab3d-11da-9436-88b687faed94http://schemas.xmlsoap.org/ws/2004/03/addressing/role/anonymoushttp://counter.com/CounterPortType/addResponsehttp://bosshog.lbl.gov:9999/wsrf/services/SecureCounterService10577413uuid:1141449047.0513"""
XML_INST2 = """
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
xqoPUGjk97yY+StAheOFmeaHgbw=
VJvTr+Mx3TeWsQY6iwGbhAJ9/eA=
W1PrEK32GMCbF6FTEmlYiYwqAeQ=
lWhqYlKqBnB4LwkRWyXMwHy18hc=
2Zjgz4McHaxMLfpBbqelAqWvRsU=
knsi7QmfOvjrn5mWClmsbCpZ32A=
/yBXQ0yxPqpgSGYym/DA08k0dXM=
LuGNfoVBzUIoF0AU0lzJkH9kAOi+PQVG8hMrCIEjWh1lifSG/bquhu/qZVq78x3UR+tGK411hWuQ
nGle1GvY0A==
2006-03-23T00:11:14Z2006-03-23T00:16:14Zuuid:8aec8160-ba01-11da-bc99-cbed73daa755http://schemas.xmlsoap.org/ws/2004/03/addressing/role/anonymoushttp://www.globus.org/08/2004/delegationService/DelegationFactoryPortType/RequestSecurityTokenResponsehttp://bosshog.lbl.gov:8888/wsrf/services/DelegationFactoryServiceuuid:1143072675.25http://131.243.2.147:8888/wsrf/services/DelegationService8adaa710-ba01-11da-bc99-cbed73daa755"""
CORRECT = """uuid:1143760705.98"""
WRONG = """uuid:1143760705.98"""
XML_INST4 = """
uuid:1143760705.98http://counter.com/CounterPortType/createCounterRequesthttp://131.243.2.159:9080/wsrf/services/SecureCounterServicehttp://schemas.xmlsoap.org/ws/2004/03/addressing/role/anonymous
IkMyI4zCDlK41qE7sZxvkFHJioU=
DyEF6Pa7w3SSEVJ98LIoX2LW85k=
p/2PhmYP+/1UPcpwsRcdlvLmOAg=
KFLeYjf5ohGUIoPoZV/oew9SuUM=
7Gg0SC1wltHVAwiOfdgZsGM9W5g=
AAAAAAAAAAEAAAdrBxzrHLZG4NglRglL9F3rKQu0658=
1000"""
def main():
unittest.main(defaultTest="makeTestSuite")
if __name__ == '__main__':
main()