summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2017-05-11 10:56:15 +0200
committerChristian Grothoff <christian@grothoff.org>2017-05-11 10:56:15 +0200
commitbeee1fb689ab5d0945d4aa99d7942c144e2bdd5a (patch)
tree87e6615941891aef682022e7512986105897591a /src
parent3e5d200d95aca271b567be2ab0fa74b2e7be99ba (diff)
downloadexchange-beee1fb689ab5d0945d4aa99d7942c144e2bdd5a.tar.gz
exchange-beee1fb689ab5d0945d4aa99d7942c144e2bdd5a.tar.bz2
exchange-beee1fb689ab5d0945d4aa99d7942c144e2bdd5a.zip
generate auditor signatures in exchange-lib testcase, and handle problem with bogus revocation keys during startup more gracefully by terminating instead of looping
Diffstat (limited to 'src')
-rw-r--r--src/exchange-lib/test_exchange_api.c22
-rw-r--r--src/exchange-lib/test_exchange_api.conf4
-rw-r--r--src/exchange/taler-exchange-httpd_keystate.c81
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
@@ -266,6 +266,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.
*
* @param cls closure
@@ -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;
}
@@ -957,34 +996,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.
*/