Implemented parsing all Security Method versions
This commit is contained in:
parent
4b657bf1b9
commit
f3abeeaa5f
|
@ -3,14 +3,24 @@ package net.dankito.fints.messages.datenelemente.implementierte.signatur
|
||||||
|
|
||||||
enum class VersionDesSicherheitsverfahrens(val methodNumber: Int) {
|
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)
|
||||||
|
|
||||||
}
|
}
|
|
@ -36,7 +36,7 @@ open class Signaturkopf(
|
||||||
|
|
||||||
) : Segment(listOf(
|
) : Segment(listOf(
|
||||||
Segmentkopf(MessageSegmentId.SignatureHeader, 4, segmentNumber), // allowed
|
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),
|
SicherheitsfunktionKodiert(customer.selectedTanProcedure.securityFunction),
|
||||||
Sicherheitskontrollreferenz(securityControlReference), // allowed: <>0
|
Sicherheitskontrollreferenz(securityControlReference), // allowed: <>0
|
||||||
BereichDerSicherheitsapplikationKodiert(BereichDerSicherheitsapplikation.SignaturkopfUndHBCINutzdaten), // allowed: 1 ?
|
BereichDerSicherheitsapplikationKodiert(BereichDerSicherheitsapplikation.SignaturkopfUndHBCINutzdaten), // allowed: 1 ?
|
||||||
|
|
|
@ -45,7 +45,7 @@ open class Verschluesselungskopf(
|
||||||
|
|
||||||
) : Segment(listOf(
|
) : Segment(listOf(
|
||||||
Segmentkopf(MessageSegmentId.EncryptionHeader, 3, 998),
|
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),
|
SicherheitsfunktionKodiert(Sicherheitsfunktion.Klartext),
|
||||||
RolleDesSicherheitslieferantenKodiert(), // allowed: 1, 4
|
RolleDesSicherheitslieferantenKodiert(), // allowed: 1, 4
|
||||||
SicherheitsidentifikationDetails(customer.customerSystemId),
|
SicherheitsidentifikationDetails(customer.customerSystemId),
|
||||||
|
|
|
@ -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)
|
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]))
|
return TanInfo(jobParameters, parseTwoStepTanProcedureParameters(dataElementGroups[4]))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -355,8 +359,10 @@ open class ResponseParser @JvmOverloads constructor(
|
||||||
parseCodeEnum(procedureDataElements[7], AllowedTanFormat.values()),
|
parseCodeEnum(procedureDataElements[7], AllowedTanFormat.values()),
|
||||||
parseString(procedureDataElements[8]),
|
parseString(procedureDataElements[8]),
|
||||||
parseInt(procedureDataElements[9]),
|
parseInt(procedureDataElements[9]),
|
||||||
|
// for HITANS 4 and 5 here is another "Anzahl unterstützter aktiver TAN-Listen" Integer element
|
||||||
parseBoolean(procedureDataElements[10]),
|
parseBoolean(procedureDataElements[10]),
|
||||||
parseCodeEnum(procedureDataElements[11], TanZeitUndDialogbezug.values()),
|
parseCodeEnum(procedureDataElements[11], TanZeitUndDialogbezug.values()),
|
||||||
|
// for HITANS 4 and 5 here is another "TAN-Listennummer erforderlich" code element
|
||||||
parseBoolean(procedureDataElements[12]),
|
parseBoolean(procedureDataElements[12]),
|
||||||
parseCodeEnum(procedureDataElements[13], SmsAbbuchungskontoErforderlich.values()),
|
parseCodeEnum(procedureDataElements[13], SmsAbbuchungskontoErforderlich.values()),
|
||||||
parseCodeEnum(procedureDataElements[14], AuftraggeberkontoErforderlich.values()),
|
parseCodeEnum(procedureDataElements[14], AuftraggeberkontoErforderlich.values()),
|
||||||
|
|
|
@ -325,11 +325,39 @@ class ResponseParserTest : FinTsTestBase() {
|
||||||
assertThat(segment.mixingAllowed).isFalse()
|
assertThat(segment.mixingAllowed).isFalse()
|
||||||
|
|
||||||
assertThat(segment.securityProfiles).contains(
|
assertThat(segment.securityProfiles).contains(
|
||||||
Sicherheitsprofil(Sicherheitsverfahren.RDH, VersionDesSicherheitsverfahrens.PIN_Ein_Schritt),
|
Sicherheitsprofil(Sicherheitsverfahren.RDH, VersionDesSicherheitsverfahrens.Version_1),
|
||||||
Sicherheitsprofil(Sicherheitsverfahren.RDH, VersionDesSicherheitsverfahrens.RAH_9),
|
Sicherheitsprofil(Sicherheitsverfahren.RDH, VersionDesSicherheitsverfahrens.Version_9),
|
||||||
Sicherheitsprofil(Sicherheitsverfahren.RDH, VersionDesSicherheitsverfahrens.RAH_10),
|
Sicherheitsprofil(Sicherheitsverfahren.RDH, VersionDesSicherheitsverfahrens.Version_10),
|
||||||
Sicherheitsprofil(Sicherheitsverfahren.DDV, VersionDesSicherheitsverfahrens.PIN_Ein_Schritt),
|
Sicherheitsprofil(Sicherheitsverfahren.DDV, VersionDesSicherheitsverfahrens.Version_1),
|
||||||
Sicherheitsprofil(Sicherheitsverfahren.PIN_TAN_Verfahren, VersionDesSicherheitsverfahrens.PIN_Ein_Schritt)
|
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}") }
|
?: run { Assert.fail("No segment of type SecurityMethods found in ${result.receivedSegments}") }
|
||||||
|
|
Loading…
Reference in New Issue