move responsibility of converting to wire subject to reserve_pub into wire plugin

This commit is contained in:
Christian Grothoff 2017-05-08 12:57:00 +02:00
parent 5e36e520a5
commit 2dcaffe451
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
3 changed files with 55 additions and 19 deletions

View File

@ -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,

View File

@ -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);
/**

View File

@ -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