From 3ebb5281bc62ca6231f6131e0601471d9ef03b8b Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Mon, 10 Jul 2023 10:37:25 +0200 Subject: tip -> reward --- .../taler-merchant-httpd_private-get-tips-ID.c | 395 --------------------- 1 file changed, 395 deletions(-) delete mode 100644 src/backend/taler-merchant-httpd_private-get-tips-ID.c (limited to 'src/backend/taler-merchant-httpd_private-get-tips-ID.c') diff --git a/src/backend/taler-merchant-httpd_private-get-tips-ID.c b/src/backend/taler-merchant-httpd_private-get-tips-ID.c deleted file mode 100644 index f6a58ef7..00000000 --- a/src/backend/taler-merchant-httpd_private-get-tips-ID.c +++ /dev/null @@ -1,395 +0,0 @@ -/* - This file is part of TALER - (C) 2017-2023 Taler Systems SA - - TALER is free software; you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the Free Software - Foundation; either version 3, or (at your option) any later version. - - TALER is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with - TALER; see the file COPYING. If not, see -*/ -/** - * @file taler-merchant-httpd_get-tips-ID.c - * @brief implementation of a GET /tips/ID handler - * @author Christian Grothoff - */ -#include "platform.h" -#include -#include -#include -#include -#include -#include "taler-merchant-httpd.h" -#include "taler-merchant-httpd_mhd.h" -#include "taler-merchant-httpd_exchanges.h" - - -/** - * Information we keep per /kyc request. - */ -struct TipContext -{ - /** - * Stored in a DLL. - */ - struct TipContext *next; - - /** - * Stored in a DLL. - */ - struct TipContext *prev; - - /** - * Connection we are handling. - */ - struct MHD_Connection *connection; - - /** - * Our handler context. - */ - struct TMH_HandlerContext *hc; - - /** - * Database event we are waiting on to be resuming. - */ - struct GNUNET_DB_EventHandler *eh; - - /** - * Response to return, NULL if we don't have one yet. - */ - struct MHD_Response *response; - - /** - * When does this request time out? - */ - struct GNUNET_TIME_Absolute timeout; - - /** - * ID of the tip being queried. - */ - struct TALER_TipIdentifierP tip_id; - - /** - * Minimum tip amount picked up we should return to the - * client. - */ - struct TALER_Amount min_amount; - - /** - * #GNUNET_NO if the @e connection was not suspended, - * #GNUNET_YES if the @e connection was suspended, - * #GNUNET_SYSERR if @e connection was resumed to as - * part of #MH_force_pc_resume during shutdown. - */ - enum GNUNET_GenericReturnValue suspended; - - /** - * Is the "pickups" argument set to "yes"? - */ - bool fpu; - -}; - - -/** - * Head of DLL. - */ -static struct TipContext *tc_head; - -/** - * Tail of DLL. - */ -static struct TipContext *tc_tail; - - -void -TMH_force_tip_resume () -{ - for (struct TipContext *tc = tc_head; - NULL != tc; - tc = tc->next) - { - if (GNUNET_YES == tc->suspended) - { - tc->suspended = GNUNET_SYSERR; - MHD_resume_connection (tc->connection); - } - } -} - - -/** - * Custom cleanup routine for a `struct TipContext`. - * - * @param cls the `struct TipContext` to clean up. - */ -static void -tip_context_cleanup (void *cls) -{ - struct TipContext *tc = cls; - - if (NULL != tc->response) - { - MHD_destroy_response (tc->response); - tc->response = NULL; - } - if (NULL != tc->eh) - { - TMH_db->event_listen_cancel (tc->eh); - tc->eh = NULL; - } - GNUNET_CONTAINER_DLL_remove (tc_head, - tc_tail, - tc); - GNUNET_free (tc); -} - - -/** - * We have received a trigger from the database - * that we should (possibly) resume the request. - * - * @param cls a `struct TipContext` to resume - * @param extra usually NULL - * @param extra_size number of bytes in @a extra - */ -static void -resume_by_event (void *cls, - const void *extra, - size_t extra_size) -{ - struct TipContext *tc = cls; - - (void) extra; - (void) extra_size; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Resuming request %p by trigger\n", - tc); - if (GNUNET_NO == tc->suspended) - return; /* duplicate event is possible */ - tc->suspended = GNUNET_NO; - GNUNET_CONTAINER_DLL_remove (tc_head, - tc_tail, - tc); - MHD_resume_connection (tc->connection); - TALER_MHD_daemon_trigger (); /* we resumed, kick MHD */ -} - - -MHD_RESULT -TMH_private_get_tips_ID (const struct TMH_RequestHandler *rh, - struct MHD_Connection *connection, - struct TMH_HandlerContext *hc) -{ - struct TipContext *tc = hc->ctx; - struct TALER_Amount total_authorized; - struct TALER_Amount total_picked_up; - char *reason; - struct GNUNET_TIME_Timestamp expiration; - struct TALER_ReservePublicKeyP reserve_pub; - unsigned int pickups_length = 0; - struct TALER_MERCHANTDB_PickupDetails *pickups = NULL; - enum GNUNET_DB_QueryStatus qs; - json_t *pickups_json = NULL; - - (void) rh; - if (NULL == tc) - { - tc = GNUNET_new (struct TipContext); - hc->ctx = tc; - hc->cc = &tip_context_cleanup; - GNUNET_CONTAINER_DLL_insert (tc_head, - tc_tail, - tc); - tc->connection = connection; - tc->hc = hc; - GNUNET_assert (NULL != hc->infix); - if (GNUNET_OK != - GNUNET_CRYPTO_hash_from_string (hc->infix, - &tc->tip_id.hash)) - { - /* tip_id has wrong encoding */ - GNUNET_break_op (0); - return TALER_MHD_reply_with_error (connection, - MHD_HTTP_BAD_REQUEST, - TALER_EC_GENERIC_PARAMETER_MALFORMED, - hc->infix); - } - { - const char *pstr; - - pstr = MHD_lookup_connection_value (connection, - MHD_GET_ARGUMENT_KIND, - "pickups"); - tc->fpu = (NULL != pstr) - ? 0 == strcasecmp (pstr, "yes") - : false; - } - GNUNET_assert (GNUNET_OK == - TALER_amount_set_zero (TMH_currency, - &tc->min_amount)); - { - const char *min_amount; - - min_amount = MHD_lookup_connection_value (connection, - MHD_GET_ARGUMENT_KIND, - "min_amount"); - if (NULL != min_amount) - { - if (GNUNET_OK != - TALER_string_to_amount (min_amount, - &tc->min_amount)) - { - GNUNET_break_op (0); - return TALER_MHD_reply_with_error (connection, - MHD_HTTP_BAD_REQUEST, - TALER_EC_GENERIC_PARAMETER_MALFORMED, - "min_amount"); - } - if (0 != - strcasecmp (tc->min_amount.currency, - TMH_currency)) - { - GNUNET_break_op (0); - return TALER_MHD_reply_with_error (connection, - MHD_HTTP_BAD_REQUEST, - TALER_EC_GENERIC_CURRENCY_MISMATCH, - TMH_currency); - } - } - } - TALER_MHD_parse_request_timeout (connection, - &tc->timeout); - if (! GNUNET_TIME_absolute_is_future (tc->timeout)) - { - struct TMH_TipPickupEventP tip_eh = { - .header.size = htons (sizeof (tip_eh)), - .header.type = htons (TALER_DBEVENT_MERCHANT_TIP_PICKUP), - .tip_id = tc->tip_id - }; - - GNUNET_CRYPTO_hash (hc->instance->settings.id, - strlen (hc->instance->settings.id), - &tip_eh.h_instance); - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Subscribing to payment triggers for %p\n", - tc); - tc->eh = TMH_db->event_listen ( - TMH_db->cls, - &tip_eh.header, - GNUNET_TIME_absolute_get_remaining (tc->timeout), - &resume_by_event, - tc); - } - } - - GNUNET_assert (GNUNET_YES != tc->suspended); - TMH_db->preflight (TMH_db->cls); - qs = TMH_db->lookup_tip_details (TMH_db->cls, - hc->instance->settings.id, - &tc->tip_id, - tc->fpu, - &total_authorized, - &total_picked_up, - &reason, - &expiration, - &reserve_pub, - &pickups_length, - &pickups); - if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != qs) - { - unsigned int response_code; - enum TALER_ErrorCode ec; - - switch (qs) - { - case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS: - ec = TALER_EC_MERCHANT_GENERIC_TIP_ID_UNKNOWN; - response_code = MHD_HTTP_NOT_FOUND; - break; - case GNUNET_DB_STATUS_SOFT_ERROR: - ec = TALER_EC_GENERIC_DB_SOFT_FAILURE; - response_code = MHD_HTTP_INTERNAL_SERVER_ERROR; - break; - case GNUNET_DB_STATUS_HARD_ERROR: - ec = TALER_EC_GENERIC_DB_COMMIT_FAILED; - response_code = MHD_HTTP_INTERNAL_SERVER_ERROR; - break; - default: - GNUNET_break (0); - ec = TALER_EC_GENERIC_INTERNAL_INVARIANT_FAILURE; - response_code = MHD_HTTP_INTERNAL_SERVER_ERROR; - break; - } - return TALER_MHD_reply_with_error (connection, - response_code, - ec, - NULL); - } - /* do not allow timeout above tip expiration */ - tc->timeout = GNUNET_TIME_absolute_min (tc->timeout, - expiration.abs_time); - if ( (NULL != tc->eh) && - (GNUNET_TIME_absolute_is_future (tc->timeout)) && - (1 == TALER_amount_cmp (&tc->min_amount, - &total_picked_up)) ) - { - MHD_suspend_connection (connection); - tc->suspended = GNUNET_YES; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Suspending TIP request handling as pickup is below threshold requested by client\n"); - GNUNET_array_grow (pickups, - pickups_length, - 0); - GNUNET_free (reason); - return MHD_YES; - } - if (tc->fpu) - { - pickups_json = json_array (); - GNUNET_assert (NULL != pickups_json); - for (unsigned int i = 0; i