fix use of struct TALER_RefreshMeltCoinAffirmationPS

This commit is contained in:
Christian Grothoff 2015-03-28 17:27:08 +01:00
parent cf13997ffc
commit bb15fdd215
3 changed files with 48 additions and 33 deletions

View File

@ -332,6 +332,17 @@ struct TALER_MINTDB_RefreshMelt
*/ */
struct TALER_Amount amount_with_fee; struct TALER_Amount amount_with_fee;
/**
* Melting fee charged by the mint. This must match the Mint's
* denomination key's melting fee. If the client puts in an invalid
* melting fee (too high or too low) that does not match the Mint's
* denomination key, the melting operation is invalid and will be
* rejected by the mint. The @e amount_with_fee minus the @e
* melt_fee is the amount that will be credited to the melting
* session.
*/
struct TALER_Amount melt_fee;
}; };

View File

@ -242,12 +242,39 @@ verify_coin_public_info (struct MHD_Connection *connection,
struct TALER_MINTDB_DenominationKeyIssueInformation *dki; struct TALER_MINTDB_DenominationKeyIssueInformation *dki;
struct TALER_Amount fee_refresh; struct TALER_Amount fee_refresh;
key_state = TMH_KS_acquire ();
dki = TMH_KS_denomination_key_lookup (key_state,
&r_public_info->denom_pub);
if (NULL == dki)
{
TMH_KS_release (key_state);
TALER_LOG_WARNING ("Unknown denomination key in /refresh/melt request\n");
return TMH_RESPONSE_reply_arg_invalid (connection,
"denom_pub");
}
/* FIXME: need to check if denomination key is still
valid for issuing! (#3634) */
TALER_amount_ntoh (&fee_refresh,
&dki->issue.fee_refresh);
body.purpose.size = htonl (sizeof (struct TALER_RefreshMeltCoinAffirmationPS)); body.purpose.size = htonl (sizeof (struct TALER_RefreshMeltCoinAffirmationPS));
body.purpose.purpose = htonl (TALER_SIGNATURE_WALLET_COIN_MELT); body.purpose.purpose = htonl (TALER_SIGNATURE_WALLET_COIN_MELT);
body.session_hash = *session_hash; body.session_hash = *session_hash;
TALER_amount_hton (&body.amount_with_fee, TALER_amount_hton (&body.amount_with_fee,
&r_melt_detail->melt_amount_with_fee); &r_melt_detail->melt_amount_with_fee);
TALER_amount_hton (&body.melt_fee,
&fee_refresh);
body.coin_pub = r_public_info->coin_pub; body.coin_pub = r_public_info->coin_pub;
if (TALER_amount_cmp (&fee_refresh,
&r_melt_detail->melt_amount_with_fee) < 0)
{
TMH_KS_release (key_state);
return (MHD_YES ==
TMH_RESPONSE_reply_external_error (connection,
"melt amount smaller than melting fee"))
? GNUNET_NO : GNUNET_SYSERR;
}
TMH_KS_release (key_state);
if (GNUNET_OK != if (GNUNET_OK !=
GNUNET_CRYPTO_ecdsa_verify (TALER_SIGNATURE_WALLET_COIN_MELT, GNUNET_CRYPTO_ecdsa_verify (TALER_SIGNATURE_WALLET_COIN_MELT,
&body.purpose, &body.purpose,
@ -256,37 +283,12 @@ verify_coin_public_info (struct MHD_Connection *connection,
{ {
if (MHD_YES != if (MHD_YES !=
TMH_RESPONSE_reply_json_pack (connection, TMH_RESPONSE_reply_json_pack (connection,
MHD_HTTP_UNAUTHORIZED, MHD_HTTP_UNAUTHORIZED,
"{s:s}", "{s:s}",
"error", "signature invalid")) "error", "signature invalid"))
return GNUNET_SYSERR; return GNUNET_SYSERR;
return GNUNET_NO; return GNUNET_NO;
} }
key_state = TMH_KS_acquire ();
dki = TMH_KS_denomination_key_lookup (key_state,
&r_public_info->denom_pub);
if (NULL == dki)
{
TMH_KS_release (key_state);
TALER_LOG_WARNING ("Unknown denomination key in /refresh/melt request\n");
return TMH_RESPONSE_reply_arg_invalid (connection,
"denom_pub");
}
/* FIXME: need to check if denomination key is still
valid for issuing! (#3634) */
TALER_amount_ntoh (&fee_refresh,
&dki->issue.fee_refresh);
if (TALER_amount_cmp (&fee_refresh,
&r_melt_detail->melt_amount_with_fee) < 0)
{
TMH_KS_release (key_state);
return (MHD_YES ==
TMH_RESPONSE_reply_external_error (connection,
"melt amount smaller than melting fee"))
? GNUNET_NO : GNUNET_SYSERR;
}
TMH_KS_release (key_state);
return GNUNET_OK; return GNUNET_OK;
} }

View File

@ -377,6 +377,8 @@ compile_transaction_history (const struct TALER_MINTDB_TransactionList *tl)
ms.session_hash = melt->session_hash; ms.session_hash = melt->session_hash;
TALER_amount_hton (&ms.amount_with_fee, TALER_amount_hton (&ms.amount_with_fee,
&melt->amount_with_fee); &melt->amount_with_fee);
TALER_amount_hton (&ms.melt_fee,
&melt->melt_fee);
ms.coin_pub = melt->coin.coin_pub; ms.coin_pub = melt->coin.coin_pub;
transaction = TALER_json_from_ecdsa_sig (&ms.purpose, transaction = TALER_json_from_ecdsa_sig (&ms.purpose,
&melt->coin_sig.ecdsa_signature); &melt->coin_sig.ecdsa_signature);
@ -414,16 +416,16 @@ compile_transaction_history (const struct TALER_MINTDB_TransactionList *tl)
*/ */
int int
TMH_RESPONSE_reply_deposit_insufficient_funds (struct MHD_Connection *connection, TMH_RESPONSE_reply_deposit_insufficient_funds (struct MHD_Connection *connection,
const struct TALER_MINTDB_TransactionList *tl) const struct TALER_MINTDB_TransactionList *tl)
{ {
json_t *history; json_t *history;
history = compile_transaction_history (tl); history = compile_transaction_history (tl);
return TMH_RESPONSE_reply_json_pack (connection, return TMH_RESPONSE_reply_json_pack (connection,
MHD_HTTP_FORBIDDEN, MHD_HTTP_FORBIDDEN,
"{s:s, s:o}", "{s:s, s:o}",
"error", "insufficient funds", "error", "insufficient funds",
"history", history); "history", history);
} }