donau

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

commit 656c959876b133f5e3309c10396a18cc7498c466
parent 65aa20e8cdaf97a797cc0aea198f447cb6506dc2
Author: Casaburi Johannes <johannes.casaburi@students.bfh.ch>
Date:   Sun, 14 Jan 2024 21:15:46 +0100

Added get history

Diffstat:
Msrc/donau/Makefile.am | 1+
Asrc/donau/donau-httpd_get-history-entry.c | 113+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/donau/donau-httpd_get-history.c | 120+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/donau/donau-httpd_history.h | 39+++++++++++++++++++++++++++++++++++++++
Msrc/donaudb/Makefile.am | 1+
Asrc/donaudb/pg_get_history.c | 132+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/donaudb/pg_get_history.h | 39+++++++++++++++++++++++++++++++++++++++
Msrc/donaudb/pg_helper.h | 60++++++++++++++++++++++++++++++------------------------------
Msrc/donaudb/plugin_donaudb_postgres.c | 39+++++++++++++++++++++------------------
Msrc/include/donaudb_plugin.h | 142+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
10 files changed, 636 insertions(+), 50 deletions(-)

diff --git a/src/donau/Makefile.am b/src/donau/Makefile.am @@ -44,6 +44,7 @@ donau_httpd_SOURCES = \ donau-httpd_config.c donau-httpd_config.h \ donau-httpd_get-charities.c donau_httpd_charity.h \ donau-httpd_get-charity.c donau-httpd_post-charity.c \ + donau-httpd_get-history.c donau-httpd_history.h \ donau-httpd_terms.c donau-httpd_terms.h # Testcases diff --git a/src/donau/donau-httpd_get-history-entry.c b/src/donau/donau-httpd_get-history-entry.c @@ -0,0 +1,113 @@ +/* + This file is part of TALER + Copyright (C) 2023 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 donau-httpd_history-get.c + * @brief Return summary information about AML decision + * @author Johannes Casaburi + */ +#include "taler/platform.h" +#include <gnunet/gnunet_util_lib.h> +#include <jansson.h> +#include <microhttpd.h> +#include <pthread.h> +#include "taler/taler_json_lib.h" +#include "taler/taler_mhd_lib.h" +#include "taler/taler_signatures.h" +#include "donaudb_plugin.h" +#include "donau-httpd_history.h" +// #include "donau-httpd.h" +// #include "donau-httpd_metrics.h" + + +/** + * Maximum number of records we return per request. + */ +#define MAX_RECORDS 1024 + +MHD_RESULT +DH_handler_history_get ( + struct DH_RequestContext *rc, + const char *const args[]) +{ + unsigned long long charity_id; + char dummy; + + if ( (NULL == args[0]) || + (1 != sscanf (args[0], + "%llu%c", + &charity_id, + &dummy)) ) + { + GNUNET_break_op (0); + return TALER_MHD_reply_with_error (rc->connection, + MHD_HTTP_BAD_REQUEST, + TALER_EC_GENERIC_PARAMETER_MALFORMED, + "charity_id"); + } + + if (NULL != args[1]) + { + GNUNET_break_op (0); + return TALER_MHD_reply_with_error (rc->connection, + MHD_HTTP_BAD_REQUEST, + TALER_EC_GENERIC_ENDPOINT_UNKNOWN, + args[1]); + } + + { + struct DONAUDB_CharityMetaData meta; + enum GNUNET_DB_QueryStatus qs; + MHD_RESULT result; + + qs = DH_plugin->lookup_history_entry (DH_plugin->cls, + charity_id, + &meta); + switch (qs) + { + case GNUNET_DB_STATUS_HARD_ERROR: + case GNUNET_DB_STATUS_SOFT_ERROR: + GNUNET_break (0); + return TALER_MHD_reply_with_error (rc->connection, + MHD_HTTP_INTERNAL_SERVER_ERROR, + TALER_EC_GENERIC_DB_FETCH_FAILED, + NULL); + case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS: + return TALER_MHD_reply_static ( + rc->connection, + MHD_HTTP_NO_CONTENT, + NULL, + NULL, + 0); + break; + case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT: + break; + } + + result = TALER_MHD_REPLY_JSON_PACK ( + rc->connection, + MHD_HTTP_OK, + TALER_JSON_pack_amount ("final_amount", + meta.final_amount), + GNUNET_JSON_pack_uint64 ("donation_year", + meta.donation_year)); + + GNUNET_free (meta.final_amount); + return result; + } +} + + +/* end of donau-httpd_aml-decision_get.c */ diff --git a/src/donau/donau-httpd_get-history.c b/src/donau/donau-httpd_get-history.c @@ -0,0 +1,120 @@ +/* + This file is part of TALER + Copyright (C) 2024 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 donau-httpd_get-history.c + * @brief Return history + * @author Johannes Casaburi + */ +#include "taler/platform.h" +#include <gnunet/gnunet_util_lib.h> +#include <jansson.h> +#include <microhttpd.h> +#include "taler/taler_json_lib.h" +#include "taler/taler_mhd_lib.h" +#include "taler/taler_signatures.h" +#include "donau-httpd.h" +#include "donaudb_plugin.h" +#include "donau-httpd_history.h" +// #include "taler-exchange-httpd_metrics.h" + + +/** + * Maximum number of history we return per request. + */ +#define MAX_RECORDS 1024 + +/** + * Return history information. + * + * @param cls closure + */ +static void +history_cb ( + void *cls, + uint64_t charity_id, + struct TALER_Amount final_amount, + uint64_t donation_year) +{ + json_t *history = cls; + + GNUNET_assert ( + 0 == + json_array_append ( + history, + GNUNET_JSON_PACK ( + GNUNET_JSON_pack_int64 ("charity_id", + charity_id), + TALER_JSON_pack_amount ("final_amount", + &final_amount), + GNUNET_JSON_pack_int64 ("donation_year", + donation_year)))); +} + + +MHD_RESULT +DH_handler_history_get ( + struct DH_RequestContext *rc, + const char *const args[]) +{ + + if (NULL != args[1]) + { + GNUNET_break_op (0); + return TALER_MHD_reply_with_error (rc->connection, + MHD_HTTP_BAD_REQUEST, + TALER_EC_GENERIC_ENDPOINT_UNKNOWN, + args[1]); + } + + { + json_t *history; + enum GNUNET_DB_QueryStatus qs; + + history = json_array (); + GNUNET_assert (NULL != history); + qs = DH_plugin->get_history (DH_plugin->cls, + &history_cb, + history); + switch (qs) + { + case GNUNET_DB_STATUS_HARD_ERROR: + case GNUNET_DB_STATUS_SOFT_ERROR: + json_decref (history); + GNUNET_break (0); + return TALER_MHD_reply_with_error (rc->connection, + MHD_HTTP_INTERNAL_SERVER_ERROR, + TALER_EC_GENERIC_DB_FETCH_FAILED, + NULL); + case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS: + return TALER_MHD_reply_static ( + rc->connection, + MHD_HTTP_NO_CONTENT, + NULL, + NULL, + 0); + case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT: + break; + } + return TALER_MHD_REPLY_JSON_PACK ( + rc->connection, + MHD_HTTP_OK, + GNUNET_JSON_pack_array_steal ("history", + history)); + } +} + + +/* end of donau-httpd_get-history.c */ diff --git a/src/donau/donau-httpd_history.h b/src/donau/donau-httpd_history.h @@ -0,0 +1,39 @@ +/* + This file is part of TALER + Copyright (C) 2024 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 donau-httpd_history.h + * @brief Handle /history requests + * @author Johannes Casaburi + */ +#ifndef DONAU_HTTPD_HISTORY_H +#define DONAU_HTTPD_HISTORY_H + +#include <microhttpd.h> +#include "donau-httpd.h" + +/** + * Handle a GET "/history" request. + * + * @param rc request context + * @param args GET arguments (should be one) + * @return MHD result code + */ +MHD_RESULT +DH_handler_history_get ( + struct DH_RequestContext *rc, + const char *const args[]); + +#endif diff --git a/src/donaudb/Makefile.am b/src/donaudb/Makefile.am @@ -83,6 +83,7 @@ libtaler_plugin_donaudb_postgres_la_SOURCES = \ pg_add_donation_unit_key.c pg_add_donation_unit_key.h \ pg_lookup_donation_unit.c pg_lookup_donation_unit.h \ pg_get_donation_units.c pg_get_donation_units.h \ + pg_get_history.h pg_get_history.c \ pg_get_charities.h pg_get_charities.c \ pg_insert_charity.h pg_insert_charity.c \ pg_lookup_charity.h pg_lookup_charity.c \ diff --git a/src/donaudb/pg_get_history.c b/src/donaudb/pg_get_history.c @@ -0,0 +1,132 @@ +/* + This file is part of TALER + 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 + 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 CHARITYABILITY 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 donaudb/pg_get_history.c + * @brief Implementation of the lookup_donation_unit_key function for Postgres + * @author Johannes Casaburi + */ +#include "taler/platform.h" +#include "taler/taler_error_codes.h" +#include "taler/taler_dbevents.h" +#include "taler/taler_pq_lib.h" +#include "pg_get_history.h" +#include "pg_helper.h" + + +/** + * Closure for #get_history_cb(). + */ +struct GetHistoryContext +{ + /** + * Function to call per result. + */ + DONAUDB_GetHistoryCallback cb; + + /** + * Closure for @e cb. + */ + void *cb_cls; + + /** + * Flag set to #GNUNET_OK as long as everything is fine. + */ + enum GNUNET_GenericReturnValue status; + +}; + + +/** + * Invoke the callback for each result. + * + * @param cls a `struct MissingWireContext *` + * @param result SQL result + * @param num_results number of rows in @a result + */ +static void +get_history_cb (void *cls, + PGresult *result, + unsigned int num_results) +{ + struct GetHistoryContext *ctx = cls; + + for (unsigned int i = 0; i < num_results; i++) + { + uint64_t charity_id; + struct TALER_Amount final_amount; + uint64_t donation_year; + + struct GNUNET_PQ_ResultSpec rs[] = { + GNUNET_PQ_result_spec_uint64 ("charity_id", + &charity_id), + TALER_PQ_result_spec_amount ("final_amount", + "EUR", // TODO: Error if using TALER_PQ_RESULT_SPEC_AMOUNT + &final_amount), + GNUNET_PQ_result_spec_uint64 ("donation_year", + &donation_year), + GNUNET_PQ_result_spec_end + }; + + if (GNUNET_OK != + GNUNET_PQ_extract_result (result, + rs, + i)) + { + GNUNET_break (0); + ctx->status = GNUNET_SYSERR; + return; + } + ctx->cb (ctx->cb_cls, + charity_id, + final_amount, + donation_year); + GNUNET_PQ_cleanup_result (rs); + } +} + + +enum GNUNET_DB_QueryStatus +DH_PG_get_history (void *cls, + DONAUDB_GetHistoryCallback cb, + void *cb_cls) +{ + struct PostgresClosure *pg = cls; + struct GetHistoryContext ctx = { + .cb = cb, + .cb_cls = cb_cls, + .status = GNUNET_OK + }; + struct GNUNET_PQ_QueryParam params[] = { + GNUNET_PQ_query_param_end + }; + enum GNUNET_DB_QueryStatus qs; + + PREPARE (pg, + "get_history", + "SELECT" + " charity_id" + ",final_amount" + ",donation_year" + " FROM history"); + qs = GNUNET_PQ_eval_prepared_multi_select (pg->conn, + "get_history", + params, + &get_history_cb, + &ctx); + if (GNUNET_OK != ctx.status) + return GNUNET_DB_STATUS_HARD_ERROR; + return qs; +} diff --git a/src/donaudb/pg_get_history.h b/src/donaudb/pg_get_history.h @@ -0,0 +1,39 @@ +/* + This file is part of TALER + 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 + 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 CHARITYABILITY 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 donaudb/pg_get_history.h + * @brief implementation of the get_history function for Postgres + * @author Johannes Casaburi + */ +#ifndef PG_GET_HISTORY_H +#define PG_GET_HISTORY_H + +#include "donaudb_plugin.h" + +/** + * Obtain information about the enabled wire accounts of the exchange. + * + * @param cls closure + * @param cb function to call on each account + * @param cb_cls closure for @a cb + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +DH_PG_get_history (void *cls, + DONAUDB_GetHistoryCallback cb, + void *cb_cls); + +#endif diff --git a/src/donaudb/pg_helper.h b/src/donaudb/pg_helper.h @@ -78,37 +78,37 @@ struct PostgresClosure * @param sql actual SQL text */ #define PREPARE(pg,name,sql) \ - do { \ - static struct { \ - unsigned long long cnt; \ - struct PostgresClosure *pg; \ - } preps[2]; /* 2 ctrs for taler-auditor-sync*/ \ - unsigned int off = 0; \ + do { \ + static struct { \ + unsigned long long cnt; \ + struct PostgresClosure *pg; \ + } preps[2]; /* 2 ctrs for taler-auditor-sync*/ \ + unsigned int off = 0; \ \ - while ( (NULL != preps[off].pg) && \ - (pg != preps[off].pg) && \ - (off < sizeof(preps) / sizeof(*preps)) ) \ - off++; \ - GNUNET_assert (off < \ - sizeof(preps) / sizeof(*preps)); \ - if (preps[off].cnt < pg->prep_gen) \ - { \ - struct GNUNET_PQ_PreparedStatement ps[] = { \ - GNUNET_PQ_make_prepare (name, sql), \ - GNUNET_PQ_PREPARED_STATEMENT_END \ - }; \ + while ( (NULL != preps[off].pg) && \ + (pg != preps[off].pg) && \ + (off < sizeof(preps) / sizeof(*preps)) ) \ + off++; \ + GNUNET_assert (off < \ + sizeof(preps) / sizeof(*preps)); \ + if (preps[off].cnt < pg->prep_gen) \ + { \ + struct GNUNET_PQ_PreparedStatement ps[] = { \ + GNUNET_PQ_make_prepare (name, sql), \ + GNUNET_PQ_PREPARED_STATEMENT_END \ + }; \ \ - if (GNUNET_OK != \ - GNUNET_PQ_prepare_statements (pg->conn, \ - ps)) \ - { \ - GNUNET_break (0); \ - return GNUNET_DB_STATUS_HARD_ERROR; \ - } \ - preps[off].pg = pg; \ - preps[off].cnt = pg->prep_gen; \ - } \ - } while (0) + if (GNUNET_OK != \ + GNUNET_PQ_prepare_statements (pg->conn, \ + ps)) \ + { \ + GNUNET_break (0); \ + return GNUNET_DB_STATUS_HARD_ERROR; \ + } \ + preps[off].pg = pg; \ + preps[off].cnt = pg->prep_gen; \ + } \ + } while (0) /** @@ -120,7 +120,7 @@ struct PostgresClosure */ #define TALER_PQ_RESULT_SPEC_AMOUNT(field, \ amountp) TALER_PQ_result_spec_amount ( \ - field,pg->currency,amountp) + field,pg->currency,amountp) #endif diff --git a/src/donaudb/plugin_donaudb_postgres.c b/src/donaudb/plugin_donaudb_postgres.c @@ -52,6 +52,7 @@ #include "pg_add_donation_unit_key.h" #include "pg_lookup_donation_unit.h" #include "pg_insert_history_entry.h" +#include "pg_get_history.h" #include "pg_insert_issued_receipt.h" #include "pg_insert_submitted_receipt.h" #include "pg_insert_signing_key.h" @@ -274,27 +275,29 @@ libtaler_plugin_donaudb_postgres_init (void *cls) = &DH_PG_event_listen_cancel; plugin->event_notify = &DH_PG_event_notify; - // plugin->get_policy_details - // = &DH_PG_get_policy_details; - // plugin->persist_policy_details - // = &DH_PG_persist_policy_details; + //plugin->get_policy_details + // = &DH_PG_get_policy_details; + //plugin->persist_policy_details + // = &DH_PG_persist_policy_details; // plugin->gc // = &DH_PG_gc; - // plugin->add_donation_unit_key - // = &DH_PG_add_donation_unit_key; - // plugin->lookup_donation_unit - // = &DH_PG_lookup_donation_unit; - // plugin->insert_history_entry - // = &DH_PG_insert_history_entry; - // plugin->insert_issued_receipt - // = &DH_PG_insert_issued_receipt; - // plugin->insert_submitted_receipt - // = &DH_PG_insert_submitted_receipt; - // plugin->insert_signing_key - // = &DH_PG_insert_signing_key; - // plugin->lookup_signing_key - // = &DH_PG_lookup_signing_key; + plugin->add_donation_unit_key + = &DH_PG_add_donation_unit_key; + plugin->lookup_donation_unit + = &DH_PG_lookup_donation_unit; + plugin->insert_history_entry + = &DH_PG_insert_history_entry; + plugin->get_history + = &DH_PG_get_history; + plugin->insert_issued_receipt + = &DH_PG_insert_issued_receipt; + plugin->insert_submitted_receipt + = &DH_PG_insert_submitted_receipt; + plugin->insert_signing_key + = &DH_PG_insert_signing_key; + plugin->lookup_signing_key + = &DH_PG_lookup_signing_key; plugin->lookup_charity = &DH_PG_lookup_charity; plugin->insert_charity diff --git a/src/include/donaudb_plugin.h b/src/include/donaudb_plugin.h @@ -190,6 +190,20 @@ typedef void uint64_t current_year); /** + * Return history. + * + * @param cls closure + * @param charity_url + * @param charity_name + */ +typedef void +(*DONAUDB_GetHistoryCallback)( + void *cls, + uint64_t charity_id, + struct TALER_Amount final_amount, + uint64_t donation_year); + +/** * @brief The plugin API, returned from the plugin's "init" function. * The argument given to "init" is simply a configuration handle. */ @@ -373,7 +387,7 @@ struct DONAUDB_Plugin uint64_t charity_id, struct DONAUDB_CharityMetaData *meta); -/** + /** * Get charities. * * @param cls closure @@ -418,7 +432,131 @@ struct DONAUDB_Plugin void *cls, DONAUDB_GetDonationUnitsCallback cb, void *cb_cls); -}; + /** + * Get history. + * + * @param cls closure + * @param cb callback to invoke on each match + * @param cb_cls closure for @a cb + * @return database transaction status + */ + enum GNUNET_DB_QueryStatus + (*get_history)( + void *cls, + DONAUDB_GetHistoryCallback cb, + void *cb_cls); + + /** + * Get donation_unit_key. + * + * @param cls closure + * @param donation_unit_pub + * @param meta + * @return database transaction status + */ + enum GNUNET_DB_QueryStatus + (*add_donation_unit_key)( + void *cls, + const struct DONAU_DonationUnitPublicKey *donation_unit_pub, + struct DONAUDB_DonationUnitKeyMetaData *meta); + + /** + * Lookup information about current donation unit key. + * + * @param cls closure + * @param h_donation_unit_pub hash of the donation_unit public key + * @param[out] meta set to various meta data about the key + * @return transaction status code + */ + enum GNUNET_DB_QueryStatus + (*lookup_donation_unit)( + void *cls, + const struct DONAU_DonationUnitHashP *h_donation_unit_pub, + struct DONAUDB_DonationUnitKeyMetaData *meta); + + /** + * Insert history entry of a charity + * + * @param cls closure + * @param charity_id charity id + * @param final_amount final donation amount at the end of the donation year + * @param donation_year year of the donations + * @return transaction status code + */ + enum GNUNET_DB_QueryStatus + (*insert_history_entry) ( + void *cls, + const uint64_t charity_id, + const struct TALER_Amount *final_amount, + const uint64_t donation_year); + + /** + * Insert issued blinded donation receipt to the charity. + * + * @param cls closure + * @param charity_sig signature from the charity + * @param charity_id identifier of the charity + * @param h_receipt hash of the donation receipt + * @param amount donation amount + * @return transaction status code + */ + enum GNUNET_DB_QueryStatus + (*insert_issued_receipt) ( + void *cls, + const struct DONAU_CharitySignatureP *charity_sig, + const uint64_t charity_id, + const struct DONAU_DonationReceiptHashP *h_receipt, + const struct TALER_Amount *amount); + + /** + * Insert submitted donation receipt from the donor. + * + * @param cls closure + * @param h_tax_number salted hash of the donors tax number + * @param nonce nonce that is part of the unique donation identifier + * @param donation_unit_pub donation unit public key + * @param donau_sig donau signature in case the sign keys changed + * @param donation_year year of the donation + * @return transaction status code + */ + enum GNUNET_DB_QueryStatus + (*insert_submitted_receipt) ( + void *cls, + const struct DONAU_HashDonorTaxId *h_tax_number, + const union GNUNET_CRYPTO_BlindSessionNonce *nonce, + const struct DONAU_DonationUnitPublicKey *donation_unit_pub, + const struct TALER_DonauSignatureP *donau_sig, + const uint64_t donation_year); + + /** + * Add signing key. + * + * @param cls closure + * @param donau_pub the donau online signing public key + * @param meta meta data about @a donau_pub + * @return transaction status code + */ + enum GNUNET_DB_QueryStatus + (*insert_signing_key) ( + void *cls, + const struct DONAU_DonauPublicKeyP *donau_pub, + struct DONAUDB_SignkeyMetaData *meta); + + /** + * Lookup signing key meta data. + * + * @param cls closure + * @param donau_pub the donau signing public key + * @param[out] meta meta data about @a donau_pub + * @return transaction status code + */ + enum GNUNET_DB_QueryStatus + (*lookup_signing_key) ( + void *cls, + const struct DONAU_DonauPublicKeyP *donau_pub, + struct DONAUDB_SignkeyMetaData *meta); + +}; #endif