summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2016-06-03 17:00:51 +0200
committerChristian Grothoff <christian@grothoff.org>2016-06-03 17:00:51 +0200
commit506da5872bfda9a5c782a8e3af7386e396d9f8a4 (patch)
tree66ab418c7306d961a57c28b2b150adb2f044422d
parentbd6275a39a40c302dfa889339238b884b2265c89 (diff)
downloadmerchant-506da5872bfda9a5c782a8e3af7386e396d9f8a4.tar.gz
merchant-506da5872bfda9a5c782a8e3af7386e396d9f8a4.tar.bz2
merchant-506da5872bfda9a5c782a8e3af7386e396d9f8a4.zip
towards /track implementations
-rw-r--r--src/backend/taler-merchant-httpd.c6
-rw-r--r--src/backend/taler-merchant-httpd_track.c209
-rw-r--r--src/backend/taler-merchant-httpd_track.h22
-rw-r--r--src/include/taler_merchant_service.h3
-rw-r--r--src/include/taler_merchantdb_plugin.h24
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