/* This file is part of TALER Copyright (C) 2021 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with TALER; see the file COPYING. If not, see */ /** * @file taler-exchange-httpd_management_extensions.c * @brief Handle request to POST /management/extensions * @author Özgür Kesim */ #include "platform.h" #include #include #include #include #include "taler_json_lib.h" #include "taler_mhd_lib.h" #include "taler_signatures.h" #include "taler-exchange-httpd_management.h" #include "taler-exchange-httpd_responses.h" #include "taler_extensions.h" struct Extension { enum TALER_Extension_Type type; json_t *config_json; // This union contains the parsed configuration for each extension. union { // configuration for the age restriction struct TALER_AgeMask mask; /* TODO oec - peer2peer config */ }; }; /** * Closure for the #set_extensions transaction */ struct SetExtensionsContext { uint32_t num_extensions; struct Extension *extensions; struct TALER_MasterSignatureP *extensions_sigs; }; /** * Function implementing database transaction to set the configuration of * extensions. It runs the transaction logic. * - IF it returns a non-error code, the transaction logic MUST NOT queue a * MHD response. * - IF it returns an hard error, the transaction logic MUST queue a MHD * response and set @a mhd_ret. * - IF it returns the soft error code, the function MAY be called again to * retry and MUST not queue a MHD response. * * @param cls closure with a `struct SetExtensionsContext` * @param connection MHD request which triggered the transaction * @param[out] mhd_ret set to MHD response status for @a connection, * if transaction failed (!) * @return transaction status */ static enum GNUNET_DB_QueryStatus set_extensions (void *cls, struct MHD_Connection *connection, MHD_RESULT *mhd_ret) { // struct SetExtensionContext *sec = cls; // TODO oec return GNUNET_DB_STATUS_SUCCESS_ONE_RESULT; /* only 'success', so >=0, matters here */ } MHD_RESULT TEH_handler_management_post_extensions ( struct MHD_Connection *connection, const json_t *root) { struct SetExtensionsContext sec = {0}; json_t *extensions; json_t *extensions_sigs; struct GNUNET_JSON_Specification spec[] = { GNUNET_JSON_spec_json ("extensions", &extensions), GNUNET_JSON_spec_json ("extensions_sigs", &extensions_sigs), GNUNET_JSON_spec_end () }; bool ok; MHD_RESULT ret; { enum GNUNET_GenericReturnValue res; res = TALER_MHD_parse_json_data (connection, root, spec); if (GNUNET_SYSERR == res) return MHD_NO; /* hard failure */ if (GNUNET_NO == res) return MHD_YES; /* failure */ } if (! (json_is_array (extensions) && json_is_array (extensions_sigs)) ) { GNUNET_break_op (0); GNUNET_JSON_parse_free (spec); return TALER_MHD_reply_with_error ( connection, MHD_HTTP_BAD_REQUEST, TALER_EC_GENERIC_PARAMETER_MALFORMED, "array expected for extensions and extensions_sig"); } sec.num_extensions = json_array_size (extensions_sigs); if (json_array_size (extensions) != sec.num_extensions) { GNUNET_break_op (0); GNUNET_JSON_parse_free (spec); return TALER_MHD_reply_with_error ( connection, MHD_HTTP_BAD_REQUEST, TALER_EC_GENERIC_PARAMETER_MALFORMED, "arrays extensions and extensions_sig are not of equal size"); } GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Received /management/extensions\n"); sec.extensions = GNUNET_new_array (sec.num_extensions, struct Extension); sec.extensions_sigs = GNUNET_new_array (sec.num_extensions, struct TALER_MasterSignatureP); ok = true; for (unsigned int i = 0; i