diff options
Diffstat (limited to 'src/mint')
-rw-r--r-- | src/mint/mint_db.c | 198 | ||||
-rw-r--r-- | src/mint/mint_db.h | 44 | ||||
-rw-r--r-- | src/mint/taler-mint-httpd_db.c | 80 |
3 files changed, 21 insertions, 301 deletions
diff --git a/src/mint/mint_db.c b/src/mint/mint_db.c index a9595f2eb..c4d1ff743 100644 --- a/src/mint/mint_db.c +++ b/src/mint/mint_db.c @@ -581,98 +581,6 @@ TALER_MINT_DB_insert_refresh_order (PGconn *db_conn, int -TALER_MINT_DB_get_known_coin (PGconn *db_conn, - const struct GNUNET_CRYPTO_EcdsaPublicKey *coin_pub, - struct KnownCoin *known_coin) -{ - int res; - struct TALER_DB_QueryParam params[] = { - TALER_DB_QUERY_PARAM_PTR(coin_pub), - TALER_DB_QUERY_PARAM_END - }; - - PGresult *result = TALER_DB_exec_prepared (db_conn, "get_known_coin", params); - - if (PGRES_TUPLES_OK != PQresultStatus (result)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Query failed: %s\n", - PQresultErrorMessage (result)); - PQclear (result); - return GNUNET_SYSERR; - } - - if (0 == PQntuples (result)) - return GNUNET_NO; - - GNUNET_assert (1 == PQntuples (result)); - - /* extract basic information about the known coin */ - - { - struct TALER_DB_ResultSpec rs[] = { - TALER_DB_RESULT_SPEC("coin_pub", &known_coin->public_info.coin_pub), - TALER_DB_RESULT_SPEC("denom_pub", &known_coin->public_info.denom_pub), - TALER_DB_RESULT_SPEC("denom_sig", &known_coin->public_info.denom_sig), - TALER_DB_RESULT_SPEC_END - }; - - if (GNUNET_OK != (res = TALER_DB_extract_result (result, rs, 0))) - { - GNUNET_break (0); - PQclear (result); - return GNUNET_SYSERR; - } - } - - /* extract the expended amount of the coin */ - - if (GNUNET_OK != - TALER_DB_extract_amount (result, - 0, - "expended_value", - "expended_fraction", - "expended_currency", - &known_coin->expended_balance)) - { - GNUNET_break (0); - PQclear (result); - return GNUNET_SYSERR; - } - - /* extract the refresh session of the coin or mark it as missing */ - - { - struct TALER_DB_ResultSpec rs[] = { - TALER_DB_RESULT_SPEC("refresh_session_pub", &known_coin->refresh_session_pub), - TALER_DB_RESULT_SPEC_END - }; - - if (GNUNET_SYSERR == (res = TALER_DB_extract_result (result, rs, 0))) - { - GNUNET_break (0); - PQclear (result); - return GNUNET_SYSERR; - } - if (GNUNET_NO == res) - { - known_coin->is_refreshed = GNUNET_NO; - memset (&known_coin->refresh_session_pub, - 0, - sizeof (struct GNUNET_CRYPTO_EddsaPublicKey)); - } - else - { - known_coin->is_refreshed = GNUNET_YES; - } - } - - PQclear (result); - return GNUNET_YES; -} - - -int TALER_MINT_DB_set_commit_signature (PGconn *db_conn, const struct GNUNET_CRYPTO_EddsaPublicKey *session_pub, const struct GNUNET_CRYPTO_EddsaSignature *commit_sig) @@ -711,112 +619,6 @@ TALER_MINT_DB_set_reveal_ok (PGconn *db_conn, } -int -TALER_MINT_DB_update_known_coin (PGconn *db_conn, - const struct KnownCoin *known_coin) -{ - struct TALER_AmountNBO expended_nbo = TALER_amount_hton (known_coin->expended_balance); - struct TALER_DB_QueryParam params[] = { - TALER_DB_QUERY_PARAM_PTR(&known_coin->public_info.coin_pub), - TALER_DB_QUERY_PARAM_PTR(&known_coin->public_info.denom_pub), - TALER_DB_QUERY_PARAM_PTR(&known_coin->public_info.denom_sig), - TALER_DB_QUERY_PARAM_PTR(&expended_nbo.value), - TALER_DB_QUERY_PARAM_PTR(&expended_nbo.fraction), - TALER_DB_QUERY_PARAM_PTR_SIZED(expended_nbo.currency, strlen (expended_nbo.currency)), - TALER_DB_QUERY_PARAM_PTR(&known_coin->refresh_session_pub), - TALER_DB_QUERY_PARAM_END - }; - - if (GNUNET_NO == known_coin->is_refreshed) - { - // Mind the magic index! - params[6].data = NULL; - params[6].size = 0; - } - - PGresult *result = TALER_DB_exec_prepared (db_conn, "update_known_coin", params); - - if (PGRES_COMMAND_OK != PQresultStatus (result)) - { - break_db_err (result); - PQclear (result); - return GNUNET_SYSERR; - } - - if (0 != strcmp ("1", PQcmdTuples (result))) - { - PQclear (result); - // return 'no' here (don't fail) so that we can - // insert if update fails (=> "upsert") - return GNUNET_NO; - } - - PQclear (result); - return GNUNET_YES; -} - -int -TALER_MINT_DB_insert_known_coin (PGconn *db_conn, - const struct KnownCoin *known_coin) -{ - struct TALER_AmountNBO expended_nbo = TALER_amount_hton (known_coin->expended_balance); - struct TALER_DB_QueryParam params[] = { - TALER_DB_QUERY_PARAM_PTR(&known_coin->public_info.coin_pub), - TALER_DB_QUERY_PARAM_PTR(&known_coin->public_info.denom_pub), - TALER_DB_QUERY_PARAM_PTR(&known_coin->public_info.denom_sig), - TALER_DB_QUERY_PARAM_PTR(&expended_nbo.value), - TALER_DB_QUERY_PARAM_PTR(&expended_nbo.fraction), - TALER_DB_QUERY_PARAM_PTR_SIZED(&expended_nbo.currency, strlen (expended_nbo.currency)), - TALER_DB_QUERY_PARAM_PTR(&known_coin->refresh_session_pub), - TALER_DB_QUERY_PARAM_END - }; - - if (GNUNET_NO == known_coin->is_refreshed) - { - // Mind the magic index! - params[6].data = NULL; - params[6].size = 0; - } - - PGresult *result = TALER_DB_exec_prepared (db_conn, "insert_known_coin", params); - - if (PGRES_COMMAND_OK != PQresultStatus (result)) - { - break_db_err (result); - PQclear (result); - return GNUNET_SYSERR; - } - - if (0 != strcmp ("1", PQcmdTuples (result))) - { - PQclear (result); - // return 'no' here (don't fail) so that we can - // update if insert fails (=> "upsert") - return GNUNET_NO; - } - - PQclear (result); - return GNUNET_YES; -} - - -int -TALER_MINT_DB_upsert_known_coin (PGconn *db_conn, - struct KnownCoin *known_coin) -{ - int ret; - ret = TALER_MINT_DB_update_known_coin (db_conn, known_coin); - if (GNUNET_SYSERR == ret) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } - if (GNUNET_YES == ret) - return GNUNET_YES; - return TALER_MINT_DB_insert_known_coin (db_conn, known_coin); -} - - struct GNUNET_CRYPTO_rsa_PublicKey * TALER_MINT_DB_get_refresh_order (PGconn *db_conn, uint16_t newcoin_index, diff --git a/src/mint/mint_db.h b/src/mint/mint_db.h index ae3f69efb..5762656d0 100644 --- a/src/mint/mint_db.h +++ b/src/mint/mint_db.h @@ -44,50 +44,6 @@ TALER_MINT_DB_insert_refresh_order (PGconn *db_conn, - - - -/** - * FIXME - */ -struct KnownCoin -{ - struct TALER_CoinPublicInfo public_info; - - /** - * Refreshing session, only valid if - * is_refreshed==1. - */ - struct GNUNET_CRYPTO_EddsaPublicKey refresh_session_pub; - - struct TALER_Amount expended_balance; - - int is_refreshed; - -}; - - -int -TALER_MINT_DB_get_known_coin (PGconn *db_conn, - const struct GNUNET_CRYPTO_EcdsaPublicKey *coin_pub, - struct KnownCoin *known_coin); - -// FIXME: what does 'upsert' even mean!? -int -TALER_MINT_DB_upsert_known_coin (PGconn *db_conn, - struct KnownCoin *known_coin); - - -int -TALER_MINT_DB_insert_known_coin (PGconn *db_conn, - const struct KnownCoin *known_coin); - - - - - - - struct GNUNET_CRYPTO_rsa_PublicKey * TALER_MINT_DB_get_refresh_order (PGconn *db_conn, uint16_t newcoin_index, diff --git a/src/mint/taler-mint-httpd_db.c b/src/mint/taler-mint-httpd_db.c index 8ddb17ab7..0da207747 100644 --- a/src/mint/taler-mint-httpd_db.c +++ b/src/mint/taler-mint-httpd_db.c @@ -33,10 +33,9 @@ * + check for leaks * + check low-level API * - /refresh/link: - * + properly check all conditions and handle errors - * + properly check transaction logic - * + check for leaks * + check low-level API + * + separate DB logic from response generation + * + check for leaks */ #include "platform.h" #include <pthread.h> @@ -475,7 +474,7 @@ refresh_accept_denoms (struct MHD_Connection *connection, * @param session_pub the refresh session's public key * @param coin_count number of coins in @a coin_public_infos to melt * @param coin_public_infos the coins to melt - * @param r_melt_balance FIXME + * @param r_melt_balance[OUT] FIXME (#3636: check earlier, pass expected value IN, not OUT!) * @return #GNUNET_OK on success, * #GNUNET_NO if an error message was generated, * #GNUNET_SYSERR on internal errors (no response generated) @@ -490,68 +489,34 @@ refresh_accept_melts (struct MHD_Connection *connection, struct TALER_Amount *r_melt_balance) { size_t i; - int res; memset (r_melt_balance, 0, sizeof (struct TALER_Amount)); for (i = 0; i < coin_count; i++) { struct TALER_MINT_DenomKeyIssue *dki; - struct KnownCoin known_coin; + struct TALER_MINT_DB_TransactionList *tl; // money the customer gets by melting the current coin struct TALER_Amount coin_gain; struct RefreshMelt melt; - dki = &(TALER_MINT_get_denom_key (key_state, - coin_public_infos[i].denom_pub)->issue); + dki = &TALER_MINT_get_denom_key (key_state, + coin_public_infos[i].denom_pub)->issue; if (NULL == dki) return (MHD_YES == TALER_MINT_reply_json_pack (connection, MHD_HTTP_NOT_FOUND, "{s:s}", - "error", "denom not found")) + "error", + "denom not found")) ? GNUNET_NO : GNUNET_SYSERR; - - res = TALER_MINT_DB_get_known_coin (db_conn, - &coin_public_infos[i].coin_pub, - &known_coin); - - if (GNUNET_SYSERR == res) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } - - if (GNUNET_YES == res) - { - if (GNUNET_YES == known_coin.is_refreshed) - return (MHD_YES == - TALER_MINT_reply_json_pack (connection, - MHD_HTTP_NOT_FOUND, - "{s:s}", - "error", - "coin already refreshed")) - ? GNUNET_NO : GNUNET_SYSERR; - } - else - { - known_coin.expended_balance = mint_amount_native_zero (); - known_coin.public_info = coin_public_infos[i]; - } - - known_coin.is_refreshed = GNUNET_YES; - known_coin.refresh_session_pub = *session_pub; - - if (GNUNET_OK != TALER_MINT_DB_upsert_known_coin (db_conn, &known_coin)) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } - - // FIXME: test first if coin was already melted - // in this session, etc. + coin_gain = TALER_amount_ntoh (dki->value); + tl = TALER_MINT_DB_get_coin_transactions (db_conn, + &coin_public_infos[i].coin_pub); + /* FIXME: compute how much value is left with this coin! */ + TALER_MINT_DB_free_coin_transaction_list (tl); melt.coin = coin_public_infos[i]; melt.session_pub = *session_pub; @@ -566,22 +531,22 @@ refresh_accept_melts (struct MHD_Connection *connection, return GNUNET_SYSERR; } - coin_gain = TALER_amount_ntoh (dki->value); - coin_gain = TALER_amount_subtract (coin_gain, known_coin.expended_balance); /* Refuse to refresh when the coin does not have enough money left to * pay the refreshing fees of the coin. */ - if (TALER_amount_cmp (coin_gain, TALER_amount_ntoh (dki->fee_refresh)) < 0) + if (TALER_amount_cmp (coin_gain, + TALER_amount_ntoh (dki->fee_refresh)) < 0) return (MHD_YES == TALER_MINT_reply_json_pack (connection, MHD_HTTP_NOT_FOUND, "{s:s}", "error", "depleted")) ? GNUNET_NO : GNUNET_SYSERR; - coin_gain = TALER_amount_subtract (coin_gain, TALER_amount_ntoh (dki->fee_refresh)); - - *r_melt_balance = TALER_amount_add (*r_melt_balance, coin_gain); + coin_gain = TALER_amount_subtract (coin_gain, + TALER_amount_ntoh (dki->fee_refresh)); + *r_melt_balance = TALER_amount_add (*r_melt_balance, + coin_gain); } return GNUNET_OK; } @@ -647,8 +612,6 @@ TALER_MINT_db_execute_refresh_melt (struct MHD_Connection *connection, return TALER_MINT_reply_internal_db_error (connection); } - - session.melt_sig = *client_signature; session.num_oldcoins = coin_count; session.num_newcoins = num_new_denoms; @@ -1284,8 +1247,7 @@ TALER_MINT_db_execute_refresh_link (struct MHD_Connection *connection, if (GNUNET_SYSERR == res) { GNUNET_break (0); - // FIXME: return error code! - return MHD_NO; + return TALER_MINT_reply_internal_db_error (connection); } if (GNUNET_NO == res) { @@ -1308,7 +1270,7 @@ TALER_MINT_db_execute_refresh_link (struct MHD_Connection *connection, if (GNUNET_SYSERR == res) { GNUNET_break (0); - // FIXME: return error code! + // FIXME: return error code! return MHD_NO; } if (GNUNET_NO == res) |