sne: start connector(#77933) #267

Merged
ecazenave merged 1 commits from wip/77933-sne into main 2023-06-01 16:58:08 +02:00
15 changed files with 700 additions and 0 deletions

2
debian/control vendored
View File

@ -17,6 +17,7 @@ Depends: ghostscript,
pdftk,
poppler-utils,
python3-cmislib,
python3-cryptography,
python3-dateutil,
python3-distutils,
python3-django (>= 2:3.2),
@ -43,6 +44,7 @@ Depends: ghostscript,
python3-uwsgidecorators,
python3-vobject,
python3-xmlschema,
python3-xmltodict,
python3-zeep (>= 3.2),
${misc:Depends},
${python3:Depends},

View File

View File

@ -0,0 +1,75 @@
# Generated by Django 3.2.18 on 2023-05-31 08:55
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('base', '0030_resourcelog_base_resour_appname_298cbc_idx'),
]
operations = [
migrations.CreateModel(
name='SNE',
fields=[
(
'id',
models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
('title', models.CharField(max_length=50, verbose_name='Title')),
('slug', models.SlugField(unique=True, verbose_name='Identifier')),
('description', models.TextField(verbose_name='Description')),
(
'basic_auth_username',
models.CharField(
blank=True, max_length=128, verbose_name='Basic authentication username'
),
),
(
'basic_auth_password',
models.CharField(
blank=True, max_length=128, verbose_name='Basic authentication password'
),
),
(
'client_certificate',
models.FileField(
blank=True, null=True, upload_to='', verbose_name='TLS client certificate'
),
),
(
'trusted_certificate_authorities',
models.FileField(blank=True, null=True, upload_to='', verbose_name='TLS trusted CAs'),
),
(
'verify_cert',
models.BooleanField(blank=True, default=True, verbose_name='TLS verify certificates'),
),
(
'http_proxy',
models.CharField(blank=True, max_length=128, verbose_name='HTTP and HTTPS proxy'),
),
(
'wsdl_url',
models.URLField(
help_text='URL of the WSDL file', max_length=400, verbose_name='WSDL URL'
),
),
(
'certificate_name',
models.CharField(max_length=128, verbose_name='SOAP client certificate name'),
),
(
'users',
models.ManyToManyField(
blank=True, related_name='_sne_sne_users_+', related_query_name='+', to='base.ApiUser'
),
),
],
options={
'verbose_name': 'SNE',
},
),
]

View File

@ -0,0 +1,78 @@
# passerelle - uniform access to multiple data sources and services
# Copyright (C) 2023 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import xmltodict
from cryptography import x509
from cryptography.hazmat.primitives import serialization
from django.db import models
from django.utils.translation import gettext_lazy as _
from passerelle.base.models import BaseResource, HTTPResource
from passerelle.utils.api import endpoint
class SNE(BaseResource, HTTPResource):
wsdl_url = models.URLField(
max_length=400, verbose_name=_('WSDL URL'), help_text=_('URL of the WSDL file')
)
certificate_name = models.CharField(max_length=128, verbose_name=_('Client certificate name'))
category = _('Business Process Connectors')
class Meta:
verbose_name = _('SNE')
@classmethod
def get_manager_form_class(cls, **kwargs):
form_class = super().get_manager_form_class(**kwargs)
form_class.base_fields['client_certificate'].required = True
return form_class
@property
def cert_public_bytes(self):
with self.client_certificate.open('rb') as f:
certs = x509.load_pem_x509_certificates(f.read())
cert = certs[0]
return cert.public_bytes(encoding=serialization.Encoding.PEM)
def check_status(self):
response = self.requests.get(self.wsdl_url)
response.raise_for_status()
@endpoint(
name='get-demande-logement',
description=_('Get informations on housing demand'),
parameters={
'demand_id': {
'example_value': '1',
}
},
)
def get_demande_logement(self, request, demand_id, **kwargs):
client = self.soap_client(wsdl_url=self.wsdl_url, api_error=True)
cert_type = client.get_type('{http://ws.metier.nuu.application.i2/}base64Binary')
cert = cert_type(_value_1=self.cert_public_bytes)
res = client.service.getDemandeLogement(
numUnique=demand_id, nomCertificat=self.certificate_name, certificat=cert
)
namespaces = {
'http://nuu.application.i2/': None,
}
return {
'data': xmltodict.parse(
res['fichierDemande']['_value_1'], process_namespaces=True, namespaces=namespaces
)
}

View File

@ -179,6 +179,7 @@ INSTALLED_APPS = (
'passerelle.apps.signal_arretes',
'passerelle.apps.sivin',
'passerelle.apps.smsfactor',
'passerelle.apps.sne',
'passerelle.apps.soap',
'passerelle.apps.solis',
'passerelle.apps.twilio',

View File

@ -172,6 +172,8 @@ setup(
'python-ldap',
'pyOpenSSL',
'roman',
'cryptography',
'xmltodict',
],
cmdclass={
'build': build,

View File

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Published by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.3.1 svn-revision#6ef5f7eb9a938dbc4562f25f8fa0b67cc4ff2dbb. -->
<!-- Generated by JAX-WS RI (http://javaee.github.io/metro-jax-ws). RI's version is JAX-WS RI 2.3.1 svn-revision#6ef5f7eb9a938dbc4562f25f8fa0b67cc4ff2dbb. -->
<definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:tns="http://ws.metier.wsexternes.nuu.e2.gouv.fr/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://ws.metier.wsexternes.nuu.e2.gouv.fr/" name="DemandeLogementServiceService">
<import namespace="http://ws.metier.nuu.application.i2/" location="http://sne2-ws.j2ee.eco.edcs.fr:80/services/DemandeLogementImplService?wsdl=1"/>
<wsp:Policy wsu:Id="DemandeLogementServicePortBinding_MTOM_Policy-DemandeLogementServicePortBinding_WSAM_Addressing_Policy">
<ns1:OptimizedMimeSerialization xmlns:ns1="http://schemas.xmlsoap.org/ws/2004/09/policy/optimizedmimeserialization" wsp:Optional="true"/>
<wsam:Addressing wsp:Optional="true">
<wsp:Policy/>
</wsam:Addressing>
</wsp:Policy>
<binding xmlns:ns2="http://ws.metier.nuu.application.i2/" name="DemandeLogementServicePortBinding" type="ns2:DemandeLogementPortType">
<wsaw:UsingAddressing/>
<wsp:PolicyReference URI="#DemandeLogementServicePortBinding_MTOM_Policy-DemandeLogementServicePortBinding_WSAM_Addressing_Policy"/>
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="getNumUnique">
<soap12:operation soapAction="http://ws.metier.nuu.application.i2/getNumUnique"/>
<input>
<soap12:body use="literal"/>
</input>
<output>
<soap12:body use="literal"/>
</output>
</operation>
<operation name="getDemandeLogement">
<soap12:operation soapAction="http://ws.metier.nuu.application.i2/getDemandeLogement"/>
<input>
<soap12:body use="literal"/>
</input>
<output>
<soap12:body use="literal"/>
</output>
</operation>
<operation name="getDoublons">
<soap12:operation soapAction="http://ws.metier.nuu.application.i2/getDoublons"/>
<input>
<soap12:body use="literal"/>
</input>
<output>
<soap12:body use="literal"/>
</output>
</operation>
<operation name="getDeclarationNouveauDalo">
<soap12:operation soapAction="http://ws.metier.nuu.application.i2/getDeclarationNouveauDalo"/>
<input>
<soap12:body use="literal"/>
</input>
<output>
<soap12:body use="literal"/>
</output>
</operation>
<operation name="getDemandesRadieesDepuisLe">
<soap12:operation soapAction="http://ws.metier.nuu.application.i2/getDemandesRadieesDepuisLe"/>
<input>
<soap12:body use="literal"/>
</input>
<output>
<soap12:body use="literal"/>
</output>
</operation>
<operation name="getNouveauxDaloDepuisLe">
<soap12:operation soapAction="http://ws.metier.nuu.application.i2/getNouveauxDaloDepuisLe"/>
<input>
<soap12:body use="literal"/>
</input>
<output>
<soap12:body use="literal"/>
</output>
</operation>
</binding>
<service name="DemandeLogementServiceService">
<port name="DemandeLogementServicePort" binding="tns:DemandeLogementServicePortBinding">
<soap12:address location="http://sne2-ws.j2ee.eco.edcs.fr:80/services/DemandeLogementImplService"/>
</port>
</service>
</definitions>

View File

@ -0,0 +1,154 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Published by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.3.1 svn-revision#6ef5f7eb9a938dbc4562f25f8fa0b67cc4ff2dbb. -->
<xs:schema xmlns:tns="http://ws.metier.nuu.application.i2/" xmlns:xmime="http://www.w3.org/2005/05/xmlmime" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" targetNamespace="http://ws.metier.nuu.application.i2/">
<xs:import namespace="http://www.w3.org/2005/05/xmlmime" schemaLocation="http://www.w3.org/2005/05/xmlmime"/>
<xs:element name="declarationNouveauDaloParametres">
<xs:complexType>
<xs:sequence>
<xs:element name="nomFichierDalo" type="xs:string"/>
<xs:element name="fichierDalo" type="tns:base64Binary"/>
<xs:element name="nomCertificat" type="xs:string"/>
<xs:element name="certificat" type="tns:base64Binary"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="declarationNouveauDaloReponse">
<xs:complexType>
<xs:sequence>
<xs:element name="nomFichierDalo" type="xs:string"/>
<xs:element name="fichierDalo" type="tns:base64Binary"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="demandeLogementParametres">
<xs:complexType>
<xs:sequence>
<xs:element name="numUnique" type="xs:string"/>
<xs:element name="nomCertificat" type="xs:string"/>
<xs:element name="certificat" type="tns:base64Binary"/>
<xs:element name="complet" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="demandeLogementReponse">
<xs:complexType>
<xs:sequence>
<xs:element name="nomFichierDemande" type="xs:string"/>
<xs:element name="fichierDemande" type="tns:base64Binary"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="demandesRadieesDepuisLeParametres">
<xs:complexType>
<xs:sequence>
<xs:element name="dateRadiationDepuisLe" type="xs:dateTime"/>
<xs:element name="motifRadiation" type="tns:codeElement" minOccurs="0"/>
<xs:element name="statutDalo" type="tns:codeElement" minOccurs="0"/>
<xs:element name="typeReservataire" type="tns:codeElement" minOccurs="0"/>
<xs:element name="nomCertificat" type="xs:string"/>
<xs:element name="certificat" type="tns:base64Binary"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="demandesRadieesDepuisLeReponse">
<xs:complexType>
<xs:sequence>
<xs:element name="nomFichierDemandesRadiees" type="xs:string" minOccurs="0"/>
<xs:element name="fichierDemandesRadiees" type="tns:base64Binary" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="fichierXmlParametres">
<xs:complexType>
<xs:sequence>
<xs:element name="nomFichier" type="xs:string"/>
<xs:element name="fichierXml" type="tns:base64Binary"/>
<xs:element name="nomCertificat" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="fichierXmlReponse">
<xs:complexType>
<xs:sequence>
<xs:element name="nomFichierXmlRetour" type="xs:string"/>
<xs:element name="fichierXmlRetour" type="tns:base64Binary"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="nouveauxDaloDepuisLeParametres">
<xs:complexType>
<xs:sequence>
<xs:element name="dateNouveauDaloDepuisLe" type="xs:dateTime"/>
<xs:element name="nomCertificat" type="xs:string"/>
<xs:element name="certificat" type="tns:base64Binary"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="nouveauxDaloDepuisLeReponse">
<xs:complexType>
<xs:sequence>
<xs:element name="nomFichierNouveauxDalo" type="xs:string" minOccurs="0"/>
<xs:element name="fichierNouveauxDalo" type="tns:base64Binary" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="numUniqueParametres">
<xs:complexType>
<xs:sequence>
<xs:element name="nomFichierDemande" type="xs:string"/>
<xs:element name="fichierDemande" type="tns:base64Binary"/>
<xs:element name="nomCertificat" type="xs:string"/>
<xs:element name="certificat" type="tns:base64Binary"/>
<xs:element name="complet" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="numUniqueReponse">
<xs:complexType>
<xs:sequence>
<xs:element name="nomFichierDemande" type="xs:string"/>
<xs:element name="fichierDemande" type="tns:base64Binary"/>
<xs:element name="nomAttestation" type="xs:string" minOccurs="0"/>
<xs:element name="attestation" type="tns:base64Binary" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="rechercheDoublonsParametres">
<xs:complexType>
<xs:sequence>
<xs:element name="nomFichierDemande" type="xs:string"/>
<xs:element name="fichierDemande" type="tns:base64Binary"/>
<xs:element name="anru" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="rechercheDoublonsReponse">
<xs:complexType>
<xs:sequence>
<xs:element name="nomFichierDoublons" type="xs:string" minOccurs="0"/>
<xs:element name="listeDoublons" type="tns:base64Binary" minOccurs="0"/>
<xs:element name="nomFichierDemande" type="xs:string" minOccurs="0"/>
<xs:element name="fichierDemande" type="tns:base64Binary" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="hexBinary">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute ref="tns:contentType"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="codeElement">
<xs:sequence/>
<xs:attribute name="code" type="xs:string"/>
</xs:complexType>
<xs:complexType name="base64Binary">
<xs:simpleContent>
<xs:extension base="xs:base64Binary">
<xs:attribute ref="tns:contentType"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:attribute name="contentType" type="xs:string"/>
</xs:schema>

View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Published by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.3.1 svn-revision#6ef5f7eb9a938dbc4562f25f8fa0b67cc4ff2dbb. -->
<!-- Generated by JAX-WS RI (http://javaee.github.io/metro-jax-ws). RI's version is JAX-WS RI 2.3.1 svn-revision#6ef5f7eb9a938dbc4562f25f8fa0b67cc4ff2dbb. -->
<definitions xmlns:tns="http://ws.metier.nuu.application.i2/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://ws.metier.nuu.application.i2/">
<types>
<xsd:schema>
<xsd:import namespace="http://ws.metier.nuu.application.i2/" schemaLocation="http://sne2-ws.j2ee.eco.edcs.fr:80/services/DemandeLogementImplService?xsd=1"/>
</xsd:schema>
</types>
<message name="getNumUnique">
<part name="parameters" element="tns:numUniqueParametres"/>
</message>
<message name="getNumUniqueResponse">
<part name="return" element="tns:numUniqueReponse"/>
</message>
<message name="getDemandeLogement">
<part name="parameters" element="tns:demandeLogementParametres"/>
</message>
<message name="getDemandeLogementResponse">
<part name="return" element="tns:demandeLogementReponse"/>
</message>
<message name="getDoublons">
<part name="parameters" element="tns:rechercheDoublonsParametres"/>
</message>
<message name="getDoublonsResponse">
<part name="return" element="tns:rechercheDoublonsReponse"/>
</message>
<message name="getDeclarationNouveauDalo">
<part name="parameters" element="tns:declarationNouveauDaloParametres"/>
</message>
<message name="getDeclarationNouveauDaloResponse">
<part name="return" element="tns:declarationNouveauDaloReponse"/>
</message>
<message name="getDemandesRadieesDepuisLe">
<part name="parameters" element="tns:demandesRadieesDepuisLeParametres"/>
</message>
<message name="getDemandesRadieesDepuisLeResponse">
<part name="return" element="tns:demandesRadieesDepuisLeReponse"/>
</message>
<message name="getNouveauxDaloDepuisLe">
<part name="parameters" element="tns:nouveauxDaloDepuisLeParametres"/>
</message>
<message name="getNouveauxDaloDepuisLeResponse">
<part name="return" element="tns:nouveauxDaloDepuisLeReponse"/>
</message>
<portType name="DemandeLogementPortType">
<operation name="getNumUnique">
<input xmlns:ns1="http://www.w3.org/2007/05/addressing/metadata" ns1:Action="http://ws.metier.nuu.application.i2/getNumUnique" message="tns:getNumUnique"/>
<output xmlns:ns2="http://www.w3.org/2007/05/addressing/metadata" ns2:Action="http://ws.metier.nuu.application.i2/DemandeLogementPortType/getNumUniqueResponse" message="tns:getNumUniqueResponse"/>
</operation>
<operation name="getDemandeLogement">
<input xmlns:ns3="http://www.w3.org/2007/05/addressing/metadata" ns3:Action="http://ws.metier.nuu.application.i2/getDemandeLogement" message="tns:getDemandeLogement"/>
<output xmlns:ns4="http://www.w3.org/2007/05/addressing/metadata" ns4:Action="http://ws.metier.nuu.application.i2/DemandeLogementPortType/getDemandeLogementResponse" message="tns:getDemandeLogementResponse"/>
</operation>
<operation name="getDoublons">
<input xmlns:ns5="http://www.w3.org/2007/05/addressing/metadata" ns5:Action="http://ws.metier.nuu.application.i2/getDoublons" message="tns:getDoublons"/>
<output xmlns:ns6="http://www.w3.org/2007/05/addressing/metadata" ns6:Action="http://ws.metier.nuu.application.i2/DemandeLogementPortType/getDoublonsResponse" message="tns:getDoublonsResponse"/>
</operation>
<operation name="getDeclarationNouveauDalo">
<input xmlns:ns7="http://www.w3.org/2007/05/addressing/metadata" ns7:Action="http://ws.metier.nuu.application.i2/getDeclarationNouveauDalo" message="tns:getDeclarationNouveauDalo"/>
<output xmlns:ns8="http://www.w3.org/2007/05/addressing/metadata" ns8:Action="http://ws.metier.nuu.application.i2/DemandeLogementPortType/getDeclarationNouveauDaloResponse" message="tns:getDeclarationNouveauDaloResponse"/>
</operation>
<operation name="getDemandesRadieesDepuisLe">
<input xmlns:ns9="http://www.w3.org/2007/05/addressing/metadata" ns9:Action="http://ws.metier.nuu.application.i2/getDemandesRadieesDepuisLe" message="tns:getDemandesRadieesDepuisLe"/>
<output xmlns:ns10="http://www.w3.org/2007/05/addressing/metadata" ns10:Action="http://ws.metier.nuu.application.i2/DemandeLogementPortType/getDemandesRadieesDepuisLeResponse" message="tns:getDemandesRadieesDepuisLeResponse"/>
</operation>
<operation name="getNouveauxDaloDepuisLe">
<input xmlns:ns11="http://www.w3.org/2007/05/addressing/metadata" ns11:Action="http://ws.metier.nuu.application.i2/getNouveauxDaloDepuisLe" message="tns:getNouveauxDaloDepuisLe"/>
<output xmlns:ns12="http://www.w3.org/2007/05/addressing/metadata" ns12:Action="http://ws.metier.nuu.application.i2/DemandeLogementPortType/getNouveauxDaloDepuisLeResponse" message="tns:getNouveauxDaloDepuisLeResponse"/>
</operation>
</portType>
</definitions>

74
tests/data/sne/cert.pem Normal file
View File

@ -0,0 +1,74 @@
Certificate:
Outdated
Review

Ca serait bien de mettre le certificat "y compris en texte", autrement dit poser plutôt ici la sortie de "openssl x509 -in cert.pem -text"

Ca serait bien de mettre le certificat "y compris en texte", autrement dit poser plutôt ici la sortie de "openssl x509 -in cert.pem -text"
Data:
Version: 3 (0x2)
Outdated
Review

Evitons de poser un vrai certificat comprenant le nom d'une vraie personne. Je pense que le test passera tout aussi bien avec un certificat bêtement autosigné (genre copier bêtement celui qui est déjà dans tests/ldap/cert.pem)

Evitons de poser un vrai certificat comprenant le nom d'une vraie personne. Je pense que le test passera tout aussi bien avec un certificat bêtement autosigné (genre copier bêtement celui qui est déjà dans tests/ldap/cert.pem)

Voilà.

Voilà.
Serial Number:
4c:aa:29:4f:be:82:16:5b:15:70:8e:c5:02:29:5a:60:b2:0b:cf:4a
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN = localhost.entrouvert.org
Validity
Not Before: Dec 5 16:59:24 2018 GMT
Not After : Dec 2 16:59:24 2028 GMT
Subject: CN = localhost.entrouvert.org
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:e3:1b:0b:9f:6e:72:8a:db:5b:8e:4e:5b:70:ab:
d8:d8:8f:33:3e:2b:cb:e9:85:a7:d8:c2:62:99:a4:
10:48:dc:c2:c3:ff:0f:3a:65:4f:2e:63:08:6f:79:
5c:66:3c:9d:15:16:9d:f9:14:f1:65:f9:ee:bc:20:
89:ae:71:ab:1b:b8:4e:b0:93:5e:9d:32:cb:53:4b:
a0:37:fc:90:d7:ce:bd:70:cd:3b:6b:db:63:4b:32:
fb:34:2c:fd:1f:53:48:2b:5f:90:70:1b:13:13:17:
3b:ed:d3:96:a7:05:88:f5:38:ea:61:84:4b:fb:37:
b1:de:69:7c:71:da:9c:43:b0:50:51:0c:40:bc:0e:
14:53:ad:c3:33:61:be:e4:ed:dd:13:b9:7c:ba:fc:
81:51:4d:e4:5b:fb:21:1f:28:5f:c1:e5:8d:5c:ef:
08:5d:72:23:bc:37:cf:62:43:ac:8d:ce:9e:9f:69:
05:32:bf:ac:10:d4:94:2a:07:c3:2a:3c:ff:53:3a:
b2:4b:b2:c1:6f:8b:64:24:02:d9:33:c4:0f:e7:a5:
5e:40:01:b5:25:91:76:27:6f:f2:d5:1a:81:7c:81:
91:20:49:18:a1:a1:dc:8f:a5:00:4d:96:b5:c5:c6:
63:32:e6:cb:cf:7a:2d:44:d6:1c:45:72:89:31:85:
86:6d
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
X509v3 Subject Alternative Name:
DNS:localhost.entrouvert.org
Signature Algorithm: sha256WithRSAEncryption
15:53:da:bc:16:a1:98:88:e0:9d:38:ea:e9:96:c5:c5:74:cd:
25:6d:13:ae:a3:7c:a2:56:ca:27:a4:9f:c1:65:64:d0:8f:29:
c7:b3:ce:7a:41:5a:5d:df:9e:82:c1:49:95:66:32:1f:da:b8:
1e:42:a8:b5:d7:51:61:8a:d6:a1:77:0f:8a:87:4d:7d:46:be:
6d:19:e1:d9:66:25:da:b1:06:31:6e:5d:6c:17:ff:31:80:83:
b6:ce:bc:73:74:a8:03:b2:48:60:9f:30:d1:06:46:02:48:a3:
28:db:55:30:bd:3f:16:b2:ee:25:66:df:14:10:16:1f:c2:41:
e3:a0:5c:02:0f:fc:7e:56:cc:1c:05:0b:cd:5d:c5:d6:0f:ef:
d0:0d:c5:1b:76:3f:f5:f5:6b:fa:53:79:aa:cf:8d:07:d3:57:
20:c7:5f:e7:05:eb:98:94:18:46:3a:2d:c8:e8:d4:3b:ac:93:
16:a0:c5:be:a1:3b:0c:4a:4a:40:3e:61:9e:fa:89:a1:70:b3:
cd:84:12:d4:38:c7:d6:a4:91:73:9b:c2:f0:8e:d8:94:9a:30:
09:f9:c8:f4:cb:04:20:24:ab:b2:4e:f9:0e:14:f4:f7:56:89:
0b:65:d7:f7:7a:38:ce:17:cd:c6:63:b9:2a:3d:bc:84:ff:3b:
18:78:0d:22
-----BEGIN CERTIFICATE-----
MIIDBjCCAe6gAwIBAgIUTKopT76CFlsVcI7FAilaYLILz0owDQYJKoZIhvcNAQEL
BQAwIzEhMB8GA1UEAwwYbG9jYWxob3N0LmVudHJvdXZlcnQub3JnMB4XDTE4MTIw
NTE2NTkyNFoXDTI4MTIwMjE2NTkyNFowIzEhMB8GA1UEAwwYbG9jYWxob3N0LmVu
dHJvdXZlcnQub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4xsL
n25yittbjk5bcKvY2I8zPivL6YWn2MJimaQQSNzCw/8POmVPLmMIb3lcZjydFRad
+RTxZfnuvCCJrnGrG7hOsJNenTLLU0ugN/yQ1869cM07a9tjSzL7NCz9H1NIK1+Q
cBsTExc77dOWpwWI9TjqYYRL+zex3ml8cdqcQ7BQUQxAvA4UU63DM2G+5O3dE7l8
uvyBUU3kW/shHyhfweWNXO8IXXIjvDfPYkOsjc6en2kFMr+sENSUKgfDKjz/Uzqy
S7LBb4tkJALZM8QP56VeQAG1JZF2J2/y1RqBfIGRIEkYoaHcj6UATZa1xcZjMubL
z3otRNYcRXKJMYWGbQIDAQABozIwMDAJBgNVHRMEAjAAMCMGA1UdEQQcMBqCGGxv
Y2FsaG9zdC5lbnRyb3V2ZXJ0Lm9yZzANBgkqhkiG9w0BAQsFAAOCAQEAFVPavBah
mIjgnTjq6ZbFxXTNJW0TrqN8olbKJ6SfwWVk0I8px7POekFaXd+egsFJlWYyH9q4
HkKotddRYYrWoXcPiodNfUa+bRnh2WYl2rEGMW5dbBf/MYCDts68c3SoA7JIYJ8w
0QZGAkijKNtVML0/FrLuJWbfFBAWH8JB46BcAg/8flbMHAULzV3F1g/v0A3FG3Y/
9fVr+lN5qs+NB9NXIMdf5wXrmJQYRjotyOjUO6yTFqDFvqE7DEpKQD5hnvqJoXCz
zYQS1DjH1qSRc5vC8I7YlJowCfnI9MsEICSrsk75DhT091aJC2XX93o4zhfNxmO5
Kj28hP87GHgNIg==
-----END CERTIFICATE-----

View File

@ -0,0 +1,7 @@
--uuid:7902e9bd-21a8-4632-8760-d79a67eb89a1
Content-Id: <rootpart*7902e9bd-21a8-4632-8760-d79a67eb89a1@example.jaxws.sun.com>
Content-Type: application/xop+xml;charset=utf-8;type="application/soap+xml"
Content-Transfer-Encoding: binary
<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope"><S:Header><Action xmlns="http://www.w3.org/2005/08/addressing">http://www.w3.org/2005/08/addressing/fault</Action><MessageID xmlns="http://www.w3.org/2005/08/addressing">uuid:1e213982-4a8d-4722-bb24-a2c5f48dd5c7</MessageID><RelatesTo xmlns="http://www.w3.org/2005/08/addressing">urn:uuid:93d3b273-c123-4277-b288-24a77b1e90dc</RelatesTo><To xmlns="http://www.w3.org/2005/08/addressing">http://www.w3.org/2005/08/addressing/anonymous</To></S:Header><S:Body><S:Fault xmlns:ns4="http://schemas.xmlsoap.org/soap/envelope/"><S:Code><S:Value>S:Receiver</S:Value></S:Code><S:Reason><S:Text xml:lang="fr">La demande de logement n'existe pas dans le système.</S:Text></S:Reason></S:Fault></S:Body></S:Envelope>
--uuid:7902e9bd-21a8-4632-8760-d79a67eb89a1--

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,49 @@
<?xml version="1.0" ?>
<!--
W3C XML Schema defined in the Describing Media Content of Binary Data in XML
specification
http://www.w3.org/TR/xml-media-types
Copyright © 2005 World Wide Web Consortium,
(Massachusetts Institute of Technology, European Research Consortium for
Informatics and Mathematics, Keio University). All Rights Reserved. This
work is distributed under the W3C® Software License [1] in the hope that
it will be useful, but WITHOUT ANY WARRANTY; without even the implied
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
$Id: xmlmime.xsd,v 1.1 2005/04/25 17:08:35 hugo Exp $
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xmime="http://www.w3.org/2005/05/xmlmime"
targetNamespace="http://www.w3.org/2005/05/xmlmime" >
<xs:attribute name="contentType">
<xs:simpleType>
<xs:restriction base="xs:string" >
<xs:minLength value="3" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="expectedContentTypes" type="xs:string" />
<xs:complexType name="base64Binary" >
<xs:simpleContent>
<xs:extension base="xs:base64Binary" >
<xs:attribute ref="xmime:contentType" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="hexBinary" >
<xs:simpleContent>
<xs:extension base="xs:hexBinary" >
<xs:attribute ref="xmime:contentType" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:schema>

97
tests/test_sne.py Normal file
View File

@ -0,0 +1,97 @@
import os
import pytest
import responses
from django.contrib.contenttypes.models import ContentType
from django.core.files import File
from passerelle.apps.sne.models import SNE
from passerelle.base.models import AccessRight, ApiUser
@pytest.fixture()
def connector(db):
with open('%s/tests/data/sne/cert.pem' % os.getcwd()) as f:
api = ApiUser.objects.create(username='all', keytype='', key='')
connector = SNE.objects.create(
wsdl_url='https://sne-ws-2.site-ecole.din.developpement-durable.gouv.invalid/services/DemandeLogementImplService/?wsdl',
slug='test',
client_certificate=File(f, 'cert.pem'),
certificate_name='CERG1318-202209062200.XXX',
)
obj_type = ContentType.objects.get_for_model(connector)
AccessRight.objects.create(
codename='can_access', apiuser=api, resource_type=obj_type, resource_pk=connector.pk
)
return connector
Outdated
Review

détail sans importance, et peut-être que j'ai tort, mais j'aurais bien vu ce return en dehors du with, histoire de fermer le fichier (mais peut-être qu'il faut pas, moi et les trucs lazy cachés...)

détail sans importance, et peut-être que j'ai tort, mais j'aurais bien vu ce return en dehors du with, histoire de fermer le fichier (mais peut-être qu'il faut pas, moi et les trucs lazy cachés...)
def setup_(rsps, settings):
settings.CONNECTORS_SETTINGS = {
"sne/test": {
'requests_substitutions': [
{
'url': 'https://sne-ws-2.site-ecole.din.developpement-durable.gouv.invalid/',
'search': 'http://sne2-ws.j2ee.eco.edcs.fr:80',
'replace': 'https://sne-ws-2.site-ecole.din.developpement-durable.gouv.invalid',
}
]
}
}
with open('%s/tests/data/sne/DemandeLogementImplService.wsdl' % os.getcwd(), 'rb') as f:
rsps.get(
'https://sne-ws-2.site-ecole.din.developpement-durable.gouv.invalid/services/DemandeLogementImplService/?wsdl',
status=200,
body=f.read(),
)
with open('%s/tests/data/sne/DemandeLogementImplService1.wsdl' % os.getcwd(), 'rb') as f:
rsps.get(
'https://sne-ws-2.site-ecole.din.developpement-durable.gouv.invalid/services/DemandeLogementImplService?wsdl=1',
status=200,
body=f.read(),
)
with open('%s/tests/data/sne/DemandeLogementImplService.xsd' % os.getcwd(), 'rb') as f:
rsps.get(
'https://sne-ws-2.site-ecole.din.developpement-durable.gouv.invalid/services/DemandeLogementImplService?xsd=1',
status=200,
body=f.read(),
)
with open('%s/tests/data/sne/xmlmime.xsd' % os.getcwd(), 'rb') as f:
rsps.get('http://www.w3.org/2005/05/xmlmime', status=200, body=f.read())
def test_get_demande_logement(app, connector, settings):
with responses.RequestsMock() as rsps:
setup_(rsps, settings)
with open('%s/tests/data/sne/response_ok' % os.getcwd(), 'rb') as f:
rsps.post(
'https://sne-ws-2.site-ecole.din.developpement-durable.gouv.invalid/services/DemandeLogementImplService',
status=200,
body=f.read(),
content_type='multipart/related; start="<rootpart*db03b44e-f563-4ce9-b06d-545faf9b26c0@example.jaxws.sun.com>"; type="application/xop+xml";'
' boundary="uuid:db03b44e-f563-4ce9-b06d-545faf9b26c0"; start-info="application/soap+xml"',
)
resp = app.get('/sne/test/get-demande-logement?demand_id=0690221008931G3163')
json_resp = resp.json
assert json_resp['err'] == 0
assert json_resp['data']['interfaceNuu']['demande']['demandeLogement']['anru'] == 'false'
def test_get_demande_logement_does_not_exist(app, connector, settings):
with responses.RequestsMock() as rsps:
setup_(rsps, settings)
with open('%s/tests/data/sne/response_does_not_exist' % os.getcwd(), 'rb') as f:
rsps.post(
'https://sne-ws-2.site-ecole.din.developpement-durable.gouv.invalid/services/DemandeLogementImplService',
status=200,
body=f.read(),
content_type='multipart/related; start="<rootpart*7902e9bd-21a8-4632-8760-d79a67eb89a1@example.jaxws.sun.com>"; type="application/xop+xml";'
' boundary="uuid:7902e9bd-21a8-4632-8760-d79a67eb89a1"; start-info="application/soap+xml"',
)
resp = app.get('/sne/test/get-demande-logement?demand_id=0690221008931G3164')
json_resp = resp.json
assert json_resp['err'] == 1
assert (
json_resp['data']['soap_fault']['message']
== "La demande de logement n'existe pas dans le système."
)