mvantellingen / python-zeep

A Python SOAP client
http://docs.python-zeep.org
Other
1.88k stars 583 forks source link

AttributeError: 'BinarySignature' object has no attribute 'egress' #1262

Open Lamasape opened 2 years ago

Lamasape commented 2 years ago

Hi!!

zeep version 4.1.0

I am trying to add security headers exactly BinarySecurityToken and to be able to sign the headers of the worst adressing when using the BinarySignature plugin I get the following error: AttributeError: 'BinarySignature' object has no attribute 'egress'

This is the code I'm using:

`
   import shutil

from requests import Session
from zeep import Client, Settings, Transport, wsse
from OpenSSL import crypto
from zeep.wsa import WsAddressingPlugin
from lxml.builder import ElementMaker
import logging.config

from datetime import date
from pathlib import Path

from zeep.wsse import Signature, BinarySignature

from transport_with_attach import TransportWithAttach

logging.config.dictConfig({
    'version': 1,
    'formatters': {
        'verbose': {
            'format': '%(name)s: %(message)s'
        }
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose',
        },
    },
    'loggers': {
        'zeep.transports': {
            'level': 'DEBUG',
            'propagate': True,
            'handlers': ['console'],
        },
    }
})

wsdl_url = 'xxxxxxxxxxxxxxxxxxxxx'

def load_certificates_in_session():
    p12 = crypto.load_pkcs12(open("../XXX.p12", 'rb').read(), b"xxxxx")
    cert = crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate())
    key = crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey())

    with open('cert.pem', 'wb') as f:
        f.write(cert)
    with open('key.pem', 'wb') as f:
        f.write(key)

    session = Session()
    session.cert = ('./cert.pem', './key.pem')

    return session

def get_wsa_headers():
    wsa = ElementMaker(namespace='http://www.w3.org/2005/08/addressing')
    return [
        wsa.ReplyTo(wsa.Address('http://www.w3.org/2005/08/addressing/anonymous')),
    ]

def configure_client():
    session = load_certificates_in_session()
    settings = Settings(strict=False, xml_huge_tree=True)
    transport = Transport(session=session)

    return Client(
        wsdl_url,
        wsse=Signature(key_file='key.pem', certfile='cert.pem', password=None),
        transport=transport,
        service_name='ConsultaService',
        plugins=[WsAddressingPlugin(), wsse.BinarySignature(key_file='key.pem', certfile='cert.pem', password=None)
                 ],
        settings=settings,
    )

def configure_service_proxy(client):
    return client.create_service(
        '{XXXXXX,
        'XXXXXXX'
    )

def consulta():
    client = configure_client()
    service = configure_service_proxy(client)

    response = service.Consulta(_value_1=[{'ids': '1234'}, {'ids': '2225'}],
                                        _soapheaders=get_wsa_headers())

    print(response)

if __name__ == '__main__':
    consulta()

` I get this error:

Traceback (most recent call last):
  File "C:\Users\xxx\PycharmProjects\consulta\src\main.py", line 148, in <module>
    consulta()
  File "C:\Users\xxx\PycharmProjects\consulta\src\main.py", line 97, in consulta
    response = service.Consulta(_value_1=[{'ids': '1234'}, {'ids': '2225'}],
  File "C:\Users\xxx\PycharmProjects\consulta\venv\lib\site-packages\zeep\proxy.py", line 46, in __call__
    return self._proxy._binding.send(
  File "C:\Users\xxx\PycharmProjects\consulta\venv\lib\site-packages\zeep\wsdl\bindings\soap.py", line 123, in send
    envelope, http_headers = self._create(
  File "C:\Users\xxx\PycharmProjects\consulta\venv\lib\site-packages\zeep\wsdl\bindings\soap.py", line 90, in _create
    envelope, http_headers = plugins.apply_egress(
  File "C:\Users\xxx\PycharmProjects\consulta\venv\lib\site-packages\zeep\plugins.py", line 33, in apply_egress
    result = plugin.egress(envelope, http_headers, operation, binding_options)
AttributeError: 'BinarySignature' object has no attribute 'egress'

I can't even create a request.

Thanks very much for any info!

MeryGimenez commented 2 years ago

Hi! Can you resolve this issue with the BinarySignature?

gevezex commented 1 year ago

Is there any progress regarding this issue?

azban commented 5 months ago

using BinarySignature(...) for the wsse parameter, rather than in the plugin array fixed this for me, and works as intended, as far as i can tell