aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2017-05-08 12:57:00 +0200
committerChristian Grothoff <christian@grothoff.org>2017-05-08 12:57:00 +0200
commit2dcaffe4510410e568d637c1e251e230e2df41d9 (patch)
tree142801bc2b10b60ca367da9a2c99ee38ed36684e
parent5e36e520a5a9d1461cf0efaee777238a46f1890b (diff)
move responsibility of converting to wire subject to reserve_pub into wire plugin
-rw-r--r--src/exchange/taler-exchange-wirewatch.c21
-rw-r--r--src/include/taler_wire_plugin.h31
-rw-r--r--src/wire/plugin_wire_test.c22
3 files changed, 55 insertions, 19 deletions
diff --git a/src/exchange/taler-exchange-wirewatch.c b/src/exchange/taler-exchange-wirewatch.c
index a7f3cd739..918eb597a 100644
--- a/src/exchange/taler-exchange-wirewatch.c
+++ b/src/exchange/taler-exchange-wirewatch.c
@@ -210,18 +210,17 @@ history_cb (void *cls,
enum TALER_BANK_Direction dir,
const void *row_off,
size_t row_off_size,
- const struct TALER_BANK_TransferDetails *details)
+ const struct TALER_WIRE_TransferDetails *details)
{
struct TALER_EXCHANGEDB_Session *session = cls;
int ret;
- struct TALER_ReservePublicKeyP reserve_pub;
if (TALER_BANK_DIRECTION_NONE == dir)
{
hh = NULL;
- /* FIXME: commit last_off to DB! */
-
+ /* FIXME: commit last_off to DB!?
+ (or just select via 'reserves_in' by SERIAL ID!?) */
ret = db_plugin->commit (db_plugin->cls,
session);
if (GNUNET_OK == ret)
@@ -239,22 +238,10 @@ history_cb (void *cls,
NULL);
return GNUNET_OK; /* will be ignored anyway */
}
- /* TODO: We should expect a checksum! */
- if (GNUNET_OK !=
- GNUNET_STRINGS_string_to_data (details->wire_transfer_subject,
- strlen (details->wire_transfer_subject),
- &reserve_pub,
- sizeof (reserve_pub)))
- {
- /* FIXME: need way to wire money back immediately... */
- GNUNET_break (0); // not implemented
-
- return GNUNET_OK;
- }
// FIXME: create json!
ret = db_plugin->reserves_in_insert (db_plugin->cls,
session,
- &reserve_pub,
+ &details->reserve_pub,
&details->amount,
details->execution_date,
details->account_details,
diff --git a/src/include/taler_wire_plugin.h b/src/include/taler_wire_plugin.h
index 5b2bec3c0..4134afc00 100644
--- a/src/include/taler_wire_plugin.h
+++ b/src/include/taler_wire_plugin.h
@@ -42,6 +42,35 @@ typedef void
/**
+ * Details about a valid wire transfer to the exchange.
+ * It is the plugin's responsibility to filter and undo
+ * invalid transfers.
+ */
+struct TALER_WIRE_TransferDetails
+{
+ /**
+ * Amount that was transferred
+ */
+ struct TALER_Amount amount;
+
+ /**
+ * Time of the the transfer
+ */
+ struct GNUNET_TIME_Absolute execution_date;
+
+ /**
+ * Reserve public key that was encoded in the wire transfer subject
+ */
+ struct TALER_ReservePublicKeyP reserve_pub;
+
+ /**
+ * The other account that was involved
+ */
+ json_t *account_details;
+};
+
+
+/**
* Callbacks of this type are used to serve the result of asking
* the bank for the transaction history.
*
@@ -57,7 +86,7 @@ typedef int
enum TALER_BANK_Direction dir,
const void *row_off,
size_t row_off_size,
- const struct TALER_BANK_TransferDetails *details);
+ const struct TALER_WIRE_TransferDetails *details);
/**
diff --git a/src/wire/plugin_wire_test.c b/src/wire/plugin_wire_test.c
index 6f0acce4f..de3a6aba6 100644
--- a/src/wire/plugin_wire_test.c
+++ b/src/wire/plugin_wire_test.c
@@ -818,16 +818,36 @@ bhist_cb (void *cls,
{
struct TALER_WIRE_HistoryHandle *whh = cls;
uint64_t bserial_id = GNUNET_htonll (serial_id);
+ struct TALER_WIRE_TransferDetails wd;
if (MHD_HTTP_OK == http_status)
{
+ wd.amount = details->amount;
+ wd.execution_date = details->execution_date;
+ /* NOTE: For a real bank, the subject should include a checksum! */
+ if (GNUNET_OK !=
+ GNUNET_STRINGS_string_to_data (details->wire_transfer_subject,
+ strlen (details->wire_transfer_subject),
+ &wd.reserve_pub,
+ sizeof (wd.reserve_pub)))
+ {
+ GNUNET_break (0);
+ /* NOTE: for a "real" bank, we would want to trigger logic to undo the
+ wire transfer. However, for the "demo" bank, it should currently
+ be "impossible" to do wire transfers with invalid subjects, and
+ equally we thus don't need to undo them (and there is no API to do
+ that nicely either right now). So we don't handle this case for now. */
+ return;
+ }
+ wd.account_details = details->account_details;
+
if ( (NULL != whh->hres_cb) &&
(GNUNET_OK !=
whh->hres_cb (whh->hres_cb_cls,
dir,
&bserial_id,
sizeof (bserial_id),
- details)) )
+ &wd)) )
whh->hres_cb = NULL;
}
else