implementing #4921: add base URL to wire transfers

This commit is contained in:
Christian Grothoff 2017-03-02 06:26:12 +01:00
parent 4d8942b818
commit 397c718809
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
17 changed files with 222 additions and 59 deletions

View File

@ -162,8 +162,9 @@ handle_admin_add_incoming_finished (void *cls,
* to the operators of the bank.
*
* @param ctx curl context for the event loop
* @param bank_base_url URL of the bank
* @param reserve_pub public key of the reserve
* @param bank_base_url URL of the bank (used to execute this request)
* @param exchange_base_url base URL of the exchange (for tracking)
* @param wtid wire transfer identifier for the transfer
* @param amount amount that was deposited
* @param execution_date when did we receive the amount
* @param debit_account_no account number to withdraw from (53 bits at most)
@ -177,6 +178,7 @@ handle_admin_add_incoming_finished (void *cls,
struct TALER_BANK_AdminAddIncomingHandle *
TALER_BANK_admin_add_incoming (struct GNUNET_CURL_Context *ctx,
const char *bank_base_url,
const char *exchange_base_url,
const struct TALER_WireTransferIdentifierRawP *wtid,
const struct TALER_Amount *amount,
uint64_t debit_account_no,
@ -188,9 +190,9 @@ TALER_BANK_admin_add_incoming (struct GNUNET_CURL_Context *ctx,
json_t *admin_obj;
CURL *eh;
admin_obj = json_pack ("{s:o, s:o,"
" s:I, s:I}",
"wtid", GNUNET_JSON_from_data_auto (wtid), /* #4340 */
admin_obj = json_pack ("{s:s, s:o, s:o, s:I, s:I}",
"exchange_url", exchange_base_url,
"wtid", GNUNET_JSON_from_data_auto (wtid),
"amount", TALER_JSON_from_amount (amount),
"debit_account", (json_int_t) debit_account_no,
"credit_account", (json_int_t) credit_account_no);

View File

@ -1,6 +1,6 @@
/*
This file is part of TALER
(C) 2016 Inria and GNUnet e.V.
(C) 2016, 2017 Inria and GNUnet e.V.
TALER is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
@ -65,6 +65,11 @@ struct Transaction
* Subject of the transfer.
*/
struct TALER_WireTransferIdentifierRawP wtid;
/**
* Base URL of the exchange.
*/
char *exchange_base_url;
};
@ -105,6 +110,8 @@ struct TALER_FAKEBANK_Handle
* @param want_amount transfer amount desired
* @param want_debit account that should have been debited
* @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
* @return #GNUNET_OK on success
*/
@ -113,6 +120,7 @@ TALER_FAKEBANK_check (struct TALER_FAKEBANK_Handle *h,
const struct TALER_Amount *want_amount,
uint64_t want_debit,
uint64_t want_credit,
const char *exchange_base_url,
struct TALER_WireTransferIdentifierRawP *wtid)
{
struct Transaction *t;
@ -122,12 +130,15 @@ TALER_FAKEBANK_check (struct TALER_FAKEBANK_Handle *h,
if ( (want_debit == t->debit_account) &&
(want_credit == t->credit_account) &&
(0 == TALER_amount_cmp (want_amount,
&t->amount)) )
&t->amount)) &&
(0 == strcasecmp (exchange_base_url,
t->exchange_base_url)) )
{
GNUNET_CONTAINER_DLL_remove (h->transactions_head,
h->transactions_tail,
t);
*wtid = t->wtid;
GNUNET_free (t->exchange_base_url);
GNUNET_free (t);
return GNUNET_OK;
}
@ -140,10 +151,11 @@ TALER_FAKEBANK_check (struct TALER_FAKEBANK_Handle *h,
s = TALER_amount_to_string (&t->amount);
fprintf (stderr,
"%llu -> %llu (%s)\n",
"%llu -> %llu (%s) from %s\n",
(unsigned long long) t->debit_account,
(unsigned long long) t->credit_account,
s);
s,
t->exchange_base_url);
GNUNET_free (s);
}
return GNUNET_SYSERR;
@ -174,10 +186,11 @@ TALER_FAKEBANK_check_empty (struct TALER_FAKEBANK_Handle *h)
s = TALER_amount_to_string (&t->amount);
fprintf (stderr,
"%llu -> %llu (%s)\n",
"%llu -> %llu (%s) from %s\n",
(unsigned long long) t->debit_account,
(unsigned long long) t->credit_account,
s);
s,
t->exchange_base_url);
GNUNET_free (s);
}
return GNUNET_SYSERR;
@ -199,6 +212,7 @@ TALER_FAKEBANK_stop (struct TALER_FAKEBANK_Handle *h)
GNUNET_CONTAINER_DLL_remove (h->transactions_head,
h->transactions_tail,
t);
GNUNET_free (t->exchange_base_url);
GNUNET_free (t);
}
if (NULL != h->mhd_task)
@ -303,11 +317,13 @@ handle_mhd_request (void *cls,
}
t = GNUNET_new (struct Transaction);
{
const char *base_url;
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 ("exchange_url", &base_url),
GNUNET_JSON_spec_end ()
};
if (GNUNET_OK !=
@ -319,14 +335,16 @@ handle_mhd_request (void *cls,
json_decref (json);
return MHD_NO;
}
t->exchange_base_url = GNUNET_strdup (base_url);
GNUNET_CONTAINER_DLL_insert (h->transactions_head,
h->transactions_tail,
t);
}
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"Receiving incoming wire transfer: %llu->%llu\n",
"Receiving incoming wire transfer: %llu->%llu from %s\n",
(unsigned long long) t->debit_account,
(unsigned long long) t->credit_account);
(unsigned long long) t->credit_account,
t->exchange_base_url);
json_decref (json);
resp = MHD_create_response_from_buffer (0, "", MHD_RESPMEM_PERSISTENT);
ret = MHD_queue_response (connection,

View File

@ -1,6 +1,6 @@
/*
This file is part of TALER
Copyright (C) 2016 GNUnet e.V.
Copyright (C) 2016, 2017 GNUnet e.V.
TALER is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
@ -45,6 +45,7 @@ run (void *cls)
.details.admin_add_incoming.expected_response_code = MHD_HTTP_OK,
.details.admin_add_incoming.credit_account_no = 1,
.details.admin_add_incoming.debit_account_no = 2,
.details.admin_add_incoming.exchange_base_url = "https://exchange.net/",
.details.admin_add_incoming.amount = "PUDOS:5.01" },
/* Add EUR:3.21 to account 3 */
{ .oc = TBI_OC_ADMIN_ADD_INCOMING,
@ -52,6 +53,7 @@ run (void *cls)
.details.admin_add_incoming.expected_response_code = MHD_HTTP_OK,
.details.admin_add_incoming.credit_account_no = 3,
.details.admin_add_incoming.debit_account_no = 2,
.details.admin_add_incoming.exchange_base_url = "https://exchange.org/",
.details.admin_add_incoming.amount = "PUDOS:3.21" },
/* check transfers arrived at fakebank */
{ .oc = TBI_OC_EXPECT_TRANSFER,

View File

@ -1,6 +1,6 @@
/*
This file is part of TALER
Copyright (C) 2016 GNUnet e.V.
Copyright (C) 2016, 2017 GNUnet e.V.
TALER is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
@ -222,6 +222,7 @@ interpreter_run (void *cls)
cmd->details.admin_add_incoming.aih
= TALER_BANK_admin_add_incoming (is->ctx,
"http://localhost:8081",
cmd->details.admin_add_incoming.exchange_base_url,
&cmd->details.admin_add_incoming.wtid,
&amount,
cmd->details.admin_add_incoming.debit_account_no,
@ -243,10 +244,11 @@ interpreter_run (void *cls)
&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,
&wtid))
&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);

View File

@ -1,6 +1,6 @@
/*
This file is part of TALER
Copyright (C) 2016 GNUnet e.V.
Copyright (C) 2016, 2017 GNUnet e.V.
TALER is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
@ -99,6 +99,11 @@ struct TBI_Command
*/
uint64_t debit_account_no;
/**
* Exchange base URL to use.
*/
const char *exchange_base_url;
/**
* Wire transfer identifier to use. Initialized to
* a random value.

View File

@ -1,6 +1,6 @@
/*
This file is part of TALER
Copyright (C) 2014, 2015, 2016 GNUnet e.V. and Inria
Copyright (C) 2014-2017 GNUnet e.V. and Inria
TALER is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
@ -604,6 +604,11 @@ struct Command
*/
uint64_t account_credit;
/**
* Which exchange base URL is expected?
*/
const char *exchange_base_url;
/**
* Set (!) to the wire transfer identifier observed.
*/
@ -906,9 +911,10 @@ reserve_status_cb (void *cls,
(0 == strcmp (cmd->details.reserve_status.reserve_reference,
rel->details.admin_add_incoming.reserve_reference) ) ) )
{
if (GNUNET_OK !=
compare_admin_add_incoming_history (&history[j],
rel))
if ( (j >= history_length) ||
(GNUNET_OK !=
compare_admin_add_incoming_history (&history[j],
rel)) )
{
GNUNET_break (0);
fail (is);
@ -921,9 +927,10 @@ reserve_status_cb (void *cls,
if (0 == strcmp (cmd->details.reserve_status.reserve_reference,
rel->details.reserve_withdraw.reserve_reference))
{
if (GNUNET_OK !=
compare_reserve_withdraw_history (&history[j],
rel))
if ( (j >= history_length) ||
(GNUNET_OK !=
compare_reserve_withdraw_history (&history[j],
rel)) )
{
GNUNET_break (0);
fail (is);
@ -2280,10 +2287,11 @@ interpreter_run (void *cls)
}
if (GNUNET_OK !=
TALER_FAKEBANK_check (fakebank,
&amount,
cmd->details.check_bank_transfer.account_debit,
cmd->details.check_bank_transfer.account_credit,
&cmd->details.check_bank_transfer.wtid))
&amount,
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))
{
GNUNET_break (0);
fail (is);
@ -2914,24 +2922,28 @@ run (void *cls)
{ .oc = OC_CHECK_BANK_TRANSFER,
.label = "check_bank_transfer-499c",
.details.check_bank_transfer.exchange_base_url = "https://exchange.com/",
.details.check_bank_transfer.amount = "EUR:4.99",
.details.check_bank_transfer.account_debit = 2,
.details.check_bank_transfer.account_credit = 42
},
{ .oc = OC_CHECK_BANK_TRANSFER,
.label = "check_bank_transfer-99c1",
.details.check_bank_transfer.exchange_base_url = "https://exchange.com/",
.details.check_bank_transfer.amount = "EUR:0.99",
.details.check_bank_transfer.account_debit = 2,
.details.check_bank_transfer.account_credit = 42
},
{ .oc = OC_CHECK_BANK_TRANSFER,
.label = "check_bank_transfer-99c2",
.details.check_bank_transfer.exchange_base_url = "https://exchange.com/",
.details.check_bank_transfer.amount = "EUR:0.99",
.details.check_bank_transfer.account_debit = 2,
.details.check_bank_transfer.account_credit = 42
},
{ .oc = OC_CHECK_BANK_TRANSFER,
.label = "check_bank_transfer-9c",
.details.check_bank_transfer.exchange_base_url = "https://exchange.com/",
.details.check_bank_transfer.amount = "EUR:0.09",
.details.check_bank_transfer.account_debit = 2,
.details.check_bank_transfer.account_credit = 43
@ -3017,6 +3029,7 @@ run (void *cls)
/* Check that deposit did run */
{ .oc = OC_CHECK_BANK_TRANSFER,
.label = "check_bank_transfer-pre-refund",
.details.check_bank_transfer.exchange_base_url = "https://exchange.com/",
.details.check_bank_transfer.amount = "EUR:4.98",
.details.check_bank_transfer.account_debit = 2,
.details.check_bank_transfer.account_credit = 42

View File

@ -24,6 +24,10 @@ MASTER_PUBLIC_KEY = 98NJW3CQHZQGQXTY3K85K531XKPAPAVV4Q5V8PYYRR00NJGZWNVG
# How to access our database
DB = postgres
# Base URL of the exchange. Note that the test expects exactly this
# value in the wire transfers.
BASE_URL = "https://exchange.com/"
[exchangedb-postgres]
DB_CONN_STR = "postgres:///talercheck"

View File

@ -33,6 +33,14 @@ UNIXPATH_MODE = 660
# HTTP port the exchange listens to
PORT = 8081
# Base URL of the exchange (public-facing). Due to reverse proxies,
# this may or may not match our port or hostname at all and can thus
# not be determined automatically. Note that a globally reachable name
# is required, so 'localhost' will not work except for testing.
# Required for wire transfers as we need to include it in the wire
# transfers to enable tracking.
BASE_URL = http://localhost:8081/
[exchange-admin]
# Network configuration for the /admin HTTP server

View File

@ -29,8 +29,6 @@
#include "taler_wire_lib.h"
/**
* Information we keep for each loaded wire plugin.
*/
@ -168,6 +166,11 @@ struct AggregationUnit
*/
static char *exchange_currency_string;
/**
* What is the base URL of this exchange?
*/
static char *exchange_base_url;
/**
* The exchange's configuration (global)
*/
@ -763,6 +766,7 @@ run_aggregation (void *cls)
au->ph = wp->wire_plugin->prepare_wire_transfer (wp->wire_plugin->cls,
au->wire,
&au->total_amount,
exchange_base_url,
&au->wtid,
&prepare_cb,
au);
@ -1061,6 +1065,18 @@ run (void *cls,
const char *cfgfile,
const struct GNUNET_CONFIGURATION_Handle *c)
{
if (GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_string (c,
"exchange",
"BASE_URL",
&exchange_base_url))
{
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
"exchange",
"BASE_URL");
global_ret = 1;
return;
}
cfg = GNUNET_CONFIGURATION_dup (c);
if (GNUNET_OK != exchange_serve_process_config ())
{

View File

@ -1,8 +1,40 @@
[PATHS]
# Persistant data storage for the testcase
TALER_TEST_HOME = test_taler_exchange_httpd_home/
[taler]
# Currency supported by the exchange (can only be one)
CURRENCY = EUR
[exchange]
#The DB plugin to use
# The DB plugin to use
DB = postgres
# Wire format supported by the exchange
# We use 'test' for testing of the actual
# coin operations.
WIREFORMAT = test
# HTTP port the exchange listens to
PORT = 8081
# Master public key used to sign the exchange's various keys
MASTER_PUBLIC_KEY = 98NJW3CQHZQGQXTY3K85K531XKPAPAVV4Q5V8PYYRR00NJGZWNVG
# Expected base URL of the exchange.
BASE_URL = "https://exchange.taler.net/"
[exchangedb-postgres]
#The connection string the plugin has to use for connecting to the database
DB_CONN_STR = postgres:///talercheck
[exchange-wire-outgoing-test]
# What is the main website of the bank?
BANK_URI = "http://localhost:8082/"
# From which account at the 'bank' should outgoing
# wire transfers be made?
EXCHANGE_ACCOUNT_NUMBER = 3

View File

@ -110,6 +110,11 @@ struct Command
*/
uint64_t credit_account;
/**
* Base URL of the exchange.
*/
const char *exchange_base_url;
/**
* Subject of the transfer, set by the command.
*/
@ -512,7 +517,7 @@ interpreter (void *cls)
NULL, NULL, NULL,
"taler-exchange-aggregator",
"taler-exchange-aggregator",
"-c", "test_taler_exchange_httpd.conf",
"-c", config_filename,
"-t", /* enable temporary tables */
NULL);
if (NULL == aggregator_proc)
@ -556,10 +561,11 @@ interpreter (void *cls)
}
if (GNUNET_OK !=
TALER_FAKEBANK_check (fb,
&want_amount,
cmd->details.expect_transaction.debit_account,
cmd->details.expect_transaction.credit_account,
&cmd->details.expect_transaction.wtid))
&want_amount,
cmd->details.expect_transaction.debit_account,
cmd->details.expect_transaction.credit_account,
cmd->details.expect_transaction.exchange_base_url,
&cmd->details.expect_transaction.wtid))
{
fail (cmd);
return;
@ -614,6 +620,7 @@ run_test ()
.label = "expect-deposit-1",
.details.expect_transaction.debit_account = 3,
.details.expect_transaction.credit_account = 4,
.details.expect_transaction.exchange_base_url = "https://exchange.taler.net/",
.details.expect_transaction.amount = "EUR:0.9"
},
@ -660,6 +667,7 @@ run_test ()
.label = "expect-deposit-2",
.details.expect_transaction.debit_account = 3,
.details.expect_transaction.credit_account = 4,
.details.expect_transaction.exchange_base_url = "https://exchange.taler.net/",
.details.expect_transaction.amount = "EUR:1.8"
},
@ -705,6 +713,7 @@ run_test ()
.label = "expect-deposit-3a",
.details.expect_transaction.debit_account = 3,
.details.expect_transaction.credit_account = 4,
.details.expect_transaction.exchange_base_url = "https://exchange.taler.net/",
.details.expect_transaction.amount = "EUR:0.9"
},
{
@ -712,6 +721,7 @@ run_test ()
.label = "expect-deposit-3b",
.details.expect_transaction.debit_account = 3,
.details.expect_transaction.credit_account = 4,
.details.expect_transaction.exchange_base_url = "https://exchange.taler.net/",
.details.expect_transaction.amount = "EUR:0.9"
},
{
@ -719,6 +729,7 @@ run_test ()
.label = "expect-deposit-3c",
.details.expect_transaction.debit_account = 3,
.details.expect_transaction.credit_account = 5,
.details.expect_transaction.exchange_base_url = "https://exchange.taler.net/",
.details.expect_transaction.amount = "EUR:0.9"
},
{
@ -767,6 +778,7 @@ run_test ()
.label = "expect-deposit-4",
.details.expect_transaction.debit_account = 3,
.details.expect_transaction.credit_account = 4,
.details.expect_transaction.exchange_base_url = "https://exchange.taler.net/",
.details.expect_transaction.amount = "EUR:0.2"
},
@ -811,6 +823,7 @@ run_test ()
.label = "expect-deposit-5",
.details.expect_transaction.debit_account = 3,
.details.expect_transaction.credit_account = 4,
.details.expect_transaction.exchange_base_url = "https://exchange.taler.net/",
.details.expect_transaction.amount = "EUR:0.2"
},
@ -893,6 +906,7 @@ run_test ()
.label = "expect-deposit-6",
.details.expect_transaction.debit_account = 3,
.details.expect_transaction.credit_account = 4,
.details.expect_transaction.exchange_base_url = "https://exchange.taler.net/",
.details.expect_transaction.amount = "EUR:0.01"
},
@ -932,6 +946,7 @@ run_test ()
.label = "expect-deposit-7",
.details.expect_transaction.debit_account = 3,
.details.expect_transaction.credit_account = 4,
.details.expect_transaction.exchange_base_url = "https://exchange.taler.net/",
.details.expect_transaction.amount = "EUR:0.01"
},
/* Now check profit was actually taken */
@ -953,6 +968,7 @@ run_test ()
.label = "expect-deposit-7",
.details.expect_transaction.debit_account = 3,
.details.expect_transaction.credit_account = 4,
.details.expect_transaction.exchange_base_url = "https://exchange.taler.net/",
.details.expect_transaction.amount = "EUR:0.02"
},
@ -1010,6 +1026,7 @@ run_test ()
.label = "expect-deposit-8",
.details.expect_transaction.debit_account = 3,
.details.expect_transaction.credit_account = 4,
.details.expect_transaction.exchange_base_url = "https://exchange.taler.net/",
.details.expect_transaction.amount = "EUR:0.04"
},
@ -1069,6 +1086,7 @@ run_test ()
.label = "expect-deposit-9",
.details.expect_transaction.debit_account = 3,
.details.expect_transaction.credit_account = 4,
.details.expect_transaction.exchange_base_url = "https://exchange.taler.net/",
.details.expect_transaction.amount = "EUR:0.02"
},
@ -1142,7 +1160,8 @@ run (void *cls)
GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL,
GNUNET_DISK_pipe_handle (sigpipe,
GNUNET_DISK_PIPE_END_READ),
&maint_child_death, NULL);
&maint_child_death,
NULL);
GNUNET_SCHEDULER_add_shutdown (&shutdown_action,
NULL);
timeout_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES,
@ -1195,9 +1214,11 @@ main (int argc,
}
plugin_name++;
(void) GNUNET_asprintf (&testname,
"test-taler-exchange-aggregator-%s", plugin_name);
"test-taler-exchange-aggregator-%s",
plugin_name);
(void) GNUNET_asprintf (&config_filename,
"%s.conf", testname);
"%s.conf",
testname);
/* these might get in the way */
unsetenv ("XDG_DATA_HOME");
unsetenv ("XDG_CONFIG_HOME");
@ -1214,13 +1235,16 @@ main (int argc,
GNUNET_free (testname);
return 2;
}
sigpipe = GNUNET_DISK_pipe (GNUNET_NO, GNUNET_NO, GNUNET_NO, GNUNET_NO);
sigpipe = GNUNET_DISK_pipe (GNUNET_NO, GNUNET_NO,
GNUNET_NO, GNUNET_NO);
GNUNET_assert (NULL != sigpipe);
shc_chld =
GNUNET_SIGNAL_handler_install (GNUNET_SIGCHLD, &sighandler_child_death);
GNUNET_SIGNAL_handler_install (GNUNET_SIGCHLD,
&sighandler_child_death);
coin_pk = GNUNET_CRYPTO_rsa_private_key_create (1024);
coin_pub = GNUNET_CRYPTO_rsa_private_key_get_public (coin_pk);
GNUNET_SCHEDULER_run (&run, cfg);
GNUNET_SCHEDULER_run (&run,
cfg);
GNUNET_CRYPTO_rsa_private_key_free (coin_pk);
GNUNET_CRYPTO_rsa_public_key_free (coin_pub);
GNUNET_SIGNAL_handler_uninstall (shc_chld);

View File

@ -57,8 +57,9 @@ typedef void
* to the operators of the bank.
*
* @param ctx curl context for the event loop
* @param bank_base_url URL of the bank
* @param reserve_pub public key of the reserve
* @param bank_base_url URL of the bank (used to execute this request)
* @param exchange_base_url base URL of the exchange (for tracking)
* @param wtid wire transfer identifier for the transfer
* @param amount amount that was deposited
* @param execution_date when did we receive the amount
* @param debit_account_no account number to withdraw from (53 bits at most)
@ -72,6 +73,7 @@ typedef void
struct TALER_BANK_AdminAddIncomingHandle *
TALER_BANK_admin_add_incoming (struct GNUNET_CURL_Context *ctx,
const char *bank_base_url,
const char *exchange_base_url,
const struct TALER_WireTransferIdentifierRawP *wtid,
const struct TALER_Amount *amount,
uint64_t debit_account_no,

View File

@ -71,15 +71,18 @@ TALER_FAKEBANK_check_empty (struct TALER_FAKEBANK_Handle *h);
* @param want_amount transfer amount desired
* @param want_debit account that should have been debited
* @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
* @return #GNUNET_OK on success
*/
int
TALER_FAKEBANK_check (struct TALER_FAKEBANK_Handle *h,
const struct TALER_Amount *want_amount,
uint64_t want_debit,
uint64_t want_credit,
struct TALER_WireTransferIdentifierRawP *wtid);
const struct TALER_Amount *want_amount,
uint64_t want_debit,
uint64_t want_credit,
const char *exchange_base_url,
struct TALER_WireTransferIdentifierRawP *wtid);
/**

View File

@ -155,6 +155,7 @@ struct TALER_WIRE_Plugin
* @param cls the @e cls of this struct with the plugin-specific state
* @param wire valid wire account information
* @param amount amount to transfer, already rounded
* @param exchange_base_url base URL of this exchange
* @param wtid wire transfer identifier to use
* @param ptc function to call with the prepared data to persist
* @param ptc_cls closure for @a ptc
@ -164,6 +165,7 @@ struct TALER_WIRE_Plugin
(*prepare_wire_transfer) (void *cls,
const json_t *wire,
const struct TALER_Amount *amount,
const char *exchange_base_url,
const struct TALER_WireTransferIdentifierRawP *wtid,
TALER_WIRE_PrepareTransactionCallback ptc,
void *ptc_cls);

View File

@ -1,6 +1,6 @@
/*
This file is part of TALER
Copyright (C) 2016 GNUnet e.V. & Inria
Copyright (C) 2016, 2017 GNUnet e.V. & Inria
TALER is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
@ -658,6 +658,7 @@ sepa_sign_wire_details (void *cls,
* @param cls the @e cls of this struct with the plugin-specific state
* @param wire valid wire account information
* @param amount amount to transfer, already rounded
* @param exchange_base_url base URL of the exchange (for tracking)
* @param wtid wire transfer identifier to use
* @param psc function to call with the prepared data to persist
* @param psc_cls closure for @a psc
@ -667,6 +668,7 @@ static struct TALER_WIRE_PrepareHandle *
sepa_prepare_wire_transfer (void *cls,
const json_t *wire,
const struct TALER_Amount *amount,
const char *exchange_base_url,
const struct TALER_WireTransferIdentifierRawP *wtid,
TALER_WIRE_PrepareTransactionCallback psc,
void *psc_cls)

View File

@ -120,6 +120,7 @@ template_wire_validate (void *cls,
* @param cls the @e cls of this struct with the plugin-specific state
* @param wire valid wire account information
* @param amount amount to transfer, already rounded
* @param exchange_base_url base URL of the exchange (for tracking)
* @param wtid wire transfer identifier to use
* @param ptc function to call with the prepared data to persist
* @param ptc_cls closure for @a ptc
@ -129,6 +130,7 @@ static struct TALER_WIRE_PrepareHandle *
template_prepare_wire_transfer (void *cls,
const json_t *wire,
const struct TALER_Amount *amount,
const char *exchange_base_url,
const struct TALER_WireTransferIdentifierRawP *wtid,
TALER_WIRE_PrepareTransactionCallback ptc,
void *ptc_cls)

View File

@ -85,6 +85,11 @@ struct TALER_WIRE_PrepareHandle
*/
json_t *wire;
/**
* Base URL to use for the exchange.
*/
char *exchange_base_url;
/**
* Function to call with the serialized data.
*/
@ -397,7 +402,9 @@ struct BufFormatP
*/
struct TALER_AmountNBO amount;
/* followed by serialized 'wire' JSON data */
/* followed by serialized 'wire' JSON data (0-terminated) */
/* followed by 0-terminated base URL */
};
GNUNET_NETWORK_STRUCT_END
@ -417,6 +424,7 @@ test_prepare_wire_transfer_cancel (void *cls,
if (NULL != pth->task)
GNUNET_SCHEDULER_cancel (pth->task);
json_decref (pth->wire);
GNUNET_free (pth->exchange_base_url);
GNUNET_free (pth);
}
@ -432,7 +440,8 @@ do_prepare (void *cls)
{
struct TALER_WIRE_PrepareHandle *pth = cls;
char *wire_enc;
size_t len;
size_t len_w;
size_t len_b;
struct BufFormatP bf;
pth->task = NULL;
@ -449,19 +458,23 @@ do_prepare (void *cls)
pth);
return;
}
len = strlen (wire_enc) + 1;
len_w = strlen (wire_enc) + 1;
len_b = strlen (pth->exchange_base_url) + 1;
bf.wtid = pth->wtid;
TALER_amount_hton (&bf.amount,
&pth->amount);
{
char buf[sizeof (struct BufFormatP) + len];
char buf[sizeof (struct BufFormatP) + len_w + len_b];
memcpy (buf,
&bf,
sizeof (struct BufFormatP));
memcpy (&buf[sizeof (struct BufFormatP)],
wire_enc,
len);
len_w);
memcpy (&buf[sizeof (struct BufFormatP) + len_w],
pth->exchange_base_url,
len_b);
/* finally give the state back */
pth->ptc (pth->ptc_cls,
@ -485,6 +498,7 @@ do_prepare (void *cls)
* @param cls the @e cls of this struct with the plugin-specific state
* @param wire valid wire account information
* @param amount amount to transfer, already rounded
* @param exchange_base_url base URL of this exchange
* @param wtid wire transfer identifier to use
* @param ptc function to call with the prepared data to persist
* @param ptc_cls closure for @a ptc
@ -494,6 +508,7 @@ static struct TALER_WIRE_PrepareHandle *
test_prepare_wire_transfer (void *cls,
const json_t *wire,
const struct TALER_Amount *amount,
const char *exchange_base_url,
const struct TALER_WireTransferIdentifierRawP *wtid,
TALER_WIRE_PrepareTransactionCallback ptc,
void *ptc_cls)
@ -515,6 +530,7 @@ test_prepare_wire_transfer (void *cls,
pth = GNUNET_new (struct TALER_WIRE_PrepareHandle);
pth->tc = tc;
pth->wire = json_incref ((json_t *) wire);
pth->exchange_base_url = GNUNET_strdup (exchange_base_url);
pth->wtid = *wtid;
pth->ptc = ptc;
pth->ptc_cls = ptc_cls;
@ -650,6 +666,8 @@ test_execute_wire_transfer (void *cls,
json_int_t account_no;
struct BufFormatP bf;
char *emsg;
const char *json_s;
const char *exchange_base_url;
if (NULL == tc->ctx)
{
@ -658,7 +676,14 @@ test_execute_wire_transfer (void *cls,
return NULL; /* not initialized with configuration, cannot do transfers */
}
if ( (buf_size <= sizeof (struct BufFormatP)) ||
('\0' != buf[buf_size -1]) )
('\0' != buf[buf_size - 1]) )
{
GNUNET_break (0);
return NULL;
}
json_s = &buf[sizeof (struct BufFormatP)];
exchange_base_url = &json_s[strlen (json_s) + 1];
if (exchange_base_url > &buf[buf_size - 1])
{
GNUNET_break (0);
return NULL;
@ -668,7 +693,7 @@ test_execute_wire_transfer (void *cls,
sizeof (bf));
TALER_amount_ntoh (&amount,
&bf.amount);
wire = json_loads (&buf[sizeof (struct BufFormatP)],
wire = json_loads (json_s,
JSON_REJECT_DUPLICATES,
NULL);
if (NULL == wire)
@ -697,6 +722,7 @@ test_execute_wire_transfer (void *cls,
eh->cc_cls = cc_cls;
eh->aaih = TALER_BANK_admin_add_incoming (tc->ctx,
tc->bank_uri,
exchange_base_url,
&bf.wtid,
&amount,
(uint64_t) tc->exchange_account_outgoing_no,