From 066f03f95a1f7c24c3b2f360f774144b120f42e8 Mon Sep 17 00:00:00 2001 From: Marcello Stanisci Date: Mon, 11 Feb 2019 18:28:14 +0100 Subject: 4692. Logic to ask for transaction history. --- src/exchange-tools/taler-wire.c | 191 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 175 insertions(+), 16 deletions(-) (limited to 'src/exchange-tools') diff --git a/src/exchange-tools/taler-wire.c b/src/exchange-tools/taler-wire.c index 3c5550212..1aba95c34 100644 --- a/src/exchange-tools/taler-wire.c +++ b/src/exchange-tools/taler-wire.c @@ -3,17 +3,17 @@ Copyright (C) 2014-2018 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. + 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. + 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, + You should have received a copy of the GNU General Public + License along with TALER; see the file COPYING. If not, see */ @@ -30,14 +30,44 @@ #include /** - * Plugin name specified by the user. + * If set to GNUNET_YES, then we'll ask the bank for a list + * of transactions from the account mentioned in the config + * section. + */ +int history; + +/** + * If set to GNUNET_YES, then we'll ask the bank to execute a + * wire transfer. + */ +int transfer; + +/** + * Name of the wire plugin to use with the bank. */ char *plugin_name; /** * Global return code. */ -unsigned int global_ret; +unsigned int global_ret = 0; + +/** + * Base32 encoding of a transaction ID. When asking the + * bank for a transaction history, all the results will + * have a transaction ID settled *after* this one. + */ +char *since_when; + +/** + * Which config section has the credentials to access the bank. + */ +char *account_section; + +/** + * Binary version of the 'since-when' CLI option. + */ +void *since_when_bin; /** * Wire plugin handle. @@ -45,6 +75,95 @@ unsigned int global_ret; struct TALER_WIRE_Plugin *plugin_handle; +/** + * Callback used to process ONE entry in the transaction + * history returned by the bank. + * @param cls closure + * @param ec taler error code + * @param dir direction of the transfer + * @param row_off identification of the position at + * which we are querying + * @param row_off_size number of bytes in @a row_off + * @param details details about the wire transfer + * @return #GNUNET_OK to continue, #GNUNET_SYSERR to + * abort iteration + */ +int +cb (void *cls, + enum TALER_ErrorCode ec, + enum TALER_BANK_Direction dir, + const void *row_off, + size_t row_off_size, + const struct TALER_WIRE_TransferDetails *details) +{ + char *row_off_enc; + + row_off_enc = GNUNET_STRINGS_data_to_string_alloc (row_off, + row_off_size); + + fprintf (stdout, + "History of transactions:\n"); + + /* Give more details on screen (??) */ + fprintf (stdout, + "%s\n", + row_off_enc); + + GNUNET_free (row_off_enc); + + return GNUNET_SYSERR; +} + +/** + * Ask the bank to execute a wire transfer. + */ +void +execute_wire_transfer () +{} + +/** + * Ask the bank the list of transactions for the bank account + * mentioned in the config section given by the user. + */ +void +execute_history () +{ + size_t bin_len = (strlen (since_when) * 5) / 8; + + if (NULL == since_when) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Missing since-when option\n"); + global_ret = 1; + return; + } + + since_when_bin = GNUNET_malloc (bin_len); + GNUNET_assert + (GNUNET_OK == GNUNET_STRINGS_string_to_data + (since_when, + strlen (since_when), + since_when_bin, + bin_len)); + + if (NULL == plugin_handle->get_history + (plugin_handle->cls, + account_section, + TALER_BANK_DIRECTION_BOTH, + since_when_bin, + bin_len, + 10, + cb, + NULL)); + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Could not request the transaction history.\n"); + global_ret = 1; + return; + } + +} + /** * Main function that will be run. * @@ -60,11 +179,24 @@ run (void *cls, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg) { - if (NULL == plugin_name) + if (NULL == account_section) { global_ret = 1; GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "The PLUGIN command line option is mandatory.\n"); + "The ACCOUNT-SECTION is mandatory.\n"); + return; + } + + if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string + (cfg, + account_section, + "plugin", + &plugin_name)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Could not find the 'plugin' value under %s\n", + account_section); + global_ret = 1; return; } @@ -77,6 +209,11 @@ run (void *cls, global_ret = 1; return; } + + if (GNUNET_YES == history) + execute_history (); + else + execute_wire_transfer (); } /** @@ -95,11 +232,33 @@ main (int argc, { struct GNUNET_GETOPT_CommandLineOption options[] = { - GNUNET_GETOPT_option_string ('p', - "plugin", - "PLUGIN", - "Wire plugin to use", - &plugin_name), + GNUNET_GETOPT_option_flag ('h', + "history", + "Wire plugin to use", + &history), + + GNUNET_GETOPT_option_flag ('t', + "transfer", + "Execute a wire transfer.", + &transfer), + + GNUNET_GETOPT_option_string ('w', + "since-when", + "SW", + "When asking the bank for" + " transactions history, this" + " option commands that all the" + " results should have IDs settled" + " after SW", + &since_when), + + GNUNET_GETOPT_option_string ('s', + "section", + "ACCOUNT-SECTION", + "Which config section has the" + " credentials to access the" + " bank.\n", + &account_section), GNUNET_GETOPT_OPTION_END }; -- cgit v1.2.3