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) {
|
||||
|
||||
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(
|
||||
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 ?
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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()),
|
||||
|
|
|
@ -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}") }
|
||||
|
|
Loading…
Reference in New Issue