donau

Donation authority for GNU Taler (experimental)
Log | Files | Refs | Submodules | README | LICENSE

commit e9b05aa69d6257fc694cf83502dfe001c5e3e676
parent 87f088e4d0e5e9800ab98ed5842fd0cb129d2f82
Author: Casaburi Johannes <johannes.casaburi@students.bfh.ch>
Date:   Mon, 18 Mar 2024 20:04:04 +0100

fix db helpers

Diffstat:
Msrc/donaudb/Makefile.am | 2+-
Msrc/donaudb/pg_insert_donation_unit.c | 3++-
Msrc/donaudb/pg_iterate_donation_units.c | 7++++---
Msrc/include/Makefile.am | 1+
Msrc/pq/Makefile.am | 33+++++++++++++++++----------------
Msrc/pq/pq_query_helper.c | 2+-
Msrc/pq/pq_result_helper.c | 135++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------
Msrc/pq/test_pq.c | 2+-
8 files changed, 112 insertions(+), 73 deletions(-)

diff --git a/src/donaudb/Makefile.am b/src/donaudb/Makefile.am @@ -95,8 +95,8 @@ libtaler_plugin_donaudb_postgres_la_SOURCES = \ libtaler_plugin_donaudb_postgres_la_LIBADD = \ $(LTLIBINTL) \ - $(top_builddir)/src/util/libdonauutil.la \ $(top_builddir)/src/pq/libdonaupq.la \ + $(top_builddir)/src/util/libdonauutil.la \ -ltalerpq \ -ltalerutil \ -lgnunetpq \ diff --git a/src/donaudb/pg_insert_donation_unit.c b/src/donaudb/pg_insert_donation_unit.c @@ -24,6 +24,7 @@ #include <taler/taler_pq_lib.h> #include "pg_insert_donation_unit.h" #include "pg_helper.h" +#include "donau_pq_lib.h" enum GNUNET_DB_QueryStatus @@ -37,7 +38,7 @@ DH_PG_insert_donation_unit ( struct PostgresClosure *pg = cls; struct GNUNET_PQ_QueryParam iparams[] = { GNUNET_PQ_query_param_auto_from_type (h_donation_unit_pub), - GNUNET_PQ_query_param_auto_from_type (donation_unit_pub), + DONAU_PQ_query_param_donation_unit_pub (donation_unit_pub), GNUNET_PQ_query_param_uint64 (&validity_year), TALER_PQ_query_param_amount (pg->conn, value), GNUNET_PQ_query_param_end diff --git a/src/donaudb/pg_iterate_donation_units.c b/src/donaudb/pg_iterate_donation_units.c @@ -1,6 +1,6 @@ /* This file is part of TALER - Copyright (C) 2023 Taler Systems SA + Copyright (C) 2024 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 @@ -24,6 +24,7 @@ #include <taler/taler_pq_lib.h> #include "pg_iterate_donation_units.h" #include "pg_helper.h" +#include "donau_pq_lib.h" /** * Closure for #get_donation_units_cb(). @@ -71,8 +72,8 @@ iterate_donation_units_cb (void *cls, struct GNUNET_PQ_ResultSpec rs[] = { GNUNET_PQ_result_spec_auto_from_type ("h_donation_unit_pub", &h_donation_unit_pub), - GNUNET_PQ_result_spec_auto_from_type ("donation_unit_pub", - &donation_unit_pub), + DONAU_PQ_result_spec_donation_unit_pub ("donation_unit_pub", + &donation_unit_pub), GNUNET_PQ_result_spec_uint64 ("validity_year", &validity_year), TALER_PQ_result_spec_amount ("value", diff --git a/src/include/Makefile.am b/src/include/Makefile.am @@ -7,5 +7,6 @@ talerinclude_HEADERS = \ donaudb_lib.h \ donaudb_plugin.h \ donau_testing_lib.h \ + donau_pq_lib.h \ donau_json_lib.h diff --git a/src/pq/Makefile.am b/src/pq/Makefile.am @@ -23,19 +23,20 @@ libdonaupq_la_LDFLAGS = \ -version-info 0:0:0 \ -no-undefined -#check_PROGRAMS= \ -# test_pq -# -#TESTS = \ -# $(check_PROGRAMS) -# -#test_pq_SOURCES = \ -# test_pq.c -#test_pq_LDADD = \ -# libdonaupq.la \ -# $(top_builddir)/src/util/libdonauutil.la \ -# -lgnunetpq \ -# -lgnunetutil \ -# -ljansson \ -# -lpq \ -# $(XLIB) +check_PROGRAMS= \ + test_pq + +TESTS = \ + $(check_PROGRAMS) + +test_pq_SOURCES = \ + test_pq.c +test_pq_LDADD = \ + libdonaupq.la \ + $(top_builddir)/src/util/libdonauutil.la \ + -lgnunetpq \ + -ltalerpq \ + -lgnunetutil \ + -ljansson \ + -lpq \ + $(XLIB) diff --git a/src/pq/pq_query_helper.c b/src/pq/pq_query_helper.c @@ -109,7 +109,7 @@ qconv_donation_unit_pub (void *cls, struct GNUNET_PQ_QueryParam -TALER_PQ_query_param_donation_unit_pub ( +DONAU_PQ_query_param_donation_unit_pub ( const struct DONAU_DonationUnitPublicKey *donation_unit_pub) { struct GNUNET_PQ_QueryParam res = { diff --git a/src/pq/pq_result_helper.c b/src/pq/pq_result_helper.c @@ -1,6 +1,6 @@ /* This file is part of TALER - Copyright (C) 2014-2022 Taler Systems SA + Copyright (C) 2024 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 @@ -16,40 +16,39 @@ /** * @file pq/pq_result_helper.c * @brief functions to initialize parameter arrays - * @author Christian Grothoff + * @author Johannes Casaburi */ #include <taler/platform.h> -//#include <gnunet/gnunet_util_lib.h> -//#include "pq_common.h" #include <taler/taler_pq_lib.h> +#include <donau_util.h> /** * Extract data from a Postgres database @a result at row @a row. * * @param cls closure * @param result where to extract data from - * @param row row to extract data from + * @param row the row to extract data from * @param fname name (or prefix) of the fields to extract 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_NO if at least one result was NULL - * #GNUNET_SYSERR if a result was invalid (non-existing field) + * #GNUNET_SYSERR if a result was invalid (non-existing field or NULL) */ static enum GNUNET_GenericReturnValue -extract_json (void *cls, - PGresult *result, - int row, - const char *fname, - size_t *dst_size, - void *dst) +extract_donation_unit_pub (void *cls, + PGresult *result, + int row, + const char *fname, + size_t *dst_size, + void *dst) { - json_t **j_dst = dst; + struct DONAU_DonationUnitPublicKey *pk = dst; + struct GNUNET_CRYPTO_BlindSignPublicKey *bpk; + size_t len; const char *res; int fnum; - json_error_t json_error; - size_t slen; + uint32_t be[1]; (void) cls; (void) dst_size; @@ -57,35 +56,73 @@ extract_json (void *cls, fname); if (fnum < 0) { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Field `%s' does not exist in result\n", - fname); + GNUNET_break (0); return GNUNET_SYSERR; } if (PQgetisnull (result, row, fnum)) return GNUNET_NO; - slen = PQgetlength (result, - row, - fnum); - res = (const char *) PQgetvalue (result, - row, - fnum); - *j_dst = json_loadb (res, - slen, - JSON_REJECT_DUPLICATES, - &json_error); - if (NULL == *j_dst) + + /* if a field is null, continue but + * remember that we now return a different result */ + len = PQgetlength (result, + row, + fnum); + res = PQgetvalue (result, + row, + fnum); + if (len < sizeof (be)) { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Failed to parse JSON result for field `%s': %s (%s)\n", - fname, - json_error.text, - json_error.source); + GNUNET_break (0); return GNUNET_SYSERR; } - return GNUNET_OK; + GNUNET_memcpy (be, + res, + sizeof (be)); + res += sizeof (be); + len -= sizeof (be); + bpk = GNUNET_new (struct GNUNET_CRYPTO_BlindSignPublicKey); + bpk->cipher = ntohl (be[0]); + bpk->rc = 1; + switch (bpk->cipher) + { + case GNUNET_CRYPTO_BSA_INVALID: + break; + case GNUNET_CRYPTO_BSA_RSA: + bpk->details.rsa_public_key + = GNUNET_CRYPTO_rsa_public_key_decode (res, + len); + if (NULL == bpk->details.rsa_public_key) + { + GNUNET_break (0); + GNUNET_free (bpk); + return GNUNET_SYSERR; + } + pk->bsign_pub_key = bpk; + GNUNET_CRYPTO_hash (res, + len, + &bpk->pub_key_hash); + return GNUNET_OK; + case GNUNET_CRYPTO_BSA_CS: + if (sizeof (bpk->details.cs_public_key) != len) + { + GNUNET_break (0); + GNUNET_free (bpk); + return GNUNET_SYSERR; + } + GNUNET_memcpy (&bpk->details.cs_public_key, + res, + len); + pk->bsign_pub_key = bpk; + GNUNET_CRYPTO_hash (res, + len, + &bpk->pub_key_hash); + return GNUNET_OK; + } + GNUNET_break (0); + GNUNET_free (bpk); + return GNUNET_SYSERR; } @@ -97,28 +134,26 @@ extract_json (void *cls, * @param rd result data to clean up */ static void -clean_json (void *cls, - void *rd) +clean_donation_unit_pub (void *cls, + void *rd) { - json_t **dst = rd; + struct DONAU_DonationUnitPublicKey *donation_unit_pub = rd; (void) cls; - if (NULL != *dst) - { - json_decref (*dst); - *dst = NULL; - } + DONAU_donation_unit_pub_free (donation_unit_pub); } + struct GNUNET_PQ_ResultSpec -TALER_PQ_result_spec_json (const char *name, - json_t **jp) +DONAU_PQ_result_spec_donation_unit_pub (const char *name, + struct DONAU_DonationUnitPublicKey * + donation_unit_pub) { struct GNUNET_PQ_ResultSpec res = { - .conv = &extract_json, - .cleaner = &clean_json, - .dst = (void *) jp, - .fname = name + .conv = &extract_donation_unit_pub, + .cleaner = &clean_donation_unit_pub, + .dst = (void *) donation_unit_pub, + .fname = name }; return res; diff --git a/src/pq/test_pq.c b/src/pq/test_pq.c @@ -1,6 +1,6 @@ /* This file is part of TALER - (C) 2015, 2016, 2023 Taler Systems SA + (C) 2024 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