nicer generic error reporting logic, for #6432

This commit is contained in:
Christian Grothoff 2020-08-25 15:11:56 +02:00
parent ce266ce8f2
commit 4bba726356
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
23 changed files with 258 additions and 235 deletions

@ -1 +1 @@
Subproject commit bc9def4616494c85af54418bb11193c42f087634
Subproject commit 4c0be7d53a083926c2dcc8e3781d650243466e89

View File

@ -86,7 +86,7 @@ verify_and_execute_deposit_confirmation (
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_FORBIDDEN,
TALER_EC_DEPOSIT_CONFIRMATION_SIGNATURE_INVALID,
"master_sig (expired)");
"master signature expired");
}
/* check our cache */
@ -105,7 +105,7 @@ verify_and_execute_deposit_confirmation (
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_DB_SETUP_FAILED,
"failed to establish session with database");
NULL);
}
if (! cached)
{
@ -120,7 +120,7 @@ verify_and_execute_deposit_confirmation (
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_FORBIDDEN,
TALER_EC_DEPOSIT_CONFIRMATION_SIGNATURE_INVALID,
"master_sig");
"master signature invalid");
}
/* execute transaction */
@ -134,7 +134,7 @@ verify_and_execute_deposit_confirmation (
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_AUDITOR_EXCHANGE_STORE_DB_ERROR,
"failed to persist exchange signing key");
NULL);
}
/* Cache it, due to concurreny it might already be in the cache,
@ -174,7 +174,7 @@ verify_and_execute_deposit_confirmation (
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_FORBIDDEN,
TALER_EC_DEPOSIT_CONFIRMATION_SIGNATURE_INVALID,
"exchange_sig");
"exchange signature invalid");
}
}
@ -189,7 +189,7 @@ verify_and_execute_deposit_confirmation (
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_DEPOSIT_CONFIRMATION_STORE_DB_ERROR,
"failed to persist deposit-confirmation data");
NULL);
}
return TALER_MHD_reply_json_pack (connection,
MHD_HTTP_OK,

View File

@ -90,7 +90,7 @@ TAH_EXCHANGES_handler (struct TAH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_DB_SETUP_FAILED,
"failed to establish session with database");
NULL);
}
ja = json_array ();
GNUNET_break (NULL != ja);
@ -106,7 +106,7 @@ TAH_EXCHANGES_handler (struct TAH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_LIST_EXCHANGES_DB_ERROR,
"Could not fetch exchange list from database");
NULL);
}
return TALER_MHD_reply_json_pack (connection,
MHD_HTTP_OK,

View File

@ -760,14 +760,19 @@ handle_transfer (struct TALER_FAKEBANK_Handle *h,
&row_id);
if (GNUNET_OK != ret)
{
MHD_RESULT res;
char *uids;
GNUNET_break (0);
uids = GNUNET_STRINGS_data_to_string_alloc (&uuid,
sizeof (uuid));
json_decref (json);
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_CONFLICT,
TALER_EC_BANK_TRANSFER_REQUEST_UID_REUSED,
"transfer request UID was reused");
res = TALER_MHD_reply_with_error (connection,
MHD_HTTP_CONFLICT,
TALER_EC_BANK_TRANSFER_REQUEST_UID_REUSED,
uids);
GNUNET_free (uids);
return res;
}
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"Receiving incoming wire transfer: %s->%s, subject: %s, amount: %s, from %s\n",

View File

@ -236,7 +236,7 @@ handle_post_coins (const struct TEH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_COINS_INVALID_COIN_PUB,
"coin public key malformed");
args[0]);
}
for (unsigned int i = 0; NULL != h[i].op; i++)
if (0 == strcmp (h[i].op,
@ -247,7 +247,7 @@ handle_post_coins (const struct TEH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_NOT_FOUND,
TALER_EC_OPERATION_UNKNOWN,
"requested operation on coin unknown");
args[1]);
}
@ -331,7 +331,7 @@ proceed_with_handler (const struct TEH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_URI_TOO_LONG,
TALER_EC_URI_TOO_LONG,
"The URI given is too long");
url);
}
/* All POST endpoints come with a body in JSON format. So we parse
@ -745,7 +745,7 @@ handle_mhd_request (void *cls,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_METHOD_NOT_ALLOWED,
TALER_EC_METHOD_INVALID,
"The HTTP method used is invalid for this URL");
method);
}
}
@ -756,7 +756,7 @@ handle_mhd_request (void *cls,
ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_NOT_FOUND,
TALER_EC_ENDPOINT_UNKNOWN,
"No handler found for the given URL");
url);
GNUNET_async_scope_restore (&old_scope);
return ret;
}

View File

@ -74,7 +74,7 @@ TEH_make_coin_known (const struct TALER_CoinPublicInfo *coin,
= TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_DB_COIN_HISTORY_STORE_ERROR,
"could not persist coin data");
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
case TALER_EXCHANGEDB_CKS_CONFLICT:
break;
@ -96,7 +96,7 @@ TEH_make_coin_known (const struct TALER_CoinPublicInfo *coin,
connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_DEPOSIT_HISTORY_DB_ERROR,
"could not fetch coin transaction history");
NULL);
return qs;
}
*mhd_ret
@ -146,7 +146,7 @@ TEH_DB_run_transaction (struct MHD_Connection *connection,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_DB_SETUP_FAILED,
"could not establish database session");
NULL);
return GNUNET_SYSERR;
}
for (unsigned int retries = 0;
@ -165,7 +165,7 @@ TEH_DB_run_transaction (struct MHD_Connection *connection,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_DB_START_FAILED,
"could not begin transaction");
NULL);
return GNUNET_SYSERR;
}
qs = cb (cb_cls,
@ -186,7 +186,7 @@ TEH_DB_run_transaction (struct MHD_Connection *connection,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_DB_COMMIT_FAILED_HARD,
"could not commit database transaction");
NULL);
return GNUNET_SYSERR;
}
/* make sure callback did not violate invariants! */
@ -202,7 +202,7 @@ TEH_DB_run_transaction (struct MHD_Connection *connection,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_DB_COMMIT_FAILED_ON_RETRY,
"repatedly failed to serialize database transaction");
NULL);
return GNUNET_SYSERR;
}

View File

@ -161,7 +161,7 @@ deposit_precheck (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_DEPOSIT_HISTORY_DB_ERROR,
"Could not check for existing identical deposit");
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
}
return qs;
@ -255,7 +255,7 @@ deposit_transaction (void *cls,
connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_DEPOSIT_HISTORY_DB_ERROR,
"could not fetch coin transaction history");
NULL);
return qs;
}
if (GNUNET_OK !=
@ -269,7 +269,7 @@ deposit_transaction (void *cls,
connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_DEPOSIT_HISTORY_DB_ERROR,
"could not calculate historic coin amount total");
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
}
/* Check that cost of all transactions (including the current one) is
@ -301,7 +301,7 @@ deposit_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_DEPOSIT_STORE_DB_ERROR,
"Could not persist /deposit data");
NULL);
}
return qs;
}
@ -382,7 +382,7 @@ TEH_handler_deposit (struct MHD_Connection *connection,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_DEPOSIT_REFUND_DEADLINE_AFTER_WIRE_DEADLINE,
"refund_deadline");
NULL);
}
if (GNUNET_OK !=
TALER_JSON_merchant_wire_signature_hash (wire,
@ -394,7 +394,7 @@ TEH_handler_deposit (struct MHD_Connection *connection,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_DEPOSIT_INVALID_WIRE_FORMAT_JSON,
"wire");
NULL);
}
if (0 != GNUNET_memcmp (&deposit.h_wire,
&my_h_wire))
@ -404,7 +404,7 @@ TEH_handler_deposit (struct MHD_Connection *connection,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_DEPOSIT_INVALID_WIRE_FORMAT_CONTRACT_HASH_CONFLICT,
"h_wire");
NULL);
}
/* Check for idempotency: did we get this request before? */
@ -457,7 +457,7 @@ TEH_handler_deposit (struct MHD_Connection *connection,
return TALER_MHD_reply_with_error (connection,
hc,
ec,
"Could not find denomination key used in deposit");
NULL);
}
TALER_amount_ntoh (&deposit.deposit_fee,
&dki->issue.properties.fee_deposit);
@ -471,7 +471,7 @@ TEH_handler_deposit (struct MHD_Connection *connection,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_DEPOSIT_CURRENCY_MISMATCH,
"contribution");
deposit.deposit_fee.currency);
}
/* check coin signature */
if (GNUNET_YES !=
@ -484,7 +484,7 @@ TEH_handler_deposit (struct MHD_Connection *connection,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_UNAUTHORIZED,
TALER_EC_DEPOSIT_DENOMINATION_SIGNATURE_INVALID,
"ub_sig");
NULL);
}
TALER_amount_ntoh (&dc.value,
&dki->issue.properties.value);
@ -498,7 +498,7 @@ TEH_handler_deposit (struct MHD_Connection *connection,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_DEPOSIT_NEGATIVE_VALUE_AFTER_FEE,
"deposited amount smaller than depositing fee");
NULL);
}
/* check deposit signature */
@ -530,7 +530,7 @@ TEH_handler_deposit (struct MHD_Connection *connection,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_UNAUTHORIZED,
TALER_EC_DEPOSIT_COIN_SIGNATURE_INVALID,
"coin_sig");
NULL);
}
}

View File

@ -234,7 +234,7 @@ deposits_get_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_DEPOSITS_GET_DB_FETCH_FAILED,
"failed to fetch transaction data");
NULL);
}
return qs;
}
@ -243,7 +243,7 @@ deposits_get_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_NOT_FOUND,
TALER_EC_DEPOSITS_GET_NOT_FOUND,
"transaction unknown");
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
}
return qs;
@ -289,7 +289,7 @@ handle_track_transaction_request (
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_DEPOSITS_GET_DB_FEE_INCONSISTENT,
"fees are inconsistent");
NULL);
return reply_deposit_details (connection,
&tps->h_contract_terms,
&tps->h_wire,
@ -333,7 +333,7 @@ TEH_handler_deposits_get (const struct TEH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_DEPOSITS_INVALID_H_WIRE,
"wire hash malformed");
args[0]);
}
if (GNUNET_OK !=
GNUNET_STRINGS_string_to_data (args[1],
@ -345,7 +345,7 @@ TEH_handler_deposits_get (const struct TEH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_DEPOSITS_INVALID_MERCHANT_PUB,
"merchant public key malformed");
args[1]);
}
if (GNUNET_OK !=
GNUNET_STRINGS_string_to_data (args[2],
@ -357,7 +357,7 @@ TEH_handler_deposits_get (const struct TEH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_DEPOSITS_INVALID_H_CONTRACT_TERMS,
"contract terms hash malformed");
args[2]);
}
if (GNUNET_OK !=
GNUNET_STRINGS_string_to_data (args[3],
@ -369,7 +369,7 @@ TEH_handler_deposits_get (const struct TEH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_DEPOSITS_INVALID_COIN_PUB,
"coin public key malformed");
args[3]);
}
res = TALER_MHD_parse_request_arg_data (connection,
"merchant_sig",
@ -389,7 +389,7 @@ TEH_handler_deposits_get (const struct TEH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_FORBIDDEN,
TALER_EC_DEPOSITS_GET_MERCHANT_SIGNATURE_INVALID,
"merchant_sig");
NULL);
}
return handle_track_transaction_request (connection,

View File

@ -2502,7 +2502,7 @@ TEH_handler_keys (const struct TEH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_KEYS_HAVE_NOT_NUMERIC,
"last_issue_date");
have_cherrypick);
}
/* The following multiplication may overflow; but this should not really
be a problem, as giving back 'older' data than what the client asks for
@ -2531,7 +2531,7 @@ TEH_handler_keys (const struct TEH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_FORBIDDEN,
TALER_EC_KEYS_HAVE_NOT_NUMERIC,
"now");
have_fakenow);
}
if (TEH_allow_keys_timetravel)
{
@ -2547,7 +2547,7 @@ TEH_handler_keys (const struct TEH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_KEYS_TIMETRAVEL_FORBIDDEN,
"timetravel not allowed by this exchange");
NULL);
}
}
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
@ -2567,7 +2567,7 @@ TEH_handler_keys (const struct TEH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_EXCHANGE_BAD_CONFIGURATION,
"no keys for requested time");
NULL);
}
krd = bsearch (&last_issue_date,
key_state->krd_array,
@ -2599,7 +2599,7 @@ TEH_handler_keys (const struct TEH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_KEYS_MISSING,
"no key response found");
NULL);
}
ret = MHD_queue_response (connection,
MHD_HTTP_OK,

View File

@ -157,7 +157,7 @@ link_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
ctx->ec,
"coin_pub");
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
}
if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs)
@ -165,7 +165,7 @@ link_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_NOT_FOUND,
TALER_EC_LINK_COIN_UNKNOWN,
"coin_pub");
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
}
return qs;
@ -202,7 +202,7 @@ TEH_handler_link (const struct TEH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_COINS_INVALID_COIN_PUB,
"coin public key malformed");
args[0]);
}
ctx.mlist = json_array ();
if (NULL == ctx.mlist)

View File

@ -64,25 +64,25 @@ reply_melt_insufficient_funds (
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_MELT_HISTORY_DB_ERROR_INSUFFICIENT_FUNDS,
"Failed to compile transaction history");
return TALER_MHD_reply_json_pack (connection,
MHD_HTTP_CONFLICT,
"{s:s, s:I, s:o, s:o, s:o, s:o, s:o}",
"hint",
"insufficient funds",
"code",
(json_int_t)
TALER_EC_MELT_INSUFFICIENT_FUNDS,
"coin_pub",
GNUNET_JSON_from_data_auto (coin_pub),
"original_value",
TALER_JSON_from_amount (coin_value),
"residual_value",
TALER_JSON_from_amount (residual),
"requested_value",
TALER_JSON_from_amount (requested),
"history",
history);
NULL);
return TALER_MHD_reply_json_pack (
connection,
MHD_HTTP_CONFLICT,
"{s:s, s:I, s:o, s:o, s:o, s:o, s:o}",
TALER_ErrorCode_get_hint (TALER_EC_MELT_INSUFFICIENT_FUNDS),
"code",
(json_int_t)
TALER_EC_MELT_INSUFFICIENT_FUNDS,
"coin_pub",
GNUNET_JSON_from_data_auto (coin_pub),
"original_value",
TALER_JSON_from_amount (coin_value),
"residual_value",
TALER_JSON_from_amount (residual),
"requested_value",
TALER_JSON_from_amount (requested),
"history",
history);
}
@ -202,7 +202,7 @@ refresh_check_melt (struct MHD_Connection *connection,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_MELT_DB_FETCH_ERROR,
"failed to fetch old coin history");
NULL);
return qs;
}
if (rmc->zombie_required)
@ -229,7 +229,7 @@ refresh_check_melt (struct MHD_Connection *connection,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_MELT_COIN_EXPIRED_NO_ZOMBIE,
"denomination expired");
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
}
}
@ -244,7 +244,7 @@ refresh_check_melt (struct MHD_Connection *connection,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_MELT_COIN_HISTORY_COMPUTATION_FAILED,
"failed to compute coin transaction history");
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
}
@ -341,7 +341,7 @@ melt_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_MELT_DB_FETCH_ERROR,
"failed to fetch melt index");
NULL);
return qs;
}
@ -367,7 +367,7 @@ melt_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_MELT_DB_STORE_SESSION_ERROR,
"failed to persist melt data");
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
}
return qs;
@ -417,7 +417,7 @@ handle_melt (struct MHD_Connection *connection,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_FORBIDDEN,
TALER_EC_MELT_COIN_SIGNATURE_INVALID,
"confirm_sig");
NULL);
}
}
@ -509,7 +509,7 @@ check_for_denomination_key (struct MHD_Connection *connection,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_MELT_DB_FETCH_ERROR,
"failed to find information about old coin");
NULL);
}
/* sanity check */
GNUNET_break (0 ==
@ -549,7 +549,7 @@ check_for_denomination_key (struct MHD_Connection *connection,
return TALER_MHD_reply_with_error (connection,
hc,
ec,
"unknown denomination");
NULL);
}
TALER_amount_ntoh (&rmc->coin_refresh_fee,
@ -566,7 +566,8 @@ check_for_denomination_key (struct MHD_Connection *connection,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_MELT_CURRENCY_MISMATCH,
"value_with_fee");
rmc->refresh_session.amount_with_fee.
currency);
}
/* check coin is actually properly signed */
@ -579,7 +580,7 @@ check_for_denomination_key (struct MHD_Connection *connection,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_FORBIDDEN,
TALER_EC_MELT_DENOMINATION_SIGNATURE_INVALID,
"denom_sig");
NULL);
}
}
TEH_KS_release (key_state);
@ -593,7 +594,7 @@ check_for_denomination_key (struct MHD_Connection *connection,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_MELT_FEES_EXCEED_CONTRIBUTION,
"melt amount smaller than melting fee");
NULL);
}
return handle_melt (connection,
rmc);

View File

@ -156,7 +156,7 @@ recoup_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_RECOUP_DB_FETCH_FAILED,
"failed to fetch old coin of blind coin");
NULL);
}
return qs;
}
@ -175,7 +175,7 @@ recoup_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_RECOUP_DB_FETCH_FAILED,
"failed to fetch reserve of blinded coin");
NULL);
}
return qs;
}
@ -188,7 +188,7 @@ recoup_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_NOT_FOUND,
TALER_EC_RECOUP_WITHDRAW_NOT_FOUND,
"envelope unknown");
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
}
@ -206,7 +206,7 @@ recoup_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_RECOUP_DB_FETCH_FAILED,
"failed to fetch coin transaction history");
NULL);
}
return qs;
}
@ -241,7 +241,7 @@ recoup_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_RECOUP_HISTORY_DB_ERROR,
"failed to calculate old coin transaction history");
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
}
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
@ -261,7 +261,7 @@ recoup_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_RECOUP_COIN_BALANCE_NEGATIVE,
"calculated negative coin balance");
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
}
if ( (0 == pc->amount.fraction) &&
@ -328,7 +328,7 @@ recoup_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_RECOUP_DB_PUT_FAILED,
"failed to persist recoup data");
NULL);
}
return qs;
}
@ -392,7 +392,7 @@ verify_and_execute_recoup (struct MHD_Connection *connection,
return TALER_MHD_reply_with_error (connection,
hc,
ec,
"denomination not valid for recoup");
NULL);
}
TALER_amount_ntoh (&pc.value,
&dki->issue.properties.value);
@ -407,7 +407,7 @@ verify_and_execute_recoup (struct MHD_Connection *connection,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_FORBIDDEN,
TALER_EC_RECOUP_DENOMINATION_SIGNATURE_INVALID,
"denom_sig");
NULL);
}
/* check recoup request signature */
@ -431,7 +431,7 @@ verify_and_execute_recoup (struct MHD_Connection *connection,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_FORBIDDEN,
TALER_EC_RECOUP_SIGNATURE_INVALID,
"coin_sig");
NULL);
}
}
GNUNET_CRYPTO_hash (&coin->coin_pub.eddsa_pub,
@ -449,7 +449,7 @@ verify_and_execute_recoup (struct MHD_Connection *connection,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_RECOUP_BLINDING_FAILED,
"coin_bks");
NULL);
}
TEH_KS_release (key_state);
}

View File

@ -257,7 +257,7 @@ refreshes_reveal_preflight (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_REVEAL_DB_FETCH_REVEAL_ERROR,
"failed to fetch reveal data");
NULL);
rctx->preflight_ok = GNUNET_SYSERR;
return GNUNET_DB_STATUS_HARD_ERROR;
case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT:
@ -309,7 +309,7 @@ refreshes_reveal_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_NOT_FOUND,
TALER_EC_REVEAL_SESSION_UNKNOWN,
"rc");
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
}
if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
@ -321,7 +321,7 @@ refreshes_reveal_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_REVEAL_DB_FETCH_SESSION_ERROR,
"failed to fetch valid challenge from database");
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
}
@ -409,16 +409,17 @@ refreshes_reveal_transaction (void *cls,
&rc_expected))
{
GNUNET_break_op (0);
*mhd_ret = TALER_MHD_reply_json_pack (connection,
MHD_HTTP_CONFLICT,
"{s:s, s:I, s:o}",
"hint", "commitment violation",
"code",
(json_int_t)
TALER_EC_REVEAL_COMMITMENT_VIOLATION,
"rc_expected",
GNUNET_JSON_from_data_auto (
&rc_expected));
*mhd_ret = TALER_MHD_reply_json_pack (
connection,
MHD_HTTP_CONFLICT,
"{s:s, s:I, s:o}",
"hint",
TALER_ErrorCode_get_hint (TALER_EC_REVEAL_COMMITMENT_VIOLATION),
"code",
(json_int_t) TALER_EC_REVEAL_COMMITMENT_VIOLATION,
"rc_expected",
GNUNET_JSON_from_data_auto (
&rc_expected));
return GNUNET_DB_STATUS_HARD_ERROR;
}
} /* end of checking "rc_expected" */
@ -451,7 +452,7 @@ refreshes_reveal_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_REVEAL_COST_CALCULATION_OVERFLOW,
"failed to add up refresh costs");
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
}
}
@ -462,7 +463,7 @@ refreshes_reveal_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_REVEAL_AMOUNT_INSUFFICIENT,
"melted coin value is insufficient to cover cost of operation");
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
}
}
@ -517,7 +518,7 @@ refreshes_reveal_persist (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_REVEAL_DB_COMMIT_ERROR,
"failed to persist reveal data");
NULL);
}
return qs;
}
@ -582,7 +583,7 @@ resolve_refreshes_reveal_denominations (struct TEH_KS_StateHandle *key_state,
return TALER_MHD_reply_with_error (connection,
hc,
ec,
"failed to find denomination key");
NULL);
}
/* #TEH_KS_DKU_WITHDRAW should warrant that we only get denomination
keys where we did not yet forget the private key */
@ -630,13 +631,13 @@ resolve_refreshes_reveal_denominations (struct TEH_KS_StateHandle *key_state,
ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_NOT_FOUND,
TALER_EC_REVEAL_SESSION_UNKNOWN,
"rc");
NULL);
break;
case GNUNET_DB_STATUS_HARD_ERROR:
ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_REVEAL_DB_FETCH_SESSION_ERROR,
"failed to fetch session data");
NULL);
break;
case GNUNET_DB_STATUS_SOFT_ERROR:
default:
@ -644,7 +645,7 @@ resolve_refreshes_reveal_denominations (struct TEH_KS_StateHandle *key_state,
ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_INTERNAL_INVARIANT_FAILURE,
"assertion failed (unexpected database serialization error)");
NULL);
break;
}
goto cleanup;
@ -689,7 +690,7 @@ resolve_refreshes_reveal_denominations (struct TEH_KS_StateHandle *key_state,
ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_FORBIDDEN,
TALER_EC_REVEAL_LINK_SIGNATURE_INVALID,
"link_sig");
NULL);
goto cleanup;
}
}
@ -716,7 +717,7 @@ resolve_refreshes_reveal_denominations (struct TEH_KS_StateHandle *key_state,
ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_REVEAL_SIGNING_ERROR,
"internal signing error");
NULL);
goto cleanup;
}
}
@ -831,7 +832,7 @@ handle_refreshes_reveal_json (struct MHD_Connection *connection,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_REVEAL_NEW_DENOMS_ARRAY_SIZE_EXCESSIVE,
"new_denoms_h");
NULL);
}
if (json_array_size (new_denoms_h_json) !=
@ -945,7 +946,7 @@ TEH_handler_reveal (const struct TEH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_REVEAL_INVALID_RCH,
"refresh commitment hash malformed");
args[0]);
}
if (0 != strcmp (args[1],
"reveal"))
@ -954,7 +955,7 @@ TEH_handler_reveal (const struct TEH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_OPERATION_INVALID,
"expected 'reveal' operation");
args[1]);
}
{
@ -979,7 +980,7 @@ TEH_handler_reveal (const struct TEH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_REVEAL_CNC_TRANSFER_ARRAY_SIZE_INVALID,
"transfer_privs");
NULL);
}
{

View File

@ -125,9 +125,9 @@ refund_transaction (void *cls,
{
if (GNUNET_DB_STATUS_HARD_ERROR == qs)
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_NOT_FOUND,
TALER_EC_REFUND_COIN_NOT_FOUND,
"database transaction failure");
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_REFUND_DATABASE_LOOKUP_ERROR,
NULL);
return qs;
}
deposit_found = false;
@ -163,7 +163,7 @@ refund_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_GONE,
TALER_EC_REFUND_MERCHANT_ALREADY_PAID,
"money already sent to merchant");
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
}
@ -230,9 +230,11 @@ refund_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_json_pack (
connection,
MHD_HTTP_PRECONDITION_FAILED,
"{s:s, s:I, s:o}",
"hint",
"{s:s, s:s, s:I, s:o}",
"detail",
"conflicting refund with different amount but same refund transaction ID",
"hint", TALER_ErrorCode_get_hint (
TALER_EC_REFUND_INCONSISTENT_AMOUNT),
"code", (json_int_t) TALER_EC_REFUND_INCONSISTENT_AMOUNT,
"history", TEH_RESPONSE_compile_transaction_history (
&refund->coin.coin_pub,
@ -306,7 +308,7 @@ refund_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_NOT_FOUND,
TALER_EC_REFUND_DEPOSIT_NOT_FOUND,
"deposit unknown");
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
}
@ -321,7 +323,7 @@ refund_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_REFUND_CURRENCY_MISMATCH,
"currencies involved do not match");
deposit_total.currency);
return GNUNET_DB_STATUS_HARD_ERROR;
}
@ -340,13 +342,16 @@ refund_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_json_pack (
connection,
MHD_HTTP_CONFLICT,
"{s:s, s:I, s:o}",
"hint",
"{s:s, s:s, s:I, s:o}",
"detail",
"total amount refunded exceeds total amount deposited for this coin",
"code", (json_int_t) TALER_EC_REFUND_CONFLICT_DEPOSIT_INSUFFICIENT,
"history", TEH_RESPONSE_compile_transaction_history (
&refund->coin.coin_pub,
tlx));
"hint",
TALER_ErrorCode_get_hint (TALER_EC_REFUND_CONFLICT_DEPOSIT_INSUFFICIENT),
"code",
(json_int_t) TALER_EC_REFUND_CONFLICT_DEPOSIT_INSUFFICIENT,
"history",
TEH_RESPONSE_compile_transaction_history (&refund->coin.coin_pub,
tlx));
TEH_plugin->free_coin_transaction_list (TEH_plugin->cls,
tlx);
return GNUNET_DB_STATUS_HARD_ERROR;
@ -365,7 +370,7 @@ refund_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_REFUND_STORE_DB_ERROR,
"could not persist store information");
NULL);
return qs;
}
/* Success or soft failure */
@ -411,7 +416,7 @@ verify_and_execute_refund (struct MHD_Connection *connection,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_FORBIDDEN,
TALER_EC_REFUND_MERCHANT_SIGNATURE_INVALID,
"merchant_sig");
NULL);
}
}
@ -425,11 +430,18 @@ verify_and_execute_refund (struct MHD_Connection *connection,
&denom_hash);
if (0 > qs)
{
MHD_RESULT res;
char *dhs;
GNUNET_break (GNUNET_DB_STATUS_HARD_ERROR == qs);
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_NOT_FOUND,
TALER_EC_REFUND_COIN_NOT_FOUND,
"denomination of coin to be refunded not found in DB");
dhs = GNUNET_STRINGS_data_to_string_alloc (&denom_hash,
sizeof (denom_hash));
res = TALER_MHD_reply_with_error (connection,
MHD_HTTP_NOT_FOUND,
TALER_EC_REFUND_COIN_NOT_FOUND,
dhs);
GNUNET_free (dhs);
return res;
}
}
@ -465,7 +477,7 @@ verify_and_execute_refund (struct MHD_Connection *connection,
return TALER_MHD_reply_with_error (connection,
hc,
ec,
"denomination not found, but coin known");
NULL);
}
TALER_amount_ntoh (&refund->details.refund_fee,
&dki->issue.properties.fee_refund);

View File

@ -51,7 +51,7 @@ reply_reserve_history_success (struct MHD_Connection *connection,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_RESERVE_STATUS_DB_ERROR,
"balance calculation failure");
NULL);
json_balance = TALER_JSON_from_amount (&balance);
return TALER_MHD_reply_json_pack (connection,
MHD_HTTP_OK,
@ -143,7 +143,7 @@ TEH_handler_reserves_get (const struct TEH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_RESERVES_INVALID_RESERVE_PUB,
"reserve public key malformed");
args[0]);
}
rsc.rh = NULL;
if (GNUNET_OK !=
@ -156,14 +156,10 @@ TEH_handler_reserves_get (const struct TEH_RequestHandler *rh,
/* generate proper response */
if (NULL == rsc.rh)
return TALER_MHD_reply_json_pack (connection,
MHD_HTTP_NOT_FOUND,
"{s:s, s:s, s:I}",
"hint", "Reserve not found",
"parameter", "reserve_pub",
"code",
(json_int_t)
TALER_EC_RESERVE_STATUS_UNKNOWN);
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_NOT_FOUND,
TALER_EC_RESERVE_STATUS_UNKNOWN,
args[0]);
mhd_ret = reply_reserve_history_success (connection,
rsc.rh);
TEH_plugin->free_reserve_history (TEH_plugin->cls,

View File

@ -445,13 +445,13 @@ TEH_RESPONSE_reply_coin_insufficient_funds (
GNUNET_break (0);
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_COIN_HISTORY_DB_ERROR_INSUFFICIENT_FUNDS,
"failed to convert transaction history to JSON");
TALER_EC_JSON_ALLOCATION_FAILURE,
"Failed to generated proof of insufficient funds");
}
return TALER_MHD_reply_json_pack (connection,
MHD_HTTP_CONFLICT,
"{s:s, s:I, s:o}",
"hint", "insufficient funds",
"hint", TALER_ErrorCode_get_hint (ec),
"code", (json_int_t) ec,
"history", history);
}

View File

@ -446,7 +446,7 @@ get_transfer_deposits (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_TRANSFERS_GET_DB_FETCH_FAILED,
"failed to fetch transaction data");
NULL);
}
return qs;
}
@ -456,7 +456,7 @@ get_transfer_deposits (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_TRANSFERS_GET_DB_INCONSISTENT,
"exchange database internally inconsistent");
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
}
if (GNUNET_NO == ctx->is_valid)
@ -464,7 +464,7 @@ get_transfer_deposits (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_NOT_FOUND,
TALER_EC_TRANSFERS_GET_WTID_NOT_FOUND,
"wtid");
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
}
qs = TEH_plugin->get_wire_fee (TEH_plugin->cls,
@ -485,7 +485,7 @@ get_transfer_deposits (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_TRANSFERS_GET_WIRE_FEE_NOT_FOUND,
"did not find wire fee");
NULL);
}
return qs;
}
@ -498,7 +498,7 @@ get_transfer_deposits (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_TRANSFERS_GET_WIRE_FEE_INCONSISTENT,
"could not subtract wire fee");
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
}
return GNUNET_DB_STATUS_SUCCESS_ONE_RESULT;
@ -535,7 +535,7 @@ TEH_handler_transfers_get (const struct TEH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_TRANSFERS_INVALID_WTID,
"wire transfer identifier malformed");
args[0]);
}
if (GNUNET_OK !=
TEH_DB_run_transaction (connection,

View File

@ -66,7 +66,7 @@ reply_withdraw_insufficient_funds (
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_WITHDRAW_HISTORY_DB_ERROR_INSUFFICIENT_FUNDS,
"reserve balance calculation failure");
NULL);
if (0 !=
TALER_amount_cmp (&balance,
ebalance))
@ -76,18 +76,20 @@ reply_withdraw_insufficient_funds (
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_WITHDRAW_RESERVE_BALANCE_CORRUPT,
"internal balance inconsistency error");
NULL);
}
return TALER_MHD_reply_json_pack (connection,
MHD_HTTP_CONFLICT,
"{s:s, s:I, s:o, s:o}",
"hint", "insufficient funds",
"code",
(json_int_t)
TALER_EC_WITHDRAW_INSUFFICIENT_FUNDS,
"balance", TALER_JSON_from_amount (
&balance),
"history", json_history);
return TALER_MHD_reply_json_pack (
connection,
MHD_HTTP_CONFLICT,
"{s:s, s:I, s:o, s:o}",
"hint",
TALER_ErrorCode_get_hint (TALER_EC_WITHDRAW_INSUFFICIENT_FUNDS),
"code",
(json_int_t) TALER_EC_WITHDRAW_INSUFFICIENT_FUNDS,
"balance",
TALER_JSON_from_amount (&balance),
"history",
json_history);
}
@ -197,7 +199,7 @@ withdraw_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_WITHDRAW_DB_FETCH_ERROR,
"failed to fetch withdraw data");
NULL);
wc->collectable.sig = denom_sig;
return qs;
}
@ -232,7 +234,7 @@ withdraw_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_WITHDRAW_DB_FETCH_ERROR,
"failed to fetch reserve data");
NULL);
return qs;
}
if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs)
@ -240,7 +242,7 @@ withdraw_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_NOT_FOUND,
TALER_EC_WITHDRAW_RESERVE_UNKNOWN,
"reserve_pub");
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
}
if (0 < TALER_amount_cmp (&wc->amount_required,
@ -274,7 +276,7 @@ withdraw_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_WITHDRAW_DB_FETCH_ERROR,
"failed to fetch reserve history");
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
}
*mhd_ret = reply_withdraw_insufficient_funds (connection,
@ -299,7 +301,7 @@ withdraw_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_WITHDRAW_SIGNATURE_FAILED,
"Failed to create blind signature");
NULL);
return GNUNET_DB_STATUS_HARD_ERROR;
}
}
@ -319,7 +321,7 @@ withdraw_transaction (void *cls,
*mhd_ret = TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_WITHDRAW_DB_STORE_ERROR,
"failed to persist withdraw data");
NULL);
return qs;
}
return qs;
@ -370,7 +372,7 @@ TEH_handler_withdraw (const struct TEH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_RESERVES_INVALID_RESERVE_PUB,
"reserve public key malformed");
args[0]);
}
{
@ -408,7 +410,7 @@ TEH_handler_withdraw (const struct TEH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
hc,
ec,
"could not find denomination key");
NULL);
}
}
GNUNET_assert (NULL != wc.dki->denom_priv.rsa_private_key);
@ -430,7 +432,7 @@ TEH_handler_withdraw (const struct TEH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_WITHDRAW_AMOUNT_FEE_OVERFLOW,
"amount overflow for value plus withdraw fee");
NULL);
}
TALER_amount_hton (&wc.wsrd.amount_with_fee,
&wc.amount_required);
@ -459,7 +461,7 @@ TEH_handler_withdraw (const struct TEH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_FORBIDDEN,
TALER_EC_WITHDRAW_RESERVE_SIGNATURE_INVALID,
"reserve_sig");
NULL);
}
#if OPTIMISTIC_SIGN
@ -476,7 +478,7 @@ TEH_handler_withdraw (const struct TEH_RequestHandler *rh,
return TALER_MHD_reply_with_error (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_WITHDRAW_SIGNATURE_FAILED,
"Failed to sign");
NULL);
}
#endif

View File

@ -133,14 +133,14 @@ TALER_MHD_reply_json_pack (struct MHD_Connection *connection,
* @param connection the MHD connection to use
* @param ec error code uniquely identifying the error
* @param http_status HTTP status code to use
* @param hint human readable hint about the error
* @param detail additional optional detail about the error
* @return a MHD result code
*/
MHD_RESULT
TALER_MHD_reply_with_error (struct MHD_Connection *connection,
unsigned int http_status,
enum TALER_ErrorCode ec,
const char *hint);
const char *detail);
/**
@ -169,12 +169,12 @@ TALER_MHD_make_json_pack (const char *fmt,
* Create a response indicating an internal error.
*
* @param ec error code to return
* @param hint hint about the internal error's nature
* @param detail additional optional detail about the error, can be NULL
* @return a MHD response object
*/
struct MHD_Response *
TALER_MHD_make_error (enum TALER_ErrorCode ec,
const char *hint);
const char *detail);
/**

View File

@ -651,7 +651,8 @@ TALER_JSON_get_error_hint (const json_t *json)
GNUNET_break_op (0);
return NULL;
}
jc = json_object_get (json, "hint");
jc = json_object_get (json,
"hint");
if (NULL == jc)
return NULL; /* no hint, is allowed */
if (! json_is_string (jc))

View File

@ -24,6 +24,7 @@
#include <gnunet/gnunet_json_lib.h>
#include <jansson.h>
#include <microhttpd.h>
#include "taler_util.h"
#include "taler_mhd_lib.h"

View File

@ -76,11 +76,11 @@ TALER_MHD_parse_post_json (struct MHD_Connection *connection,
case GNUNET_JSON_PR_OUT_OF_MEMORY:
GNUNET_break (NULL == *json);
return (MHD_NO ==
TALER_MHD_reply_with_error
(connection,
TALER_MHD_reply_with_error (
connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_PARSER_OUT_OF_MEMORY,
"out of memory")) ? GNUNET_SYSERR : GNUNET_NO;
NULL)) ? GNUNET_SYSERR : GNUNET_NO;
case GNUNET_JSON_PR_CONTINUE:
GNUNET_break (NULL == *json);
@ -96,7 +96,7 @@ TALER_MHD_parse_post_json (struct MHD_Connection *connection,
TALER_MHD_reply_with_error (connection,
MHD_HTTP_BAD_REQUEST,
TALER_EC_JSON_INVALID,
"invalid JSON uploaded"))
NULL))
? GNUNET_NO : GNUNET_SYSERR;
case GNUNET_JSON_PR_SUCCESS:
GNUNET_break (NULL != *json);
@ -204,15 +204,15 @@ TALER_MHD_parse_json_data (struct MHD_Connection *connection,
if (NULL == error_json_name)
error_json_name = "<no field>";
ret = (MHD_YES ==
TALER_MHD_reply_json_pack (connection,
MHD_HTTP_BAD_REQUEST,
"{s:s, s:I, s:s, s:I}",
"hint", "JSON parse error",
"code",
(json_int_t)
TALER_EC_JSON_INVALID_WITH_DETAILS,
"field", error_json_name,
"line", (json_int_t) error_line))
TALER_MHD_reply_json_pack (
connection,
MHD_HTTP_BAD_REQUEST,
"{s:s, s:I, s:s, s:I}",
"hint", TALER_ErrorCode_get_hint (
TALER_EC_JSON_INVALID_WITH_DETAILS),
"code", (json_int_t) TALER_EC_JSON_INVALID_WITH_DETAILS,
"field", error_json_name,
"line", (json_int_t) error_line))
? GNUNET_NO : GNUNET_SYSERR;
return ret;
}
@ -256,15 +256,15 @@ TALER_MHD_parse_internal_json_data (struct MHD_Connection *connection,
if (NULL == error_json_name)
error_json_name = "<no field>";
ret = (MHD_YES ==
TALER_MHD_reply_json_pack (connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
"{s:s, s:I, s:s, s:I}",
"hint", "JSON parse error",
"code",
(json_int_t)
TALER_EC_INTERNAL_INVARIANT_FAILURE,
"field", error_json_name,
"line", (json_int_t) error_line))
TALER_MHD_reply_json_pack (
connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
"{s:s, s:I, s:s, s:I}",
"hint", TALER_ErrorCode_get_hint (
TALER_EC_INTERNAL_INVARIANT_FAILURE),
"code", (json_int_t) TALER_EC_INTERNAL_INVARIANT_FAILURE,
"field", error_json_name,
"line", (json_int_t) error_line))
? GNUNET_NO : GNUNET_SYSERR;
return ret;
}
@ -311,14 +311,15 @@ TALER_MHD_parse_json_array (struct MHD_Connection *connection,
if (NULL == root)
{
ret = (MHD_YES ==
TALER_MHD_reply_json_pack (connection,
MHD_HTTP_BAD_REQUEST,
"{s:s, s:I, s:I}",
"hint", "expected array",
"code",
(json_int_t)
TALER_EC_JSON_INVALID_WITH_DETAILS,
"dimension", dim))
TALER_MHD_reply_json_pack (
connection,
MHD_HTTP_BAD_REQUEST,
"{s:s, s:I, s:s, s:I}",
"hint", TALER_ErrorCode_get_hint (
TALER_EC_JSON_INVALID_WITH_DETAILS),
"code", (json_int_t) TALER_EC_JSON_INVALID_WITH_DETAILS,
"detail", "expected array",
"dimension", dim))
? GNUNET_NO : GNUNET_SYSERR;
return ret;
}
@ -331,14 +332,15 @@ TALER_MHD_parse_json_array (struct MHD_Connection *connection,
if (NULL == error_json_name)
error_json_name = "<no field>";
ret = (MHD_YES ==
TALER_MHD_reply_json_pack (connection,
MHD_HTTP_BAD_REQUEST,
"{s:s, s:I, s:I}",
"hint", error_json_name,
"code",
(json_int_t)
TALER_EC_JSON_INVALID_WITH_DETAILS,
"line", (json_int_t) error_line))
TALER_MHD_reply_json_pack (
connection,
MHD_HTTP_BAD_REQUEST,
"{s:s, s:s, s:I, s:I}",
"detail", error_json_name,
"hint", TALER_ErrorCode_get_hint (
TALER_EC_JSON_INVALID_WITH_DETAILS),
"code", (json_int_t) TALER_EC_JSON_INVALID_WITH_DETAILS,
"line", (json_int_t) error_line))
? GNUNET_NO : GNUNET_SYSERR;
return ret;
}

View File

@ -404,16 +404,17 @@ TALER_MHD_make_json_pack (const char *fmt,
* Create a response indicating an internal error.
*
* @param ec error code to return
* @param hint hint about the internal error's nature
* @param detail additional optional detail about the error, can be NULL
* @return a MHD response object
*/
struct MHD_Response *
TALER_MHD_make_error (enum TALER_ErrorCode ec,
const char *hint)
const char *detail)
{
return TALER_MHD_make_json_pack ("{s:I, s:s}",
return TALER_MHD_make_json_pack ("{s:I, s:s, s:s?}",
"code", (json_int_t) ec,
"hint", hint);
"hint", TALER_ErrorCode_get_hint (ec),
"detail", detail);
}
@ -423,20 +424,21 @@ TALER_MHD_make_error (enum TALER_ErrorCode ec,
* @param connection the MHD connection to use
* @param ec error code uniquely identifying the error
* @param http_status HTTP status code to use
* @param hint human readable hint about the error
* @param detail additional optional detail about the error, can be NULL
* @return a MHD result code
*/
MHD_RESULT
TALER_MHD_reply_with_error (struct MHD_Connection *connection,
unsigned int http_status,
enum TALER_ErrorCode ec,
const char *hint)
const char *detail)
{
return TALER_MHD_reply_json_pack (connection,
http_status,
"{s:I, s:s}",
"{s:I, s:s, s:s?}",
"code", (json_int_t) ec,
"hint", hint);
"hint", TALER_ErrorCode_get_hint (ec),
"detail", detail);
}