summaryrefslogtreecommitdiff
path: root/src/backend/taler-merchant-httpd_private-get-instances.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2020-04-17 14:07:06 +0200
committerChristian Grothoff <christian@grothoff.org>2020-04-17 14:07:24 +0200
commit0b8e550d09635f762033626c8c12b7b4a0d0faf7 (patch)
tree986a09d537a5dfde4b65fabd018c0f74d2778457 /src/backend/taler-merchant-httpd_private-get-instances.c
parent0a327ceebd3126d4adf69916e92702fe3c7a22e2 (diff)
downloadmerchant-0b8e550d09635f762033626c8c12b7b4a0d0faf7.tar.gz
merchant-0b8e550d09635f762033626c8c12b7b4a0d0faf7.tar.bz2
merchant-0b8e550d09635f762033626c8c12b7b4a0d0faf7.zip
starting v1 protocol dispatching logic
Diffstat (limited to 'src/backend/taler-merchant-httpd_private-get-instances.c')
-rw-r--r--src/backend/taler-merchant-httpd_private-get-instances.c160
1 files changed, 160 insertions, 0 deletions
diff --git a/src/backend/taler-merchant-httpd_private-get-instances.c b/src/backend/taler-merchant-httpd_private-get-instances.c
new file mode 100644
index 00000000..8a08ab14
--- /dev/null
+++ b/src/backend/taler-merchant-httpd_private-get-instances.c
@@ -0,0 +1,160 @@
+/*
+ This file is part of TALER
+ (C) 2019, 2020 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 <http://www.gnu.org/licenses/>
+*/
+/**
+ * @file backend/taler-merchant-httpd_config.c
+ * @brief implement API for querying configuration data of the backend
+ * @author Florian Dold
+ */
+#include "platform.h"
+#include <jansson.h>
+#include <taler/taler_util.h>
+#include <taler/taler_json_lib.h>
+#include "taler-merchant-httpd.h"
+#include "taler-merchant-httpd_mhd.h"
+#include "taler-merchant-httpd_exchanges.h"
+
+
+/**
+ * Taler protocol version in the format CURRENT:REVISION:AGE
+ * as used by GNU libtool. See
+ * https://www.gnu.org/software/libtool/manual/html_node/Libtool-versioning.html
+ *
+ * Please be very careful when updating and follow
+ * https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html#Updating-version-info
+ * precisely. Note that this version has NOTHING to do with the
+ * release version, and the format is NOT the same that semantic
+ * versioning uses either.
+ *
+ * When changing this version, you likely want to also update
+ * #MERCHANT_PROTOCOL_CURRENT and #MERCHANT_PROTOCOL_AGE in
+ * merchant_api_config.c!
+ */
+#define MERCHANT_PROTOCOL_VERSION "0:0:0"
+
+
+static int
+add_instance (void *cls,
+ const struct GNUNET_HashCode *key,
+ void *value)
+{
+ json_t *ja = cls;
+ struct MerchantInstance *mi = value;
+ char *url;
+ json_t *pta;
+
+ /* Compile array of all unique wire methods supported by this
+ instance */
+ pta = json_array ();
+ GNUNET_assert (NULL != pta);
+ for (struct WireMethod *wm = mi->wm_head;
+ NULL != wm;
+ wm = wm->next)
+ {
+ int duplicate = GNUNET_NO;
+
+ if (! wm->active)
+ break;
+ /* Yes, O(n^2), but really how many bank accounts can an
+ instance realistically have for this to matter? */
+ for (struct WireMethod *pm = mi->wm_head;
+ pm != wm;
+ pm = pm->next)
+ if (0 == strcasecmp (pm->wire_method,
+ wm->wire_method))
+ {
+ duplicate = GNUNET_YES;
+ break;
+ }
+ if (duplicate)
+ continue;
+ GNUNET_assert (0 ==
+ json_array_append_new (pta,
+ json_string (wm->wire_method)));
+ }
+ GNUNET_asprintf (&url,
+ "/%s/",
+ mi->id);
+ GNUNET_assert (0 ==
+ json_array_append_new (
+ ja,
+ json_pack (
+ (NULL != mi->tip_exchange)
+ ? "{s:s, s:s, s:o, s:o, s:s}"
+ : "{s:s, s:s, s:o, s:o}",
+ "name",
+ mi->name,
+ "backend_base_url",
+ url,
+ "merchant_pub",
+ GNUNET_JSON_from_data_auto (&mi->pubkey),
+ "payment_targets",
+ pta,
+ /* optional: */
+ "tipping_exchange_baseurl",
+ mi->tip_exchange)));
+ GNUNET_free (url);
+ return GNUNET_OK;
+}
+
+
+/**
+ * Handle a "/config" 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
+ * @param mi merchant backend instance, never NULL
+ * @return MHD result code
+ */
+MHD_RESULT
+MH_handler_config (struct TMH_RequestHandler *rh,
+ struct MHD_Connection *connection,
+ void **connection_cls,
+ const char *upload_data,
+ size_t *upload_data_size,
+ struct MerchantInstance *mi)
+{
+ static struct MHD_Response *response;
+
+ (void) rh;
+ (void) connection_cls;
+ (void) upload_data;
+ (void) upload_data_size;
+ (void) mi;
+ if (NULL == response)
+ {
+ json_t *ia;
+
+ ia = json_array ();
+ GNUNET_assert (NULL != ia);
+ GNUNET_CONTAINER_multihashmap_iterate (by_id_map,
+ &add_instance,
+ ia);
+ response = TALER_MHD_make_json_pack ("{s:s, s:s, s:o}",
+ "currency", TMH_currency,
+ "version", MERCHANT_PROTOCOL_VERSION,
+ "instances", ia);
+
+ }
+ return MHD_queue_response (connection,
+ MHD_HTTP_OK,
+ response);
+}
+
+
+/* end of taler-merchant-httpd_config.c */