diff options
author | Christian Grothoff <christian@grothoff.org> | 2020-03-10 14:25:57 +0100 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2020-03-10 14:25:57 +0100 |
commit | f6684c1ae3c693df9f88cb347f8afb2748cee17d (patch) | |
tree | 9d2c6e06c14e426422ac77b07fc4a6f55c8b296f | |
parent | 65062e4354f9e4ba9e2482101cd10c2ee7e757f8 (diff) |
actually look at recoup/revocations in libtalerexchange and expose the result to clients; make exchange API follow specification
-rw-r--r-- | src/exchange/taler-exchange-httpd_keystate.c | 16 | ||||
-rw-r--r-- | src/include/taler_exchange_service.h | 6 | ||||
-rw-r--r-- | src/lib/exchange_api_handle.c | 42 |
3 files changed, 58 insertions, 6 deletions
diff --git a/src/exchange/taler-exchange-httpd_keystate.c b/src/exchange/taler-exchange-httpd_keystate.c index 75e20ad04..af0920c55 100644 --- a/src/exchange/taler-exchange-httpd_keystate.c +++ b/src/exchange/taler-exchange-httpd_keystate.c @@ -909,10 +909,18 @@ revocations_iter (void *cls, handle_signal (SIGTERM); return GNUNET_SYSERR; } - GNUNET_assert (0 == - json_array_append_new (rfc->recoup_array, - GNUNET_JSON_from_data_auto ( - denom_hash))); + + { + json_t *obj; + + 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; } diff --git a/src/include/taler_exchange_service.h b/src/include/taler_exchange_service.h index 311175e41..47847ce59 100644 --- a/src/include/taler_exchange_service.h +++ b/src/include/taler_exchange_service.h @@ -153,6 +153,12 @@ struct TALER_EXCHANGE_DenomPublicKey * The applicable fee to refund a coin of this denomination */ struct TALER_Amount fee_refund; + + /** + * Set to #GNUNET_YES if this denomination key has been + * revoked by the exchange. + */ + int revoked; }; diff --git a/src/lib/exchange_api_handle.c b/src/lib/exchange_api_handle.c index ce6ef2e22..3ec3e30bf 100644 --- a/src/lib/exchange_api_handle.c +++ b/src/lib/exchange_api_handle.c @@ -216,7 +216,7 @@ struct TALER_EXCHANGE_Handle 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". */ int with_now; @@ -977,6 +977,7 @@ decode_keys_json (const json_t *resp_obj, dk.valid_from); }; } + /* parse the auditor information */ { 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) { 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++) kd.denom_keys[i].key.rsa_public_key = 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.auditors = GNUNET_new_array (kd.num_auditors, |