generate auditor signatures in exchange-lib testcase, and handle problem with bogus revocation keys during startup more gracefully by terminating instead of looping

This commit is contained in:
Christian Grothoff 2017-05-11 10:56:15 +02:00
parent 3e5d200d95
commit beee1fb689
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
3 changed files with 72 additions and 35 deletions

View File

@ -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,

View File

@ -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

View File

@ -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.