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. * Subject of the transfer.
*/ */
struct TALER_WireTransferIdentifierRawP wtid; char *subject;
/** /**
* Base URL of the exchange. * Base URL of the exchange.
@ -119,7 +119,7 @@ struct TALER_FAKEBANK_Handle
/** /**
* Check that the @a want_amount was transferred from * Check that the @a want_amount was transferred from
* the @a want_debit to the @a want_credit account. If * 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. * If not, return #GNUNET_SYSERR.
* *
* @param h bank instance * @param h bank instance
@ -137,11 +137,9 @@ TALER_FAKEBANK_check (struct TALER_FAKEBANK_Handle *h,
uint64_t want_debit, uint64_t want_debit,
uint64_t want_credit, uint64_t want_credit,
const char *exchange_base_url, const char *exchange_base_url,
struct TALER_WireTransferIdentifierRawP *wtid) char **subject)
{ {
struct Transaction *t; for (struct Transaction *t = h->transactions_head; NULL != t; t = t->next)
for (t = h->transactions_head; NULL != t; t = t->next)
{ {
if ( (want_debit == t->debit_account) && if ( (want_debit == t->debit_account) &&
(want_credit == t->credit_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, GNUNET_CONTAINER_DLL_remove (h->transactions_head,
h->transactions_tail, h->transactions_tail,
t); t);
*wtid = t->wtid; *subject = t->subject;
GNUNET_free (t->exchange_base_url); GNUNET_free (t->exchange_base_url);
GNUNET_free (t); GNUNET_free (t);
return GNUNET_OK; return GNUNET_OK;
@ -161,7 +159,7 @@ TALER_FAKEBANK_check (struct TALER_FAKEBANK_Handle *h,
} }
fprintf (stderr, fprintf (stderr,
"Did not find matching transaction!\nI have:\n"); "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; 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 * Check that no wire transfers were ordered (or at least none
* that have not been taken care of via #TALER_FAKEBANK_check()). * 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, GNUNET_CONTAINER_DLL_remove (h->transactions_head,
h->transactions_tail, h->transactions_tail,
t); t);
GNUNET_free (t->subject);
GNUNET_free (t->exchange_base_url); GNUNET_free (t->exchange_base_url);
GNUNET_free (t); GNUNET_free (t);
} }
@ -291,9 +333,9 @@ handle_admin_add_incoming (struct TALER_FAKEBANK_Handle *h,
{ {
enum GNUNET_JSON_PostResult pr; enum GNUNET_JSON_PostResult pr;
json_t *json; json_t *json;
struct Transaction *t;
struct MHD_Response *resp; struct MHD_Response *resp;
int ret; int ret;
uint64_t serial_id;
pr = GNUNET_JSON_post_parser (REQUEST_BUFFER_MAX, pr = GNUNET_JSON_post_parser (REQUEST_BUFFER_MAX,
con_cls, con_cls,
@ -316,14 +358,17 @@ handle_admin_add_incoming (struct TALER_FAKEBANK_Handle *h,
case GNUNET_JSON_PR_SUCCESS: case GNUNET_JSON_PR_SUCCESS:
break; break;
} }
t = GNUNET_new (struct Transaction);
{ {
const char *wtid;
uint64_t debit_account;
uint64_t credit_account;
const char *base_url; const char *base_url;
struct TALER_Amount amount;
struct GNUNET_JSON_Specification spec[] = { struct GNUNET_JSON_Specification spec[] = {
GNUNET_JSON_spec_fixed_auto ("wtid", &t->wtid), GNUNET_JSON_spec_string ("wtid", &wtid),
GNUNET_JSON_spec_uint64 ("debit_account", &t->debit_account), GNUNET_JSON_spec_uint64 ("debit_account", &debit_account),
GNUNET_JSON_spec_uint64 ("credit_account", &t->credit_account), GNUNET_JSON_spec_uint64 ("credit_account", &credit_account),
TALER_JSON_spec_amount ("amount", &t->amount), TALER_JSON_spec_amount ("amount", &amount),
GNUNET_JSON_spec_string ("exchange_url", &base_url), GNUNET_JSON_spec_string ("exchange_url", &base_url),
GNUNET_JSON_spec_end () GNUNET_JSON_spec_end ()
}; };
@ -336,19 +381,18 @@ handle_admin_add_incoming (struct TALER_FAKEBANK_Handle *h,
json_decref (json); json_decref (json);
return MHD_NO; return MHD_NO;
} }
t->exchange_base_url = GNUNET_strdup (base_url); serial_id = TALER_FAKEBANK_make_transfer (h,
t->serial_id = ++h->serial_counter; debit_account,
t->date = GNUNET_TIME_absolute_get (); credit_account,
GNUNET_TIME_round_abs (&t->date); &amount,
GNUNET_CONTAINER_DLL_insert_tail (h->transactions_head, wtid,
h->transactions_tail, base_url);
t); 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); json_decref (json);
/* Finally build response object */ /* Finally build response object */
@ -358,7 +402,7 @@ handle_admin_add_incoming (struct TALER_FAKEBANK_Handle *h,
json = json_pack ("{s:I}", json = json_pack ("{s:I}",
"serial_id", "serial_id",
(json_int_t) t->serial_id); (json_int_t) serial_id);
json_str = json_dumps (json, json_str = json_dumps (json,
JSON_INDENT(2)); JSON_INDENT(2));
json_decref (json); json_decref (json);
@ -514,17 +558,10 @@ handle_history (struct TALER_FAKEBANK_Handle *h,
continue; continue;
} }
{ GNUNET_asprintf (&subject,
char *ws; "%s %s",
pos->subject,
ws = GNUNET_STRINGS_data_to_string_alloc (&pos->wtid, pos->exchange_base_url);
sizeof (pos->wtid));
GNUNET_asprintf (&subject,
"%s %s",
ws,
pos->exchange_base_url);
GNUNET_free (ws);
}
trans = json_pack ("{s:I, s:o, s:o, s:s, s:I, s:s}", trans = json_pack ("{s:I, s:o, s:o, s:s, s:I, s:s}",
"row_id", (json_int_t) pos->serial_id, "row_id", (json_int_t) pos->serial_id,
"date", GNUNET_JSON_from_time_abs (pos->date), "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", "Expected history of length %llu, got %llu\n",
(unsigned long long) total, (unsigned long long) total,
(unsigned long long) cmd->details.history.results_obtained); (unsigned long long) cmd->details.history.results_obtained);
print_expected (h, total, UINT_MAX); print_expected (h,
total,
UINT_MAX);
free_history (h, free_history (h,
total); total);
fail (is); fail (is);
@ -621,7 +623,6 @@ interpreter_run (void *cls)
struct InterpreterState *is = cls; struct InterpreterState *is = cls;
struct TBI_Command *cmd = &is->commands[is->ip]; struct TBI_Command *cmd = &is->commands[is->ip];
const struct TBI_Command *ref; const struct TBI_Command *ref;
struct TALER_WireTransferIdentifierRawP wtid;
struct TALER_Amount amount; struct TALER_Amount amount;
const struct GNUNET_SCHEDULER_TaskContext *tc; const struct GNUNET_SCHEDULER_TaskContext *tc;
struct TALER_BANK_AuthenticationData auth; struct TALER_BANK_AuthenticationData auth;
@ -719,25 +720,34 @@ interpreter_run (void *cls)
GNUNET_assert (GNUNET_OK == GNUNET_assert (GNUNET_OK ==
TALER_string_to_amount (ref->details.admin_add_incoming.amount, TALER_string_to_amount (ref->details.admin_add_incoming.amount,
&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); char *subject;
fail (is); char *expect;
return;
} if (GNUNET_OK !=
if (0 != memcmp (&wtid, TALER_FAKEBANK_check (is->fakebank,
&ref->details.admin_add_incoming.wtid, &amount,
sizeof (wtid))) ref->details.admin_add_incoming.debit_account_no,
{ ref->details.admin_add_incoming.credit_account_no,
GNUNET_break (0); ref->details.admin_add_incoming.exchange_base_url,
fail (is); &subject))
return; {
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->ip++;
is->task = GNUNET_SCHEDULER_add_now (&interpreter_run, is->task = GNUNET_SCHEDULER_add_now (&interpreter_run,

View File

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

View File

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

View File

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

View File

@ -61,9 +61,30 @@ int
TALER_FAKEBANK_check_empty (struct TALER_FAKEBANK_Handle *h); 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 * 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 * to the transfer identifier and remove the transaction from the
* list. If the transaction was not recorded, return #GNUNET_SYSERR. * 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 want_debit account that should have been credited
* @param exchange_base_url expected base URL of the exchange, * @param exchange_base_url expected base URL of the exchange,
* i.e. "https://example.com/"; may include a port * 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 * @return #GNUNET_OK on success
*/ */
int int
@ -82,7 +103,7 @@ TALER_FAKEBANK_check (struct TALER_FAKEBANK_Handle *h,
uint64_t want_debit, uint64_t want_debit,
uint64_t want_credit, uint64_t want_credit,
const char *exchange_base_url, const char *exchange_base_url,
struct TALER_WireTransferIdentifierRawP *wtid); char **subject);
/** /**