[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-donau] branch master updated: clean up
From: |
gnunet |
Subject: |
[taler-donau] branch master updated: clean up |
Date: |
Tue, 24 Oct 2023 10:45:34 +0200 |
This is an automated email from the git hooks/post-receive script.
grothoff pushed a commit to branch master
in repository donau.
The following commit(s) were added to refs/heads/master by this push:
new 45ed194 clean up
45ed194 is described below
commit 45ed194289863d85b3f19cfb5cbb53664634b5e7
Author: Christian Grothoff <christian@grothoff.org>
AuthorDate: Tue Oct 24 10:45:31 2023 +0200
clean up
---
.gitignore | 1 +
src/Makefile.am | 2 -
src/curl/Makefile.am | 24 --
src/curl/curl.c | 107 -------
src/json/Makefile.am | 4 +-
src/json/i18n.c | 134 ---------
src/json/json_wire.c | 122 --------
src/mhd/Makefile.am | 29 --
src/mhd/mhd_config.c | 493 --------------------------------
src/mhd/mhd_legal.c | 694 ----------------------------------------------
src/mhd/mhd_parsing.c | 444 -----------------------------
src/mhd/mhd_responses.c | 550 ------------------------------------
src/mhd/mhd_run.c | 175 ------------
src/sq/Makefile.am | 40 ---
src/sq/sq_query_helper.c | 175 ------------
src/sq/sq_result_helper.c | 237 ----------------
src/sq/test_sq.c | 215 --------------
17 files changed, 2 insertions(+), 3444 deletions(-)
diff --git a/.gitignore b/.gitignore
index c428c54..ca18e8d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
+**/Makefile
Makefile.in
autom4te.cache/
build-aux/
diff --git a/src/Makefile.am b/src/Makefile.am
index 637e42f..2654c76 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -15,9 +15,7 @@ SUBDIRS = \
include \
util \
json \
- curl \
$(PQ_DIR) \
- mhd \
donaudb \
donau \
lib \
diff --git a/src/curl/Makefile.am b/src/curl/Makefile.am
deleted file mode 100644
index f60a380..0000000
--- a/src/curl/Makefile.am
+++ /dev/null
@@ -1,24 +0,0 @@
-# This Makefile.am is in the public domain
-AM_CPPFLAGS = -I$(top_srcdir)/src/include
-
-if USE_COVERAGE
- AM_CFLAGS = --coverage -O0
- XLIB = -lgcov
-endif
-
-lib_LTLIBRARIES = \
- libtalercurl.la
-
-libtalercurl_la_LDFLAGS = \
- -version-info 0:0:0 \
- -no-undefined
-libtalercurl_la_SOURCES = \
- curl.c
-libtalercurl_la_LIBADD = \
- -lgnunetcurl \
- -lgnunetutil \
- $(LIBGNURLCURL_LIBS) \
- -ljansson \
- -lz \
- -lm \
- $(XLIB)
diff --git a/src/curl/curl.c b/src/curl/curl.c
deleted file mode 100644
index caa0052..0000000
--- a/src/curl/curl.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2019-2021 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
- <http://www.gnu.org/licenses/>
-*/
-/**
- * @file curl/curl.c
- * @brief Helper routines for interactions with libcurl
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include "taler_curl_lib.h"
-
-
-#if TALER_CURL_COMPRESS_BODIES
-#include <zlib.h>
-#endif
-
-
-enum GNUNET_GenericReturnValue
-TALER_curl_easy_post (struct TALER_CURL_PostContext *ctx,
- CURL *eh,
- const json_t *body)
-{
- char *str;
- size_t slen;
-
- str = json_dumps (body,
- JSON_COMPACT);
- if (NULL == str)
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- slen = strlen (str);
- if (TALER_CURL_COMPRESS_BODIES &&
- (! ctx->disable_compression) )
- {
- Bytef *cbuf;
- uLongf cbuf_size;
- int ret;
-
- cbuf_size = compressBound (slen);
- cbuf = GNUNET_malloc (cbuf_size);
- ret = compress (cbuf,
- &cbuf_size,
- (const Bytef *) str,
- slen);
- if (Z_OK != ret)
- {
- /* compression failed!? */
- GNUNET_break (0);
- GNUNET_free (cbuf);
- return GNUNET_SYSERR;
- }
- free (str);
- slen = (size_t) cbuf_size;
- ctx->json_enc = (char *) cbuf;
- GNUNET_assert (
- NULL !=
- (ctx->headers = curl_slist_append (
- ctx->headers,
- "Content-Encoding: deflate")));
- }
- else
- {
- ctx->json_enc = str;
- }
- GNUNET_assert (
- NULL !=
- (ctx->headers = curl_slist_append (
- ctx->headers,
- "Content-Type: application/json")));
-
- GNUNET_assert (CURLE_OK ==
- curl_easy_setopt (eh,
- CURLOPT_POSTFIELDS,
- ctx->json_enc));
- GNUNET_assert (CURLE_OK ==
- curl_easy_setopt (eh,
- CURLOPT_POSTFIELDSIZE,
- slen));
- return GNUNET_OK;
-}
-
-
-void
-TALER_curl_easy_post_finished (struct TALER_CURL_PostContext *ctx)
-{
- curl_slist_free_all (ctx->headers);
- ctx->headers = NULL;
- GNUNET_free (ctx->json_enc);
- ctx->json_enc = NULL;
-}
diff --git a/src/json/Makefile.am b/src/json/Makefile.am
index 6bd5b46..89dc4ff 100644
--- a/src/json/Makefile.am
+++ b/src/json/Makefile.am
@@ -10,11 +10,9 @@ lib_LTLIBRARIES = \
libtalerjson.la
libtalerjson_la_SOURCES = \
- i18n.c \
json.c \
json_helper.c \
- json_pack.c \
- json_wire.c
+ json_pack.c
libtalerjson_la_LDFLAGS = \
-version-info 1:0:1 \
-no-undefined
diff --git a/src/json/i18n.c b/src/json/i18n.c
deleted file mode 100644
index f927a71..0000000
--- a/src/json/i18n.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2020, 2021 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 <http://www.gnu.org/licenses/>
-*/
-/**
- * @file json/i18n.c
- * @brief helper functions for i18n in JSON processing
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include <gnunet/gnunet_util_lib.h>
-#include "taler_util.h"
-#include "taler_json_lib.h"
-
-
-const json_t *
-TALER_JSON_extract_i18n (const json_t *object,
- const char *language_pattern,
- const char *field)
-{
- const json_t *ret;
- json_t *i18n;
- double quality = -1;
-
- ret = json_object_get (object,
- field);
- if (NULL == ret)
- return NULL; /* field MUST exist in object */
- {
- char *name;
-
- GNUNET_asprintf (&name,
- "%s_i18n",
- field);
- i18n = json_object_get (object,
- name);
- GNUNET_free (name);
- }
- if (NULL == i18n)
- return ret;
- {
- const char *key;
- json_t *value;
-
- json_object_foreach (i18n, key, value) {
- double q = TALER_language_matches (language_pattern,
- key);
- if (q > quality)
- {
- quality = q;
- ret = value;
- }
- }
- }
- return ret;
-}
-
-
-bool
-TALER_JSON_check_i18n (const json_t *i18n)
-{
- const char *field;
- json_t *member;
-
- if (! json_is_object (i18n))
- return false;
- json_object_foreach ((json_t *) i18n, field, member)
- {
- if (! json_is_string (member))
- return false;
- /* Field name must be either of format "en_UK"
- or just "en"; we do not care about capitalization;
- for syntax, see GNU Gettext manual, including
- appendix A for rare language codes. */
- switch (strlen (field))
- {
- case 0:
- case 1:
- return false;
- case 2:
- if (! isalpha (field[0]))
- return false;
- if (! isalpha (field[1]))
- return false;
- break;
- case 3:
- case 4:
- return false;
- case 5:
- if (! isalpha (field[0]))
- return false;
- if (! isalpha (field[1]))
- return false;
- if ('_' != field[2])
- return false;
- if (! isalpha (field[3]))
- return false;
- if (! isalpha (field[4]))
- return false;
- break;
- case 6:
- if (! isalpha (field[0]))
- return false;
- if (! isalpha (field[1]))
- return false;
- if ('_' != field[2])
- return false;
- if (! isalpha (field[3]))
- return false;
- if (! isalpha (field[4]))
- return false;
- if (! isalpha (field[5]))
- return false;
- break;
- default:
- return false;
- }
- }
- return true;
-}
-
-
-/* end of i18n.c */
diff --git a/src/json/json_wire.c b/src/json/json_wire.c
deleted file mode 100644
index 9d22d28..0000000
--- a/src/json/json_wire.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2018, 2021 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 <http://www.gnu.org/licenses/>
-*/
-/**
- * @file json/json_wire.c
- * @brief helper functions to generate or check /wire replies
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include <gnunet/gnunet_util_lib.h>
-#include "taler_util.h"
-#include "taler_json_lib.h"
-
-
-enum GNUNET_GenericReturnValue
-TALER_JSON_merchant_wire_signature_hash (const json_t *wire_s,
- struct TALER_MerchantWireHashP *hc)
-{
- const char *payto_uri;
- struct TALER_WireSaltP salt;
- struct GNUNET_JSON_Specification spec[] = {
- GNUNET_JSON_spec_string ("payto_uri",
- &payto_uri),
- GNUNET_JSON_spec_fixed_auto ("salt",
- &salt),
- GNUNET_JSON_spec_end ()
- };
-
- if (GNUNET_OK !=
- GNUNET_JSON_parse (wire_s,
- spec,
- NULL, NULL))
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Validating `%s'\n",
- payto_uri);
- {
- char *err;
-
- err = TALER_payto_validate (payto_uri);
- if (NULL != err)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "URI `%s' ill-formed: %s\n",
- payto_uri,
- err);
- GNUNET_free (err);
- return GNUNET_SYSERR;
- }
- }
- TALER_merchant_wire_signature_hash (payto_uri,
- &salt,
- hc);
- return GNUNET_OK;
-}
-
-
-char *
-TALER_JSON_wire_to_payto (const json_t *wire_s)
-{
- json_t *payto_o;
- const char *payto_str;
- char *err;
-
- payto_o = json_object_get (wire_s,
- "payto_uri");
- if ( (NULL == payto_o) ||
- (NULL == (payto_str = json_string_value (payto_o))) )
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Malformed wire record encountered: lacks payto://-url\n");
- return NULL;
- }
- if (NULL !=
- (err = TALER_payto_validate (payto_str)))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Malformed wire record encountered: payto URI `%s' invalid:
%s\n",
- payto_str,
- err);
- GNUNET_free (err);
- return NULL;
- }
- return GNUNET_strdup (payto_str);
-}
-
-
-char *
-TALER_JSON_wire_to_method (const json_t *wire_s)
-{
- json_t *payto_o;
- const char *payto_str;
-
- payto_o = json_object_get (wire_s,
- "payto_uri");
- if ( (NULL == payto_o) ||
- (NULL == (payto_str = json_string_value (payto_o))) )
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Fatally malformed wire record encountered: lacks
payto://-url\n");
- return NULL;
- }
- return TALER_payto_get_method (payto_str);
-}
-
-
-/* end of json_wire.c */
diff --git a/src/mhd/Makefile.am b/src/mhd/Makefile.am
deleted file mode 100644
index f7f052d..0000000
--- a/src/mhd/Makefile.am
+++ /dev/null
@@ -1,29 +0,0 @@
-# This Makefile.am is in the public domain
-AM_CPPFLAGS = -I$(top_srcdir)/src/include
-
-if USE_COVERAGE
- AM_CFLAGS = --coverage -O0
- XLIB = -lgcov
-endif
-
-lib_LTLIBRARIES = \
- libtalermhd.la
-
-libtalermhd_la_SOURCES = \
- mhd_config.c \
- mhd_legal.c \
- mhd_parsing.c \
- mhd_responses.c \
- mhd_run.c
-libtalermhd_la_LDFLAGS = \
- -version-info 0:0:0 \
- -no-undefined
-libtalermhd_la_LIBADD = \
- -lgnunetjson \
- $(top_builddir)/src/json/libtalerjson.la \
- $(top_builddir)/src/util/libtalerutil.la \
- -lgnunetutil \
- -lmicrohttpd \
- -ljansson \
- -lz \
- $(XLIB)
diff --git a/src/mhd/mhd_config.c b/src/mhd/mhd_config.c
deleted file mode 100644
index 31ec3e4..0000000
--- a/src/mhd/mhd_config.c
+++ /dev/null
@@ -1,493 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2014--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 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 <http://www.gnu.org/licenses/>
-*/
-/**
- * @file mhd_config.c
- * @brief functions to configure and setup MHD
- * @author Florian Dold
- * @author Benedikt Mueller
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include <gnunet/gnunet_util_lib.h>
-#include "taler_mhd_lib.h"
-
-
-/**
- * Backlog for listen operation on UNIX domain sockets.
- */
-#define UNIX_BACKLOG 500
-
-
-/**
- * Parse the configuration to determine on which port
- * or UNIX domain path we should run an HTTP service.
- *
- * @param cfg configuration to parse
- * @param section section of the configuration to parse (usually "exchange")
- * @param[out] rport set to the port number, or 0 for none
- * @param[out] unix_path set to the UNIX path, or NULL for none
- * @param[out] unix_mode set to the mode to be used for @a unix_path
- * @return #GNUNET_OK on success
- */
-enum GNUNET_GenericReturnValue
-TALER_MHD_parse_config (const struct GNUNET_CONFIGURATION_Handle *cfg,
- const char *section,
- uint16_t *rport,
- char **unix_path,
- mode_t *unix_mode)
-{
- const char *choices[] = {
- "tcp",
- "unix",
- NULL
- };
- const char *serve_type;
-
- if (GNUNET_OK !=
- GNUNET_CONFIGURATION_get_value_choice (cfg,
- section,
- "SERVE",
- choices,
- &serve_type))
- {
- GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
- section,
- "SERVE",
- "serve type (tcp or unix) required");
- return GNUNET_SYSERR;
- }
-
- if (0 == strcasecmp (serve_type,
- "tcp"))
- {
- unsigned long long port;
-
- if (GNUNET_OK !=
- GNUNET_CONFIGURATION_get_value_number (cfg,
- section,
- "PORT",
- &port))
- {
- GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
- section,
- "PORT",
- "port number required");
- return GNUNET_SYSERR;
- }
-
- if ( (0 == port) ||
- (port > UINT16_MAX) )
- {
- GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
- section,
- "PORT",
- "port number not in [1,65535]");
- return GNUNET_SYSERR;
- }
- *rport = (uint16_t) port;
- *unix_path = NULL;
- return GNUNET_OK;
- }
- if (0 == strcmp (serve_type,
- "unix"))
- {
- struct sockaddr_un s_un;
- char *modestring;
-
- if (GNUNET_OK !=
- GNUNET_CONFIGURATION_get_value_filename (cfg,
- section,
- "UNIXPATH",
- unix_path))
- {
- GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
- section,
- "UNIXPATH",
- "UNIXPATH value required");
- return GNUNET_SYSERR;
- }
- if (strlen (*unix_path) >= sizeof (s_un.sun_path))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "unixpath `%s' is too long\n",
- *unix_path);
- GNUNET_free (*unix_path);
- return GNUNET_SYSERR;
- }
-
- if (GNUNET_OK !=
- GNUNET_CONFIGURATION_get_value_string (cfg,
- section,
- "UNIXPATH_MODE",
- &modestring))
- {
- GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
- section,
- "UNIXPATH_MODE");
- GNUNET_free (*unix_path);
- return GNUNET_SYSERR;
- }
- errno = 0;
- *unix_mode = (mode_t) strtoul (modestring, NULL, 8);
- if (0 != errno)
- {
- GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR,
- section,
- "UNIXPATH_MODE",
- "must be octal number");
- GNUNET_free (modestring);
- GNUNET_free (*unix_path);
- return GNUNET_SYSERR;
- }
- GNUNET_free (modestring);
- return GNUNET_OK;
- }
- /* not reached */
- GNUNET_assert (0);
- return GNUNET_SYSERR;
-}
-
-
-/**
- * Function called for logging by MHD.
- *
- * @param cls closure, NULL
- * @param fm format string (`printf()`-style)
- * @param ap arguments to @a fm
- */
-void
-TALER_MHD_handle_logs (void *cls,
- const char *fm,
- va_list ap)
-{
- static int cache;
- char buf[2048];
-
- (void) cls;
- if (-1 == cache)
- return;
- if (0 == cache)
- {
- if (0 ==
- GNUNET_get_log_call_status (GNUNET_ERROR_TYPE_INFO,
- "libmicrohttpd",
- __FILE__,
- __FUNCTION__,
- __LINE__))
- {
- cache = -1;
- return;
- }
- }
- cache = 1;
- vsnprintf (buf,
- sizeof (buf),
- fm,
- ap);
- GNUNET_log_from_nocheck (GNUNET_ERROR_TYPE_INFO,
- "libmicrohttpd",
- "%s",
- buf);
-}
-
-
-/**
- * Open UNIX domain socket for listining at @a unix_path with
- * permissions @a unix_mode.
- *
- * @param unix_path where to listen
- * @param unix_mode access permissions to set
- * @return -1 on error, otherwise the listen socket
- */
-int
-TALER_MHD_open_unix_path (const char *unix_path,
- mode_t unix_mode)
-{
- struct GNUNET_NETWORK_Handle *nh;
- struct sockaddr_un *un;
-
- if (sizeof (un->sun_path) <= strlen (unix_path))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "unixpath `%s' is too long\n",
- unix_path);
- return -1;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Creating listen socket '%s' with mode %o\n",
- unix_path,
- unix_mode);
-
- if (GNUNET_OK !=
- GNUNET_DISK_directory_create_for_file (unix_path))
- {
- GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR,
- "mkdir",
- unix_path);
- }
-
- un = GNUNET_new (struct sockaddr_un);
- un->sun_family = AF_UNIX;
- strncpy (un->sun_path,
- unix_path,
- sizeof (un->sun_path) - 1);
- GNUNET_NETWORK_unix_precheck (un);
-
- if (NULL == (nh = GNUNET_NETWORK_socket_create (AF_UNIX,
- SOCK_STREAM,
- 0)))
- {
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR,
- "socket");
- GNUNET_free (un);
- return -1;
- }
-
- if (GNUNET_OK !=
- GNUNET_NETWORK_socket_bind (nh,
- (void *) un,
- sizeof (struct sockaddr_un)))
- {
- GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR,
- "bind",
- unix_path);
- GNUNET_free (un);
- GNUNET_NETWORK_socket_close (nh);
- return -1;
- }
- GNUNET_free (un);
- if (GNUNET_OK !=
- GNUNET_NETWORK_socket_listen (nh,
- UNIX_BACKLOG))
- {
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR,
- "listen");
- GNUNET_NETWORK_socket_close (nh);
- return -1;
- }
-
- if (0 != chmod (unix_path,
- unix_mode))
- {
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR,
- "chmod");
- GNUNET_NETWORK_socket_close (nh);
- return -1;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "set socket '%s' to mode %o\n",
- unix_path,
- unix_mode);
-
- /* extract and return actual socket handle from 'nh' */
- {
- int fd;
-
- fd = GNUNET_NETWORK_get_fd (nh);
- GNUNET_NETWORK_socket_free_memory_only_ (nh);
- return fd;
- }
-}
-
-
-/**
- * Bind a listen socket to the UNIX domain path or the TCP port and IP address
- * as specified in @a cfg in section @a section. IF only a port was
- * specified, set @a port and return -1. Otherwise, return the bound file
- * descriptor.
- *
- * @param cfg configuration to parse
- * @param section configuration section to use
- * @param[out] port port to set, if TCP without BINDTO
- * @return -1 and a port of zero on error, otherwise
- * either -1 and a port, or a bound stream socket
- */
-int
-TALER_MHD_bind (const struct GNUNET_CONFIGURATION_Handle *cfg,
- const char *section,
- uint16_t *port)
-{
- char *bind_to;
- struct GNUNET_NETWORK_Handle *nh;
-
- /* try systemd passing first */
- {
- const char *listen_pid;
- const char *listen_fds;
-
- /* check for systemd-style FD passing */
- listen_pid = getenv ("LISTEN_PID");
- listen_fds = getenv ("LISTEN_FDS");
- if ( (NULL != listen_pid) &&
- (NULL != listen_fds) &&
- (getpid () == strtol (listen_pid,
- NULL,
- 10)) &&
- (1 == strtoul (listen_fds,
- NULL,
- 10)) )
- {
- int fh;
- int flags;
-
- fh = 3;
- flags = fcntl (fh,
- F_GETFD);
- if ( (-1 == flags) &&
- (EBADF == errno) )
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Bad listen socket passed, ignored\n");
- fh = -1;
- }
- flags |= FD_CLOEXEC;
- if ( (-1 != fh) &&
- (0 != fcntl (fh,
- F_SETFD,
- flags)) )
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR,
- "fcntl");
- if (-1 != fh)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Successfully obtained listen socket from hypervisor\n");
- return fh;
- }
- }
- }
-
- /* now try configuration file */
- *port = 0;
- {
- char *serve_unixpath;
- mode_t unixpath_mode;
-
- if (GNUNET_OK !=
- TALER_MHD_parse_config (cfg,
- section,
- port,
- &serve_unixpath,
- &unixpath_mode))
- return -1;
- if (NULL != serve_unixpath)
- {
- int ret;
-
- ret = TALER_MHD_open_unix_path (serve_unixpath,
- unixpath_mode);
- GNUNET_free (serve_unixpath);
- return ret;
- }
- }
- if (GNUNET_OK !=
- GNUNET_CONFIGURATION_get_value_string (cfg,
- section,
- "BIND_TO",
- &bind_to))
- return -1; /* only set port */
-
- /* let's have fun binding... */
- {
- char port_str[6];
- struct addrinfo hints;
- struct addrinfo *res;
- int ec;
-
- GNUNET_snprintf (port_str,
- sizeof (port_str),
- "%u",
- (unsigned int) *port);
- *port = 0; /* do NOT return port in case of errors */
- memset (&hints,
- 0,
- sizeof (hints));
- hints.ai_family = AF_UNSPEC;
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_protocol = IPPROTO_TCP;
- hints.ai_flags = AI_PASSIVE
-#ifdef AI_IDN
- | AI_IDN
-#endif
- ;
-
- if (0 !=
- (ec = getaddrinfo (bind_to,
- port_str,
- &hints,
- &res)))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Failed to resolve BIND_TO address `%s': %s\n",
- bind_to,
- gai_strerror (ec));
- GNUNET_free (bind_to);
- return -1;
- }
- GNUNET_free (bind_to);
-
- if (NULL == (nh = GNUNET_NETWORK_socket_create (res->ai_family,
- res->ai_socktype,
- res->ai_protocol)))
- {
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR,
- "socket");
- freeaddrinfo (res);
- return -1;
- }
- {
- const int on = 1;
-
- if (GNUNET_OK !=
- GNUNET_NETWORK_socket_setsockopt (nh,
- SOL_SOCKET,
- SO_REUSEPORT,
- &on,
- sizeof(on)))
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
- "setsockopt");
- }
- if (GNUNET_OK !=
- GNUNET_NETWORK_socket_bind (nh,
- res->ai_addr,
- res->ai_addrlen))
- {
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR,
- "bind");
- freeaddrinfo (res);
- return -1;
- }
- freeaddrinfo (res);
- }
-
- if (GNUNET_OK !=
- GNUNET_NETWORK_socket_listen (nh,
- UNIX_BACKLOG))
- {
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR,
- "listen");
- GNUNET_SCHEDULER_shutdown ();
- return -1;
- }
-
- /* extract and return actual socket handle from 'nh' */
- {
- int fh;
-
- fh = GNUNET_NETWORK_get_fd (nh);
- GNUNET_NETWORK_socket_free_memory_only_ (nh);
- return fh;
- }
-}
diff --git a/src/mhd/mhd_legal.c b/src/mhd/mhd_legal.c
deleted file mode 100644
index 137cc43..0000000
--- a/src/mhd/mhd_legal.c
+++ /dev/null
@@ -1,694 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2019, 2020, 2022 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 <http://www.gnu.org/licenses/>
-*/
-/**
- * @file mhd_legal.c
- * @brief API for returning legal documents based on client language
- * and content type preferences
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include <gnunet/gnunet_util_lib.h>
-#include <gnunet/gnunet_json_lib.h>
-#include <jansson.h>
-#include <microhttpd.h>
-#include "taler_util.h"
-#include "taler_mhd_lib.h"
-
-/**
- * How long should browsers/proxies cache the "legal" replies?
- */
-#define MAX_TERMS_CACHING GNUNET_TIME_UNIT_DAYS
-
-
-/**
- * Entry in the terms-of-service array.
- */
-struct Terms
-{
- /**
- * Kept in a DLL.
- */
- struct Terms *prev;
-
- /**
- * Kept in a DLL.
- */
- struct Terms *next;
-
- /**
- * Mime type of the terms.
- */
- const char *mime_type;
-
- /**
- * The terms (NOT 0-terminated!), mmap()'ed. Do not free,
- * use munmap() instead.
- */
- void *terms;
-
- /**
- * The desired language.
- */
- char *language;
-
- /**
- * deflated @e terms, to return if client supports deflate compression.
- * malloc()'ed. NULL if @e terms does not compress.
- */
- void *compressed_terms;
-
- /**
- * Number of bytes in @e terms.
- */
- size_t terms_size;
-
- /**
- * Number of bytes in @e compressed_terms.
- */
- size_t compressed_terms_size;
-
- /**
- * Sorting key by format preference in case
- * everything else is equal. Higher is preferred.
- */
- unsigned int priority;
-
-};
-
-
-/**
- * Prepared responses for legal documents
- * (terms of service, privacy policy).
- */
-struct TALER_MHD_Legal
-{
- /**
- * DLL of terms of service.
- */
- struct Terms *terms_head;
-
- /**
- * DLL of terms of service.
- */
- struct Terms *terms_tail;
-
- /**
- * Etag to use for the terms of service (= version).
- */
- char *terms_etag;
-};
-
-
-/**
- * Check if @a mime matches the @a accept_pattern.
- *
- * @param accept_pattern a mime pattern like "text/plain"
- * or "image/STAR"
- * @param mime the mime type to match
- * @return true if @a mime matches the @a accept_pattern
- */
-static bool
-mime_matches (const char *accept_pattern,
- const char *mime)
-{
- const char *da = strchr (accept_pattern, '/');
- const char *dm = strchr (mime, '/');
- const char *end;
-
- if ( (NULL == da) ||
- (NULL == dm) )
- return (0 == strcmp ("*", accept_pattern));
- /* FIXME: eventually, we might want to parse the "q=$FLOAT"
- part after the ';' and figure out which one is the
- best/preferred match instead of returning a boolean... */
- end = strchr (da, ';');
- if (NULL == end)
- end = &da[strlen (da)];
- return
- ( ( (1 == da - accept_pattern) &&
- ('*' == *accept_pattern) ) ||
- ( (da - accept_pattern == dm - mime) &&
- (0 == strncasecmp (accept_pattern,
- mime,
- da - accept_pattern)) ) ) &&
- ( (0 == strcmp (da, "/*")) ||
- (0 == strncasecmp (da,
- dm,
- end - da)) );
-}
-
-
-bool
-TALER_MHD_xmime_matches (const char *accept_pattern,
- const char *mime)
-{
- char *ap = GNUNET_strdup (accept_pattern);
- char *sptr;
-
- for (const char *tok = strtok_r (ap, ",", &sptr);
- NULL != tok;
- tok = strtok_r (NULL, ",", &sptr))
- {
- if (mime_matches (tok,
- mime))
- {
- GNUNET_free (ap);
- return true;
- }
- }
- GNUNET_free (ap);
- return false;
-}
-
-
-MHD_RESULT
-TALER_MHD_reply_legal (struct MHD_Connection *conn,
- struct TALER_MHD_Legal *legal)
-{
- struct MHD_Response *resp;
- struct Terms *t;
- struct GNUNET_TIME_Absolute a;
- struct GNUNET_TIME_Timestamp m;
- char dat[128];
- char *langs;
-
- a = GNUNET_TIME_relative_to_absolute (MAX_TERMS_CACHING);
- m = GNUNET_TIME_absolute_to_timestamp (a);
- TALER_MHD_get_date_string (m.abs_time,
- dat);
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Setting '%s' header to '%s'\n",
- MHD_HTTP_HEADER_EXPIRES,
- dat);
- if (NULL != legal)
- {
- const char *etag;
-
- etag = MHD_lookup_connection_value (conn,
- MHD_HEADER_KIND,
- MHD_HTTP_HEADER_IF_NONE_MATCH);
- if ( (NULL != etag) &&
- (NULL != legal->terms_etag) &&
- (0 == strcasecmp (etag,
- legal->terms_etag)) )
- {
- MHD_RESULT ret;
-
- resp = MHD_create_response_from_buffer (0,
- NULL,
- MHD_RESPMEM_PERSISTENT);
- TALER_MHD_add_global_headers (resp);
- GNUNET_break (MHD_YES ==
- MHD_add_response_header (resp,
- MHD_HTTP_HEADER_EXPIRES,
- dat));
-
- GNUNET_break (MHD_YES ==
- MHD_add_response_header (resp,
- MHD_HTTP_HEADER_ETAG,
- legal->terms_etag));
- ret = MHD_queue_response (conn,
- MHD_HTTP_NOT_MODIFIED,
- resp);
- GNUNET_break (MHD_YES == ret);
- MHD_destroy_response (resp);
- return ret;
- }
- }
-
- t = NULL;
- langs = NULL;
- if (NULL != legal)
- {
- const char *mime;
- const char *lang;
-
- mime = MHD_lookup_connection_value (conn,
- MHD_HEADER_KIND,
- MHD_HTTP_HEADER_ACCEPT);
- if (NULL == mime)
- mime = "text/plain";
- lang = MHD_lookup_connection_value (conn,
- MHD_HEADER_KIND,
- MHD_HTTP_HEADER_ACCEPT_LANGUAGE);
- if (NULL == lang)
- lang = "en";
- /* Find best match: must match mime type (if possible), and if
- mime type matches, ideally also language */
- for (struct Terms *p = legal->terms_head;
- NULL != p;
- p = p->next)
- {
- if ( (NULL == t) ||
- (TALER_MHD_xmime_matches (mime,
- p->mime_type)) )
- {
- if (NULL == langs)
- {
- langs = GNUNET_strdup (p->language);
- }
- else
- {
- char *tmp = langs;
-
- GNUNET_asprintf (&langs,
- "%s,%s",
- tmp,
- p->language);
- GNUNET_free (tmp);
- }
- if ( (NULL == t) ||
- (! TALER_MHD_xmime_matches (mime,
- t->mime_type)) ||
- (TALER_language_matches (lang,
- p->language) >
- TALER_language_matches (lang,
- t->language) ) )
- t = p;
- }
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Best match for %s/%s: %s / %s\n",
- lang,
- mime,
- (NULL != t) ? t->mime_type : "<none>",
- (NULL != t) ? t->language : "<none>");
- }
-
- if (NULL == t)
- {
- /* Default terms of service if none are configured */
- static struct Terms none = {
- .mime_type = "text/plain",
- .terms = "not configured",
- .language = "en",
- .terms_size = strlen ("not configured")
- };
-
- t = &none;
- }
-
- /* try to compress the response */
- resp = NULL;
- if (MHD_YES ==
- TALER_MHD_can_compress (conn))
- {
- resp = MHD_create_response_from_buffer (t->compressed_terms_size,
- t->compressed_terms,
- MHD_RESPMEM_PERSISTENT);
- if (MHD_NO ==
- MHD_add_response_header (resp,
- MHD_HTTP_HEADER_CONTENT_ENCODING,
- "deflate"))
- {
- GNUNET_break (0);
- MHD_destroy_response (resp);
- resp = NULL;
- }
- }
- if (NULL == resp)
- {
- /* could not generate compressed response, return uncompressed */
- resp = MHD_create_response_from_buffer (t->terms_size,
- (void *) t->terms,
- MHD_RESPMEM_PERSISTENT);
- }
- TALER_MHD_add_global_headers (resp);
- GNUNET_break (MHD_YES ==
- MHD_add_response_header (resp,
- MHD_HTTP_HEADER_EXPIRES,
- dat));
- if (NULL != langs)
- {
- GNUNET_break (MHD_YES ==
- MHD_add_response_header (resp,
- "Avail-Languages",
- langs));
- GNUNET_free (langs);
- }
- /* Set cache control headers: our response varies depending on these headers
*/
- GNUNET_break (MHD_YES ==
- MHD_add_response_header (resp,
- MHD_HTTP_HEADER_VARY,
- MHD_HTTP_HEADER_ACCEPT_LANGUAGE ","
- MHD_HTTP_HEADER_ACCEPT ","
- MHD_HTTP_HEADER_ACCEPT_ENCODING));
- /* Information is always public, revalidate after 10 days */
- GNUNET_break (MHD_YES ==
- MHD_add_response_header (resp,
- MHD_HTTP_HEADER_CACHE_CONTROL,
- "public max-age=864000"));
- if (NULL != legal)
- GNUNET_break (MHD_YES ==
- MHD_add_response_header (resp,
- MHD_HTTP_HEADER_ETAG,
- legal->terms_etag));
- GNUNET_break (MHD_YES ==
- MHD_add_response_header (resp,
- MHD_HTTP_HEADER_CONTENT_TYPE,
- t->mime_type));
- {
- MHD_RESULT ret;
-
- ret = MHD_queue_response (conn,
- MHD_HTTP_OK,
- resp);
- MHD_destroy_response (resp);
- return ret;
- }
-}
-
-
-/**
- * Load all the terms of service from @a path under language @a lang
- * from file @a name
- *
- * @param[in,out] legal where to write the result
- * @param path where the terms are found
- * @param lang which language directory to crawl
- * @param name specific file to access
- */
-static void
-load_terms (struct TALER_MHD_Legal *legal,
- const char *path,
- const char *lang,
- const char *name)
-{
- static struct MimeMap
- {
- const char *ext;
- const char *mime;
- unsigned int priority;
- } mm[] = {
- { .ext = ".txt", .mime = "text/plain", .priority = 150 },
- { .ext = ".html", .mime = "text/html", .priority = 100 },
- { .ext = ".htm", .mime = "text/html", .priority = 99 },
- { .ext = ".md", .mime = "text/markdown", .priority = 50 },
- { .ext = ".pdf", .mime = "application/pdf", .priority = 25 },
- { .ext = ".jpg", .mime = "image/jpeg" },
- { .ext = ".jpeg", .mime = "image/jpeg" },
- { .ext = ".png", .mime = "image/png" },
- { .ext = ".gif", .mime = "image/gif" },
- { .ext = ".epub", .mime = "application/epub+zip", .priority = 10 },
- { .ext = ".xml", .mime = "text/xml", .priority = 10 },
- { .ext = NULL, .mime = NULL }
- };
- const char *ext = strrchr (name, '.');
- const char *mime;
- unsigned int priority;
-
- if (NULL == ext)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "Unsupported file `%s' in directory `%s/%s': lacks
extension\n",
- name,
- path,
- lang);
- return;
- }
- if ( (NULL == legal->terms_etag) ||
- (0 != strncmp (legal->terms_etag,
- name,
- ext - name - 1)) )
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Filename `%s' does not match Etag `%s' in directory `%s/%s'.
Ignoring it.\n",
- name,
- legal->terms_etag,
- path,
- lang);
- return;
- }
- mime = NULL;
- for (unsigned int i = 0; NULL != mm[i].ext; i++)
- if (0 == strcasecmp (mm[i].ext,
- ext))
- {
- mime = mm[i].mime;
- priority = mm[i].priority;
- break;
- }
- if (NULL == mime)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "Unsupported file extension `%s' of file `%s' in directory
`%s/%s'\n",
- ext,
- name,
- path,
- lang);
- return;
- }
- /* try to read the file with the terms of service */
- {
- struct stat st;
- char *fn;
- int fd;
-
- GNUNET_asprintf (&fn,
- "%s/%s/%s",
- path,
- lang,
- name);
- fd = open (fn, O_RDONLY);
- if (-1 == fd)
- {
- GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING,
- "open",
- fn);
- GNUNET_free (fn);
- return;
- }
- if (0 != fstat (fd, &st))
- {
- GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING,
- "fstat",
- fn);
- GNUNET_break (0 == close (fd));
- GNUNET_free (fn);
- return;
- }
- if (SIZE_MAX < ((unsigned long long) st.st_size))
- {
- GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING,
- "fstat-size",
- fn);
- GNUNET_break (0 == close (fd));
- GNUNET_free (fn);
- return;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Loading legal information from file `%s'\n",
- fn);
- {
- void *buf;
- size_t bsize;
-
- bsize = (size_t) st.st_size;
- buf = mmap (NULL,
- bsize,
- PROT_READ,
- MAP_SHARED,
- fd,
- 0);
- if (MAP_FAILED == buf)
- {
- GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING,
- "mmap",
- fn);
- GNUNET_break (0 == close (fd));
- GNUNET_free (fn);
- return;
- }
- GNUNET_break (0 == close (fd));
- GNUNET_free (fn);
-
- /* insert into global list of terms of service */
- {
- struct Terms *t;
-
- t = GNUNET_new (struct Terms);
- t->mime_type = mime;
- t->terms = buf;
- t->language = GNUNET_strdup (lang);
- t->terms_size = bsize;
- t->priority = priority;
- buf = GNUNET_memdup (t->terms,
- t->terms_size);
- if (TALER_MHD_body_compress (&buf,
- &bsize))
- {
- t->compressed_terms = buf;
- t->compressed_terms_size = bsize;
- }
- else
- {
- GNUNET_free (buf);
- }
- {
- struct Terms *prev = NULL;
-
- for (struct Terms *pos = legal->terms_head;
- NULL != pos;
- pos = pos->next)
- {
- if (pos->priority < priority)
- break;
- prev = pos;
- }
- GNUNET_CONTAINER_DLL_insert_after (legal->terms_head,
- legal->terms_tail,
- prev,
- t);
- }
- }
- }
- }
-}
-
-
-/**
- * Load all the terms of service from @a path under language @a lang.
- *
- * @param[in,out] legal where to write the result
- * @param path where the terms are found
- * @param lang which language directory to crawl
- */
-static void
-load_language (struct TALER_MHD_Legal *legal,
- const char *path,
- const char *lang)
-{
- char *dname;
- DIR *d;
-
- GNUNET_asprintf (&dname,
- "%s/%s",
- path,
- lang);
- d = opendir (dname);
- if (NULL == d)
- {
- GNUNET_free (dname);
- return;
- }
- for (struct dirent *de = readdir (d);
- NULL != de;
- de = readdir (d))
- {
- const char *fn = de->d_name;
-
- if (fn[0] == '.')
- continue;
- load_terms (legal,
- path,
- lang,
- fn);
- }
- GNUNET_break (0 == closedir (d));
- GNUNET_free (dname);
-}
-
-
-struct TALER_MHD_Legal *
-TALER_MHD_legal_load (const struct GNUNET_CONFIGURATION_Handle *cfg,
- const char *section,
- const char *diroption,
- const char *tagoption)
-{
- struct TALER_MHD_Legal *legal;
- char *path;
- DIR *d;
-
- legal = GNUNET_new (struct TALER_MHD_Legal);
- if (GNUNET_OK !=
- GNUNET_CONFIGURATION_get_value_string (cfg,
- section,
- tagoption,
- &legal->terms_etag))
- {
- GNUNET_log_config_missing (GNUNET_ERROR_TYPE_WARNING,
- section,
- tagoption);
- GNUNET_free (legal);
- return NULL;
- }
- if (GNUNET_OK !=
- GNUNET_CONFIGURATION_get_value_filename (cfg,
- section,
- diroption,
- &path))
- {
- GNUNET_log_config_missing (GNUNET_ERROR_TYPE_WARNING,
- section,
- diroption);
- GNUNET_free (legal->terms_etag);
- GNUNET_free (legal);
- return NULL;
- }
- d = opendir (path);
- if (NULL == d)
- {
- GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_WARNING,
- section,
- diroption,
- "Could not open directory");
- GNUNET_free (legal->terms_etag);
- GNUNET_free (legal);
- GNUNET_free (path);
- return NULL;
- }
- for (struct dirent *de = readdir (d);
- NULL != de;
- de = readdir (d))
- {
- const char *lang = de->d_name;
-
- if (lang[0] == '.')
- continue;
- if (0 == strcmp (lang,
- "locale"))
- continue;
- load_language (legal,
- path,
- lang);
- }
- GNUNET_break (0 == closedir (d));
- GNUNET_free (path);
- return legal;
-}
-
-
-void
-TALER_MHD_legal_free (struct TALER_MHD_Legal *legal)
-{
- struct Terms *t;
- if (NULL == legal)
- return;
- while (NULL != (t = legal->terms_head))
- {
- GNUNET_free (t->language);
- GNUNET_free (t->compressed_terms);
- if (0 != munmap (t->terms, t->terms_size))
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
- "munmap");
- GNUNET_CONTAINER_DLL_remove (legal->terms_head,
- legal->terms_tail,
- t);
- GNUNET_free (t);
- }
- GNUNET_free (legal->terms_etag);
- GNUNET_free (legal);
-}
diff --git a/src/mhd/mhd_parsing.c b/src/mhd/mhd_parsing.c
deleted file mode 100644
index 381b064..0000000
--- a/src/mhd/mhd_parsing.c
+++ /dev/null
@@ -1,444 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2014--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 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 <http://www.gnu.org/licenses/>
-*/
-/**
- * @file mhd_parsing.c
- * @brief functions to parse incoming requests (MHD arguments and JSON
snippets)
- * @author Florian Dold
- * @author Benedikt Mueller
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include <gnunet/gnunet_util_lib.h>
-#include <gnunet/gnunet_json_lib.h>
-#include "taler_json_lib.h"
-#include "taler_mhd_lib.h"
-
-
-enum GNUNET_GenericReturnValue
-TALER_MHD_parse_post_json (struct MHD_Connection *connection,
- void **con_cls,
- const char *upload_data,
- size_t *upload_data_size,
- json_t **json)
-{
- enum GNUNET_JSON_PostResult pr;
-
- pr = GNUNET_JSON_post_parser (TALER_MHD_REQUEST_BUFFER_MAX,
- connection,
- con_cls,
- upload_data,
- upload_data_size,
- json);
- switch (pr)
- {
- case GNUNET_JSON_PR_OUT_OF_MEMORY:
- GNUNET_break (NULL == *json);
- return (MHD_NO ==
- TALER_MHD_reply_with_error (
- connection,
- MHD_HTTP_INTERNAL_SERVER_ERROR,
- TALER_EC_GENERIC_PARSER_OUT_OF_MEMORY,
- NULL)) ? GNUNET_SYSERR : GNUNET_NO;
-
- case GNUNET_JSON_PR_CONTINUE:
- GNUNET_break (NULL == *json);
- return GNUNET_YES;
- case GNUNET_JSON_PR_REQUEST_TOO_LARGE:
- GNUNET_break (NULL == *json);
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "Closing connection, upload too large\n");
- return GNUNET_SYSERR;
- case GNUNET_JSON_PR_JSON_INVALID:
- GNUNET_break (NULL == *json);
- return (MHD_YES ==
- TALER_MHD_reply_with_error (connection,
- MHD_HTTP_BAD_REQUEST,
- TALER_EC_GENERIC_JSON_INVALID,
- NULL))
- ? GNUNET_NO : GNUNET_SYSERR;
- case GNUNET_JSON_PR_SUCCESS:
- GNUNET_break (NULL != *json);
- return GNUNET_YES;
- }
- /* this should never happen */
- GNUNET_break (0);
- return GNUNET_SYSERR;
-}
-
-
-void
-TALER_MHD_parse_post_cleanup_callback (void *con_cls)
-{
- GNUNET_JSON_post_parser_cleanup (con_cls);
-}
-
-
-/**
- * Extract fixed-size base32crockford encoded data from request.
- *
- * Queues an error response to the connection if the parameter is missing or
- * invalid.
- *
- * @param connection the MHD connection
- * @param param_name the name of the HTTP key with the value
- * @param kind whether to extract from header, argument or footer
- * @param[out] out_data pointer to store the result
- * @param out_size expected size of @a out_data
- * @param[out] present set to true if argument was found
- * @return
- * #GNUNET_YES if the the argument is present
- * #GNUNET_NO if the argument is absent or malformed
- * #GNUNET_SYSERR on internal error (error response could not be sent)
- */
-static enum GNUNET_GenericReturnValue
-parse_request_data (struct MHD_Connection *connection,
- const char *param_name,
- enum MHD_ValueKind kind,
- void *out_data,
- size_t out_size,
- bool *present)
-{
- const char *str;
-
- str = MHD_lookup_connection_value (connection,
- kind,
- param_name);
- if (NULL == str)
- {
- *present = false;
- return GNUNET_OK;
- }
- if (GNUNET_OK !=
- GNUNET_STRINGS_string_to_data (str,
- strlen (str),
- out_data,
- out_size))
- return (MHD_NO ==
- TALER_MHD_reply_with_error (connection,
- MHD_HTTP_BAD_REQUEST,
- TALER_EC_GENERIC_PARAMETER_MALFORMED,
- param_name))
- ? GNUNET_SYSERR : GNUNET_NO;
- *present = true;
- return GNUNET_OK;
-}
-
-
-enum GNUNET_GenericReturnValue
-TALER_MHD_parse_request_arg_data (struct MHD_Connection *connection,
- const char *param_name,
- void *out_data,
- size_t out_size,
- bool *present)
-{
- return parse_request_data (connection,
- param_name,
- MHD_GET_ARGUMENT_KIND,
- out_data,
- out_size,
- present);
-}
-
-
-enum GNUNET_GenericReturnValue
-TALER_MHD_parse_request_header_data (struct MHD_Connection *connection,
- const char *header_name,
- void *out_data,
- size_t out_size,
- bool *present)
-{
- return parse_request_data (connection,
- header_name,
- MHD_HEADER_KIND,
- out_data,
- out_size,
- present);
-}
-
-
-enum GNUNET_GenericReturnValue
-TALER_MHD_parse_request_arg_timeout (struct MHD_Connection *connection,
- struct GNUNET_TIME_Absolute *expiration)
-{
- const char *ts;
- char dummy;
- unsigned long long tms;
-
- ts = MHD_lookup_connection_value (connection,
- MHD_GET_ARGUMENT_KIND,
- "timeout_ms");
- if (NULL == ts)
- {
- *expiration = GNUNET_TIME_UNIT_ZERO_ABS;
- return GNUNET_OK;
- }
- if (1 !=
- sscanf (ts,
- "%llu%c",
- &tms,
- &dummy))
- {
- MHD_RESULT mret;
-
- GNUNET_break_op (0);
- mret = TALER_MHD_reply_with_error (connection,
- MHD_HTTP_BAD_REQUEST,
- TALER_EC_GENERIC_PARAMETER_MALFORMED,
- "timeout_ms");
- return (MHD_YES == mret)
- ? GNUNET_NO
- : GNUNET_SYSERR;
- }
- *expiration = GNUNET_TIME_relative_to_absolute (
- GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS,
- tms));
- return GNUNET_OK;
-}
-
-
-enum GNUNET_GenericReturnValue
-TALER_MHD_parse_request_arg_number (struct MHD_Connection *connection,
- const char *name,
- uint64_t *off)
-{
- const char *ts;
- char dummy;
- unsigned long long num;
-
- ts = MHD_lookup_connection_value (connection,
- MHD_GET_ARGUMENT_KIND,
- name);
- if (NULL == ts)
- return GNUNET_OK;
- if (1 !=
- sscanf (ts,
- "%llu%c",
- &num,
- &dummy))
- {
- MHD_RESULT mret;
-
- GNUNET_break_op (0);
- mret = TALER_MHD_reply_with_error (connection,
- MHD_HTTP_BAD_REQUEST,
- TALER_EC_GENERIC_PARAMETER_MALFORMED,
- name);
- return (MHD_YES == mret)
- ? GNUNET_NO
- : GNUNET_SYSERR;
- }
- *off = (uint64_t) num;
- return GNUNET_OK;
-}
-
-
-enum GNUNET_GenericReturnValue
-TALER_MHD_parse_json_data (struct MHD_Connection *connection,
- const json_t *root,
- struct GNUNET_JSON_Specification *spec)
-{
- enum GNUNET_GenericReturnValue ret;
- const char *error_json_name;
- unsigned int error_line;
-
- ret = GNUNET_JSON_parse (root,
- spec,
- &error_json_name,
- &error_line);
- if (GNUNET_SYSERR == ret)
- {
- if (NULL == error_json_name)
- error_json_name = "<no field>";
- ret = (MHD_YES ==
- TALER_MHD_REPLY_JSON_PACK (
- connection,
- MHD_HTTP_BAD_REQUEST,
- GNUNET_JSON_pack_string ("hint",
- TALER_ErrorCode_get_hint (
- TALER_EC_GENERIC_JSON_INVALID)),
- GNUNET_JSON_pack_uint64 ("code",
- TALER_EC_GENERIC_JSON_INVALID),
- GNUNET_JSON_pack_string ("field",
- error_json_name),
- GNUNET_JSON_pack_uint64 ("line",
- error_line)))
- ? GNUNET_NO : GNUNET_SYSERR;
- return ret;
- }
- return GNUNET_YES;
-}
-
-
-enum GNUNET_GenericReturnValue
-TALER_MHD_parse_internal_json_data (struct MHD_Connection *connection,
- const json_t *root,
- struct GNUNET_JSON_Specification *spec)
-{
- enum GNUNET_GenericReturnValue ret;
- const char *error_json_name;
- unsigned int error_line;
-
- ret = GNUNET_JSON_parse (root,
- spec,
- &error_json_name,
- &error_line);
- if (GNUNET_SYSERR == ret)
- {
- if (NULL == error_json_name)
- error_json_name = "<no field>";
- ret = (MHD_YES ==
- TALER_MHD_REPLY_JSON_PACK (
- connection,
- MHD_HTTP_INTERNAL_SERVER_ERROR,
- GNUNET_JSON_pack_string ("hint",
- TALER_ErrorCode_get_hint (
-
TALER_EC_GENERIC_INTERNAL_INVARIANT_FAILURE)),
- GNUNET_JSON_pack_uint64 ("code",
-
TALER_EC_GENERIC_INTERNAL_INVARIANT_FAILURE),
- GNUNET_JSON_pack_string ("field",
- error_json_name),
- GNUNET_JSON_pack_uint64 ("line",
- error_line)))
- ? GNUNET_NO : GNUNET_SYSERR;
- return ret;
- }
- return GNUNET_YES;
-}
-
-
-enum GNUNET_GenericReturnValue
-TALER_MHD_parse_json_array (struct MHD_Connection *connection,
- const json_t *root,
- struct GNUNET_JSON_Specification *spec,
- ...)
-{
- enum GNUNET_GenericReturnValue ret;
- const char *error_json_name;
- unsigned int error_line;
- va_list ap;
- json_int_t dim;
-
- va_start (ap, spec);
- dim = 0;
- while ( (-1 != (ret = va_arg (ap, int))) &&
- (NULL != root) )
- {
- dim++;
- root = json_array_get (root, ret);
- }
- va_end (ap);
- if (NULL == root)
- {
- ret = (MHD_YES ==
- TALER_MHD_REPLY_JSON_PACK (
- connection,
- MHD_HTTP_BAD_REQUEST,
- GNUNET_JSON_pack_string ("hint",
- TALER_ErrorCode_get_hint (
- TALER_EC_GENERIC_JSON_INVALID)),
- GNUNET_JSON_pack_uint64 ("code",
- TALER_EC_GENERIC_JSON_INVALID),
- GNUNET_JSON_pack_string ("detail",
- "expected array"),
- GNUNET_JSON_pack_uint64 ("dimension",
- dim)))
- ? GNUNET_NO : GNUNET_SYSERR;
- return ret;
- }
- ret = GNUNET_JSON_parse (root,
- spec,
- &error_json_name,
- &error_line);
- if (GNUNET_SYSERR == ret)
- {
- if (NULL == error_json_name)
- error_json_name = "<no field>";
- ret = (MHD_YES ==
- TALER_MHD_REPLY_JSON_PACK (
- connection,
- MHD_HTTP_BAD_REQUEST,
- GNUNET_JSON_pack_string ("detail",
- error_json_name),
- GNUNET_JSON_pack_string ("hint",
- TALER_ErrorCode_get_hint (
- TALER_EC_GENERIC_JSON_INVALID)),
- GNUNET_JSON_pack_uint64 ("code",
- TALER_EC_GENERIC_JSON_INVALID),
- GNUNET_JSON_pack_uint64 ("line",
- error_line)))
- ? GNUNET_NO : GNUNET_SYSERR;
- return ret;
- }
- return GNUNET_YES;
-}
-
-
-enum GNUNET_GenericReturnValue
-TALER_MHD_check_content_length_ (struct MHD_Connection *connection,
- unsigned long long max_len)
-{
- const char *cl;
- unsigned long long cv;
- char dummy;
-
- /* Maybe check for maximum upload size
- and refuse requests if they are just too big. */
- cl = MHD_lookup_connection_value (connection,
- MHD_HEADER_KIND,
- MHD_HTTP_HEADER_CONTENT_LENGTH);
- if (NULL == cl)
- {
- return GNUNET_OK;
-#if 0
- /* wallet currently doesn't always send content-length! */
- GNUNET_break_op (0);
- return (MHD_YES ==
- TALER_MHD_reply_with_error (connection,
- MHD_HTTP_BAD_REQUEST,
- TALER_EC_GENERIC_PARAMETER_MISSING,
- MHD_HTTP_HEADER_CONTENT_LENGTH))
- ? GNUNET_NO
- : GNUNET_SYSERR;
-#endif
- }
- if (1 != sscanf (cl,
- "%llu%c",
- &cv,
- &dummy))
- {
- /* Not valid HTTP request, just close connection. */
- GNUNET_break_op (0);
- return (MHD_YES ==
- TALER_MHD_reply_with_error (connection,
- MHD_HTTP_BAD_REQUEST,
- TALER_EC_GENERIC_PARAMETER_MALFORMED,
- MHD_HTTP_HEADER_CONTENT_LENGTH))
- ? GNUNET_NO
- : GNUNET_SYSERR;
- }
- if (cv > TALER_MHD_REQUEST_BUFFER_MAX)
- {
- GNUNET_break_op (0);
- return (MHD_YES ==
- TALER_MHD_reply_request_too_large (connection))
- ? GNUNET_NO
- : GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/* end of mhd_parsing.c */
diff --git a/src/mhd/mhd_responses.c b/src/mhd/mhd_responses.c
deleted file mode 100644
index 7dd6824..0000000
--- a/src/mhd/mhd_responses.c
+++ /dev/null
@@ -1,550 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2014-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 <http://www.gnu.org/licenses/>
-*/
-/**
- * @file mhd_responses.c
- * @brief API for generating HTTP replies
- * @author Florian Dold
- * @author Benedikt Mueller
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include <zlib.h>
-#include "taler_util.h"
-#include "taler_mhd_lib.h"
-
-
-/**
- * Global options for response generation.
- */
-static enum TALER_MHD_GlobalOptions TM_go;
-
-
-void
-TALER_MHD_setup (enum TALER_MHD_GlobalOptions go)
-{
- TM_go = go;
-}
-
-
-void
-TALER_MHD_add_global_headers (struct MHD_Response *response)
-{
- if (0 != (TM_go & TALER_MHD_GO_FORCE_CONNECTION_CLOSE))
- GNUNET_break (MHD_YES ==
- MHD_add_response_header (response,
- MHD_HTTP_HEADER_CONNECTION,
- "close"));
- /* The wallet, operating from a background page, needs CORS to
- be disabled otherwise browsers block access. */
- GNUNET_break (MHD_YES ==
- MHD_add_response_header (response,
-
MHD_HTTP_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN,
- "*"));
- GNUNET_break (MHD_YES ==
- MHD_add_response_header (response,
- /* Not available as MHD constant yet
*/
- "Access-Control-Expose-Headers",
- "*"));
-}
-
-
-MHD_RESULT
-TALER_MHD_can_compress (struct MHD_Connection *connection)
-{
- const char *ae;
- const char *de;
-
- if (0 != (TM_go & TALER_MHD_GO_DISABLE_COMPRESSION))
- return MHD_NO;
- ae = MHD_lookup_connection_value (connection,
- MHD_HEADER_KIND,
- MHD_HTTP_HEADER_ACCEPT_ENCODING);
- if (NULL == ae)
- return MHD_NO;
- if (0 == strcmp (ae,
- "*"))
- return MHD_YES;
- de = strstr (ae,
- "deflate");
- if (NULL == de)
- return MHD_NO;
- if ( ( (de == ae) ||
- (de[-1] == ',') ||
- (de[-1] == ' ') ) &&
- ( (de[strlen ("deflate")] == '\0') ||
- (de[strlen ("deflate")] == ',') ||
- (de[strlen ("deflate")] == ';') ) )
- return MHD_YES;
- return MHD_NO;
-}
-
-
-MHD_RESULT
-TALER_MHD_body_compress (void **buf,
- size_t *buf_size)
-{
- Bytef *cbuf;
- uLongf cbuf_size;
- MHD_RESULT ret;
-
- cbuf_size = compressBound (*buf_size);
- cbuf = malloc (cbuf_size);
- if (NULL == cbuf)
- return MHD_NO;
- ret = compress (cbuf,
- &cbuf_size,
- (const Bytef *) *buf,
- *buf_size);
- if ( (Z_OK != ret) ||
- (cbuf_size >= *buf_size) )
- {
- /* compression failed */
- free (cbuf);
- return MHD_NO;
- }
- free (*buf);
- *buf = (void *) cbuf;
- *buf_size = (size_t) cbuf_size;
- return MHD_YES;
-}
-
-
-struct MHD_Response *
-TALER_MHD_make_json (const json_t *json)
-{
- struct MHD_Response *response;
- char *json_str;
-
- json_str = json_dumps (json,
- JSON_INDENT (2));
- if (NULL == json_str)
- {
- GNUNET_break (0);
- return NULL;
- }
- response = MHD_create_response_from_buffer (strlen (json_str),
- json_str,
- MHD_RESPMEM_MUST_FREE);
- if (NULL == response)
- {
- free (json_str);
- GNUNET_break (0);
- return NULL;
- }
- TALER_MHD_add_global_headers (response);
- GNUNET_break (MHD_YES ==
- MHD_add_response_header (response,
- MHD_HTTP_HEADER_CONTENT_TYPE,
- "application/json"));
- return response;
-}
-
-
-struct MHD_Response *
-TALER_MHD_make_json_steal (json_t *json)
-{
- struct MHD_Response *res;
-
- res = TALER_MHD_make_json (json);
- json_decref (json);
- return res;
-}
-
-
-MHD_RESULT
-TALER_MHD_reply_json (struct MHD_Connection *connection,
- const json_t *json,
- unsigned int response_code)
-{
- struct MHD_Response *response;
- void *json_str;
- size_t json_len;
- MHD_RESULT is_compressed;
-
- json_str = json_dumps (json,
- JSON_INDENT (2));
- if (NULL == json_str)
- {
- /**
- * This log helps to figure out which
- * function called this one and assert-failed.
- */
- TALER_LOG_ERROR ("Aborting json-packing for HTTP code: %u\n",
- response_code);
-
- GNUNET_assert (0);
- return MHD_NO;
- }
- json_len = strlen (json_str);
- /* try to compress the body */
- is_compressed = MHD_NO;
- if (MHD_YES ==
- TALER_MHD_can_compress (connection))
- is_compressed = TALER_MHD_body_compress (&json_str,
- &json_len);
- response = MHD_create_response_from_buffer (json_len,
- json_str,
- MHD_RESPMEM_MUST_FREE);
- if (NULL == response)
- {
- free (json_str);
- GNUNET_break (0);
- return MHD_NO;
- }
- TALER_MHD_add_global_headers (response);
- GNUNET_break (MHD_YES ==
- MHD_add_response_header (response,
- MHD_HTTP_HEADER_CONTENT_TYPE,
- "application/json"));
- if (MHD_YES == is_compressed)
- {
- /* Need to indicate to client that body is compressed */
- if (MHD_NO ==
- MHD_add_response_header (response,
- MHD_HTTP_HEADER_CONTENT_ENCODING,
- "deflate"))
- {
- GNUNET_break (0);
- MHD_destroy_response (response);
- return MHD_NO;
- }
- }
-
- {
- MHD_RESULT ret;
-
- ret = MHD_queue_response (connection,
- response_code,
- response);
- MHD_destroy_response (response);
- return ret;
- }
-}
-
-
-MHD_RESULT
-TALER_MHD_reply_json_steal (struct MHD_Connection *connection,
- json_t *json,
- unsigned int response_code)
-{
- MHD_RESULT ret;
-
- ret = TALER_MHD_reply_json (connection,
- json,
- response_code);
- json_decref (json);
- return ret;
-}
-
-
-MHD_RESULT
-TALER_MHD_reply_cors_preflight (struct MHD_Connection *connection)
-{
- struct MHD_Response *response;
-
- response = MHD_create_response_from_buffer (0,
- NULL,
- MHD_RESPMEM_PERSISTENT);
- if (NULL == response)
- return MHD_NO;
- /* This adds the Access-Control-Allow-Origin header.
- * All endpoints of the exchange allow CORS. */
- TALER_MHD_add_global_headers (response);
- GNUNET_break (MHD_YES ==
- MHD_add_response_header (response,
- /* Not available as MHD constant yet
*/
- "Access-Control-Allow-Headers",
- "*"));
- GNUNET_break (MHD_YES ==
- MHD_add_response_header (response,
- /* Not available as MHD constant yet
*/
- "Access-Control-Allow-Methods",
- "*"));
- {
- MHD_RESULT ret;
-
- ret = MHD_queue_response (connection,
- MHD_HTTP_NO_CONTENT,
- response);
- MHD_destroy_response (response);
- return ret;
- }
-}
-
-
-MHD_RESULT
-TALER_MHD_reply_json_pack (struct MHD_Connection *connection,
- unsigned int response_code,
- const char *fmt,
- ...)
-{
- json_t *json;
- json_error_t jerror;
-
- {
- va_list argp;
-
- va_start (argp,
- fmt);
- json = json_vpack_ex (&jerror,
- 0,
- fmt,
- argp);
- va_end (argp);
- }
-
- if (NULL == json)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Failed to pack JSON with format `%s': %s\n",
- fmt,
- jerror.text);
- GNUNET_break (0);
- return MHD_NO;
- }
-
- {
- MHD_RESULT ret;
-
- ret = TALER_MHD_reply_json (connection,
- json,
- response_code);
- json_decref (json);
- return ret;
- }
-}
-
-
-struct MHD_Response *
-TALER_MHD_make_json_pack (const char *fmt,
- ...)
-{
- json_t *json;
- json_error_t jerror;
-
- {
- va_list argp;
-
- va_start (argp, fmt);
- json = json_vpack_ex (&jerror,
- 0,
- fmt,
- argp);
- va_end (argp);
- }
-
- if (NULL == json)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Failed to pack JSON with format `%s': %s\n",
- fmt,
- jerror.text);
- GNUNET_break (0);
- return NULL;
- }
-
- {
- struct MHD_Response *response;
-
- response = TALER_MHD_make_json (json);
- json_decref (json);
- return response;
- }
-}
-
-
-struct MHD_Response *
-TALER_MHD_make_error (enum TALER_ErrorCode ec,
- const char *detail)
-{
- return TALER_MHD_MAKE_JSON_PACK (
- TALER_MHD_PACK_EC (ec),
- GNUNET_JSON_pack_allow_null (
- GNUNET_JSON_pack_string ("detail", detail)));
-}
-
-
-MHD_RESULT
-TALER_MHD_reply_with_error (struct MHD_Connection *connection,
- unsigned int http_status,
- enum TALER_ErrorCode ec,
- const char *detail)
-{
- return TALER_MHD_REPLY_JSON_PACK (
- connection,
- http_status,
- TALER_MHD_PACK_EC (ec),
- GNUNET_JSON_pack_allow_null (
- GNUNET_JSON_pack_string ("detail", detail)));
-}
-
-
-MHD_RESULT
-TALER_MHD_reply_with_ec (struct MHD_Connection *connection,
- enum TALER_ErrorCode ec,
- const char *detail)
-{
- unsigned int hc = TALER_ErrorCode_get_http_status (ec);
-
- if ( (0 == hc) ||
- (UINT_MAX == hc) )
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Invalid Taler error code %d provided for response!\n",
- (int) ec);
- hc = MHD_HTTP_INTERNAL_SERVER_ERROR;
- }
- return TALER_MHD_reply_with_error (connection,
- hc,
- ec,
- detail);
-}
-
-
-MHD_RESULT
-TALER_MHD_reply_request_too_large (struct MHD_Connection *connection)
-{
- return TALER_MHD_reply_with_error (connection,
- MHD_HTTP_REQUEST_ENTITY_TOO_LARGE,
- TALER_EC_GENERIC_UPLOAD_EXCEEDS_LIMIT,
- NULL);
-}
-
-
-MHD_RESULT
-TALER_MHD_reply_agpl (struct MHD_Connection *connection,
- const char *url)
-{
- const char *agpl =
- "This server is licensed under the Affero GPL. You will now be redirected
to the source code.";
- struct MHD_Response *response;
-
- response = MHD_create_response_from_buffer (strlen (agpl),
- (void *) agpl,
- MHD_RESPMEM_PERSISTENT);
- if (NULL == response)
- {
- GNUNET_break (0);
- return MHD_NO;
- }
- TALER_MHD_add_global_headers (response);
- GNUNET_break (MHD_YES ==
- MHD_add_response_header (response,
- MHD_HTTP_HEADER_CONTENT_TYPE,
- "text/plain"));
- if (MHD_NO ==
- MHD_add_response_header (response,
- MHD_HTTP_HEADER_LOCATION,
- url))
- {
- GNUNET_break (0);
- MHD_destroy_response (response);
- return MHD_NO;
- }
-
- {
- MHD_RESULT ret;
-
- ret = MHD_queue_response (connection,
- MHD_HTTP_FOUND,
- response);
- MHD_destroy_response (response);
- return ret;
- }
-}
-
-
-MHD_RESULT
-TALER_MHD_reply_static (struct MHD_Connection *connection,
- unsigned int http_status,
- const char *mime_type,
- const char *body,
- size_t body_size)
-{
- struct MHD_Response *response;
-
- response = MHD_create_response_from_buffer (body_size,
- (void *) body,
- MHD_RESPMEM_PERSISTENT);
- if (NULL == response)
- {
- GNUNET_break (0);
- return MHD_NO;
- }
- TALER_MHD_add_global_headers (response);
- if (NULL != mime_type)
- GNUNET_break (MHD_YES ==
- MHD_add_response_header (response,
- MHD_HTTP_HEADER_CONTENT_TYPE,
- mime_type));
- {
- MHD_RESULT ret;
-
- ret = MHD_queue_response (connection,
- http_status,
- response);
- MHD_destroy_response (response);
- return ret;
- }
-}
-
-
-void
-TALER_MHD_get_date_string (struct GNUNET_TIME_Absolute at,
- char date[128])
-{
- static const char *const days[] =
- { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
- static const char *const mons[] =
- { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct",
- "Nov", "Dec"};
- struct tm now;
- time_t t;
-#if ! defined(HAVE_C11_GMTIME_S) && ! defined(HAVE_W32_GMTIME_S) && \
- ! defined(HAVE_GMTIME_R)
- struct tm*pNow;
-#endif
-
- date[0] = 0;
- t = (time_t) (at.abs_value_us / 1000LL / 1000LL);
-#if defined(HAVE_C11_GMTIME_S)
- if (NULL == gmtime_s (&t, &now))
- return;
-#elif defined(HAVE_W32_GMTIME_S)
- if (0 != gmtime_s (&now, &t))
- return;
-#elif defined(HAVE_GMTIME_R)
- if (NULL == gmtime_r (&t, &now))
- return;
-#else
- pNow = gmtime (&t);
- if (NULL == pNow)
- return;
- now = *pNow;
-#endif
- sprintf (date,
- "%3s, %02u %3s %04u %02u:%02u:%02u GMT",
- days[now.tm_wday % 7],
- (unsigned int) now.tm_mday,
- mons[now.tm_mon % 12],
- (unsigned int) (1900 + now.tm_year),
- (unsigned int) now.tm_hour,
- (unsigned int) now.tm_min,
- (unsigned int) now.tm_sec);
-}
-
-
-/* end of mhd_responses.c */
diff --git a/src/mhd/mhd_run.c b/src/mhd/mhd_run.c
deleted file mode 100644
index 8388fbf..0000000
--- a/src/mhd/mhd_run.c
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2019-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 <http://www.gnu.org/licenses/>
-*/
-/**
- * @file mhd_run.c
- * @brief API for running an MHD daemon with the
- * GNUnet scheduler
- * @author Christian Grothoff
- */
-#include "platform.h"
-#include <gnunet/gnunet_util_lib.h>
-#include <gnunet/gnunet_json_lib.h>
-#include <jansson.h>
-#include <microhttpd.h>
-#include "taler_util.h"
-#include "taler_mhd_lib.h"
-
-
-/**
- * Set to true if we should immediately MHD_run() again.
- */
-static bool triggered;
-
-/**
- * Task running the HTTP server.
- */
-static struct GNUNET_SCHEDULER_Task *mhd_task;
-
-/**
- * The MHD daemon we are running.
- */
-static struct MHD_Daemon *mhd;
-
-
-/**
- * Function that queries MHD's select sets and
- * starts the task waiting for them.
- */
-static struct GNUNET_SCHEDULER_Task *
-prepare_daemon (void);
-
-
-/**
- * Call MHD to process pending requests and then go back
- * and schedule the next run.
- *
- * @param cls NULL
- */
-static void
-run_daemon (void *cls)
-{
- (void) cls;
- mhd_task = NULL;
- do {
- triggered = false;
- GNUNET_assert (MHD_YES ==
- MHD_run (mhd));
- } while (triggered);
- mhd_task = prepare_daemon ();
-}
-
-
-/**
- * Function that queries MHD's select sets and starts the task waiting for
- * them.
- *
- * @return task handle for the MHD task.
- */
-static struct GNUNET_SCHEDULER_Task *
-prepare_daemon (void)
-{
- struct GNUNET_SCHEDULER_Task *ret;
- fd_set rs;
- fd_set ws;
- fd_set es;
- struct GNUNET_NETWORK_FDSet *wrs;
- struct GNUNET_NETWORK_FDSet *wws;
- int max;
- MHD_UNSIGNED_LONG_LONG timeout;
- int haveto;
- struct GNUNET_TIME_Relative tv;
-
- FD_ZERO (&rs);
- FD_ZERO (&ws);
- FD_ZERO (&es);
- wrs = GNUNET_NETWORK_fdset_create ();
- wws = GNUNET_NETWORK_fdset_create ();
- max = -1;
- GNUNET_assert (MHD_YES ==
- MHD_get_fdset (mhd,
- &rs,
- &ws,
- &es,
- &max));
- haveto = MHD_get_timeout (mhd,
- &timeout);
- if (haveto == MHD_YES)
- tv = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS,
- timeout);
- else
- tv = GNUNET_TIME_UNIT_FOREVER_REL;
- GNUNET_NETWORK_fdset_copy_native (wrs,
- &rs,
- max + 1);
- GNUNET_NETWORK_fdset_copy_native (wws,
- &ws,
- max + 1);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Adding run_daemon select task\n");
- ret = GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_HIGH,
- tv,
- wrs,
- wws,
- &run_daemon,
- NULL);
- GNUNET_NETWORK_fdset_destroy (wrs);
- GNUNET_NETWORK_fdset_destroy (wws);
- return ret;
-}
-
-
-void
-TALER_MHD_daemon_start (struct MHD_Daemon *daemon)
-{
- GNUNET_assert (NULL == mhd);
- mhd = daemon;
- mhd_task = prepare_daemon ();
-}
-
-
-struct MHD_Daemon *
-TALER_MHD_daemon_stop (void)
-{
- struct MHD_Daemon *ret;
-
- if (NULL != mhd_task)
- {
- GNUNET_SCHEDULER_cancel (mhd_task);
- mhd_task = NULL;
- }
- ret = mhd;
- mhd = NULL;
- return ret;
-}
-
-
-void
-TALER_MHD_daemon_trigger (void)
-{
- if (NULL != mhd_task)
- {
- GNUNET_SCHEDULER_cancel (mhd_task);
- mhd_task = GNUNET_SCHEDULER_add_now (&run_daemon,
- NULL);
- }
- else
- {
- triggered = true;
- }
-}
-
-
-/* end of mhd_run.c */
diff --git a/src/sq/Makefile.am b/src/sq/Makefile.am
deleted file mode 100644
index f27dec3..0000000
--- a/src/sq/Makefile.am
+++ /dev/null
@@ -1,40 +0,0 @@
-# This Makefile.am is in the public domain
-AM_CPPFLAGS = -I$(top_srcdir)/src/include $(LIBGCRYPT_CFLAGS)
$(SQLITE_CPPFLAGS)
-
-if USE_COVERAGE
- AM_CFLAGS = --coverage -O0
- XLIB = -lgcov
-endif
-
-lib_LTLIBRARIES = \
- libtalersq.la
-
-libtalersq_la_SOURCES = \
- sq_query_helper.c \
- sq_result_helper.c
-libtalersq_la_LIBADD = \
- $(top_builddir)/src/util/libtalerutil.la \
- -lgnunetutil -ljansson \
- -lsqlite3 \
- $(XLIB)
-libtalersq_la_LDFLAGS = \
- $(SQLITE_LDFLAGS) \
- -version-info 0:0:0 \
- -no-undefined
-
-check_PROGRAMS= \
- test_sq
-
-TESTS = \
- $(check_PROGRAMS)
-
-test_sq_SOURCES = \
- test_sq.c
-test_sq_LDADD = \
- libtalersq.la \
- $(top_builddir)/src/util/libtalerutil.la \
- -lgnunetsq \
- -lgnunetutil \
- -ljansson \
- -lsqlite3 \
- $(XLIB)
diff --git a/src/sq/sq_query_helper.c b/src/sq/sq_query_helper.c
deleted file mode 100644
index 711e638..0000000
--- a/src/sq/sq_query_helper.c
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2020 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 <http://www.gnu.org/licenses/>
-*/
-/**
- * @file sq/sq_query_helper.c
- * @brief helper functions for Taler-specific SQLite3 interactions
- * @author Jonathan Buchanan
- */
-#include "platform.h"
-#include <sqlite3.h>
-#include <gnunet/gnunet_util_lib.h>
-#include <gnunet/gnunet_sq_lib.h>
-#include "taler_sq_lib.h"
-
-
-/**
- * Function called to convert input argument into SQL parameters.
- *
- * @param cls closure
- * @param data pointer to input argument, here a `struct TALER_Amount`
- * @param data_len number of bytes in @a data (if applicable)
- * @param stmt sqlite statement to parameters for
- * @param off offset of the argument to bind in @a stmt, numbered from 1,
- * so immediately suitable for passing to `sqlite3_bind`-functions.
- * @return #GNUNET_SYSERR on error, #GNUNET_OK on success
- */
-static enum GNUNET_GenericReturnValue
-qconv_amount (void *cls,
- const void *data,
- size_t data_len,
- sqlite3_stmt *stmt,
- unsigned int off)
-{
- const struct TALER_Amount *amount = data;
-
- (void) cls;
- GNUNET_assert (sizeof (struct TALER_Amount) == data_len);
- if (SQLITE_OK != sqlite3_bind_int64 (stmt,
- (int) off,
- (sqlite3_int64) amount->value))
- return GNUNET_SYSERR;
- if (SQLITE_OK != sqlite3_bind_int64 (stmt,
- (int) off + 1,
- (sqlite3_int64) amount->fraction))
- return GNUNET_SYSERR;
- return GNUNET_OK;
-}
-
-
-struct GNUNET_SQ_QueryParam
-TALER_SQ_query_param_amount (const struct TALER_Amount *x)
-{
- struct GNUNET_SQ_QueryParam res = {
- .conv = &qconv_amount,
- .data = x,
- .size = sizeof (*x),
- .num_params = 2
- };
-
- return res;
-}
-
-
-/**
- * Function called to convert input argument into SQL parameters.
- *
- * @param cls closure
- * @param data pointer to input argument, here a `struct TALER_AmountNBO`
- * @param data_len number of bytes in @a data (if applicable)
- * @param stmt sqlite statement to parameters for
- * @param off offset of the argument to bind in @a stmt, numbered from 1,
- * so immediately suitable for passing to `sqlite3_bind`-functions.
- * @return #GNUNET_SYSERR on error, #GNUNET_OK on success
- */
-static enum GNUNET_GenericReturnValue
-qconv_amount_nbo (void *cls,
- const void *data,
- size_t data_len,
- sqlite3_stmt *stmt,
- unsigned int off)
-{
- const struct TALER_AmountNBO *amount = data;
- struct TALER_Amount amount_hbo;
-
- (void) cls;
- (void) data_len;
- TALER_amount_ntoh (&amount_hbo,
- amount);
- return qconv_amount (cls,
- &amount_hbo,
- sizeof (struct TALER_Amount),
- stmt,
- off);
-}
-
-
-struct GNUNET_SQ_QueryParam
-TALER_SQ_query_param_amount_nbo (const struct TALER_AmountNBO *x)
-{
- struct GNUNET_SQ_QueryParam res = {
- .conv = &qconv_amount_nbo,
- .data = x,
- .size = sizeof (*x),
- .num_params = 2
- };
-
- return res;
-}
-
-
-/**
- * Function called to convert input argument into SQL parameters.
- *
- * @param cls closure
- * @param data pointer to input argument, here a `struct TALER_Amount`
- * @param data_len number of bytes in @a data (if applicable)
- * @param stmt sqlite statement to parameters for
- * @param off offset of the argument to bind in @a stmt, numbered from 1,
- * so immediately suitable for passing to `sqlite3_bind`-functions.
- * @return #GNUNET_SYSERR on error, #GNUNET_OK on success
- */
-static enum GNUNET_GenericReturnValue
-qconv_json (void *cls,
- const void *data,
- size_t data_len,
- sqlite3_stmt *stmt,
- unsigned int off)
-{
- const json_t *json = data;
- char *str;
-
- (void) cls;
- (void) data_len;
- str = json_dumps (json, JSON_COMPACT);
- if (NULL == str)
- return GNUNET_SYSERR;
-
- if (SQLITE_OK != sqlite3_bind_text (stmt,
- (int) off,
- str,
- strlen (str),
- SQLITE_TRANSIENT))
- return GNUNET_SYSERR;
- GNUNET_free (str);
- return GNUNET_OK;
-}
-
-
-struct GNUNET_SQ_QueryParam
-TALER_SQ_query_param_json (const json_t *x)
-{
- struct GNUNET_SQ_QueryParam res = {
- .conv = &qconv_json,
- .data = x,
- .size = sizeof (*x),
- .num_params = 1
- };
-
- return res;
-}
-
-
-/* end of sq/sq_query_helper.c */
diff --git a/src/sq/sq_result_helper.c b/src/sq/sq_result_helper.c
deleted file mode 100644
index 9d80837..0000000
--- a/src/sq/sq_result_helper.c
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2020 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 <http://www.gnu.org/licenses/>
-*/
-/**
- * @file sq/sq_result_helper.c
- * @brief functions to initialize parameter arrays
- * @author Jonathan Buchanan
- */
-#include "platform.h"
-#include <sqlite3.h>
-#include <gnunet/gnunet_util_lib.h>
-#include <gnunet/gnunet_sq_lib.h>
-#include "taler_sq_lib.h"
-#include "taler_util.h"
-
-
-/**
- * Extract amount data from a SQLite database
- *
- * @param cls closure, a `const char *` giving the currency
- * @param result where to extract data from
- * @param column column to extract data from
- * @param[in,out] dst_size where to store size of result, may be NULL
- * @param[out] dst where to store the result
- * @return
- * #GNUNET_YES if all results could be extracted
- * #GNUNET_SYSERR if a result was invalid (non-existing field or NULL)
- */
-static enum GNUNET_GenericReturnValue
-extract_amount (void *cls,
- sqlite3_stmt *result,
- unsigned int column,
- size_t *dst_size,
- void *dst)
-{
- struct TALER_Amount *amount = dst;
- const char *currency = cls;
- if ((sizeof (struct TALER_Amount) != *dst_size) ||
- (SQLITE_INTEGER != sqlite3_column_type (result,
- (int) column)) ||
- (SQLITE_INTEGER != sqlite3_column_type (result,
- (int) column + 1)))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- GNUNET_strlcpy (amount->currency,
- currency,
- TALER_CURRENCY_LEN);
- amount->value = (uint64_t) sqlite3_column_int64 (result,
- (int) column);
- uint64_t frac = (uint64_t) sqlite3_column_int64 (result,
- (int) column + 1);
- amount->fraction = (uint32_t) frac;
- return GNUNET_YES;
-}
-
-
-struct GNUNET_SQ_ResultSpec
-TALER_SQ_result_spec_amount (const char *currency,
- struct TALER_Amount *amount)
-{
- struct GNUNET_SQ_ResultSpec res = {
- .conv = &extract_amount,
- .cls = (void *) currency,
- .dst = (void *) amount,
- .dst_size = sizeof (struct TALER_Amount),
- .num_params = 2
- };
-
- return res;
-}
-
-
-/**
- * Extract amount data from a SQLite database
- *
- * @param cls closure, a `const char *` giving the currency
- * @param result where to extract data from
- * @param column column to extract data from
- * @param[in,out] dst_size where to store size of result, may be NULL
- * @param[out] dst where to store the result
- * @return
- * #GNUNET_YES if all results could be extracted
- * #GNUNET_SYSERR if a result was invalid (non-existing field or NULL)
- */
-static enum GNUNET_GenericReturnValue
-extract_amount_nbo (void *cls,
- sqlite3_stmt *result,
- unsigned int column,
- size_t *dst_size,
- void *dst)
-{
- struct TALER_AmountNBO *amount = dst;
- struct TALER_Amount amount_hbo;
- size_t amount_hbo_size = sizeof (struct TALER_Amount);
-
- (void) cls;
- (void) dst_size;
- if (GNUNET_YES !=
- extract_amount (cls,
- result,
- column,
- &amount_hbo_size,
- &amount_hbo))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- TALER_amount_hton (amount,
- &amount_hbo);
- return GNUNET_YES;
-}
-
-
-struct GNUNET_SQ_ResultSpec
-TALER_SQ_result_spec_amount_nbo (const char *currency,
- struct TALER_AmountNBO *amount)
-{
- struct GNUNET_SQ_ResultSpec res = {
- .conv = &extract_amount_nbo,
- .cls = (void *) currency,
- .dst = (void *) amount,
- .dst_size = sizeof (struct TALER_AmountNBO),
- .num_params = 2
- };
-
- return res;
-}
-
-
-/**
- * Extract amount data from a SQLite database
- *
- * @param cls closure
- * @param result where to extract data from
- * @param column column to extract data from
- * @param[in,out] dst_size where to store size of result, may be NULL
- * @param[out] dst where to store the result
- * @return
- * #GNUNET_YES if all results could be extracted
- * #GNUNET_SYSERR if a result was invalid (non-existing field or NULL)
- */
-static enum GNUNET_GenericReturnValue
-extract_json (void *cls,
- sqlite3_stmt *result,
- unsigned int column,
- size_t *dst_size,
- void *dst)
-{
- json_t **j_dst = dst;
- const char *res;
- json_error_t json_error;
- size_t slen;
-
- (void) cls;
- (void) dst_size;
- if (SQLITE_TEXT != sqlite3_column_type (result,
- column))
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- res = (const char *) sqlite3_column_text (result,
- column);
- slen = strlen (res);
- *j_dst = json_loadb (res,
- slen,
- JSON_REJECT_DUPLICATES,
- &json_error);
- if (NULL == *j_dst)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Failed to parse JSON result for column %d: %s (%s)\n",
- column,
- json_error.text,
- json_error.source);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Function called to clean up memory allocated
- * by a #GNUNET_SQ_ResultConverter.
- *
- * @param cls closure
- */
-static void
-clean_json (void *cls)
-{
- json_t **dst = cls;
-
- (void) cls;
- if (NULL != *dst)
- {
- json_decref (*dst);
- *dst = NULL;
- }
-}
-
-
-/**
- * json_t expected.
- *
- * @param[out] jp where to store the result
- * @return array entry for the result specification to use
- */
-struct GNUNET_SQ_ResultSpec
-TALER_SQ_result_spec_json (json_t **jp)
-{
- struct GNUNET_SQ_ResultSpec res = {
- .conv = &extract_json,
- .cleaner = &clean_json,
- .dst = (void *) jp,
- .cls = (void *) jp,
- .num_params = 1
- };
-
- return res;
-}
-
-
-/* end of sq/sq_result_helper.c */
diff --git a/src/sq/test_sq.c b/src/sq/test_sq.c
deleted file mode 100644
index 8f464fa..0000000
--- a/src/sq/test_sq.c
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2020 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 <http://www.gnu.org/licenses/>
-*/
-/**
- * @file sq/test_sq.c
- * @brief Tests for SQLite3 convenience API
- * @author Jonathan Buchanan
- */
-#include "platform.h"
-#include "taler_sq_lib.h"
-
-
-/**
- * Run actual test queries.
- *
- * @return 0 on success
- */
-static int
-run_queries (sqlite3 *db)
-{
- struct TALER_Amount hamount;
- struct TALER_AmountNBO namount;
- json_t *json;
- sqlite3_stmt *test_insert;
- sqlite3_stmt *test_select;
- struct GNUNET_SQ_PrepareStatement ps[] = {
- GNUNET_SQ_make_prepare ("INSERT INTO test_sq ("
- " hamount_val"
- ",hamount_frac"
- ",namount_val"
- ",namount_frac"
- ",json"
- ") VALUES "
- "($1, $2, $3, $4, $5)",
- &test_insert),
- GNUNET_SQ_make_prepare ("SELECT"
- " hamount_val"
- ",hamount_frac"
- ",namount_val"
- ",namount_frac"
- ",json"
- " FROM test_sq",
- &test_select),
- GNUNET_SQ_PREPARE_END
- };
- int ret = 0;
-
- GNUNET_assert (GNUNET_OK ==
- TALER_string_to_amount ("EUR:1.23",
- &hamount));
- TALER_amount_hton (&namount,
- &hamount);
- json = json_object ();
- GNUNET_assert (NULL != json);
- GNUNET_assert (0 ==
- json_object_set_new (json,
- "foo",
- json_integer (42)));
- GNUNET_assert (NULL != json);
- GNUNET_assert (GNUNET_OK ==
- GNUNET_SQ_prepare (db,
- ps));
-
- {
- struct GNUNET_SQ_QueryParam params_insert[] = {
- TALER_SQ_query_param_amount (&hamount),
- TALER_SQ_query_param_amount_nbo (&namount),
- TALER_SQ_query_param_json (json),
- GNUNET_SQ_query_param_end
- };
- GNUNET_SQ_reset (db,
- test_insert);
- GNUNET_assert (GNUNET_OK == GNUNET_SQ_bind (test_insert,
- params_insert));
- GNUNET_assert (SQLITE_DONE == sqlite3_step (test_insert));
- sqlite3_finalize (test_insert);
- }
-
- {
- struct TALER_Amount result_amount;
- struct TALER_AmountNBO nresult_amount;
- struct TALER_Amount nresult_amount_converted;
- json_t *result_json;
- struct GNUNET_SQ_QueryParam params_select[] = {
- GNUNET_SQ_query_param_end
- };
- struct GNUNET_SQ_ResultSpec results_select[] = {
- TALER_SQ_result_spec_amount ("EUR",
- &result_amount),
- TALER_SQ_result_spec_amount_nbo ("EUR",
- &nresult_amount),
- TALER_SQ_result_spec_json (&result_json),
- GNUNET_SQ_result_spec_end
- };
-
- GNUNET_SQ_reset (db,
- test_select);
- GNUNET_assert (GNUNET_OK == GNUNET_SQ_bind (test_select,
- params_select));
- GNUNET_assert (SQLITE_ROW == sqlite3_step (test_select));
-
- GNUNET_assert (GNUNET_OK == GNUNET_SQ_extract_result (test_select,
- results_select));
- TALER_amount_ntoh (&nresult_amount_converted,
- &nresult_amount);
- if ((GNUNET_OK != TALER_amount_cmp_currency (&hamount,
- &result_amount)) ||
- (0 != TALER_amount_cmp (&hamount,
- &result_amount)) ||
- (GNUNET_OK != TALER_amount_cmp_currency (&hamount,
- &nresult_amount_converted)) ||
- (0 != TALER_amount_cmp (&hamount,
- &nresult_amount_converted)) ||
- (1 != json_equal (json,
- result_json)) )
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Result from database doesn't match input\n");
- ret = 1;
- }
- GNUNET_SQ_cleanup_result (results_select);
- sqlite3_finalize (test_select);
- }
- json_decref (json);
-
- return ret;
-}
-
-
-int
-main (int argc,
- const char *const argv[])
-{
- struct GNUNET_SQ_ExecuteStatement es[] = {
- GNUNET_SQ_make_execute ("CREATE TEMPORARY TABLE IF NOT EXISTS test_sq ("
- " hamount_val INT8 NOT NULL"
- ",hamount_frac INT8 NOT NULL"
- ",namount_val INT8 NOT NULL"
- ",namount_frac INT8 NOT NULL"
- ",json VARCHAR NOT NULL"
- ")"),
- GNUNET_SQ_EXECUTE_STATEMENT_END
- };
- sqlite3 *db;
- int ret;
-
- (void) argc;
- (void) argv;
- GNUNET_log_setup ("test-pq",
- "WARNING",
- NULL);
-
- if (SQLITE_OK != sqlite3_open ("talercheck.db",
- &db))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Failed to open SQLite3 database\n");
- return 77;
- }
-
- if (GNUNET_OK != GNUNET_SQ_exec_statements (db,
- es))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Failed to create new table\n");
- if ((SQLITE_OK != sqlite3_close (db)) ||
- (0 != unlink ("talercheck.db")))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Failed to close db or unlink\n");
- }
- return 1;
- }
-
- ret = run_queries (db);
-
- if (SQLITE_OK !=
- sqlite3_exec (db,
- "DROP TABLE test_sq",
- NULL, NULL, NULL))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Failed to drop table\n");
- ret = 1;
- }
-
- if (SQLITE_OK != sqlite3_close (db))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Failed to close database\n");
- ret = 1;
- }
- if (0 != unlink ("talercheck.db"))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Failed to unlink test database file\n");
- ret = 1;
- }
- return ret;
-}
-
-
-/* end of sq/test_sq.c */
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
- [taler-donau] branch master updated: clean up,
gnunet <=