14
14
from zeep import ns
15
15
from zeep .exceptions import SignatureVerificationFailed
16
16
from zeep .utils import detect_soap_env
17
+ from zeep .wsdl .utils import get_or_create_header
17
18
from zeep .wsse .utils import ensure_id , get_security_header
18
19
19
20
try :
@@ -52,9 +53,9 @@ def __init__(self, key_data, cert_data, password=None):
52
53
self .cert_data = cert_data
53
54
self .password = password
54
55
55
- def apply (self , envelope , headers ):
56
+ def apply (self , envelope , headers , operation_obj ):
56
57
key = _make_sign_key (self .key_data , self .cert_data , self .password )
57
- _sign_envelope_with_key (envelope , key )
58
+ _sign_envelope_with_key (envelope , key , operation_obj )
58
59
return envelope , headers
59
60
60
61
def verify (self , envelope ):
@@ -173,7 +174,7 @@ def sign_envelope(envelope, keyfile, certfile, password=None):
173
174
return _sign_envelope_with_key (envelope , key )
174
175
175
176
176
- def _sign_envelope_with_key (envelope , key ):
177
+ def _sign_envelope_with_key (envelope , key , operation_obj ):
177
178
soap_env = detect_soap_env (envelope )
178
179
179
180
# Create the Signature node.
@@ -198,8 +199,18 @@ def _sign_envelope_with_key(envelope, key):
198
199
# Perform the actual signing.
199
200
ctx = xmlsec .SignatureContext ()
200
201
ctx .key = key
201
- _sign_node ( ctx , signature , envelope . find ( QName ( soap_env , 'Body' )))
202
+ # Sign default elements
202
203
_sign_node (ctx , signature , security .find (QName (ns .WSU , 'Timestamp' )))
204
+ if operation_obj .binding .signatures ['body' ] or operation_obj .binding .signatures ['everything' ]:
205
+ _sign_node (ctx , signature , envelope .find (QName (soap_env , 'Body' )))
206
+ # Sign extra elements defined in WSDL
207
+ header = get_or_create_header (envelope )
208
+ if operation_obj .binding .signatures ['everything' ]:
209
+ for node in header .iterchildren ():
210
+ _sign_node (ctx , signature , node )
211
+ else :
212
+ for node in operation_obj .binding .signatures ['header' ]:
213
+ _sign_node (ctx , signature , header .find (QName (node ['Namespace' ], node ['Name' ])))
203
214
ctx .sign (signature )
204
215
205
216
# Place the X509 data inside a WSSE SecurityTokenReference within
0 commit comments