commit 8528c342174ba5fad1ba82fdc79a3571f8f69198
parent 4eb4986ada887082aab2d4a64a7094b8ea2a66c0
Author: Antoine A <>
Date: Thu, 20 Mar 2025 19:53:03 +0100
bank: locked account status
Diffstat:
4 files changed, 18 insertions(+), 13 deletions(-)
diff --git a/bank/src/main/kotlin/tech/libeufin/bank/Constants.kt b/bank/src/main/kotlin/tech/libeufin/bank/Constants.kt
@@ -39,6 +39,6 @@ const val MAX_TOKEN_CREATION_ATTEMPTS: Int = 5
const val MAX_ACTIVE_CHALLENGES: Int = 5
// API version
-const val COREBANK_API_VERSION: String = "8:0:5"
+const val COREBANK_API_VERSION: String = "8:1:5"
const val CONVERSION_API_VERSION: String = "0:1:0"
const val INTEGRATION_API_VERSION: String = "5:0:5"
diff --git a/bank/src/main/kotlin/tech/libeufin/bank/TalerMessage.kt b/bank/src/main/kotlin/tech/libeufin/bank/TalerMessage.kt
@@ -57,6 +57,7 @@ enum class WithdrawalStatus {
enum class AccountStatus {
active,
+ locked,
deleted
}
diff --git a/bank/src/main/kotlin/tech/libeufin/bank/db/AccountDAO.kt b/bank/src/main/kotlin/tech/libeufin/bank/db/AccountDAO.kt
@@ -548,9 +548,9 @@ class AccountDAO(private val db: Database) {
,(min_cashout).frac AS min_cashout_frac
,is_public
,is_taler_exchange
- ,token_creation_counter
,CASE
WHEN deleted_at IS NOT NULL THEN 'deleted'
+ WHEN token_creation_counter > ? THEN 'locked'
ELSE 'active'
END as status
FROM customers
@@ -559,9 +559,11 @@ class AccountDAO(private val db: Database) {
WHERE username=?
"""
) {
- setString(1, username)
- oneOrNull {
+ setInt(1, MAX_TOKEN_CREATION_ATTEMPTS)
+ setString(2, username)
+ oneOrNull {
val name = it.getString("name")
+ val status: AccountStatus = it.getEnum("status")
AccountData(
name = name,
contact_data = ChallengeContactData(
@@ -584,8 +586,8 @@ class AccountDAO(private val db: Database) {
min_cashout = it.getOptAmount("min_cashout", db.bankCurrency),
is_public = it.getBoolean("is_public"),
is_taler_exchange = it.getBoolean("is_taler_exchange"),
- status = it.getEnum("status"),
- is_locked = it.getInt("token_creation_counter") >= MAX_TOKEN_CREATION_ATTEMPTS
+ status = status,
+ is_locked = status == AccountStatus.locked
)
}
}
@@ -656,9 +658,9 @@ class AccountDAO(private val db: Database) {
,is_taler_exchange
,internal_payto
,bank_account_id
- ,token_creation_counter
,CASE
WHEN deleted_at IS NOT NULL THEN 'deleted'
+ WHEN token_creation_counter > ? THEN 'locked'
ELSE 'active'
END as status
FROM bank_accounts JOIN customers
@@ -666,14 +668,16 @@ class AccountDAO(private val db: Database) {
WHERE ${if (params.usernameFilter != null) "name LIKE ? AND" else ""}
""",
{
+ setInt(1, MAX_TOKEN_CREATION_ATTEMPTS)
if (params.usernameFilter != null) {
- setString(1, params.usernameFilter)
- 1
+ setString(2, params.usernameFilter)
+ 2
} else {
- 0
+ 1
}
}
) {
+ val status: AccountStatus = it.getEnum("status")
AccountMinimalData(
username = it.getString("username"),
row_id = it.getLong("bank_account_id"),
@@ -691,8 +695,8 @@ class AccountDAO(private val db: Database) {
is_public = it.getBoolean("is_public"),
is_taler_exchange = it.getBoolean("is_taler_exchange"),
payto_uri = it.getBankPayto("internal_payto", "name", db.ctx),
- status = it.getEnum("status"),
- is_locked = it.getInt("token_creation_counter") >= MAX_TOKEN_CREATION_ATTEMPTS
+ status = status,
+ is_locked = status == AccountStatus.locked
)
}
}
\ No newline at end of file
diff --git a/bank/src/test/kotlin/CoreBankApiTest.kt b/bank/src/test/kotlin/CoreBankApiTest.kt
@@ -264,7 +264,7 @@ class CoreBankTokenApiTest {
}.assertChallenge().assertNoContent()
suspend fun blockAccount() {
- var counter = MAX_TOKEN_CREATION_ATTEMPTS
+ var counter = MAX_TOKEN_CREATION_ATTEMPTS + 1
while (counter > 0) {
val challenge = client.postPw("/accounts/merchant/token") {
json { "scope" to "readonly" }