From b85536dac290115c61dba31059f9f22bccb24db6 Mon Sep 17 00:00:00 2001 From: dankl Date: Sun, 6 Oct 2019 19:25:32 +0200 Subject: [PATCH] Fixed ZweiSchrittTanEinreichung (stupid me, looked at the spec for HITAN, not for HKTAN) --- .../dankito/fints/messages/MessageBuilder.kt | 4 +- .../abgeleiteteformate/JaNein.kt | 13 +++++++ .../basisformate/BinaerDatenelement.kt | 13 ++++--- .../implementierte/tan/AuftragsHashwert.kt | 2 +- .../implementierte/tan/ChallengeHHD_UC.kt | 16 -------- .../implementierte/tan/ChallengeVersion3.kt | 27 -------------- .../ZweiSchrittTanEinreichung.kt | 37 +++++++++++-------- 7 files changed, 46 insertions(+), 66 deletions(-) create mode 100644 fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelemente/abgeleiteteformate/JaNein.kt delete mode 100644 fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelemente/implementierte/tan/ChallengeHHD_UC.kt delete mode 100644 fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelemente/implementierte/tan/ChallengeVersion3.kt diff --git a/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/MessageBuilder.kt b/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/MessageBuilder.kt index 3efcb759..3def85f0 100644 --- a/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/MessageBuilder.kt +++ b/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/MessageBuilder.kt @@ -63,7 +63,7 @@ open class MessageBuilder(protected val generator: ISegmentNumberGenerator = Seg return createSignedMessage(bank, customer, dialogData, listOf( IdentifikationsSegment(generator.resetSegmentNumber(2), bank, customer), Verarbeitungsvorbereitung(generator.getNextSegmentNumber(), bank, customer, product), - ZweiSchrittTanEinreichung(generator.getNextSegmentNumber(), TanProcess.TanProcess4, CustomerSegmentId.Identification.id) + ZweiSchrittTanEinreichung(generator.getNextSegmentNumber(), TanProcess.TanProcess4, CustomerSegmentId.Identification) )) } @@ -72,7 +72,7 @@ open class MessageBuilder(protected val generator: ISegmentNumberGenerator = Seg return createSignedMessage(bank, customer, dialogData, listOf( IdentifikationsSegment(generator.resetSegmentNumber(2), bank, customer), Verarbeitungsvorbereitung(generator.getNextSegmentNumber(), bank, customer, product), - ZweiSchrittTanEinreichung(generator.getNextSegmentNumber(), TanProcess.TanProcess4, CustomerSegmentId.Identification.id), + ZweiSchrittTanEinreichung(generator.getNextSegmentNumber(), TanProcess.TanProcess4, CustomerSegmentId.Identification), Synchronisierung(generator.getNextSegmentNumber(), Synchronisierungsmodus.NeueKundensystemIdZurueckmelden) )) } diff --git a/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelemente/abgeleiteteformate/JaNein.kt b/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelemente/abgeleiteteformate/JaNein.kt new file mode 100644 index 00000000..7ccd3d0d --- /dev/null +++ b/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelemente/abgeleiteteformate/JaNein.kt @@ -0,0 +1,13 @@ +package net.dankito.fints.messages.datenelemente.abgeleiteteformate + +import net.dankito.fints.messages.Existenzstatus +import net.dankito.fints.messages.datenelemente.basisformate.AlphanumerischesDatenelement + + +/** + * Format: J bzw. N (in Großbuchstaben) + * + * Hat das DE den Status „Kann“, so gilt bei Auslassung der Standardwert „N“. + */ +open class JaNein(yes: Boolean?, existenzstatus: Existenzstatus) + : AlphanumerischesDatenelement(if (yes == true) "J" else "N", existenzstatus, 1) \ No newline at end of file diff --git a/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelemente/basisformate/BinaerDatenelement.kt b/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelemente/basisformate/BinaerDatenelement.kt index 3773820d..b2843dbc 100644 --- a/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelemente/basisformate/BinaerDatenelement.kt +++ b/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelemente/basisformate/BinaerDatenelement.kt @@ -10,9 +10,12 @@ import net.dankito.fints.messages.datenelemente.Datenelement * für binäre Daten keine Gültigkeit besitzt. Ferner gelten die speziellen Syntaxregeln für * binäre Daten (s. Kap. H.1.3). */ -open class BinaerDatenelement @JvmOverloads constructor(val data: ByteArray, existenzstatus: Existenzstatus, val maxLength: Int? = null) +open class BinaerDatenelement @JvmOverloads constructor(val data: String, existenzstatus: Existenzstatus, val maxLength: Int? = null) : Datenelement(existenzstatus) { + @JvmOverloads constructor(data: ByteArray, existenzstatus: Existenzstatus, maxLength: Int? = null) : + this(String(data), existenzstatus, maxLength) + /** * Für binäre Daten gilt eine besondere Syntaxregelung: Das Auftreten dieser Daten wird eingeleitet mit dem * Binärdatenkennzeichen (@). Anschließend folgt die Längenangabe zu den binären Daten und der binäre Wert selbst, @@ -25,8 +28,8 @@ open class BinaerDatenelement @JvmOverloads constructor(val data: ByteArray, exi * Spezifikation vorzusehen. */ override fun format(): String { - if (data.size > 0) { - return "@${data.size}@" + String(data) + if (data.length > 0) { + return "@${data.length}@" + data } return "" @@ -36,9 +39,9 @@ open class BinaerDatenelement @JvmOverloads constructor(val data: ByteArray, exi // binary data aren't checked, so they are always valid maxLength?.let { - if (data.size > maxLength) { + if (data.length > maxLength) { throwValidationException("Binäre Daten dürfen nur eine maximale Größe von $maxLength Bytes haben, " + - "haben aber ${data.size} Bytes.") + "haben aber ${data.length} Bytes.") } } } diff --git a/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelemente/implementierte/tan/AuftragsHashwert.kt b/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelemente/implementierte/tan/AuftragsHashwert.kt index 63cede7a..c24100e1 100644 --- a/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelemente/implementierte/tan/AuftragsHashwert.kt +++ b/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelemente/implementierte/tan/AuftragsHashwert.kt @@ -26,5 +26,5 @@ import net.dankito.fints.messages.datenelemente.basisformate.BinaerDatenelement * Als Initialisierungsvektor dient die binäre Zeichenfolge * X’01 23 45 67 89 AB CD EF FE DC BA 98 76 54 32 10 F0 E1 D2 C3’. */ -open class AuftragsHashwert(hash: ByteArray, existenzstatus: Existenzstatus) +open class AuftragsHashwert(hash: String, existenzstatus: Existenzstatus) : BinaerDatenelement(hash, existenzstatus, 256) \ No newline at end of file diff --git a/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelemente/implementierte/tan/ChallengeHHD_UC.kt b/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelemente/implementierte/tan/ChallengeHHD_UC.kt deleted file mode 100644 index 6312d083..00000000 --- a/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelemente/implementierte/tan/ChallengeHHD_UC.kt +++ /dev/null @@ -1,16 +0,0 @@ -package net.dankito.fints.messages.datenelemente.implementierte.tan - -import net.dankito.fints.messages.Existenzstatus -import net.dankito.fints.messages.datenelemente.basisformate.BinaerDatenelement - - -/** - * Bei Verwendung von Zwei-Schritt-Verfahren mit unidirektionaler Kopplung (vgl. hierzu [HHD_UC]) - * müssen zusätzlich zum Datenelement „Challenge“ die Daten für die Übertragung z. B. über eine - * optische Schnittstelle bereitgestellt werden. Die einzelnen Datenelemente der „Challenge HHD_UC“ - * sind in [HHD_UC] beschrieben und werden hier im FinTS Data Dictionary nicht näher erläutert. - * Da HHD_UC einen anderen Basiszeichensatz verwendet (ISO 646) wird die HHD_UC-Struktur als binär - * definiert. Als maximale Länge kann ein Wert von 128 angenommen werden. - */ -open class ChallengeHHD_UC(challenge: ByteArray, existenzstatus: Existenzstatus) - : BinaerDatenelement(challenge, existenzstatus, 128) \ No newline at end of file diff --git a/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelemente/implementierte/tan/ChallengeVersion3.kt b/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelemente/implementierte/tan/ChallengeVersion3.kt deleted file mode 100644 index 8b8b562d..00000000 --- a/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelemente/implementierte/tan/ChallengeVersion3.kt +++ /dev/null @@ -1,27 +0,0 @@ -package net.dankito.fints.messages.datenelemente.implementierte.tan - -import net.dankito.fints.messages.Existenzstatus -import net.dankito.fints.messages.datenelemente.basisformate.AlphanumerischesDatenelement - - -/** - * Dieses Datenelement enthält im Falle des Zwei-Schritt-TAN-Verfahrens die Challenge zu einem - * eingereichten Auftrag. Aus der Challenge wird vom Kunden die eigentliche TAN ermittelt. - * Die Challenge wird unabhängig vom Prozessvariante 1 oder 2 in der Kreditinstitutsantwort im - * Segment HITAN übermittelt. - * - * Ist der BPD-Parameter „Challenge strukturiert“ mit „J“ belegt, so können im Text folgende - * Formatsteuerzeichen enthalten sein, die kundenseitig entsprechend zu interpretieren sind. - * Eine Kaskadierung von Steuerzeichen ist nicht erlaubt. - * - *
Zeilenumbruch - *

Neuer Absatz - * ... Fettdruck - * ... Kursivdruck - * ... Unterstreichen - *

Beginn / Ende Aufzählung - *
    ...
Beginn / Ende Nummerierte Liste - *
  • ...
  • Listenelement einer Aufzählung / Nummerierten Liste - */ -open class ChallengeVersion3(challenge: String, existenzstatus: Existenzstatus) - : AlphanumerischesDatenelement(challenge, existenzstatus, 2048) \ No newline at end of file diff --git a/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/segmente/implementierte/ZweiSchrittTanEinreichung.kt b/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/segmente/implementierte/ZweiSchrittTanEinreichung.kt index 833952e7..d490449b 100644 --- a/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/segmente/implementierte/ZweiSchrittTanEinreichung.kt +++ b/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/segmente/implementierte/ZweiSchrittTanEinreichung.kt @@ -1,31 +1,38 @@ package net.dankito.fints.messages.segmente.implementierte import net.dankito.fints.messages.Existenzstatus -import net.dankito.fints.messages.datenelemente.implementierte.tan.Auftragsreferenz -import net.dankito.fints.messages.datenelemente.implementierte.tan.TANProzessDatenelement -import net.dankito.fints.messages.datenelemente.implementierte.tan.TanProcess +import net.dankito.fints.messages.datenelemente.abgeleiteteformate.JaNein +import net.dankito.fints.messages.datenelemente.implementierte.NotAllowedDatenelement +import net.dankito.fints.messages.datenelemente.implementierte.Segmentkennung +import net.dankito.fints.messages.datenelemente.implementierte.tan.* import net.dankito.fints.messages.datenelementgruppen.implementierte.Segmentkopf import net.dankito.fints.messages.segmente.Segment import net.dankito.fints.messages.segmente.id.CustomerSegmentId +import net.dankito.fints.messages.segmente.id.ISegmentId open class ZweiSchrittTanEinreichung( segmentNumber: Int, process: TanProcess, - jobReference: String, - challenge: String = "", - challgendHHD_UC: ByteArray = byteArrayOf(), - date: Int? = null, - time: Int? = null, - tanMediaIdentifier: String? = "N" // TODO: why 'N'? + segmentIdForWhichTanShouldGetGenerated: ISegmentId? = null, + jobHashValue: String? = null, + jobReference: String? = null, + furtherTanFollows: Boolean? = false, + cancelJob: Boolean? = false, + tanMediaIdentifier: String? = null ) : Segment(listOf( Segmentkopf(CustomerSegmentId.Tan, 6, segmentNumber), TANProzessDatenelement(process), - // AuftragsHashwert(), // M: bei AuftragsHashwertverfahren<>0 und TAN-Prozess=1. N: sonst - Auftragsreferenz(jobReference, Existenzstatus.Mandatory) // M: bei TAN-Prozess=2, 3, 4. O: bei TAN-Prozess=1 - // ChallengeVersion3(challenge, Existenzstatus.Mandatory), // M: bei TAN-Prozess=1, 3, 4. O: bei TAN-Prozess=2 - // ChallengeHHD_UC(challgendHHD_UC, Existenzstatus.Optional), - // NotAllowedDatenelement(), // GueltigkeitsdatumUndUhrzeitFuerChallenge // TODO: how to not write an element if it's optional and its paramters (date and time) are not set? - // BezeichnungDesTANMediums(tanMediaIdentifier ?: "", Existenzstatus.Optional)// M: bei TAN-Prozess=1, 3, 4 und „Anzahl unterstützter aktiver TAN-Medien“ nicht vorhanden. O: sonst + Segmentkennung(segmentIdForWhichTanShouldGetGenerated?.id ?: ""), // M: bei TAN-Prozess=1. M: bei TAN-Prozess=4 und starker Authentifizierung. N: sonst + NotAllowedDatenelement(), // Kontoverbindung // M: bei TAN-Prozess=1 und "Auftraggeberkonto erforderlich"=2 und Kontoverbindung im Auftrag enthalten. N: sonst + AuftragsHashwert(jobHashValue ?: "", Existenzstatus.NotAllowed), // M: bei AuftragsHashwertverfahren<>0 und TAN-Prozess=1. N: sonst + Auftragsreferenz(jobReference ?: "", Existenzstatus.Mandatory), // M: bei TAN-Prozess=2, 3, 4. O: bei TAN-Prozess=1 + JaNein(furtherTanFollows, Existenzstatus.NotAllowed), // M: bei TAN-Prozess=1, 2. N: bei TAN-Prozess=3, 4 + JaNein(cancelJob, Existenzstatus.NotAllowed), // O: bei TAN-Prozess=2 und „Auftragsstorno erlaubt“=J. N: sonst + NotAllowedDatenelement(), // TODO: SMS-Abbuchungskonto // M: Bei TAN-Process=1, 3, 4 und „SMS-Abbuchungskonto erforderlich“=2. O: sonst + NotAllowedDatenelement(), // TODO: Challenge-Klasse // M: bei TAN-Prozess=1 und „Challenge-Klasse erforderlich“=J. N: sonst + NotAllowedDatenelement(), // TODO: Parameter Challenge-Klasse // O: Bei TAN-Process=1 „Challenge-Klasse erforderlich“=J. N: sonst + BezeichnungDesTANMediums(tanMediaIdentifier ?: "", Existenzstatus.Optional), // M: bei TAN-Prozess=1, 3, 4 und „Anzahl unterstützter aktiver TAN-Medien“ nicht vorhanden. O: sonst + NotAllowedDatenelement() // TODO: Antwort HHD_UC // M: bei TAN-Prozess=2 und „Antwort HHD_UC erforderlich“=“J“. O: sonst ), Existenzstatus.Mandatory) \ No newline at end of file