aboutsummaryrefslogtreecommitdiff
path: root/src/bank-lib/taler-bank-transfer.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2017-12-14 15:33:10 +0100
committerChristian Grothoff <christian@grothoff.org>2017-12-14 15:33:10 +0100
commit229907c6e233609ccfafe1823f281581bf5e9680 (patch)
tree2c4b89388a2dbcd3eb17a9080becc6a4fa1cdd19 /src/bank-lib/taler-bank-transfer.c
parent1897d65af506f083d8296e6184c9633d0fb5bae0 (diff)
implement taler-bank-transfer, fixes #5195
Diffstat (limited to 'src/bank-lib/taler-bank-transfer.c')
-rw-r--r--src/bank-lib/taler-bank-transfer.c264
1 files changed, 264 insertions, 0 deletions
diff --git a/src/bank-lib/taler-bank-transfer.c b/src/bank-lib/taler-bank-transfer.c
new file mode 100644
index 000000000..4ba8a020e
--- /dev/null
+++ b/src/bank-lib/taler-bank-transfer.c
@@ -0,0 +1,264 @@
+/*
+ This file is part of TALER
+ Copyright (C) 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
+ 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-bank-transfer.c
+ * @brief Execute wire transfer.
+ * @author Christian Grothoff
+ */
+#include "platform.h"
+#include <gnunet/gnunet_util_lib.h>
+#include <gnunet/gnunet_json_lib.h>
+#include <jansson.h>
+#include "taler_bank_service.h"
+
+/**
+ * Bank URL.
+ */
+static char *bank_url;
+
+/**
+ * Amount to transfer.
+ */
+static struct TALER_Amount amount;
+
+/**
+ * Debit account number.
+ */
+static unsigned long long debit_account_no;
+
+/**
+ * Credit account number.
+ */
+static unsigned long long credit_account_no;
+
+/**
+ * Wire transfer subject.
+ */
+static char *subject;
+
+/**
+ * Username for authentication.
+ */
+static char *username;
+
+/**
+ * Password for authentication.
+ */
+static char *password;
+
+/**
+ * Return value from main().
+ */
+static int global_ret;
+
+/**
+ * Main execution context for the main loop.
+ */
+static struct GNUNET_CURL_Context *ctx;
+
+/**
+ * Handle to access the exchange.
+ */
+static struct TALER_BANK_AdminAddIncomingHandle *op;
+
+/**
+ * Context for running the CURL event loop.
+ */
+static struct GNUNET_CURL_RescheduleContext *rc;
+
+
+/**
+ * Function run when the test terminates (good or bad).
+ * Cleans up our state.
+ *
+ * @param cls NULL
+ */
+static void
+do_shutdown (void *cls)
+{
+ if (NULL != op)
+ {
+ TALER_BANK_admin_add_incoming_cancel (op);
+ op = NULL;
+ }
+ if (NULL != ctx)
+ {
+ GNUNET_CURL_fini (ctx);
+ ctx = NULL;
+ }
+ if (NULL != rc)
+ {
+ GNUNET_CURL_gnunet_rc_destroy (rc);
+ rc = NULL;
+ }
+}
+
+
+/**
+ * Function called with the result of the operation.
+ *
+ * @param cls closure
+ * @param http_status HTTP response code, #MHD_HTTP_OK (200) for successful status request
+ * 0 if the bank's reply is bogus (fails to follow the protocol)
+ * @param ec detailed error code
+ * @param serial_id unique ID of the wire transfer in the bank's records; UINT64_MAX on error
+ * @param json detailed response from the HTTPD, or NULL if reply was not in JSON
+ */
+static void
+res_cb (void *cls,
+ unsigned int http_status,
+ enum TALER_ErrorCode ec,
+ uint64_t serial_id,
+ const json_t *json)
+{
+ op = NULL;
+ switch (ec)
+ {
+ case TALER_EC_NONE:
+ global_ret = 0;
+ fprintf (stdout,
+ "%llu\n",
+ (unsigned long long) serial_id);
+ break;
+ default:
+ fprintf (stderr,
+ "Operation failed with staus code %u/%u\n",
+ (unsigned int) ec,
+ http_status);
+ if (NULL != json)
+ json_dumpf (json,
+ stderr,
+ JSON_INDENT (2));
+ break;
+ }
+ GNUNET_SCHEDULER_shutdown ();
+}
+
+
+/**
+ * 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)
+{
+ struct TALER_BANK_AuthenticationData auth;
+
+ ctx = GNUNET_CURL_init (&GNUNET_CURL_gnunet_scheduler_reschedule,
+ &rc);
+ GNUNET_assert (NULL != ctx);
+ rc = GNUNET_CURL_gnunet_rc_create (ctx);
+
+ auth.method = TALER_BANK_AUTH_BASIC;
+ auth.details.basic.username = username;
+ auth.details.basic.password = password;
+ op = TALER_BANK_admin_add_incoming (ctx,
+ bank_url,
+ &auth,
+ "https://exchange.com/legacy",
+ subject,
+ &amount,
+ debit_account_no,
+ credit_account_no,
+ &res_cb,
+ NULL);
+ GNUNET_SCHEDULER_add_shutdown (&do_shutdown,
+ NULL);
+ if (NULL == op)
+ GNUNET_SCHEDULER_shutdown ();
+}
+
+
+/**
+ * The main function of the reservemod tool
+ *
+ * @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)
+{
+ const struct GNUNET_GETOPT_CommandLineOption options[] = {
+ GNUNET_GETOPT_option_mandatory
+ (TALER_getopt_get_amount ('a',
+ "amount",
+ "VALUE",
+ "value to transfer",
+ &amount)),
+ GNUNET_GETOPT_option_mandatory
+ (GNUNET_GETOPT_option_string ('b',
+ "bank",
+ "URL",
+ "base URL of the bank",
+ &bank_url)),
+ GNUNET_GETOPT_option_help ("Deposit funds into a Taler reserve"),
+ GNUNET_GETOPT_option_mandatory
+ (GNUNET_GETOPT_option_ulong ('C',
+ "credit",
+ "ACCOUNT",
+ "number of the bank account to credit",
+ &credit_account_no)),
+ GNUNET_GETOPT_option_mandatory
+ (GNUNET_GETOPT_option_ulong ('D',
+ "debit",
+ "ACCOUNT",
+ "number of the bank account to debit",
+ &debit_account_no)),
+ GNUNET_GETOPT_option_mandatory
+ (GNUNET_GETOPT_option_string ('s',
+ "subject",
+ "STRING",
+ "specifies the wire transfer subject",
+ &subject)),
+ GNUNET_GETOPT_option_mandatory
+ (GNUNET_GETOPT_option_string ('u',
+ "user",
+ "USERNAME",
+ "username to use for authentication",
+ &username)),
+ GNUNET_GETOPT_option_mandatory
+ (GNUNET_GETOPT_option_string ('p',
+ "pass",
+ "PASSPHRASE",
+ "passphrase to use for authentication",
+ &subject)),
+ GNUNET_GETOPT_OPTION_END
+ };
+
+ GNUNET_assert (GNUNET_OK ==
+ GNUNET_log_setup ("taler-bank-transfer",
+ "WARNING",
+ NULL));
+ global_ret = 1;
+ if (GNUNET_OK !=
+ GNUNET_PROGRAM_run (argc, argv,
+ "taler-bank-transfer",
+ "Execute bank transfer",
+ options,
+ &run, NULL))
+ return 1;
+ return global_ret;
+}
+
+/* end taler-bank-transfer.c */