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 @@ -41,6 +41,35 @@ typedef void size_t buf_size); +/** + * 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