diff --git a/passerelle/apps/soap/models.py b/passerelle/apps/soap/models.py index f7baf8e8..e8fa07ac 100644 --- a/passerelle/apps/soap/models.py +++ b/passerelle/apps/soap/models.py @@ -52,10 +52,13 @@ class SOAPConnector(BaseResource, HTTPResource): verbose_name = _('SOAP connector') def clean(self): - try: - self.operations_and_schemas - except Exception as e: - raise ValidationError(e) + if (not self.client_certificate or self.client_certificate._committed) and ( + not self.trusted_certificate_authorities or self.trusted_certificate_authorities._committed + ): + try: + self.operations_and_schemas + except Exception as e: + raise ValidationError(e) @classmethod def get_manager_form_class(cls, **kwargs): diff --git a/tests/data/cert.pem b/tests/data/cert.pem new file mode 100644 index 00000000..7c8286b3 --- /dev/null +++ b/tests/data/cert.pem @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIIC6jCCAlOgAwIBAgIUe6FTOqFgqWRGMcAYv/OvZtPBgLYwDQYJKoZIhvcNAQEL +BQAwgYYxCzAJBgNVBAYTAlhYMRIwEAYDVQQIDAlTdGF0ZU5hbWUxETAPBgNVBAcM +CENpdHlOYW1lMRQwEgYDVQQKDAtDb21wYW55TmFtZTEbMBkGA1UECwwSQ29tcGFu +eVNlY3Rpb25OYW1lMR0wGwYDVQQDDBRDb21tb25OYW1lT3JIb3N0bmFtZTAeFw0y +MzA1MjUxNDU4NDFaFw0zMzA1MjIxNDU4NDFaMIGGMQswCQYDVQQGEwJYWDESMBAG +A1UECAwJU3RhdGVOYW1lMREwDwYDVQQHDAhDaXR5TmFtZTEUMBIGA1UECgwLQ29t +cGFueU5hbWUxGzAZBgNVBAsMEkNvbXBhbnlTZWN0aW9uTmFtZTEdMBsGA1UEAwwU +Q29tbW9uTmFtZU9ySG9zdG5hbWUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGB +AMSkMiZUdRRaI9jh3naKGjSHTEtO38TOEry87WKdb4mkJEXKPtgVVpIYbi2f2l0/ +kmUMMd3hF7Fos6DedbFTrJu50CC7wGAdjv8+9DO0WiIEWyjDERhwewqtWS/pcinE +CPrQfGBV1IqBLUTggDSigVFdMFe24G7yZtEuax/8U3enAgMBAAGjUzBRMB0GA1Ud +DgQWBBTbNks+EQxBIrAttpPa8CqnW7/s0TAfBgNVHSMEGDAWgBTbNks+EQxBIrAt +tpPa8CqnW7/s0TAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4GBAFXf +SwGh173QWUOds/Nc+ZP0ybkwetVzCQzd0bl60YQI/DBL2729tTYOSdKYIdC1ooOQ +V4/sRPy4/5ztRUGQl52fuwEQAftORDfnH50Vr2lrfauX+xEOr97HvpYmkG3ivLL2 +bk3urdjrkij/f5ROYKTWPY7nQAZchECgrHue7u6u +-----END CERTIFICATE----- diff --git a/tests/test_soap.py b/tests/test_soap.py index ec108bcb..38b92da3 100644 --- a/tests/test_soap.py +++ b/tests/test_soap.py @@ -17,6 +17,7 @@ import base64 import urllib.parse import pytest +from webtest import Upload from passerelle.apps.soap.models import SOAPConnector @@ -289,6 +290,41 @@ class TestManage: response = app.get(f'/soap/{connector.slug}/') assert response.pyquery('.down') + @pytest.mark.parametrize('soap', [SOAP12], indirect=True) + def test_add(self, app, connector, soap): + response = app.get('/manage/soap/add') + form = response.form + form.set('slug', 'soap') + form.set('title', 'SOAP simple') + form.set('description', 'soap') + form.set('wsdl_url', soap.WSDL_URL) + # 302 means success + form.submit(status=302) + + @pytest.mark.parametrize('soap', [BrokenSOAP12], indirect=True) + def test_add_broken(self, app, connector, soap): + response = app.get('/manage/soap/add') + form = response.form + form.set('slug', 'soap') + form.set('title', 'SOAP simple') + form.set('description', 'soap') + form.set('wsdl_url', soap.WSDL_URL) + # 302 means success + form.submit(status=200) + + @pytest.mark.parametrize('soap', [SOAP12], indirect=True) + def test_add_with_tls_certificate(self, app, connector, soap): + response = app.get('/manage/soap/add') + form = response.form + form.set('slug', 'soap') + form.set('title', 'SOAP with TLS') + form.set('description', 'soap') + form.set('wsdl_url', soap.WSDL_URL) + with open('tests/data/cert.pem', 'rb') as fd: + form.set('client_certificate', Upload('cert.pem', fd.read(), 'application/octet-stream')) + # 302 means success + form.submit(status=302) + @pytest.fixture def connector(db, soap):