From c31048b05020420d1bb3a5cdf1c054648f11c214 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Fri, 1 May 2020 19:41:14 +0200 Subject: implement #6181 --- src/exchange/taler-exchange-httpd.c | 51 ++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 3 deletions(-) (limited to 'src/exchange') diff --git a/src/exchange/taler-exchange-httpd.c b/src/exchange/taler-exchange-httpd.c index a8e29d300..00932c0f0 100644 --- a/src/exchange/taler-exchange-httpd.c +++ b/src/exchange/taler-exchange-httpd.c @@ -420,6 +420,45 @@ proceed_with_handler (const struct TEH_RequestHandler *rh, } +/** + * Handle a "/seed" request. + * + * @param rh context of the handler + * @param connection the MHD connection to handle + * @param args array of additional options (must be empty for this function) + * @return MHD result code + */ +static MHD_RESULT +handler_seed (const struct TEH_RequestHandler *rh, + struct MHD_Connection *connection, + const char *const args[]) +{ +#define SEED_SIZE 32 + char *body; + MHD_RESULT ret; + struct MHD_Response *resp; + + (void) rh; + body = malloc (SEED_SIZE); /* must use malloc(), because MHD will use free() */ + if (NULL == body) + return MHD_NO; + GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_NONCE, + body, + SEED_SIZE); + resp = MHD_create_response_from_buffer (SEED_SIZE, + body, + MHD_RESPMEM_MUST_FREE); + TALER_MHD_add_global_headers (resp); + ret = MHD_queue_response (connection, + MHD_HTTP_OK, + resp); + GNUNET_break (MHD_YES == ret); + MHD_destroy_response (resp); + return ret; +#undef SEED_SIZE +} + + /** * Handle incoming HTTP request. * @@ -472,6 +511,11 @@ handle_mhd_request (void *cls, .method = MHD_HTTP_METHOD_GET, .handler.get = &TEH_handler_agpl_redirect }, + { + .url = "seed", + .method = MHD_HTTP_METHOD_GET, + .handler.get = &handler_seed + }, /* Terms of service */ { .url = "terms", @@ -654,9 +698,10 @@ handle_mhd_request (void *cls, { struct TEH_RequestHandler *rh = &handlers[i]; - if (0 != strncmp (tok, - rh->url, - tok_size)) + if ( (0 != strncmp (tok, + rh->url, + tok_size)) || + (tok_size != strlen (rh->url) ) ) continue; found = GNUNET_YES; /* The URL is a match! What we now do depends on the method. */ -- cgit v1.2.3