ensure /management/keys cache is flushed when keys change

This commit is contained in:
Christian Grothoff 2021-01-15 18:17:04 +01:00
parent 928d6626b5
commit 148f81331a
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC

View File

@ -174,6 +174,12 @@ struct HelperState
*/ */
struct GNUNET_CONTAINER_MultiPeerMap *esign_keys; struct GNUNET_CONTAINER_MultiPeerMap *esign_keys;
/**
* Cached reply for a GET /management/keys request. Used so we do not
* re-create the reply every time.
*/
json_t *management_keys_reply;
}; };
@ -254,12 +260,6 @@ struct TEH_KeyStateHandle
*/ */
json_t *auditors; json_t *auditors;
/**
* Cached reply for a GET /management/keys request. Used so we do not
* re-create the reply every time.
*/
json_t *management_keys_reply;
/** /**
* Sorted array of responses to /keys (MUST be sorted by cherry-picking date) of * Sorted array of responses to /keys (MUST be sorted by cherry-picking date) of
* length @e krd_array_length; * length @e krd_array_length;
@ -582,6 +582,11 @@ destroy_key_helpers (struct HelperState *hs)
hs); hs);
GNUNET_CONTAINER_multipeermap_destroy (hs->esign_keys); GNUNET_CONTAINER_multipeermap_destroy (hs->esign_keys);
hs->esign_keys = NULL; hs->esign_keys = NULL;
if (NULL != hs->management_keys_reply)
{
json_decref (hs->management_keys_reply);
hs->management_keys_reply = NULL;
}
if (NULL != hs->dh) if (NULL != hs->dh)
{ {
TALER_CRYPTO_helper_denom_disconnect (hs->dh); TALER_CRYPTO_helper_denom_disconnect (hs->dh);
@ -658,6 +663,11 @@ helper_denom_cb (
&hd->h_denom_pub, &hd->h_denom_pub,
hd, hd,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
if (NULL != hs->management_keys_reply)
{
json_decref (hs->management_keys_reply);
hs->management_keys_reply = NULL;
}
} }
@ -719,6 +729,11 @@ helper_esign_cb (
&pid, &pid,
hsk, hsk,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
if (NULL != hs->management_keys_reply)
{
json_decref (hs->management_keys_reply);
hs->management_keys_reply = NULL;
}
} }
@ -845,11 +860,6 @@ destroy_key_state (struct TEH_KeyStateHandle *ksh,
GNUNET_CONTAINER_multipeermap_destroy (ksh->signkey_map); GNUNET_CONTAINER_multipeermap_destroy (ksh->signkey_map);
json_decref (ksh->auditors); json_decref (ksh->auditors);
ksh->auditors = NULL; ksh->auditors = NULL;
if (NULL != ksh->management_keys_reply)
{
json_decref (ksh->management_keys_reply);
ksh->management_keys_reply = NULL;
}
if (free_helper) if (free_helper)
{ {
destroy_key_helpers (ksh->helpers); destroy_key_helpers (ksh->helpers);
@ -2421,7 +2431,8 @@ TEH_keys_management_get_handler (const struct TEH_RequestHandler *rh,
TALER_EC_EXCHANGE_GENERIC_KEYS_MISSING, TALER_EC_EXCHANGE_GENERIC_KEYS_MISSING,
"no key state"); "no key state");
} }
if (NULL == ksh->management_keys_reply) sync_key_helpers (ksh->helpers);
if (NULL == ksh->helpers->management_keys_reply)
{ {
struct FutureBuilderContext fbc = { struct FutureBuilderContext fbc = {
.ksh = ksh, .ksh = ksh,
@ -2459,11 +2470,11 @@ TEH_keys_management_get_handler (const struct TEH_RequestHandler *rh,
MHD_HTTP_INTERNAL_SERVER_ERROR, MHD_HTTP_INTERNAL_SERVER_ERROR,
TALER_EC_GENERIC_JSON_ALLOCATION_FAILURE, TALER_EC_GENERIC_JSON_ALLOCATION_FAILURE,
NULL); NULL);
ksh->management_keys_reply = json_incref (reply); ksh->helpers->management_keys_reply = json_incref (reply);
} }
else else
{ {
reply = json_incref (ksh->management_keys_reply); reply = json_incref (ksh->helpers->management_keys_reply);
} }
return TALER_MHD_reply_json (connection, return TALER_MHD_reply_json (connection,
reply, reply,