diff --git a/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelemente/implementierte/signatur/VersionDesSicherheitsverfahrens.kt b/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelemente/implementierte/signatur/VersionDesSicherheitsverfahrens.kt index c4aa0278..9e86a423 100644 --- a/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelemente/implementierte/signatur/VersionDesSicherheitsverfahrens.kt +++ b/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelemente/implementierte/signatur/VersionDesSicherheitsverfahrens.kt @@ -3,14 +3,24 @@ package net.dankito.fints.messages.datenelemente.implementierte.signatur enum class VersionDesSicherheitsverfahrens(val methodNumber: Int) { - PIN_Ein_Schritt(1), + Version_1(1), - PIN_Zwei_Schritt(2), + Version_2(2), - RAH_7(7), + Version_3(3), - RAH_9(9), + Version_4(4), - RAH_10(10) + Version_5(5), + + Version_6(6), + + Version_7(7), + + Version_8(8), + + Version_9(9), + + Version_10(10) } \ No newline at end of file diff --git a/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/segmente/implementierte/Signaturkopf.kt b/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/segmente/implementierte/Signaturkopf.kt index 3b1eca7d..ec246bd6 100644 --- a/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/segmente/implementierte/Signaturkopf.kt +++ b/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/segmente/implementierte/Signaturkopf.kt @@ -36,7 +36,7 @@ open class Signaturkopf( ) : Segment(listOf( Segmentkopf(MessageSegmentId.SignatureHeader, 4, segmentNumber), // allowed - Sicherheitsprofil(Sicherheitsverfahren.PIN_TAN_Verfahren, VersionDesSicherheitsverfahrens.PIN_Zwei_Schritt), // fints4java only supports Pin/Tan and PSD2 requires two step tan procedure + Sicherheitsprofil(Sicherheitsverfahren.PIN_TAN_Verfahren, VersionDesSicherheitsverfahrens.Version_2), // fints4java only supports Pin/Tan and PSD2 requires two step tan procedure SicherheitsfunktionKodiert(customer.selectedTanProcedure.securityFunction), Sicherheitskontrollreferenz(securityControlReference), // allowed: <>0 BereichDerSicherheitsapplikationKodiert(BereichDerSicherheitsapplikation.SignaturkopfUndHBCINutzdaten), // allowed: 1 ? diff --git a/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/segmente/implementierte/Verschluesselungskopf.kt b/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/segmente/implementierte/Verschluesselungskopf.kt index 6c83946e..f1233bbd 100644 --- a/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/segmente/implementierte/Verschluesselungskopf.kt +++ b/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/segmente/implementierte/Verschluesselungskopf.kt @@ -45,7 +45,7 @@ open class Verschluesselungskopf( ) : Segment(listOf( Segmentkopf(MessageSegmentId.EncryptionHeader, 3, 998), - Sicherheitsprofil(Sicherheitsverfahren.PIN_TAN_Verfahren, VersionDesSicherheitsverfahrens.PIN_Zwei_Schritt), // fints4java only supports Pin/Tan and PSD2 requires two step tan procedure + Sicherheitsprofil(Sicherheitsverfahren.PIN_TAN_Verfahren, VersionDesSicherheitsverfahrens.Version_2), // fints4java only supports Pin/Tan and PSD2 requires two step tan procedure SicherheitsfunktionKodiert(Sicherheitsfunktion.Klartext), RolleDesSicherheitslieferantenKodiert(), // allowed: 1, 4 SicherheitsidentifikationDetails(customer.customerSystemId), diff --git a/fints4javaLib/src/main/kotlin/net/dankito/fints/response/ResponseParser.kt b/fints4javaLib/src/main/kotlin/net/dankito/fints/response/ResponseParser.kt index 3eff405b..0c335852 100644 --- a/fints4javaLib/src/main/kotlin/net/dankito/fints/response/ResponseParser.kt +++ b/fints4javaLib/src/main/kotlin/net/dankito/fints/response/ResponseParser.kt @@ -303,9 +303,13 @@ open class ResponseParser @JvmOverloads constructor( } - protected open fun parseTanInfo(segment: String, segmentId: String, dataElementGroups: List): TanInfo { + protected open fun parseTanInfo(segment: String, segmentId: String, dataElementGroups: List): TanInfo? { val jobParameters = parseJobParameters(segment, segmentId, dataElementGroups) + if (jobParameters.segmentVersion < 6) { // Versions 4 and 5 have a different, outdated format, we're not able to parse this + return null + } + return TanInfo(jobParameters, parseTwoStepTanProcedureParameters(dataElementGroups[4])) } @@ -355,8 +359,10 @@ open class ResponseParser @JvmOverloads constructor( parseCodeEnum(procedureDataElements[7], AllowedTanFormat.values()), parseString(procedureDataElements[8]), parseInt(procedureDataElements[9]), + // for HITANS 4 and 5 here is another "Anzahl unterstützter aktiver TAN-Listen" Integer element parseBoolean(procedureDataElements[10]), parseCodeEnum(procedureDataElements[11], TanZeitUndDialogbezug.values()), + // for HITANS 4 and 5 here is another "TAN-Listennummer erforderlich" code element parseBoolean(procedureDataElements[12]), parseCodeEnum(procedureDataElements[13], SmsAbbuchungskontoErforderlich.values()), parseCodeEnum(procedureDataElements[14], AuftraggeberkontoErforderlich.values()), diff --git a/fints4javaLib/src/test/kotlin/net/dankito/fints/response/ResponseParserTest.kt b/fints4javaLib/src/test/kotlin/net/dankito/fints/response/ResponseParserTest.kt index 210694f6..095ae119 100644 --- a/fints4javaLib/src/test/kotlin/net/dankito/fints/response/ResponseParserTest.kt +++ b/fints4javaLib/src/test/kotlin/net/dankito/fints/response/ResponseParserTest.kt @@ -325,11 +325,39 @@ class ResponseParserTest : FinTsTestBase() { assertThat(segment.mixingAllowed).isFalse() assertThat(segment.securityProfiles).contains( - Sicherheitsprofil(Sicherheitsverfahren.RDH, VersionDesSicherheitsverfahrens.PIN_Ein_Schritt), - Sicherheitsprofil(Sicherheitsverfahren.RDH, VersionDesSicherheitsverfahrens.RAH_9), - Sicherheitsprofil(Sicherheitsverfahren.RDH, VersionDesSicherheitsverfahrens.RAH_10), - Sicherheitsprofil(Sicherheitsverfahren.DDV, VersionDesSicherheitsverfahrens.PIN_Ein_Schritt), - Sicherheitsprofil(Sicherheitsverfahren.PIN_TAN_Verfahren, VersionDesSicherheitsverfahrens.PIN_Ein_Schritt) + Sicherheitsprofil(Sicherheitsverfahren.RDH, VersionDesSicherheitsverfahrens.Version_1), + Sicherheitsprofil(Sicherheitsverfahren.RDH, VersionDesSicherheitsverfahrens.Version_9), + Sicherheitsprofil(Sicherheitsverfahren.RDH, VersionDesSicherheitsverfahrens.Version_10), + Sicherheitsprofil(Sicherheitsverfahren.DDV, VersionDesSicherheitsverfahrens.Version_1), + Sicherheitsprofil(Sicherheitsverfahren.PIN_TAN_Verfahren, VersionDesSicherheitsverfahrens.Version_1) + ) + } + ?: run { Assert.fail("No segment of type SecurityMethods found in ${result.receivedSegments}") } + } + + @Test + fun parseSecurityMethods_AllVersions() { + + // when + val result = underTest.parse("HISHV:7:3:3+N+RDH:1:3:5:7:9+RAH:2:4:6:8:10+PIN:1'") + + // then + assertSuccessfullyParsedSegment(result, InstituteSegmentId.SecurityMethods, 7, 3, 3) + + result.getFirstSegmentById(InstituteSegmentId.SecurityMethods)?.let { segment -> + assertThat(segment.mixingAllowed).isFalse() + + assertThat(segment.securityProfiles).contains( + Sicherheitsprofil(Sicherheitsverfahren.RDH, VersionDesSicherheitsverfahrens.Version_1), + Sicherheitsprofil(Sicherheitsverfahren.RDH, VersionDesSicherheitsverfahrens.Version_3), + Sicherheitsprofil(Sicherheitsverfahren.RDH, VersionDesSicherheitsverfahrens.Version_5), + Sicherheitsprofil(Sicherheitsverfahren.RDH, VersionDesSicherheitsverfahrens.Version_7), + Sicherheitsprofil(Sicherheitsverfahren.RDH, VersionDesSicherheitsverfahrens.Version_9), + Sicherheitsprofil(Sicherheitsverfahren.RSA_AES_Hybridverfahren, VersionDesSicherheitsverfahrens.Version_2), + Sicherheitsprofil(Sicherheitsverfahren.RSA_AES_Hybridverfahren, VersionDesSicherheitsverfahrens.Version_4), + Sicherheitsprofil(Sicherheitsverfahren.RSA_AES_Hybridverfahren, VersionDesSicherheitsverfahrens.Version_6), + Sicherheitsprofil(Sicherheitsverfahren.RSA_AES_Hybridverfahren, VersionDesSicherheitsverfahrens.Version_8), + Sicherheitsprofil(Sicherheitsverfahren.PIN_TAN_Verfahren, VersionDesSicherheitsverfahrens.Version_1) ) } ?: run { Assert.fail("No segment of type SecurityMethods found in ${result.receivedSegments}") }