diff options
Diffstat (limited to 'src/exchange/taler-exchange-httpd_link.c')
-rw-r--r-- | src/exchange/taler-exchange-httpd_link.c | 107 |
1 files changed, 41 insertions, 66 deletions
diff --git a/src/exchange/taler-exchange-httpd_link.c b/src/exchange/taler-exchange-httpd_link.c index 4738a435f..3d92a11a3 100644 --- a/src/exchange/taler-exchange-httpd_link.c +++ b/src/exchange/taler-exchange-httpd_link.c @@ -1,6 +1,6 @@ /* This file is part of TALER - Copyright (C) 2014-2019 Taler Systems SA + Copyright (C) 2014-2019, 2022 Taler Systems SA TALER is free software; you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software @@ -28,7 +28,6 @@ #include "taler-exchange-httpd_mhd.h" #include "taler-exchange-httpd_link.h" #include "taler-exchange-httpd_responses.h" -#include "taler-exchange-httpd_keystate.h" /** @@ -40,7 +39,7 @@ struct HTD_Context /** * Public key of the coin for which we are running link. */ - struct TALER_CoinSpendPublicKeyP coin_pub; + const struct TALER_CoinSpendPublicKeyP *coin_pub; /** * Json array with transfer data we collect. @@ -82,15 +81,23 @@ handle_link_data (void *cls, { json_t *obj; - obj = json_pack ("{s:o, s:o, s:o}", - "denom_pub", - GNUNET_JSON_from_rsa_public_key - (pos->denom_pub.rsa_public_key), - "ev_sig", - GNUNET_JSON_from_rsa_signature - (pos->ev_sig.rsa_signature), - "link_sig", - GNUNET_JSON_from_data_auto (&pos->orig_coin_link_sig)); + obj = GNUNET_JSON_PACK ( + TALER_JSON_pack_denom_pub ("denom_pub", + &pos->denom_pub), + TALER_JSON_pack_blinded_denom_sig ("ev_sig", + &pos->ev_sig), + GNUNET_JSON_pack_uint64 ("coin_idx", + pos->coin_refresh_offset), + TALER_JSON_pack_exchange_withdraw_values ("ewv", + &pos->alg_values), + GNUNET_JSON_pack_data_auto ("link_sig", + &pos->orig_coin_link_sig), + GNUNET_JSON_pack_allow_null ( + pos->have_nonce + ? GNUNET_JSON_pack_data_auto ("cs_nonce", + &pos->nonce) + : GNUNET_JSON_pack_string ("cs_nonce", + NULL))); if ( (NULL == obj) || (0 != json_array_append_new (list, @@ -103,11 +110,11 @@ handle_link_data (void *cls, { json_t *root; - root = json_pack ("{s:o, s:o}", - "new_coins", - list, - "transfer_pub", - GNUNET_JSON_from_data_auto (transfer_pub)); + root = GNUNET_JSON_PACK ( + GNUNET_JSON_pack_array_steal ("new_coins", + list), + GNUNET_JSON_pack_data_auto ("transfer_pub", + transfer_pub)); if ( (NULL == root) || (0 != json_array_append_new (ctx->mlist, @@ -116,7 +123,7 @@ handle_link_data (void *cls, } return; fail: - ctx->ec = TALER_EC_JSON_ALLOCATION_FAILURE; + ctx->ec = TALER_EC_GENERIC_JSON_ALLOCATION_FAILURE; json_decref (ctx->mlist); ctx->mlist = NULL; } @@ -133,7 +140,6 @@ fail: * * @param cls closure * @param connection MHD request which triggered the transaction - * @param session database session to use * @param[out] mhd_ret set to MHD response status for @a connection, * if transaction failed (!) * @return transaction status @@ -141,15 +147,13 @@ fail: static enum GNUNET_DB_QueryStatus link_transaction (void *cls, struct MHD_Connection *connection, - struct TALER_EXCHANGEDB_Session *session, - int *mhd_ret) + MHD_RESULT *mhd_ret) { struct HTD_Context *ctx = cls; enum GNUNET_DB_QueryStatus qs; qs = TEH_plugin->get_link_data (TEH_plugin->cls, - session, - &ctx->coin_pub, + ctx->coin_pub, &handle_link_data, ctx); if (NULL == ctx->mlist) @@ -157,65 +161,36 @@ 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) { *mhd_ret = TALER_MHD_reply_with_error (connection, MHD_HTTP_NOT_FOUND, - TALER_EC_LINK_COIN_UNKNOWN, - "coin_pub"); + TALER_EC_EXCHANGE_LINK_COIN_UNKNOWN, + NULL); return GNUNET_DB_STATUS_HARD_ERROR; } return qs; } -/** - * Handle a "/coins/$COIN_PUB/link" request. - * - * @param rh context of the handler - * @param connection the MHD connection to handle - * @param args array of additional options (length: 2, first is the coin_pub, second must be "link") - * @return MHD result code - */ -int -TEH_handler_link (const struct TEH_RequestHandler *rh, - struct MHD_Connection *connection, - const char *const args[2]) +MHD_RESULT +TEH_handler_link (struct TEH_RequestContext *rc, + const struct TALER_CoinSpendPublicKeyP *coin_pub) { - struct HTD_Context ctx; - int mhd_ret; + struct HTD_Context ctx = { + .coin_pub = coin_pub + }; + MHD_RESULT mhd_ret; - (void) rh; - memset (&ctx, - 0, - sizeof (ctx)); - if (GNUNET_OK != - GNUNET_STRINGS_string_to_data (args[0], - strlen (args[0]), - &ctx.coin_pub, - sizeof (ctx.coin_pub))) - { - GNUNET_break_op (0); - return TALER_MHD_reply_with_error (connection, - MHD_HTTP_BAD_REQUEST, - TALER_EC_COINS_INVALID_COIN_PUB, - "coin public key malformed"); - } ctx.mlist = json_array (); - if (NULL == ctx.mlist) - { - GNUNET_break (0); - return TALER_MHD_reply_with_error (connection, - MHD_HTTP_INTERNAL_SERVER_ERROR, - TALER_EC_JSON_ALLOCATION_FAILURE, - "json_array() call failed"); - } + GNUNET_assert (NULL != ctx.mlist); if (GNUNET_OK != - TEH_DB_run_transaction (connection, + TEH_DB_run_transaction (rc->connection, "run link", + TEH_MT_REQUEST_OTHER, &mhd_ret, &link_transaction, &ctx)) @@ -224,7 +199,7 @@ TEH_handler_link (const struct TEH_RequestHandler *rh, json_decref (ctx.mlist); return mhd_ret; } - mhd_ret = TALER_MHD_reply_json (connection, + mhd_ret = TALER_MHD_reply_json (rc->connection, ctx.mlist, MHD_HTTP_OK); json_decref (ctx.mlist); |