From 16b7c266057cbfc6d235b6a1c3fe914b14944a25 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 11 Jun 2017 15:25:59 +0200 Subject: [PATCH] modify fakebank API to allow arbitrary subjects, not just well-fromed WTIDs --- src/bank-lib/fakebank.c | 113 ++++++++++++------ src/bank-lib/test_bank_interpreter.c | 50 ++++---- src/exchange-lib/test_exchange_api.c | 26 ++-- src/exchange/test_taler_exchange_aggregator.c | 4 +- src/exchange/test_taler_exchange_wirewatch.c | 7 +- src/include/taler_fakebank_lib.h | 27 ++++- 6 files changed, 154 insertions(+), 73 deletions(-) diff --git a/src/bank-lib/fakebank.c b/src/bank-lib/fakebank.c index ceda4d37b..34a11f9b7 100644 --- a/src/bank-lib/fakebank.c +++ b/src/bank-lib/fakebank.c @@ -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), diff --git a/src/bank-lib/test_bank_interpreter.c b/src/bank-lib/test_bank_interpreter.c index e966424ef..f5aee8ee6 100644 --- a/src/bank-lib/test_bank_interpreter.c +++ b/src/bank-lib/test_bank_interpreter.c @@ -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, diff --git a/src/exchange-lib/test_exchange_api.c b/src/exchange-lib/test_exchange_api.c index 53bfbd19b..e435ed77c 100644 --- a/src/exchange-lib/test_exchange_api.c +++ b/src/exchange-lib/test_exchange_api.c @@ -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; diff --git a/src/exchange/test_taler_exchange_aggregator.c b/src/exchange/test_taler_exchange_aggregator.c index 6eaa09320..db22613b7 100644 --- a/src/exchange/test_taler_exchange_aggregator.c +++ b/src/exchange/test_taler_exchange_aggregator.c @@ -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; diff --git a/src/exchange/test_taler_exchange_wirewatch.c b/src/exchange/test_taler_exchange_wirewatch.c index cf3cd49a0..f47a126b6 100644 --- a/src/exchange/test_taler_exchange_wirewatch.c +++ b/src/exchange/test_taler_exchange_wirewatch.c @@ -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; diff --git a/src/include/taler_fakebank_lib.h b/src/include/taler_fakebank_lib.h index 7d8757d99..3df1e6095 100644 --- a/src/include/taler_fakebank_lib.h +++ b/src/include/taler_fakebank_lib.h @@ -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); /**