Implemented masking data elements' values (required for SEPA descriptor URNs)
This commit is contained in:
parent
9b2e4100f3
commit
af0e4e923b
|
@ -1,8 +1,28 @@
|
||||||
package net.dankito.fints.messages
|
package net.dankito.fints.messages
|
||||||
|
|
||||||
|
import net.dankito.fints.util.MessageUtils
|
||||||
|
|
||||||
abstract class Nachrichtenteil {
|
|
||||||
|
abstract class Nachrichtenteil(protected val messageUtils: MessageUtils = MessageUtils()) {
|
||||||
|
|
||||||
abstract fun format(): String
|
abstract fun format(): String
|
||||||
|
|
||||||
|
|
||||||
|
open fun maskMessagePart(messagePart: String, separator: String): String {
|
||||||
|
|
||||||
|
var maskedMessagePart = messagePart
|
||||||
|
val binaryDataRanges = messageUtils.findBinaryDataRanges(messagePart)
|
||||||
|
|
||||||
|
val unmaskedMaskingCharacterIndices = messageUtils.findSeparatorIndices(maskedMessagePart, Separators.MaskingCharacter, binaryDataRanges)
|
||||||
|
.filter { messageUtils.doesNotMaskSeparatorOrMaskingCharacter(it, maskedMessagePart) }
|
||||||
|
|
||||||
|
maskedMessagePart = messageUtils
|
||||||
|
.maskCharacterAtIndices(maskedMessagePart, Separators.MaskingCharacter, unmaskedMaskingCharacterIndices)
|
||||||
|
|
||||||
|
|
||||||
|
val separatorIndices = messageUtils.findSeparatorIndices(maskedMessagePart, separator, binaryDataRanges)
|
||||||
|
|
||||||
|
return messageUtils.maskCharacterAtIndices(maskedMessagePart, separator, separatorIndices)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -11,6 +11,10 @@ class Separators {
|
||||||
const val DataElementsSeparator = ":"
|
const val DataElementsSeparator = ":"
|
||||||
|
|
||||||
const val MaskingCharacter = "?"
|
const val MaskingCharacter = "?"
|
||||||
|
|
||||||
|
val AllSeparators = listOf(DataElementsSeparator, DataElementGroupsSeparator, SegmentSeparator)
|
||||||
|
|
||||||
|
val AllSeparatorsAndMaskingCharacter = listOf(*AllSeparators.toTypedArray(), MaskingCharacter)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -2,6 +2,7 @@ package net.dankito.fints.messages.datenelemente.basisformate
|
||||||
|
|
||||||
import net.dankito.fints.messages.Existenzstatus
|
import net.dankito.fints.messages.Existenzstatus
|
||||||
import net.dankito.fints.messages.HbciCharset
|
import net.dankito.fints.messages.HbciCharset
|
||||||
|
import net.dankito.fints.messages.Separators
|
||||||
import net.dankito.fints.messages.datenelemente.Datenelement
|
import net.dankito.fints.messages.datenelemente.Datenelement
|
||||||
|
|
||||||
|
|
||||||
|
@ -24,7 +25,7 @@ abstract class TextDatenelement(val value: String?, existenzstatus: Existenzstat
|
||||||
}
|
}
|
||||||
|
|
||||||
protected open fun formatValue(value: String): String {
|
protected open fun formatValue(value: String): String {
|
||||||
return value // may overwritten in sub classes
|
return maskMessagePart(value, Separators.DataElementsSeparator) // may overwritten in sub classes
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,16 @@ open class MessageUtils {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open fun doesNotMaskSeparatorOrMaskingCharacter(maskingCharacterIndex: Int, messagePart: String): Boolean {
|
||||||
|
if (maskingCharacterIndex < messagePart.length - 1) {
|
||||||
|
val nextCharacter = messagePart[maskingCharacterIndex + 1]
|
||||||
|
|
||||||
|
return Separators.AllSeparatorsAndMaskingCharacter.contains(nextCharacter.toString()) == false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
open fun isInRange(index: Int, ranges: List<IntRange>): Boolean {
|
open fun isInRange(index: Int, ranges: List<IntRange>): Boolean {
|
||||||
for (range in ranges) {
|
for (range in ranges) {
|
||||||
if (range.contains(index)) {
|
if (range.contains(index)) {
|
||||||
|
@ -73,4 +83,15 @@ open class MessageUtils {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open fun maskCharacterAtIndices(unmaskedString: String, unmaskedCharacter: String, indices: List<Int>): String {
|
||||||
|
var maskedString = unmaskedString
|
||||||
|
|
||||||
|
indices.sortedDescending().forEach { index ->
|
||||||
|
maskedString = maskedString.replaceRange(index, index + 1, Separators.MaskingCharacter + unmaskedCharacter
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return maskedString
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue