From beee1fb689ab5d0945d4aa99d7942c144e2bdd5a Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Thu, 11 May 2017 10:56:15 +0200 Subject: generate auditor signatures in exchange-lib testcase, and handle problem with bogus revocation keys during startup more gracefully by terminating instead of looping --- src/exchange-lib/test_exchange_api.c | 22 ++++++++ src/exchange-lib/test_exchange_api.conf | 4 ++ src/exchange/taler-exchange-httpd_keystate.c | 81 ++++++++++++++++------------ 3 files changed, 72 insertions(+), 35 deletions(-) diff --git a/src/exchange-lib/test_exchange_api.c b/src/exchange-lib/test_exchange_api.c index fb0c93eb1..4c10ea8f6 100644 --- a/src/exchange-lib/test_exchange_api.c +++ b/src/exchange-lib/test_exchange_api.c @@ -3648,6 +3648,7 @@ main (int argc, "taler-exchange-keyup", "taler-exchange-keyup", "-c", "test_exchange_api.conf", + "-o", "auditor.in", NULL); if (NULL == proc) { @@ -3657,6 +3658,27 @@ main (int argc, } GNUNET_OS_process_wait (proc); GNUNET_OS_process_destroy (proc); + + proc = GNUNET_OS_start_process (GNUNET_NO, + GNUNET_OS_INHERIT_STD_ALL, + NULL, NULL, NULL, + "taler-auditor-sign", + "taler-auditor-sign", + "-c", "test_exchange_api.conf", + "-u", "http://auditor/", + "-m", "98NJW3CQHZQGQXTY3K85K531XKPAPAVV4Q5V8PYYRR00NJGZWNVG", + "-r", "auditor.in", + "-o", "test_exchange_api_home/.local/share/taler/auditors/auditor.out", + NULL); + if (NULL == proc) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Failed to run `taler-exchange-keyup`, is your PATH correct?\n"); + return 77; + } + GNUNET_OS_process_wait (proc); + GNUNET_OS_process_destroy (proc); + proc = GNUNET_OS_start_process (GNUNET_NO, GNUNET_OS_INHERIT_STD_ALL, NULL, NULL, NULL, diff --git a/src/exchange-lib/test_exchange_api.conf b/src/exchange-lib/test_exchange_api.conf index 89d14799a..a8543bc14 100644 --- a/src/exchange-lib/test_exchange_api.conf +++ b/src/exchange-lib/test_exchange_api.conf @@ -58,6 +58,10 @@ CLOSING-FEE-2024 = EUR:0.01 CLOSING-FEE-2025 = EUR:0.01 CLOSING-FEE-2026 = EUR:0.01 +[exchange_keys] +# Keep it short so the test runs fast. +LOOKAHEAD_SIGN = 12 h + [exchange-wire-test] # Enable 'test' for testing of the actual coin operations. ENABLE = YES diff --git a/src/exchange/taler-exchange-httpd_keystate.c b/src/exchange/taler-exchange-httpd_keystate.c index 057f89ce3..0de85eeb7 100644 --- a/src/exchange/taler-exchange-httpd_keystate.c +++ b/src/exchange/taler-exchange-httpd_keystate.c @@ -265,6 +265,34 @@ store_in_map (struct GNUNET_CONTAINER_MultiHashMap *map, } +/** + * Handle a signal, writing relevant signal numbers to the pipe. + * + * @param signal_number the signal number + */ +static void +handle_signal (int signal_number) +{ + ssize_t res; + char c = signal_number; + + res = write (reload_pipe[1], + &c, + 1); + if ( (res < 0) && + (EINTR != errno) ) + { + GNUNET_break (0); + return; + } + if (0 == res) + { + GNUNET_break (0); + return; + } +} + + /** * Iterator for (re)loading/initializing denomination keys. * @@ -284,6 +312,7 @@ reload_keys_denom_iter (void *cls, { struct TEH_KS_StateHandle *ctx = cls; struct GNUNET_TIME_Absolute now; + struct GNUNET_TIME_Absolute start; struct GNUNET_TIME_Absolute horizon; struct GNUNET_TIME_Absolute expire_deposit; struct GNUNET_HashCode denom_key_hash; @@ -318,6 +347,8 @@ reload_keys_denom_iter (void *cls, if (NULL != revocation_master_sig) { + unsigned int thresh = 0; + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Adding denomination key `%s' to revokation set\n", alias); @@ -326,12 +357,19 @@ reload_keys_denom_iter (void *cls, if (GNUNET_NO == res) return GNUNET_OK; /* Try to insert DKI into DB until we succeed; note that if the DB - failure is persistent, this code may loop forever (as there is no - sane alternative, we cannot continue without the DKI being in the - DB). */ + failure is persistent, we need to die, as we cannot continue + without the DKI being in the DB). */ res = GNUNET_SYSERR; while (GNUNET_OK != res) { + thresh++; + if (thresh > 16) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Giving up, this is fatal. Committing suicide via SIGTERM.\n"); + handle_signal (SIGTERM); + return GNUNET_SYSERR; + } res = TEH_plugin->start (TEH_plugin->cls, session); if (GNUNET_OK != res) @@ -366,12 +404,13 @@ reload_keys_denom_iter (void *cls, return GNUNET_OK; } horizon = GNUNET_TIME_relative_to_absolute (TALER_EXCHANGE_conf_duration_provide ()); - if (GNUNET_TIME_absolute_ntoh (dki->issue.properties.start).abs_value_us > - horizon.abs_value_us) + start = GNUNET_TIME_absolute_ntoh (dki->issue.properties.start); + if (start.abs_value_us > horizon.abs_value_us) { GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Skipping future denomination key `%s'\n", - alias); + "Skipping future denomination key `%s' (starts at %s)\n", + alias, + GNUNET_STRINGS_absolute_time_to_string (start)); return GNUNET_OK; } @@ -956,34 +995,6 @@ TEH_KS_denomination_key_lookup (const struct TEH_KS_StateHandle *key_state, } -/** - * Handle a signal, writing relevant signal numbers to the pipe. - * - * @param signal_number the signal number - */ -static void -handle_signal (int signal_number) -{ - ssize_t res; - char c = signal_number; - - res = write (reload_pipe[1], - &c, - 1); - if ( (res < 0) && - (EINTR != errno) ) - { - GNUNET_break (0); - return; - } - if (0 == res) - { - GNUNET_break (0); - return; - } -} - - /** * Call #handle_signal() to pass the received signal via * the control pipe. -- cgit v1.2.3