commit 0376eecc51832a2413acbdb122eaa4175ecf0382
parent ed7416917e4094eb66d3829acf7fe8a9878d9c54
Author: ms <ms@taler.net>
Date: Mon, 9 Aug 2021 20:58:07 +0200
Fix number parsing.
Sanity-checking input (number-)strings with RegEx.
Diffstat:
4 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/server/NexusServer.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/server/NexusServer.kt
@@ -19,6 +19,7 @@
package tech.libeufin.nexus.server
+import UtilError
import com.fasterxml.jackson.core.util.DefaultIndenter
import com.fasterxml.jackson.core.util.DefaultPrettyPrinter
import com.fasterxml.jackson.databind.JsonNode
@@ -196,6 +197,17 @@ fun serverMain(host: String, port: Int) {
)
)
}
+ exception<UtilError> { cause ->
+ logger.error("Exception while handling '${call.request.uri}'", cause)
+ call.respond(
+ cause.statusCode,
+ message = ErrorResponse(
+ code = cause.ec?.code ?: TalerErrorCode.TALER_EC_NONE.code,
+ hint = "see detail",
+ detail = cause.reason,
+ )
+ )
+ }
exception<EbicsProtocolError> { cause ->
logger.error("Caught exception while handling '${call.request.uri}' (${cause.reason})")
call.respond(
diff --git a/util/src/main/kotlin/Errors.kt b/util/src/main/kotlin/Errors.kt
@@ -1,4 +1,5 @@
import io.ktor.http.*
+import tech.libeufin.util.TalerErrorCode
import kotlin.system.exitProcess
/*
@@ -20,7 +21,11 @@ import kotlin.system.exitProcess
* <http://www.gnu.org/licenses/>
*/
-data class UtilError(val statusCode: HttpStatusCode, val reason: String) :
+data class UtilError(
+ val statusCode: HttpStatusCode,
+ val reason: String,
+ val ec: TalerErrorCode?
+) :
Exception("$reason (HTTP status $statusCode)")
/**
diff --git a/util/src/main/kotlin/amounts.kt b/util/src/main/kotlin/amounts.kt
@@ -1,6 +1,8 @@
import io.ktor.http.*
+import tech.libeufin.util.Amount
import tech.libeufin.util.AmountWithCurrency
import tech.libeufin.util.EbicsProtocolError
+import java.math.BigDecimal
/*
* This file is part of LibEuFin.
diff --git a/util/src/main/kotlin/strings.kt b/util/src/main/kotlin/strings.kt
@@ -21,6 +21,7 @@ package tech.libeufin.util
import UtilError
import io.ktor.http.HttpStatusCode
+import validatePlainAmount
import java.math.BigInteger
import java.math.BigDecimal
import java.util.*
@@ -104,10 +105,20 @@ data class AmountWithCurrency(
)
fun parseDecimal(decimalStr: String): BigDecimal {
+ if(!validatePlainAmount(decimalStr))
+ throw UtilError(
+ HttpStatusCode.BadRequest,
+ "Bad string amount given: $decimalStr",
+ TalerErrorCode.TALER_EC_GENERIC_PARAMETER_MALFORMED
+ )
return try {
BigDecimal(decimalStr)
} catch (e: NumberFormatException) {
- throw UtilError(HttpStatusCode.BadRequest, "Bad string amount given: $decimalStr")
+ throw UtilError(
+ HttpStatusCode.BadRequest,
+ "Bad string amount given: $decimalStr",
+ TalerErrorCode.TALER_EC_GENERIC_PARAMETER_MALFORMED
+ )
}
}