diff options
author | Christian Grothoff <christian@grothoff.org> | 2016-06-05 11:29:16 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2016-06-05 11:29:16 +0200 |
commit | 94d8d6b48e7fdaf7c7caf47a39faa8a33a72915f (patch) | |
tree | fadca84bfaabffae64e5c6eafa46d99cd328e7f3 | |
parent | 535a0c9988d7b6ecbd8352808ad5e0918fdc056e (diff) | |
download | merchant-94d8d6b48e7fdaf7c7caf47a39faa8a33a72915f.tar.gz merchant-94d8d6b48e7fdaf7c7caf47a39faa8a33a72915f.tar.bz2 merchant-94d8d6b48e7fdaf7c7caf47a39faa8a33a72915f.zip |
split /track handlers into two files
-rw-r--r-- | src/backend/Makefile.am | 3 | ||||
-rw-r--r-- | src/backend/taler-merchant-httpd.c | 3 | ||||
-rw-r--r-- | src/backend/taler-merchant-httpd_track-deposit.c | 237 | ||||
-rw-r--r-- | src/backend/taler-merchant-httpd_track-deposit.h (renamed from src/backend/taler-merchant-httpd_track.h) | 26 | ||||
-rw-r--r-- | src/backend/taler-merchant-httpd_track-transaction.c (renamed from src/backend/taler-merchant-httpd_track.c) | 186 | ||||
-rw-r--r-- | src/backend/taler-merchant-httpd_track-transaction.h | 45 |
6 files changed, 293 insertions, 207 deletions
diff --git a/src/backend/Makefile.am b/src/backend/Makefile.am index 1e2f1d1b..cd0fa050 100644 --- a/src/backend/Makefile.am +++ b/src/backend/Makefile.am @@ -21,7 +21,8 @@ taler_merchant_httpd_SOURCES = \ taler-merchant-httpd_exchanges.c taler-merchant-httpd_exchanges.h \ taler-merchant-httpd_contract.c taler-merchant-httpd_contract.h \ taler-merchant-httpd_pay.c taler-merchant-httpd_pay.h \ - taler-merchant-httpd_track.c taler-merchant-httpd_track.h + taler-merchant-httpd_track-deposit.c taler-merchant-httpd_track-deposit.h \ + taler-merchant-httpd_track-transaction.c taler-merchant-httpd_track-transaction.h taler_merchant_httpd_LDADD = \ diff --git a/src/backend/taler-merchant-httpd.c b/src/backend/taler-merchant-httpd.c index 0785d635..5f0a887c 100644 --- a/src/backend/taler-merchant-httpd.c +++ b/src/backend/taler-merchant-httpd.c @@ -37,7 +37,8 @@ #include "taler-merchant-httpd_exchanges.h" #include "taler-merchant-httpd_contract.h" #include "taler-merchant-httpd_pay.h" -#include "taler-merchant-httpd_track.h" +#include "taler-merchant-httpd_track-deposit.h" +#include "taler-merchant-httpd_track-transaction.h" /** diff --git a/src/backend/taler-merchant-httpd_track-deposit.c b/src/backend/taler-merchant-httpd_track-deposit.c new file mode 100644 index 00000000..970bd576 --- /dev/null +++ b/src/backend/taler-merchant-httpd_track-deposit.c @@ -0,0 +1,237 @@ +/* + This file is part of TALER + (C) 2014, 2015, 2016 INRIA + + 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 + Foundation; either version 3, or (at your option) any later version. + + TALER is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + TALER; see the file COPYING. If not, If not, see <http://www.gnu.org/licenses/> +*/ +/** + * @file backend/taler-merchant-httpd_track-deposit.c + * @brief implement API for tracking deposits and wire transfers + * @author Marcello Stanisci + * @author Christian Grothoff + */ +#include "platform.h" +#include <jansson.h> +#include <taler/taler_signatures.h> +#include <taler/taler_json_lib.h> +#include "taler-merchant-httpd.h" +#include "taler-merchant-httpd_mhd.h" +#include "taler-merchant-httpd_parsing.h" +#include "taler-merchant-httpd_auditors.h" +#include "taler-merchant-httpd_exchanges.h" +#include "taler-merchant-httpd_responses.h" +#include "taler-merchant-httpd_track_deposit.h" + + +/** + * How long to wait before giving up processing with the exchange? + */ +#define TRACK_TIMEOUT (GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30)) + +extern char *TMH_merchant_currency_string; + + +/** + * 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; + + /** + * Length of the @e details array. + */ + unsigned int details_length; + + /** + * HTTP connection we are handling. + */ + struct MHD_Connection *connection; + + /** + * Response code to return. + */ + unsigned int response_code; + + /** + * + */ + json_t *json; + + /** + * Error message. + */ + const char *error; + +}; + + +/** + * 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_t *) json); + rctx->response_code = http_status; + MHD_resume_connection (rctx->connection); + return; + } + rctx->details_length = details_length; + rctx->details = GNUNET_new_array (details_length, + struct TALER_WireDepositDetails); + 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_resume_connection (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. + * + * @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_deposit (struct TMH_RequestHandler *rh, + struct MHD_Connection *connection, + void **connection_cls, + const char *upload_data, + size_t *upload_data_size) +{ + struct DepositTrackContext *rctx; + const char *str; + const char *uri; + + rctx = *connection_cls; + 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), + &rctx->wtid, + sizeof (rctx->wtid))) + return TMH_RESPONSE_reply_external_error (connection, + "wtid argument malformed"); + rctx->eh = TALER_EXCHANGE_connect (NULL /* FIXME */, + uri, + &cert_cb, + rctx, + TALER_EXCHANGE_OPTION_END); + + GNUNET_break (0); + return MHD_NO; +} + +/* end of taler-merchant-httpd_track-deposit.c */ diff --git a/src/backend/taler-merchant-httpd_track.h b/src/backend/taler-merchant-httpd_track-deposit.h index d64cba47..93132b6e 100644 --- a/src/backend/taler-merchant-httpd_track.h +++ b/src/backend/taler-merchant-httpd_track-deposit.h @@ -14,12 +14,13 @@ TALER; see the file COPYING. If not, If not, see <http://www.gnu.org/licenses/> */ /** - * @file backend/taler-merchant-httpd_track.h - * @brief headers for /track/{deposit,wtid} handler + * @file backend/taler-merchant-httpd_track-deposit.h + * @brief headers for /track/deposit handler + * @author Christian Grothoff * @author Marcello Stanisci */ -#ifndef TALER_MERCHANT_HTTPD_TRACK_H -#define TALER_MERCHANT_HTTPD_TRACK_H +#ifndef TALER_MERCHANT_HTTPD_TRACK_DEPOSIT_H +#define TALER_MERCHANT_HTTPD_TRACK_DEPOSIT_H #include <microhttpd.h> #include "taler-merchant-httpd.h" @@ -42,22 +43,5 @@ MH_handler_track_deposit (struct TMH_RequestHandler *rh, 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/backend/taler-merchant-httpd_track.c b/src/backend/taler-merchant-httpd_track-transaction.c index 024fff38..b64e8204 100644 --- a/src/backend/taler-merchant-httpd_track.c +++ b/src/backend/taler-merchant-httpd_track-transaction.c @@ -14,7 +14,7 @@ TALER; see the file COPYING. If not, If not, see <http://www.gnu.org/licenses/> */ /** - * @file backend/taler-merchant-httpd_track.c + * @file backend/taler-merchant-httpd_track-transaction.c * @brief implement API for tracking deposits and wire transfers * @author Marcello Stanisci * @author Christian Grothoff @@ -29,7 +29,7 @@ #include "taler-merchant-httpd_auditors.h" #include "taler-merchant-httpd_exchanges.h" #include "taler-merchant-httpd_responses.h" -#include "taler-merchant-httpd_track.h" +#include "taler-merchant-httpd_track-transaction.h" /** @@ -40,188 +40,6 @@ extern char *TMH_merchant_currency_string; -/** - * 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; - - struct MHD_Connection *connection; - - unsigned int response_code; - - json_t *json; - - const char *error; - -}; - - -/** - * 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_t *) json); - rctx->response_code = http_status; - MHD_resume_connection (rctx->connection); - return; - } - rctx->details_length = details_length; - rctx->details = GNUNET_new_array (details_length, - struct TALER_WireDepositDetails); - 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_resume_connection (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. - * - * @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_deposit (struct TMH_RequestHandler *rh, - struct MHD_Connection *connection, - void **connection_cls, - const char *upload_data, - size_t *upload_data_size) -{ - struct DepositTrackContext *rctx; - const char *str; - const char *uri; - - rctx = *connection_cls; - 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), - &rctx->wtid, - sizeof (rctx->wtid))) - return TMH_RESPONSE_reply_external_error (connection, - "wtid argument malformed"); - rctx->eh = TALER_EXCHANGE_connect (NULL /* FIXME */, - uri, - &cert_cb, - rctx, - TALER_EXCHANGE_OPTION_END); - - GNUNET_break (0); - return MHD_NO; -} - /** * Information we keep for each coin in a /track/transaction operation. diff --git a/src/backend/taler-merchant-httpd_track-transaction.h b/src/backend/taler-merchant-httpd_track-transaction.h new file mode 100644 index 00000000..fb9027dc --- /dev/null +++ b/src/backend/taler-merchant-httpd_track-transaction.h @@ -0,0 +1,45 @@ +/* + This file is part of TALER + (C) 2014, 2015 GNUnet e.V. + + TALER is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + TALER is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + TALER; see the file COPYING. If not, If not, see <http://www.gnu.org/licenses/> +*/ +/** + * @file backend/taler-merchant-httpd_track-transaction.h + * @brief headers for /track/transaction handler + * @author Christian Grothoff + * @author Marcello Stanisci + */ +#ifndef TALER_MERCHANT_HTTPD_TRACK_TRANSACTION_H +#define TALER_MERCHANT_HTTPD_TRACK_TRANSACTION_H +#include <microhttpd.h> +#include "taler-merchant-httpd.h" + +/** + * 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 |