From ebc8ae68bee955d8df658afac85c9a0cbea716d0 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sat, 3 Nov 2018 21:28:52 +0100 Subject: implement taler-auditor-exchange --- src/auditor/.gitignore | 1 + src/auditor/Makefile.am | 10 +++ src/auditor/taler-auditor-exchange.c | 169 +++++++++++++++++++++++++++++++++++ src/auditor/taler-auditor-sign.c | 14 +-- 4 files changed, 187 insertions(+), 7 deletions(-) create mode 100644 src/auditor/taler-auditor-exchange.c (limited to 'src/auditor') diff --git a/src/auditor/.gitignore b/src/auditor/.gitignore index d6cf77f83..d92c3a3fa 100644 --- a/src/auditor/.gitignore +++ b/src/auditor/.gitignore @@ -1 +1,2 @@ taler-auditor-httpd +taler-auditor-exchange diff --git a/src/auditor/Makefile.am b/src/auditor/Makefile.am index e98ffefb6..4da582970 100644 --- a/src/auditor/Makefile.am +++ b/src/auditor/Makefile.am @@ -13,6 +13,7 @@ pkgcfg_DATA = \ bin_PROGRAMS = \ taler-auditor \ + taler-auditor-exchange \ taler-auditor-httpd \ taler-wire-auditor \ taler-auditor-sign \ @@ -89,6 +90,15 @@ taler_auditor_sign_LDADD = \ -lgnunetutil $(XLIB) +taler_auditor_exchange_SOURCES = \ + taler-auditor-exchange.c +taler_auditor_exchange_LDADD = \ + $(LIBGCRYPT_LIBS) \ + $(top_builddir)/src/util/libtalerutil.la \ + $(top_builddir)/src/auditordb/libtalerauditordb.la \ + -lgnunetutil $(XLIB) + + EXTRA_DIST = \ auditor.conf diff --git a/src/auditor/taler-auditor-exchange.c b/src/auditor/taler-auditor-exchange.c new file mode 100644 index 000000000..b316f6026 --- /dev/null +++ b/src/auditor/taler-auditor-exchange.c @@ -0,0 +1,169 @@ +/* + This file is part of TALER + Copyright (C) 2014, 2015, 2018 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 +*/ +/** + * @file taler-auditor-exchange.c + * @brief Tool used by the auditor to add or remove the exchange's master key + * to its database. + * @author Christian Grothoff + */ +#include +#include "taler_exchangedb_lib.h" +#include "taler_auditordb_lib.h" + + +/** + * URL of the exchange. + */ +static char *exchange_url; + +/** + * Master public key of the exchange. + */ +static struct TALER_MasterPublicKeyP master_public_key; + +/** + * Our configuration. + */ +static struct GNUNET_CONFIGURATION_Handle *cfg; + +/** + * Handle to access the auditor's database. + */ +static struct TALER_AUDITORDB_Plugin *adb; + +/** + * -r option given. + */ +static int remove_flag; + + +/** + * The main function of the taler-auditor-exchange tool. This tool is used + * to add (or remove) an exchange's master key and base URL to the auditor's + * database. + * + * @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) +{ + char *cfgfile = NULL; + const struct GNUNET_GETOPT_CommandLineOption options[] = { + GNUNET_GETOPT_option_cfgfile (&cfgfile), + GNUNET_GETOPT_option_help ("Add or remove exchange to list of audited exchanges"), + GNUNET_GETOPT_option_mandatory + (GNUNET_GETOPT_option_base32_auto ('m', + "exchange-key", + "KEY", + "public key of the exchange (Crockford base32 encoded)", + &master_public_key)), + GNUNET_GETOPT_option_mandatory + (GNUNET_GETOPT_option_string ('u', + "exchange-url", + "URL", + "base URL of the exchange", + &exchange_url)), + GNUNET_GETOPT_option_flag ('r', + "remove", + "remove the exchange's key (default is to add)", + &remove_flag), + GNUNET_GETOPT_option_version (VERSION "-" VCS_VERSION), + GNUNET_GETOPT_OPTION_END + }; + + GNUNET_assert (GNUNET_OK == + GNUNET_log_setup ("taler-auditor-exchange", + "WARNING", + NULL)); + if (GNUNET_GETOPT_run ("taler-auditor-exchange", + options, + argc, argv) < 0) + return 1; + cfg = GNUNET_CONFIGURATION_create (); + if (GNUNET_SYSERR == + GNUNET_CONFIGURATION_load (cfg, + cfgfile)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Malformed configuration file `%s', exit ...\n"), + cfgfile); + GNUNET_free_non_null (cfgfile); + return 1; + } + GNUNET_free_non_null (cfgfile); + + if (NULL == + (adb = TALER_AUDITORDB_plugin_load (cfg))) + { + fprintf (stderr, + "Failed to initialize auditor database plugin.\n"); + return 3; + } + + /* Create required tables */ + if (GNUNET_OK != + adb->create_tables (adb->cls)) + { + fprintf (stderr, + "Failed to create tables in auditor's database\n"); + TALER_AUDITORDB_plugin_unload (adb); + return 3; + } + + /* Update DB */ + { + enum GNUNET_DB_QueryStatus qs; + struct TALER_AUDITORDB_Session *session; + + session = adb->get_session (adb->cls); + if (NULL == session) + { + fprintf (stderr, + "Failed to initialize database session\n"); + TALER_AUDITORDB_plugin_unload (adb); + return 3; + } + + if (remove_flag) + { + qs = adb->delete_exchange (adb->cls, + session, + &master_public_key); + } + else + { + qs = adb->insert_exchange (adb->cls, + session, + &master_public_key, + exchange_url); + } + if (0 > qs) + { + fprintf (stderr, + "Failed to update auditor DB (%d)\n", + qs); + TALER_AUDITORDB_plugin_unload (adb); + return 3; + } + } + TALER_AUDITORDB_plugin_unload (adb); + return 0; +} + +/* end of taler-auditor-exchange.c */ diff --git a/src/auditor/taler-auditor-sign.c b/src/auditor/taler-auditor-sign.c index 964480a6d..e34537137 100644 --- a/src/auditor/taler-auditor-sign.c +++ b/src/auditor/taler-auditor-sign.c @@ -1,6 +1,6 @@ /* This file is part of TALER - Copyright (C) 2014, 2015 GNUnet e.V. + Copyright (C) 2014, 2015, 2018 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 @@ -151,13 +151,13 @@ main (int argc, "file containing the private key of the auditor", &auditor_key_file), GNUNET_GETOPT_option_cfgfile (&cfgfile), - GNUNET_GETOPT_option_help ("Private key of the auditor to use for signing"), + GNUNET_GETOPT_option_help ("Sign denomination keys of an exchange"), GNUNET_GETOPT_option_mandatory (GNUNET_GETOPT_option_base32_auto ('m', - "exchange-key", - "KEY", - "public key of the exchange (Crockford base32 encoded)", - &master_public_key)), + "exchange-key", + "KEY", + "public key of the exchange (Crockford base32 encoded)", + &master_public_key)), GNUNET_GETOPT_option_string ('u', "auditor-url", "URL", @@ -398,7 +398,7 @@ main (int argc, if (0 > qs) { fprintf (stderr, - "Failed to store key in auditor DB\n"); + "Failed to store key in auditor DB (did you add the exchange first?)\n"); TALER_AUDITORDB_plugin_unload (adb); GNUNET_free (dks); GNUNET_free (sigs); -- cgit v1.2.3