summaryrefslogtreecommitdiff
path: root/order.go
blob: bf900788aa1dedbaf5020a03493b0f728b61257c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package libebics

import (
	"bytes"
	"compress/zlib"
	"encoding/base64"
	"fmt"

	"github.com/beevik/etree"
)

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)

	var orderdata *etree.Element

	ini := etree.NewDocument()
	ini.Indent(2) // Not technically efficient but nice for debugging purposes
	ini.CreateProcInst("xml", `version="1.0" encoding="UTF-8"`)
	ini.CreateChild("ebicsUnsecuredRequest", func(e *etree.Element) {
		e.CreateAttr("xmlns", "urn:org:ebics:H005")
		e.CreateAttr("Version", "H005")
		e.CreateAttr("Revision", "1")

		e.CreateChild("header", func(e *etree.Element) {
			e.CreateAttr("authenticate", "true")
			e.CreateChild("static", func(e *etree.Element) {
				e.CreateElement("HostID").CreateText("MULTIVIA")
				e.CreateElement("PartnerID").CreateText("MV008078")
				e.CreateElement("UserID").CreateText("SCHOLZ01")
				e.CreateChild("Product", func(e *etree.Element) {
					e.CreateAttr("Language", "en")
					e.CreateText("libebics")
				})
				e.CreateElement("OrderDetails").CreateElement("AdminOrderType").CreateText("INI")
				e.CreateElement("SecurityMedium").CreateText("0000")
			})
			e.CreateElement("mutable")
		})

		e.CreateChild("body", func(e *etree.Element) {
			orderdata = e.CreateElement("DataTransfer").CreateElement("OrderData")
		})
	})

	orderdata_content := etree.NewDocument()
	orderdata_content.Indent(2) // Not technically efficient but nice for debugging purposes
	orderdata_content.CreateChild("esig:SignaturePubKeyOrderData", func(e *etree.Element) {
		e.CreateAttr("xmlns:esig", "http://www.ebics.org/S002")
		e.CreateAttr("xmlns:ds", "http://www.w3.org/2000/09/xmldsig#")
		e.CreateChild("esig:SignaturePubKeyInfo", func(e *etree.Element) {
			e.CreateChild("ds:X509Data", func(e *etree.Element) {
				e.CreateElement("ds:X509Certificate").CreateText(
					base64.StdEncoding.EncodeToString(
						signatureCertificate.x509Certificate,
					),
				)
			})
			e.CreateElement("esig:SignatureVersion").CreateText(signatureCertificate.ebicsCertificateType.String())
		})
		e.CreateElement("esig:PartnerID").CreateText("MV008078")
		e.CreateElement("esig:UserID").CreateText("SCHOLZ01")
	})

	orderdata_bytes, err := orderdata_content.WriteToBytes()
	if err != nil {
		panic(err.Error())
	}
	zlibWriter.Write(orderdata_bytes)
	zlibWriter.Close()

	orderdata.CreateText(
		base64.StdEncoding.EncodeToString(
			zlibWriterBuffer.Bytes(),
		),
	)

	return ini.WriteToString()
}