actually look at recoup/revocations in libtalerexchange and expose the result to clients; make exchange API follow specification

This commit is contained in:
Christian Grothoff 2020-03-10 14:25:57 +01:00
parent 65062e4354
commit f6684c1ae3
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
3 changed files with 58 additions and 6 deletions

View File

@ -909,10 +909,18 @@ revocations_iter (void *cls,
handle_signal (SIGTERM); handle_signal (SIGTERM);
return GNUNET_SYSERR; return GNUNET_SYSERR;
} }
GNUNET_assert (0 ==
json_array_append_new (rfc->recoup_array, {
GNUNET_JSON_from_data_auto ( json_t *obj;
denom_hash)));
obj = json_pack ("{s:o}",
"h_denom_pub",
GNUNET_JSON_from_data_auto (denom_hash));
GNUNET_assert (NULL != obj);
GNUNET_assert (0 ==
json_array_append_new (rfc->recoup_array,
obj));
}
return GNUNET_OK; return GNUNET_OK;
} }

View File

@ -153,6 +153,12 @@ struct TALER_EXCHANGE_DenomPublicKey
* The applicable fee to refund a coin of this denomination * The applicable fee to refund a coin of this denomination
*/ */
struct TALER_Amount fee_refund; struct TALER_Amount fee_refund;
/**
* Set to #GNUNET_YES if this denomination key has been
* revoked by the exchange.
*/
int revoked;
}; };

View File

@ -216,7 +216,7 @@ struct TALER_EXCHANGE_Handle
enum ExchangeHandleState state; enum ExchangeHandleState state;
/** /**
* If GNUNET_YES, use fake now given by the user, in * If #GNUNET_YES, use fake now given by the user, in
* request of "/keys". * request of "/keys".
*/ */
int with_now; int with_now;
@ -977,6 +977,7 @@ decode_keys_json (const json_t *resp_obj,
dk.valid_from); dk.valid_from);
}; };
} }
/* parse the auditor information */ /* parse the auditor information */
{ {
json_t *auditors_array; json_t *auditors_array;
@ -1038,6 +1039,43 @@ decode_keys_json (const json_t *resp_obj,
}; };
} }
/* parse the revocation/recoup information */
{
json_t *recoup_array;
json_t *recoup_info;
unsigned int index;
EXITIF (NULL == (recoup_array =
json_object_get (resp_obj,
"recoup")));
EXITIF (JSON_ARRAY != json_typeof (recoup_array));
json_array_foreach (recoup_array, index, recoup_info) {
struct GNUNET_HashCode h_denom_pub;
struct GNUNET_JSON_Specification spec[] = {
GNUNET_JSON_spec_fixed_auto ("h_denom_pub",
&h_denom_pub),
GNUNET_JSON_spec_end ()
};
EXITIF (GNUNET_OK !=
GNUNET_JSON_parse (recoup_info,
spec,
NULL, NULL));
for (unsigned int j = 0;
j<key_data->num_denom_keys;
j++)
{
if (0 == GNUNET_memcmp (&h_denom_pub,
&key_data->denom_keys[j].h_key))
{
key_data->denom_keys[j].revoked = GNUNET_YES;
break;
}
}
};
}
if (check_sig) if (check_sig)
{ {
struct TALER_ExchangeKeySetPS ks; struct TALER_ExchangeKeySetPS ks;
@ -1259,7 +1297,7 @@ keys_completed_cb (void *cls,
for (unsigned int i = 0; i<kd_old.num_denom_keys; i++) for (unsigned int i = 0; i<kd_old.num_denom_keys; i++)
kd.denom_keys[i].key.rsa_public_key kd.denom_keys[i].key.rsa_public_key
= GNUNET_CRYPTO_rsa_public_key_dup ( = GNUNET_CRYPTO_rsa_public_key_dup (
kd_old.denom_keys[i].key.rsa_public_key); kd_old.denom_keys[i].key.rsa_public_key);
kd.num_auditors = kd_old.num_auditors; kd.num_auditors = kd_old.num_auditors;
kd.auditors = GNUNET_new_array (kd.num_auditors, kd.auditors = GNUNET_new_array (kd.num_auditors,