summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2020-03-10 14:25:57 +0100
committerChristian Grothoff <christian@grothoff.org>2020-03-10 14:25:57 +0100
commitf6684c1ae3c693df9f88cb347f8afb2748cee17d (patch)
tree9d2c6e06c14e426422ac77b07fc4a6f55c8b296f
parent65062e4354f9e4ba9e2482101cd10c2ee7e757f8 (diff)
downloadexchange-f6684c1ae3c693df9f88cb347f8afb2748cee17d.tar.gz
exchange-f6684c1ae3c693df9f88cb347f8afb2748cee17d.tar.bz2
exchange-f6684c1ae3c693df9f88cb347f8afb2748cee17d.zip
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.c16
-rw-r--r--src/include/taler_exchange_service.h6
-rw-r--r--src/lib/exchange_api_handle.c42
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 75e20ad0..af0920c5 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 311175e4..47847ce5 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 ce6ef2e2..3ec3e30b 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,