/* This file is part of TALER (C) 2014-2017 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 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 backend/taler-merchant-httpd_tip-enable.c * @brief implement API for authorizing tips to be paid to visitors * @author Christian Grothoff */ #include "platform.h" #include #include #include "taler-merchant-httpd.h" #include "taler-merchant-httpd_mhd.h" #include "taler-merchant-httpd_parsing.h" #include "taler-merchant-httpd_exchanges.h" #include "taler-merchant-httpd_responses.h" #include "taler-merchant-httpd_tip-enable.h" /** * Information we keep for individual calls * to requests that parse JSON, but keep no other state. */ struct TMH_JsonParseContext { /** * This field MUST be first. * FIXME: Explain why! */ struct TM_HandlerContext hc; /** * Placeholder for #TMH_PARSE_post_json() to keep its internal state. */ void *json_parse_context; }; /** * Custom cleanup routine for a `struct TMH_JsonParseContext`. * * @param hc the `struct TMH_JsonParseContext` to clean up. */ static void json_parse_cleanup (struct TM_HandlerContext *hc) { struct TMH_JsonParseContext *jpc = (struct TMH_JsonParseContext *) hc; TMH_PARSE_post_cleanup_callback (jpc->json_parse_context); GNUNET_free (jpc); } /** * Handle a "/tip-enable" request. * * @param rh context of the handler * @param connection the MHD connection to handle * @param[in,out] connection_cls the connection's closure (can be updated) * @param upload_data upload data * @param[in,out] upload_data_size number of bytes (left) in @a upload_data * @return MHD result code */ int MH_handler_tip_enable (struct TMH_RequestHandler *rh, struct MHD_Connection *connection, void **connection_cls, const char *upload_data, size_t *upload_data_size) { enum GNUNET_DB_QueryStatus qs; int res; struct TALER_Amount credit; struct GNUNET_TIME_Absolute expiration; struct TALER_ReservePrivateKeyP reserve_priv; struct GNUNET_HashCode credit_uuid; struct GNUNET_JSON_Specification spec[] = { TALER_JSON_spec_amount ("credit", &credit), GNUNET_JSON_spec_absolute_time ("expiration", &expiration), GNUNET_JSON_spec_fixed_auto ("reserve_priv", &reserve_priv), GNUNET_JSON_spec_fixed_auto ("credit_uuid", &credit_uuid), GNUNET_JSON_spec_end() }; struct TMH_JsonParseContext *ctx; json_t *root; if (NULL == *connection_cls) { ctx = GNUNET_new (struct TMH_JsonParseContext); ctx->hc.cc = &json_parse_cleanup; *connection_cls = ctx; } else { ctx = *connection_cls; } res = TMH_PARSE_post_json (connection, &ctx->json_parse_context, upload_data, upload_data_size, &root); if (GNUNET_SYSERR == res) return MHD_NO; /* the POST's body has to be further fetched */ if ( (GNUNET_NO == res) || (NULL == root) ) return MHD_YES; res = TMH_PARSE_json_data (connection, root, spec); json_decref (root); if (GNUNET_YES != res) { GNUNET_break_op (0); return (GNUNET_NO == res) ? MHD_YES : MHD_NO; } qs = db->enable_tip_reserve (db->cls, &reserve_priv, &credit_uuid, &credit, expiration); if (0 > qs) { GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR != qs); return TMH_RESPONSE_reply_internal_error (connection, TALER_EC_TIP_ENABLE_DB_TRANSACTION_ERROR, "Database error approving tip"); } if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs) { return TMH_RESPONSE_reply_json_pack (connection, MHD_HTTP_OK, "{s:s}", "status", "duplicate submission"); } return TMH_RESPONSE_reply_json_pack (connection, MHD_HTTP_OK, "{s:s}", "status", "ok"); } /* end of taler-merchant-httpd_tip-enable.c */