diff options
Diffstat (limited to 'src/backend/taler-merchant-httpd_config.c')
-rw-r--r-- | src/backend/taler-merchant-httpd_config.c | 89 |
1 files changed, 87 insertions, 2 deletions
diff --git a/src/backend/taler-merchant-httpd_config.c b/src/backend/taler-merchant-httpd_config.c index 1833f78f..d1340249 100644 --- a/src/backend/taler-merchant-httpd_config.c +++ b/src/backend/taler-merchant-httpd_config.c @@ -1,6 +1,6 @@ /* This file is part of TALER - (C) 2019, 2020, 2021 Taler Systems SA + (C) 2019, 2020, 2021, 2023, 2024 Taler Systems SA TALER is free software; you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software @@ -42,7 +42,38 @@ * #MERCHANT_PROTOCOL_CURRENT and #MERCHANT_PROTOCOL_AGE in * merchant_api_config.c! */ -#define MERCHANT_PROTOCOL_VERSION "3:0:1" +#define MERCHANT_PROTOCOL_VERSION "14:1:10" + + +/** + * Callback on an exchange known to us. Does not warrant + * that the "keys" information is actually available for + * @a exchange. + * + * @param cls closure with `json_t *` array to expand + * @param url base URL of the exchange + * @param exchange internal handle for the exchange + */ +static void +add_exchange (void *cls, + const char *url, + const struct TMH_Exchange *exchange) +{ + json_t *xa = cls; + json_t *xi; + + xi = GNUNET_JSON_PACK ( + GNUNET_JSON_pack_data_auto ("master_pub", + TMH_EXCHANGES_get_master_pub (exchange)), + GNUNET_JSON_pack_string ("currency", + TMH_EXCHANGES_get_currency (exchange)), + GNUNET_JSON_pack_string ("base_url", + url)); + GNUNET_assert (NULL != xi); + GNUNET_assert (0 == + json_array_append_new (xa, + xi)); +} MHD_RESULT @@ -51,18 +82,72 @@ MH_handler_config (struct TMH_RequestHandler *rh, struct TMH_HandlerContext *hc) { static struct MHD_Response *response; + static struct GNUNET_TIME_Absolute a; (void) rh; (void) hc; + if ( (GNUNET_TIME_absolute_is_past (a)) && + (NULL != response) ) + { + MHD_destroy_response (response); + response = NULL; + } if (NULL == response) { + json_t *specs = json_object (); + json_t *exchanges = json_array (); + struct GNUNET_TIME_Timestamp km; + char dat[128]; + + GNUNET_assert (NULL != specs); + GNUNET_assert (NULL != exchanges); + a = GNUNET_TIME_relative_to_absolute (GNUNET_TIME_UNIT_DAYS); + /* Round up to next full day to ensure the expiration + time does not become a fingerprint! */ + a = GNUNET_TIME_absolute_round_down (a, + GNUNET_TIME_UNIT_DAYS); + a = GNUNET_TIME_absolute_add (a, + GNUNET_TIME_UNIT_DAYS); + /* => /config response stays at most 48h in caches! */ + km = GNUNET_TIME_absolute_to_timestamp (a); + TALER_MHD_get_date_string (km.abs_time, + dat); + TMH_exchange_get_trusted (&add_exchange, + exchanges); + for (unsigned int i = 0; i<TMH_num_cspecs; i++) + { + const struct TALER_CurrencySpecification *cspec = &TMH_cspecs[i]; + + if (TMH_test_exchange_configured_for_currency (cspec->currency)) + GNUNET_assert (0 == + json_object_set_new (specs, + cspec->currency, + TALER_CONFIG_currency_specs_to_json + ( + cspec))); + } response = TALER_MHD_MAKE_JSON_PACK ( GNUNET_JSON_pack_string ("currency", TMH_currency), + GNUNET_JSON_pack_object_steal ("currencies", + specs), + GNUNET_JSON_pack_array_steal ("exchanges", + exchanges), + GNUNET_JSON_pack_string ( + "implementation", + "urn:net:taler:specs:taler-merchant:c-reference"), GNUNET_JSON_pack_string ("name", "taler-merchant"), GNUNET_JSON_pack_string ("version", MERCHANT_PROTOCOL_VERSION)); + GNUNET_break (MHD_YES == + MHD_add_response_header (response, + MHD_HTTP_HEADER_EXPIRES, + dat)); + GNUNET_break (MHD_YES == + MHD_add_response_header (response, + MHD_HTTP_HEADER_CACHE_CONTROL, + "public,max-age=21600")); /* 6h */ } return MHD_queue_response (connection, MHD_HTTP_OK, |