merchant

Merchant backend to process payments, run by merchants
Log | Files | Refs | Submodules | README | LICENSE

commit 6b4ca8adb3bab9fc0e61e094999d6a29620801a3
parent a2f6a0ab24e8b4eec6169fc0478f503cff425e6f
Author: Christian Grothoff <christian@grothoff.org>
Date:   Sat, 16 Aug 2025 15:19:04 +0200

-fix test failures (#9434)

Diffstat:
Msrc/backend/taler-merchant-httpd_post-orders-ID-pay.c | 58+++++++++++++++++++++++++++++++++++++++++++++++-----------
Msrc/backenddb/pg_insert_spent_token.c | 5++++-
Msrc/backenddb/pg_insert_spent_token.sql | 2+-
Msrc/backenddb/pg_insert_token_family_key.c | 22++++++++++++++++++++--
4 files changed, 72 insertions(+), 15 deletions(-)

diff --git a/src/backend/taler-merchant-httpd_post-orders-ID-pay.c b/src/backend/taler-merchant-httpd_post-orders-ID-pay.c @@ -2960,6 +2960,7 @@ find_valid_input_tokens ( unsigned int num_validated = 0; struct GNUNET_TIME_Timestamp now = GNUNET_TIME_timestamp_get (); + const struct TALER_MERCHANT_ContractTokenFamilyKey *kig = NULL; for (unsigned int j = 0; j < expected_num; j++) { @@ -2972,28 +2973,63 @@ find_valid_input_tokens ( const struct TALER_MERCHANT_ContractTokenFamilyKey *ki = &family->keys[i]; - if (GNUNET_TIME_timestamp_cmp (ki->valid_after, - >=, - now) || - GNUNET_TIME_timestamp_cmp (ki->valid_before, - <, - now)) - { - continue; /* ki currently not valid */ - } if (0 == GNUNET_memcmp (&ki->pub.public_key->pub_key_hash, &tuc->h_issue.hash)) { + if (GNUNET_TIME_timestamp_cmp (ki->valid_after, + >, + now) || + GNUNET_TIME_timestamp_cmp (ki->valid_before, + <=, + now)) + { + /* We have a match, but not in the current validity period */ + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "Public key %s currently not valid\n", + GNUNET_h2s (&ki->pub.public_key->pub_key_hash)); + kig = ki; + continue; + } key = ki; break; } } if (NULL == key) { + if (NULL != kig) + { + char start_str[128]; + char end_str[128]; + char emsg[350]; + + GNUNET_snprintf (start_str, + sizeof (start_str), + "%s", + GNUNET_STRINGS_timestamp_to_string (kig->valid_after)); + GNUNET_snprintf (end_str, + sizeof (end_str), + "%s", + GNUNET_STRINGS_timestamp_to_string (kig->valid_before)) + ; + /* FIXME: use more specific EC */ + GNUNET_snprintf (emsg, + sizeof (emsg), + "Token is only valid from %s to %s", + start_str, + end_str); + pay_end (pc, + TALER_MHD_reply_with_error ( + pc->connection, + MHD_HTTP_GONE, + TALER_EC_MERCHANT_POST_ORDERS_ID_PAY_OFFER_EXPIRED, + emsg)); + return GNUNET_NO; + } GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "Input token supplied for public key that is not acceptable\n"); - GNUNET_break (0); + "Input token supplied for public key %s that is not acceptable\n", + GNUNET_h2s (&tuc->h_issue.hash)); + GNUNET_break_op (0); pay_end (pc, TALER_MHD_reply_with_error ( pc->connection, diff --git a/src/backenddb/pg_insert_spent_token.c b/src/backenddb/pg_insert_spent_token.c @@ -37,8 +37,8 @@ TMH_PG_insert_spent_token ( { struct PostgresClosure *pg = cls; struct GNUNET_PQ_QueryParam params[] = { - GNUNET_PQ_query_param_auto_from_type (h_issue_pub), GNUNET_PQ_query_param_auto_from_type (h_contract_terms), + GNUNET_PQ_query_param_auto_from_type (h_issue_pub), GNUNET_PQ_query_param_auto_from_type (use_pub), GNUNET_PQ_query_param_auto_from_type (use_sig), GNUNET_PQ_query_param_unblinded_sig (issue_sig->signature), @@ -56,6 +56,9 @@ TMH_PG_insert_spent_token ( enum GNUNET_DB_QueryStatus qs; check_connection (pg); + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Storing token spent with key %s\n", + GNUNET_h2s (&h_issue_pub->hash)); PREPARE (pg, "spent_token_insert", "SELECT" diff --git a/src/backenddb/pg_insert_spent_token.sql b/src/backenddb/pg_insert_spent_token.sql @@ -71,7 +71,7 @@ END IF; out_existed = FALSE; UPDATE merchant_token_families - SET redeemed=redeemed+1 + SET used=used+1 WHERE token_family_serial=my_tf_serial; END $$; diff --git a/src/backenddb/pg_insert_token_family_key.c b/src/backenddb/pg_insert_token_family_key.c @@ -43,6 +43,8 @@ TMH_PG_insert_token_family_key ( struct GNUNET_TIME_Timestamp now = GNUNET_TIME_timestamp_get (); const char *cipher = NULL; + +#if DEBUG struct GNUNET_HashCode pub_hash; switch (pub->public_key->cipher) @@ -64,11 +66,27 @@ TMH_PG_insert_token_family_key ( GNUNET_break (0); return GNUNET_DB_STATUS_HARD_ERROR; } - GNUNET_assert (pub->public_key->cipher == - priv->private_key->cipher); GNUNET_assert (0 == GNUNET_memcmp (&pub_hash, &pub->public_key->pub_key_hash)); +#endif + switch (pub->public_key->cipher) + { + case GNUNET_CRYPTO_BSA_RSA: + cipher = "rsa"; + break; + case GNUNET_CRYPTO_BSA_CS: + cipher = "cs"; + break; + case GNUNET_CRYPTO_BSA_INVALID: + GNUNET_break (0); + return GNUNET_DB_STATUS_HARD_ERROR; + } + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Storing token public key with hash %s\n", + GNUNET_h2s (&pub->public_key->pub_key_hash)); + GNUNET_assert (pub->public_key->cipher == + priv->private_key->cipher); GNUNET_assert (! GNUNET_TIME_absolute_is_zero ( valid_after.abs_time)); GNUNET_assert (! GNUNET_TIME_absolute_is_zero (