aboutsummaryrefslogtreecommitdiff
path: root/src/exchange-tools
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2020-03-07 12:23:32 +0100
committerChristian Grothoff <christian@grothoff.org>2020-03-07 12:23:32 +0100
commit20a7d8fc081c71d83d77b39c681dbfd9337aa97a (patch)
tree85fa33f910f095d2a7c228abecf6290e2b13a9e6 /src/exchange-tools
parent42bc3bc4373fe77807f12a89e1c2d118729a0a7f (diff)
merge taler-wire and taler-bank-transfer tools, they are very related and otherwise duplicate lots of logic; also enable both credit and debit histories to be shown
Diffstat (limited to 'src/exchange-tools')
-rw-r--r--src/exchange-tools/Makefile.am11
-rw-r--r--src/exchange-tools/taler-exchange-dbinit.c10
-rw-r--r--src/exchange-tools/taler-wire.c402
3 files changed, 10 insertions, 413 deletions
diff --git a/src/exchange-tools/Makefile.am b/src/exchange-tools/Makefile.am
index b08cea687..c86faf587 100644
--- a/src/exchange-tools/Makefile.am
+++ b/src/exchange-tools/Makefile.am
@@ -15,16 +15,7 @@ bin_PROGRAMS = \
taler-exchange-keyup \
taler-exchange-keycheck \
taler-exchange-wire \
- taler-exchange-dbinit \
- taler-wire
-
-taler_wire_SOURCES = \
- taler-wire.c
-taler_wire_LDADD = \
- $(top_builddir)/src/util/libtalerutil.la \
- $(top_builddir)/src/bank-lib/libtalerbank.la \
- -lgnunetcurl \
- -lgnunetutil
+ taler-exchange-dbinit
taler_exchange_keyup_SOURCES = \
taler-exchange-keyup.c
diff --git a/src/exchange-tools/taler-exchange-dbinit.c b/src/exchange-tools/taler-exchange-dbinit.c
index d7c21ad9c..d10b2ebcd 100644
--- a/src/exchange-tools/taler-exchange-dbinit.c
+++ b/src/exchange-tools/taler-exchange-dbinit.c
@@ -66,7 +66,13 @@ run (void *cls,
return;
}
if (reset_db)
- (void) plugin->drop_tables (plugin->cls);
+ {
+ if (GNUNET_OK != plugin->drop_tables (plugin->cls))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "Could not drop tables. Either database was not yet initialized, or permission denied. Consult the logs. Will still try to create new tables.\n");
+ }
+ }
if (GNUNET_OK !=
plugin->create_tables (plugin->cls))
{
@@ -79,8 +85,10 @@ run (void *cls,
if (gc_db)
{
if (GNUNET_SYSERR == plugin->gc (plugin->cls))
+ {
fprintf (stderr,
"Garbage collection failed!\n");
+ }
}
TALER_EXCHANGEDB_plugin_unload (plugin);
}
diff --git a/src/exchange-tools/taler-wire.c b/src/exchange-tools/taler-wire.c
deleted file mode 100644
index d5a915a92..000000000
--- a/src/exchange-tools/taler-wire.c
+++ /dev/null
@@ -1,402 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2014--2019 Taler Systems SA
-
- 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 Foundation; either version 3,
- or (at your option) any later version.
-
- TALER is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public
- License along with TALER; see the file COPYING. If not,
- see <http://www.gnu.org/licenses/>
-*/
-/**
- * @file taler-wire.c
- * @brief Utility for performing wire transfers.
- * @author Marcello Stanisci
- * @author Christian Grothoff
- */
-#include <platform.h>
-#include <gnunet/gnunet_util_lib.h>
-#include "taler_util.h"
-#include "taler_bank_service.h"
-
-/**
- * If set to #GNUNET_YES, then we'll ask the bank for a list
- * of transactions from the account mentioned in the config
- * section.
- */
-static int history;
-
-/**
- * If set to #GNUNET_YES, then we'll ask the bank to execute a
- * wire transfer.
- */
-static int transfer;
-
-/**
- * Global return code.
- */
-static unsigned int global_ret = 1;
-
-/**
- * When a wire transfer is being performed, this value
- * specifies the amount to transfer.
- */
-static struct TALER_Amount amount;
-
-/**
- * Starting row.
- */
-static unsigned long long start_row;
-
-/**
- * Which config section has the credentials to access the bank.
- */
-static char *account_section;
-
-/**
- * URL identifying the account that is going to receive the
- * wire transfer.
- */
-static char *destination_account_url;
-
-/**
- * Handle for executing the wire transfer.
- */
-static struct TALER_BANK_TransferHandle *eh;
-
-/**
- * Handle to ongoing history operation.
- */
-static struct TALER_BANK_CreditHistoryHandle *hh;
-
-/**
- * For authentication.
- */
-static struct TALER_BANK_AuthenticationData auth;
-
-/**
- * Handle to the context for interacting with the bank.
- */
-static struct GNUNET_CURL_Context *ctx;
-
-/**
- * Scheduler context for running the @e ctx.
- */
-static struct GNUNET_CURL_RescheduleContext *rc;
-
-
-/**
- * Callback used to process ONE entry in the transaction
- * history returned by the bank.
- *
- * @param cls closure
- * @param http_status HTTP status code from server
- * @param ec taler error code
- * @param serial_id identification of the position at
- * which we are returning data
- * @param details details about the wire transfer
- * @param json original full response from server
- * @return #GNUNET_OK to continue, #GNUNET_SYSERR to
- * abort iteration
- */
-static int
-history_cb (void *cls,
- unsigned int http_status,
- enum TALER_ErrorCode ec,
- uint64_t serial_id,
- const struct TALER_BANK_CreditDetails *details,
- const json_t *json)
-{
- (void) cls;
- (void) ec;
- (void) http_status;
- (void) json;
- if (NULL == details)
- {
- fprintf (stdout,
- "End of transactions list.\n");
- global_ret = 0;
- GNUNET_SCHEDULER_shutdown ();
- return GNUNET_NO;
- }
-
- fprintf (stdout,
- "%llu: %s->%s (%s) over %s at %s\n",
- (unsigned long long) serial_id,
- details->debit_account_url,
- details->credit_account_url,
- TALER_B2S (&details->reserve_pub),
- TALER_amount2s (&details->amount),
- GNUNET_STRINGS_absolute_time_to_string (details->execution_date));
- return GNUNET_OK;
-}
-
-
-/**
- * Callback that processes the outcome of a wire transfer
- * execution.
- *
- * @param cls closure
- * @param response_code HTTP status code
- * @param ec taler error code
- * @param row_id unique ID of the wire transfer in the bank's records
- * @param timestamp when did the transaction go into effect
- */
-static void
-confirmation_cb (void *cls,
- unsigned int response_code,
- enum TALER_ErrorCode ec,
- uint64_t row_id,
- struct GNUNET_TIME_Absolute timestamp)
-{
- (void) cls;
- if (MHD_HTTP_OK != response_code)
- {
- fprintf (stderr,
- "The wire transfer didn't execute correctly (%d).\n",
- ec);
- GNUNET_SCHEDULER_shutdown ();
- return;
- }
-
- fprintf (stdout,
- "Wire transfer #%llu executed successfully at %s.\n",
- (unsigned long long) row_id,
- GNUNET_STRINGS_absolute_time_to_string (timestamp));
- global_ret = 0;
- GNUNET_SCHEDULER_shutdown ();
-}
-
-
-/**
- * Ask the bank to execute a wire transfer.
- */
-static void
-execute_wire_transfer ()
-{
- struct TALER_WireTransferIdentifierRawP wtid;
- void *buf;
- size_t buf_size;
-
- GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_NONCE,
- &wtid,
- sizeof (wtid));
- TALER_BANK_prepare_transfer (destination_account_url,
- &amount,
- "http://exchange.example.com/",
- &wtid,
- &buf,
- &buf_size);
- eh = TALER_BANK_transfer (ctx,
- &auth,
- buf,
- buf_size,
- &confirmation_cb,
- NULL);
- if (NULL == eh)
- {
- fprintf (stderr,
- "Could not execute the wire transfer\n");
- GNUNET_SCHEDULER_shutdown ();
- return;
- }
-}
-
-
-/**
- * Ask the bank the list of transactions for the bank account
- * mentioned in the config section given by the user.
- */
-static void
-execute_history ()
-{
- hh = TALER_BANK_credit_history (ctx,
- &auth,
- start_row,
- -10,
- &history_cb,
- NULL);
- if (NULL == hh)
- {
- fprintf (stderr,
- "Could not request the transaction history.\n");
- GNUNET_SCHEDULER_shutdown ();
- return;
- }
-}
-
-
-/**
- * Gets executed upon shutdown. Main duty is wire-plugin unloading.
- *
- * @param cls closure.
- */
-static void
-do_shutdown (void *cls)
-{
- (void) cls;
- if (NULL != ctx)
- {
- GNUNET_CURL_fini (ctx);
- ctx = NULL;
- }
- if (NULL != rc)
- {
- GNUNET_CURL_gnunet_rc_destroy (rc);
- rc = NULL;
- }
- if (NULL != hh)
- {
- TALER_BANK_credit_history_cancel (hh);
- hh = NULL;
- }
- if (NULL != eh)
- {
- TALER_BANK_transfer_cancel (eh);
- eh = NULL;
- }
- TALER_BANK_auth_free (&auth);
-}
-
-
-/**
- * Main function that will be run.
- *
- * @param cls closure
- * @param args remaining command-line arguments
- * @param cfgfile name of the configuration file used
- * (for saving, can be NULL!)
- * @param cfg configuration
- */
-static void
-run (void *cls,
- char *const *args,
- const char *cfgfile,
- const struct GNUNET_CONFIGURATION_Handle *cfg)
-{
- (void) cls;
- (void) args;
- (void) cfgfile;
- if (NULL == account_section)
- {
- fprintf (stderr,
- "The option: -s ACCOUNT-SECTION, is mandatory.\n");
- return;
- }
- if (GNUNET_OK !=
- TALER_BANK_auth_parse_cfg (cfg,
- account_section,
- &auth))
- {
- fprintf (stderr,
- "Authentication information not found in configuration section `%s'\n",
- account_section);
- GNUNET_SCHEDULER_shutdown ();
- return;
- }
-
-
- if (GNUNET_YES == history)
- execute_history ();
- else if (GNUNET_YES == transfer)
- execute_wire_transfer ();
- else
- fprintf (stderr,
- "Please give either --history/-H or --transfer/t\n");
-
- ctx = GNUNET_CURL_init (&GNUNET_CURL_gnunet_scheduler_reschedule,
- &rc);
- rc = GNUNET_CURL_gnunet_rc_create (ctx);
- if (NULL == ctx)
- {
- GNUNET_break (0);
- return;
- }
- GNUNET_SCHEDULER_add_shutdown (&do_shutdown,
- NULL);
-}
-
-
-/**
- * Main function of taler-wire. This tool is used to command the
- * execution of wire transfers from the command line. Its main
- * purpose is to test whether the bank and exchange can speak the
- * same protocol of a certain wire plugin.
- *
- * @param argc number of arguments from the command line
- * @param argv command line arguments
- * @return 0 ok, 1 on error
- */
-int
-main (int argc,
- char *const *argv)
-{
- struct GNUNET_GETOPT_CommandLineOption options[] = {
- GNUNET_GETOPT_option_flag ('H',
- "history",
- "Ask to get a list of 10 transactions.",
- &history),
- GNUNET_GETOPT_option_flag ('t',
- "transfer",
- "Execute a wire transfer.",
- &transfer),
- GNUNET_GETOPT_option_ulong ('w',
- "since-when",
- "SW",
- "When asking the bank for"
- " transactions history, this"
- " option commands that all the"
- " results should have IDs settled"
- " after SW. If not given, then"
- " the 10 youngest transactions"
- " are returned.",
- &start_row),
- GNUNET_GETOPT_option_mandatory
- (GNUNET_GETOPT_option_string ('s',
- "section",
- "ACCOUNT-SECTION",
- "Which config section has the credentials to access the bank. Mandatory.\n",
- &account_section)),
- GNUNET_GETOPT_option_mandatory
- (TALER_getopt_get_amount ('a',
- "amount",
- "AMOUNT",
- "Specify the amount to transfer.",
- &amount)),
- GNUNET_GETOPT_option_mandatory
- (GNUNET_GETOPT_option_string ('d',
- "destination",
- "PAYTO-URL",
- "Destination account for the wire transfer.",
- &destination_account_url)),
- GNUNET_GETOPT_OPTION_END
- };
- int ret;
-
- GNUNET_assert
- (GNUNET_OK == GNUNET_log_setup ("taler-wire",
- "WARNING",
- NULL)); /* filename */
- ret = GNUNET_PROGRAM_run
- (argc,
- argv,
- "taler-wire",
- "CLI bank client.",
- options,
- &run,
- NULL);
- if (GNUNET_OK != ret)
- return ret;
- return global_ret;
-}
-
-
-/* end of taler-wire.c */