Fixed ZweiSchrittTanEinreichung (stupid me, looked at the spec for HITAN, not for HKTAN)

This commit is contained in:
dankl 2019-10-06 19:25:32 +02:00 committed by dankito
parent 8d16cab528
commit b85536dac2
7 changed files with 46 additions and 66 deletions

View File

@ -63,7 +63,7 @@ open class MessageBuilder(protected val generator: ISegmentNumberGenerator = Seg
return createSignedMessage(bank, customer, dialogData, listOf( return createSignedMessage(bank, customer, dialogData, listOf(
IdentifikationsSegment(generator.resetSegmentNumber(2), bank, customer), IdentifikationsSegment(generator.resetSegmentNumber(2), bank, customer),
Verarbeitungsvorbereitung(generator.getNextSegmentNumber(), bank, customer, product), 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( return createSignedMessage(bank, customer, dialogData, listOf(
IdentifikationsSegment(generator.resetSegmentNumber(2), bank, customer), IdentifikationsSegment(generator.resetSegmentNumber(2), bank, customer),
Verarbeitungsvorbereitung(generator.getNextSegmentNumber(), bank, customer, product), 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) Synchronisierung(generator.getNextSegmentNumber(), Synchronisierungsmodus.NeueKundensystemIdZurueckmelden)
)) ))
} }

View File

@ -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)

View File

@ -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 * für binäre Daten keine Gültigkeit besitzt. Ferner gelten die speziellen Syntaxregeln für
* binäre Daten (s. Kap. H.1.3). * 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) { : 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 * 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, * 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. * Spezifikation vorzusehen.
*/ */
override fun format(): String { override fun format(): String {
if (data.size > 0) { if (data.length > 0) {
return "@${data.size}@" + String(data) return "@${data.length}@" + data
} }
return "" return ""
@ -36,9 +39,9 @@ open class BinaerDatenelement @JvmOverloads constructor(val data: ByteArray, exi
// binary data aren't checked, so they are always valid // binary data aren't checked, so they are always valid
maxLength?.let { 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, " + 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.")
} }
} }
} }

View File

@ -26,5 +26,5 @@ import net.dankito.fints.messages.datenelemente.basisformate.BinaerDatenelement
* Als Initialisierungsvektor dient die binäre Zeichenfolge * Als Initialisierungsvektor dient die binäre Zeichenfolge
* X01 23 45 67 89 AB CD EF FE DC BA 98 76 54 32 10 F0 E1 D2 C3. * X01 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) : BinaerDatenelement(hash, existenzstatus, 256)

View File

@ -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)

View File

@ -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.
*
* <br> Zeilenumbruch
* <p> Neuer Absatz
* <b> ... </b> Fettdruck
* <i> ... </i> Kursivdruck
* <u> ... </u> Unterstreichen
* <ul> ... </ul> Beginn / Ende Aufzählung
* <ol> ... </ol> Beginn / Ende Nummerierte Liste
* <li> ... </li> Listenelement einer Aufzählung / Nummerierten Liste
*/
open class ChallengeVersion3(challenge: String, existenzstatus: Existenzstatus)
: AlphanumerischesDatenelement(challenge, existenzstatus, 2048)

View File

@ -1,31 +1,38 @@
package net.dankito.fints.messages.segmente.implementierte package net.dankito.fints.messages.segmente.implementierte
import net.dankito.fints.messages.Existenzstatus import net.dankito.fints.messages.Existenzstatus
import net.dankito.fints.messages.datenelemente.implementierte.tan.Auftragsreferenz import net.dankito.fints.messages.datenelemente.abgeleiteteformate.JaNein
import net.dankito.fints.messages.datenelemente.implementierte.tan.TANProzessDatenelement import net.dankito.fints.messages.datenelemente.implementierte.NotAllowedDatenelement
import net.dankito.fints.messages.datenelemente.implementierte.tan.TanProcess 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.datenelementgruppen.implementierte.Segmentkopf
import net.dankito.fints.messages.segmente.Segment import net.dankito.fints.messages.segmente.Segment
import net.dankito.fints.messages.segmente.id.CustomerSegmentId import net.dankito.fints.messages.segmente.id.CustomerSegmentId
import net.dankito.fints.messages.segmente.id.ISegmentId
open class ZweiSchrittTanEinreichung( open class ZweiSchrittTanEinreichung(
segmentNumber: Int, segmentNumber: Int,
process: TanProcess, process: TanProcess,
jobReference: String, segmentIdForWhichTanShouldGetGenerated: ISegmentId? = null,
challenge: String = "", jobHashValue: String? = null,
challgendHHD_UC: ByteArray = byteArrayOf(), jobReference: String? = null,
date: Int? = null, furtherTanFollows: Boolean? = false,
time: Int? = null, cancelJob: Boolean? = false,
tanMediaIdentifier: String? = "N" // TODO: why 'N'? tanMediaIdentifier: String? = null
) : Segment(listOf( ) : Segment(listOf(
Segmentkopf(CustomerSegmentId.Tan, 6, segmentNumber), Segmentkopf(CustomerSegmentId.Tan, 6, segmentNumber),
TANProzessDatenelement(process), TANProzessDatenelement(process),
// AuftragsHashwert(), // M: bei AuftragsHashwertverfahren<>0 und TAN-Prozess=1. N: sonst Segmentkennung(segmentIdForWhichTanShouldGetGenerated?.id ?: ""), // M: bei TAN-Prozess=1. M: bei TAN-Prozess=4 und starker Authentifizierung. N: sonst
Auftragsreferenz(jobReference, Existenzstatus.Mandatory) // M: bei TAN-Prozess=2, 3, 4. O: bei TAN-Prozess=1 NotAllowedDatenelement(), // Kontoverbindung // M: bei TAN-Prozess=1 und "Auftraggeberkonto erforderlich"=2 und Kontoverbindung im Auftrag enthalten. N: sonst
// ChallengeVersion3(challenge, Existenzstatus.Mandatory), // M: bei TAN-Prozess=1, 3, 4. O: bei TAN-Prozess=2 AuftragsHashwert(jobHashValue ?: "", Existenzstatus.NotAllowed), // M: bei AuftragsHashwertverfahren<>0 und TAN-Prozess=1. N: sonst
// ChallengeHHD_UC(challgendHHD_UC, Existenzstatus.Optional), Auftragsreferenz(jobReference ?: "", Existenzstatus.Mandatory), // M: bei TAN-Prozess=2, 3, 4. O: bei TAN-Prozess=1
// NotAllowedDatenelement(), // GueltigkeitsdatumUndUhrzeitFuerChallenge // TODO: how to not write an element if it's optional and its paramters (date and time) are not set? JaNein(furtherTanFollows, Existenzstatus.NotAllowed), // M: bei TAN-Prozess=1, 2. N: bei TAN-Prozess=3, 4
// BezeichnungDesTANMediums(tanMediaIdentifier ?: "", Existenzstatus.Optional)// M: bei TAN-Prozess=1, 3, 4 und „Anzahl unterstützter aktiver TAN-Medien“ nicht vorhanden. O: sonst 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) ), Existenzstatus.Mandatory)