Implemented parsing all Security Method versions

This commit is contained in:
dankito 2020-04-29 02:04:15 +02:00
parent 4b657bf1b9
commit f3abeeaa5f
5 changed files with 57 additions and 13 deletions

View File

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

View File

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

View File

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

View File

@ -303,9 +303,13 @@ open class ResponseParser @JvmOverloads constructor(
}
protected open fun parseTanInfo(segment: String, segmentId: String, dataElementGroups: List<String>): TanInfo {
protected open fun parseTanInfo(segment: String, segmentId: String, dataElementGroups: List<String>): 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()),

View File

@ -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<SecurityMethods>(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}") }