modify fakebank API to allow arbitrary subjects, not just well-fromed WTIDs

This commit is contained in:
Christian Grothoff 2017-06-11 15:25:59 +02:00
parent 1eb739c670
commit 16b7c26605
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
6 changed files with 154 additions and 73 deletions

View File

@ -65,7 +65,7 @@ struct Transaction
/**
* Subject of the transfer.
*/
struct TALER_WireTransferIdentifierRawP wtid;
char *subject;
/**
* Base URL of the exchange.
@ -119,7 +119,7 @@ struct TALER_FAKEBANK_Handle
/**
* Check that the @a want_amount was transferred from
* the @a want_debit to the @a want_credit account. If
* so, set the @a wtid to the transfer identifier.
* so, set the @a subject to the transfer identifier.
* If not, return #GNUNET_SYSERR.
*
* @param h bank instance
@ -137,11 +137,9 @@ TALER_FAKEBANK_check (struct TALER_FAKEBANK_Handle *h,
uint64_t want_debit,
uint64_t want_credit,
const char *exchange_base_url,
struct TALER_WireTransferIdentifierRawP *wtid)
char **subject)
{
struct Transaction *t;
for (t = h->transactions_head; NULL != t; t = t->next)
for (struct Transaction *t = h->transactions_head; NULL != t; t = t->next)
{
if ( (want_debit == t->debit_account) &&
(want_credit == t->credit_account) &&
@ -153,7 +151,7 @@ TALER_FAKEBANK_check (struct TALER_FAKEBANK_Handle *h,
GNUNET_CONTAINER_DLL_remove (h->transactions_head,
h->transactions_tail,
t);
*wtid = t->wtid;
*subject = t->subject;
GNUNET_free (t->exchange_base_url);
GNUNET_free (t);
return GNUNET_OK;
@ -161,7 +159,7 @@ TALER_FAKEBANK_check (struct TALER_FAKEBANK_Handle *h,
}
fprintf (stderr,
"Did not find matching transaction!\nI have:\n");
for (t = h->transactions_head; NULL != t; t = t->next)
for (struct Transaction *t = h->transactions_head; NULL != t; t = t->next)
{
char *s;
@ -178,6 +176,49 @@ TALER_FAKEBANK_check (struct TALER_FAKEBANK_Handle *h,
}
/**
* Tell the fakebank to create another wire transfer.
*
* @param h fake bank handle
* @param debit_account account to debit
* @param credit_account account to credit
* @param amount amount to transfer
* @param subject wire transfer subject to use
* @param exchange_base_url exchange URL
* @return serial_id of the transfer
*/
uint64_t
TALER_FAKEBANK_make_transfer (struct TALER_FAKEBANK_Handle *h,
uint64_t debit_account,
uint64_t credit_account,
const struct TALER_Amount *amount,
const char *subject,
const char *exchange_base_url)
{
struct Transaction *t;
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Making transfer from %llu to %llu over %s and subject %s\n",
(unsigned long long) debit_account,
(unsigned long long) credit_account,
TALER_amount2s (amount),
subject);
t = GNUNET_new (struct Transaction);
t->debit_account = debit_account;
t->credit_account = credit_account;
t->amount = *amount;
t->exchange_base_url = GNUNET_strdup (exchange_base_url);
t->serial_id = ++h->serial_counter;
t->date = GNUNET_TIME_absolute_get ();
t->subject = GNUNET_strdup (subject);
GNUNET_TIME_round_abs (&t->date);
GNUNET_CONTAINER_DLL_insert_tail (h->transactions_head,
h->transactions_tail,
t);
return t->serial_id;
}
/**
* Check that no wire transfers were ordered (or at least none
* that have not been taken care of via #TALER_FAKEBANK_check()).
@ -228,6 +269,7 @@ TALER_FAKEBANK_stop (struct TALER_FAKEBANK_Handle *h)
GNUNET_CONTAINER_DLL_remove (h->transactions_head,
h->transactions_tail,
t);
GNUNET_free (t->subject);
GNUNET_free (t->exchange_base_url);
GNUNET_free (t);
}
@ -291,9 +333,9 @@ handle_admin_add_incoming (struct TALER_FAKEBANK_Handle *h,
{
enum GNUNET_JSON_PostResult pr;
json_t *json;
struct Transaction *t;
struct MHD_Response *resp;
int ret;
uint64_t serial_id;
pr = GNUNET_JSON_post_parser (REQUEST_BUFFER_MAX,
con_cls,
@ -316,14 +358,17 @@ handle_admin_add_incoming (struct TALER_FAKEBANK_Handle *h,
case GNUNET_JSON_PR_SUCCESS:
break;
}
t = GNUNET_new (struct Transaction);
{
const char *wtid;
uint64_t debit_account;
uint64_t credit_account;
const char *base_url;
struct TALER_Amount amount;
struct GNUNET_JSON_Specification spec[] = {
GNUNET_JSON_spec_fixed_auto ("wtid", &t->wtid),
GNUNET_JSON_spec_uint64 ("debit_account", &t->debit_account),
GNUNET_JSON_spec_uint64 ("credit_account", &t->credit_account),
TALER_JSON_spec_amount ("amount", &t->amount),
GNUNET_JSON_spec_string ("wtid", &wtid),
GNUNET_JSON_spec_uint64 ("debit_account", &debit_account),
GNUNET_JSON_spec_uint64 ("credit_account", &credit_account),
TALER_JSON_spec_amount ("amount", &amount),
GNUNET_JSON_spec_string ("exchange_url", &base_url),
GNUNET_JSON_spec_end ()
};
@ -336,19 +381,18 @@ handle_admin_add_incoming (struct TALER_FAKEBANK_Handle *h,
json_decref (json);
return MHD_NO;
}
t->exchange_base_url = GNUNET_strdup (base_url);
t->serial_id = ++h->serial_counter;
t->date = GNUNET_TIME_absolute_get ();
GNUNET_TIME_round_abs (&t->date);
GNUNET_CONTAINER_DLL_insert_tail (h->transactions_head,
h->transactions_tail,
t);
serial_id = TALER_FAKEBANK_make_transfer (h,
debit_account,
credit_account,
&amount,
wtid,
base_url);
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"Receiving incoming wire transfer: %llu->%llu from %s\n",
(unsigned long long) debit_account,
(unsigned long long) credit_account,
base_url);
}
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"Receiving incoming wire transfer: %llu->%llu from %s\n",
(unsigned long long) t->debit_account,
(unsigned long long) t->credit_account,
t->exchange_base_url);
json_decref (json);
/* Finally build response object */
@ -358,7 +402,7 @@ handle_admin_add_incoming (struct TALER_FAKEBANK_Handle *h,
json = json_pack ("{s:I}",
"serial_id",
(json_int_t) t->serial_id);
(json_int_t) serial_id);
json_str = json_dumps (json,
JSON_INDENT(2));
json_decref (json);
@ -514,17 +558,10 @@ handle_history (struct TALER_FAKEBANK_Handle *h,
continue;
}
{
char *ws;
ws = GNUNET_STRINGS_data_to_string_alloc (&pos->wtid,
sizeof (pos->wtid));
GNUNET_asprintf (&subject,
"%s %s",
ws,
pos->exchange_base_url);
GNUNET_free (ws);
}
GNUNET_asprintf (&subject,
"%s %s",
pos->subject,
pos->exchange_base_url);
trans = json_pack ("{s:I, s:o, s:o, s:s, s:I, s:s}",
"row_id", (json_int_t) pos->serial_id,
"date", GNUNET_JSON_from_time_abs (pos->date),

View File

@ -572,7 +572,9 @@ history_cb (void *cls,
"Expected history of length %llu, got %llu\n",
(unsigned long long) total,
(unsigned long long) cmd->details.history.results_obtained);
print_expected (h, total, UINT_MAX);
print_expected (h,
total,
UINT_MAX);
free_history (h,
total);
fail (is);
@ -621,7 +623,6 @@ interpreter_run (void *cls)
struct InterpreterState *is = cls;
struct TBI_Command *cmd = &is->commands[is->ip];
const struct TBI_Command *ref;
struct TALER_WireTransferIdentifierRawP wtid;
struct TALER_Amount amount;
const struct GNUNET_SCHEDULER_TaskContext *tc;
struct TALER_BANK_AuthenticationData auth;
@ -719,25 +720,34 @@ interpreter_run (void *cls)
GNUNET_assert (GNUNET_OK ==
TALER_string_to_amount (ref->details.admin_add_incoming.amount,
&amount));
if (GNUNET_OK !=
TALER_FAKEBANK_check (is->fakebank,
&amount,
ref->details.admin_add_incoming.debit_account_no,
ref->details.admin_add_incoming.credit_account_no,
ref->details.admin_add_incoming.exchange_base_url,
&wtid))
{
GNUNET_break (0);
fail (is);
return;
}
if (0 != memcmp (&wtid,
&ref->details.admin_add_incoming.wtid,
sizeof (wtid)))
{
GNUNET_break (0);
fail (is);
return;
char *subject;
char *expect;
if (GNUNET_OK !=
TALER_FAKEBANK_check (is->fakebank,
&amount,
ref->details.admin_add_incoming.debit_account_no,
ref->details.admin_add_incoming.credit_account_no,
ref->details.admin_add_incoming.exchange_base_url,
&subject))
{
GNUNET_break (0);
fail (is);
return;
}
expect = GNUNET_STRINGS_data_to_string_alloc (&ref->details.admin_add_incoming.wtid,
sizeof (ref->details.admin_add_incoming.wtid));
if (0 != strcmp (subject, expect))
{
GNUNET_free (expect);
GNUNET_free (subject);
GNUNET_break (0);
fail (is);
return;
}
GNUNET_free (subject);
GNUNET_free (expect);
}
is->ip++;
is->task = GNUNET_SCHEDULER_add_now (&interpreter_run,

View File

@ -636,9 +636,9 @@ struct Command
const char *exchange_base_url;
/**
* Set (!) to the wire transfer identifier observed.
* Set (!) to the wire transfer subject observed.
*/
struct TALER_WireTransferIdentifierRawP wtid;
char *subject;
} check_bank_transfer;
@ -1805,18 +1805,24 @@ deposit_wtid_cb (void *cls,
if (NULL != cmd->details.deposit_wtid.bank_transfer_ref)
{
const struct Command *ref;
char *ws;
ws = GNUNET_STRINGS_data_to_string_alloc (wtid,
sizeof (*wtid));
ref = find_command (is,
cmd->details.deposit_wtid.bank_transfer_ref);
GNUNET_assert (NULL != ref);
if (0 != memcmp (wtid,
&ref->details.check_bank_transfer.wtid,
sizeof (struct TALER_WireTransferIdentifierRawP)))
if (0 != strcmp (ws,
ref->details.check_bank_transfer.subject))
{
GNUNET_break (0);
GNUNET_free (ws);
fail (is);
return;
}
GNUNET_free (ws);
}
break;
case MHD_HTTP_ACCEPTED:
@ -2496,7 +2502,11 @@ interpreter_run (void *cls)
cmd->details.wire_deposits.wtid = ref->details.deposit_wtid.wtid;
break;
case OC_CHECK_BANK_TRANSFER:
cmd->details.wire_deposits.wtid = ref->details.check_bank_transfer.wtid;
GNUNET_assert (GNUNET_OK ==
GNUNET_STRINGS_string_to_data (ref->details.check_bank_transfer.subject,
strlen (ref->details.check_bank_transfer.subject),
&cmd->details.wire_deposits.wtid,
sizeof (cmd->details.wire_deposits.wtid)));
break;
default:
GNUNET_break (0);
@ -2597,7 +2607,7 @@ interpreter_run (void *cls)
cmd->details.check_bank_transfer.account_debit,
cmd->details.check_bank_transfer.account_credit,
cmd->details.check_bank_transfer.exchange_base_url,
&cmd->details.check_bank_transfer.wtid))
&cmd->details.check_bank_transfer.subject))
{
GNUNET_break (0);
fail (is);
@ -2951,6 +2961,8 @@ do_shutdown (void *cls)
}
break;
case OC_CHECK_BANK_TRANSFER:
GNUNET_free_non_null (cmd->details.check_bank_transfer.subject);
cmd->details.check_bank_transfer.subject = NULL;
break;
case OC_CHECK_BANK_TRANSFERS_EMPTY:
break;

View File

@ -118,7 +118,7 @@ struct Command
/**
* Subject of the transfer, set by the command.
*/
struct TALER_WireTransferIdentifierRawP wtid;
char *subject;
} expect_transaction;
@ -565,7 +565,7 @@ interpreter (void *cls)
cmd->details.expect_transaction.debit_account,
cmd->details.expect_transaction.credit_account,
cmd->details.expect_transaction.exchange_base_url,
&cmd->details.expect_transaction.wtid))
&cmd->details.expect_transaction.subject))
{
fail (cmd);
return;

View File

@ -31,7 +31,6 @@
#include "taler_fakebank_lib.h"
/**
* Commands for the interpreter.
*/
@ -127,7 +126,7 @@ struct Command
/**
* Subject of the transfer, set by the command.
*/
struct TALER_WireTransferIdentifierRawP wtid;
char *subject;
} expect_transfer;
@ -371,6 +370,8 @@ shutdown_action (void *cls)
state);
break;
case OPCODE_EXPECT_TRANSFER:
GNUNET_free_non_null (cmd->details.expect_transfer.subject);
cmd->details.expect_transfer.subject = NULL;
break;
case OPCODE_EXPECT_TRANSFERS_EMPTY:
break;
@ -521,7 +522,7 @@ interpreter (void *cls)
cmd->details.expect_transfer.debit_account,
cmd->details.expect_transfer.credit_account,
cmd->details.expect_transfer.exchange_base_url,
&cmd->details.expect_transfer.wtid))
&cmd->details.expect_transfer.subject))
{
fail (cmd);
return;

View File

@ -61,9 +61,30 @@ int
TALER_FAKEBANK_check_empty (struct TALER_FAKEBANK_Handle *h);
/**
* Tell the fakebank to create another wire transfer.
*
* @param h fake bank handle
* @param debit_account account to debit
* @param credit_account account to credit
* @param amount amount to transfer
* @param subject wire transfer subject to use
* @param exchange_base_url exchange URL
* @return serial_id of the transfer
*/
uint64_t
TALER_FAKEBANK_make_transfer (struct TALER_FAKEBANK_Handle *h,
uint64_t debit_account,
uint64_t credit_account,
const struct TALER_Amount *amount,
const char *subject,
const char *exchange_base_url);
/**
* Check that the @a want_amount was transferred from the @a
* want_debit to the @a want_credit account. If so, set the @a wtid
* want_debit to the @a want_credit account. If so, set the @a subject
* to the transfer identifier and remove the transaction from the
* list. If the transaction was not recorded, return #GNUNET_SYSERR.
*
@ -73,7 +94,7 @@ TALER_FAKEBANK_check_empty (struct TALER_FAKEBANK_Handle *h);
* @param want_debit account that should have been credited
* @param exchange_base_url expected base URL of the exchange,
* i.e. "https://example.com/"; may include a port
* @param[out] wtid set to the wire transfer identifier
* @param[out] subject set to the wire transfer identifier
* @return #GNUNET_OK on success
*/
int
@ -82,7 +103,7 @@ TALER_FAKEBANK_check (struct TALER_FAKEBANK_Handle *h,
uint64_t want_debit,
uint64_t want_credit,
const char *exchange_base_url,
struct TALER_WireTransferIdentifierRawP *wtid);
char **subject);
/**