libeufin

Integration and sandbox testing for FinTech APIs and data formats
Log | Files | Refs | Submodules | README | LICENSE

commit 549d892d5a65bfc87a2062c05ebe1f00468b8acd
parent c98ef14e575b971fde2c762aa88524ac6053ce73
Author: Florian Dold <florian.dold@gmail.com>
Date:   Wed,  6 Nov 2019 11:32:03 +0100

model ebics request and test

Diffstat:
M.idea/codeStyles/Project.xml | 182+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt | 2+-
Msandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsRequest.kt | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
Msandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsResponse.kt | 14+++++++-------
Msandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsTypes.kt | 38+++++++++++++++++---------------------
Msandbox/src/test/kotlin/EbicsMessagesTest.kt | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6 files changed, 334 insertions(+), 37 deletions(-)

diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml @@ -5,6 +5,188 @@ </JetCodeStyleSettings> <codeStyleSettings language="kotlin"> <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" /> + <option name="WRAP_ON_TYPING" value="1" /> + <option name="arrangementSettings" /> + <option name="forceArrangeMenuAvailable" value="false" /> + <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" /> + <option name="RIGHT_MARGIN" value="-1" /> + <option name="LINE_COMMENT_AT_FIRST_COLUMN" value="true" /> + <option name="BLOCK_COMMENT_AT_FIRST_COLUMN" value="true" /> + <option name="LINE_COMMENT_ADD_SPACE" value="false" /> + <option name="KEEP_LINE_BREAKS" value="true" /> + <option name="KEEP_FIRST_COLUMN_COMMENT" value="true" /> + <option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="true" /> + <option name="KEEP_BLANK_LINES_IN_DECLARATIONS" value="2" /> + <option name="KEEP_BLANK_LINES_IN_CODE" value="2" /> + <option name="KEEP_BLANK_LINES_BETWEEN_PACKAGE_DECLARATION_AND_HEADER" value="2" /> + <option name="KEEP_BLANK_LINES_BEFORE_RBRACE" value="2" /> + <option name="BLANK_LINES_BEFORE_PACKAGE" value="0" /> + <option name="BLANK_LINES_AFTER_PACKAGE" value="1" /> + <option name="BLANK_LINES_BEFORE_IMPORTS" value="1" /> + <option name="BLANK_LINES_AFTER_IMPORTS" value="1" /> + <option name="BLANK_LINES_AROUND_CLASS" value="1" /> + <option name="BLANK_LINES_AROUND_FIELD" value="0" /> + <option name="BLANK_LINES_AROUND_METHOD" value="1" /> + <option name="BLANK_LINES_BEFORE_METHOD_BODY" value="0" /> + <option name="BLANK_LINES_AROUND_FIELD_IN_INTERFACE" value="0" /> + <option name="BLANK_LINES_AROUND_METHOD_IN_INTERFACE" value="1" /> + <option name="BLANK_LINES_AFTER_CLASS_HEADER" value="0" /> + <option name="BLANK_LINES_AFTER_ANONYMOUS_CLASS_HEADER" value="0" /> + <option name="BLANK_LINES_BEFORE_CLASS_END" value="0" /> + <option name="BRACE_STYLE" value="1" /> + <option name="CLASS_BRACE_STYLE" value="1" /> + <option name="METHOD_BRACE_STYLE" value="1" /> + <option name="LAMBDA_BRACE_STYLE" value="1" /> + <option name="USE_FLYING_GEESE_BRACES" value="false" /> + <option name="DO_NOT_INDENT_TOP_LEVEL_CLASS_MEMBERS" value="false" /> + <option name="ELSE_ON_NEW_LINE" value="false" /> + <option name="WHILE_ON_NEW_LINE" value="false" /> + <option name="CATCH_ON_NEW_LINE" value="false" /> + <option name="FINALLY_ON_NEW_LINE" value="false" /> + <option name="INDENT_CASE_FROM_SWITCH" value="true" /> + <option name="CASE_STATEMENT_ON_NEW_LINE" value="true" /> + <option name="INDENT_BREAK_FROM_CASE" value="true" /> + <option name="SPECIAL_ELSE_IF_TREATMENT" value="true" /> + <option name="ALIGN_MULTILINE_CHAINED_METHODS" value="false" /> + <option name="ALIGN_MULTILINE_PARAMETERS" value="true" /> + <option name="ALIGN_MULTILINE_PARAMETERS_IN_CALLS" value="false" /> + <option name="ALIGN_MULTILINE_RESOURCES" value="true" /> + <option name="ALIGN_MULTILINE_FOR" value="true" /> + <option name="INDENT_WHEN_CASES" value="true" /> + <option name="ALIGN_MULTILINE_BINARY_OPERATION" value="false" /> + <option name="ALIGN_MULTILINE_ASSIGNMENT" value="false" /> + <option name="ALIGN_MULTILINE_TERNARY_OPERATION" value="false" /> + <option name="ALIGN_MULTILINE_THROWS_LIST" value="false" /> + <option name="ALIGN_THROWS_KEYWORD" value="false" /> + <option name="ALIGN_MULTILINE_EXTENDS_LIST" value="false" /> + <option name="ALIGN_MULTILINE_METHOD_BRACKETS" value="false" /> + <option name="ALIGN_MULTILINE_PARENTHESIZED_EXPRESSION" value="false" /> + <option name="ALIGN_MULTILINE_ARRAY_INITIALIZER_EXPRESSION" value="false" /> + <option name="ALIGN_GROUP_FIELD_DECLARATIONS" value="false" /> + <option name="ALIGN_CONSECUTIVE_VARIABLE_DECLARATIONS" value="false" /> + <option name="ALIGN_CONSECUTIVE_ASSIGNMENTS" value="false" /> + <option name="ALIGN_SUBSEQUENT_SIMPLE_METHODS" value="false" /> + <option name="SPACE_AROUND_ASSIGNMENT_OPERATORS" value="true" /> + <option name="SPACE_AROUND_LOGICAL_OPERATORS" value="true" /> + <option name="SPACE_AROUND_EQUALITY_OPERATORS" value="true" /> + <option name="SPACE_AROUND_RELATIONAL_OPERATORS" value="true" /> + <option name="SPACE_AROUND_BITWISE_OPERATORS" value="true" /> + <option name="SPACE_AROUND_ADDITIVE_OPERATORS" value="true" /> + <option name="SPACE_AROUND_MULTIPLICATIVE_OPERATORS" value="true" /> + <option name="SPACE_AROUND_SHIFT_OPERATORS" value="true" /> + <option name="SPACE_AROUND_UNARY_OPERATOR" value="false" /> + <option name="SPACE_AROUND_LAMBDA_ARROW" value="true" /> + <option name="SPACE_AROUND_METHOD_REF_DBL_COLON" value="false" /> + <option name="SPACE_AFTER_COMMA" value="true" /> + <option name="SPACE_AFTER_COMMA_IN_TYPE_ARGUMENTS" value="true" /> + <option name="SPACE_BEFORE_COMMA" value="false" /> + <option name="SPACE_AFTER_SEMICOLON" value="true" /> + <option name="SPACE_BEFORE_SEMICOLON" value="false" /> + <option name="SPACE_WITHIN_PARENTHESES" value="false" /> + <option name="SPACE_WITHIN_METHOD_CALL_PARENTHESES" value="false" /> + <option name="SPACE_WITHIN_EMPTY_METHOD_CALL_PARENTHESES" value="false" /> + <option name="SPACE_WITHIN_METHOD_PARENTHESES" value="false" /> + <option name="SPACE_WITHIN_EMPTY_METHOD_PARENTHESES" value="false" /> + <option name="SPACE_WITHIN_IF_PARENTHESES" value="false" /> + <option name="SPACE_WITHIN_WHILE_PARENTHESES" value="false" /> + <option name="SPACE_WITHIN_FOR_PARENTHESES" value="false" /> + <option name="SPACE_WITHIN_TRY_PARENTHESES" value="false" /> + <option name="SPACE_WITHIN_CATCH_PARENTHESES" value="false" /> + <option name="SPACE_WITHIN_SWITCH_PARENTHESES" value="false" /> + <option name="SPACE_WITHIN_SYNCHRONIZED_PARENTHESES" value="false" /> + <option name="SPACE_WITHIN_CAST_PARENTHESES" value="false" /> + <option name="SPACE_WITHIN_BRACKETS" value="false" /> + <option name="SPACE_WITHIN_BRACES" value="false" /> + <option name="SPACE_WITHIN_ARRAY_INITIALIZER_BRACES" value="false" /> + <option name="SPACE_WITHIN_EMPTY_ARRAY_INITIALIZER_BRACES" value="false" /> + <option name="SPACE_AFTER_TYPE_CAST" value="true" /> + <option name="SPACE_BEFORE_METHOD_CALL_PARENTHESES" value="false" /> + <option name="SPACE_BEFORE_METHOD_PARENTHESES" value="false" /> + <option name="SPACE_BEFORE_IF_PARENTHESES" value="true" /> + <option name="SPACE_BEFORE_WHILE_PARENTHESES" value="true" /> + <option name="SPACE_BEFORE_FOR_PARENTHESES" value="true" /> + <option name="SPACE_BEFORE_TRY_PARENTHESES" value="true" /> + <option name="SPACE_BEFORE_CATCH_PARENTHESES" value="true" /> + <option name="SPACE_BEFORE_SWITCH_PARENTHESES" value="true" /> + <option name="SPACE_BEFORE_SYNCHRONIZED_PARENTHESES" value="true" /> + <option name="SPACE_BEFORE_CLASS_LBRACE" value="true" /> + <option name="SPACE_BEFORE_METHOD_LBRACE" value="true" /> + <option name="SPACE_BEFORE_IF_LBRACE" value="true" /> + <option name="SPACE_BEFORE_ELSE_LBRACE" value="true" /> + <option name="SPACE_BEFORE_WHILE_LBRACE" value="true" /> + <option name="SPACE_BEFORE_FOR_LBRACE" value="true" /> + <option name="SPACE_BEFORE_DO_LBRACE" value="true" /> + <option name="SPACE_BEFORE_SWITCH_LBRACE" value="true" /> + <option name="SPACE_BEFORE_TRY_LBRACE" value="true" /> + <option name="SPACE_BEFORE_CATCH_LBRACE" value="true" /> + <option name="SPACE_BEFORE_FINALLY_LBRACE" value="true" /> + <option name="SPACE_BEFORE_SYNCHRONIZED_LBRACE" value="true" /> + <option name="SPACE_BEFORE_ARRAY_INITIALIZER_LBRACE" value="false" /> + <option name="SPACE_BEFORE_ANNOTATION_ARRAY_INITIALIZER_LBRACE" value="false" /> + <option name="SPACE_BEFORE_ELSE_KEYWORD" value="true" /> + <option name="SPACE_BEFORE_WHILE_KEYWORD" value="true" /> + <option name="SPACE_BEFORE_CATCH_KEYWORD" value="true" /> + <option name="SPACE_BEFORE_FINALLY_KEYWORD" value="true" /> + <option name="SPACE_BEFORE_QUEST" value="true" /> + <option name="SPACE_AFTER_QUEST" value="true" /> + <option name="SPACE_BEFORE_COLON" value="true" /> + <option name="SPACE_AFTER_COLON" value="true" /> + <option name="SPACE_BEFORE_TYPE_PARAMETER_LIST" value="false" /> + <option name="CALL_PARAMETERS_WRAP" value="5" /> + <option name="PREFER_PARAMETERS_WRAP" value="false" /> + <option name="CALL_PARAMETERS_LPAREN_ON_NEXT_LINE" value="true" /> + <option name="CALL_PARAMETERS_RPAREN_ON_NEXT_LINE" value="true" /> + <option name="METHOD_PARAMETERS_WRAP" value="5" /> + <option name="METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE" value="true" /> + <option name="METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE" value="true" /> + <option name="RESOURCE_LIST_WRAP" value="0" /> + <option name="RESOURCE_LIST_LPAREN_ON_NEXT_LINE" value="false" /> + <option name="RESOURCE_LIST_RPAREN_ON_NEXT_LINE" value="false" /> + <option name="EXTENDS_LIST_WRAP" value="1" /> + <option name="THROWS_LIST_WRAP" value="0" /> + <option name="EXTENDS_KEYWORD_WRAP" value="0" /> + <option name="THROWS_KEYWORD_WRAP" value="0" /> + <option name="METHOD_CALL_CHAIN_WRAP" value="1" /> + <option name="WRAP_FIRST_METHOD_IN_CALL_CHAIN" value="false" /> + <option name="PARENTHESES_EXPRESSION_LPAREN_WRAP" value="false" /> + <option name="PARENTHESES_EXPRESSION_RPAREN_WRAP" value="false" /> + <option name="BINARY_OPERATION_WRAP" value="0" /> + <option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="false" /> + <option name="TERNARY_OPERATION_WRAP" value="0" /> + <option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="false" /> + <option name="MODIFIER_LIST_WRAP" value="false" /> + <option name="KEEP_SIMPLE_BLOCKS_IN_ONE_LINE" value="false" /> + <option name="KEEP_SIMPLE_METHODS_IN_ONE_LINE" value="false" /> + <option name="KEEP_SIMPLE_LAMBDAS_IN_ONE_LINE" value="false" /> + <option name="KEEP_SIMPLE_CLASSES_IN_ONE_LINE" value="false" /> + <option name="KEEP_MULTIPLE_EXPRESSIONS_IN_ONE_LINE" value="false" /> + <option name="FOR_STATEMENT_WRAP" value="0" /> + <option name="FOR_STATEMENT_LPAREN_ON_NEXT_LINE" value="false" /> + <option name="FOR_STATEMENT_RPAREN_ON_NEXT_LINE" value="false" /> + <option name="ARRAY_INITIALIZER_WRAP" value="0" /> + <option name="ARRAY_INITIALIZER_LBRACE_ON_NEXT_LINE" value="false" /> + <option name="ARRAY_INITIALIZER_RBRACE_ON_NEXT_LINE" value="false" /> + <option name="ASSIGNMENT_WRAP" value="1" /> + <option name="PLACE_ASSIGNMENT_SIGN_ON_NEXT_LINE" value="false" /> + <option name="LABELED_STATEMENT_WRAP" value="2" /> + <option name="WRAP_COMMENTS" value="false" /> + <option name="ASSERT_STATEMENT_WRAP" value="0" /> + <option name="ASSERT_STATEMENT_COLON_ON_NEXT_LINE" value="false" /> + <option name="IF_BRACE_FORCE" value="0" /> + <option name="DOWHILE_BRACE_FORCE" value="0" /> + <option name="WHILE_BRACE_FORCE" value="0" /> + <option name="FOR_BRACE_FORCE" value="0" /> + <option name="WRAP_LONG_LINES" value="false" /> + <option name="METHOD_ANNOTATION_WRAP" value="2" /> + <option name="CLASS_ANNOTATION_WRAP" value="2" /> + <option name="FIELD_ANNOTATION_WRAP" value="2" /> + <option name="PARAMETER_ANNOTATION_WRAP" value="0" /> + <option name="VARIABLE_ANNOTATION_WRAP" value="0" /> + <option name="SPACE_BEFORE_ANOTATION_PARAMETER_LIST" value="false" /> + <option name="SPACE_WITHIN_ANNOTATION_PARENTHESES" value="false" /> + <option name="ENUM_CONSTANTS_WRAP" value="0" /> + <option name="FORCE_REARRANGE_MODE" value="0" /> + <option name="WRAP_ON_TYPING" value="1" /> </codeStyleSettings> </code_scheme> </component> \ No newline at end of file diff --git a/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt b/sandbox/src/main/kotlin/tech/libeufin/sandbox/Main.kt @@ -93,7 +93,7 @@ private suspend fun ApplicationCall.respondEbicsKeyManagement( this.dataEncryptionInfo = EbicsTypes.DataEncryptionInfo().apply { this.authenticate = true this.transactionKey = dataTransfer.encryptedTransactionKey - this.encryptionPubKeyDigest = EbicsTypes.DataEncryptionInfo.EncryptionPubKeyDigest().apply { + this.encryptionPubKeyDigest = EbicsTypes.PubKeyDigest().apply { this.algorithm = "http://www.w3.org/2001/04/xmlenc#sha256" this.version = "E002" this.value = dataTransfer.pubKeyDigest 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 @@ -5,7 +5,6 @@ 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.XmlAdapter import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter import javax.xml.datatype.XMLGregorianCalendar @@ -13,6 +12,13 @@ import javax.xml.datatype.XMLGregorianCalendar @XmlType(name = "", propOrder = ["header", "authSignature", "body"]) @XmlRootElement(name = "ebicsRequest") class EbicsRequest { + @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 @@ -35,7 +41,16 @@ class EbicsRequest { var authenticate: Boolean = false } - abstract class StaticHeaderType { + @XmlAccessorType(XmlAccessType.NONE) + @XmlType( + name = "", + propOrder = [ + "hostID", "nonce", "timestamp", "partnerID", "userID", "systemID", + "product", "orderDetails", "bankPubKeyDigests", "securityMedium", + "numSegments", "transactionID" + ] + ) + class StaticHeaderType { @get:XmlElement(name = "HostID", required = true) @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) lateinit var hostID: String @@ -80,7 +95,7 @@ class EbicsRequest { * Present only in the initialization phase. */ @get:XmlElement(name = "Product") - val product: EbicsTypes.Product? = null + var product: EbicsTypes.Product? = null /** * Present only in the initialization phase. @@ -91,6 +106,12 @@ class EbicsRequest { /** * Present only in the initialization phase. */ + @get:XmlElement(name = "BankPubKeyDigests") + var bankPubKeyDigests: BankPubKeyDigests? = null + + /** + * Present only in the initialization phase. + */ @get:XmlElement(name = "SecurityMedium") var securityMedium: String? = null @@ -112,9 +133,9 @@ class EbicsRequest { @XmlAccessorType(XmlAccessType.NONE) @XmlType(name = "", propOrder = ["transactionPhase", "segmentNumber"]) class MutableHeader { - @get:XmlElement(name = "TransactionID") - @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) - var transactionPhase: String? = null + @get:XmlElement(name = "TransactionPhase", required = true) + @get:XmlSchemaType(name = "token") + lateinit var transactionPhase: EbicsTypes.TransactionPhaseType /** * Number of the currently transmitted segment, if this message @@ -126,7 +147,9 @@ class EbicsRequest { } @XmlAccessorType(XmlAccessType.NONE) - @XmlType(name = "", propOrder = ["orderType", "orderID", "orderAttribute"]) + @XmlType( + name = "", + propOrder = ["orderType", "orderID", "orderAttribute", "orderParams"]) class OrderDetails { @get:XmlElement(name = "OrderType", required = true) @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) @@ -136,13 +159,22 @@ class EbicsRequest { * Only present if this ebicsRequest is a upload order * relating to an already existing order. */ - @get:XmlElement(name = "OrderId", required = true) + @get:XmlElement(name = "OrderID", required = true) @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) var orderID: String? = null @get:XmlElement(name = "OrderAttribute", required = true) @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) lateinit var orderAttribute: String + + /** + * Present only in the initialization phase. + */ + @get:XmlElements( + XmlElement( + name = "StandardOrderParams", + type = StandardOrderParams::class)) + var orderParams: OrderParams? = null } @XmlAccessorType(XmlAccessType.NONE) @@ -189,4 +221,34 @@ class EbicsRequest { @get:XmlElement(name = "ReceiptCode") var receiptCode: Int? = null } + + @XmlAccessorType(XmlAccessType.NONE) + abstract class OrderParams + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType(name = "", propOrder = ["dateRange"]) + class StandardOrderParams : OrderParams() { + @get:XmlElement(name = "DateRange") + var dateRange: DateRange? = null + } + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType(name = "", propOrder = ["start", "end"]) + class DateRange { + @get:XmlElement(name = "Start") + lateinit var start: XMLGregorianCalendar + + @get:XmlElement(name = "END") + lateinit var end: XMLGregorianCalendar + } + + @XmlAccessorType(XmlAccessType.NONE) + @XmlType(name = "", propOrder = ["authentication", "encryption"]) + class BankPubKeyDigests { + @get:XmlElement(name = "Authentication") + lateinit var authentication: EbicsTypes.PubKeyDigest + + @get:XmlElement(name = "Encryption") + lateinit var encryption: EbicsTypes.PubKeyDigest + } } 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 @@ -13,6 +13,13 @@ import javax.xml.namespace.QName @XmlType(name = "", propOrder = ["header", "authSignature", "body"]) @XmlRootElement(name = "ebicsResponse") class EbicsResponse { + @get:XmlAttribute(name = "Version", required = true) + @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class) + lateinit var version: String + + @get:XmlAttribute(name = "Revision") + var revision: Int? = null + @get:XmlElement(required = true) lateinit var header: EbicsResponse.Header @@ -22,13 +29,6 @@ class EbicsResponse { @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>() 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 @@ -21,10 +21,8 @@ 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 @@ -60,32 +58,31 @@ class EbicsTypes private constructor() { var authenticate: Boolean = false @get:XmlElement(name = "EncryptionPubKeyDigest", required = true) - lateinit var encryptionPubKeyDigest: EncryptionPubKeyDigest + lateinit var encryptionPubKeyDigest: PubKeyDigest @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) + class PubKeyDigest { + /** + * 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) { @@ -205,6 +202,5 @@ class EbicsTypes private constructor() { @get:XmlElement(name = "Value", required = true) lateinit var value: String - } } \ No newline at end of file diff --git a/sandbox/src/test/kotlin/EbicsMessagesTest.kt b/sandbox/src/test/kotlin/EbicsMessagesTest.kt @@ -8,6 +8,7 @@ import tech.libeufin.schema.ebics_h004.* import tech.libeufin.schema.ebics_hev.HEVResponse import tech.libeufin.schema.ebics_hev.SystemReturnCodeType import tech.libeufin.schema.ebics_s001.SignaturePubKeyOrderData +import javax.xml.datatype.DatatypeFactory import kotlin.test.assertNotNull import kotlin.test.assertTrue @@ -230,4 +231,60 @@ class EbicsMessagesTest { println(str) assert(XMLUtil.validateFromString(str)) } + + @Test + fun testEbicsRequestInitializationPhase() { + val ebicsRequestObj = EbicsRequest().apply { + this.version = "H004" + this.revision = 1 + this.authSignature = SignatureType() + this.header = EbicsRequest.Header().apply { + this.authenticate = true + this.mutable = EbicsRequest.MutableHeader().apply { + this.transactionPhase = EbicsTypes.TransactionPhaseType.INITIALISATION + } + this.static = EbicsRequest.StaticHeaderType().apply { + this.hostID = "myhost" + this.nonce = ByteArray(16) + this.timestamp = + DatatypeFactory.newDefaultInstance().newXMLGregorianCalendar(2019, 5, 5, 5, 5, 5, 0, 0) + this.partnerID = "mypid01" + this.userID = "myusr01" + this.product = EbicsTypes.Product().apply { + this.instituteID = "test" + this.language = "en" + this.value = "test" + } + this.orderDetails = EbicsRequest.OrderDetails().apply { + this.orderAttribute = "DZHNN" + this.orderID = "OR01" + this.orderType = "BLA" + this.orderParams = EbicsRequest.StandardOrderParams() + } + this.bankPubKeyDigests = EbicsRequest.BankPubKeyDigests().apply { + this.authentication = EbicsTypes.PubKeyDigest().apply { + this.algorithm = "foo" + this.value = ByteArray(32) + this.version = "X002" + } + this.encryption = EbicsTypes.PubKeyDigest().apply { + this.algorithm = "foo" + this.value = ByteArray(32) + this.version = "E002" + } + } + this.securityMedium = "0000" + } + } + this.body = EbicsRequest.Body().apply { + } + } + + val str = XMLUtil.convertJaxbToString(ebicsRequestObj) + val doc = XMLUtil.parseStringIntoDom(str) + val pair = CryptoUtil.generateRsaKeyPair(1024) + XMLUtil.signEbicsDocument(doc, pair.private) + val finalStr = XMLUtil.convertDomToString(doc) + assert(XMLUtil.validateFromString(finalStr)) + } } \ No newline at end of file