Skip to content

Commit 758dd29

Browse files
committed
Improve spec fidelity by creating union of all SignedParts
1 parent 9670129 commit 758dd29

File tree

3 files changed

+13
-6
lines changed

3 files changed

+13
-6
lines changed

src/zeep/wsdl/definitions.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ def __init__(self, wsdl, name, port_name):
136136
self.wsdl = wsdl
137137
self._operations = {}
138138
self.signatures = {
139-
"header": [], # Elements of header, that should be signed
139+
"header": [], # Parts of header, that should be signed
140140
"body": False, # If body should be signed
141141
"everything": False, # If every header should be signed
142142
}

src/zeep/wsdl/wsdl.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,9 @@ def parse_binding(
454454
),
455455
namespaces=NSMAP,
456456
)
457+
# Initialize a set to keep track of all unique headers
458+
all_headers = set()
459+
457460
for sign in signed_parts:
458461
if len(sign.getchildren()) == 0:
459462
# No children, we should sign everything
@@ -464,11 +467,15 @@ def parse_binding(
464467
for child in sign.iterchildren():
465468
if len(child.items()) > 0:
466469
# Header ...
467-
part = {attr: value for attr, value in child.items()}
468-
binding.signatures["header"].append(part)
470+
part = frozenset({attr: value for attr, value in child.items()}.items())
471+
all_headers.add(part)
469472
elif child.tag.split("}")[-1].lower() == "body":
470473
# Body ...
471474
binding.signatures["body"] = True
475+
476+
# If we didn't set "everything" to True, update the headers
477+
if not binding.signatures.get("everything", False):
478+
binding.signatures["header"] = [dict(header) for header in all_headers]
472479
logger.debug("Adding binding: %s", binding.name.text)
473480
result[binding.name.text] = binding
474481
break

src/zeep/wsse/signature.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -254,18 +254,18 @@ def _signature_prepare(envelope, key, signature_method, digest_method, signature
254254
if timestamp != None:
255255
_sign_node(ctx, signature, timestamp, digest_method)
256256
else:
257-
if signatures["body"] or signatures["everything"]:
257+
if signatures.get("body") or signatures.get("everything"):
258258
_sign_node(
259259
ctx, signature, envelope.find(QName(soap_env, "Body")), digest_method
260260
)
261261
header = get_or_create_header(envelope)
262-
if signatures["everything"]:
262+
if signatures.get("everything"):
263263
for node in header.iterchildren():
264264
# Everything doesn't mean everything ...
265265
if node.nsmap.get(node.prefix) not in OMITTED_HEADERS:
266266
_sign_node(ctx, signature, node, digest_method)
267267
else:
268-
for node in signatures["header"]:
268+
for node in signatures.get("header", []):
269269
_sign_node(
270270
ctx,
271271
signature,

0 commit comments

Comments
 (0)