-fix /keys initialization DB logic

This commit is contained in:
Christian Grothoff 2022-06-29 08:31:00 +02:00
parent 09479c5595
commit 3b091cd5de
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
3 changed files with 41 additions and 24 deletions

View File

@ -2604,16 +2604,8 @@ TEH_keys_update_states ()
} }
/** struct TEH_KeyStateHandle *
* Obtain the key state. Should ONLY be used TEH_keys_get_state2 (bool management_only)
* directly if @a management_only is true. Otherwise use #TEH_keys_get_state().
*
* @param management_only if we should NOT run 'finish_keys_response()'
* because we only need the state for the /management/keys API
* @return NULL on error
*/
static struct TEH_KeyStateHandle *
get_key_state (bool management_only)
{ {
struct TEH_KeyStateHandle *old_ksh; struct TEH_KeyStateHandle *old_ksh;
struct TEH_KeyStateHandle *ksh; struct TEH_KeyStateHandle *ksh;
@ -2653,7 +2645,7 @@ TEH_keys_get_state (void)
{ {
struct TEH_KeyStateHandle *ksh; struct TEH_KeyStateHandle *ksh;
ksh = get_key_state (false); ksh = TEH_keys_get_state2 (false);
if (NULL == ksh) if (NULL == ksh)
return NULL; return NULL;
if (ksh->management_only) if (ksh->management_only)
@ -3247,21 +3239,14 @@ load_extension_data (const char *section_name,
enum GNUNET_GenericReturnValue enum GNUNET_GenericReturnValue
TEH_keys_load_fees (const struct TALER_DenominationHashP *h_denom_pub, TEH_keys_load_fees (struct TEH_KeyStateHandle *ksh,
const struct TALER_DenominationHashP *h_denom_pub,
struct TALER_DenominationPublicKey *denom_pub, struct TALER_DenominationPublicKey *denom_pub,
struct TALER_EXCHANGEDB_DenominationKeyMetaData *meta) struct TALER_EXCHANGEDB_DenominationKeyMetaData *meta)
{ {
struct TEH_KeyStateHandle *ksh;
struct HelperDenomination *hd; struct HelperDenomination *hd;
enum GNUNET_GenericReturnValue ok; enum GNUNET_GenericReturnValue ok;
ksh = get_key_state (true);
if (NULL == ksh)
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
hd = GNUNET_CONTAINER_multihashmap_get (ksh->helpers->denom_keys, hd = GNUNET_CONTAINER_multihashmap_get (ksh->helpers->denom_keys,
&h_denom_pub->hash); &h_denom_pub->hash);
if (NULL == hd) if (NULL == hd)
@ -3304,7 +3289,7 @@ TEH_keys_get_timing (const struct TALER_ExchangePublicKeyP *exchange_pub,
struct HelperSignkey *hsk; struct HelperSignkey *hsk;
struct GNUNET_PeerIdentity pid; struct GNUNET_PeerIdentity pid;
ksh = get_key_state (true); ksh = TEH_keys_get_state2 (true);
if (NULL == ksh) if (NULL == ksh)
{ {
GNUNET_break (0); GNUNET_break (0);
@ -3474,7 +3459,7 @@ TEH_keys_management_get_keys_handler (const struct TEH_RequestHandler *rh,
json_t *reply; json_t *reply;
(void) rh; (void) rh;
ksh = get_key_state (true); ksh = TEH_keys_get_state2 (true);
if (NULL == ksh) if (NULL == ksh)
{ {
return TALER_MHD_reply_with_error (connection, return TALER_MHD_reply_with_error (connection,

View File

@ -174,6 +174,18 @@ struct TEH_KeyStateHandle *
TEH_keys_get_state (void); TEH_keys_get_state (void);
/**
* Obtain the key state. Should ONLY be used
* directly if @a management_only is true. Otherwise use #TEH_keys_get_state().
*
* @param management_only if we should NOT run finish_keys_response()
* because we only need the state for the /management/keys API
* @return NULL on error
*/
struct TEH_KeyStateHandle *
TEH_keys_get_state2 (bool management_only);
/** /**
* Something changed in the database. Rebuild all key states. This function * Something changed in the database. Rebuild all key states. This function
* should be called if the exchange learns about a new signature from an * should be called if the exchange learns about a new signature from an
@ -485,6 +497,7 @@ TEH_keys_management_get_keys_handler (const struct TEH_RequestHandler *rh,
* Load fees and expiration times (!) for the denomination type configured for * Load fees and expiration times (!) for the denomination type configured for
* the denomination matching @a h_denom_pub. * the denomination matching @a h_denom_pub.
* *
* @param ksh key state to load fees from
* @param h_denom_pub hash of the denomination public key * @param h_denom_pub hash of the denomination public key
* to use to derive the section name of the configuration to use * to use to derive the section name of the configuration to use
* @param[out] denom_pub set to the denomination public key (to be freed by caller!) * @param[out] denom_pub set to the denomination public key (to be freed by caller!)
@ -494,7 +507,8 @@ TEH_keys_management_get_keys_handler (const struct TEH_RequestHandler *rh,
* #GNUNET_SYSERR on hard errors * #GNUNET_SYSERR on hard errors
*/ */
enum GNUNET_GenericReturnValue enum GNUNET_GenericReturnValue
TEH_keys_load_fees (const struct TALER_DenominationHashP *h_denom_pub, TEH_keys_load_fees (struct TEH_KeyStateHandle *ksh,
const struct TALER_DenominationHashP *h_denom_pub,
struct TALER_DenominationPublicKey *denom_pub, struct TALER_DenominationPublicKey *denom_pub,
struct TALER_EXCHANGEDB_DenominationKeyMetaData *meta); struct TALER_EXCHANGEDB_DenominationKeyMetaData *meta);

View File

@ -84,6 +84,11 @@ struct AddKeysContext
*/ */
struct SigningSig *s_sigs; struct SigningSig *s_sigs;
/**
* Our key state.
*/
struct TEH_KeyStateHandle *ksh;
/** /**
* Length of the d_sigs array. * Length of the d_sigs array.
*/ */
@ -150,7 +155,8 @@ add_keys (void *cls,
{ {
enum GNUNET_GenericReturnValue rv; enum GNUNET_GenericReturnValue rv;
rv = TEH_keys_load_fees (&d->h_denom_pub, rv = TEH_keys_load_fees (akc->ksh,
&d->h_denom_pub,
&denom_pub, &denom_pub,
&meta); &meta);
switch (rv) switch (rv)
@ -370,6 +376,18 @@ TEH_handler_management_post_keys (
} }
GNUNET_log (GNUNET_ERROR_TYPE_INFO, GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"Received /management/keys\n"); "Received /management/keys\n");
akc.ksh = TEH_keys_get_state2 (true); /* may start its own transaction, thus
must be done here, before we run ours! */
if (NULL == akc.ksh)
{
GNUNET_break_op (0);
GNUNET_JSON_parse_free (spec);
return TALER_MHD_reply_with_error (
connection,
MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_EXCHANGE_GENERIC_KEYS_MISSING,
"no key state (not even for management)");
}
akc.nd_sigs = json_array_size (denom_sigs); akc.nd_sigs = json_array_size (denom_sigs);
akc.d_sigs = GNUNET_new_array (akc.nd_sigs, akc.d_sigs = GNUNET_new_array (akc.nd_sigs,
struct DenomSig); struct DenomSig);