donau

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

commit b2db2cbcdcdccaa22ac88659a32c9981ec68906c
parent 8e469ba6516ce1e102c96d3b07484e171e17018b
Author: Matyja Lukas Adam <lukas.matyja@students.bfh.ch>
Date:   Thu, 21 Mar 2024 00:53:36 +0100

[donau] work on issue receipts

Diffstat:
Msrc/donau/donau-httpd_post-batch-issue.c | 64+++++++++++++++++++++++++++++++++++++++++++++-------------------
Msrc/donaudb/0002-donau_receipts_issued.sql | 4++--
Msrc/donaudb/pg_lookup_issued_receipts.c | 6+++---
Msrc/include/donaudb_plugin.h | 7++++++-
Msrc/testing/test_donau_api.c | 6+++---
Msrc/testing/testing_api_cmd_get_donau.c | 10+++++-----
6 files changed, 64 insertions(+), 33 deletions(-)

diff --git a/src/donau/donau-httpd_post-batch-issue.c b/src/donau/donau-httpd_post-batch-issue.c @@ -75,6 +75,32 @@ parse_json_bkp (struct DONAU_BlindedUniqueDonationIdentifierKeyPair *bkp, return GNUNET_OK; } +/** + * Parse signatures to JSON. + * + * @param[out] sign_arr_obj JSON object + * @param signatures + * @param num_sig number of signatures + * @return #GNUNET_OK if all is fine, #GNUNET_SYSERR if we could not parse + * is malformed. + */ +void +signatures_to_JSON(const unsigned int num_sig, + struct DONAU_BlindedDonationUnitSignature* signatures[num_sig], + json_t *j_signatures) +{ + int i = 0; + while (i < num_sig) + { + GNUNET_assert ( + 0 == json_array_append ( + j_signatures, + GNUNET_JSON_PACK ( + GNUNET_JSON_pack_data_auto ("du_sig", + signatures[i])))); + i++; + } +} MHD_RESULT DH_handler_issue_receipts_post (struct DH_RequestContext *rc, @@ -218,6 +244,8 @@ DH_handler_issue_receipts_post (struct DH_RequestContext *rc, enum GNUNET_DB_QueryStatus qs_check_receipts; struct DONAUDB_IssuedReceiptsMetaData check_receipts_meta; struct DONAU_BudiKeyPairsHashP bkp_hash; + json_t *blind_signatures = json_array (); + GNUNET_CRYPTO_hash (irc.bkp, sizeof (irc.bkp[0]) * num_bkp, &bkp_hash.hash); @@ -241,41 +269,39 @@ DH_handler_issue_receipts_post (struct DH_RequestContext *rc, case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT: GNUNET_log (GNUNET_ERROR_TYPE_INFO, "request have been made already!"); - // A request was already made. We do not change the annual limit + signatures_to_JSON(num_bkp, check_receipts_meta.blinded_sig, blind_signatures); +// return TALER_MHD_REPLY_JSON_PACK ( +// rc->connection, +// MHD_HTTP_OK, +// GNUNET_JSON_pack_array_steal ("blind_signatures", +// blind_signatures)); break; } /* check annual limit and change it -> Rollback if we could not save the request*/ /* save Request (charity signature, charity id, amount, hash over bkps) and make it idempotent*/ /* sign budis and send the signatures back */ int i = 0; - json_t *blind_signatures; - blind_signatures = json_array (); - while (i < num_bkp) + struct DONAU_BlindedDonationUnitSignature **du_sig; + while(i < num_bkp) { - struct DONAU_BlindedDonationUnitSignature du_sig; // TODO: get donation unit private key const struct DONAU_DonationUnitPrivateKey du_priv; const struct DONAU_BlindedUniqueDonationIdentifier budi = irc.bkp[i]. - blinded_udi; - if (GNUNET_SYSERR == TALER_donation_unit_sign_blinded (&du_sig, &du_priv, & - budi)) - { + blinded_udi; + if (GNUNET_SYSERR == TALER_donation_unit_sign_blinded (du_sig[i], &du_priv, & + budi)) { GNUNET_break (0); return TALER_MHD_reply_with_error (rc->connection, - MHD_HTTP_INTERNAL_SERVER_ERROR, - TALER_EC_GENERIC_DB_FETCH_FAILED, - NULL); + MHD_HTTP_INTERNAL_SERVER_ERROR, + TALER_EC_GENERIC_DB_FETCH_FAILED, + NULL); + } - GNUNET_assert ( - 0 == json_array_append ( - blind_signatures, - GNUNET_JSON_PACK ( - GNUNET_JSON_pack_data_auto ("du_sig", - &du_sig)))); + i++; } - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "made blind signatures!"); + signatures_to_JSON(num_bkp, du_sig, blind_signatures); return TALER_MHD_REPLY_JSON_PACK ( rc->connection, MHD_HTTP_OK, diff --git a/src/donaudb/0002-donau_receipts_issued.sql b/src/donaudb/0002-donau_receipts_issued.sql @@ -16,9 +16,9 @@ CREATE TABLE receipts_issued (receipt_id BIGINT GENERATED BY DEFAULT AS IDENTITY UNIQUE - ,charity_sig BYTEA CHECK (LENGTH(charity_sig)=64) + ,blinded_sig BYTEA[] NOT NULL ,charity_id BIGINT NOT NULL REFERENCES charities (charity_id) ON DELETE CASCADE - ,receipt_hash BYTEA NOT NULL CHECK (LENGTH(receipt_hash)=64) + ,receipt_hash BYTEA PRIMARY KEY CHECK (LENGTH(receipt_hash)=64) ,amount taler_amount NOT NULL ); COMMENT ON TABLE receipts_issued diff --git a/src/donaudb/pg_lookup_issued_receipts.c b/src/donaudb/pg_lookup_issued_receipts.c @@ -37,8 +37,8 @@ DH_PG_lookup_issued_receipts ( GNUNET_PQ_query_param_end }; struct GNUNET_PQ_ResultSpec rs[] = { - GNUNET_PQ_result_spec_auto_from_type ("charity_sig", - &meta->charity_sig), +// GNUNET_PQ_result_spec_auto_from_type ("blinded_sig", +// &meta->blinded_sig), TALER_PQ_RESULT_SPEC_AMOUNT ("amount", &meta->amount), GNUNET_PQ_result_spec_uint64 ("charity_id", @@ -49,7 +49,7 @@ DH_PG_lookup_issued_receipts ( PREPARE (pg, "lookup_issued_receipts", "SELECT " - " charity_sig" + /*" charity_sig"*/ " ,amount" " ,charity_id" " FROM receipts_issued" diff --git a/src/include/donaudb_plugin.h b/src/include/donaudb_plugin.h @@ -104,10 +104,15 @@ struct DONAUDB_IssuedReceiptsMetaData */ struct TALER_Amount amount; + /** + * number of signatures + */ + unsigned int num_sig; + /** * Charity signature */ - struct DONAU_CharitySignatureP charity_sig; + struct DONAU_BlindedDonationUnitSignature **blinded_sig; }; diff --git a/src/testing/test_donau_api.c b/src/testing/test_donau_api.c @@ -73,9 +73,9 @@ run (void *cls, config_file, "-D", "NULL"), - TALER_TESTING_cmd_get_donau ("get-donau", - cred.cfg, - true), +// TALER_TESTING_cmd_get_donau ("get-donau", +// cred.cfg, +// true), TALER_TESTING_cmd_charity_post ("post-charity", "example", "example.com", diff --git a/src/testing/testing_api_cmd_get_donau.c b/src/testing/testing_api_cmd_get_donau.c @@ -132,11 +132,11 @@ get_donau_run (void *cls, } ges->is = is; - ges->donau - = DONAU_get_keys (TALER_TESTING_interpreter_get_context (is), - ges->donau_url, - &cert_cb, - ges); +// ges->donau +// = DONAU_get_keys (TALER_TESTING_interpreter_get_context (is), +// ges->donau_url, +// &cert_cb, +// ges); if (NULL == ges->donau) { GNUNET_break (0);