Fixed ZweiSchrittTanEinreichung (stupid me, looked at the spec for HITAN, not for HKTAN)
This commit is contained in:
parent
8d16cab528
commit
b85536dac2
|
@ -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)
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
|
@ -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.")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
* X’01 23 45 67 89 AB CD EF FE DC BA 98 76 54 32 10 F0 E1 D2 C3’.
|
* 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)
|
: BinaerDatenelement(hash, existenzstatus, 256)
|
|
@ -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)
|
|
|
@ -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)
|
|
|
@ -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)
|
Loading…
Reference in New Issue