summaryrefslogtreecommitdiff
path: root/src/exchange/taler-exchange-httpd_link.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/exchange/taler-exchange-httpd_link.c')
-rw-r--r--src/exchange/taler-exchange-httpd_link.c107
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);