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",
"taler-exchange-keyup", "taler-exchange-keyup",
"-c", "test_exchange_api.conf", "-c", "test_exchange_api.conf",
"-o", "auditor.in",
NULL); NULL);
if (NULL == proc) if (NULL == proc)
{ {
@ -3657,6 +3658,27 @@ main (int argc,
} }
GNUNET_OS_process_wait (proc); GNUNET_OS_process_wait (proc);
GNUNET_OS_process_destroy (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, proc = GNUNET_OS_start_process (GNUNET_NO,
GNUNET_OS_INHERIT_STD_ALL, GNUNET_OS_INHERIT_STD_ALL,
NULL, NULL, NULL, NULL, NULL, NULL,

View File

@ -58,6 +58,10 @@ CLOSING-FEE-2024 = EUR:0.01
CLOSING-FEE-2025 = EUR:0.01 CLOSING-FEE-2025 = EUR:0.01
CLOSING-FEE-2026 = 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] [exchange-wire-test]
# Enable 'test' for testing of the actual coin operations. # Enable 'test' for testing of the actual coin operations.
ENABLE = YES 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. * Iterator for (re)loading/initializing denomination keys.
* *
@ -284,6 +312,7 @@ reload_keys_denom_iter (void *cls,
{ {
struct TEH_KS_StateHandle *ctx = cls; struct TEH_KS_StateHandle *ctx = cls;
struct GNUNET_TIME_Absolute now; struct GNUNET_TIME_Absolute now;
struct GNUNET_TIME_Absolute start;
struct GNUNET_TIME_Absolute horizon; struct GNUNET_TIME_Absolute horizon;
struct GNUNET_TIME_Absolute expire_deposit; struct GNUNET_TIME_Absolute expire_deposit;
struct GNUNET_HashCode denom_key_hash; struct GNUNET_HashCode denom_key_hash;
@ -318,6 +347,8 @@ reload_keys_denom_iter (void *cls,
if (NULL != revocation_master_sig) if (NULL != revocation_master_sig)
{ {
unsigned int thresh = 0;
GNUNET_log (GNUNET_ERROR_TYPE_INFO, GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"Adding denomination key `%s' to revokation set\n", "Adding denomination key `%s' to revokation set\n",
alias); alias);
@ -326,12 +357,19 @@ reload_keys_denom_iter (void *cls,
if (GNUNET_NO == res) if (GNUNET_NO == res)
return GNUNET_OK; return GNUNET_OK;
/* Try to insert DKI into DB until we succeed; note that if the DB /* 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 failure is persistent, we need to die, as we cannot continue
sane alternative, we cannot continue without the DKI being in the without the DKI being in the DB). */
DB). */
res = GNUNET_SYSERR; res = GNUNET_SYSERR;
while (GNUNET_OK != res) 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, res = TEH_plugin->start (TEH_plugin->cls,
session); session);
if (GNUNET_OK != res) if (GNUNET_OK != res)
@ -366,12 +404,13 @@ reload_keys_denom_iter (void *cls,
return GNUNET_OK; return GNUNET_OK;
} }
horizon = GNUNET_TIME_relative_to_absolute (TALER_EXCHANGE_conf_duration_provide ()); horizon = GNUNET_TIME_relative_to_absolute (TALER_EXCHANGE_conf_duration_provide ());
if (GNUNET_TIME_absolute_ntoh (dki->issue.properties.start).abs_value_us > start = GNUNET_TIME_absolute_ntoh (dki->issue.properties.start);
horizon.abs_value_us) if (start.abs_value_us > horizon.abs_value_us)
{ {
GNUNET_log (GNUNET_ERROR_TYPE_INFO, GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"Skipping future denomination key `%s'\n", "Skipping future denomination key `%s' (starts at %s)\n",
alias); alias,
GNUNET_STRINGS_absolute_time_to_string (start));
return GNUNET_OK; 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 * Call #handle_signal() to pass the received signal via
* the control pipe. * the control pipe.