diff options
author | Christian Grothoff <christian@grothoff.org> | 2016-06-03 17:00:51 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2016-06-03 17:00:51 +0200 |
commit | 506da5872bfda9a5c782a8e3af7386e396d9f8a4 (patch) | |
tree | 66ab418c7306d961a57c28b2b150adb2f044422d | |
parent | bd6275a39a40c302dfa889339238b884b2265c89 (diff) | |
download | merchant-506da5872bfda9a5c782a8e3af7386e396d9f8a4.tar.gz merchant-506da5872bfda9a5c782a8e3af7386e396d9f8a4.tar.bz2 merchant-506da5872bfda9a5c782a8e3af7386e396d9f8a4.zip |
towards /track implementations
-rw-r--r-- | src/backend/taler-merchant-httpd.c | 6 | ||||
-rw-r--r-- | src/backend/taler-merchant-httpd_track.c | 209 | ||||
-rw-r--r-- | src/backend/taler-merchant-httpd_track.h | 22 | ||||
-rw-r--r-- | src/include/taler_merchant_service.h | 3 | ||||
-rw-r--r-- | src/include/taler_merchantdb_plugin.h | 24 |
5 files changed, 249 insertions, 15 deletions
diff --git a/src/backend/taler-merchant-httpd.c b/src/backend/taler-merchant-httpd.c index 72d5fcc3..978a3942 100644 --- a/src/backend/taler-merchant-httpd.c +++ b/src/backend/taler-merchant-httpd.c @@ -198,6 +198,12 @@ url_handler (void *cls, { "/track/deposit", NULL, "text/plain", "Only GET is allowed", 0, &TMH_MHD_handler_static_response, MHD_HTTP_OK}, + { "/track/transaction", MHD_HTTP_METHOD_GET, "application/json", + NULL, 0, + &MH_handler_track_transaction, MHD_HTTP_OK}, + { "/track/transaction", NULL, "text/plain", + "Only GET is allowed", 0, + &TMH_MHD_handler_static_response, MHD_HTTP_OK}, {NULL, NULL, NULL, NULL, 0, 0 } }; diff --git a/src/backend/taler-merchant-httpd_track.c b/src/backend/taler-merchant-httpd_track.c index 47e5461a..54a8b09d 100644 --- a/src/backend/taler-merchant-httpd_track.c +++ b/src/backend/taler-merchant-httpd_track.c @@ -17,6 +17,7 @@ * @file backend/taler-merchant-httpd_track.c * @brief implement API for tracking deposits and wire transfers * @author Marcello Stanisci + * @author Christian Grothoff */ #include "platform.h" #include <jansson.h> @@ -34,9 +35,126 @@ extern char *TMH_merchant_currency_string; /** - * Manages a /track/deposit call, thus it calls the /wire/deposit + * Context used for handing /track/deposit requests. + */ +struct DepositTrackContext +{ + + /** + * This MUST be first! + */ + struct TM_HandlerContext hc; + + /** + * Handle to the exchange. + */ + struct TALER_EXCHANGE_Handle *eh; + + /** + * Handle for the /wire/deposits request. + */ + struct TALER_EXCHANGE_WireDepositsHandle *wdh; + + /** + * + */ + struct TALER_WireDepositDetails *details; + + /** + * Argument for the /wire/deposits request. + */ + struct TALER_WireTransferIdentifierRawP wtid; + + /** + * + */ + unsigned int details_length; + +}; + + +/** + * Function called with detailed wire transfer data, including all + * of the coin transactions that were combined into the wire transfer. + * + * @param cls closure + * @param http_status HTTP status code we got, 0 on exchange protocol violation + * @param json original json reply (may include signatures, those have then been + * validated already) + * @param wtid extracted wire transfer identifier, or NULL if the exchange could + * not provide any (set only if @a http_status is #MHD_HTTP_OK) + * @param total_amount total amount of the wire transfer, or NULL if the exchange could + * not provide any @a wtid (set only if @a http_status is #MHD_HTTP_OK) + * @param details_length length of the @a details array + * @param details array with details about the combined transactions + */ +static void +wire_deposit_cb (void *cls, + unsigned int http_status, + const json_t *json, + const struct GNUNET_HashCode *h_wire, + const struct TALER_Amount *total_amount, + unsigned int details_length, + const struct TALER_WireDepositDetails *details) +{ + struct DepositTrackContext *rctx = cls; + unsigned int i; + + rctx->wdh = NULL; + if (NULL == total_amount) + { + rctx->error = "failed to obtain /wire/deposit response from exchange"; + rctx->json = json_incref (json); + rctx->response_code = http_status; + MHD_connection_resume (rctx->connection); + return; + } + rctx->details_length = details_length; + rctx->details = GNUNET_new_array (struct TALER_WireDepositDetails, + details_length); + memcpy (rctx->details, + details, + details_length * sizeof (struct TALER_WireDepositDetails)); + GNUNET_break (0); + /* FIXME: now check that these details match what we have in + our database... */ + + +} + + +/** + * Function called with information about who is auditing + * a particular exchange and what key the exchange is using. + * + * @param cls closure + * @param keys information about the various keys used + * by the exchange, NULL if /keys failed + */ +static void +cert_cb (void *cls, + const struct TALER_EXCHANGE_Keys *keys) +{ + struct DepositTrackContext *rctx = cls; + + if (NULL == keys) + { + rctx->error = "failed to obtain /keys from exchange"; + rctx->response_code = MHD_HTTP_SERVICE_UNAVAILABLE; + MHD_connection_resume (rctx->connection); + return; + } + rctx->wdh = TALER_EXCHANGE_wire_deposits (rctx->eh, + &rctx->wtid, + &wire_deposit_cb, + rctx); +} + + +/** + * Manages a /track/wtid call, thus it calls the /track/deposit * offered by the exchange in order to return the set of deposits - * (of coins) associated with a given wire transfer + * (of coins) associated with a given wire transfer. * * @param rh context of the handler * @param connection the MHD connection to handle @@ -52,19 +170,80 @@ MH_handler_track_deposit (struct TMH_RequestHandler *rh, const char *upload_data, size_t *upload_data_size) { - static struct TMH_RequestHandler pong = - { - "", NULL, "text/html", - "/track/deposit served\n", 0, - &TMH_MHD_handler_static_response, MHD_HTTP_OK - }; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "serving /track/deposit\n"); - return TMH_MHD_handler_static_response (&pong, - connection, - connection_cls, - upload_data, - upload_data_size); + struct DepositTrackContext *rctx; + const char *str; + const char *uri; + + rctx = *connection_cls; + if (NULL != rctx) + { + if (NULL == rctx-> + } + uri = MHD_lookup_connection_value (connection, + MHD_GET_ARGUMENT_KIND, + "exchange"); + if (NULL == uri) + return TMH_RESPONSE_reply_external_error (connection, + "exchange argument missing"); + str = MHD_lookup_connection_value (connection, + MHD_GET_ARGUMENT_KIND, + "wtid"); + if (NULL == str) + return TMH_RESPONSE_reply_external_error (connection, + "wtid argument missing"); + if (GNUNET_OK != + GNUNET_STRINGS_string_to_data (str, + strlen (str), + &wtid, + sizeof (wtid))) + return TMH_RESPONSE_reply_external_error (connection, + "wtid argument malformed"); + eh = TALER_EXCHANGE_connect (ctx, + url, + &cert_cb, + rctx, + TALER_EXCHANGE_OPTION_END); + + GNUNET_break (0); + return MHD_NO; +} + + +/** + * Handle a "/track/transaction" request. + * + * @param rh context of the handler + * @param connection the MHD connection to handle + * @param[in,out] connection_cls the connection's closure (can be updated) + * @param upload_data upload data + * @param[in,out] upload_data_size number of bytes (left) in @a upload_data + * @return MHD result code + */ +int +MH_handler_track_transaction (struct TMH_RequestHandler *rh, + struct MHD_Connection *connection, + void **connection_cls, + const char *upload_data, + size_t *upload_data_size) +{ + unsigned long long transaction_id; + const char *str; + + str = MHD_lookup_connection_value (connection, + MHD_GET_ARGUMENT_KIND, + "id"); + if (NULL == str) + return TMH_RESPONSE_reply_external_error (connection, + "id argument missing"); + if (1 != + sscanf (str, + "%llu", + str)) + return TMH_RESPONSE_reply_external_error (connection, + "id argument must be a number"); + GNUNET_break (0); + return MHD_NO; } + /* end of taler-merchant-httpd_contract.c */ diff --git a/src/backend/taler-merchant-httpd_track.h b/src/backend/taler-merchant-httpd_track.h index 51dde1b9..d64cba47 100644 --- a/src/backend/taler-merchant-httpd_track.h +++ b/src/backend/taler-merchant-httpd_track.h @@ -18,6 +18,8 @@ * @brief headers for /track/{deposit,wtid} handler * @author Marcello Stanisci */ +#ifndef TALER_MERCHANT_HTTPD_TRACK_H +#define TALER_MERCHANT_HTTPD_TRACK_H #include <microhttpd.h> #include "taler-merchant-httpd.h" @@ -39,3 +41,23 @@ MH_handler_track_deposit (struct TMH_RequestHandler *rh, void **connection_cls, const char *upload_data, size_t *upload_data_size); + +/** + * Handle a "/track/transaction" request. + * + * @param rh context of the handler + * @param connection the MHD connection to handle + * @param[in,out] connection_cls the connection's closure (can be updated) + * @param upload_data upload data + * @param[in,out] upload_data_size number of bytes (left) in @a upload_data + * @return MHD result code + */ +int +MH_handler_track_transaction (struct TMH_RequestHandler *rh, + struct MHD_Connection *connection, + void **connection_cls, + const char *upload_data, + size_t *upload_data_size); + + +#endif diff --git a/src/include/taler_merchant_service.h b/src/include/taler_merchant_service.h index 84bfc3e0..d7fd6244 100644 --- a/src/include/taler_merchant_service.h +++ b/src/include/taler_merchant_service.h @@ -339,6 +339,9 @@ void TALER_MERCHANT_pay_cancel (struct TALER_MERCHANT_Pay *ph); +typedef void +(*TALER_MERCHANT_TrackDepositCallback)(void *cls, + ...); /** * Request backend to return deposits associated with a given wtid. diff --git a/src/include/taler_merchantdb_plugin.h b/src/include/taler_merchantdb_plugin.h index 1239b13c..ca7870d7 100644 --- a/src/include/taler_merchantdb_plugin.h +++ b/src/include/taler_merchantdb_plugin.h @@ -30,6 +30,12 @@ */ struct TALER_MERCHANTDB_Plugin; + +typedef void +(*TALER_MERCHANTDB_PaymentCallback)(void *cls, + ...); + + /** * Handle to interact with the database. */ @@ -90,6 +96,7 @@ struct TALER_MERCHANTDB_Plugin const struct TALER_CoinSpendPublicKeyP *coin_pub, const json_t *exchange_proof); + /** * Check whether a payment has already been stored * @@ -104,5 +111,22 @@ struct TALER_MERCHANTDB_Plugin (*check_payment) (void *cls, uint64_t transaction_id); + + /** + * Lookup information about a payment by transaction ID. + * + * @param cls closure + * @param transaction_id key for the search + * @param cb function to call with payment data + * @param cb_cls closure for @a cb + * @return #GNUNET_OK on success, #GNUNET_NO if transaction Id is unknown, + * #GNUNET_SYSERR on hard errors + */ + int + (*find_payment) (void *cls, + uint64_t transaction_id, + TALER_MERCHANTDB_PaymentCallback cb, + void *cb_cls); + }; #endif |