diff options
author | Christian Grothoff <christian@grothoff.org> | 2021-08-14 13:32:31 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2021-08-14 13:32:31 +0200 |
commit | f4a4a0806bf361ccbd2d0f9bbdc34187cccba6c6 (patch) | |
tree | 5b095579d4cc244f65472477a74c17674d329196 /src/backend | |
parent | 71c62583d81f149cef2bdbe13870da70b50f3cbd (diff) | |
download | anastasis-f4a4a0806bf361ccbd2d0f9bbdc34187cccba6c6.tar.gz anastasis-f4a4a0806bf361ccbd2d0f9bbdc34187cccba6c6.tar.bz2 anastasis-f4a4a0806bf361ccbd2d0f9bbdc34187cccba6c6.zip |
-more legwork for new auth method support
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/anastasis-httpd_policy_upload.c | 12 | ||||
-rw-r--r-- | src/backend/anastasis-httpd_truth.c | 102 | ||||
-rw-r--r-- | src/backend/anastasis-httpd_truth_upload.c | 12 |
3 files changed, 114 insertions, 12 deletions
diff --git a/src/backend/anastasis-httpd_policy_upload.c b/src/backend/anastasis-httpd_policy_upload.c index 7d3ecb8..c36cc17 100644 --- a/src/backend/anastasis-httpd_policy_upload.c +++ b/src/backend/anastasis-httpd_policy_upload.c @@ -681,14 +681,16 @@ AH_handler_policy_post ( { const char *lens; unsigned long len; + char dummy; lens = MHD_lookup_connection_value (connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_CONTENT_LENGTH); if ( (NULL == lens) || (1 != sscanf (lens, - "%lu", - &len)) ) + "%lu%c", + &len, + &dummy)) ) { GNUNET_break_op (0); return TALER_MHD_reply_with_error ( @@ -794,10 +796,12 @@ AH_handler_policy_post ( if (NULL != long_poll_timeout_ms) { unsigned int timeout; + char dummy; if (1 != sscanf (long_poll_timeout_ms, - "%u", - &timeout)) + "%u%c", + &timeout, + &dummy)) { GNUNET_break_op (0); return TALER_MHD_reply_with_error (connection, diff --git a/src/backend/anastasis-httpd_truth.c b/src/backend/anastasis-httpd_truth.c index b9c0382..f69ff7b 100644 --- a/src/backend/anastasis-httpd_truth.c +++ b/src/backend/anastasis-httpd_truth.c @@ -125,7 +125,13 @@ struct GetContext struct MHD_Response *resp; /** - * How long do we wait at most for payment? + * Our entry in the #to_heap, or NULL. + */ + struct GNUNET_CONTAINER_HeapNode *hn; + + /** + * How long do we wait at most for payment or + * authorization? */ struct GNUNET_TIME_Absolute timeout; @@ -218,6 +224,55 @@ static struct GetContext *gc_head; */ static struct GetContext *gc_tail; +/** + * Heap for processing timeouts of requests. + */ +static struct GNUNET_CONTAINER_Heap *to_heap; + +/** + * Task running #do_timeout(). + */ +static struct GNUNET_SCHEDULER_Task *to_task; + + +/** + * Timeout requests that are past their due date. + * + * @param cls NULL + */ +static void +do_timeout (void *cls) +{ + struct GetContext *gc; + + (void) cls; + to_task = NULL; + while (NULL != + (gc = GNUNET_CONTAINER_heap_peek (to_heap))) + { + if (GNUNET_TIME_absolute_is_future (gc->timeout)) + break; + if (gc->suspended) + { + /* Test needed as we may have a "concurrent" + wakeup from another task that did not clear + this entry from the heap before the + response process concluded. */ + gc->suspended = false; + MHD_resume_connection (gc->connection); + } + GNUNET_assert (NULL != gc->hn); + gc->hn = NULL; + GNUNET_assert (gc == + GNUNET_CONTAINER_heap_remove_root (to_heap)); + } + if (NULL == gc) + return; + to_task = GNUNET_SCHEDULER_add_at (gc->timeout, + &do_timeout, + NULL); +} + void AH_truth_shutdown (void) @@ -271,6 +326,16 @@ AH_truth_shutdown (void) } } ANASTASIS_authorization_plugin_shutdown (); + if (NULL != to_task) + { + GNUNET_SCHEDULER_cancel (to_task); + to_task = NULL; + } + if (NULL != to_heap) + { + GNUNET_CONTAINER_heap_destroy (to_heap); + to_heap = NULL; + } } @@ -401,6 +466,12 @@ request_done (struct TM_HandlerContext *hc) gc); gc->in_list = false; } + if (NULL != gc->hn) + { + GNUNET_assert (gc == + GNUNET_CONTAINER_heap_remove_node (gc->hn)); + gc->hn = NULL; + } if (NULL != gc->as) { gc->authorization->cleanup (gc->as); @@ -829,6 +900,7 @@ run_authorization_process (struct MHD_Connection *connection, enum GNUNET_DB_QueryStatus qs; ret = gc->authorization->process (gc->as, + gc->timeout, connection); switch (ret) { @@ -853,7 +925,27 @@ run_authorization_process (struct MHD_Connection *connection, gc->as = NULL; return MHD_YES; case ANASTASIS_AUTHORIZATION_RES_SUSPENDED: - /* connection was suspended again, odd that this happens */ + /* connection was suspended */ + if (NULL == to_heap) + to_heap = GNUNET_CONTAINER_heap_create ( + GNUNET_CONTAINER_HEAP_ORDER_MIN); + gc->hn = GNUNET_CONTAINER_heap_insert (to_heap, + gc, + gc->timeout.abs_value_us); + gc->suspended = true; + if (NULL != to_task) + { + GNUNET_SCHEDULER_cancel (to_task); + to_task = NULL; + } + { + struct GetContext *rn; + + rn = GNUNET_CONTAINER_heap_peek (to_heap); + to_task = GNUNET_SCHEDULER_add_at (rn->timeout, + &do_timeout, + NULL); + } return MHD_YES; case ANASTASIS_AUTHORIZATION_RES_SUCCESS_REPLY_FAILED: /* Challenge sent successfully */ @@ -987,10 +1079,12 @@ AH_handler_truth_get ( if (NULL != long_poll_timeout_ms) { unsigned int timeout; + char dummy; if (1 != sscanf (long_poll_timeout_ms, - "%u", - &timeout)) + "%u%c", + &timeout, + &dummy)) { GNUNET_break_op (0); return TALER_MHD_reply_with_error (connection, diff --git a/src/backend/anastasis-httpd_truth_upload.c b/src/backend/anastasis-httpd_truth_upload.c index 451054f..0fb9017 100644 --- a/src/backend/anastasis-httpd_truth_upload.c +++ b/src/backend/anastasis-httpd_truth_upload.c @@ -522,7 +522,7 @@ AH_handler_truth_post ( struct ANASTASIS_CRYPTO_EncryptedKeyShareP keyshare_data; void *encrypted_truth; size_t encrypted_truth_size; - const char *truth_mime = ""; + const char *truth_mime = NULL; const char *type; enum GNUNET_DB_QueryStatus qs; uint32_t storage_years; @@ -594,10 +594,12 @@ AH_handler_truth_post ( if (NULL != long_poll_timeout_ms) { unsigned int timeout; + char dummy; if (1 != sscanf (long_poll_timeout_ms, - "%u", - &timeout)) + "%u%c", + &timeout, + &dummy)) { GNUNET_break_op (0); return TALER_MHD_reply_with_error (connection, @@ -779,7 +781,9 @@ AH_handler_truth_post ( qs = db->store_truth (db->cls, truth_uuid, &keyshare_data, - truth_mime, + (NULL == truth_mime) + ? "" + : truth_mime, encrypted_truth, encrypted_truth_size, type, |