commit f229468d6edc3511673f04d5f720100ef9ce2e55 parent 2e65c079376542d1eb68622dd8c133bde3af898f Author: Florian Dold <florian.dold@gmail.com> Date: Tue, 5 Nov 2019 16:14:47 +0100 restructure JAXB Diffstat:
13 files changed, 820 insertions(+), 660 deletions(-)
diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt b/sandbox/src/main/kotlin/tech/libeufin/sandbox/DB.kt @@ -145,7 +145,7 @@ class EbicsHostEntity(id: EntityID<Int>) : IntEntity(id) { * Subscribers table. This table associates users with partners * and systems. Each value can appear multiple times in the same column. */ -object EbicsSubscribersTable: IntIdTable() { +object EbicsSubscribersTable : IntIdTable() { val userId = text("userID") val partnerId = text("partnerID") val systemId = text("systemID").nullable() @@ -172,6 +172,33 @@ class EbicsSubscriberEntity(id: EntityID<Int>) : IntEntity(id) { } +object EbicsDownloadTransactionsTable : IdTable<String>() { + override val id = text("transactionID").entityId() + val orderType = text("orderType") + val host = reference("host", EbicsHostsTable) + val subscriber = reference("subscriber", EbicsSubscribersTable) + val encodedResponse = blob("encodedResponse") + val orderID = text("orderID") + val numSegments = integer("numSegments") + val segmentSize = integer("segmentSize") + val receiptReceived = bool("receiptReceived") +} + + +class EbicsDownloadTransactionEntity(id: EntityID<String>) : Entity<String>(id) { + companion object : EntityClass<String, EbicsDownloadTransactionEntity>(EbicsDownloadTransactionsTable) + + var orderType by EbicsDownloadTransactionsTable.orderType + var host by EbicsDownloadTransactionsTable.host + var subscriber by EbicsDownloadTransactionsTable.host + var encodedResponse by EbicsDownloadTransactionsTable.encodedResponse + var orderID by EbicsDownloadTransactionsTable.orderID + var numSegments by EbicsDownloadTransactionsTable.numSegments + var segmentSize by EbicsDownloadTransactionsTable.segmentSize + var receiptReceived by EbicsDownloadTransactionsTable.receiptReceived +} + + fun dbCreateTables() { Database.connect("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1", driver = "org.h2.Driver") diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt b/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt @@ -53,7 +53,6 @@ import java.security.interfaces.RSAPublicKey import java.text.DateFormat import javax.sql.rowset.serial.SerialBlob import javax.xml.bind.JAXBContext -import javax.xml.datatype.XMLGregorianCalendar val logger: Logger = LoggerFactory.getLogger("tech.libeufin.sandbox") @@ -75,32 +74,32 @@ private suspend fun ApplicationCall.respondEbicsKeyManagement( version = "H004" header = EbicsKeyManagementResponse.Header().apply { authenticate = true - mutable = EbicsKeyManagementResponse.Header.KeyManagementResponseMutableHeaderType().apply { + mutable = EbicsKeyManagementResponse.MutableHeaderType().apply { reportText = errorText returnCode = errorCode if (orderId != null) { this.orderID = orderId } } - _static = EbicsKeyManagementResponse.Header.EmptyStaticHeader() + _static = EbicsKeyManagementResponse.EmptyStaticHeader() } body = EbicsKeyManagementResponse.Body().apply { - this.returnCode = EbicsKeyManagementResponse.Body.ReturnCode().apply { + this.returnCode = EbicsKeyManagementResponse.ReturnCode().apply { this.authenticate = true this.value = bankReturnCode } if (dataTransfer != null) { - this.dataTransfer = EbicsKeyManagementResponse.Body.DataTransfer().apply { - this.dataEncryptionInfo = DataEncryptionInfo().apply { + this.dataTransfer = EbicsKeyManagementResponse.DataTransfer().apply { + this.dataEncryptionInfo = EbicsTypes.DataEncryptionInfo().apply { this.authenticate = true this.transactionKey = dataTransfer.encryptedTransactionKey - this.encryptionPubKeyDigest = DataEncryptionInfo.EncryptionPubKeyDigest().apply { + this.encryptionPubKeyDigest = EbicsTypes.DataEncryptionInfo.EncryptionPubKeyDigest().apply { this.algorithm = "http://www.w3.org/2001/04/xmlenc#sha256" this.version = "E002" this.value = dataTransfer.pubKeyDigest } } - this.orderData = EbicsResponse.Body.DataTransferResponseType.OrderData().apply { + this.orderData = EbicsKeyManagementResponse.OrderData().apply { this.value = dataTransfer.encryptedData } } @@ -149,7 +148,7 @@ data class EbicsHostInfo( private suspend fun ApplicationCall.handleEbicsHia(header: EbicsUnsecuredRequest.Header, orderData: ByteArray) { - val keyObject = EbicsOrderUtil.decodeOrderDataXml<HIARequestOrderDataType>(orderData) + val keyObject = EbicsOrderUtil.decodeOrderDataXml<HIARequestOrderData>(orderData) val encPubXml = keyObject.encryptionPubKeyInfo.pubKeyValue.rsaKeyValue val authPubXml = keyObject.authenticationPubKeyInfo.pubKeyValue.rsaKeyValue val encPub = CryptoUtil.loadRsaPublicKeyFromComponents(encPubXml.modulus, encPubXml.exponent) @@ -208,7 +207,7 @@ private suspend fun ApplicationCall.handleEbicsIni(header: EbicsUnsecuredRequest private suspend fun ApplicationCall.handleEbicsHpb( ebicsHostInfo: EbicsHostInfo, requestDocument: Document, - header: EbicsNoPubKeyDigestsRequest.Header + header: EbicsNpkdRequest.Header ) { val subscriberKeys = transaction { val ebicsSubscriber = @@ -235,18 +234,18 @@ private suspend fun ApplicationCall.handleEbicsHpb( throw EbicsKeyManagementError("invalid signature", "90000"); } val hpbRespondeData = HPBResponseOrderData().apply { - this.authenticationPubKeyInfo = AuthenticationPubKeyInfoType().apply { + this.authenticationPubKeyInfo = EbicsTypes.AuthenticationPubKeyInfoType().apply { this.authenticationVersion = "X002" - this.pubKeyValue = PubKeyValueType().apply { + this.pubKeyValue = EbicsTypes.PubKeyValueType().apply { this.rsaKeyValue = RSAKeyValueType().apply { this.exponent = ebicsHostInfo.authenticationPublicKey.publicExponent.toByteArray() this.modulus = ebicsHostInfo.authenticationPublicKey.modulus.toByteArray() } } } - this.encryptionPubKeyInfo = EncryptionPubKeyInfoType().apply { + this.encryptionPubKeyInfo = EbicsTypes.EncryptionPubKeyInfoType().apply { this.encryptionVersion = "E002" - this.pubKeyValue = PubKeyValueType().apply { + this.pubKeyValue = EbicsTypes.PubKeyValueType().apply { this.rsaKeyValue = RSAKeyValueType().apply { this.exponent = ebicsHostInfo.encryptionPublicKey.publicExponent.toByteArray() this.modulus = ebicsHostInfo.encryptionPublicKey.modulus.toByteArray() @@ -334,7 +333,7 @@ private suspend fun ApplicationCall.ebicsweb() { respondText(strResp, ContentType.Application.Xml, HttpStatusCode.OK) } "ebicsNoPubKeyDigestsRequest" -> { - val requestObject = requestDocument.toObject<EbicsNoPubKeyDigestsRequest>() + val requestObject = requestDocument.toObject<EbicsNpkdRequest>() val hostInfo = ensureEbicsHost(requestObject.header.static.hostID) when (requestObject.header.static.orderDetails.orderType) { "HPB" -> handleEbicsHpb(hostInfo, requestDocument, requestObject.header) diff --git a/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsKeyManagementResponse.kt b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsKeyManagementResponse.kt @@ -0,0 +1,102 @@ +package tech.libeufin.schema.ebics_h004 + +import javax.xml.bind.annotation.* +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter +import javax.xml.bind.annotation.adapters.NormalizedStringAdapter +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter + + +@XmlAccessorType(XmlAccessType.NONE) +@XmlType(name = "", propOrder = ["header", "body"]) +@XmlRootElement(name = "ebicsKeyManagementResponse") +class EbicsKeyManagementResponse { + @get:XmlElement(required = true) + lateinit var header: Header + + @get:XmlElement(required = true) + lateinit var body: Body + + @get:XmlAttribute(name = "Version", required = true) + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + lateinit var version: String + + @get:XmlAttribute(name = "Revision") + var revision: Int? = null + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType(name = "", propOrder = ["_static", "mutable"]) + class Header { + @get:XmlElement(name = "static", required = true) + lateinit var _static: EmptyStaticHeader + + @get:XmlElement(required = true) + lateinit var mutable: MutableHeaderType + + @get:XmlAttribute(name = "authenticate", required = true) + var authenticate: Boolean = false + } + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType(name = "", propOrder = ["orderID", "returnCode", "reportText"]) + class MutableHeaderType { + @get:XmlElement(name = "OrderID") + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + @get:XmlSchemaType(name = "token") + var orderID: String? = null + + @get:XmlElement(name = "ReturnCode", required = true) + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + @get:XmlSchemaType(name = "token") + lateinit var returnCode: String + + @get:XmlElement(name = "ReportText", required = true) + @get:XmlJavaTypeAdapter(NormalizedStringAdapter::class) + @get:XmlSchemaType(name = "normalizedString") + lateinit var reportText: String + } + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType(name = "") + class EmptyStaticHeader + + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType(name = "", propOrder = ["dataTransfer", "returnCode", "timestampBankParameter"]) + class Body { + @get:XmlElement(name = "DataTransfer") + var dataTransfer: DataTransfer? = null + + @get:XmlElement(name = "ReturnCode", required = true) + lateinit var returnCode: ReturnCode + + @get:XmlElement(name = "TimestampBankParameter") + var timestampBankParameter: EbicsTypes.TimestampBankParameter? = null + } + + + @XmlAccessorType(XmlAccessType.NONE) + class ReturnCode { + @get:XmlValue + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + lateinit var value: String + + @get:XmlAttribute(name = "authenticate", required = true) + var authenticate: Boolean = false + } + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType(name = "", propOrder = ["dataEncryptionInfo", "orderData"]) + class DataTransfer { + @get:XmlElement(name = "DataEncryptionInfo") + var dataEncryptionInfo: EbicsTypes.DataEncryptionInfo? = null + + @get:XmlElement(name = "OrderData", required = true) + lateinit var orderData: OrderData + } + + @XmlAccessorType(XmlAccessType.NONE) + class OrderData { + @get:XmlValue + lateinit var value: ByteArray + } +} diff --git a/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsMessages.kt b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsMessages.kt @@ -1,634 +0,0 @@ -/* - * This file is part of LibEuFin. - * Copyright (C) 2019 Stanisci and Dold. - - * LibEuFin 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, or - * (at your option) any later version. - - * LibEuFin 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 LibEuFin; see the file COPYING. If not, see - * <http://www.gnu.org/licenses/> - */ - -package tech.libeufin.schema.ebics_h004 - -import org.apache.xml.security.binding.xmldsig.RSAKeyValueType -import org.apache.xml.security.binding.xmldsig.SignatureType -import org.w3c.dom.Element -import java.math.BigInteger -import java.util.* -import javax.xml.bind.annotation.* -import javax.xml.bind.annotation.adapters.CollapsedStringAdapter -import javax.xml.bind.annotation.adapters.HexBinaryAdapter -import javax.xml.bind.annotation.adapters.NormalizedStringAdapter -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter -import javax.xml.datatype.XMLGregorianCalendar -import javax.xml.namespace.QName - -@XmlAccessorType(XmlAccessType.NONE) -@XmlType(name = "Product", propOrder = ["value"]) -class Product { - @get:XmlValue - @get:XmlJavaTypeAdapter(NormalizedStringAdapter::class) - lateinit var value: String - - @get:XmlAttribute(name = "Language", required = true) - @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) - lateinit var language: String - - @get:XmlAttribute(name = "InstituteID") - @get:XmlJavaTypeAdapter(NormalizedStringAdapter::class) - var instituteID: String? = null -} - - -/** - * Order details for the static EBICS header. - */ -@XmlAccessorType(XmlAccessType.NONE) -@XmlType(name = "OrderDetailsType", propOrder = ["orderType", "orderAttribute"]) -class OrderDetails { - @get:XmlElement(name = "OrderType", required = true) - @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) - lateinit var orderType: String - - @get:XmlElement(name = "OrderAttribute", required = true) - @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) - lateinit var orderAttribute: String -} - - -@XmlAccessorType(XmlAccessType.NONE) -@XmlType( - name = "StaticHeader", - propOrder = ["hostID", "nonce", "timestamp", "partnerID", "userID", "systemID", "product", "orderDetails", "securityMedium"] -) -class StaticHeader { - @get:XmlElement(name = "HostID", required = true) - @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) - lateinit var hostID: String - - @get:XmlElement(name = "Nonce", type = String::class) - @get:XmlJavaTypeAdapter(HexBinaryAdapter::class) - @get:XmlSchemaType(name = "hexBinary") - var nonce: ByteArray? = null - - @get:XmlElement(name = "Timestamp") - @get:XmlSchemaType(name = "dateTime") - var timestamp: XMLGregorianCalendar? = null - - @get:XmlElement(name = "PartnerID", required = true) - @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) - lateinit var partnerID: String - - @get:XmlElement(name = "UserID", required = true) - @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) - lateinit var userID: String - - @get:XmlElement(name = "SystemID") - @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) - var systemID: String? = null - - @get:XmlElement(name = "Product") - val product: Product? = null - - @get:XmlElement(name = "OrderDetails", required = true) - lateinit var orderDetails: OrderDetails - - @get:XmlElement(name = "SecurityMedium", required = true) - lateinit var securityMedium: String -} - - -@XmlAccessorType(XmlAccessType.NONE) -@XmlType(name = "", propOrder = ["header", "body"]) -@XmlRootElement(name = "ebicsUnsecuredRequest") -class EbicsUnsecuredRequest { - @XmlAccessorType(XmlAccessType.NONE) - @XmlType(name = "", propOrder = ["static", "mutable"]) - class Header { - @XmlAccessorType(XmlAccessType.NONE) - @XmlType(name = "") - class EmptyMutableHeader - - @get:XmlElement(name = "static", required = true) - lateinit var static: StaticHeader - - @get:XmlElement(required = true) - lateinit var mutable: EmptyMutableHeader - - @get:XmlAttribute(name = "authenticate", required = true) - var authenticate: Boolean = false - } - - @XmlAccessorType(XmlAccessType.NONE) - @XmlType(name = "", propOrder = ["dataTransfer"]) - class Body { - @get:XmlElement(name = "DataTransfer", required = true) - lateinit var dataTransfer: UnsecuredDataTransfer - - @XmlAccessorType(XmlAccessType.NONE) - @XmlType(name = "", propOrder = ["orderData"]) - class UnsecuredDataTransfer { - @get:XmlElement(name = "OrderData", required = true) - lateinit var orderData: OrderData - - @XmlAccessorType(XmlAccessType.NONE) - @XmlType(name = "") - class OrderData { - @get:XmlValue - lateinit var value: ByteArray - - @get:XmlAnyAttribute - val otherAttributes = HashMap<QName, String>() - } - } - } - - @get:XmlAttribute(name = "Version", required = true) - @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) - lateinit var version: String - - @get:XmlAttribute(name = "Revision") - var revision: Int? = null - - @get:XmlElement(name = "header", required = true) - lateinit var header: Header - - @get:XmlElement(required = true) - lateinit var body: Body -} - -@XmlAccessorType(XmlAccessType.NONE) -class DataEncryptionInfo { - @get:XmlAttribute(name = "authenticate", required = true) - var authenticate: Boolean = false - - @get:XmlElement(name = "EncryptionPubKeyDigest", required = true) - lateinit var encryptionPubKeyDigest: EncryptionPubKeyDigest - - @get:XmlElement(name = "TransactionKey", required = true) - lateinit var transactionKey: ByteArray - - @get:XmlAnyElement(lax = true) - var any: List<Any>? = null - - @XmlAccessorType(XmlAccessType.NONE) - class EncryptionPubKeyDigest { - /** - * Version of the *digest* of the public key. - */ - @get:XmlAttribute(name = "Version", required = true) - @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) - lateinit var version: String - - @XmlAttribute(name = "Algorithm", required = true) - @XmlSchemaType(name = "anyURI") - lateinit var algorithm: String - - @get:XmlValue - lateinit var value: ByteArray - } -} - - -@XmlAccessorType(XmlAccessType.NONE) -@XmlType( - name = "ResponseMutableHeaderType", - propOrder = ["transactionPhase", "segmentNumber", "orderID", "returnCode", "reportText", "any"] -) -class EbicsResponseMutableHeaderType { - @get:XmlElement(name = "TransactionPhase", required = true) - @get:XmlSchemaType(name = "token") - lateinit var transactionPhase: TransactionPhaseType - - @get:XmlElement(name = "SegmentNumber") - var segmentNumber: SegmentNumber? = null - - @get:XmlElement(name = "OrderID") - @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) - @get:XmlSchemaType(name = "token") - var orderID: String? = null - - @get:XmlElement(name = "ReturnCode", required = true) - @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) - @get:XmlSchemaType(name = "token") - lateinit var returnCode: String - - @get:XmlElement(name = "ReportText", required = true) - @get:XmlJavaTypeAdapter(NormalizedStringAdapter::class) - @get:XmlSchemaType(name = "normalizedString") - lateinit var reportText: String - - @get:XmlAnyElement(lax = true) - var any: List<Any>? = null - - @XmlAccessorType(XmlAccessType.NONE) - @XmlType(name = "", propOrder = ["value"]) - class SegmentNumber { - @XmlValue - lateinit var value: BigInteger - - @XmlAttribute(name = "lastSegment", required = true) - var lastSegment: Boolean = false - } -} - -@Suppress("UNUSED_PARAMETER") -enum class TransactionPhaseType(value: String) { - @XmlEnumValue("Initialisation") - INITIALISATION("Initialisation"), - - /** - * Auftragsdatentransfer - * - */ - @XmlEnumValue("Transfer") - TRANSFER("Transfer"), - - /** - * Quittungstransfer - * - */ - @XmlEnumValue("Receipt") - RECEIPT("Receipt"); -} - -@XmlAccessorType(XmlAccessType.NONE) -@XmlType(name = "ResponseStaticHeaderType", propOrder = ["transactionID", "numSegments"]) -class ResponseStaticHeaderType { - @get:XmlElement(name = "TransactionID", type = String::class) - @get:XmlJavaTypeAdapter(HexBinaryAdapter::class) - @get:XmlSchemaType(name = "hexBinary") - var transactionID: ByteArray? = null - - @get:XmlElement(name = "NumSegments") - @get:XmlSchemaType(name = "positiveInteger") - var numSegments: BigInteger? = null -} - - -@XmlAccessorType(XmlAccessType.NONE) -@XmlType(name = "") -class TimestampBankParameter { - @get:XmlValue - lateinit var value: XMLGregorianCalendar - - @get:XmlAttribute(name = "authenticate", required = true) - var authenticate: Boolean = false -} - - -@XmlAccessorType(XmlAccessType.NONE) -@XmlType(name = "", propOrder = ["header", "authSignature", "body"]) -@XmlRootElement(name = "ebicsResponse") -class EbicsResponse { - @get:XmlElement(required = true) - lateinit var header: EbicsResponse.Header - - @get:XmlElement(name = "AuthSignature", required = true) - lateinit var authSignature: SignatureType - - @get:XmlElement(required = true) - lateinit var body: Body - - @get:XmlAttribute(name = "Version", required = true) - @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) - lateinit var version: String - - @get:XmlAttribute(name = "Revision") - var revision: Int? = null - - @get:XmlAnyAttribute - var otherAttributes = HashMap<QName, String>() - - @XmlAccessorType(XmlAccessType.NONE) - @XmlType(name = "", propOrder = ["_static", "mutable"]) - class Header { - @get:XmlElement(name = "static", required = true) - lateinit var _static: ResponseStaticHeaderType - - @get:XmlElement(required = true) - lateinit var mutable: EbicsResponseMutableHeaderType - - @get:XmlAttribute(name = "authenticate", required = true) - var authenticate: Boolean = false - } - - @XmlAccessorType(XmlAccessType.NONE) - @XmlType(name = "", propOrder = ["dataTransfer", "returnCode", "timestampBankParameter"]) - class Body { - @get:XmlElement(name = "DataTransfer") - var dataTransfer: DataTransferResponseType? = null - - @get:XmlElement(name = "ReturnCode", required = true) - lateinit var returnCode: ReturnCode - - @get:XmlElement(name = "TimestampBankParameter") - var timestampBankParameter: TimestampBankParameter? = null - - @XmlAccessorType(XmlAccessType.NONE) - class ReturnCode { - @get:XmlValue - @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) - lateinit var value: String - - @get:XmlAttribute(name = "authenticate", required = true) - var authenticate: Boolean = false - } - - @XmlAccessorType(XmlAccessType.NONE) - @XmlType(name = "DataTransferResponseType", propOrder = ["dataEncryptionInfo", "orderData", "any"]) - class DataTransferResponseType { - @get:XmlElement(name = "DataEncryptionInfo") - var dataEncryptionInfo: DataEncryptionInfo? = null - - @get:XmlElement(name = "OrderData", required = true) - lateinit var orderData: OrderData - - @get:XmlAnyElement(lax = true) - var any: List<Any>? = null - - @XmlAccessorType(XmlAccessType.NONE) - class OrderData { - @get:XmlValue - lateinit var value: ByteArray - - @get:XmlAnyAttribute - var otherAttributes = HashMap<QName, String>() - } - } - } -} - - -@XmlType( - name = "PubKeyValueType", propOrder = [ - "rsaKeyValue", - "timeStamp" - ] -) -@XmlAccessorType(XmlAccessType.NONE) -class PubKeyValueType { - @get:XmlElement(name = "RSAKeyValue", namespace = "http://www.w3.org/2000/09/xmldsig#", required = true) - lateinit var rsaKeyValue: RSAKeyValueType - - @get:XmlElement(name = "TimeStamp", required = false) - @get:XmlSchemaType(name = "dateTime") - var timeStamp: XMLGregorianCalendar? = null -} - - -@XmlAccessorType(XmlAccessType.NONE) -@XmlType( - name = "AuthenticationPubKeyInfoType", propOrder = [ - "x509Data", - "pubKeyValue", - "authenticationVersion" - ] -) -class AuthenticationPubKeyInfoType { - @get:XmlAnyElement() - var x509Data: Element? = null - - @get:XmlElement(name = "PubKeyValue", required = true) - lateinit var pubKeyValue: PubKeyValueType - - @get:XmlElement(name = "AuthenticationVersion", required = true) - @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) - @get:XmlSchemaType(name = "token") - lateinit var authenticationVersion: String -} - - -@XmlAccessorType(XmlAccessType.NONE) -@XmlType( - name = "EncryptionPubKeyInfoType", propOrder = [ - "x509Data", - "pubKeyValue", - "encryptionVersion" - ] -) -class EncryptionPubKeyInfoType { - @get:XmlAnyElement() - var x509Data: Element? = null - - @get:XmlElement(name = "PubKeyValue", required = true) - lateinit var pubKeyValue: PubKeyValueType - - @get:XmlElement(name = "EncryptionVersion", required = true) - @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) - @get:XmlSchemaType(name = "token") - lateinit var encryptionVersion: String -} - - -@XmlAccessorType(XmlAccessType.NONE) -@XmlType( - name = "HIARequestOrderDataType", - propOrder = ["authenticationPubKeyInfo", "encryptionPubKeyInfo", "partnerID", "userID", "any"] -) -@XmlRootElement(name = "HIARequestOrderData") -class HIARequestOrderDataType { - @get:XmlElement(name = "AuthenticationPubKeyInfo", required = true) - lateinit var authenticationPubKeyInfo: AuthenticationPubKeyInfoType - - @get:XmlElement(name = "EncryptionPubKeyInfo", required = true) - lateinit var encryptionPubKeyInfo: EncryptionPubKeyInfoType - - @get:XmlElement(name = "PartnerID", required = true) - @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) - @get:XmlSchemaType(name = "token") - lateinit var partnerID: String - - @get:XmlElement(name = "UserID", required = true) - @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) - @get:XmlSchemaType(name = "token") - lateinit var userID: String - - @get:XmlAnyElement(lax = true) - var any: List<Any>? = null -} - -@XmlAccessorType(XmlAccessType.NONE) -@XmlType(name = "", propOrder = ["header", "body"]) -@XmlRootElement(name = "ebicsKeyManagementResponse") -class EbicsKeyManagementResponse { - @get:XmlElement(required = true) - lateinit var header: Header - - @get:XmlElement(required = true) - lateinit var body: Body - - @get:XmlAttribute(name = "Version", required = true) - @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) - lateinit var version: String - - @get:XmlAttribute(name = "Revision") - var revision: Int? = null - - @XmlAccessorType(XmlAccessType.NONE) - @XmlType(name = "", propOrder = ["_static", "mutable"]) - class Header { - @get:XmlElement(name = "static", required = true) - lateinit var _static: EmptyStaticHeader - - @get:XmlElement(required = true) - lateinit var mutable: KeyManagementResponseMutableHeaderType - - @get:XmlAttribute(name = "authenticate", required = true) - var authenticate: Boolean = false - - @XmlAccessorType(XmlAccessType.NONE) - @XmlType(name = "") - class EmptyStaticHeader - - @XmlAccessorType(XmlAccessType.NONE) - @XmlType(name = "", propOrder = ["orderID", "returnCode", "reportText"]) - class KeyManagementResponseMutableHeaderType { - @get:XmlElement(name = "OrderID") - @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) - @get:XmlSchemaType(name = "token") - var orderID: String? = null - - @get:XmlElement(name = "ReturnCode", required = true) - @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) - @get:XmlSchemaType(name = "token") - lateinit var returnCode: String - - @get:XmlElement(name = "ReportText", required = true) - @get:XmlJavaTypeAdapter(NormalizedStringAdapter::class) - @get:XmlSchemaType(name = "normalizedString") - lateinit var reportText: String - } - } - - @XmlAccessorType(XmlAccessType.NONE) - @XmlType(name = "", propOrder = ["dataTransfer", "returnCode", "timestampBankParameter"]) - class Body { - @get:XmlElement(name = "DataTransfer") - var dataTransfer: DataTransfer? = null - - @get:XmlElement(name = "ReturnCode", required = true) - lateinit var returnCode: ReturnCode - - @get:XmlElement(name = "TimestampBankParameter") - var timestampBankParameter: TimestampBankParameter? = null - - @XmlAccessorType(XmlAccessType.NONE) - class ReturnCode { - @get:XmlValue - @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) - lateinit var value: String - - @get:XmlAttribute(name = "authenticate", required = true) - var authenticate: Boolean = false - } - - @XmlAccessorType(XmlAccessType.NONE) - @XmlType(name = "", propOrder = ["dataEncryptionInfo", "orderData"]) - class DataTransfer { - @get:XmlElement(name = "DataEncryptionInfo") - var dataEncryptionInfo: DataEncryptionInfo? = null - - @get:XmlElement(name = "OrderData", required = true) - lateinit var orderData: EbicsResponse.Body.DataTransferResponseType.OrderData - } - } -} - - -@XmlAccessorType(XmlAccessType.NONE) -@XmlType(name = "", propOrder = ["header", "authSignature", "body"]) -@XmlRootElement(name = "ebicsNoPubKeyDigestsRequest") -class EbicsNoPubKeyDigestsRequest { - @get:XmlAttribute(name = "Version", required = true) - @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) - lateinit var version: String - - @get:XmlAttribute(name = "Revision") - var revision: Int? = null - - @get:XmlElement(name = "header", required = true) - lateinit var header: Header - - @get:XmlElement(name = "AuthSignature", required = true) - lateinit var authSignature: SignatureType - - @get:XmlElement(required = true) - lateinit var body: EmptyBody - - @XmlAccessorType(XmlAccessType.NONE) - @XmlType(name = "", propOrder = ["static", "mutable"]) - class Header { - @get:XmlAttribute(name = "authenticate", required = true) - var authenticate: Boolean = false - - @get:XmlElement(name = "static", required = true) - lateinit var static: StaticHeader - - @get:XmlElement(required = true) - lateinit var mutable: EmptyMutableHeader - - @XmlAccessorType(XmlAccessType.NONE) - @XmlType(name = "") - class EmptyMutableHeader - } - - @XmlAccessorType(XmlAccessType.NONE) - class EmptyBody -} - - -@XmlAccessorType(XmlAccessType.NONE) -@XmlType(name = "", propOrder = ["authenticationPubKeyInfo", "encryptionPubKeyInfo", "hostID"]) -@XmlRootElement(name = "HPBResponseOrderData") -class HPBResponseOrderData { - @get:XmlElement(name = "AuthenticationPubKeyInfo", required = true) - lateinit var authenticationPubKeyInfo: AuthenticationPubKeyInfoType - - @get:XmlElement(name = "EncryptionPubKeyInfo", required = true) - lateinit var encryptionPubKeyInfo: EncryptionPubKeyInfoType - - @get:XmlElement(name = "HostID", required = true) - @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) - lateinit var hostID: String -} - - -@XmlAccessorType(XmlAccessType.NONE) -@XmlType(name = "", propOrder = ["partnerInfo", "userInfo"]) -@XmlRootElement(name = "HTDResponseOrderData") -class HTDesponseOrderData { - @get:XmlElement(name = "PartnerInfo", required = true) - lateinit var partnerInfo: PartnerInfo - - @get:XmlElement(name = "UserInfo", required = true) - lateinit var userInfo: UserInfo - - @XmlAccessorType(XmlAccessType.NONE) - class PartnerInfo { - - } - - @XmlAccessorType(XmlAccessType.NONE) - class UserInfo { - - @get:XmlElement(name = "AddressInfo", required = true) - lateinit var addressInfo: AddressInfo - - @get:XmlElement(name = "BankInfo", required = true) - lateinit var bankInfo: BankInfo - - class AddressInfo - class BankInfo - - } -} -\ No newline at end of file diff --git a/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsNpkdRequest.kt b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsNpkdRequest.kt @@ -0,0 +1,91 @@ +package tech.libeufin.schema.ebics_h004 + +import org.apache.xml.security.binding.xmldsig.SignatureType +import javax.xml.bind.annotation.* +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter +import javax.xml.bind.annotation.adapters.HexBinaryAdapter +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter +import javax.xml.datatype.XMLGregorianCalendar + + +@XmlAccessorType(XmlAccessType.NONE) +@XmlType(name = "", propOrder = ["header", "authSignature", "body"]) +@XmlRootElement(name = "ebicsNoPubKeyDigestsRequest") +class EbicsNpkdRequest { + @get:XmlAttribute(name = "Version", required = true) + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + lateinit var version: String + + @get:XmlAttribute(name = "Revision") + var revision: Int? = null + + @get:XmlElement(name = "header", required = true) + lateinit var header: Header + + @get:XmlElement(name = "AuthSignature", required = true) + lateinit var authSignature: SignatureType + + @get:XmlElement(required = true) + lateinit var body: EmptyBody + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType(name = "", propOrder = ["static", "mutable"]) + class Header { + @get:XmlAttribute(name = "authenticate", required = true) + var authenticate: Boolean = false + + @get:XmlElement(name = "static", required = true) + lateinit var static: StaticHeaderType + + @get:XmlElement(required = true) + lateinit var mutable: EmptyMutableHeader + } + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType( + name = "StaticHeader", + propOrder = ["hostID", "nonce", "timestamp", "partnerID", "userID", "systemID", "product", "orderDetails", "securityMedium"] + ) + class StaticHeaderType { + @get:XmlElement(name = "HostID", required = true) + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + lateinit var hostID: String + + @get:XmlElement(name = "Nonce", type = String::class) + @get:XmlJavaTypeAdapter(HexBinaryAdapter::class) + @get:XmlSchemaType(name = "hexBinary") + lateinit var nonce: ByteArray + + @get:XmlElement(name = "Timestamp") + @get:XmlSchemaType(name = "dateTime") + var timestamp: XMLGregorianCalendar? = null + + @get:XmlElement(name = "PartnerID", required = true) + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + lateinit var partnerID: String + + @get:XmlElement(name = "UserID", required = true) + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + lateinit var userID: String + + @get:XmlElement(name = "SystemID") + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + var systemID: String? = null + + @get:XmlElement(name = "Product") + val product: EbicsTypes.Product? = null + + @get:XmlElement(name = "OrderDetails", required = true) + lateinit var orderDetails: EbicsTypes.SimpleOrderDetails + + @get:XmlElement(name = "SecurityMedium", required = true) + lateinit var securityMedium: String + } + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType(name = "") + class EmptyMutableHeader + + @XmlAccessorType(XmlAccessType.NONE) + class EmptyBody +} +\ No newline at end of file diff --git a/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsRequest.kt b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsRequest.kt @@ -0,0 +1,46 @@ +package tech.libeufin.schema.ebics_h004 + +import org.apache.xml.security.binding.xmldsig.SignatureType +import javax.xml.bind.annotation.* + +@XmlAccessorType(XmlAccessType.NONE) +@XmlType(name = "", propOrder = ["header", "authSignature", "body"]) +@XmlRootElement(name = "ebicsRequest") +class EbicsRequest { + @get:XmlElement(name = "header", required = true) + lateinit var header: Header + + @get:XmlElement(name = "AuthSignature", required = true) + lateinit var authSignature: SignatureType + + @get:XmlElement(name = "body") + lateinit var body: Body + + @XmlAccessorType(XmlAccessType.NONE) + class Body { + + } + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType(name = "", propOrder = ["static", "mutable"]) + class Header { + @get:XmlElement(name = "static", required = true) + lateinit var static: StaticHeaderType + + @get:XmlElement(required = true) + lateinit var mutable: MutableHeader + + @get:XmlAttribute(name = "authenticate", required = true) + var authenticate: Boolean = false + + } + + class StaticHeaderType { + } + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType(name = "") + class MutableHeader { + + } +} diff --git a/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsResponse.kt b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsResponse.kt @@ -0,0 +1,146 @@ +package tech.libeufin.schema.ebics_h004 + +import org.apache.xml.security.binding.xmldsig.SignatureType +import java.math.BigInteger +import javax.xml.bind.annotation.* +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter +import javax.xml.bind.annotation.adapters.HexBinaryAdapter +import javax.xml.bind.annotation.adapters.NormalizedStringAdapter +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter +import javax.xml.namespace.QName + +@XmlAccessorType(XmlAccessType.NONE) +@XmlType(name = "", propOrder = ["header", "authSignature", "body"]) +@XmlRootElement(name = "ebicsResponse") +class EbicsResponse { + @get:XmlElement(required = true) + lateinit var header: EbicsResponse.Header + + @get:XmlElement(name = "AuthSignature", required = true) + lateinit var authSignature: SignatureType + + @get:XmlElement(required = true) + lateinit var body: Body + + @get:XmlAttribute(name = "Version", required = true) + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + lateinit var version: String + + @get:XmlAttribute(name = "Revision") + var revision: Int? = null + + @get:XmlAnyAttribute + var otherAttributes = HashMap<QName, String>() + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType(name = "", propOrder = ["_static", "mutable"]) + class Header { + @get:XmlElement(name = "static", required = true) + lateinit var _static: StaticHeaderType + + @get:XmlElement(required = true) + lateinit var mutable: MutableHeaderType + + @get:XmlAttribute(name = "authenticate", required = true) + var authenticate: Boolean = false + } + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType(name = "", propOrder = ["dataTransfer", "returnCode", "timestampBankParameter"]) + class Body { + @get:XmlElement(name = "DataTransfer") + var dataTransfer: DataTransferResponseType? = null + + @get:XmlElement(name = "ReturnCode", required = true) + lateinit var returnCode: ReturnCode + + @get:XmlElement(name = "TimestampBankParameter") + var timestampBankParameter: EbicsTypes.TimestampBankParameter? = null + } + + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType( + name = "ResponseMutableHeaderType", + propOrder = ["transactionPhase", "segmentNumber", "orderID", "returnCode", "reportText", "any"] + ) + class MutableHeaderType { + @get:XmlElement(name = "TransactionPhase", required = true) + @get:XmlSchemaType(name = "token") + lateinit var transactionPhase: EbicsTypes.TransactionPhaseType + + @get:XmlElement(name = "SegmentNumber") + var segmentNumber: SegmentNumber? = null + + @get:XmlElement(name = "OrderID") + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + @get:XmlSchemaType(name = "token") + var orderID: String? = null + + @get:XmlElement(name = "ReturnCode", required = true) + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + @get:XmlSchemaType(name = "token") + lateinit var returnCode: String + + @get:XmlElement(name = "ReportText", required = true) + @get:XmlJavaTypeAdapter(NormalizedStringAdapter::class) + @get:XmlSchemaType(name = "normalizedString") + lateinit var reportText: String + + @get:XmlAnyElement(lax = true) + var any: List<Any>? = null + } + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType(name = "", propOrder = ["value"]) + class SegmentNumber { + @XmlValue + lateinit var value: BigInteger + + @XmlAttribute(name = "lastSegment", required = true) + var lastSegment: Boolean = false + } + + @XmlAccessorType(XmlAccessType.NONE) + class OrderData { + @get:XmlValue + lateinit var value: ByteArray + } + + @XmlAccessorType(XmlAccessType.NONE) + class ReturnCode { + @get:XmlValue + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + lateinit var value: String + + @get:XmlAttribute(name = "authenticate", required = true) + var authenticate: Boolean = false + } + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType(name = "DataTransferResponseType", propOrder = ["dataEncryptionInfo", "orderData", "any"]) + class DataTransferResponseType { + @get:XmlElement(name = "DataEncryptionInfo") + var dataEncryptionInfo: EbicsTypes.DataEncryptionInfo? = null + + @get:XmlElement(name = "OrderData", required = true) + lateinit var orderData: OrderData + + @get:XmlAnyElement(lax = true) + var any: List<Any>? = null + } + + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType(name = "ResponseStaticHeaderType", propOrder = ["transactionID", "numSegments"]) + class StaticHeaderType { + @get:XmlElement(name = "TransactionID", type = String::class) + @get:XmlJavaTypeAdapter(HexBinaryAdapter::class) + @get:XmlSchemaType(name = "hexBinary") + var transactionID: ByteArray? = null + + @get:XmlElement(name = "NumSegments") + @get:XmlSchemaType(name = "positiveInteger") + var numSegments: BigInteger? = null + } +} diff --git a/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsTypes.kt b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsTypes.kt @@ -0,0 +1,200 @@ +/* + * This file is part of LibEuFin. + * Copyright (C) 2019 Stanisci and Dold. + + * LibEuFin 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, or + * (at your option) any later version. + + * LibEuFin 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 LibEuFin; see the file COPYING. If not, see + * <http://www.gnu.org/licenses/> + */ + +package tech.libeufin.schema.ebics_h004 + +import org.apache.xml.security.binding.xmldsig.RSAKeyValueType +import org.w3c.dom.Element +import java.math.BigInteger +import javax.xml.bind.annotation.* +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter +import javax.xml.bind.annotation.adapters.HexBinaryAdapter +import javax.xml.bind.annotation.adapters.NormalizedStringAdapter +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter +import javax.xml.datatype.XMLGregorianCalendar + + +/** + * EBICS type definitions that are shared between other requests / responses / order types. + */ +class EbicsTypes private constructor() { + /** + * EBICS client product. Identifies the software that accesses the EBICS host. + */ + @XmlAccessorType(XmlAccessType.NONE) + @XmlType(name = "Product", propOrder = ["value"]) + class Product { + @get:XmlValue + @get:XmlJavaTypeAdapter(NormalizedStringAdapter::class) + lateinit var value: String + + @get:XmlAttribute(name = "Language", required = true) + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + lateinit var language: String + + @get:XmlAttribute(name = "InstituteID") + @get:XmlJavaTypeAdapter(NormalizedStringAdapter::class) + var instituteID: String? = null + } + + /** + * Order details for the static EBICS header. + */ + @XmlAccessorType(XmlAccessType.NONE) + @XmlType(name = "OrderDetailsType", propOrder = ["orderType", "orderAttribute"]) + class SimpleOrderDetails { + @get:XmlElement(name = "OrderType", required = true) + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + lateinit var orderType: String + + @get:XmlElement(name = "OrderAttribute", required = true) + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + lateinit var orderAttribute: String + } + + + + + + @XmlAccessorType(XmlAccessType.NONE) + class DataEncryptionInfo { + @get:XmlAttribute(name = "authenticate", required = true) + var authenticate: Boolean = false + + @get:XmlElement(name = "EncryptionPubKeyDigest", required = true) + lateinit var encryptionPubKeyDigest: EncryptionPubKeyDigest + + @get:XmlElement(name = "TransactionKey", required = true) + lateinit var transactionKey: ByteArray + + @get:XmlAnyElement(lax = true) + var any: List<Any>? = null + + @XmlAccessorType(XmlAccessType.NONE) + class EncryptionPubKeyDigest { + /** + * Version of the *digest* of the public key. + */ + @get:XmlAttribute(name = "Version", required = true) + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + lateinit var version: String + + @XmlAttribute(name = "Algorithm", required = true) + @XmlSchemaType(name = "anyURI") + lateinit var algorithm: String + + @get:XmlValue + lateinit var value: ByteArray + } + } + + + @Suppress("UNUSED_PARAMETER") + enum class TransactionPhaseType(value: String) { + @XmlEnumValue("Initialisation") + INITIALISATION("Initialisation"), + + /** + * Auftragsdatentransfer + * + */ + @XmlEnumValue("Transfer") + TRANSFER("Transfer"), + + /** + * Quittungstransfer + * + */ + @XmlEnumValue("Receipt") + RECEIPT("Receipt"); + } + + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType(name = "") + class TimestampBankParameter { + @get:XmlValue + lateinit var value: XMLGregorianCalendar + + @get:XmlAttribute(name = "authenticate", required = true) + var authenticate: Boolean = false + } + + + + @XmlType( + name = "PubKeyValueType", propOrder = [ + "rsaKeyValue", + "timeStamp" + ] + ) + @XmlAccessorType(XmlAccessType.NONE) + class PubKeyValueType { + @get:XmlElement(name = "RSAKeyValue", namespace = "http://www.w3.org/2000/09/xmldsig#", required = true) + lateinit var rsaKeyValue: RSAKeyValueType + + @get:XmlElement(name = "TimeStamp", required = false) + @get:XmlSchemaType(name = "dateTime") + var timeStamp: XMLGregorianCalendar? = null + } + + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType( + name = "AuthenticationPubKeyInfoType", propOrder = [ + "x509Data", + "pubKeyValue", + "authenticationVersion" + ] + ) + class AuthenticationPubKeyInfoType { + @get:XmlAnyElement() + var x509Data: Element? = null + + @get:XmlElement(name = "PubKeyValue", required = true) + lateinit var pubKeyValue: PubKeyValueType + + @get:XmlElement(name = "AuthenticationVersion", required = true) + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + @get:XmlSchemaType(name = "token") + lateinit var authenticationVersion: String + } + + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType( + name = "EncryptionPubKeyInfoType", propOrder = [ + "x509Data", + "pubKeyValue", + "encryptionVersion" + ] + ) + class EncryptionPubKeyInfoType { + @get:XmlAnyElement() + var x509Data: Element? = null + + @get:XmlElement(name = "PubKeyValue", required = true) + lateinit var pubKeyValue: PubKeyValueType + + @get:XmlElement(name = "EncryptionVersion", required = true) + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + @get:XmlSchemaType(name = "token") + lateinit var encryptionVersion: String + } +} +\ No newline at end of file diff --git a/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsUnsecuredRequest.kt b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsUnsecuredRequest.kt @@ -0,0 +1,93 @@ +package tech.libeufin.schema.ebics_h004 + +import javax.xml.bind.annotation.* +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter + +@XmlAccessorType(XmlAccessType.NONE) +@XmlType(name = "", propOrder = ["header", "body"]) +@XmlRootElement(name = "ebicsUnsecuredRequest") +class EbicsUnsecuredRequest { + @get:XmlAttribute(name = "Version", required = true) + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + lateinit var version: String + + @get:XmlAttribute(name = "Revision") + var revision: Int? = null + + @get:XmlElement(name = "header", required = true) + lateinit var header: Header + + @get:XmlElement(required = true) + lateinit var body: Body + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType(name = "", propOrder = ["static", "mutable"]) + class Header { + @XmlAccessorType(XmlAccessType.NONE) + @XmlType(name = "") + class EmptyMutableHeader + + @get:XmlElement(name = "static", required = true) + lateinit var static: StaticHeaderType + + @get:XmlElement(required = true) + lateinit var mutable: EmptyMutableHeader + + @get:XmlAttribute(name = "authenticate", required = true) + var authenticate: Boolean = false + } + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType(name = "", propOrder = ["dataTransfer"]) + class Body { + @get:XmlElement(name = "DataTransfer", required = true) + lateinit var dataTransfer: UnsecuredDataTransfer + } + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType(name = "", propOrder = ["orderData"]) + class UnsecuredDataTransfer { + @get:XmlElement(name = "OrderData", required = true) + lateinit var orderData: OrderData + } + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType(name = "") + class OrderData { + @get:XmlValue + lateinit var value: ByteArray + } + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType( + name = "", + propOrder = ["hostID", "partnerID", "userID", "systemID", "product", "orderDetails", "securityMedium"] + ) + class StaticHeaderType { + @get:XmlElement(name = "HostID", required = true) + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + lateinit var hostID: String + + @get:XmlElement(name = "PartnerID", required = true) + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + lateinit var partnerID: String + + @get:XmlElement(name = "UserID", required = true) + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + lateinit var userID: String + + @get:XmlElement(name = "SystemID") + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + var systemID: String? = null + + @get:XmlElement(name = "Product") + val product: EbicsTypes.Product? = null + + @get:XmlElement(name = "OrderDetails", required = true) + lateinit var orderDetails: EbicsTypes.SimpleOrderDetails + + @get:XmlElement(name = "SecurityMedium", required = true) + lateinit var securityMedium: String + } +} diff --git a/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/HIARequestOrderData.kt b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/HIARequestOrderData.kt @@ -0,0 +1,33 @@ +package tech.libeufin.schema.ebics_h004 + +import javax.xml.bind.annotation.* +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter + + +@XmlAccessorType(XmlAccessType.NONE) +@XmlType( + name = "HIARequestOrderDataType", + propOrder = ["authenticationPubKeyInfo", "encryptionPubKeyInfo", "partnerID", "userID", "any"] +) +@XmlRootElement(name = "HIARequestOrderData") +class HIARequestOrderData { + @get:XmlElement(name = "AuthenticationPubKeyInfo", required = true) + lateinit var authenticationPubKeyInfo: EbicsTypes.AuthenticationPubKeyInfoType + + @get:XmlElement(name = "EncryptionPubKeyInfo", required = true) + lateinit var encryptionPubKeyInfo: EbicsTypes.EncryptionPubKeyInfoType + + @get:XmlElement(name = "PartnerID", required = true) + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + @get:XmlSchemaType(name = "token") + lateinit var partnerID: String + + @get:XmlElement(name = "UserID", required = true) + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + @get:XmlSchemaType(name = "token") + lateinit var userID: String + + @get:XmlAnyElement(lax = true) + var any: List<Any>? = null +} +\ No newline at end of file diff --git a/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/HPBResponseOrderData.kt b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/HPBResponseOrderData.kt @@ -0,0 +1,21 @@ +package tech.libeufin.schema.ebics_h004 + +import javax.xml.bind.annotation.* +import javax.xml.bind.annotation.adapters.CollapsedStringAdapter +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter + + +@XmlAccessorType(XmlAccessType.NONE) +@XmlType(name = "", propOrder = ["authenticationPubKeyInfo", "encryptionPubKeyInfo", "hostID"]) +@XmlRootElement(name = "HPBResponseOrderData") +class HPBResponseOrderData { + @get:XmlElement(name = "AuthenticationPubKeyInfo", required = true) + lateinit var authenticationPubKeyInfo: EbicsTypes.AuthenticationPubKeyInfoType + + @get:XmlElement(name = "EncryptionPubKeyInfo", required = true) + lateinit var encryptionPubKeyInfo: EbicsTypes.EncryptionPubKeyInfoType + + @get:XmlElement(name = "HostID", required = true) + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + lateinit var hostID: String +} +\ No newline at end of file diff --git a/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/HTDResponseOrderData.kt b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/HTDResponseOrderData.kt @@ -0,0 +1,33 @@ +package tech.libeufin.schema.ebics_h004 + +import javax.xml.bind.annotation.* + +@XmlAccessorType(XmlAccessType.NONE) +@XmlType(name = "", propOrder = ["partnerInfo", "userInfo"]) +@XmlRootElement(name = "HTDResponseOrderData") +class HTDResponseOrderData { + @get:XmlElement(name = "PartnerInfo", required = true) + lateinit var partnerInfo: PartnerInfo + + @get:XmlElement(name = "UserInfo", required = true) + lateinit var userInfo: UserInfo + + @XmlAccessorType(XmlAccessType.NONE) + class PartnerInfo { + + } + + @XmlAccessorType(XmlAccessType.NONE) + class UserInfo { + + @get:XmlElement(name = "AddressInfo", required = true) + lateinit var addressInfo: AddressInfo + + @get:XmlElement(name = "BankInfo", required = true) + lateinit var bankInfo: BankInfo + + class AddressInfo + class BankInfo + + } +} diff --git a/sandbox/src/test/kotlin/EbicsMessagesTest.kt b/sandbox/src/test/kotlin/EbicsMessagesTest.kt @@ -73,15 +73,15 @@ class EbicsMessagesTest { fun testKeyMgmgResponse() { val responseXml = EbicsKeyManagementResponse().apply { header = EbicsKeyManagementResponse.Header().apply { - mutable = EbicsKeyManagementResponse.Header.KeyManagementResponseMutableHeaderType().apply { + mutable = EbicsKeyManagementResponse.MutableHeaderType().apply { reportText = "foo" returnCode = "bar" } - _static = EbicsKeyManagementResponse.Header.EmptyStaticHeader() + _static = EbicsKeyManagementResponse.EmptyStaticHeader() } version = "H004" body = EbicsKeyManagementResponse.Body().apply { - returnCode = EbicsKeyManagementResponse.Body.ReturnCode().apply { + returnCode = EbicsKeyManagementResponse.ReturnCode().apply { authenticate = true value = "000000" } @@ -95,7 +95,7 @@ class EbicsMessagesTest { fun testParseHiaRequestOrderData() { val classLoader = ClassLoader.getSystemClassLoader() val hia = classLoader.getResource("hia_request_order_data.xml")!!.readText() - XMLUtil.convertStringToJaxb<HIARequestOrderDataType>(hia) + XMLUtil.convertStringToJaxb<HIARequestOrderData>(hia) } @Test @@ -148,16 +148,16 @@ class EbicsMessagesTest { val response = EbicsResponse().apply { version = "H004" header = EbicsResponse.Header().apply { - _static = ResponseStaticHeaderType() - mutable = EbicsResponseMutableHeaderType().apply { + _static = EbicsResponse.StaticHeaderType() + mutable = EbicsResponse.MutableHeaderType().apply { this.reportText = "foo" this.returnCode = "bar" - this.transactionPhase = TransactionPhaseType.INITIALISATION + this.transactionPhase = EbicsTypes.TransactionPhaseType.INITIALISATION } } authSignature = SignatureType() body = EbicsResponse.Body().apply { - returnCode = EbicsResponse.Body.ReturnCode().apply { + returnCode = EbicsResponse.ReturnCode().apply { authenticate = true value = "asdf" } @@ -170,6 +170,6 @@ class EbicsMessagesTest { fun testLoadHpb() { val classLoader = ClassLoader.getSystemClassLoader() val text = classLoader.getResource("hpb_request.xml")!!.readText() - XMLUtil.convertStringToJaxb<EbicsNoPubKeyDigestsRequest>(text) + XMLUtil.convertStringToJaxb<EbicsNpkdRequest>(text) } } \ No newline at end of file