4692. Logic to ask for transaction history.

This commit is contained in:
Marcello Stanisci 2019-02-11 18:28:14 +01:00
parent cd0b9e8e0a
commit 066f03f95a
No known key found for this signature in database
GPG Key ID: 8D526861953F4C0F

View File

@ -3,17 +3,17 @@
Copyright (C) 2014-2018 Taler Systems SA Copyright (C) 2014-2018 Taler Systems SA
TALER is free software; you can redistribute it and/or modify TALER is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published it under the terms of the GNU General Public License as
by the Free Software Foundation; either version 3, or (at your published by the Free Software Foundation; either version 3,
option) any later version. or (at your option) any later version.
TALER is distributed in the hope that it will be useful, but TALER is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public
along with TALER; see the file COPYING. If not, License along with TALER; see the file COPYING. If not,
see <http://www.gnu.org/licenses/> see <http://www.gnu.org/licenses/>
*/ */
@ -30,14 +30,44 @@
#include <taler/taler_wire_lib.h> #include <taler/taler_wire_lib.h>
/** /**
* 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; char *plugin_name;
/** /**
* Global return code. * 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. * Wire plugin handle.
@ -45,6 +75,95 @@ unsigned int global_ret;
struct TALER_WIRE_Plugin *plugin_handle; 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. * Main function that will be run.
* *
@ -60,11 +179,24 @@ run (void *cls,
const char *cfgfile, const char *cfgfile,
const struct GNUNET_CONFIGURATION_Handle *cfg) const struct GNUNET_CONFIGURATION_Handle *cfg)
{ {
if (NULL == plugin_name) if (NULL == account_section)
{ {
global_ret = 1; global_ret = 1;
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 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; return;
} }
@ -77,6 +209,11 @@ run (void *cls,
global_ret = 1; global_ret = 1;
return; return;
} }
if (GNUNET_YES == history)
execute_history ();
else
execute_wire_transfer ();
} }
/** /**
@ -95,11 +232,33 @@ main (int argc,
{ {
struct GNUNET_GETOPT_CommandLineOption options[] = { struct GNUNET_GETOPT_CommandLineOption options[] = {
GNUNET_GETOPT_option_string ('p', GNUNET_GETOPT_option_flag ('h',
"plugin", "history",
"PLUGIN",
"Wire plugin to use", "Wire plugin to use",
&plugin_name), &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 GNUNET_GETOPT_OPTION_END
}; };