diff options
Diffstat (limited to 'src/testing/testing_api_cmd_recoup_refresh.c')
-rw-r--r-- | src/testing/testing_api_cmd_recoup_refresh.c | 289 |
1 files changed, 179 insertions, 110 deletions
diff --git a/src/testing/testing_api_cmd_recoup_refresh.c b/src/testing/testing_api_cmd_recoup_refresh.c index 9287cdf30..68d267be4 100644 --- a/src/testing/testing_api_cmd_recoup_refresh.c +++ b/src/testing/testing_api_cmd_recoup_refresh.c @@ -1,6 +1,6 @@ /* This file is part of TALER - Copyright (C) 2014-2018 Taler Systems SA + Copyright (C) 2014-2022 Taler Systems SA TALER is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -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; @@ -68,91 +88,37 @@ struct RecoupRefreshState /** - * Parser reference to a coin. - * - * @param coin_reference of format $LABEL['#' $INDEX]? - * @param[out] cref where we return a copy of $LABEL - * @param[out] idx where we set $INDEX - * @return #GNUNET_SYSERR if $INDEX is present but not numeric - */ -static enum GNUNET_GenericReturnValue -parse_coin_reference (const char *coin_reference, - char **cref, - unsigned int *idx) -{ - const char *index; - - /* We allow command references of the form "$LABEL#$INDEX" or - just "$LABEL", which implies the index is 0. Figure out - which one it is. */ - index = strchr (coin_reference, '#'); - if (NULL == index) - { - *idx = 0; - *cref = GNUNET_strdup (coin_reference); - return GNUNET_OK; - } - *cref = GNUNET_strndup (coin_reference, - index - coin_reference); - if (1 != sscanf (index + 1, - "%u", - idx)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Numeric index (not `%s') required after `#' in command reference of command in %s:%u\n", - index, - __FILE__, - __LINE__); - GNUNET_free (*cref); - *cref = NULL; - return GNUNET_SYSERR; - } - return GNUNET_OK; -} - - -/** * Check the result of the recoup_refresh request: checks whether * the HTTP response code is good, and that the coin that * 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 *ps = cls; - struct TALER_TESTING_Interpreter *is = ps->is; - struct TALER_TESTING_Command *cmd = &is->commands[is->ip]; + struct RecoupRefreshState *rrs = cls; + const struct TALER_EXCHANGE_HttpResponse *hr = &rrr->hr; + struct TALER_TESTING_Interpreter *is = rrs->is; char *cref; unsigned int idx; - ps->ph = NULL; - if (ps->expected_response_code != hr->http_status) + 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; } if (GNUNET_OK != - parse_coin_reference (ps->coin_reference, - &cref, - &idx)) + TALER_TESTING_parse_coin_reference ( + rrs->coin_reference, + &cref, + &idx)) { TALER_TESTING_interpreter_fail (is); return; @@ -170,7 +136,7 @@ recoup_refresh_cb (void *cls, struct TALER_CoinSpendPublicKeyP oc; melt_cmd = TALER_TESTING_interpreter_lookup_command (is, - ps->melt_reference); + rrs->melt_reference); if (NULL == melt_cmd) { GNUNET_break (0); @@ -185,7 +151,7 @@ recoup_refresh_cb (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Coin %u not found in command %s\n", 0, - ps->melt_reference); + rrs->melt_reference); GNUNET_break (0); TALER_TESTING_interpreter_fail (is); return; @@ -193,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); @@ -228,21 +194,26 @@ recoup_refresh_run (void *cls, const struct TALER_TESTING_Command *cmd, struct TALER_TESTING_Interpreter *is) { - struct RecoupRefreshState *ps = cls; + struct RecoupRefreshState *rrs = cls; const struct TALER_TESTING_Command *coin_cmd; + const struct TALER_TESTING_Command *melt_cmd; const struct TALER_CoinSpendPrivateKeyP *coin_priv; - const union TALER_DenominationBlindingKeyP *blinding_key; + const struct TALER_CoinSpendPrivateKeyP *coin_priv_old; const struct TALER_EXCHANGE_DenomPublicKey *denom_pub; const struct TALER_DenominationSignature *coin_sig; - struct TALER_PlanchetSecretsP planchet; + const struct TALER_RefreshMasterSecretP *rplanchet; + const struct TALER_PlanchetMasterSecretP *planchet; + const struct TALER_ExchangeWithdrawValues *ewv; char *cref; unsigned int idx; + struct TALER_DenominationHashP h_denom_pub; - ps->is = is; + rrs->is = is; if (GNUNET_OK != - parse_coin_reference (ps->coin_reference, - &cref, - &idx)) + TALER_TESTING_parse_coin_reference ( + rrs->coin_reference, + &cref, + &idx)) { TALER_TESTING_interpreter_fail (is); return; @@ -251,14 +222,20 @@ recoup_refresh_run (void *cls, coin_cmd = TALER_TESTING_interpreter_lookup_command (is, cref); GNUNET_free (cref); - if (NULL == coin_cmd) { GNUNET_break (0); TALER_TESTING_interpreter_fail (is); return; } - + melt_cmd = TALER_TESTING_interpreter_lookup_command (is, + rrs->melt_reference); + if (NULL == melt_cmd) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (is); + return; + } if (GNUNET_OK != TALER_TESTING_get_trait_coin_priv (coin_cmd, idx, @@ -268,20 +245,49 @@ recoup_refresh_run (void *cls, TALER_TESTING_interpreter_fail (is); return; } - if (GNUNET_OK != - TALER_TESTING_get_trait_blinding_key (coin_cmd, - idx, - &blinding_key)) + TALER_TESTING_get_trait_coin_priv (melt_cmd, + 0, + &coin_priv_old)) { GNUNET_break (0); TALER_TESTING_interpreter_fail (is); return; } - planchet.coin_priv = *coin_priv; - planchet.blinding_key = *blinding_key; + 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)) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (is); + return; + } + if (GNUNET_OK != + TALER_TESTING_get_trait_planchet_secrets (coin_cmd, + idx, + &planchet)) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (is); + return; + } + if (GNUNET_OK != + TALER_TESTING_get_trait_refresh_secret (melt_cmd, + &rplanchet)) + { + GNUNET_break (0); + TALER_TESTING_interpreter_fail (is); + return; + } + if (GNUNET_OK != TALER_TESTING_get_trait_denom_pub (coin_cmd, idx, &denom_pub)) @@ -290,7 +296,6 @@ recoup_refresh_run (void *cls, TALER_TESTING_interpreter_fail (is); return; } - if (GNUNET_OK != TALER_TESTING_get_trait_denom_sig (coin_cmd, idx, @@ -300,18 +305,45 @@ recoup_refresh_run (void *cls, TALER_TESTING_interpreter_fail (is); return; } - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Trying to recoup_refresh denomination '%s'\n", TALER_B2S (&denom_pub->h_key)); - - ps->ph = TALER_EXCHANGE_recoup_refresh (is->exchange, - denom_pub, - coin_sig, - &planchet, - recoup_refresh_cb, - ps); - GNUNET_assert (NULL != ps->ph); + 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); } @@ -326,13 +358,49 @@ static void recoup_refresh_cleanup (void *cls, const struct TALER_TESTING_Command *cmd) { - struct RecoupRefreshState *ps = cls; - if (NULL != ps->ph) + struct RecoupRefreshState *rrs = cls; + if (NULL != rrs->ph) { - TALER_EXCHANGE_recoup_refresh_cancel (ps->ph); - ps->ph = NULL; + TALER_EXCHANGE_recoup_refresh_cancel (rrs->ph); + rrs->ph = NULL; } - GNUNET_free (ps); + GNUNET_free (rrs); +} + + +/** + * 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); } @@ -343,15 +411,15 @@ TALER_TESTING_cmd_recoup_refresh (const char *label, const char *melt_reference, const char *amount) { - struct RecoupRefreshState *ps; + struct RecoupRefreshState *rrs; - ps = GNUNET_new (struct RecoupRefreshState); - ps->expected_response_code = expected_response_code; - ps->coin_reference = coin_reference; - ps->melt_reference = melt_reference; + rrs = GNUNET_new (struct RecoupRefreshState); + rrs->expected_response_code = expected_response_code; + rrs->coin_reference = coin_reference; + rrs->melt_reference = melt_reference; if (GNUNET_OK != TALER_string_to_amount (amount, - &ps->amount)) + &rrs->amount)) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to parse amount `%s' at %s\n", @@ -361,10 +429,11 @@ TALER_TESTING_cmd_recoup_refresh (const char *label, } { struct TALER_TESTING_Command cmd = { - .cls = ps, + .cls = rrs, .label = label, .run = &recoup_refresh_run, - .cleanup = &recoup_refresh_cleanup + .cleanup = &recoup_refresh_cleanup, + .traits = &recoup_refresh_traits }; return cmd; |