diff options
Diffstat (limited to 'src/testing/testing_api_cmd_recoup_refresh.c')
-rw-r--r-- | src/testing/testing_api_cmd_recoup_refresh.c | 146 |
1 files changed, 118 insertions, 28 deletions
diff --git a/src/testing/testing_api_cmd_recoup_refresh.c b/src/testing/testing_api_cmd_recoup_refresh.c index 6081a4ba1..68d267be4 100644 --- a/src/testing/testing_api_cmd_recoup_refresh.c +++ b/src/testing/testing_api_cmd_recoup_refresh.c @@ -44,6 +44,26 @@ struct RecoupRefreshState const char *coin_reference; /** + * Entry in the old coin's history generated by this operation. + */ + struct TALER_EXCHANGE_CoinHistoryEntry che_old; + + /** + * Entry in the recouped coin's history generated by this operation. + */ + struct TALER_EXCHANGE_CoinHistoryEntry che_new; + + /** + * Public key of the refunded coin. + */ + struct TALER_CoinSpendPublicKeyP coin_pub_old; + + /** + * Public key of the refunded coin. + */ + struct TALER_CoinSpendPublicKeyP coin_pub_new; + + /** * Amount to be recouped. */ struct TALER_Amount amount; @@ -73,35 +93,24 @@ struct RecoupRefreshState * was paid back belonged to the right old coin. * * @param cls closure - * @param hr HTTP response details - * @param old_coin_pub public key of the dirty coin + * @param rrr response details */ static void recoup_refresh_cb (void *cls, - const struct TALER_EXCHANGE_HttpResponse *hr, - const struct TALER_CoinSpendPublicKeyP *old_coin_pub) + const struct TALER_EXCHANGE_RecoupRefreshResponse *rrr) { struct RecoupRefreshState *rrs = cls; + const struct TALER_EXCHANGE_HttpResponse *hr = &rrr->hr; struct TALER_TESTING_Interpreter *is = rrs->is; - struct TALER_TESTING_Command *cmd = &is->commands[is->ip]; char *cref; unsigned int idx; rrs->ph = NULL; if (rrs->expected_response_code != hr->http_status) { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Unexpected response code %u/%d to command %s in %s:%u\n", - hr->http_status, - (int) hr->ec, - cmd->label, - __FILE__, - __LINE__); - json_dumpf (hr->reply, - stderr, - 0); - fprintf (stderr, "\n"); - TALER_TESTING_interpreter_fail (is); + TALER_TESTING_unexpected_status (is, + hr->http_status, + rrs->expected_response_code); return; } @@ -150,7 +159,7 @@ recoup_refresh_cb (void *cls, GNUNET_CRYPTO_eddsa_key_get_public (&dirty_priv->eddsa_priv, &oc.eddsa_pub); if (0 != GNUNET_memcmp (&oc, - old_coin_pub)) + &rrr->details.ok.old_coin_pub)) { GNUNET_break (0); TALER_TESTING_interpreter_fail (is); @@ -189,6 +198,7 @@ recoup_refresh_run (void *cls, const struct TALER_TESTING_Command *coin_cmd; const struct TALER_TESTING_Command *melt_cmd; const struct TALER_CoinSpendPrivateKeyP *coin_priv; + const struct TALER_CoinSpendPrivateKeyP *coin_priv_old; const struct TALER_EXCHANGE_DenomPublicKey *denom_pub; const struct TALER_DenominationSignature *coin_sig; const struct TALER_RefreshMasterSecretP *rplanchet; @@ -196,6 +206,7 @@ recoup_refresh_run (void *cls, const struct TALER_ExchangeWithdrawValues *ewv; char *cref; unsigned int idx; + struct TALER_DenominationHashP h_denom_pub; rrs->is = is; if (GNUNET_OK != @@ -235,6 +246,22 @@ recoup_refresh_run (void *cls, return; } if (GNUNET_OK != + TALER_TESTING_get_trait_coin_priv (melt_cmd, + 0, + &coin_priv_old)) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (is); + return; + } + GNUNET_CRYPTO_eddsa_key_get_public ( + &coin_priv->eddsa_priv, + &rrs->coin_pub_new.eddsa_pub); + GNUNET_CRYPTO_eddsa_key_get_public ( + &coin_priv_old->eddsa_priv, + &rrs->coin_pub_old.eddsa_pub); + + if (GNUNET_OK != TALER_TESTING_get_trait_exchange_wd_value (melt_cmd, idx, &ewv)) @@ -281,15 +308,41 @@ recoup_refresh_run (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Trying to recoup_refresh denomination '%s'\n", TALER_B2S (&denom_pub->h_key)); - rrs->ph = TALER_EXCHANGE_recoup_refresh (is->exchange, - denom_pub, - coin_sig, - ewv, - rplanchet, - planchet, - idx, - &recoup_refresh_cb, - rrs); + rrs->che_old.type + = TALER_EXCHANGE_CTT_OLD_COIN_RECOUP; + rrs->che_old.amount + = rrs->amount; + rrs->che_old.details.old_coin_recoup.new_coin_pub + = rrs->coin_pub_new; + rrs->che_new.type + = TALER_EXCHANGE_CTT_RECOUP_REFRESH; + rrs->che_new.amount + = rrs->amount; + rrs->che_new.details.recoup_refresh.old_coin_pub + = rrs->coin_pub_old; + TALER_planchet_blinding_secret_create ( + planchet, + ewv, + &rrs->che_new.details.recoup_refresh.coin_bks); + TALER_denom_pub_hash (&denom_pub->key, + &h_denom_pub); + TALER_wallet_recoup_refresh_sign ( + &h_denom_pub, + &rrs->che_new.details.recoup_refresh.coin_bks, + coin_priv, + &rrs->che_new.details.recoup_refresh.coin_sig); + rrs->ph = TALER_EXCHANGE_recoup_refresh ( + TALER_TESTING_interpreter_get_context (is), + TALER_TESTING_get_exchange_url (is), + TALER_TESTING_get_keys (is), + denom_pub, + coin_sig, + ewv, + rplanchet, + planchet, + idx, + &recoup_refresh_cb, + rrs); GNUNET_assert (NULL != rrs->ph); } @@ -315,6 +368,42 @@ recoup_refresh_cleanup (void *cls, } +/** + * Offer internal data from a "recoup-refresh" CMD state to other + * commands. + * + * @param cls closure + * @param[out] ret result (could be anything) + * @param trait name of the trait + * @param index index number of the object to offer. + * @return #GNUNET_OK on success + */ +static enum GNUNET_GenericReturnValue +recoup_refresh_traits (void *cls, + const void **ret, + const char *trait, + unsigned int index) +{ + struct RecoupRefreshState *rrs = cls; + struct TALER_TESTING_Trait traits[] = { + TALER_TESTING_make_trait_coin_history (0, + &rrs->che_old), + TALER_TESTING_make_trait_coin_pub (0, + &rrs->coin_pub_old), + TALER_TESTING_make_trait_coin_history (1, + &rrs->che_new), + TALER_TESTING_make_trait_coin_pub (1, + &rrs->coin_pub_new), + TALER_TESTING_trait_end () + }; + + return TALER_TESTING_get_trait (traits, + ret, + trait, + index); +} + + struct TALER_TESTING_Command TALER_TESTING_cmd_recoup_refresh (const char *label, unsigned int expected_response_code, @@ -343,7 +432,8 @@ TALER_TESTING_cmd_recoup_refresh (const char *label, .cls = rrs, .label = label, .run = &recoup_refresh_run, - .cleanup = &recoup_refresh_cleanup + .cleanup = &recoup_refresh_cleanup, + .traits = &recoup_refresh_traits }; return cmd; |