package libebics import ( "bytes" "compress/zlib" "encoding/base64" "encoding/xml" "fmt" ) type EbicsUnsecuredRequest struct { XMLName xml.Name `xml:"ebicsUnsecuredRequest"` Xmlns string `xml:"xmlns,attr"` Version string `xml:"Version,attr"` Revision string `xml:"Revision,attr"` Header EbicsHeader `xml:"header"` Body EbicsBody `xml:"body"` } type EbicsHeader struct { XMLName xml.Name `xml:"header"` Authenticate bool `xml:"authenticate,attr"` Static EbicsHeaderStatic `xml:"static"` Mutable EbicsHeaderMutable `xml:"mutable"` } type EbicsHeaderStatic struct { XMLName xml.Name `xml:"static"` HostID string `xml:"HostID"` PartnerID string `xml:"PartnerID"` UserID string `xml:"UserID"` Product EbicsProduct `xml:"Product"` OrderDetails EbicsOrderDetails `xml:"OrderDetails"` SecurityMedium string `xml:"SecurityMedium"` } type EbicsProduct struct { XMLName xml.Name `xml:"Product"` Language string `xml:"Language,attr"` Name string `xml:",chardata"` } type EbicsOrderDetails struct { XMLName xml.Name `xml:"OrderDetails"` AdminOrderType string `xml:"AdminOrderType"` } type EbicsHeaderMutable struct { XMLName xml.Name `xml:"mutable"` } type EbicsBody struct { XMLName xml.Name `xml:"body"` DataTransfer EbicsDataTransfer `xml:"DataTransfer"` } type EbicsDataTransfer struct { XMLName xml.Name `xml:"DataTransfer"` OrderData string `xml:"OrderData"` // TODO Properly marshal this } type EbicsSignaturePubKeyOrderData struct { XMLName xml.Name `xml:"esig:SignaturePubKeyOrderData"` Esig string `xml:"xmlns:esi,attr"` Ds string `xml:"xmlns:ds,attr"` SignaturePubKeyInfo EbicsSignaturePubKeyInfo `xml:"esig:SignaturePubKeyInfo"` PartnerID string `xml:"esig:PartnerID"` UserID string `xml:"esig:UserID"` } type EbicsSignaturePubKeyInfo struct { XMLName xml.Name `xml:"esig:SignaturePubKeyInfo"` X509Data EbicsX509Data `xml:"ds:X509Data"` SignatureVersion string `xml:"esig:SignatureVersion"` // TODO Use ENUM } type EbicsX509Data struct { XMLName xml.Name `xml:"ds:X509Data"` X509Certificate string `xml:"ds:X509Certificate"` // TODO Properly marshal this } func GenerateIniRequest(signatureCertificate EbicsCertificate) (string, error) { if signatureCertificate.ebicsCertificateType != A005 && signatureCertificate.ebicsCertificateType != A006 { return "", fmt.Errorf("signature certificate has invalid certificate type %s", signatureCertificate.ebicsCertificateType.String()) } var zlibWriterBuffer bytes.Buffer zlibWriter := zlib.NewWriter(&zlibWriterBuffer) orderData := EbicsSignaturePubKeyOrderData{ SignaturePubKeyInfo: EbicsSignaturePubKeyInfo{ X509Data: EbicsX509Data{ X509Certificate: base64.StdEncoding.EncodeToString( signatureCertificate.x509Certificate, ), }, SignatureVersion: signatureCertificate.ebicsCertificateType.String(), }, PartnerID: "MV008078", UserID: "SCHOLZ01", } orderData_xml, err := xml.Marshal(orderData) if err != nil { return "", err } zlibWriter.Write(orderData_xml) zlibWriter.Close() ini := EbicsUnsecuredRequest{ Xmlns: "urn:org:ebics:H005", Version: "H005", Revision: "1", Header: EbicsHeader{ Authenticate: true, Static: EbicsHeaderStatic{ HostID: "MULTIVIA", PartnerID: "MV008078", UserID: "SCHOLZ01", Product: EbicsProduct{ Language: "en", Name: "libebics", }, OrderDetails: EbicsOrderDetails{ AdminOrderType: "INI", }, SecurityMedium: "0000", }, }, Body: EbicsBody{ DataTransfer: EbicsDataTransfer{ OrderData: base64.StdEncoding.EncodeToString( zlibWriterBuffer.Bytes(), ), }, }, } marshal, err := xml.MarshalIndent(ini, "", " ") return (xml.Header + string(marshal)), err }