[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-donau] branch master updated: cleanup
From: |
gnunet |
Subject: |
[taler-donau] branch master updated: cleanup |
Date: |
Tue, 02 Jan 2024 16:22:49 +0100 |
This is an automated email from the git hooks/post-receive script.
johannes-casaburi pushed a commit to branch master
in repository donau.
The following commit(s) were added to refs/heads/master by this push:
new b5b231d cleanup
b5b231d is described below
commit b5b231dca72b8d6768025b05dae1a455f6f559f0
Author: Casaburi Johannes <johannes.casaburi@students.bfh.ch>
AuthorDate: Tue Jan 2 16:22:23 2024 +0100
cleanup
---
src/donau/donau-httpd.c | 30 -
src/donau/donau-httpd.h | 23 -
src/donau/donau-httpd_batch-submit_receipts.c | 716 -------------
src/donau/donau-httpd_batch-submit_receipts.h | 49 -
src/donau/donau-httpd_charities_get.c | 274 -----
src/donau/donau-httpd_charities_get.h | 53 -
src/donau/donau-httpd_charities_history.c | 295 ------
src/donau/donau-httpd_charities_history.h | 42 -
src/donau/donau-httpd_charities_open.c | 468 ---------
src/donau/donau-httpd_charities_open.h | 41 -
src/donau/donau-httpd_charities_status.c | 243 -----
src/donau/donau-httpd_charities_status.h | 43 -
src/donau/donau-httpd_csr.c | 14 +-
src/donau/donau-httpd_csr.h | 4 +-
src/donau/donau-httpd_db.c | 3 -
src/donau/donau-httpd_keys.c | 1382 -------------------------
src/donau/donau-httpd_keys.h | 194 ----
src/lib/Makefile.am | 37 +-
src/lib/donau_api_charities_close.c | 84 --
src/lib/donau_api_charities_get.c | 266 -----
src/lib/donau_api_charities_history.c | 363 -------
src/lib/donau_api_charities_open.c | 61 --
src/lib/donau_api_charities_status.c | 336 ------
src/lib/donau_api_csr_issue_receipts.c | 279 -----
src/lib/donau_api_issue_receipts.c | 265 -----
src/lib/donau_api_issue_receipts2.c | 498 ---------
26 files changed, 26 insertions(+), 6037 deletions(-)
diff --git a/src/donau/donau-httpd.c b/src/donau/donau-httpd.c
index e1c3493..58bf0d5 100644
--- a/src/donau/donau-httpd.c
+++ b/src/donau/donau-httpd.c
@@ -79,22 +79,12 @@ static struct MHD_Daemon *mhd;
*/
struct GNUNET_TIME_Relative DH_max_keys_caching;
-/**
- * How long is the delay before we close reserves?
- */
-struct GNUNET_TIME_Relative DH_reserve_closing_delay;
-
/**
* Master public key (according to the
* configuration in the donau directory). (global)
*/
struct TALER_MasterPublicKeyP DH_master_public_key;
-/**
- * Key used to encrypt KYC attribute data in our database.
- */
-// struct TALER_AttributeEncryptionKeyP DH_attribute_key;
-
/**
* Our DB plugin. (global)
*/
@@ -126,16 +116,6 @@ unsigned int DH_currency_fraction_digits;
*/
char *DH_currency;
-/**
- * Name of the KYC-AML-trigger evaluation binary.
- */
-char *DH_kyc_aml_trigger;
-
-/**
- * Option set to #GNUNET_YES if rewards are enabled.
- */
-// int DH_enable_rewards;
-
/**
* What is the largest amount we allow a peer to
* merge into a reserve before always triggering
@@ -158,11 +138,6 @@ static unsigned int connection_timeout = 30;
*/
static int connection_close;
-/**
- * -I command-line flag given?
- */
-int DH_check_invariants_flag;
-
/**
* True if we should commit suicide once all active
* connections are finished.
@@ -248,11 +223,8 @@ handle_mhd_completion_callback (void *cls,
return;
GNUNET_async_scope_enter (&rc->async_scope_id,
&old_scope);
- // check_suicide ();
- // DH_check_invariants ();
if (NULL != rc->rh_cleaner)
rc->rh_cleaner (rc);
- // DH_check_invariants ();
{
#if MHD_VERSION >= 0x00097304
const union MHD_ConnectionInfo *ci;
@@ -475,7 +447,6 @@ handle_mhd_request (void *cls,
rc = *con_cls = GNUNET_new (struct DH_RequestContext);
rc->start_time = GNUNET_TIME_absolute_get ();
GNUNET_async_scope_fresh (&rc->async_scope_id);
- // DH_check_invariants ();
rc->url = url;
rc->connection = connection;
/* We only read the correlation ID on the first callback for every client
*/
@@ -502,7 +473,6 @@ handle_mhd_request (void *cls,
GNUNET_async_scope_enter (&rc->async_scope_id,
&old_scope);
- // DH_check_invariants ();
if (NULL != correlation_id)
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"Handling request (%s) for URL '%s', correlation_id=%s\n",
diff --git a/src/donau/donau-httpd.h b/src/donau/donau-httpd.h
index e6b1bd1..8e16059 100644
--- a/src/donau/donau-httpd.h
+++ b/src/donau/donau-httpd.h
@@ -44,24 +44,6 @@ extern const struct GNUNET_CONFIGURATION_Handle *DH_cfg;
*/
extern char *DH_donau_directory;
-/**
- * -I command-line flag given?
- */
-extern int DH_check_invariants_flag;
-
-/**
- * Are clients allowed to request /keys for times other than the
- * current time? Allowing this could be abused in a DoS-attack
- * as building new /keys responses is expensive. Should only be
- * enabled for testcases, development and test systems.
- */
-// extern int DH_allow_keys_timetravel;
-
-/**
- * Main directory with data.
- */
-// extern char *DH_revocation_directory;
-
/**
* True if we should commit suicide once all active
* connections are finished. Also forces /keys requests
@@ -69,11 +51,6 @@ extern int DH_check_invariants_flag;
*/
extern bool DH_suicide;
-/**
- * Key used to encrypt KYC attribute data in our database.
- */
-extern struct TALER_AttributeEncryptionKeyP DH_attribute_key;
-
/**
* Our DB plugin.
*/
diff --git a/src/donau/donau-httpd_batch-submit_receipts.c
b/src/donau/donau-httpd_batch-submit_receipts.c
deleted file mode 100644
index 1707d08..0000000
--- a/src/donau/donau-httpd_batch-submit_receipts.c
+++ /dev/null
@@ -1,716 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2014-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 CHARITYABILITY 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_batch-submit_receipts.c
- * @brief Handle /batch-deposit requests; parses the POST and JSON and
- * verifies the coin signatures before handing things off
- * to the database.
- * @author Florian Dold
- * @author Benedikt Mueller
- * @author Christian Grothoff
- */
-#include "taler/platform.h"
-#include <gnunet/gnunet_util_lib.h>
-#include <gnunet/gnunet_json_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-donau-httpd_batch-deposit.h"
-#include "taler-donau-httpd_responses.h"
-#include "taler_donaudb_lib.h"
-#include "taler-donau-httpd_keys.h"
-
-
-/**
- * Closure for #batch_deposit_transaction.
- */
-struct BatchDepositContext
-{
-
- /**
- * Array with the individual coin deposit fees.
- */
- struct TALER_Amount *deposit_fees;
-
- /**
- * Our timestamp (when we received the request).
- * Possibly updated by the transaction if the
- * request is idempotent (was repeated).
- */
- struct GNUNET_TIME_Timestamp donau_timestamp;
-
- /**
- * Details about the batch deposit operation.
- */
- struct DONAUDB_BatchDeposit bd;
-
- /**
- * Additional details for policy extension relevant for this
- * deposit operation, possibly NULL!
- */
- json_t *policy_json;
-
- /**
- * Hash over the charity's payto://-URI with the wire salt.
- */
- struct TALER_CharityWireHashP h_wire;
-
- /**
- * If @e policy_json was present, the corresponding policy extension
- * calculates these details. These will be persisted in the policy_details
- * table.
- */
- struct TALER_PolicyDetails policy_details;
-
- /**
- * Hash over @e policy_details, might be all zero
- */
- struct TALER_ExtensionPolicyHashP h_policy;
-
- /**
- * When @e policy_details are persisted, this contains the id of the record
- * in the policy_details table.
- */
- uint64_t policy_details_serial_id;
-
-};
-
-
-/**
- * Send confirmation of batch deposit success to client. This function will
- * create a signed message affirming the given information and return it to
- * the client. By this, the donau affirms that the coins had sufficient
- * (residual) value for the specified transaction and that it will execute the
- * requested batch deposit operation with the given wiring details.
- *
- * @param connection connection to the client
- * @param dc information about the batch deposit
- * @return MHD result code
- */
-static MHD_RESULT
-reply_batch_deposit_success (
- struct MHD_Connection *connection,
- const struct BatchDepositContext *dc)
-{
- const struct DONAUDB_BatchDeposit *bd = &dc->bd;
- json_t *arr;
- struct DONAU_DonauPublicKeyP pub;
-
-again:
- arr = json_array ();
- GNUNET_assert (NULL != arr);
- for (unsigned int i = 0; i<bd->num_cdis; i++)
- {
- const struct DONAUDB_CoinDepositInformation *cdi
- = &bd->cdis[i];
- struct DONAU_DonauPublicKeyP pubi;
- struct TALER_DonauSignatureP sig;
- enum TALER_ErrorCode ec;
- struct TALER_Amount amount_without_fee;
-
- GNUNET_assert (0 <=
- TALER_amount_subtract (&amount_without_fee,
- &cdi->amount_with_fee,
- &dc->deposit_fees[i]));
- if (TALER_EC_NONE !=
- (ec = TALER_donau_online_deposit_confirmation_sign (
- &DH_keys_donau_sign_,
- &bd->h_contract_terms,
- &dc->h_wire,
- NULL != dc->policy_json ? &dc->h_policy : NULL,
- dc->donau_timestamp,
- bd->wire_deadline,
- bd->refund_deadline,
- &amount_without_fee,
- &cdi->coin.coin_pub,
- &dc->bd.charity_pub,
- &pubi,
- &sig)))
- {
- GNUNET_break (0);
- return TALER_MHD_reply_with_ec (connection,
- ec,
- NULL);
- }
- if (0 == i)
- pub = pubi;
- if (0 !=
- GNUNET_memcmp (&pub,
- &pubi))
- {
- /* note: in the future, maybe have batch sign API to avoid having to
- handle key rollover... */
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Donau public key changed during batch deposit, trying
again\n");
- json_decref (arr);
- goto again;
- }
- GNUNET_assert (
- 0 ==
- json_array_append_new (arr,
- GNUNET_JSON_PACK (
- GNUNET_JSON_pack_data_auto (
- "donau_sig",
- &sig))));
- }
- return TALER_MHD_REPLY_JSON_PACK (
- connection,
- MHD_HTTP_OK,
- GNUNET_JSON_pack_timestamp ("donau_timestamp",
- dc->donau_timestamp),
- GNUNET_JSON_pack_data_auto ("donau_pub",
- &pub),
- GNUNET_JSON_pack_array_steal ("donau_sigs",
- arr));
-}
-
-
-/**
- * Execute database transaction for /batch-deposit. Runs the transaction
- * logic; IF it returns a non-error code, the transaction logic MUST
- * NOT queue a MHD response. IF it returns an hard error, the
- * transaction logic MUST queue a MHD response and set @a mhd_ret. IF
- * it returns the soft error code, the function MAY be called again to
- * retry and MUST not queue a MHD response.
- *
- * @param cls a `struct BatchDepositContext`
- * @param connection MHD request context
- * @param[out] mhd_ret set to MHD status on error
- * @return transaction status
- */
-static enum GNUNET_DB_QueryStatus
-batch_deposit_transaction (void *cls,
- struct MHD_Connection *connection,
- MHD_RESULT *mhd_ret)
-{
- struct BatchDepositContext *dc = cls;
- const struct DONAUDB_BatchDeposit *bd = &dc->bd;
- enum GNUNET_DB_QueryStatus qs = GNUNET_SYSERR;
- uint32_t bad_balance_coin_index = UINT32_MAX;
- bool balance_ok;
- bool in_conflict;
-
- /* If the deposit has a policy associated to it, persist it. This will
- * insert or update the record. */
- if (NULL != dc->policy_json)
- {
- qs = DH_plugin->persist_policy_details (
- DH_plugin->cls,
- &dc->policy_details,
- &dc->bd.policy_details_serial_id,
- &dc->policy_details.accumulated_total,
- &dc->policy_details.fulfillment_state);
- if (qs < 0)
- return qs;
- /* FIXME-Oec: dc->bd.policy_blocked not initialized,
- likely should be set based on fulfillment_state!?*/
- }
-
- /* FIXME: replace by batch insert! */
- for (unsigned int i = 0; i<bd->num_cdis; i++)
- {
- const struct DONAUDB_CoinDepositInformation *cdi
- = &bd->cdis[i];
- uint64_t known_coin_id;
-
- qs = DH_make_coin_known (&cdi->coin,
- connection,
- &known_coin_id,
- mhd_ret);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "make coin known (%s) returned %d\n",
- TALER_B2S (&cdi->coin.coin_pub),
- qs);
- if (qs < 0)
- return qs;
- }
-
- qs = DH_plugin->do_deposit (
- DH_plugin->cls,
- bd,
- &dc->donau_timestamp,
- &balance_ok,
- &bad_balance_coin_index,
- &in_conflict);
- if (qs < 0)
- {
- if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
- return qs;
- TALER_LOG_WARNING (
- "Failed to store /batch-deposit information in database\n");
- *mhd_ret = TALER_MHD_reply_with_error (connection,
- MHD_HTTP_INTERNAL_SERVER_ERROR,
- TALER_EC_GENERIC_DB_STORE_FAILED,
- "batch-deposit");
- return qs;
- }
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "do_deposit returned: %d / %s[%u] / %s\n",
- qs,
- balance_ok ? "balance ok" : "balance insufficient",
- (unsigned int) bad_balance_coin_index,
- in_conflict ? "in conflict" : "no conflict");
- if (in_conflict)
- {
- /* FIXME: #7267 conflicting contract != insufficient funds */
- *mhd_ret
- = DH_RESPONSE_reply_coin_insufficient_funds (
- connection,
- TALER_EC_DONAU_DEPOSIT_CONFLICTING_CONTRACT,
- &bd->cdis[0 /* SEE FIXME above! */].coin.denom_pub_hash,
- &bd->cdis[0 /* SEE FIXME above! */].coin.coin_pub);
- return GNUNET_DB_STATUS_HARD_ERROR;
- }
- if (! balance_ok)
- {
- GNUNET_assert (bad_balance_coin_index < bd->num_cdis);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "returning history of conflicting coin (%s)\n",
- TALER_B2S (&bd->cdis[bad_balance_coin_index].coin.coin_pub));
- *mhd_ret
- = DH_RESPONSE_reply_coin_insufficient_funds (
- connection,
- TALER_EC_DONAU_GENERIC_INSUFFICIENT_FUNDS,
- &bd->cdis[bad_balance_coin_index].coin.denom_pub_hash,
- &bd->cdis[bad_balance_coin_index].coin.coin_pub);
- return GNUNET_DB_STATUS_HARD_ERROR;
- }
- DH_METRICS_num_success[DH_MT_SUCCESS_DEPOSIT]++;
- return qs;
-}
-
-
-/**
- * Parse per-coin deposit information from @a jcoin
- * into @a deposit. Fill in generic information from
- * @a ctx.
- *
- * @param connection connection we are handling
- * @param dc information about the overall batch
- * @param jcoin coin data to parse
- * @param[out] cdi where to store the result
- * @param[out] deposit_fee where to write the deposit fee
- * @return #GNUNET_OK on success, #GNUNET_NO if an error was returned,
- * #GNUNET_SYSERR on failure and no error could be returned
- */
-static enum GNUNET_GenericReturnValue
-parse_coin (struct MHD_Connection *connection,
- const struct BatchDepositContext *dc,
- json_t *jcoin,
- struct DONAUDB_CoinDepositInformation *cdi,
- struct TALER_Amount *deposit_fee)
-{
- const struct DONAUDB_BatchDeposit *bd = &dc->bd;
- struct GNUNET_JSON_Specification spec[] = {
- TALER_JSON_spec_amount ("contribution",
- DH_currency,
- &cdi->amount_with_fee),
- GNUNET_JSON_spec_fixed_auto ("denom_pub_hash",
- &cdi->coin.denom_pub_hash),
- TALER_JSON_spec_denom_sig ("ub_sig",
- &cdi->coin.denom_sig),
- GNUNET_JSON_spec_fixed_auto ("coin_pub",
- &cdi->coin.coin_pub),
- GNUNET_JSON_spec_mark_optional (
- GNUNET_JSON_spec_fixed_auto ("h_age_commitment",
- &cdi->coin.h_age_commitment),
- &cdi->coin.no_age_commitment),
- GNUNET_JSON_spec_fixed_auto ("coin_sig",
- &cdi->csig),
- GNUNET_JSON_spec_end ()
- };
- enum GNUNET_GenericReturnValue res;
-
- if (GNUNET_OK !=
- (res = TALER_MHD_parse_json_data (connection,
- jcoin,
- spec)))
- return res;
- /* check denomination exists and is valid */
- {
- struct DH_DenominationKey *dk;
- MHD_RESULT mret;
-
- dk = DH_keys_denomination_by_hash (&cdi->coin.denom_pub_hash,
- connection,
- &mret);
- if (NULL == dk)
- {
- GNUNET_JSON_parse_free (spec);
- return mret;
- }
- if (0 > TALER_amount_cmp (&dk->meta.value,
- &cdi->amount_with_fee))
- {
- GNUNET_break_op (0);
- GNUNET_JSON_parse_free (spec);
- return (MHD_YES ==
- TALER_MHD_reply_with_error (connection,
- MHD_HTTP_BAD_REQUEST,
-
TALER_EC_DONAU_GENERIC_AMOUNT_EXCEEDS_DENOMINATION_VALUE,
- NULL))
- ? GNUNET_NO
- : GNUNET_SYSERR;
- }
- if (GNUNET_TIME_absolute_is_past (dk->meta.expire_deposit.abs_time))
- {
- /* This denomination is past the expiration time for deposits */
- GNUNET_JSON_parse_free (spec);
- return (MHD_YES ==
- DH_RESPONSE_reply_expired_denom_pub_hash (
- connection,
- &cdi->coin.denom_pub_hash,
- TALER_EC_DONAU_GENERIC_DENOMINATION_EXPIRED,
- "DEPOSIT"))
- ? GNUNET_NO
- : GNUNET_SYSERR;
- }
- if (GNUNET_TIME_absolute_is_future (dk->meta.start.abs_time))
- {
- /* This denomination is not yet valid */
- GNUNET_JSON_parse_free (spec);
- return (MHD_YES ==
- DH_RESPONSE_reply_expired_denom_pub_hash (
- connection,
- &cdi->coin.denom_pub_hash,
- TALER_EC_DONAU_GENERIC_DENOMINATION_VALIDITY_IN_FUTURE,
- "DEPOSIT"))
- ? GNUNET_NO
- : GNUNET_SYSERR;
- }
- if (dk->denom_pub.cipher != cdi->coin.denom_sig.cipher)
- {
- /* denomination cipher and denomination signature cipher not the same */
- GNUNET_JSON_parse_free (spec);
- return (MHD_YES ==
- TALER_MHD_reply_with_error (connection,
- MHD_HTTP_BAD_REQUEST,
-
TALER_EC_DONAU_GENERIC_CIPHER_MISMATCH,
- NULL))
- ? GNUNET_NO
- : GNUNET_SYSERR;
- }
-
- *deposit_fee = dk->meta.fees.deposit;
- /* check coin signature */
- switch (dk->denom_pub.cipher)
- {
- case TALER_DENOMINATION_RSA:
- DH_METRICS_num_verifications[DH_MT_SIGNATURE_RSA]++;
- break;
- case TALER_DENOMINATION_CS:
- DH_METRICS_num_verifications[DH_MT_SIGNATURE_CS]++;
- break;
- default:
- break;
- }
- if (GNUNET_YES !=
- TALER_test_coin_valid (&cdi->coin,
- &dk->denom_pub))
- {
- TALER_LOG_WARNING ("Invalid coin passed for /batch-deposit\n");
- GNUNET_JSON_parse_free (spec);
- return (MHD_YES ==
- TALER_MHD_reply_with_error (connection,
- MHD_HTTP_FORBIDDEN,
-
TALER_EC_DONAU_DENOMINATION_SIGNATURE_INVALID,
- NULL))
- ? GNUNET_NO
- : GNUNET_SYSERR;
- }
- }
- if (0 < TALER_amount_cmp (deposit_fee,
- &cdi->amount_with_fee))
- {
- GNUNET_break_op (0);
- GNUNET_JSON_parse_free (spec);
- return (MHD_YES ==
- TALER_MHD_reply_with_error (connection,
- MHD_HTTP_BAD_REQUEST,
-
TALER_EC_DONAU_DEPOSIT_NEGATIVE_VALUE_AFTER_FEE,
- NULL))
- ? GNUNET_NO
- : GNUNET_SYSERR;
- }
-
- DH_METRICS_num_verifications[DH_MT_SIGNATURE_EDDSA]++;
- if (GNUNET_OK !=
- TALER_wallet_deposit_verify (
- &cdi->amount_with_fee,
- deposit_fee,
- &dc->h_wire,
- &bd->h_contract_terms,
- &bd->wallet_data_hash,
- NULL != cdi->coin.no_age_commitment
- ? NULL
- : &cdi->coin.h_age_commitment,
- NULL != dc->policy_json ? &dc->h_policy : NULL,
- &cdi->coin.denom_pub_hash,
- bd->wallet_timestamp,
- &bd->charity_pub,
- bd->refund_deadline,
- &cdi->coin.coin_pub,
- &cdi->csig))
- {
- TALER_LOG_WARNING ("Invalid signature on /batch-deposit request\n");
- GNUNET_JSON_parse_free (spec);
- return (MHD_YES ==
- TALER_MHD_reply_with_error (connection,
- MHD_HTTP_FORBIDDEN,
-
TALER_EC_DONAU_DEPOSIT_COIN_SIGNATURE_INVALID,
- TALER_B2S (&cdi->coin.coin_pub)))
- ? GNUNET_NO
- : GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-MHD_RESULT
-DH_handler_batch_deposit (struct DH_RequestContext *rc,
- const json_t *root,
- const char *const args[])
-{
- struct MHD_Connection *connection = rc->connection;
- struct BatchDepositContext dc = { 0 };
- struct DONAUDB_BatchDeposit *bd = &dc.bd;
- const json_t *coins;
- bool no_refund_deadline = true;
- struct GNUNET_JSON_Specification spec[] = {
- GNUNET_JSON_spec_string ("charity_payto_uri",
- &bd->receiver_wire_account),
- GNUNET_JSON_spec_fixed_auto ("wire_salt",
- &bd->wire_salt),
- GNUNET_JSON_spec_fixed_auto ("charity_pub",
- &bd->charity_pub),
- GNUNET_JSON_spec_fixed_auto ("h_contract_terms",
- &bd->h_contract_terms),
- GNUNET_JSON_spec_mark_optional (
- GNUNET_JSON_spec_fixed_auto ("wallet_data_hash",
- &bd->wallet_data_hash),
- &bd->no_wallet_data_hash),
- GNUNET_JSON_spec_array_const ("coins",
- &coins),
- GNUNET_JSON_spec_mark_optional (
- GNUNET_JSON_spec_json ("policy",
- &dc.policy_json),
- NULL),
- GNUNET_JSON_spec_timestamp ("timestamp",
- &bd->wallet_timestamp),
- GNUNET_JSON_spec_mark_optional (
- GNUNET_JSON_spec_timestamp ("refund_deadline",
- &bd->refund_deadline),
- &no_refund_deadline),
- GNUNET_JSON_spec_timestamp ("wire_transfer_deadline",
- &bd->wire_deadline),
- GNUNET_JSON_spec_end ()
- };
- enum GNUNET_GenericReturnValue res;
-
- (void) args;
- res = TALER_MHD_parse_json_data (connection,
- root,
- spec);
- if (GNUNET_SYSERR == res)
- {
- GNUNET_break (0);
- return MHD_NO; /* hard failure */
- }
- if (GNUNET_NO == res)
- {
- GNUNET_break_op (0);
- return MHD_YES; /* failure */
- }
-
- /* validate charity's wire details (as far as we can) */
- {
- char *emsg;
-
- emsg = TALER_payto_validate (bd->receiver_wire_account);
- if (NULL != emsg)
- {
- MHD_RESULT ret;
-
- GNUNET_break_op (0);
- GNUNET_JSON_parse_free (spec);
- ret = TALER_MHD_reply_with_error (connection,
- MHD_HTTP_BAD_REQUEST,
- TALER_EC_GENERIC_PARAMETER_MALFORMED,
- emsg);
- GNUNET_free (emsg);
- return ret;
- }
- }
- if (GNUNET_TIME_timestamp_cmp (bd->refund_deadline,
- >,
- bd->wire_deadline))
- {
- GNUNET_break_op (0);
- GNUNET_JSON_parse_free (spec);
- return TALER_MHD_reply_with_error (connection,
- MHD_HTTP_BAD_REQUEST,
-
TALER_EC_DONAU_DEPOSIT_REFUND_DEADLINE_AFTER_WIRE_DEADLINE,
- NULL);
- }
- if (GNUNET_TIME_absolute_is_never (bd->wire_deadline.abs_time))
- {
- GNUNET_break_op (0);
- GNUNET_JSON_parse_free (spec);
- return TALER_MHD_reply_with_error (connection,
- MHD_HTTP_BAD_REQUEST,
-
TALER_EC_DONAU_DEPOSIT_WIRE_DEADLINE_IS_NEVER,
- NULL);
- }
- TALER_payto_hash (bd->receiver_wire_account,
- &bd->wire_target_h_payto);
- TALER_charity_wire_signature_hash (bd->receiver_wire_account,
- &bd->wire_salt,
- &dc.h_wire);
-
- /* handle policy, if present */
- if (NULL != dc.policy_json)
- {
- const char *error_hint = NULL;
-
- if (GNUNET_OK !=
- TALER_extensions_create_policy_details (
- dc.policy_json,
- &dc.policy_details,
- &error_hint))
- return TALER_MHD_reply_with_error (connection,
- MHD_HTTP_BAD_REQUEST,
-
TALER_EC_DONAU_DEPOSITS_POLICY_NOT_ACCEPTED,
- error_hint);
-
- TALER_deposit_policy_hash (dc.policy_json,
- &dc.h_policy);
- }
-
- bd->num_cdis = json_array_size (coins);
- if (0 == bd->num_cdis)
- {
- GNUNET_break_op (0);
- GNUNET_JSON_parse_free (spec);
- return TALER_MHD_reply_with_error (connection,
- MHD_HTTP_BAD_REQUEST,
- TALER_EC_GENERIC_PARAMETER_MALFORMED,
- "coins");
- }
- if (TALER_MAX_FRESH_COINS < bd->num_cdis)
- {
- GNUNET_break_op (0);
- GNUNET_JSON_parse_free (spec);
- return TALER_MHD_reply_with_error (connection,
- MHD_HTTP_BAD_REQUEST,
- TALER_EC_GENERIC_PARAMETER_MALFORMED,
- "coins");
- }
-
- {
- struct DONAUDB_CoinDepositInformation cdis[
- GNUNET_NZL (bd->num_cdis)];
- struct TALER_Amount deposit_fees[GNUNET_NZL (bd->num_cdis)];
-
- bd->cdis = cdis;
- dc.deposit_fees = deposit_fees;
- for (unsigned int i = 0; i<bd->num_cdis; i++)
- {
- do {
- res = parse_coin (connection,
- &dc,
- json_array_get (coins,
- i),
- &cdis[i],
- &deposit_fees[i]);
- if (GNUNET_OK != res)
- break;
-
- /* If applicable, accumulate all contributions into the policy_details
*/
- if (NULL != dc.policy_json)
- {
- /* FIXME: how do deposit-fee and policy-fee interact? */
- struct TALER_Amount amount_without_fee;
-
- // FIXME-Oec: wrong enum type for 'res' here!
- res = TALER_amount_subtract (&amount_without_fee,
- &cdis[i].amount_with_fee,
- &deposit_fees[i]);
- // FIXME-Oec: rval of res not checked
- res = TALER_amount_add (
- &dc.policy_details.accumulated_total,
- &dc.policy_details.accumulated_total,
- &amount_without_fee);
- }
- } while(0);
-
- if (GNUNET_OK != res)
- {
- for (unsigned int j = 0; j<i; j++)
- TALER_denom_sig_free (&cdis[j].coin.denom_sig);
- GNUNET_JSON_parse_free (spec);
- return (GNUNET_NO == res) ? MHD_YES : MHD_NO;
- }
- }
-
- dc.donau_timestamp = GNUNET_TIME_timestamp_get ();
- if (GNUNET_SYSERR ==
- DH_plugin->preflight (DH_plugin->cls))
- {
- GNUNET_break (0);
- GNUNET_JSON_parse_free (spec);
- return TALER_MHD_reply_with_error (connection,
- MHD_HTTP_INTERNAL_SERVER_ERROR,
- TALER_EC_GENERIC_DB_START_FAILED,
- "preflight failure");
- }
-
- /* execute transaction */
- {
- MHD_RESULT mhd_ret;
-
- if (GNUNET_OK !=
- DH_DB_run_transaction (connection,
- "execute batch deposit",
- DH_MT_REQUEST_BATCH_DEPOSIT,
- &mhd_ret,
- &batch_deposit_transaction,
- &dc))
- {
- for (unsigned int j = 0; j<bd->num_cdis; j++)
- TALER_denom_sig_free (&cdis[j].coin.denom_sig);
- GNUNET_JSON_parse_free (spec);
- return mhd_ret;
- }
- }
-
- /* generate regular response */
- {
- MHD_RESULT res;
-
- res = reply_batch_deposit_success (connection,
- &dc);
- for (unsigned int j = 0; j<bd->num_cdis; j++)
- TALER_denom_sig_free (&cdis[j].coin.denom_sig);
- GNUNET_JSON_parse_free (spec);
- return res;
- }
- }
-}
-
-
-/* end of donau-httpd_batch-submit_receipts.c */
diff --git a/src/donau/donau-httpd_batch-submit_receipts.h
b/src/donau/donau-httpd_batch-submit_receipts.h
deleted file mode 100644
index 591c19a..0000000
--- a/src/donau/donau-httpd_batch-submit_receipts.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2014 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 CHARITYABILITY 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 taler-donau-httpd_batch-deposit.h
- * @brief Handle /batch-deposit requests
- * @author Florian Dold
- * @author Benedikt Mueller
- * @author Christian Grothoff
- */
-#ifndef DONAU_HTTPD_BATCH_DEPOSIT_H
-#define DONAU_HTTPD_BATCH_DEPOSIT_H
-
-#include <gnunet/gnunet_util_lib.h>
-#include <microhttpd.h>
-#include "taler-donau-httpd.h"
-
-
-/**
- * Handle a "/batch-deposit" request. Parses the JSON, and, if
- * successful, passes the JSON data to #deposit_transaction() to
- * further check the details of the operation specified. If everything checks
- * out, this will ultimately lead to the "/batch-deposit" being executed, or
- * rejected.
- *
- * @param rc request context
- * @param root uploaded JSON data
- * @param args arguments, empty in this case
- * @return MHD result code
- */
-MHD_RESULT
-DH_handler_batch_deposit (struct DH_RequestContext *rc,
- const json_t *root,
- const char *const args[]);
-
-
-#endif
diff --git a/src/donau/donau-httpd_charities_get.c
b/src/donau/donau-httpd_charities_get.c
deleted file mode 100644
index c8c2afb..0000000
--- a/src/donau/donau-httpd_charities_get.c
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2014-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 CHARITYABILITY 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 taler-donau-httpd_reserves_get.c
- * @brief Handle /reserves/$RESERVE_PUB GET requests
- * @author Florian Dold
- * @author Benedikt Mueller
- * @author Christian Grothoff
- */
-#include "taler/platform.h"
-#include <gnunet/gnunet_util_lib.h>
-#include <jansson.h>
-#include "taler/taler_mhd_lib.h"
-#include "taler/taler_json_lib.h"
-#include "taler_dbevents.h"
-#include "taler-donau-httpd_keys.h"
-#include "taler-donau-httpd_reserves_get.h"
-#include "taler-donau-httpd_responses.h"
-
-
-/**
- * Reserve GET request that is long-polling.
- */
-struct ReservePoller
-{
- /**
- * Kept in a DLL.
- */
- struct ReservePoller *next;
-
- /**
- * Kept in a DLL.
- */
- struct ReservePoller *prev;
-
- /**
- * Connection we are handling.
- */
- struct MHD_Connection *connection;
-
- /**
- * Our request context.
- */
- struct DH_RequestContext *rc;
-
- /**
- * Subscription for the database event we are waiting for.
- */
- struct GNUNET_DB_EventHandler *eh;
-
- /**
- * When will this request time out?
- */
- struct GNUNET_TIME_Absolute timeout;
-
- /**
- * Public key of the reserve the inquiry is about.
- */
- struct TALER_ReservePublicKeyP reserve_pub;
-
- /**
- * Balance of the reserve, set in the callback.
- */
- struct TALER_Amount balance;
-
- /**
- * True if we are still suspended.
- */
- bool suspended;
-
-};
-
-
-/**
- * Head of list of requests in long polling.
- */
-static struct ReservePoller *rp_head;
-
-/**
- * Tail of list of requests in long polling.
- */
-static struct ReservePoller *rp_tail;
-
-
-void
-DH_reserves_get_cleanup ()
-{
- for (struct ReservePoller *rp = rp_head;
- NULL != rp;
- rp = rp->next)
- {
- if (rp->suspended)
- {
- rp->suspended = false;
- MHD_resume_connection (rp->connection);
- }
- }
-}
-
-
-/**
- * Function called once a connection is done to
- * clean up the `struct ReservePoller` state.
- *
- * @param rc context to clean up for
- */
-static void
-rp_cleanup (struct DH_RequestContext *rc)
-{
- struct ReservePoller *rp = rc->rh_ctx;
-
- GNUNET_assert (! rp->suspended);
- if (NULL != rp->eh)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Cancelling DB event listening on cleanup (odd unless during
shutdown)\n");
- DH_plugin->event_listen_cancel (DH_plugin->cls,
- rp->eh);
- rp->eh = NULL;
- }
- GNUNET_CONTAINER_DLL_remove (rp_head,
- rp_tail,
- rp);
- GNUNET_free (rp);
-}
-
-
-/**
- * Function called on events received from Postgres.
- * Wakes up long pollers.
- *
- * @param cls the `struct DH_RequestContext *`
- * @param extra additional event data provided
- * @param extra_size number of bytes in @a extra
- */
-static void
-db_event_cb (void *cls,
- const void *extra,
- size_t extra_size)
-{
- struct ReservePoller *rp = cls;
- struct GNUNET_AsyncScopeSave old_scope;
-
- (void) extra;
- (void) extra_size;
- if (! rp->suspended)
- return; /* might get multiple wake-up events */
- GNUNET_async_scope_enter (&rp->rc->async_scope_id,
- &old_scope);
- DH_check_invariants ();
- rp->suspended = false;
- MHD_resume_connection (rp->connection);
- TALER_MHD_daemon_trigger ();
- DH_check_invariants ();
- GNUNET_async_scope_restore (&old_scope);
-}
-
-
-MHD_RESULT
-DH_handler_reserves_get (struct DH_RequestContext *rc,
- const char *const args[1])
-{
- struct ReservePoller *rp = rc->rh_ctx;
-
- if (NULL == rp)
- {
- rp = GNUNET_new (struct ReservePoller);
- rp->connection = rc->connection;
- rp->rc = rc;
- rc->rh_ctx = rp;
- rc->rh_cleaner = &rp_cleanup;
- GNUNET_CONTAINER_DLL_insert (rp_head,
- rp_tail,
- rp);
- if (GNUNET_OK !=
- GNUNET_STRINGS_string_to_data (args[0],
- strlen (args[0]),
- &rp->reserve_pub,
- sizeof (rp->reserve_pub)))
- {
- GNUNET_break_op (0);
- return TALER_MHD_reply_with_error (rc->connection,
- MHD_HTTP_BAD_REQUEST,
-
TALER_EC_GENERIC_RESERVE_PUB_MALFORMED,
- args[0]);
- }
- TALER_MHD_parse_request_timeout (rc->connection,
- &rp->timeout);
- }
-
- if ( (GNUNET_TIME_absolute_is_future (rp->timeout)) &&
- (NULL == rp->eh) )
- {
- struct TALER_ReserveEventP rep = {
- .header.size = htons (sizeof (rep)),
- .header.type = htons (TALER_DBEVENT_DONAU_RESERVE_INCOMING),
- .reserve_pub = rp->reserve_pub
- };
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Starting DB event listening until %s\n",
- GNUNET_TIME_absolute2s (rp->timeout));
- rp->eh = DH_plugin->event_listen (
- DH_plugin->cls,
- GNUNET_TIME_absolute_get_remaining (rp->timeout),
- &rep.header,
- &db_event_cb,
- rp);
- }
- {
- enum GNUNET_DB_QueryStatus qs;
-
- qs = DH_plugin->get_reserve_balance (DH_plugin->cls,
- &rp->reserve_pub,
- &rp->balance);
- switch (qs)
- {
- case GNUNET_DB_STATUS_SOFT_ERROR:
- GNUNET_break (0); /* single-shot query should never have soft-errors */
- return TALER_MHD_reply_with_error (rc->connection,
- MHD_HTTP_INTERNAL_SERVER_ERROR,
- TALER_EC_GENERIC_DB_SOFT_FAILURE,
- "get_reserve_balance");
- case GNUNET_DB_STATUS_HARD_ERROR:
- GNUNET_break (0);
- return TALER_MHD_reply_with_error (rc->connection,
- MHD_HTTP_INTERNAL_SERVER_ERROR,
- TALER_EC_GENERIC_DB_FETCH_FAILED,
- "get_reserve_balance");
- case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT:
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Got reserve balance of %s\n",
- TALER_amount2s (&rp->balance));
- return TALER_MHD_REPLY_JSON_PACK (rc->connection,
- MHD_HTTP_OK,
- TALER_JSON_pack_amount ("balance",
- &rp->balance));
- case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS:
- if (! GNUNET_TIME_absolute_is_future (rp->timeout))
- {
- return TALER_MHD_reply_with_error (rc->connection,
- MHD_HTTP_NOT_FOUND,
-
TALER_EC_DONAU_RESERVES_STATUS_UNKNOWN,
- args[0]);
- }
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Long-polling on reserve for %s\n",
- GNUNET_STRINGS_relative_time_to_string (
- GNUNET_TIME_absolute_get_remaining (rp->timeout),
- true));
- rp->suspended = true;
- MHD_suspend_connection (rc->connection);
- return MHD_YES;
- }
- }
- GNUNET_break (0);
- return MHD_NO;
-}
-
-
-/* end of taler-donau-httpd_reserves_get.c */
diff --git a/src/donau/donau-httpd_charities_get.h
b/src/donau/donau-httpd_charities_get.h
deleted file mode 100644
index 52191ee..0000000
--- a/src/donau/donau-httpd_charities_get.h
+++ /dev/null
@@ -1,53 +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 CHARITYABILITY 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 taler-donau-httpd_reserves_get.h
- * @brief Handle /reserves/$RESERVE_PUB GET requests
- * @author Florian Dold
- * @author Benedikt Mueller
- * @author Christian Grothoff
- */
-#ifndef DONAU_HTTPD_RESERVES_GET_H
-#define DONAU_HTTPD_RESERVES_GET_H
-
-#include <microhttpd.h>
-#include "taler-donau-httpd.h"
-
-
-/**
- * Shutdown reserves-get subsystem. Resumes all
- * suspended long-polling clients and cleans up
- * data structures.
- */
-void
-DH_reserves_get_cleanup (void);
-
-
-/**
- * Handle a GET "/reserves/" request. Parses the
- * given "reserve_pub" in @a args (which should contain the
- * EdDSA public key of a reserve) and then respond with the
- * status of the reserve.
- *
- * @param rc request context
- * @param args array of additional options (length: 1, just the reserve_pub)
- * @return MHD result code
- */
-MHD_RESULT
-DH_handler_reserves_get (struct DH_RequestContext *rc,
- const char *const args[1]);
-
-#endif
diff --git a/src/donau/donau-httpd_charities_history.c
b/src/donau/donau-httpd_charities_history.c
deleted file mode 100644
index d96f5db..0000000
--- a/src/donau/donau-httpd_charities_history.c
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2014-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 CHARITYABILITY 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 taler-donau-httpd_reserves_history.c
- * @brief Handle /reserves/$RESERVE_PUB/history requests
- * @author Florian Dold
- * @author Benedikt Mueller
- * @author Christian Grothoff
- */
-#include "taler/platform.h"
-#include <gnunet/gnunet_util_lib.h>
-#include <jansson.h>
-#include "taler/taler_mhd_lib.h"
-#include "taler/taler_json_lib.h"
-#include "taler_dbevents.h"
-#include "taler-donau-httpd_keys.h"
-#include "taler-donau-httpd_reserves_history.h"
-#include "taler-donau-httpd_responses.h"
-
-
-/**
- * How far do we allow a client's time to be off when
- * checking the request timestamp?
- */
-#define TIMESTAMP_TOLERANCE \
- GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 15)
-
-
-/**
- * Closure for #reserve_history_transaction.
- */
-struct ReserveHistoryContext
-{
- /**
- * Public key of the reserve the inquiry is about.
- */
- const struct TALER_ReservePublicKeyP *reserve_pub;
-
- /**
- * Timestamp of the request.
- */
- struct GNUNET_TIME_Timestamp timestamp;
-
- /**
- * Client signature approving the request.
- */
- struct TALER_ReserveSignatureP reserve_sig;
-
- /**
- * History of the reserve, set in the callback.
- */
- struct DONAUDB_ReserveHistory *rh;
-
- /**
- * Global fees applying to the request.
- */
- const struct DH_GlobalFee *gf;
-
- /**
- * Current reserve balance.
- */
- struct TALER_Amount balance;
-};
-
-
-/**
- * Send reserve history to client.
- *
- * @param connection connection to the client
- * @param rhc reserve history to return
- * @return MHD result code
- */
-static MHD_RESULT
-reply_reserve_history_success (struct MHD_Connection *connection,
- const struct ReserveHistoryContext *rhc)
-{
- const struct DONAUDB_ReserveHistory *rh = rhc->rh;
- json_t *json_history;
-
- json_history = DH_RESPONSE_compile_reserve_history (rh);
- if (NULL == json_history)
- return TALER_MHD_reply_with_error (connection,
- MHD_HTTP_INTERNAL_SERVER_ERROR,
-
TALER_EC_GENERIC_JSON_ALLOCATION_FAILURE,
- NULL);
- return TALER_MHD_REPLY_JSON_PACK (
- connection,
- MHD_HTTP_OK,
- TALER_JSON_pack_amount ("balance",
- &rhc->balance),
- GNUNET_JSON_pack_array_steal ("history",
- json_history));
-}
-
-
-/**
- * Function implementing /reserves/$RID/history transaction. Given the public
- * key of a reserve, return the associated transaction history. Runs the
- * transaction logic; IF it returns a non-error code, the transaction logic
- * MUST NOT queue a MHD response. IF it returns an hard error, the
- * transaction logic MUST queue a MHD response and set @a mhd_ret. IF it
- * returns the soft error code, the function MAY be called again to retry and
- * MUST not queue a MHD response.
- *
- * @param cls a `struct ReserveHistoryContext *`
- * @param connection MHD request which triggered the transaction
- * @param[out] mhd_ret set to MHD response status for @a connection,
- * if transaction failed (!); unused
- * @return transaction status
- */
-static enum GNUNET_DB_QueryStatus
-reserve_history_transaction (void *cls,
- struct MHD_Connection *connection,
- MHD_RESULT *mhd_ret)
-{
- struct ReserveHistoryContext *rsc = cls;
- enum GNUNET_DB_QueryStatus qs;
-
- if (! TALER_amount_is_zero (&rsc->gf->fees.history))
- {
- bool balance_ok = false;
- bool idempotent = true;
-
- qs = DH_plugin->insert_history_request (DH_plugin->cls,
- rsc->reserve_pub,
- &rsc->reserve_sig,
- rsc->timestamp,
- &rsc->gf->fees.history,
- &balance_ok,
- &idempotent);
- if (GNUNET_DB_STATUS_HARD_ERROR == qs)
- {
- GNUNET_break (0);
- *mhd_ret
- = TALER_MHD_reply_with_error (connection,
- MHD_HTTP_INTERNAL_SERVER_ERROR,
- TALER_EC_GENERIC_DB_FETCH_FAILED,
- "get_reserve_history");
- }
- if (qs <= 0)
- {
- GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
- return qs;
- }
- if (! balance_ok)
- {
- return TALER_MHD_reply_with_error (connection,
- MHD_HTTP_CONFLICT,
-
TALER_EC_DONAU_GET_RESERVE_HISTORY_ERROR_INSUFFICIENT_BALANCE,
- NULL);
- }
- if (idempotent)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "Idempotent /reserves/history request observed. Is caching
working?\n");
- }
- }
- qs = DH_plugin->get_reserve_history (DH_plugin->cls,
- rsc->reserve_pub,
- &rsc->balance,
- &rsc->rh);
- if (GNUNET_DB_STATUS_HARD_ERROR == qs)
- {
- GNUNET_break (0);
- *mhd_ret
- = TALER_MHD_reply_with_error (connection,
- MHD_HTTP_INTERNAL_SERVER_ERROR,
- TALER_EC_GENERIC_DB_FETCH_FAILED,
- "get_reserve_history");
- }
- return qs;
-}
-
-
-MHD_RESULT
-DH_handler_reserves_history (struct DH_RequestContext *rc,
- const struct TALER_ReservePublicKeyP
*reserve_pub,
- const json_t *root)
-{
- struct ReserveHistoryContext rsc;
- MHD_RESULT mhd_ret;
- struct GNUNET_JSON_Specification spec[] = {
- GNUNET_JSON_spec_timestamp ("request_timestamp",
- &rsc.timestamp),
- GNUNET_JSON_spec_fixed_auto ("reserve_sig",
- &rsc.reserve_sig),
- GNUNET_JSON_spec_end ()
- };
- struct GNUNET_TIME_Timestamp now;
-
- rsc.reserve_pub = reserve_pub;
- {
- enum GNUNET_GenericReturnValue res;
-
- res = TALER_MHD_parse_json_data (rc->connection,
- root,
- spec);
- if (GNUNET_SYSERR == res)
- {
- GNUNET_break (0);
- return MHD_NO; /* hard failure */
- }
- if (GNUNET_NO == res)
- {
- GNUNET_break_op (0);
- return MHD_YES; /* failure */
- }
- }
- now = GNUNET_TIME_timestamp_get ();
- if (! GNUNET_TIME_absolute_approx_eq (now.abs_time,
- rsc.timestamp.abs_time,
- TIMESTAMP_TOLERANCE))
- {
- GNUNET_break_op (0);
- return TALER_MHD_reply_with_error (rc->connection,
- MHD_HTTP_BAD_REQUEST,
- TALER_EC_DONAU_GENERIC_CLOCK_SKEW,
- NULL);
- }
- {
- struct DH_KeyStateHandle *keys;
-
- keys = DH_keys_get_state ();
- if (NULL == keys)
- {
- GNUNET_break (0);
- GNUNET_JSON_parse_free (spec);
- return TALER_MHD_reply_with_error (rc->connection,
- MHD_HTTP_INTERNAL_SERVER_ERROR,
- TALER_EC_DONAU_GENERIC_KEYS_MISSING,
- NULL);
- }
- rsc.gf = DH_keys_global_fee_by_time (keys,
- rsc.timestamp);
- }
- if (NULL == rsc.gf)
- {
- GNUNET_break (0);
- return TALER_MHD_reply_with_error (rc->connection,
- MHD_HTTP_INTERNAL_SERVER_ERROR,
-
TALER_EC_DONAU_GENERIC_BAD_CONFIGURATION,
- NULL);
- }
- if (GNUNET_OK !=
- TALER_wallet_reserve_history_verify (rsc.timestamp,
- &rsc.gf->fees.history,
- reserve_pub,
- &rsc.reserve_sig))
- {
- GNUNET_break_op (0);
- return TALER_MHD_reply_with_error (rc->connection,
- MHD_HTTP_FORBIDDEN,
-
TALER_EC_DONAU_RESERVES_HISTORY_BAD_SIGNATURE,
- NULL);
- }
- rsc.rh = NULL;
- if (GNUNET_OK !=
- DH_DB_run_transaction (rc->connection,
- "get reserve history",
- DH_MT_REQUEST_OTHER,
- &mhd_ret,
- &reserve_history_transaction,
- &rsc))
- {
- return mhd_ret;
- }
- if (NULL == rsc.rh)
- {
- return TALER_MHD_reply_with_error (rc->connection,
- MHD_HTTP_NOT_FOUND,
- TALER_EC_DONAU_RESERVES_STATUS_UNKNOWN,
- NULL);
- }
- mhd_ret = reply_reserve_history_success (rc->connection,
- &rsc);
- DH_plugin->free_reserve_history (DH_plugin->cls,
- rsc.rh);
- return mhd_ret;
-}
-
-
-/* end of taler-donau-httpd_reserves_history.c */
diff --git a/src/donau/donau-httpd_charities_history.h
b/src/donau/donau-httpd_charities_history.h
deleted file mode 100644
index c73979d..0000000
--- a/src/donau/donau-httpd_charities_history.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2014-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 CHARITYABILITY 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 taler-donau-httpd_reserves_history.h
- * @brief Handle /reserves/$RESERVE_PUB/history requests
- * @author Florian Dold
- * @author Christian Grothoff
- */
-#ifndef DONAU_HTTPD_RESERVES_HISTORY_H
-#define DONAU_HTTPD_RESERVES_HISTORY_H
-
-#include <microhttpd.h>
-#include "taler-donau-httpd.h"
-
-
-/**
- * Handle a POST "/reserves/$RID/history" request.
- *
- * @param rc request context
- * @param reserve_pub public key of the reserve
- * @param root uploaded body from the client
- * @return MHD result code
- */
-MHD_RESULT
-DH_handler_reserves_history (struct DH_RequestContext *rc,
- const struct TALER_ReservePublicKeyP
*reserve_pub,
- const json_t *root);
-
-#endif
diff --git a/src/donau/donau-httpd_charities_open.c
b/src/donau/donau-httpd_charities_open.c
deleted file mode 100644
index aa1c2de..0000000
--- a/src/donau/donau-httpd_charities_open.c
+++ /dev/null
@@ -1,468 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 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 CHARITYABILITY 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 taler-donau-httpd_reserves_open.c
- * @brief Handle /reserves/$RESERVE_PUB/open requests
- * @author Christian Grothoff
- */
-#include "taler/platform.h"
-#include <gnunet/gnunet_util_lib.h>
-#include <jansson.h>
-#include "taler/taler_mhd_lib.h"
-#include "taler/taler_json_lib.h"
-#include "taler_dbevents.h"
-#include "taler-donau-httpd_common_deposit.h"
-#include "taler-donau-httpd_keys.h"
-#include "taler-donau-httpd_reserves_open.h"
-#include "taler-donau-httpd_responses.h"
-
-
-/**
- * How far do we allow a client's time to be off when
- * checking the request timestamp?
- */
-#define TIMESTAMP_TOLERANCE \
- GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 15)
-
-
-/**
- * Closure for #reserve_open_transaction.
- */
-struct ReserveOpenContext
-{
- /**
- * Public key of the reserve the inquiry is about.
- */
- const struct TALER_ReservePublicKeyP *reserve_pub;
-
- /**
- * Desired (minimum) expiration time for the reserve.
- */
- struct GNUNET_TIME_Timestamp desired_expiration;
-
- /**
- * Actual expiration time for the reserve.
- */
- struct GNUNET_TIME_Timestamp reserve_expiration;
-
- /**
- * Timestamp of the request.
- */
- struct GNUNET_TIME_Timestamp timestamp;
-
- /**
- * Client signature approving the request.
- */
- struct TALER_ReserveSignatureP reserve_sig;
-
- /**
- * Global fees applying to the request.
- */
- const struct DH_GlobalFee *gf;
-
- /**
- * Amount to be paid from the reserve.
- */
- struct TALER_Amount reserve_payment;
-
- /**
- * Actual cost to open the reserve.
- */
- struct TALER_Amount open_cost;
-
- /**
- * Total amount that was deposited.
- */
- struct TALER_Amount total;
-
- /**
- * Information about payments by coin.
- */
- struct DH_PurseDepositedCoin *payments;
-
- /**
- * Length of the @e payments array.
- */
- unsigned int payments_len;
-
- /**
- * Desired minimum purse limit.
- */
- uint32_t purse_limit;
-
- /**
- * Set to true if the reserve balance is too low
- * for the operation.
- */
- bool no_funds;
-
-};
-
-
-/**
- * Send reserve open to client.
- *
- * @param connection connection to the client
- * @param rsc reserve open data to return
- * @return MHD result code
- */
-static MHD_RESULT
-reply_reserve_open_success (struct MHD_Connection *connection,
- const struct ReserveOpenContext *rsc)
-{
- struct GNUNET_TIME_Timestamp now;
- struct GNUNET_TIME_Timestamp re;
- unsigned int status;
-
- status = MHD_HTTP_OK;
- if (GNUNET_TIME_timestamp_cmp (rsc->reserve_expiration,
- <,
- rsc->desired_expiration))
- status = MHD_HTTP_PAYMENT_REQUIRED;
- now = GNUNET_TIME_timestamp_get ();
- if (GNUNET_TIME_timestamp_cmp (rsc->reserve_expiration,
- <,
- now))
- re = now;
- else
- re = rsc->reserve_expiration;
- return TALER_MHD_REPLY_JSON_PACK (
- connection,
- status,
- GNUNET_JSON_pack_timestamp ("reserve_expiration",
- re),
- TALER_JSON_pack_amount ("open_cost",
- &rsc->open_cost));
-}
-
-
-/**
- * Cleans up information in @a rsc, but does not
- * free @a rsc itself (allocated on the stack!).
- *
- * @param[in] rsc struct with information to clean up
- */
-static void
-cleanup_rsc (struct ReserveOpenContext *rsc)
-{
- for (unsigned int i = 0; i<rsc->payments_len; i++)
- {
- DH_common_purse_deposit_free_coin (&rsc->payments[i]);
- }
- GNUNET_free (rsc->payments);
-}
-
-
-/**
- * Function implementing /reserves/$RID/open transaction. Given the public
- * key of a reserve, return the associated transaction open. Runs the
- * transaction logic; IF it returns a non-error code, the transaction logic
- * MUST NOT queue a MHD response. IF it returns an hard error, the
- * transaction logic MUST queue a MHD response and set @a mhd_ret. IF it
- * returns the soft error code, the function MAY be called again to retry and
- * MUST not queue a MHD response.
- *
- * @param cls a `struct ReserveOpenContext *`
- * @param connection MHD request which triggered the transaction
- * @param[out] mhd_ret set to MHD response status for @a connection,
- * if transaction failed (!)
- * @return transaction status
- */
-static enum GNUNET_DB_QueryStatus
-reserve_open_transaction (void *cls,
- struct MHD_Connection *connection,
- MHD_RESULT *mhd_ret)
-{
- struct ReserveOpenContext *rsc = cls;
- enum GNUNET_DB_QueryStatus qs;
-
- for (unsigned int i = 0; i<rsc->payments_len; i++)
- {
- struct DH_PurseDepositedCoin *coin = &rsc->payments[i];
- bool insufficient_funds = true;
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Make coin %u known\n",
- i);
- qs = DH_make_coin_known (&coin->cpi,
- connection,
- &coin->known_coin_id,
- mhd_ret);
- if (qs < 0)
- return qs;
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Insert open deposit %u known\n",
- i);
- qs = DH_plugin->insert_reserve_open_deposit (
- DH_plugin->cls,
- &coin->cpi,
- &coin->coin_sig,
- coin->known_coin_id,
- &coin->amount,
- &rsc->reserve_sig,
- rsc->reserve_pub,
- &insufficient_funds);
- /* 0 == qs is fine, then the coin was already
- spent for this very operation as identified
- by reserve_sig! */
- if (qs < 0)
- {
- if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
- return qs;
- GNUNET_break (0);
- *mhd_ret = TALER_MHD_reply_with_error (connection,
- MHD_HTTP_INTERNAL_SERVER_ERROR,
- TALER_EC_GENERIC_DB_STORE_FAILED,
- "insert_reserve_open_deposit");
- return qs;
- }
- if (insufficient_funds)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Handle insufficient funds\n");
- *mhd_ret
- = DH_RESPONSE_reply_coin_insufficient_funds (
- connection,
- TALER_EC_DONAU_GENERIC_INSUFFICIENT_FUNDS,
- &coin->cpi.denom_pub_hash,
- &coin->cpi.coin_pub);
- return GNUNET_DB_STATUS_HARD_ERROR;
- }
- }
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Do reserve open with reserve payment of %s\n",
- TALER_amount2s (&rsc->total));
- qs = DH_plugin->do_reserve_open (DH_plugin->cls,
- /* inputs */
- rsc->reserve_pub,
- &rsc->total,
- &rsc->reserve_payment,
- rsc->purse_limit,
- &rsc->reserve_sig,
- rsc->desired_expiration,
- rsc->timestamp,
- &rsc->gf->fees.account,
- /* outputs */
- &rsc->no_funds,
- &rsc->open_cost,
- &rsc->reserve_expiration);
- switch (qs)
- {
- case GNUNET_DB_STATUS_HARD_ERROR:
- GNUNET_break (0);
- *mhd_ret
- = TALER_MHD_reply_with_error (connection,
- MHD_HTTP_INTERNAL_SERVER_ERROR,
- TALER_EC_GENERIC_DB_FETCH_FAILED,
- "do_reserve_open");
- return GNUNET_DB_STATUS_HARD_ERROR;
- case GNUNET_DB_STATUS_SOFT_ERROR:
- return qs;
- case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS:
- *mhd_ret
- = TALER_MHD_reply_with_error (connection,
- MHD_HTTP_NOT_FOUND,
- TALER_EC_DONAU_GENERIC_RESERVE_UNKNOWN,
- NULL);
- return GNUNET_DB_STATUS_HARD_ERROR;
- case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT:
- break;
- }
- if (rsc->no_funds)
- {
- DH_plugin->rollback (DH_plugin->cls);
- *mhd_ret
- = DH_RESPONSE_reply_reserve_insufficient_balance (
- connection,
- TALER_EC_DONAU_RESERVES_OPEN_INSUFFICIENT_FUNDS,
- &rsc->reserve_payment,
- rsc->reserve_pub);
- return GNUNET_DB_STATUS_HARD_ERROR;
- }
- return qs;
-}
-
-
-MHD_RESULT
-DH_handler_reserves_open (struct DH_RequestContext *rc,
- const struct TALER_ReservePublicKeyP *reserve_pub,
- const json_t *root)
-{
- struct ReserveOpenContext rsc;
- const json_t *payments;
- struct GNUNET_JSON_Specification spec[] = {
- GNUNET_JSON_spec_timestamp ("request_timestamp",
- &rsc.timestamp),
- GNUNET_JSON_spec_timestamp ("reserve_expiration",
- &rsc.desired_expiration),
- GNUNET_JSON_spec_fixed_auto ("reserve_sig",
- &rsc.reserve_sig),
- GNUNET_JSON_spec_uint32 ("purse_limit",
- &rsc.purse_limit),
- GNUNET_JSON_spec_array_const ("payments",
- &payments),
- TALER_JSON_spec_amount ("reserve_payment",
- DH_currency,
- &rsc.reserve_payment),
- GNUNET_JSON_spec_end ()
- };
-
- rsc.reserve_pub = reserve_pub;
- {
- enum GNUNET_GenericReturnValue res;
-
- res = TALER_MHD_parse_json_data (rc->connection,
- root,
- spec);
- if (GNUNET_SYSERR == res)
- {
- GNUNET_break (0);
- return MHD_NO; /* hard failure */
- }
- if (GNUNET_NO == res)
- {
- GNUNET_break_op (0);
- return MHD_YES; /* failure */
- }
- }
-
- {
- struct GNUNET_TIME_Timestamp now;
-
- now = GNUNET_TIME_timestamp_get ();
- if (! GNUNET_TIME_absolute_approx_eq (now.abs_time,
- rsc.timestamp.abs_time,
- TIMESTAMP_TOLERANCE))
- {
- GNUNET_break_op (0);
- return TALER_MHD_reply_with_error (rc->connection,
- MHD_HTTP_BAD_REQUEST,
- TALER_EC_DONAU_GENERIC_CLOCK_SKEW,
- NULL);
- }
- }
-
- rsc.payments_len = json_array_size (payments);
- rsc.payments = GNUNET_new_array (rsc.payments_len,
- struct DH_PurseDepositedCoin);
- rsc.total = rsc.reserve_payment;
- for (unsigned int i = 0; i<rsc.payments_len; i++)
- {
- struct DH_PurseDepositedCoin *coin = &rsc.payments[i];
- enum GNUNET_GenericReturnValue res;
-
- res = DH_common_purse_deposit_parse_coin (
- rc->connection,
- coin,
- json_array_get (payments,
- i));
- if (GNUNET_SYSERR == res)
- {
- GNUNET_break (0);
- cleanup_rsc (&rsc);
- return MHD_NO; /* hard failure */
- }
- if (GNUNET_NO == res)
- {
- GNUNET_break_op (0);
- cleanup_rsc (&rsc);
- return MHD_YES; /* failure */
- }
- if (0 >
- TALER_amount_add (&rsc.total,
- &rsc.total,
- &coin->amount_minus_fee))
- {
- GNUNET_break (0);
- cleanup_rsc (&rsc);
- return TALER_MHD_reply_with_error (rc->connection,
- MHD_HTTP_INTERNAL_SERVER_ERROR,
-
TALER_EC_GENERIC_FAILED_COMPUTE_AMOUNT,
- NULL);
- }
- }
-
- {
- struct DH_KeyStateHandle *keys;
-
- keys = DH_keys_get_state ();
- if (NULL == keys)
- {
- GNUNET_break (0);
- cleanup_rsc (&rsc);
- return TALER_MHD_reply_with_error (rc->connection,
- MHD_HTTP_INTERNAL_SERVER_ERROR,
- TALER_EC_DONAU_GENERIC_KEYS_MISSING,
- NULL);
- }
- rsc.gf = DH_keys_global_fee_by_time (keys,
- rsc.timestamp);
- }
- if (NULL == rsc.gf)
- {
- GNUNET_break (0);
- cleanup_rsc (&rsc);
- return TALER_MHD_reply_with_error (rc->connection,
- MHD_HTTP_INTERNAL_SERVER_ERROR,
-
TALER_EC_DONAU_GENERIC_BAD_CONFIGURATION,
- NULL);
- }
-
- if (GNUNET_OK !=
- TALER_wallet_reserve_open_verify (&rsc.reserve_payment,
- rsc.timestamp,
- rsc.desired_expiration,
- rsc.purse_limit,
- reserve_pub,
- &rsc.reserve_sig))
- {
- GNUNET_break_op (0);
- cleanup_rsc (&rsc);
- return TALER_MHD_reply_with_error (rc->connection,
- MHD_HTTP_FORBIDDEN,
-
TALER_EC_DONAU_RESERVES_OPEN_BAD_SIGNATURE,
- NULL);
- }
-
- {
- MHD_RESULT mhd_ret;
-
- if (GNUNET_OK !=
- DH_DB_run_transaction (rc->connection,
- "reserve open",
- DH_MT_REQUEST_OTHER,
- &mhd_ret,
- &reserve_open_transaction,
- &rsc))
- {
- cleanup_rsc (&rsc);
- return mhd_ret;
- }
- }
-
- {
- MHD_RESULT mhd_ret;
-
- mhd_ret = reply_reserve_open_success (rc->connection,
- &rsc);
- cleanup_rsc (&rsc);
- return mhd_ret;
- }
-}
-
-
-/* end of taler-donau-httpd_reserves_open.c */
diff --git a/src/donau/donau-httpd_charities_open.h
b/src/donau/donau-httpd_charities_open.h
deleted file mode 100644
index 373cbb8..0000000
--- a/src/donau/donau-httpd_charities_open.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 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 CHARITYABILITY 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 taler-donau-httpd_reserves_open.h
- * @brief Handle /reserves/$RESERVE_PUB/open requests
- * @author Christian Grothoff
- */
-#ifndef DONAU_HTTPD_RESERVES_OPEN_H
-#define DONAU_HTTPD_RESERVES_OPEN_H
-
-#include <microhttpd.h>
-#include "taler-donau-httpd.h"
-
-
-/**
- * Handle a POST "/reserves/$RID/open" request.
- *
- * @param rc request context
- * @param reserve_pub public key of the reserve
- * @param root uploaded body from the client
- * @return MHD result code
- */
-MHD_RESULT
-DH_handler_reserves_open (struct DH_RequestContext *rc,
- const struct TALER_ReservePublicKeyP *reserve_pub,
- const json_t *root);
-
-#endif
diff --git a/src/donau/donau-httpd_charities_status.c
b/src/donau/donau-httpd_charities_status.c
deleted file mode 100644
index e0a6207..0000000
--- a/src/donau/donau-httpd_charities_status.c
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2014-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 CHARITYABILITY 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 taler-donau-httpd_reserves_status.c
- * @brief Handle /reserves/$RESERVE_PUB STATUS requests
- * @author Florian Dold
- * @author Benedikt Mueller
- * @author Christian Grothoff
- */
-#include "taler/platform.h"
-#include <gnunet/gnunet_util_lib.h>
-#include <jansson.h>
-#include "taler/taler_mhd_lib.h"
-#include "taler/taler_json_lib.h"
-#include "taler_dbevents.h"
-#include "taler-donau-httpd_keys.h"
-#include "taler-donau-httpd_reserves_status.h"
-#include "taler-donau-httpd_responses.h"
-
-/**
- * How far do we allow a client's time to be off when
- * checking the request timestamp?
- */
-#define TIMESTAMP_TOLERANCE \
- GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 15)
-
-
-/**
- * Closure for #reserve_status_transaction.
- */
-struct ReserveStatusContext
-{
- /**
- * Public key of the reserve the inquiry is about.
- */
- const struct TALER_ReservePublicKeyP *reserve_pub;
-
- /**
- * History of the reserve, set in the callback.
- */
- struct DONAUDB_ReserveHistory *rh;
-
- /**
- * Sum of incoming transactions within the returned history.
- * (currently not used).
- */
- struct TALER_Amount balance_in;
-
- /**
- * Sum of outgoing transactions within the returned history.
- * (currently not used).
- */
- struct TALER_Amount balance_out;
-
- /**
- * Current reserve balance.
- */
- struct TALER_Amount balance;
-};
-
-
-/**
- * Send reserve status to client.
- *
- * @param connection connection to the client
- * @param rhc reserve history to return
- * @return MHD result code
- */
-static MHD_RESULT
-reply_reserve_status_success (struct MHD_Connection *connection,
- const struct ReserveStatusContext *rhc)
-{
- const struct DONAUDB_ReserveHistory *rh = rhc->rh;
- json_t *json_history;
-
- json_history = DH_RESPONSE_compile_reserve_history (rh);
- if (NULL == json_history)
- return TALER_MHD_reply_with_error (connection,
- MHD_HTTP_INTERNAL_SERVER_ERROR,
-
TALER_EC_GENERIC_JSON_ALLOCATION_FAILURE,
- NULL);
- return TALER_MHD_REPLY_JSON_PACK (
- connection,
- MHD_HTTP_OK,
- TALER_JSON_pack_amount ("balance",
- &rhc->balance),
- GNUNET_JSON_pack_array_steal ("history",
- json_history));
-}
-
-
-/**
- * Function implementing /reserves/ STATUS transaction.
- * Execute a /reserves/ STATUS. Given the public key of a reserve,
- * return the associated transaction history. Runs the
- * transaction logic; IF it returns a non-error code, the transaction
- * logic MUST NOT queue a MHD response. IF it returns an hard error,
- * the transaction logic MUST queue a MHD response and set @a mhd_ret.
- * IF it returns the soft error code, the function MAY be called again
- * to retry and MUST not queue a MHD response.
- *
- * @param cls a `struct ReserveStatusContext *`
- * @param connection MHD request which triggered the transaction
- * @param[out] mhd_ret set to MHD response status for @a connection,
- * if transaction failed (!); unused
- * @return transaction status
- */
-static enum GNUNET_DB_QueryStatus
-reserve_status_transaction (void *cls,
- struct MHD_Connection *connection,
- MHD_RESULT *mhd_ret)
-{
- struct ReserveStatusContext *rsc = cls;
- enum GNUNET_DB_QueryStatus qs;
-
- qs = DH_plugin->get_reserve_status (DH_plugin->cls,
- rsc->reserve_pub,
- &rsc->balance_in,
- &rsc->balance_out,
- &rsc->rh);
- if (GNUNET_DB_STATUS_HARD_ERROR == qs)
- {
- GNUNET_break (0);
- *mhd_ret
- = TALER_MHD_reply_with_error (connection,
- MHD_HTTP_INTERNAL_SERVER_ERROR,
- TALER_EC_GENERIC_DB_FETCH_FAILED,
- "get_reserve_status");
- }
- qs = DH_plugin->get_reserve_balance (DH_plugin->cls,
- rsc->reserve_pub,
- &rsc->balance);
- if (GNUNET_DB_STATUS_HARD_ERROR == qs)
- {
- GNUNET_break (0);
- *mhd_ret
- = TALER_MHD_reply_with_error (connection,
- MHD_HTTP_INTERNAL_SERVER_ERROR,
- TALER_EC_GENERIC_DB_FETCH_FAILED,
- "get_reserve_balance");
- }
- return qs;
-}
-
-
-MHD_RESULT
-DH_handler_reserves_status (struct DH_RequestContext *rc,
- const struct TALER_ReservePublicKeyP *reserve_pub,
- const json_t *root)
-{
- struct ReserveStatusContext rsc;
- MHD_RESULT mhd_ret;
- struct GNUNET_TIME_Timestamp timestamp;
- struct TALER_ReserveSignatureP reserve_sig;
- struct GNUNET_JSON_Specification spec[] = {
- GNUNET_JSON_spec_timestamp ("request_timestamp",
- ×tamp),
- GNUNET_JSON_spec_fixed_auto ("reserve_sig",
- &reserve_sig),
- GNUNET_JSON_spec_end ()
- };
- struct GNUNET_TIME_Timestamp now;
-
- rsc.reserve_pub = reserve_pub;
- {
- enum GNUNET_GenericReturnValue res;
-
- res = TALER_MHD_parse_json_data (rc->connection,
- root,
- spec);
- if (GNUNET_SYSERR == res)
- {
- GNUNET_break (0);
- return MHD_NO; /* hard failure */
- }
- if (GNUNET_NO == res)
- {
- GNUNET_break_op (0);
- return MHD_YES; /* failure */
- }
- }
- now = GNUNET_TIME_timestamp_get ();
- if (! GNUNET_TIME_absolute_approx_eq (now.abs_time,
- timestamp.abs_time,
- TIMESTAMP_TOLERANCE))
- {
- GNUNET_break_op (0);
- return TALER_MHD_reply_with_error (rc->connection,
- MHD_HTTP_BAD_REQUEST,
- TALER_EC_DONAU_GENERIC_CLOCK_SKEW,
- NULL);
- }
- if (GNUNET_OK !=
- TALER_wallet_reserve_status_verify (timestamp,
- reserve_pub,
- &reserve_sig))
- {
- GNUNET_break_op (0);
- return TALER_MHD_reply_with_error (rc->connection,
- MHD_HTTP_FORBIDDEN,
-
TALER_EC_DONAU_RESERVES_STATUS_BAD_SIGNATURE,
- NULL);
- }
- rsc.rh = NULL;
- if (GNUNET_OK !=
- DH_DB_run_transaction (rc->connection,
- "get reserve status",
- DH_MT_REQUEST_OTHER,
- &mhd_ret,
- &reserve_status_transaction,
- &rsc))
- {
- return mhd_ret;
- }
- if (NULL == rsc.rh)
- {
- return TALER_MHD_reply_with_error (rc->connection,
- MHD_HTTP_NOT_FOUND,
- TALER_EC_DONAU_RESERVES_STATUS_UNKNOWN,
- NULL);
- }
- mhd_ret = reply_reserve_status_success (rc->connection,
- &rsc);
- DH_plugin->free_reserve_history (DH_plugin->cls,
- rsc.rh);
- return mhd_ret;
-}
-
-
-/* end of taler-donau-httpd_reserves_status.c */
diff --git a/src/donau/donau-httpd_charities_status.h
b/src/donau/donau-httpd_charities_status.h
deleted file mode 100644
index e45d61e..0000000
--- a/src/donau/donau-httpd_charities_status.h
+++ /dev/null
@@ -1,43 +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 CHARITYABILITY 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 taler-donau-httpd_reserves_status.h
- * @brief Handle /reserves/$RESERVE_PUB STATUS requests
- * @author Florian Dold
- * @author Benedikt Mueller
- * @author Christian Grothoff
- */
-#ifndef DONAU_HTTPD_RESERVES_STATUS_H
-#define DONAU_HTTPD_RESERVES_STATUS_H
-
-#include <microhttpd.h>
-#include "taler-donau-httpd.h"
-
-
-/**
- * Handle a POST "/reserves/$RID/status" request.
- *
- * @param rc request context
- * @param reserve_pub public key of the reserve
- * @param root uploaded body from the client
- * @return MHD result code
- */
-MHD_RESULT
-DH_handler_reserves_status (struct DH_RequestContext *rc,
- const struct TALER_ReservePublicKeyP *reserve_pub,
- const json_t *root);
-
-#endif
diff --git a/src/donau/donau-httpd_csr.c b/src/donau/donau-httpd_csr.c
index 530f06f..ffef81d 100644
--- a/src/donau/donau-httpd_csr.c
+++ b/src/donau/donau-httpd_csr.c
@@ -34,8 +34,8 @@
MHD_RESULT
DH_handler_csr_withdraw (struct DH_RequestContext *rc,
- const json_t *root,
- const char *const args[])
+ const json_t *root,
+ const char *const args[])
{
struct TALER_CsNonce nonce;
struct TALER_DenominationHashP denom_pub_hash;
@@ -74,9 +74,9 @@ DH_handler_csr_withdraw (struct DH_RequestContext *rc,
NULL);
}
dk = DH_keys_denomination_by_hash_from_state (ksh,
- &denom_pub_hash,
- NULL,
- NULL);
+ &denom_pub_hash,
+ NULL,
+ NULL);
if (NULL == dk)
{
return DH_RESPONSE_reply_unknown_denom_pub_hash (
@@ -120,8 +120,8 @@ DH_handler_csr_withdraw (struct DH_RequestContext *rc,
};
ec = DH_keys_denomination_cs_r_pub (&cdd,
- false,
- &ewv.details.cs_values);
+ false,
+ &ewv.details.cs_values);
if (TALER_EC_NONE != ec)
{
GNUNET_break (0);
diff --git a/src/donau/donau-httpd_csr.h b/src/donau/donau-httpd_csr.h
index e757060..3c8bb2b 100644
--- a/src/donau/donau-httpd_csr.h
+++ b/src/donau/donau-httpd_csr.h
@@ -36,7 +36,7 @@
*/
MHD_RESULT
DH_handler_csr_withdraw (struct DH_RequestContext *rc,
- const json_t *root,
- const char *const args[]);
+ const json_t *root,
+ const char *const args[]);
#endif
diff --git a/src/donau/donau-httpd_db.c b/src/donau/donau-httpd_db.c
index 7b54f62..993d512 100644
--- a/src/donau/donau-httpd_db.c
+++ b/src/donau/donau-httpd_db.c
@@ -95,9 +95,6 @@ DH_DB_run_transaction (struct MHD_Connection *connection,
if (0 > qs)
DH_plugin->rollback (DH_plugin->cls);
}
- /* make sure callback did not violate invariants! */
- GNUNET_assert ( (NULL == mhd_ret) ||
- (-1 == (int) *mhd_ret) );
if (0 <= qs)
return GNUNET_OK;
DH_METRICS_num_conflict[mt]++;
diff --git a/src/donau/donau-httpd_keys.c b/src/donau/donau-httpd_keys.c
index 3ef17ce..a427676 100644
--- a/src/donau/donau-httpd_keys.c
+++ b/src/donau/donau-httpd_keys.c
@@ -41,164 +41,6 @@
#define KEYS_TIMEOUT GNUNET_TIME_UNIT_MINUTES
-/**
- * Information about a denomination on offer by the denomination helper.
- */
-struct HelperDonationUnit
-{
-
- // maybe change to year unsigned int later -> many associated changes
- /**
- * When will the helper start to use this key for signing?
- */
- struct GNUNET_TIME_Timestamp start_time;
-
-
- /**
- * For how long will the helper allow signing? 0 if
- * the key was revoked or purged.
- */
- struct GNUNET_TIME_Relative validity_duration;
-
-
- /**
- * Hash of the full denomination key.
- */
- struct TALER_DenominationHashP h_denom_pub;
-
- /**
- * The (full) public key.
- */
- struct TALER_DenominationPublicKey denom_pub;
-
- /**
- * Details depend on the @e denom_pub.cipher type.
- */
- union
- {
-
- /**
- * Hash of the RSA key.
- */
- struct TALER_RsaPubHashP h_rsa;
-
- /**
- * Hash of the CS key.
- */
- struct TALER_CsPubHashP h_cs;
-
- } h_details;
-
- /**
- * Name in configuration section for this denomination type.
- */
- char *section_name;
-
-
-};
-
-
-/**
- * Information about a signing key on offer by the esign helper.
- */
-struct HelperSignkey
-{
-
- /**
- * The public key.
- */
- struct DONAU_DonauPublicKeyP donau_pub;
-
- /**
- * Signature over this key from the security module's key.
- */
- struct TALER_SecurityModuleSignatureP sm_sig;
-
-};
-
-
-/**
- * State associated with the crypto helpers / security modules. NOT updated
- * when the #key_generation is updated (instead constantly kept in sync
- * whenever #DH_keys_get_state() is called).
- */
-struct HelperState
-{
-
- /**
- * Handle for the esign/EdDSA helper.
- */
- struct TALER_CRYPTO_DonauSignHelper *esh;
-
- /**
- * Handle for the denom/RSA helper.
- */
- struct TALER_CRYPTO_RsaDenominationHelper *rsadh;
-
- /**
- * Handle for the denom/CS helper.
- */
- struct TALER_CRYPTO_CsDenominationHelper *csdh;
-
- /**
- * Map from H(denom_pub) to `struct HelperDonationUnit` entries.
- */
- struct GNUNET_CONTAINER_MultiHashMap *denom_keys;
-
- /**
- * Map from H(rsa_pub) to `struct HelperDonationUnit` entries.
- */
- struct GNUNET_CONTAINER_MultiHashMap *rsa_keys;
-
- /**
- * Map from H(cs_pub) to `struct HelperDonationUnit` entries.
- */
- struct GNUNET_CONTAINER_MultiHashMap *cs_keys;
-
- /**
- * Map from `struct TALER_DonauPublicKey` to `struct HelperSignkey`
- * entries. Based on the fact that a `struct GNUNET_PeerIdentity` is also
- * an EdDSA public key.
- */
- struct GNUNET_CONTAINER_MultiPeerMap *esign_keys;
-
-};
-
-
-/**
- * Entry in (sorted) array with possible pre-build responses for /keys.
- * We keep pre-build responses for the various (valid) cherry-picking
- * values around.
- */
-struct KeysResponseData
-{
-
- /**
- * Response to return if the client supports (deflate) compression.
- */
- struct MHD_Response *response_compressed;
-
- /**
- * Response to return if the client does not support compression.
- */
- struct MHD_Response *response_uncompressed;
-
- /**
- * ETag for these responses.
- */
- char *etag;
-
- /**
- * Cherry-picking timestamp the client must have set for this
- * response to be valid. 0 if this is the "full" response.
- * The client's request must include this date or a higher one
- * for this response to be applicable.
- */
- struct GNUNET_TIME_Timestamp cherry_pick_date;
-
-};
-
-
/**
* @brief All information about an donau online signing key (which is used to
* sign messages from the donau).
@@ -218,1233 +60,9 @@ struct SigningKey
};
-struct DH_KeyStateHandle
-{
-
- /**
- * Mapping from denomination keys to denomination key issue struct.
- * Used to lookup the key by hash.
- */
- struct GNUNET_CONTAINER_MultiHashMap *denomkey_map;
-
- /**
- * Map from `struct TALER_DonauPublicKey` to `struct SigningKey`
- * entries. Based on the fact that a `struct GNUNET_PeerIdentity` is also
- * an EdDSA public key.
- */
- struct GNUNET_CONTAINER_MultiPeerMap *signkey_map;
-
- /**
- * Sorted array of responses to /keys (MUST be sorted by cherry-picking
date) of
- * length @e krd_array_length;
- */
- struct KeysResponseData *krd_array;
-
- /**
- * Length of the @e krd_array.
- */
- unsigned int krd_array_length;
-
- /**
- * Information we track for thecrypto helpers. Preserved
- * when the @e key_generation changes, thus kept separate.
- */
- struct HelperState *helpers;
-
- /**
- * Cached reply for a GET /management/keys request. Used so we do not
- * re-create the reply every time.
- */
- json_t *management_keys_reply;
-
- /**
- * For which (global) key_generation was this data structure created?
- * Used to check when we are outdated and need to be re-generated.
- */
- uint64_t key_generation;
-
- /**
- * True if #finish_keys_response() was not yet run and this key state
- * is only suitable for the /management/keys API.
- */
- bool management_only;
-
-};
-
-/**
- * Stores the latest generation of our key state.
- */
-static struct DH_KeyStateHandle *key_state;
-
-/**
- * Counter incremented whenever we have a reason to re-build the keys because
- * something external changed. See #DH_keys_get_state() and
- * #DH_keys_update_states() for uses of this variable.
- */
-static uint64_t key_generation;
-
-/**
- * Task to force timeouts on /keys requests.
- */
-static struct GNUNET_SCHEDULER_Task *keys_tt;
-
-/**
- * For how long should a signing key be legally retained?
- * Configuration value.
- */
-static struct GNUNET_TIME_Relative signkey_legal_duration;
-
-/**
- * What type of asset are we dealing with here?
- */
-static char *asset_type;
-
-/**
- * RSA security module public key, all zero if not known.
- */
-static struct TALER_SecurityModulePublicKeyP denom_rsa_sm_pub;
-
-/**
- * CS security module public key, all zero if not known.
- */
-static struct TALER_SecurityModulePublicKeyP denom_cs_sm_pub;
-
-/**
- * EdDSA security module public key, all zero if not known.
- */
-static struct TALER_SecurityModulePublicKeyP esign_sm_pub;
-
/**
* Are we shutting down?
*/
static bool terminating;
-
-/**
- * Called on each denomination key. Checks that the key still works.
- *
- * @param cls NULL
- * @param hc denomination hash (unused)
- * @param value a `struct DH_DonationUnitKey`
- * @return #GNUNET_OK
- */
-static enum GNUNET_GenericReturnValue
-check_dk (void *cls,
- const struct GNUNET_HashCode *hc,
- void *value)
-{
- struct DH_DonationUnitKey *dk = value;
-
- (void) cls;
- (void) hc;
- GNUNET_assert (TALER_DENOMINATION_INVALID != dk->denom_pub.cipher);
- if (TALER_DENOMINATION_RSA == dk->denom_pub.cipher)
- GNUNET_assert (GNUNET_CRYPTO_rsa_public_key_check (
- dk->denom_pub.details.rsa_public_key));
- // nothing to do for TALER_DENOMINATION_CS
- return GNUNET_OK;
-}
-
-
-void
-DH_check_invariants ()
-{
- struct DH_KeyStateHandle *ksh;
-
- if (0 == DH_check_invariants_flag)
- return;
- ksh = DH_keys_get_state ();
- if (NULL == ksh)
- return;
- GNUNET_CONTAINER_multihashmap_iterate (ksh->denomkey_map,
- &check_dk,
- NULL);
-}
-
-
-/**
- * Clear memory for responses to "/keys" in @a ksh.
- *
- * @param[in,out] ksh key state to update
- */
-static void
-clear_response_cache (struct DH_KeyStateHandle *ksh)
-{
- for (unsigned int i = 0; i<ksh->krd_array_length; i++)
- {
- struct KeysResponseData *krd = &ksh->krd_array[i];
-
- MHD_destroy_response (krd->response_compressed);
- MHD_destroy_response (krd->response_uncompressed);
- GNUNET_free (krd->etag);
- }
- GNUNET_array_grow (ksh->krd_array,
- ksh->krd_array_length,
- 0);
-}
-
-
-/**
- * Check that the given RSA security module's public key is the one
- * we have pinned. If it does not match, we die hard.
- *
- * @param sm_pub RSA security module public key to check
- */
-static void
-check_denom_rsa_sm_pub (const struct TALER_SecurityModulePublicKeyP *sm_pub)
-{
- if (0 !=
- GNUNET_memcmp (sm_pub,
- &denom_rsa_sm_pub))
- {
- if (! GNUNET_is_zero (&denom_rsa_sm_pub))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Our RSA security module changed its key. This must not
happen.\n");
- GNUNET_assert (0);
- }
- denom_rsa_sm_pub = *sm_pub; /* TOFU ;-) Trust on first use?*/
- }
-}
-
-
-/**
- * Check that the given CS security module's public key is the one
- * we have pinned. If it does not match, we die hard.
- *
- * @param sm_pub RSA security module public key to check
- */
-static void
-check_denom_cs_sm_pub (const struct TALER_SecurityModulePublicKeyP *sm_pub)
-{
- if (0 !=
- GNUNET_memcmp (sm_pub,
- &denom_cs_sm_pub))
- {
- if (! GNUNET_is_zero (&denom_cs_sm_pub))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Our CS security module changed its key. This must not
happen.\n");
- GNUNET_assert (0);
- }
- denom_cs_sm_pub = *sm_pub; /* TOFU ;-) */
- }
-}
-
-
-/**
- * Check that the given EdDSA security module's public key is the one
- * we have pinned. If it does not match, we die hard.
- *
- * @param sm_pub EdDSA security module public key to check
- */
-static void
-check_esign_sm_pub (const struct TALER_SecurityModulePublicKeyP *sm_pub)
-{
- if (0 !=
- GNUNET_memcmp (sm_pub,
- &esign_sm_pub))
- {
- if (! GNUNET_is_zero (&esign_sm_pub))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Our EdDSA security module changed its key. This must not
happen.\n");
- GNUNET_assert (0);
- }
- esign_sm_pub = *sm_pub; /* TOFU ;-) */
- }
-}
-
-
-/**
- * Helper function for #destroy_key_helpers to free all entries
- * in the `denom_keys` map.
- *
- * @param cls the `struct HelperDonationUnit`
- * @param h_denom_pub hash of the denomination public key
- * @param value the `struct HelperDonationUnit` to release
- * @return #GNUNET_OK (continue to iterate)
- */
-static enum GNUNET_GenericReturnValue
-free_denom_cb (void *cls,
- const struct GNUNET_HashCode *h_denom_pub,
- void *value)
-{
- struct HelperDonationUnit *hd = value;
-
- (void) cls;
- (void) h_denom_pub;
- TALER_denom_pub_free (&hd->denom_pub);
- GNUNET_free (hd->section_name);
- GNUNET_free (hd);
- return GNUNET_OK;
-}
-
-
-/**
- * Helper function for #destroy_key_helpers to free all entries
- * in the `esign_keys` map.
- *
- * @param cls the `struct HelperSignkey`
- * @param pid unused, matches the donau public key
- * @param value the `struct HelperSignkey` to release
- * @return #GNUNET_OK (continue to iterate)
- */
-static enum GNUNET_GenericReturnValue
-free_esign_cb (void *cls,
- const struct GNUNET_PeerIdentity *pid,
- void *value)
-{
- struct HelperSignkey *hsk = value;
-
- (void) cls;
- (void) pid;
- GNUNET_free (hsk);
- return GNUNET_OK;
-}
-
-
-/**
- * Destroy helper state. Does NOT call free() on @a hs, as that
- * state is not separately allocated! Dual to #setup_key_helpers().
- *
- * @param[in] hs helper state to free, but NOT the @a hs pointer itself!
- */
-static void
-destroy_key_helpers (struct HelperState *hs)
-{
- GNUNET_CONTAINER_multihashmap_iterate (hs->denom_keys,
- &free_denom_cb,
- hs);
- GNUNET_CONTAINER_multihashmap_destroy (hs->rsa_keys);
- hs->rsa_keys = NULL;
- GNUNET_CONTAINER_multihashmap_destroy (hs->cs_keys);
- hs->cs_keys = NULL;
- GNUNET_CONTAINER_multihashmap_destroy (hs->denom_keys);
- hs->denom_keys = NULL;
- GNUNET_CONTAINER_multipeermap_iterate (hs->esign_keys,
- &free_esign_cb,
- hs);
- GNUNET_CONTAINER_multipeermap_destroy (hs->esign_keys);
- hs->esign_keys = NULL;
- if (NULL != hs->rsadh)
- {
- TALER_CRYPTO_helper_rsa_disconnect (hs->rsadh);
- hs->rsadh = NULL;
- }
- if (NULL != hs->csdh)
- {
- TALER_CRYPTO_helper_cs_disconnect (hs->csdh);
- hs->csdh = NULL;
- }
- if (NULL != hs->esh)
- {
- TALER_CRYPTO_helper_esign_disconnect (hs->esh);
- hs->esh = NULL;
- }
-}
-
-
-/**
- * Function called with information about available keys for signing. Usually
- * only called once per key upon connect. Also called again in case a key is
- * being revoked, in that case with an @a end_time of zero.
- *
- * @param cls closure with the `struct HelperState *`
- * @param start_time when does the key become available for signing;
- * zero if the key has been revoked or purged
- * @param validity_duration how long does the key remain available for signing;
- * zero if the key has been revoked or purged
- * @param donau_pub the public key itself, NULL if the key was revoked or
purged
- * @param sm_pub public key of the security module, NULL if the key was
revoked or purged
- * @param sm_sig signature from the security module, NULL if the key was
revoked or purged
- * The signature was already verified against @a sm_pub.
- */
-static void
-helper_esign_cb (
- void *cls,
- struct GNUNET_TIME_Timestamp start_time,
- struct GNUNET_TIME_Relative validity_duration,
- const struct DONAU_DonauPublicKeyP *donau_pub,
- const struct TALER_SecurityModulePublicKeyP *sm_pub,
- const struct TALER_SecurityModuleSignatureP *sm_sig)
-{
- struct HelperState *hs = cls;
- struct HelperSignkey *hsk;
- struct GNUNET_PeerIdentity pid;
-
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "EdDSA helper announces signing key %s with validity %s\n",
- TALER_B2S (donau_pub),
- GNUNET_STRINGS_relative_time_to_string (validity_duration,
- GNUNET_NO));
- key_generation++;
- DH_resume_keys_requests (false);
- pid.public_key = donau_pub->eddsa_pub;
- hsk = GNUNET_CONTAINER_multipeermap_get (hs->esign_keys,
- &pid);
- if (NULL != hsk)
- {
- /* should be just an update (revocation!), so update existing entry */
- hsk->validity_duration = validity_duration;
- return;
- }
- GNUNET_assert (NULL != sm_pub);
- check_esign_sm_pub (sm_pub);
- hsk = GNUNET_new (struct HelperSignkey);
- hsk->start_time = start_time;
- hsk->validity_duration = validity_duration;
- hsk->donau_pub = *donau_pub;
- hsk->sm_sig = *sm_sig;
- GNUNET_assert (
- GNUNET_OK ==
- GNUNET_CONTAINER_multipeermap_put (
- hs->esign_keys,
- &pid,
- hsk,
- GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
-}
-
-
-/**
- * Setup helper state.
- *
- * @param[out] hs helper state to initialize
- * @return #GNUNET_OK on success
- */
-static enum GNUNET_GenericReturnValue
-setup_key_helpers (struct HelperState *hs)
-{
- hs->denom_keys
- = GNUNET_CONTAINER_multihashmap_create (1024,
- GNUNET_YES);
- hs->rsa_keys
- = GNUNET_CONTAINER_multihashmap_create (1024,
- GNUNET_YES);
- hs->cs_keys
- = GNUNET_CONTAINER_multihashmap_create (1024,
- GNUNET_YES);
- hs->esign_keys
- = GNUNET_CONTAINER_multipeermap_create (32,
- GNUNET_NO /* MUST BE NO! */);
- hs->rsadh = TALER_CRYPTO_helper_rsa_connect (DH_cfg,
- &helper_rsa_cb,
- hs);
- if (NULL == hs->rsadh)
- {
- destroy_key_helpers (hs);
- return GNUNET_SYSERR;
- }
- hs->csdh = TALER_CRYPTO_helper_cs_connect (DH_cfg,
- &helper_cs_cb,
- hs);
- if (NULL == hs->csdh)
- {
- destroy_key_helpers (hs);
- return GNUNET_SYSERR;
- }
- hs->esh = TALER_CRYPTO_helper_esign_connect (DH_cfg,
- &helper_esign_cb,
- hs);
- if (NULL == hs->esh)
- {
- destroy_key_helpers (hs);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Synchronize helper state. Polls the key helper for updates.
- *
- * @param[in,out] hs helper state to synchronize
- */
-static void
-sync_key_helpers (struct HelperState *hs)
-{
- TALER_CRYPTO_helper_rsa_poll (hs->rsadh);
- TALER_CRYPTO_helper_cs_poll (hs->csdh);
- TALER_CRYPTO_helper_esign_poll (hs->esh);
-}
-
-
-/**
- * Free denomination key data.
- *
- * @param cls a `struct DH_KeyStateHandle`, unused
- * @param h_denom_pub hash of the denomination public key, unused
- * @param value a `struct DH_DonationUnitKey` to free
- * @return #GNUNET_OK (continue to iterate)
- */
-static enum GNUNET_GenericReturnValue
-clear_donation_unit_cb (void *cls,
- const struct GNUNET_HashCode *h_denom_pub,
- void *value)
-{
- struct DH_DonationUnitKey *dk = value;
- struct DH_AuditorSignature *as;
-
- (void) cls;
- (void) h_denom_pub;
- TALER_denom_pub_free (&dk->denom_pub);
- while (NULL != (as = dk->as_head))
- {
- GNUNET_CONTAINER_DLL_remove (dk->as_head,
- dk->as_tail,
- as);
- GNUNET_free (as);
- }
- GNUNET_free (dk);
- return GNUNET_OK;
-}
-
-
-/**
- * Free denomination key data.
- *
- * @param cls a `struct DH_KeyStateHandle`, unused
- * @param pid the online signing key (type-disguised), unused
- * @param value a `struct SigningKey` to free
- * @return #GNUNET_OK (continue to iterate)
- */
-static enum GNUNET_GenericReturnValue
-clear_signkey_cb (void *cls,
- const struct GNUNET_PeerIdentity *pid,
- void *value)
-{
- struct SigningKey *sk = value;
-
- (void) cls;
- (void) pid;
- GNUNET_free (sk);
- return GNUNET_OK;
-}
-
-
-/**
- * Free resources associated with @a cls, possibly excluding
- * the helper data.
- *
- * @param[in] ksh key state to release
- * @param free_helper true to also release the helper state
- */
-static void
-destroy_key_state (struct DH_KeyStateHandle *ksh,
- bool free_helper)
-{
- clear_response_cache (ksh);
-
- GNUNET_CONTAINER_multihashmap_iterate (ksh->denomkey_map,
- &clear_denomination_cb,
- ksh);
- GNUNET_CONTAINER_multihashmap_destroy (ksh->denomkey_map);
- GNUNET_CONTAINER_multipeermap_iterate (ksh->signkey_map,
- &clear_signkey_cb,
- ksh);
- GNUNET_CONTAINER_multipeermap_destroy (ksh->signkey_map);
- if (free_helper)
- {
- destroy_key_helpers (ksh->helpers);
- GNUNET_free (ksh->helpers);
- }
- if (NULL != ksh->management_keys_reply)
- {
- json_decref (ksh->management_keys_reply);
- ksh->management_keys_reply = NULL;
- }
- GNUNET_free (ksh);
-}
-
-
-/**
- * Function called whenever another donau process has updated
- * the keys data in the database.
- *
- * @param cls NULL
- * @param extra unused
- * @param extra_size number of bytes in @a extra unused
- */
-static void
-keys_update_event_cb (void *cls,
- const void *extra,
- size_t extra_size)
-{
- (void) cls;
- (void) extra;
- (void) extra_size;
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Received /keys update event\n");
- DH_check_invariants ();
- key_generation++;
- DH_resume_keys_requests (false);
- DH_check_invariants ();
-}
-
-
-enum GNUNET_GenericReturnValue
-DH_keys_init ()
-{
- struct GNUNET_DB_EventHeaderP es = {
- .size = htons (sizeof (es)),
- .type = htons (TALER_DBEVENT_DONAU_KEYS_UPDATED),
- };
-
- if (GNUNET_OK !=
- GNUNET_CONFIGURATION_get_value_time (DH_cfg,
- "donau",
- "SIGNKEY_LEGAL_DURATION",
- &signkey_legal_duration))
- {
- GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
- "donau",
- "SIGNKEY_LEGAL_DURATION");
- return GNUNET_SYSERR;
- }
- if (GNUNET_OK !=
- GNUNET_CONFIGURATION_get_value_string (DH_cfg,
- "donau",
- "ASSET_TYPE",
- &asset_type))
- {
- GNUNET_log_config_missing (GNUNET_ERROR_TYPE_WARNING,
- "donau",
- "ASSET_TYPE");
- asset_type = GNUNET_strdup ("fiat");
- }
- keys_eh = DH_plugin->event_listen (DH_plugin->cls,
- GNUNET_TIME_UNIT_FOREVER_REL,
- &es,
- &keys_update_event_cb,
- NULL);
- if (NULL == keys_eh)
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Fully clean up our state.
- */
-void
-DH_keys_finished ()
-{
- if (NULL != keys_tt)
- {
- GNUNET_SCHEDULER_cancel (keys_tt);
- keys_tt = NULL;
- }
- if (NULL != key_state)
- destroy_key_state (key_state,
- true);
- if (NULL != keys_eh)
- {
- DH_plugin->event_listen_cancel (DH_plugin->cls,
- keys_eh);
- keys_eh = NULL;
- }
-}
-
-
-/**
- * Function called with information about the donau's denomination keys.
- *
- * @param cls closure with a `struct DH_KeyStateHandle *`
- * @param denom_pub public key of the denomination
- * @param h_denom_pub hash of @a denom_pub
- * @param meta meta data information about the denomination type (value, year)
- */
-static void
-denomination_info_cb (
- void *cls,
- const struct TALER_DenominationPublicKey *denom_pub,
- const struct TALER_DenominationHashP *h_denom_pub,
- const struct DONAUDB_DonationUnitKeyMetaData *meta)
-{
- struct DH_KeyStateHandle *ksh = cls;
- struct DH_DonationUnitKey *dk;
-
- GNUNET_assert (TALER_DENOMINATION_INVALID != denom_pub->cipher);
- if (GNUNET_TIME_absolute_is_zero (meta->start.abs_time) ||
- GNUNET_TIME_absolute_is_zero (meta->expire_withdraw.abs_time) ||
- GNUNET_TIME_absolute_is_zero (meta->expire_deposit.abs_time) ||
- GNUNET_TIME_absolute_is_zero (meta->expire_legal.abs_time) )
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Database contains invalid denomination key %s\n",
- GNUNET_h2s (&h_denom_pub->hash));
- return;
- }
- dk = GNUNET_new (struct DH_DonationUnitKey);
- TALER_denom_pub_deep_copy (&dk->denom_pub,
- denom_pub);
- dk->h_denom_pub = *h_denom_pub;
- dk->meta = *meta;
- dk->denom_pub.age_mask = meta->age_mask;
-
- GNUNET_assert (
- GNUNET_OK ==
- GNUNET_CONTAINER_multihashmap_put (ksh->denomkey_map,
- &dk->h_denom_pub.hash,
- dk,
-
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
-}
-
-
-/**
- * Function called with information about the donau's online signing keys.
- *
- * @param cls closure with a `struct DH_KeyStateHandle *`
- * @param donau_pub the public key
- * @param meta meta data information about the denomination type (expirations)
- */
-static void
-signkey_info_cb (
- void *cls,
- const struct DONAU_DonauPublicKeyP *donau_pub,
- const struct DONAUDB_SignkeyMetaData *meta)
-{
- struct DH_KeyStateHandle *ksh = cls;
- struct SigningKey *sk;
- struct GNUNET_PeerIdentity pid;
-
- sk = GNUNET_new (struct SigningKey);
- sk->donau_pub = *donau_pub;
- sk->meta = *meta;
- pid.public_key = donau_pub->eddsa_pub;
- GNUNET_assert (
- GNUNET_OK ==
- GNUNET_CONTAINER_multipeermap_put (ksh->signkey_map,
- &pid,
- sk,
-
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
-}
-
-
-/**
- * Closure for #add_sign_key_cb.
- */
-struct SignKeyCtx
-{
- /**
- * What is the current rotation frequency for signing keys. Updated.
- */
- struct GNUNET_TIME_Relative min_sk_frequency;
-
- /**
- * JSON array of signing keys (being created).
- */
- json_t *signkeys;
-};
-
-
-/**
- * Function called for all signing keys, used to build up the
- * respective JSON response.
- *
- * @param cls a `struct SignKeyCtx *` with the array to append keys to
- * @param pid the donau public key (in type disguise)
- * @param value a `struct SigningKey`
- * @return #GNUNET_OK (continue to iterate)
- */
-static enum GNUNET_GenericReturnValue
-add_sign_key_cb (void *cls,
- const struct GNUNET_PeerIdentity *pid,
- void *value)
-{
- struct SignKeyCtx *ctx = cls;
- struct SigningKey *sk = value;
-
- (void) pid;
- if (GNUNET_TIME_absolute_is_future (sk->meta.expire_sign.abs_time))
- {
- ctx->min_sk_frequency =
- GNUNET_TIME_relative_min (ctx->min_sk_frequency,
- GNUNET_TIME_absolute_get_difference (
- sk->meta.start.abs_time,
- sk->meta.expire_sign.abs_time));
- }
- GNUNET_assert (
- 0 ==
- json_array_append_new (
- ctx->signkeys,
- GNUNET_JSON_PACK (
- GNUNET_JSON_pack_timestamp ("stamp_start",
- sk->meta.start),
- GNUNET_JSON_pack_timestamp ("stamp_expire",
- sk->meta.expire_sign),
- GNUNET_JSON_pack_timestamp ("stamp_end",
- sk->meta.expire_legal),
- GNUNET_JSON_pack_data_auto ("key",
- &sk->donau_pub))));
- return GNUNET_OK;
-}
-
-
-/**
- * Closure for #add_denom_key_cb.
- */
-struct DenomKeyCtx
-{
- /**
- * Heap for sorting active denomination keys by start time.
- */
- struct GNUNET_CONTAINER_Heap *heap;
-
- /**
- * What is the minimum key rotation frequency of
- * valid denomination keys?
- */
- struct GNUNET_TIME_Relative min_dk_frequency;
-};
-
-struct DH_DonationUnitKey *
-DH_keys_denomination_by_hash (
- const struct TALER_DenominationHashP *h_denom_pub,
- struct MHD_Connection *conn,
- MHD_RESULT *mret)
-{
- struct DH_KeyStateHandle *ksh;
-
- ksh = DH_keys_get_state ();
- if (NULL == ksh)
- {
- *mret = TALER_MHD_reply_with_error (conn,
- MHD_HTTP_INTERNAL_SERVER_ERROR,
- TALER_EC_DONAU_GENERIC_KEYS_MISSING,
- NULL);
- return NULL;
- }
-
- return DH_keys_denomination_by_hash_from_state (ksh,
- h_denom_pub,
- conn,
- mret);
-}
-
-
-struct DH_DonationUnitKey *
-DH_keys_denomination_by_hash_from_state (
- const struct DH_KeyStateHandle *ksh,
- const struct TALER_DenominationHashP *h_denom_pub,
- struct MHD_Connection *conn,
- MHD_RESULT *mret)
-{
- struct DH_DonationUnitKey *dk;
-
- dk = GNUNET_CONTAINER_multihashmap_get (ksh->denomkey_map,
- &h_denom_pub->hash);
- if (NULL == dk)
- {
- if (NULL == conn)
- return NULL;
- *mret = DH_RESPONSE_reply_unknown_denom_pub_hash (conn,
- h_denom_pub);
- return NULL;
- }
- return dk;
-}
-
-
-enum TALER_ErrorCode
-DH_keys_denomination_sign (
- const struct DONAU_BlindedUniqueDonationIdentifierKeyPair *budi_key,
- bool for_melt,
- struct TALER_BlindedDenominationSignature *bs)
-{
- struct DH_KeyStateHandle *ksh;
- struct HelperDonationUnit *hd;
- const struct TALER_DenominationHashP *h_denom_pub = csd->h_denom_pub;
- const struct TALER_BlindedPlanchet *bp = csd->bp;
-
- ksh = DH_keys_get_state ();
- if (NULL == ksh)
- return TALER_EC_DONAU_GENERIC_KEYS_MISSING;
- hd = GNUNET_CONTAINER_multihashmap_get (ksh->helpers->denom_keys,
- &h_denom_pub->hash);
- if (NULL == hd)
- return TALER_EC_DONAU_GENERIC_DENOMINATION_KEY_UNKNOWN;
- if (bp->cipher != hd->denom_pub.cipher)
- return TALER_EC_GENERIC_INTERNAL_INVARIANT_FAILURE;
- switch (hd->denom_pub.cipher)
- {
- case TALER_DENOMINATION_RSA:
- DH_METRICS_num_signatures[DH_MT_SIGNATURE_RSA]++;
- {
- struct TALER_CRYPTO_RsaSignRequest rsr = {
- .h_rsa = &hd->h_details.h_rsa,
- .msg = bp->details.rsa_blinded_planchet.blinded_msg,
- .msg_size = bp->details.rsa_blinded_planchet.blinded_msg_size
- };
-
- return TALER_CRYPTO_helper_rsa_sign (
- ksh->helpers->rsadh,
- &rsr,
- bs);
- }
- case TALER_DENOMINATION_CS:
- DH_METRICS_num_signatures[DH_MT_SIGNATURE_CS]++;
- {
- struct TALER_CRYPTO_CsSignRequest csr;
-
- csr.h_cs = &hd->h_details.h_cs;
- csr.blinded_planchet = &bp->details.cs_blinded_planchet;
- return TALER_CRYPTO_helper_cs_sign (
- ksh->helpers->csdh,
- &csr,
- for_melt,
- bs);
- }
- default:
- return TALER_EC_GENERIC_INTERNAL_INVARIANT_FAILURE;
- }
-}
-
-
-enum TALER_ErrorCode
-DH_keys_donation_unit_batch_sign (
- const struct DONAU_BlindedUniqueDonationIdentifierKeyPair *budi_key,
- unsigned int csds_length,
- bool for_melt,
- struct TALER_BlindedDenominationSignature *bss)
-{
- struct DH_KeyStateHandle *ksh;
- struct HelperDonationUnit *hd;
- struct TALER_CRYPTO_RsaSignRequest rsrs[csds_length];
- struct TALER_CRYPTO_CsSignRequest csrs[csds_length];
- struct TALER_BlindedDenominationSignature rs[csds_length];
- struct TALER_BlindedDenominationSignature cs[csds_length];
- unsigned int rsrs_pos = 0;
- unsigned int csrs_pos = 0;
- enum TALER_ErrorCode ec;
-
- ksh = DH_keys_get_state ();
- if (NULL == ksh)
- return TALER_EC_DONAU_GENERIC_KEYS_MISSING;
- for (unsigned int i = 0; i<csds_length; i++)
- {
- const struct TALER_DenominationHashP *h_denom_pub = csds[i].h_denom_pub;
- const struct TALER_BlindedPlanchet *bp = csds[i].bp;
-
- hd = GNUNET_CONTAINER_multihashmap_get (ksh->helpers->denom_keys,
- &h_denom_pub->hash);
- if (NULL == hd)
- return TALER_EC_DONAU_GENERIC_DENOMINATION_KEY_UNKNOWN;
- if (bp->cipher != hd->denom_pub.cipher)
- return TALER_EC_GENERIC_INTERNAL_INVARIANT_FAILURE;
- switch (hd->denom_pub.cipher)
- {
- case TALER_DENOMINATION_RSA:
- rsrs[rsrs_pos].h_rsa = &hd->h_details.h_rsa;
- rsrs[rsrs_pos].msg
- = bp->details.rsa_blinded_planchet.blinded_msg;
- rsrs[rsrs_pos].msg_size
- = bp->details.rsa_blinded_planchet.blinded_msg_size;
- rsrs_pos++;
- break;
- case TALER_DENOMINATION_CS:
- csrs[csrs_pos].h_cs = &hd->h_details.h_cs;
- csrs[csrs_pos].blinded_planchet = &bp->details.cs_blinded_planchet;
- csrs_pos++;
- break;
- default:
- return TALER_EC_GENERIC_INTERNAL_INVARIANT_FAILURE;
- }
- }
-
- if ( (0 != csrs_pos) &&
- (0 != rsrs_pos) )
- {
- memset (rs,
- 0,
- sizeof (rs));
- memset (cs,
- 0,
- sizeof (cs));
- }
- ec = TALER_EC_NONE;
- if (0 != csrs_pos)
- {
- ec = TALER_CRYPTO_helper_cs_batch_sign (
- ksh->helpers->csdh,
- csrs,
- csrs_pos,
- for_melt,
- (0 == rsrs_pos) ? bss : cs);
- if (TALER_EC_NONE != ec)
- {
- for (unsigned int i = 0; i<csrs_pos; i++)
- TALER_blinded_denom_sig_free (&cs[i]);
- return ec;
- }
- DH_METRICS_num_signatures[DH_MT_SIGNATURE_CS] += csrs_pos;
- }
- if (0 != rsrs_pos)
- {
- ec = TALER_CRYPTO_helper_rsa_batch_sign (
- ksh->helpers->rsadh,
- rsrs,
- rsrs_pos,
- (0 == csrs_pos) ? bss : rs);
- if (TALER_EC_NONE != ec)
- {
- for (unsigned int i = 0; i<csrs_pos; i++)
- TALER_blinded_denom_sig_free (&cs[i]);
- for (unsigned int i = 0; i<rsrs_pos; i++)
- TALER_blinded_denom_sig_free (&rs[i]);
- return ec;
- }
- DH_METRICS_num_signatures[DH_MT_SIGNATURE_RSA] += rsrs_pos;
- }
-
- if ( (0 != csrs_pos) &&
- (0 != rsrs_pos) )
- {
- rsrs_pos = 0;
- csrs_pos = 0;
- for (unsigned int i = 0; i<csds_length; i++)
- {
- const struct TALER_BlindedPlanchet *bp = csds[i].bp;
-
- switch (bp->cipher)
- {
- case TALER_DENOMINATION_RSA:
- bss[i] = rs[rsrs_pos++];
- break;
- case TALER_DENOMINATION_CS:
- bss[i] = cs[csrs_pos++];
- break;
- default:
- GNUNET_assert (0);
- }
- }
- }
- return TALER_EC_NONE;
-}
-
-
-enum TALER_ErrorCode
-DH_keys_denomination_cs_r_pub (
- const struct DH_CsDeriveData *cdd,
- bool for_melt,
- struct TALER_DenominationCSPublicRPairP *r_pub)
-{
- const struct TALER_DenominationHashP *h_denom_pub = cdd->h_denom_pub;
- const struct TALER_CsNonce *nonce = cdd->nonce;
- struct DH_KeyStateHandle *ksh;
- struct HelperDonationUnit *hd;
-
- ksh = DH_keys_get_state ();
- if (NULL == ksh)
- {
- return TALER_EC_DONAU_GENERIC_KEYS_MISSING;
- }
- hd = GNUNET_CONTAINER_multihashmap_get (ksh->helpers->denom_keys,
- &h_denom_pub->hash);
- if (NULL == hd)
- {
- return TALER_EC_DONAU_GENERIC_DENOMINATION_KEY_UNKNOWN;
- }
- if (TALER_DENOMINATION_CS != hd->denom_pub.cipher)
- {
- return TALER_EC_GENERIC_INTERNAL_INVARIANT_FAILURE;
- }
-
- {
- struct TALER_CRYPTO_CsDeriveRequest cdr = {
- .h_cs = &hd->h_details.h_cs,
- .nonce = nonce
- };
- return TALER_CRYPTO_helper_cs_r_derive (ksh->helpers->csdh,
- &cdr,
- for_melt,
- r_pub);
- }
-}
-
-
-enum TALER_ErrorCode
-DH_keys_denomination_cs_batch_r_pub (
- const struct DH_CsDeriveData *cdds,
- unsigned int cdds_length,
- bool for_melt,
- struct TALER_DenominationCSPublicRPairP *r_pubs)
-{
- struct DH_KeyStateHandle *ksh;
- struct HelperDonationUnit *hd;
- struct TALER_CRYPTO_CsDeriveRequest cdrs[cdds_length];
-
- ksh = DH_keys_get_state ();
- if (NULL == ksh)
- {
- return TALER_EC_DONAU_GENERIC_KEYS_MISSING;
- }
- for (unsigned int i = 0; i<cdds_length; i++)
- {
- const struct TALER_DenominationHashP *h_denom_pub = cdds[i].h_denom_pub;
- const struct TALER_CsNonce *nonce = cdds[i].nonce;
-
- hd = GNUNET_CONTAINER_multihashmap_get (ksh->helpers->denom_keys,
- &h_denom_pub->hash);
- if (NULL == hd)
- {
- return TALER_EC_DONAU_GENERIC_DENOMINATION_KEY_UNKNOWN;
- }
- if (TALER_DENOMINATION_CS != hd->denom_pub.cipher)
- {
- return TALER_EC_GENERIC_INTERNAL_INVARIANT_FAILURE;
- }
- cdrs[i].h_cs = &hd->h_details.h_cs;
- cdrs[i].nonce = nonce;
- }
-
- return TALER_CRYPTO_helper_cs_r_batch_derive (ksh->helpers->csdh,
- cdrs,
- cdds_length,
- for_melt,
- r_pubs);
-}
-
-
-enum TALER_ErrorCode
-DH_keys_donau_sign_ (
- const struct GNUNET_CRYPTO_EccSignaturePurpose *purpose,
- struct DONAU_DonauPublicKeyP *pub,
- struct TALER_DonauSignatureP *sig)
-{
- struct DH_KeyStateHandle *ksh;
-
- ksh = DH_keys_get_state ();
- if (NULL == ksh)
- {
- /* This *can* happen if the donau's crypto helper is not running
- or had some bad error. */
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Cannot sign request, no valid signing keys available.\n");
- return TALER_EC_DONAU_GENERIC_KEYS_MISSING;
- }
- return DH_keys_donau_sign2_ (ksh,
- purpose,
- pub,
- sig);
-}
-
-
-MHD_RESULT
-DH_keys_get_handler (struct DH_RequestContext *rc,
- const char *const args[])
-{
- struct GNUNET_TIME_Timestamp last_issue_date;
- const char *etag;
- struct WireStateHandle *wsh;
-
- wsh = get_wire_state ();
- etag = MHD_lookup_connection_value (rc->connection,
- MHD_HEADER_KIND,
- MHD_HTTP_HEADER_IF_NONE_MATCH);
- (void) args;
- {
- const char *have_cherrypick;
-
- have_cherrypick = MHD_lookup_connection_value (rc->connection,
- MHD_GET_ARGUMENT_KIND,
- "last_issue_date");
- if (NULL != have_cherrypick)
- {
- unsigned long long cherrypickn;
-
- if (1 !=
- sscanf (have_cherrypick,
- "%llu",
- &cherrypickn))
- {
- GNUNET_break_op (0);
- return TALER_MHD_reply_with_error (rc->connection,
- MHD_HTTP_BAD_REQUEST,
-
TALER_EC_GENERIC_PARAMETER_MALFORMED,
- have_cherrypick);
- }
- /* The following multiplication may overflow; but this should not really
- be a problem, as giving back 'older' data than what the client asks
for
- (given that the client asks for data in the distant future) is not
- problematic */
- last_issue_date = GNUNET_TIME_timestamp_from_s (cherrypickn);
- }
- else
- {
- last_issue_date = GNUNET_TIME_UNIT_ZERO_TS;
- }
- }
-
- {
- struct DH_KeyStateHandle *ksh;
- const struct KeysResponseData *krd;
-
- ksh = DH_keys_get_state ();
- if ( (NULL == ksh) ||
- (0 == ksh->krd_array_length) )
- krd = bsearch (&last_issue_date,
- ksh->krd_array,
- ksh->krd_array_length,
- sizeof (struct KeysResponseData),
- &krd_search_comparator);
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Filtering /keys by cherry pick date %s found entry %u/%u\n",
- GNUNET_TIME_timestamp2s (last_issue_date),
- (unsigned int) (krd - ksh->krd_array),
- ksh->krd_array_length);
- if ( (NULL == krd) &&
- (ksh->krd_array_length > 0) )
- {
- if (! GNUNET_TIME_absolute_is_zero (last_issue_date.abs_time))
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- "Client provided invalid cherry picking timestamp %s,
returning full response\n",
- GNUNET_TIME_timestamp2s (last_issue_date));
- krd = &ksh->krd_array[ksh->krd_array_length - 1];
- }
- if (NULL == krd)
- {
- /* Likely keys not ready *yet*.
- Wait until they are. */
- return suspend_request (rc->connection);
- }
- if ( (NULL != etag) &&
- (0 == strcmp (etag,
- krd->etag)) )
- {
- MHD_RESULT ret;
- struct MHD_Response *resp;
-
- resp = MHD_create_response_from_buffer (0,
- NULL,
- MHD_RESPMEM_PERSISTENT);
- TALER_MHD_add_global_headers (resp);
- GNUNET_break (GNUNET_OK ==
- setup_general_response_headers (ksh,
- wsh,
- resp));
- GNUNET_break (MHD_YES ==
- MHD_add_response_header (resp,
- MHD_HTTP_HEADER_ETAG,
- krd->etag));
- ret = MHD_queue_response (rc->connection,
- MHD_HTTP_NOT_MODIFIED,
- resp);
- GNUNET_break (MHD_YES == ret);
- MHD_destroy_response (resp);
- return ret;
- }
- return MHD_queue_response (rc->connection,
- MHD_HTTP_OK,
- (MHD_YES ==
- TALER_MHD_can_compress (rc->connection))
- ? krd->response_compressed
- : krd->response_uncompressed);
- }
-}
-
-
/* end of donau-httpd_keys.c */
diff --git a/src/donau/donau-httpd_keys.h b/src/donau/donau-httpd_keys.h
index 7572347..ac24a56 100644
--- a/src/donau/donau-httpd_keys.h
+++ b/src/donau/donau-httpd_keys.h
@@ -53,199 +53,5 @@ struct DH_DonationUnitKey
*/
struct DONAUDB_DonationUnitKeyMetaData meta;
- };
-
-/**
- * Run internal invariant checks. For debugging.
- */
-void
-DH_check_invariants (void);
-
-/**
- * Look up the issue for a unit public key. Note that the result
- * must only be used in this thread and only until another key or
- * key state is resolved.
- *
- * @param h_unit_pub hash of donation_unit public key
- * @param[in,out] conn used to return status message if NULL is returned
- * @param[out] mret set to the MHD status if NULL is returned
- * @return the donation_unit key issue,
- * or NULL if @a h_unit_pub could not be found
- */
-struct DH_DonationUnitKey *
-DH_keys_donation_unit_by_hash (
- const struct DONAU_DonationUnitHashP *h_unit_pub,
- struct MHD_Connection *conn,
- MHD_RESULT *mret);
-
-/**
- * Information needed to derive the CS r_pub.
- */
-struct DH_CsDeriveData
-{
- /**
- * Hash of key to sign with.
- */
- const struct DONAU_DonationUnitHashP *h_du_pub;
-
- /**
- * Nonce to use.
- */
- const struct DONAU_CsNonce *nonce;
};
-
-/**
- * Request to derive CS @a r_pub using the donation unit and nonce from @a cdd.
- *
- * @param cdd data to compute @a r_pub from
- * @param[out] r_pub where to write the result
- * @return #TALER_EC_NONE on success
- */
-enum TALER_ErrorCode
-DH_keys_donation_unit_cs_r_pub (
- const struct DH_CsDeriveData *cdd,
- struct GNUNET_CRYPTO_CSPublicRPairP *r_pub);
-
-
-/**
- * Request to derive a bunch of CS @a r_pubs using the
- * donation units and nonces from @a cdds.
- *
- * @param cdds array to compute @a r_pubs from
- * @param cdds_length length of the @a cdds array
- * @param[out] r_pubs array where to write the result; must be of length @a
cdds_length
- * @return #DONAU_EC_NONE on success
- */
-enum TALER_ErrorCode
-DH_keys_donation_unit_cs_batch_r_pub (
- const struct DH_CsDeriveData *cdds,
- unsigned int cdds_length,
- struct GNUNET_CRYPTO_CSPublicRPairP *r_pubs);
-
-/**
- * Sign the message in @a purpose with the donau's signing key.
- *
- * The @a purpose data is the beginning of the data of which the signature is
- * to be created. The `size` field in @a purpose must correctly indicate the
- * number of bytes of the data structure, including its header. Use
- * #DH_keys_donau_sign() instead of calling this function directly!
- *
- * @param purpose the message to sign
- * @param[out] pub set to the current public signing key of the donau
- * @param[out] sig signature over purpose using current signing key
- * @return #TALER_EC_NONE on success
- */
-enum TALER_ErrorCode
-DH_keys_donau_sign_ (
- const struct GNUNET_CRYPTO_EccSignaturePurpose *purpose,
- struct DONAU_EddsaPublicKeyP *pub,
- struct DONAU_DonauSignatureP *sig);
-
-
-/**
- * Sign the message in @a purpose with the donau's signing key.
- *
- * The @a purpose data is the beginning of the data of which the signature is
- * to be created. The `size` field in @a purpose must correctly indicate the
- * number of bytes of the data structure, including its header. Use
- * #DH_keys_donau_sign() instead of calling this function directly!
- *
- * @param cls key state state to look in
- * @param purpose the message to sign
- * @param[out] pub set to the current public signing key of the donau
- * @param[out] sig signature over purpose using current signing key
- * @return #TALER_EC_NONE on success
- */
-enum TALER_ErrorCode
-DH_keys_donau_sign2_ (
- void *cls,
- const struct GNUNET_CRYPTO_EccSignaturePurpose *purpose,
- struct DONAU_EddsaPublicKeyP *pub,
- struct DONAU_DonauSignatureP *sig);
-
-
-/**
- * @ingroup crypto
- * @brief EdDSA sign a given block.
- *
- * The @a ps data must be a fixed-size struct for which the signature is to be
- * created. The `size` field in @a ps->purpose must correctly indicate the
- * number of bytes of the data structure, including its header.
- *
- * @param ps packed struct with what to sign, MUST begin with a purpose
- * @param[out] pub where to store the public key to use for the signing
- * @param[out] sig where to write the signature
- * @return #TALER_EC_NONE on success
- */
-#define DH_keys_donau_sign(ps,pub,sig) \
- ({ \
- /* check size is set correctly */ \
- GNUNET_assert (htonl ((ps)->purpose.size) == \
- sizeof (*ps)); \
- /* check 'ps' begins with the purpose */ \
- GNUNET_static_assert (((void*) (ps)) == \
- ((void*) &(ps)->purpose)); \
- DH_keys_donau_sign_ (&(ps)->purpose, \
- pub, \
- sig); \
- })
-
-
-/**
- * @ingroup crypto
- * @brief EdDSA sign a given block.
- *
- * The @a ps data must be a fixed-size struct for which the signature is to be
- * created. The `size` field in @a ps->purpose must correctly indicate the
- * number of bytes of the data structure, including its header.
- *
- * This allows requesting multiple donation units with the same @a ksh which
- * thus will remain valid until the next call to
- * #DH_keys_donation_unit_by_hash() or #DH_keys_get_state() or
- * #DH_keys_donau_sign().
- *
- * @param ksh key state to use
- * @param ps packed struct with what to sign, MUST begin with a purpose
- * @param[out] pub where to store the public key to use for the signing
- * @param[out] sig where to write the signature
- * @return #TALER_EC_NONE on success
- */
-#define DH_keys_donau_sign2(ksh,ps,pub,sig) \
- ({ \
- /* check size is set correctly */ \
- GNUNET_assert (htonl ((ps)->purpose.size) == \
- sizeof (*ps)); \
- /* check 'ps' begins with the purpose */ \
- GNUNET_static_assert (((void*) (ps)) == \
- ((void*) &(ps)->purpose)); \
- DH_keys_donau_sign2_ (ksh, \
- &(ps)->purpose, \
- pub, \
- sig); \
- })
-
-
-/**
- * Function to call to handle requests to "/keys" by sending
- * back our current key material.
- *
- * @param rc request context
- * @param args array of additional options (must be empty for this function)
- * @return MHD result code
- */
-MHD_RESULT
-DH_keys_get_handler (struct DH_RequestContext *rc,
- const char *const args[]);
-
-
-/**
- * Initialize keys subsystem.
- *
- * @return #GNUNET_OK on success
- */
-enum GNUNET_GenericReturnValue
-DH_keys_init (void);
-
-
-#endif
diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am
index 40abd78..10ae4aa 100644
--- a/src/lib/Makefile.am
+++ b/src/lib/Makefile.am
@@ -13,23 +13,20 @@ endif
# Libraries
-lib_LTLIBRARIES = \
- libtalerdonau.la
-
-libtalerdonau_la_LDFLAGS = \
- -version-info 5:0:0 \
- -no-undefined
-
-libtalerdonau_la_SOURCES = \
- donau_api_charities_open.c
-
-# maybe need libtalercurl
-libtalerdonau_la_LIBADD = \
- $(top_builddir)/src/json/libtalerjson.la \
- $(top_builddir)/src/util/libdonauutil.la \
- -lgnunetcurl \
- -lgnunetjson \
- -lgnunetutil \
- -ljansson \
- $(LIBGNURLCURL_LIBS) \
- $(XLIB)
+#lib_LTLIBRARIES = \
+# libdonau.la
+#
+#libdonau_la_LDFLAGS = \
+# -version-info 5:0:0 \
+# -no-undefined
+#
+## maybe need libtalercurl
+#libdonau_la_LIBADD = \
+# $(top_builddir)/src/json/libtalerjson.la \
+# $(top_builddir)/src/util/libdonauutil.la \
+# -lgnunetcurl \
+# -lgnunetjson \
+# -lgnunetutil \
+# -ljansson \
+# $(LIBGNURLCURL_LIBS) \
+# $(XLIB)
diff --git a/src/lib/donau_api_charities_close.c
b/src/lib/donau_api_charities_close.c
deleted file mode 100644
index 3f76ee1..0000000
--- a/src/lib/donau_api_charities_close.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2014-2023 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 lib/donau_api_reserves_close.c
- * @brief Implementation of the POST /reserves/$RESERVE_PUB/close requests
- * @author Christian Grothoff
- */
-#include "taler/platform.h"
-#include <jansson.h>
-#include <microhttpd.h> /* just for HTTP close codes */
-#include <gnunet/gnunet_util_lib.h>
-#include <gnunet/gnunet_json_lib.h>
-#include <gnunet/gnunet_curl_lib.h>
-#include "taler_donau_service.h"
-#include "taler/taler_json_lib.h"
-#include "donau_api_handle.h"
-#include "taler_signatures.h"
-#include "donau_api_curl_defaults.h"
-
-
-/**
- * @brief A /reserves/$RID/close Handle
- */
-struct DONAU_ReservesCloseHandle
-{
-
- /**
- * The url for this request.
- */
- char *url;
-
- /**
- * Handle for the request.
- */
- struct GNUNET_CURL_Job *job;
-
- /**
- * Context for #DH_curl_easy_post(). Keeps the data that must
- * persist for Curl to make the upload.
- */
- struct TALER_CURL_PostContext post_ctx;
-
- /**
- * Function to call with the result.
- */
- DONAU_ReservesCloseCallback cb;
-
- /**
- * Closure for @a cb.
- */
- void *cb_cls;
-
- /**
- * Public key of the reserve we are querying.
- */
- struct TALER_ReservePublicKeyP reserve_pub;
-
- /**
- * Our signature.
- */
- struct TALER_ReserveSignatureP reserve_sig;
-
- /**
- * When did we make the request.
- */
- struct GNUNET_TIME_Timestamp ts;
-
-};
-
-/* end of donau_api_reserves_close.c */
diff --git a/src/lib/donau_api_charities_get.c
b/src/lib/donau_api_charities_get.c
deleted file mode 100644
index 1ad6874..0000000
--- a/src/lib/donau_api_charities_get.c
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2014-2022 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 lib/donau_api_reserves_get.c
- * @brief Implementation of the GET /reserves/$RESERVE_PUB requests
- * @author Christian Grothoff
- */
-#include "taler/platform.h"
-#include <jansson.h>
-#include <microhttpd.h> /* just for HTTP status codes */
-#include <gnunet/gnunet_util_lib.h>
-#include <gnunet/gnunet_json_lib.h>
-#include <gnunet/gnunet_curl_lib.h>
-#include "taler_donau_service.h"
-#include "taler/taler_json_lib.h"
-#include "donau_api_handle.h"
-#include "taler_signatures.h"
-#include "donau_api_curl_defaults.h"
-
-
-/**
- * @brief A /reserves/ GET Handle
- */
-struct DONAU_ReservesGetHandle
-{
-
- /**
- * The url for this request.
- */
- char *url;
-
- /**
- * Handle for the request.
- */
- struct GNUNET_CURL_Job *job;
-
- /**
- * Function to call with the result.
- */
- DONAU_ReservesGetCallback cb;
-
- /**
- * Public key of the reserve we are querying.
- */
- struct TALER_ReservePublicKeyP reserve_pub;
-
- /**
- * Closure for @a cb.
- */
- void *cb_cls;
-
-};
-
-
-/**
- * We received an #MHD_HTTP_OK status code. Handle the JSON
- * response.
- *
- * @param rgh handle of the request
- * @param j JSON response
- * @return #GNUNET_OK on success
- */
-static enum GNUNET_GenericReturnValue
-handle_reserves_get_ok (struct DONAU_ReservesGetHandle *rgh,
- const json_t *j)
-{
- struct DONAU_ReserveSummary rs = {
- .hr.reply = j,
- .hr.http_status = MHD_HTTP_OK
- };
- struct GNUNET_JSON_Specification spec[] = {
- TALER_JSON_spec_amount_any ("balance",
- &rs.details.ok.balance),
- GNUNET_JSON_spec_end ()
- };
-
- if (GNUNET_OK !=
- GNUNET_JSON_parse (j,
- spec,
- NULL,
- NULL))
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- rgh->cb (rgh->cb_cls,
- &rs);
- rgh->cb = NULL;
- return GNUNET_OK;
-}
-
-
-/**
- * Function called when we're done processing the
- * HTTP /reserves/ GET request.
- *
- * @param cls the `struct DONAU_ReservesGetHandle`
- * @param response_code HTTP response code, 0 on error
- * @param response parsed JSON result, NULL on error
- */
-static void
-handle_reserves_get_finished (void *cls,
- long response_code,
- const void *response)
-{
- struct DONAU_ReservesGetHandle *rgh = cls;
- const json_t *j = response;
- struct DONAU_ReserveSummary rs = {
- .hr.reply = j,
- .hr.http_status = (unsigned int) response_code
- };
-
- rgh->job = NULL;
- switch (response_code)
- {
- case 0:
- rs.hr.ec = TALER_EC_GENERIC_INVALID_RESPONSE;
- break;
- case MHD_HTTP_OK:
- if (GNUNET_OK !=
- handle_reserves_get_ok (rgh,
- j))
- {
- rs.hr.http_status = 0;
- rs.hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
- }
- break;
- case MHD_HTTP_BAD_REQUEST:
- /* This should never happen, either us or the donau is buggy
- (or API version conflict); just pass JSON reply to the application */
- rs.hr.ec = TALER_JSON_get_error_code (j);
- rs.hr.hint = TALER_JSON_get_error_hint (j);
- break;
- case MHD_HTTP_NOT_FOUND:
- /* Nothing really to verify, this should never
- happen, we should pass the JSON reply to the application */
- rs.hr.ec = TALER_JSON_get_error_code (j);
- rs.hr.hint = TALER_JSON_get_error_hint (j);
- break;
- case MHD_HTTP_INTERNAL_SERVER_ERROR:
- /* Server had an internal issue; we should retry, but this API
- leaves this to the application */
- rs.hr.ec = TALER_JSON_get_error_code (j);
- rs.hr.hint = TALER_JSON_get_error_hint (j);
- break;
- default:
- /* unexpected response code */
- GNUNET_break_op (0);
- rs.hr.ec = TALER_JSON_get_error_code (j);
- rs.hr.hint = TALER_JSON_get_error_hint (j);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Unexpected response code %u/%d for GET %s\n",
- (unsigned int) response_code,
- (int) rs.hr.ec,
- rgh->url);
- break;
- }
- if (NULL != rgh->cb)
- {
- rgh->cb (rgh->cb_cls,
- &rs);
- rgh->cb = NULL;
- }
- DONAU_reserves_get_cancel (rgh);
-}
-
-
-struct DONAU_ReservesGetHandle *
-DONAU_reserves_get (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- const struct TALER_ReservePublicKeyP *reserve_pub,
- struct GNUNET_TIME_Relative timeout,
- DONAU_ReservesGetCallback cb,
- void *cb_cls)
-{
- struct DONAU_ReservesGetHandle *rgh;
- CURL *eh;
- char arg_str[sizeof (struct TALER_ReservePublicKeyP) * 2 + 16 + 32];
-
- {
- char pub_str[sizeof (struct TALER_ReservePublicKeyP) * 2];
- char *end;
- char timeout_str[32];
-
- end = GNUNET_STRINGS_data_to_string (
- reserve_pub,
- sizeof (*reserve_pub),
- pub_str,
- sizeof (pub_str));
- *end = '\0';
- GNUNET_snprintf (timeout_str,
- sizeof (timeout_str),
- "%llu",
- (unsigned long long)
- (timeout.rel_value_us
- / GNUNET_TIME_UNIT_MILLISECONDS.rel_value_us));
- if (GNUNET_TIME_relative_is_zero (timeout))
- GNUNET_snprintf (arg_str,
- sizeof (arg_str),
- "reserves/%s",
- pub_str);
- else
- GNUNET_snprintf (arg_str,
- sizeof (arg_str),
- "reserves/%s?timeout_ms=%s",
- pub_str,
- timeout_str);
- }
- rgh = GNUNET_new (struct DONAU_ReservesGetHandle);
- rgh->cb = cb;
- rgh->cb_cls = cb_cls;
- rgh->reserve_pub = *reserve_pub;
- rgh->url = TALER_url_join (url,
- arg_str,
- NULL);
- if (NULL == rgh->url)
- {
- GNUNET_free (rgh);
- return NULL;
- }
- eh = DONAU_curl_easy_get_ (rgh->url);
- if (NULL == eh)
- {
- GNUNET_break (0);
- GNUNET_free (rgh->url);
- GNUNET_free (rgh);
- return NULL;
- }
- rgh->job = GNUNET_CURL_job_add (ctx,
- eh,
- &handle_reserves_get_finished,
- rgh);
- return rgh;
-}
-
-
-void
-DONAU_reserves_get_cancel (
- struct DONAU_ReservesGetHandle *rgh)
-{
- if (NULL != rgh->job)
- {
- GNUNET_CURL_job_cancel (rgh->job);
- rgh->job = NULL;
- }
- GNUNET_free (rgh->url);
- GNUNET_free (rgh);
-}
-
-
-/* end of donau_api_reserves_get.c */
diff --git a/src/lib/donau_api_charities_history.c
b/src/lib/donau_api_charities_history.c
deleted file mode 100644
index 88dcef3..0000000
--- a/src/lib/donau_api_charities_history.c
+++ /dev/null
@@ -1,363 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2014-2023 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 lib/donau_api_reserves_history.c
- * @brief Implementation of the POST /reserves/$RESERVE_PUB/history requests
- * @author Christian Grothoff
- */
-#include "taler/platform.h"
-#include <jansson.h>
-#include <microhttpd.h> /* just for HTTP history codes */
-#include <gnunet/gnunet_util_lib.h>
-#include <gnunet/gnunet_json_lib.h>
-#include <gnunet/gnunet_curl_lib.h>
-#include "taler_donau_service.h"
-#include "taler/taler_json_lib.h"
-#include "donau_api_handle.h"
-#include "taler_signatures.h"
-#include "donau_api_curl_defaults.h"
-
-
-/**
- * @brief A /reserves/$RID/history Handle
- */
-struct DONAU_ReservesHistoryHandle
-{
-
- /**
- * The keys of the donau this request handle will use
- */
- struct DONAU_Keys *keys;
-
- /**
- * The url for this request.
- */
- char *url;
-
- /**
- * Handle for the request.
- */
- struct GNUNET_CURL_Job *job;
-
- /**
- * Context for #DH_curl_easy_post(). Keeps the data that must
- * persist for Curl to make the upload.
- */
- struct TALER_CURL_PostContext post_ctx;
-
- /**
- * Function to call with the result.
- */
- DONAU_ReservesHistoryCallback cb;
-
- /**
- * Closure for @a cb.
- */
- void *cb_cls;
-
- /**
- * Public key of the reserve we are querying.
- */
- struct TALER_ReservePublicKeyP reserve_pub;
-
- /**
- * Our signature.
- */
- struct TALER_ReserveSignatureP reserve_sig;
-
- /**
- * When did we make the request.
- */
- struct GNUNET_TIME_Timestamp ts;
-
-};
-
-
-/**
- * We received an #MHD_HTTP_OK history code. Handle the JSON
- * response.
- *
- * @param rsh handle of the request
- * @param j JSON response
- * @return #GNUNET_OK on success
- */
-static enum GNUNET_GenericReturnValue
-handle_reserves_history_ok (struct DONAU_ReservesHistoryHandle *rsh,
- const json_t *j)
-{
- const json_t *history;
- unsigned int len;
- struct DONAU_ReserveHistory rs = {
- .hr.reply = j,
- .hr.http_status = MHD_HTTP_OK,
- .ts = rsh->ts,
- .reserve_sig = &rsh->reserve_sig
- };
- struct GNUNET_JSON_Specification spec[] = {
- TALER_JSON_spec_amount_any ("balance",
- &rs.details.ok.balance),
- GNUNET_JSON_spec_array_const ("history",
- &history),
- GNUNET_JSON_spec_end ()
- };
-
- if (GNUNET_OK !=
- GNUNET_JSON_parse (j,
- spec,
- NULL,
- NULL))
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- len = json_array_size (history);
- {
- struct DONAU_ReserveHistoryEntry *rhistory;
-
- rhistory = GNUNET_new_array (len,
- struct DONAU_ReserveHistoryEntry);
- if (GNUNET_OK !=
- DONAU_parse_reserve_history (rsh->keys,
- history,
- &rsh->reserve_pub,
- rs.details.ok.balance.currency,
- &rs.details.ok.total_in,
- &rs.details.ok.total_out,
- len,
- rhistory))
- {
- GNUNET_break_op (0);
- DONAU_free_reserve_history (len,
- rhistory);
- return GNUNET_SYSERR;
- }
- if (NULL != rsh->cb)
- {
- rs.details.ok.history = rhistory;
- rs.details.ok.history_len = len;
- rsh->cb (rsh->cb_cls,
- &rs);
- rsh->cb = NULL;
- }
- DONAU_free_reserve_history (len,
- rhistory);
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Function called when we're done processing the
- * HTTP /reserves/$RID/history request.
- *
- * @param cls the `struct DONAU_ReservesHistoryHandle`
- * @param response_code HTTP response code, 0 on error
- * @param response parsed JSON result, NULL on error
- */
-static void
-handle_reserves_history_finished (void *cls,
- long response_code,
- const void *response)
-{
- struct DONAU_ReservesHistoryHandle *rsh = cls;
- const json_t *j = response;
- struct DONAU_ReserveHistory rs = {
- .hr.reply = j,
- .hr.http_status = (unsigned int) response_code
- };
-
- rsh->job = NULL;
- switch (response_code)
- {
- case 0:
- rs.hr.ec = TALER_EC_GENERIC_INVALID_RESPONSE;
- break;
- case MHD_HTTP_OK:
- if (GNUNET_OK !=
- handle_reserves_history_ok (rsh,
- j))
- {
- GNUNET_break_op (0);
- rs.hr.http_status = 0;
- rs.hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
- }
- break;
- case MHD_HTTP_BAD_REQUEST:
- /* This should never happen, either us or the donau is buggy
- (or API version conflict); just pass JSON reply to the application */
- GNUNET_break (0);
- rs.hr.ec = TALER_JSON_get_error_code (j);
- rs.hr.hint = TALER_JSON_get_error_hint (j);
- break;
- case MHD_HTTP_FORBIDDEN:
- /* This should never happen, either us or the donau is buggy
- (or API version conflict); just pass JSON reply to the application */
- GNUNET_break (0);
- rs.hr.ec = TALER_JSON_get_error_code (j);
- rs.hr.hint = TALER_JSON_get_error_hint (j);
- break;
- case MHD_HTTP_NOT_FOUND:
- /* Nothing really to verify, this should never
- happen, we should pass the JSON reply to the application */
- rs.hr.ec = TALER_JSON_get_error_code (j);
- rs.hr.hint = TALER_JSON_get_error_hint (j);
- break;
- case MHD_HTTP_CONFLICT:
- /* Insufficient balance to inquire for reserve history */
- rs.hr.ec = TALER_JSON_get_error_code (j);
- rs.hr.hint = TALER_JSON_get_error_hint (j);
- break;
- case MHD_HTTP_INTERNAL_SERVER_ERROR:
- /* Server had an internal issue; we should retry, but this API
- leaves this to the application */
- rs.hr.ec = TALER_JSON_get_error_code (j);
- rs.hr.hint = TALER_JSON_get_error_hint (j);
- break;
- default:
- /* unexpected response code */
- GNUNET_break_op (0);
- rs.hr.ec = TALER_JSON_get_error_code (j);
- rs.hr.hint = TALER_JSON_get_error_hint (j);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Unexpected response code %u/%d for reserves history\n",
- (unsigned int) response_code,
- (int) rs.hr.ec);
- break;
- }
- if (NULL != rsh->cb)
- {
- rsh->cb (rsh->cb_cls,
- &rs);
- rsh->cb = NULL;
- }
- DONAU_reserves_history_cancel (rsh);
-}
-
-
-struct DONAU_ReservesHistoryHandle *
-DONAU_reserves_history (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- struct DONAU_Keys *keys,
- const struct TALER_ReservePrivateKeyP *reserve_priv,
- DONAU_ReservesHistoryCallback cb,
- void *cb_cls)
-{
- struct DONAU_ReservesHistoryHandle *rsh;
- CURL *eh;
- char arg_str[sizeof (struct TALER_ReservePublicKeyP) * 2 + 32];
- const struct DONAU_GlobalFee *gf;
-
- rsh = GNUNET_new (struct DONAU_ReservesHistoryHandle);
- rsh->cb = cb;
- rsh->cb_cls = cb_cls;
- rsh->ts = GNUNET_TIME_timestamp_get ();
- GNUNET_CRYPTO_eddsa_key_get_public (&reserve_priv->eddsa_priv,
- &rsh->reserve_pub.eddsa_pub);
- {
- char pub_str[sizeof (struct TALER_ReservePublicKeyP) * 2];
- char *end;
-
- end = GNUNET_STRINGS_data_to_string (
- &rsh->reserve_pub,
- sizeof (rsh->reserve_pub),
- pub_str,
- sizeof (pub_str));
- *end = '\0';
- GNUNET_snprintf (arg_str,
- sizeof (arg_str),
- "reserves/%s/history",
- pub_str);
- }
- rsh->url = TALER_url_join (url,
- arg_str,
- NULL);
- if (NULL == rsh->url)
- {
- GNUNET_free (rsh);
- return NULL;
- }
- eh = DONAU_curl_easy_get_ (rsh->url);
- if (NULL == eh)
- {
- GNUNET_break (0);
- GNUNET_free (rsh->url);
- GNUNET_free (rsh);
- return NULL;
- }
- gf = DONAU_get_global_fee (keys,
- rsh->ts);
- if (NULL == gf)
- {
- GNUNET_break_op (0);
- curl_easy_cleanup (eh);
- GNUNET_free (rsh->url);
- GNUNET_free (rsh);
- return NULL;
- }
- TALER_wallet_reserve_history_sign (rsh->ts,
- &gf->fees.history,
- reserve_priv,
- &rsh->reserve_sig);
- {
- json_t *history_obj = GNUNET_JSON_PACK (
- GNUNET_JSON_pack_timestamp ("request_timestamp",
- rsh->ts),
- GNUNET_JSON_pack_data_auto ("reserve_sig",
- &rsh->reserve_sig));
-
- if (GNUNET_OK !=
- TALER_curl_easy_post (&rsh->post_ctx,
- eh,
- history_obj))
- {
- GNUNET_break (0);
- curl_easy_cleanup (eh);
- json_decref (history_obj);
- GNUNET_free (rsh->url);
- GNUNET_free (rsh);
- return NULL;
- }
- json_decref (history_obj);
- }
- rsh->keys = DONAU_keys_incref (keys);
- rsh->job = GNUNET_CURL_job_add2 (ctx,
- eh,
- rsh->post_ctx.headers,
- &handle_reserves_history_finished,
- rsh);
- return rsh;
-}
-
-
-void
-DONAU_reserves_history_cancel (
- struct DONAU_ReservesHistoryHandle *rsh)
-{
- if (NULL != rsh->job)
- {
- GNUNET_CURL_job_cancel (rsh->job);
- rsh->job = NULL;
- }
- TALER_curl_easy_post_finished (&rsh->post_ctx);
- GNUNET_free (rsh->url);
- DONAU_keys_decref (rsh->keys);
- GNUNET_free (rsh);
-}
-
-
-/* end of donau_api_reserves_history.c */
diff --git a/src/lib/donau_api_charities_open.c
b/src/lib/donau_api_charities_open.c
deleted file mode 100644
index 8ea830f..0000000
--- a/src/lib/donau_api_charities_open.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2014-2023 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 lib/donau_api_reserves_open.c
- * @brief Implementation of the POST /reserves/$RESERVE_PUB/open requests
- * @author Christian Grothoff
- */
-#include "taler/platform.h"
-#include <jansson.h>
-#include <microhttpd.h> /* just for HTTP open codes */
-#include <gnunet/gnunet_util_lib.h>
-#include <gnunet/gnunet_json_lib.h>
-#include <gnunet/gnunet_curl_lib.h>
-#include "donau_service.h"
-#include "taler/taler_json_lib.h"
-#include "donau_api_common.h"
-#include "donau_api_handle.h"
-#include "donau_api_curl_defaults.h"
-
-
-/**
- * Information we keep per coin to validate the reply.
- */
-struct CoinData
-{
- /**
- * Public key of the coin.
- */
- struct TALER_CoinSpendPublicKeyP coin_pub;
-
- /**
- * Signature by the coin.
- */
- struct TALER_CoinSpendSignatureP coin_sig;
-
- /**
- * The hash of the denomination's public key
- */
- struct TALER_DenominationHashP h_denom_pub;
-
- /**
- * How much did this coin contribute.
- */
- struct TALER_Amount contribution;
-};
-
-/* end of donau_api_reserves_open.c */
diff --git a/src/lib/donau_api_charities_status.c
b/src/lib/donau_api_charities_status.c
deleted file mode 100644
index 837c194..0000000
--- a/src/lib/donau_api_charities_status.c
+++ /dev/null
@@ -1,336 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2014-2023 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 lib/donau_api_reserves_status.c
- * @brief Implementation of the POST /reserves/$RESERVE_PUB/status requests
- * @author Christian Grothoff
- */
-#include "taler/platform.h"
-#include <jansson.h>
-#include <microhttpd.h> /* just for HTTP status codes */
-#include <gnunet/gnunet_util_lib.h>
-#include <gnunet/gnunet_json_lib.h>
-#include <gnunet/gnunet_curl_lib.h>
-#include "taler_donau_service.h"
-#include "taler/taler_json_lib.h"
-#include "donau_api_handle.h"
-#include "taler_signatures.h"
-#include "donau_api_curl_defaults.h"
-
-
-/**
- * @brief A /reserves/$RID/status Handle
- */
-struct DONAU_ReservesStatusHandle
-{
-
- /**
- * The keys of the donau this request handle will use
- */
- struct DONAU_Keys *keys;
-
- /**
- * The url for this request.
- */
- char *url;
-
- /**
- * Handle for the request.
- */
- struct GNUNET_CURL_Job *job;
-
- /**
- * Context for #DH_curl_easy_post(). Keeps the data that must
- * persist for Curl to make the upload.
- */
- struct TALER_CURL_PostContext post_ctx;
-
- /**
- * Function to call with the result.
- */
- DONAU_ReservesStatusCallback cb;
-
- /**
- * Public key of the reserve we are querying.
- */
- struct TALER_ReservePublicKeyP reserve_pub;
-
- /**
- * Closure for @a cb.
- */
- void *cb_cls;
-
-};
-
-
-/**
- * We received an #MHD_HTTP_OK status code. Handle the JSON
- * response.
- *
- * @param rsh handle of the request
- * @param j JSON response
- * @return #GNUNET_OK on success
- */
-static enum GNUNET_GenericReturnValue
-handle_reserves_status_ok (struct DONAU_ReservesStatusHandle *rsh,
- const json_t *j)
-{
- const json_t *history;
- unsigned int len;
- struct DONAU_ReserveStatus rs = {
- .hr.reply = j,
- .hr.http_status = MHD_HTTP_OK
- };
- struct GNUNET_JSON_Specification spec[] = {
- TALER_JSON_spec_amount_any ("balance",
- &rs.details.ok.balance),
- GNUNET_JSON_spec_array_const ("history",
- &history),
- GNUNET_JSON_spec_end ()
- };
-
- if (GNUNET_OK !=
- GNUNET_JSON_parse (j,
- spec,
- NULL,
- NULL))
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- len = json_array_size (history);
- {
- struct DONAU_ReserveHistoryEntry *rhistory;
-
- rhistory = GNUNET_new_array (len,
- struct DONAU_ReserveHistoryEntry);
- if (GNUNET_OK !=
- DONAU_parse_reserve_history (rsh->keys,
- history,
- &rsh->reserve_pub,
- rs.details.ok.balance.currency,
- &rs.details.ok.total_in,
- &rs.details.ok.total_out,
- len,
- rhistory))
- {
- GNUNET_break_op (0);
- DONAU_free_reserve_history (len,
- rhistory);
- GNUNET_JSON_parse_free (spec);
- return GNUNET_SYSERR;
- }
- if (NULL != rsh->cb)
- {
- rs.details.ok.history = rhistory;
- rs.details.ok.history_len = len;
- rsh->cb (rsh->cb_cls,
- &rs);
- rsh->cb = NULL;
- }
- DONAU_free_reserve_history (len,
- rhistory);
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Function called when we're done processing the
- * HTTP /reserves/$RID/status request.
- *
- * @param cls the `struct DONAU_ReservesStatusHandle`
- * @param response_code HTTP response code, 0 on error
- * @param response parsed JSON result, NULL on error
- */
-static void
-handle_reserves_status_finished (void *cls,
- long response_code,
- const void *response)
-{
- struct DONAU_ReservesStatusHandle *rsh = cls;
- const json_t *j = response;
- struct DONAU_ReserveStatus rs = {
- .hr.reply = j,
- .hr.http_status = (unsigned int) response_code
- };
-
- rsh->job = NULL;
- switch (response_code)
- {
- case 0:
- rs.hr.ec = TALER_EC_GENERIC_INVALID_RESPONSE;
- break;
- case MHD_HTTP_OK:
- if (GNUNET_OK !=
- handle_reserves_status_ok (rsh,
- j))
- {
- rs.hr.http_status = 0;
- rs.hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
- }
- break;
- case MHD_HTTP_BAD_REQUEST:
- /* This should never happen, either us or the donau is buggy
- (or API version conflict); just pass JSON reply to the application */
- GNUNET_break (0);
- rs.hr.ec = TALER_JSON_get_error_code (j);
- rs.hr.hint = TALER_JSON_get_error_hint (j);
- break;
- case MHD_HTTP_FORBIDDEN:
- /* This should never happen, either us or the donau is buggy
- (or API version conflict); just pass JSON reply to the application */
- GNUNET_break (0);
- rs.hr.ec = TALER_JSON_get_error_code (j);
- rs.hr.hint = TALER_JSON_get_error_hint (j);
- break;
- case MHD_HTTP_NOT_FOUND:
- /* Nothing really to verify, this should never
- happen, we should pass the JSON reply to the application */
- rs.hr.ec = TALER_JSON_get_error_code (j);
- rs.hr.hint = TALER_JSON_get_error_hint (j);
- break;
- case MHD_HTTP_INTERNAL_SERVER_ERROR:
- /* Server had an internal issue; we should retry, but this API
- leaves this to the application */
- rs.hr.ec = TALER_JSON_get_error_code (j);
- rs.hr.hint = TALER_JSON_get_error_hint (j);
- break;
- default:
- /* unexpected response code */
- GNUNET_break_op (0);
- rs.hr.ec = TALER_JSON_get_error_code (j);
- rs.hr.hint = TALER_JSON_get_error_hint (j);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Unexpected response code %u/%d for reserves status\n",
- (unsigned int) response_code,
- (int) rs.hr.ec);
- break;
- }
- if (NULL != rsh->cb)
- {
- rsh->cb (rsh->cb_cls,
- &rs);
- rsh->cb = NULL;
- }
- DONAU_reserves_status_cancel (rsh);
-}
-
-
-struct DONAU_ReservesStatusHandle *
-DONAU_reserves_status (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- struct DONAU_Keys *keys,
- const struct TALER_ReservePrivateKeyP *reserve_priv,
- DONAU_ReservesStatusCallback cb,
- void *cb_cls)
-{
- struct DONAU_ReservesStatusHandle *rsh;
- CURL *eh;
- char arg_str[sizeof (struct TALER_ReservePublicKeyP) * 2 + 32];
- struct TALER_ReserveSignatureP reserve_sig;
- struct GNUNET_TIME_Timestamp ts
- = GNUNET_TIME_timestamp_get ();
-
- rsh = GNUNET_new (struct DONAU_ReservesStatusHandle);
- rsh->cb = cb;
- rsh->cb_cls = cb_cls;
- GNUNET_CRYPTO_eddsa_key_get_public (&reserve_priv->eddsa_priv,
- &rsh->reserve_pub.eddsa_pub);
- {
- char pub_str[sizeof (struct TALER_ReservePublicKeyP) * 2];
- char *end;
-
- end = GNUNET_STRINGS_data_to_string (
- &rsh->reserve_pub,
- sizeof (rsh->reserve_pub),
- pub_str,
- sizeof (pub_str));
- *end = '\0';
- GNUNET_snprintf (arg_str,
- sizeof (arg_str),
- "reserves/%s/status",
- pub_str);
- }
- rsh->url = TALER_url_join (url,
- arg_str,
- NULL);
- if (NULL == rsh->url)
- {
- GNUNET_free (rsh);
- return NULL;
- }
- eh = DONAU_curl_easy_get_ (rsh->url);
- if (NULL == eh)
- {
- GNUNET_break (0);
- GNUNET_free (rsh->url);
- GNUNET_free (rsh);
- return NULL;
- }
- TALER_wallet_reserve_status_sign (ts,
- reserve_priv,
- &reserve_sig);
- {
- json_t *status_obj = GNUNET_JSON_PACK (
- GNUNET_JSON_pack_timestamp ("request_timestamp",
- ts),
- GNUNET_JSON_pack_data_auto ("reserve_sig",
- &reserve_sig));
-
- if (GNUNET_OK !=
- TALER_curl_easy_post (&rsh->post_ctx,
- eh,
- status_obj))
- {
- GNUNET_break (0);
- curl_easy_cleanup (eh);
- json_decref (status_obj);
- GNUNET_free (rsh->url);
- GNUNET_free (rsh);
- return NULL;
- }
- json_decref (status_obj);
- }
- rsh->keys = DONAU_keys_incref (keys);
- rsh->job = GNUNET_CURL_job_add2 (ctx,
- eh,
- rsh->post_ctx.headers,
- &handle_reserves_status_finished,
- rsh);
- return rsh;
-}
-
-
-void
-DONAU_reserves_status_cancel (
- struct DONAU_ReservesStatusHandle *rsh)
-{
- if (NULL != rsh->job)
- {
- GNUNET_CURL_job_cancel (rsh->job);
- rsh->job = NULL;
- }
- TALER_curl_easy_post_finished (&rsh->post_ctx);
- GNUNET_free (rsh->url);
- DONAU_keys_decref (rsh->keys);
- GNUNET_free (rsh);
-}
-
-
-/* end of donau_api_reserves_status.c */
diff --git a/src/lib/donau_api_csr_issue_receipts.c
b/src/lib/donau_api_csr_issue_receipts.c
deleted file mode 100644
index 39aa72a..0000000
--- a/src/lib/donau_api_csr_issue_receipts.c
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2014-2022 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 lib/donau_api_csr_withdraw.c
- * @brief Implementation of /csr-withdraw requests (get R in donau used for
Clause Schnorr withdraw and refresh)
- * @author Lucien Heuzeveldt
- * @author Gian Demarmels
- */
-#include "taler/platform.h"
-#include <jansson.h>
-#include <microhttpd.h> /* just for HTTP status codes */
-#include <gnunet/gnunet_util_lib.h>
-#include <gnunet/gnunet_json_lib.h>
-#include <gnunet/gnunet_curl_lib.h>
-#include "taler_donau_service.h"
-#include "taler/taler_json_lib.h"
-#include "donau_api_handle.h"
-#include "taler_signatures.h"
-#include "donau_api_curl_defaults.h"
-
-
-/**
- * @brief A Clause Schnorr R Handle
- */
-struct DONAU_CsRWithdrawHandle
-{
- /**
- * Function to call with the result.
- */
- DONAU_CsRWithdrawCallback cb;
-
- /**
- * Closure for @a cb.
- */
- void *cb_cls;
-
- /**
- * The url for this request.
- */
- char *url;
-
- /**
- * Handle for the request.
- */
- struct GNUNET_CURL_Job *job;
-
- /**
- * Context for #DH_curl_easy_post(). Keeps the data that must
- * persist for Curl to make the upload.
- */
- struct TALER_CURL_PostContext post_ctx;
-};
-
-
-/**
- * We got a 200 OK response for the /reserves/$RESERVE_PUB/withdraw operation.
- * Extract the coin's signature and return it to the caller. The signature we
- * get from the donau is for the blinded value. Thus, we first must
- * unblind it and then should verify its validity against our coin's hash.
- *
- * If everything checks out, we return the unblinded signature
- * to the application via the callback.
- *
- * @param csrh operation handle
- * @param av reply from the donau
- * @param hr http response details
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on errors
- */
-static enum GNUNET_GenericReturnValue
-csr_ok (struct DONAU_CsRWithdrawHandle *csrh,
- const json_t *av,
- struct DONAU_HttpResponse *hr)
-{
- struct DONAU_CsRWithdrawResponse csrr = {
- .hr = *hr,
- };
- struct GNUNET_JSON_Specification spec[] = {
- TALER_JSON_spec_donau_withdraw_values (
- "ewv",
- &csrr.details.ok.alg_values),
- GNUNET_JSON_spec_end ()
- };
-
- if (GNUNET_OK !=
- GNUNET_JSON_parse (av,
- spec,
- NULL, NULL))
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- csrh->cb (csrh->cb_cls,
- &csrr);
- return GNUNET_OK;
-}
-
-
-/**
- * Function called when we're done processing the HTTP /csr request.
- *
- * @param cls the `struct DONAU_CsRWithdrawHandle`
- * @param response_code HTTP response code, 0 on error
- * @param response parsed JSON result, NULL on error
- */
-static void
-handle_csr_finished (void *cls,
- long response_code,
- const void *response)
-{
- struct DONAU_CsRWithdrawHandle *csrh = cls;
- const json_t *j = response;
- struct DONAU_HttpResponse hr = {
- .reply = j,
- .http_status = (unsigned int) response_code
- };
- struct DONAU_CsRWithdrawResponse csrr = {
- .hr = hr
- };
-
- csrh->job = NULL;
- switch (response_code)
- {
- case 0:
- csrr.hr.ec = TALER_EC_GENERIC_INVALID_RESPONSE;
- break;
- case MHD_HTTP_OK:
- {
- if (GNUNET_OK !=
- csr_ok (csrh,
- response,
- &hr))
- {
- GNUNET_break_op (0);
- csrr.hr.http_status = 0;
- csrr.hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
- break;
- }
- }
- DONAU_csr_withdraw_cancel (csrh);
- return;
- case MHD_HTTP_BAD_REQUEST:
- /* This should never happen, either us or the donau is buggy
- (or API version conflict); just pass JSON reply to the application */
- csrr.hr.ec = TALER_JSON_get_error_code (j);
- csrr.hr.hint = TALER_JSON_get_error_hint (j);
- break;
- case MHD_HTTP_NOT_FOUND:
- /* Nothing really to verify, the donau basically just says
- that it doesn't know the /csr endpoint or denomination.
- Can happen if the donau doesn't support Clause Schnorr.
- We should simply pass the JSON reply to the application. */
- csrr.hr.ec = TALER_JSON_get_error_code (j);
- csrr.hr.hint = TALER_JSON_get_error_hint (j);
- break;
- case MHD_HTTP_GONE:
- /* could happen if denomination was revoked */
- /* Note: one might want to check /keys for revocation
- signature here, alas tricky in case our /keys
- is outdated => left to clients */
- csrr.hr.ec = TALER_JSON_get_error_code (j);
- csrr.hr.hint = TALER_JSON_get_error_hint (j);
- break;
- case MHD_HTTP_INTERNAL_SERVER_ERROR:
- /* Server had an internal issue; we should retry, but this API
- leaves this to the application */
- csrr.hr.ec = TALER_JSON_get_error_code (j);
- csrr.hr.hint = TALER_JSON_get_error_hint (j);
- break;
- default:
- /* unexpected response code */
- GNUNET_break_op (0);
- csrr.hr.ec = TALER_JSON_get_error_code (j);
- csrr.hr.hint = TALER_JSON_get_error_hint (j);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Unexpected response code %u/%d for CS R request\n",
- (unsigned int) response_code,
- (int) hr.ec);
- break;
- }
- csrh->cb (csrh->cb_cls,
- &csrr);
- csrh->cb = NULL;
- DONAU_csr_withdraw_cancel (csrh);
-}
-
-
-struct DONAU_CsRWithdrawHandle *
-DONAU_csr_withdraw (
- struct GNUNET_CURL_Context *curl_ctx,
- const char *donau_url,
- const struct DONAU_DenomPublicKey *pk,
- const struct TALER_CsNonce *nonce,
- DONAU_CsRWithdrawCallback res_cb,
- void *res_cb_cls)
-{
- struct DONAU_CsRWithdrawHandle *csrh;
-
- if (TALER_DENOMINATION_CS != pk->key.cipher)
- {
- GNUNET_break (0);
- return NULL;
- }
- csrh = GNUNET_new (struct DONAU_CsRWithdrawHandle);
- csrh->cb = res_cb;
- csrh->cb_cls = res_cb_cls;
- csrh->url = TALER_url_join (donau_url,
- "csr-withdraw",
- NULL);
- if (NULL == csrh->url)
- {
- GNUNET_free (csrh);
- return NULL;
- }
-
- {
- CURL *eh;
- json_t *req;
-
- req = GNUNET_JSON_PACK (
- GNUNET_JSON_pack_data_varsize ("nonce",
- nonce,
- sizeof(struct TALER_CsNonce)),
- GNUNET_JSON_pack_data_varsize ("denom_pub_hash",
- &pk->h_key,
- sizeof(struct TALER_DenominationHashP)));
- GNUNET_assert (NULL != req);
- eh = DONAU_curl_easy_get_ (csrh->url);
- if ( (NULL == eh) ||
- (GNUNET_OK !=
- TALER_curl_easy_post (&csrh->post_ctx,
- eh,
- req)) )
- {
- GNUNET_break (0);
- if (NULL != eh)
- curl_easy_cleanup (eh);
- json_decref (req);
- GNUNET_free (csrh->url);
- GNUNET_free (csrh);
- return NULL;
- }
- json_decref (req);
- csrh->job = GNUNET_CURL_job_add2 (curl_ctx,
- eh,
- csrh->post_ctx.headers,
- &handle_csr_finished,
- csrh);
- }
- return csrh;
-}
-
-
-void
-DONAU_csr_withdraw_cancel (struct
- DONAU_CsRWithdrawHandle *csrh)
-{
- if (NULL != csrh->job)
- {
- GNUNET_CURL_job_cancel (csrh->job);
- csrh->job = NULL;
- }
- GNUNET_free (csrh->url);
- TALER_curl_easy_post_finished (&csrh->post_ctx);
- GNUNET_free (csrh);
-}
diff --git a/src/lib/donau_api_issue_receipts.c
b/src/lib/donau_api_issue_receipts.c
deleted file mode 100644
index 37070b1..0000000
--- a/src/lib/donau_api_issue_receipts.c
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2014-2022 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 lib/donau_api_withdraw.c
- * @brief Implementation of /reserves/$RESERVE_PUB/withdraw requests with
blinding/unblinding
- * @author Christian Grothoff
- */
-#include "taler/platform.h"
-#include <jansson.h>
-#include <microhttpd.h> /* just for HTTP status codes */
-#include <gnunet/gnunet_util_lib.h>
-#include <gnunet/gnunet_json_lib.h>
-#include <gnunet/gnunet_curl_lib.h>
-#include "taler_donau_service.h"
-#include "taler/taler_json_lib.h"
-#include "donau_api_handle.h"
-#include "taler_signatures.h"
-#include "donau_api_curl_defaults.h"
-
-
-/**
- * @brief A Withdraw Handle
- */
-struct DONAU_WithdrawHandle
-{
-
- /**
- * The curl context to use
- */
- struct GNUNET_CURL_Context *curl_ctx;
-
- /**
- * The base-URL to the donau
- */
- const char *donau_url;
-
- /**
- * The /keys material from the donau
- */
- struct DONAU_Keys *keys;
-
- /**
- * Handle for the actual (internal) withdraw operation.
- */
- struct DONAU_Withdraw2Handle *wh2;
-
- /**
- * Function to call with the result.
- */
- DONAU_WithdrawCallback cb;
-
- /**
- * Closure for @a cb.
- */
- void *cb_cls;
-
- /**
- * blinding secret
- */
- union TALER_DenominationBlindingKeyP bks;
-
- /**
- * Private key of the coin we are withdrawing.
- */
- struct TALER_CoinSpendPrivateKeyP priv;
-
- /**
- * Details of the planchet.
- */
- struct TALER_PlanchetDetail pd;
-
- /**
- * Values of the @cipher selected
- */
- struct TALER_DonauWithdrawValues alg_values;
-
- /**
- * Denomination key we are withdrawing.
- */
- struct DONAU_DenomPublicKey pk;
-
- /**
- * Handler for the CS R request (only used for TALER_DENOMINATION_CS
denominations)
- */
- struct DONAU_CsRWithdrawHandle *csrh;
-
-};
-
-
-/**
- * Function called when stage 1 of CS withdraw is finished (request r_pub's)
- *
- * @param cls the `struct DONAU_WithdrawHandle`
- * @param csrr replies from the /csr-withdraw request
- */
-static void
-withdraw_cs_stage_two_callback (
- void *cls,
- const struct DONAU_CsRWithdrawResponse *csrr)
-{
- struct DONAU_WithdrawHandle *wh = cls;
- struct DONAU_WithdrawResponse wr = {
- .hr = csrr->hr
- };
-
- wh->csrh = NULL;
- GNUNET_assert (TALER_DENOMINATION_CS == wh->pk.key.cipher);
- switch (csrr->hr.http_status)
- {
- case MHD_HTTP_OK:
- wh->alg_values = csrr->details.ok.alg_values;
- TALER_planchet_setup_coin_priv (&wh->ps,
- &wh->alg_values,
- &wh->priv);
- TALER_planchet_blinding_secret_create (&wh->ps,
- &wh->alg_values,
- &wh->bks);
- /* This initializes the 2nd half of the
- wh->pd.blinded_planchet! */
- if (GNUNET_OK !=
- TALER_planchet_prepare (&wh->pk.key,
- &wh->alg_values,
- &wh->bks,
- &wh->priv,
- wh->ach,
- &wh->c_hash,
- &wh->pd))
- {
- GNUNET_break (0);
- break;
- }
- wh->wh2 = DONAU_withdraw2 (wh->curl_ctx,
- wh->donau_url,
- wh->keys,
- &wh->pd,
- wh->reserve_priv,
- &handle_reserve_withdraw_finished,
- wh);
- return;
- default:
- break;
- }
- wh->cb (wh->cb_cls,
- &wr);
- DONAU_withdraw_cancel (wh);
-}
-
-
-struct DONAU_WithdrawHandle *
-DONAU_withdraw (
- struct GNUNET_CURL_Context *curl_ctx,
- const char *donau_url,
- struct DONAU_Keys *keys,
- const struct TALER_ReservePrivateKeyP *reserve_priv,
- const struct DONAU_WithdrawCoinInput *wci,
- DONAU_WithdrawCallback res_cb,
- void *res_cb_cls)
-{
- struct DONAU_WithdrawHandle *wh;
-
- wh = GNUNET_new (struct DONAU_WithdrawHandle);
- wh->keys = DONAU_keys_incref (keys);
- wh->donau_url = donau_url;
- wh->curl_ctx = curl_ctx;
- wh->cb = res_cb;
- wh->cb_cls = res_cb_cls;
- wh->reserve_priv = reserve_priv;
- wh->ps = *wci->ps;
- wh->ach = wci->ach;
- wh->pk = *wci->pk;
- TALER_denom_pub_deep_copy (&wh->pk.key,
- &wci->pk->key);
-
- switch (wci->pk->key.cipher)
- {
- case TALER_DENOMINATION_RSA:
- {
- wh->alg_values.cipher = TALER_DENOMINATION_RSA;
- TALER_planchet_setup_coin_priv (&wh->ps,
- &wh->alg_values,
- &wh->priv);
- TALER_planchet_blinding_secret_create (&wh->ps,
- &wh->alg_values,
- &wh->bks);
- if (GNUNET_OK !=
- TALER_planchet_prepare (&wh->pk.key,
- &wh->alg_values,
- &wh->bks,
- &wh->priv,
- wh->ach,
- &wh->c_hash,
- &wh->pd))
- {
- GNUNET_break (0);
- GNUNET_free (wh);
- return NULL;
- }
- wh->wh2 = DONAU_withdraw2 (curl_ctx,
- donau_url,
- keys,
- &wh->pd,
- wh->reserve_priv,
- &handle_reserve_withdraw_finished,
- wh);
- break;
- }
- case TALER_DENOMINATION_CS:
- {
- TALER_cs_withdraw_nonce_derive (
- &wh->ps,
- &wh->pd.blinded_planchet.details.cs_blinded_planchet.nonce);
- /* Note that we only initialize the first half
- of the blinded_planchet here; the other part
- will be done after the /csr-withdraw request! */
- wh->pd.blinded_planchet.cipher = TALER_DENOMINATION_CS;
- wh->csrh = DONAU_csr_withdraw (
- curl_ctx,
- donau_url,
- &wh->pk,
- &wh->pd.blinded_planchet.details.cs_blinded_planchet.nonce,
- &withdraw_cs_stage_two_callback,
- wh);
- break;
- }
- default:
- GNUNET_break (0);
- GNUNET_free (wh);
- return NULL;
- }
- return wh;
-}
-
-
-void
-DONAU_withdraw_cancel (struct DONAU_WithdrawHandle *wh)
-{
- TALER_blinded_planchet_free (&wh->pd.blinded_planchet);
- if (NULL != wh->csrh)
- {
- DONAU_csr_withdraw_cancel (wh->csrh);
- wh->csrh = NULL;
- }
- if (NULL != wh->wh2)
- {
- DONAU_withdraw2_cancel (wh->wh2);
- wh->wh2 = NULL;
- }
- DONAU_keys_decref (wh->keys);
- TALER_denom_pub_free (&wh->pk.key);
- GNUNET_free (wh);
-}
diff --git a/src/lib/donau_api_issue_receipts2.c
b/src/lib/donau_api_issue_receipts2.c
deleted file mode 100644
index 5e58cc8..0000000
--- a/src/lib/donau_api_issue_receipts2.c
+++ /dev/null
@@ -1,498 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2014-2023 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 lib/donau_api_withdraw2.c
- * @brief Implementation of /reserves/$RESERVE_PUB/withdraw requests without
blinding/unblinding
- * @author Christian Grothoff
- */
-#include "taler/platform.h"
-#include <jansson.h>
-#include <microhttpd.h> /* just for HTTP status codes */
-#include <gnunet/gnunet_util_lib.h>
-#include <gnunet/gnunet_json_lib.h>
-#include <gnunet/gnunet_curl_lib.h>
-#include "taler_donau_service.h"
-#include "taler/taler_json_lib.h"
-#include "donau_api_handle.h"
-#include "taler_signatures.h"
-#include "donau_api_curl_defaults.h"
-
-
-/**
- * @brief A Withdraw Handle
- */
-struct DONAU_Withdraw2Handle
-{
-
- /**
- * The /keys material from the donau
- */
- struct DONAU_Keys *keys;
-
- /**
- * The url for this request.
- */
- char *url;
-
- /**
- * Handle for the request.
- */
- struct GNUNET_CURL_Job *job;
-
- /**
- * Function to call with the result.
- */
- DONAU_Withdraw2Callback cb;
-
- /**
- * Closure for @a cb.
- */
- void *cb_cls;
-
- /**
- * Context for #DH_curl_easy_post(). Keeps the data that must
- * persist for Curl to make the upload.
- */
- struct TALER_CURL_PostContext post_ctx;
-
- /**
- * Total amount requested (value plus withdraw fee).
- */
- struct TALER_Amount requested_amount;
-
- /**
- * Public key of the reserve we are withdrawing from.
- */
- struct TALER_ReservePublicKeyP reserve_pub;
-
-};
-
-
-/**
- * We got a 200 OK response for the /reserves/$RESERVE_PUB/withdraw operation.
- * Extract the coin's signature and return it to the caller. The signature we
- * get from the donau is for the blinded value. Thus, we first must
- * unblind it and then should verify its validity against our coin's hash.
- *
- * If everything checks out, we return the unblinded signature
- * to the application via the callback.
- *
- * @param wh operation handle
- * @param json reply from the donau
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on errors
- */
-static enum GNUNET_GenericReturnValue
-reserve_withdraw_ok (struct DONAU_Withdraw2Handle *wh,
- const json_t *json)
-{
- struct DONAU_Withdraw2Response w2r = {
- .hr.reply = json,
- .hr.http_status = MHD_HTTP_OK
- };
- struct GNUNET_JSON_Specification spec[] = {
- TALER_JSON_spec_blinded_denom_sig ("ev_sig",
- &w2r.details.ok.blind_sig),
- GNUNET_JSON_spec_end ()
- };
-
- if (GNUNET_OK !=
- GNUNET_JSON_parse (json,
- spec,
- NULL, NULL))
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
-
- /* signature is valid, return it to the application */
- wh->cb (wh->cb_cls,
- &w2r);
- /* make sure callback isn't called again after return */
- wh->cb = NULL;
- GNUNET_JSON_parse_free (spec);
- return GNUNET_OK;
-}
-
-
-/**
- * We got a 409 CONFLICT response for the /reserves/$RESERVE_PUB/withdraw
operation.
- * Check the signatures on the withdraw transactions in the provided
- * history and that the balances add up. We don't do anything directly
- * with the information, as the JSON will be returned to the application.
- * However, our job is ensuring that the donau followed the protocol, and
- * this in particular means checking all of the signatures in the history.
- *
- * @param wh operation handle
- * @param json reply from the donau
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on errors
- */
-static enum GNUNET_GenericReturnValue
-reserve_withdraw_payment_required (
- struct DONAU_Withdraw2Handle *wh,
- const json_t *json)
-{
- struct TALER_Amount balance;
- struct TALER_Amount total_in_from_history;
- struct TALER_Amount total_out_from_history;
- json_t *history;
- size_t len;
- struct GNUNET_JSON_Specification spec[] = {
- TALER_JSON_spec_amount_any ("balance",
- &balance),
- GNUNET_JSON_spec_end ()
- };
-
- if (GNUNET_OK !=
- GNUNET_JSON_parse (json,
- spec,
- NULL, NULL))
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- history = json_object_get (json,
- "history");
- if (NULL == history)
- {
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
-
- /* go over transaction history and compute
- total incoming and outgoing amounts */
- len = json_array_size (history);
- {
- struct DONAU_ReserveHistoryEntry *rhistory;
-
- /* Use heap allocation as "len" may be very big and thus this may
- not fit on the stack. Use "GNUNET_malloc_large" as a malicious
- donau may theoretically try to crash us by giving a history
- that does not fit into our memory. */
- rhistory = GNUNET_malloc_large (
- sizeof (struct DONAU_ReserveHistoryEntry)
- * len);
- if (NULL == rhistory)
- {
- GNUNET_break (0);
- return GNUNET_SYSERR;
- }
-
- if (GNUNET_OK !=
- DONAU_parse_reserve_history (wh->keys,
- history,
- &wh->reserve_pub,
- balance.currency,
- &total_in_from_history,
- &total_out_from_history,
- len,
- rhistory))
- {
- GNUNET_break_op (0);
- DONAU_free_reserve_history (len,
- rhistory);
- return GNUNET_SYSERR;
- }
- DONAU_free_reserve_history (len,
- rhistory);
- }
-
- /* Check that funds were really insufficient */
- if (0 >= TALER_amount_cmp (&wh->requested_amount,
- &balance))
- {
- /* Requested amount is smaller or equal to reported balance,
- so this should not have failed. */
- GNUNET_break_op (0);
- return GNUNET_SYSERR;
- }
- return GNUNET_OK;
-}
-
-
-/**
- * Function called when we're done processing the
- * HTTP /reserves/$RESERVE_PUB/withdraw request.
- *
- * @param cls the `struct DONAU_WithdrawHandle`
- * @param response_code HTTP response code, 0 on error
- * @param response parsed JSON result, NULL on error
- */
-static void
-handle_reserve_withdraw_finished (void *cls,
- long response_code,
- const void *response)
-{
- struct DONAU_Withdraw2Handle *wh = cls;
- const json_t *j = response;
- struct DONAU_Withdraw2Response w2r = {
- .hr.reply = j,
- .hr.http_status = (unsigned int) response_code
- };
-
- wh->job = NULL;
- switch (response_code)
- {
- case 0:
- w2r.hr.ec = TALER_EC_GENERIC_INVALID_RESPONSE;
- break;
- case MHD_HTTP_OK:
- if (GNUNET_OK !=
- reserve_withdraw_ok (wh,
- j))
- {
- GNUNET_break_op (0);
- w2r.hr.http_status = 0;
- w2r.hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
- break;
- }
- GNUNET_assert (NULL == wh->cb);
- DONAU_withdraw2_cancel (wh);
- return;
- case MHD_HTTP_BAD_REQUEST:
- /* This should never happen, either us or the donau is buggy
- (or API version conflict); just pass JSON reply to the application */
- w2r.hr.ec = TALER_JSON_get_error_code (j);
- w2r.hr.hint = TALER_JSON_get_error_hint (j);
- break;
- case MHD_HTTP_FORBIDDEN:
- GNUNET_break_op (0);
- /* Nothing really to verify, donau says one of the signatures is
- invalid; as we checked them, this should never happen, we
- should pass the JSON reply to the application */
- w2r.hr.ec = TALER_JSON_get_error_code (j);
- w2r.hr.hint = TALER_JSON_get_error_hint (j);
- break;
- case MHD_HTTP_NOT_FOUND:
- /* Nothing really to verify, the donau basically just says
- that it doesn't know this reserve. Can happen if we
- query before the wire transfer went through.
- We should simply pass the JSON reply to the application. */
- w2r.hr.ec = TALER_JSON_get_error_code (j);
- w2r.hr.hint = TALER_JSON_get_error_hint (j);
- break;
- case MHD_HTTP_CONFLICT:
- w2r.hr.ec = TALER_JSON_get_error_code (j);
- w2r.hr.hint = TALER_JSON_get_error_hint (j);
-
- if (TALER_EC_DONAU_RESERVES_AGE_RESTRICTION_REQUIRED == w2r.hr.ec)
- break;
-
- /* The donau says that the reserve has insufficient funds;
- check the signatures in the history... */
- if (GNUNET_OK !=
- reserve_withdraw_payment_required (wh,
- j))
- {
- GNUNET_break_op (0);
- w2r.hr.http_status = 0;
- w2r.hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
- }
- break;
- case MHD_HTTP_GONE:
- /* could happen if denomination was revoked */
- /* Note: one might want to check /keys for revocation
- signature here, alas tricky in case our /keys
- is outdated => left to clients */
- w2r.hr.ec = TALER_JSON_get_error_code (j);
- w2r.hr.hint = TALER_JSON_get_error_hint (j);
- break;
- case MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS:
- /* only validate reply is well-formed */
- {
- uint64_t ptu;
- struct GNUNET_JSON_Specification spec[] = {
- GNUNET_JSON_spec_uint64 ("requirement_row",
- &ptu),
- GNUNET_JSON_spec_end ()
- };
-
- if (GNUNET_OK !=
- GNUNET_JSON_parse (j,
- spec,
- NULL, NULL))
- {
- GNUNET_break_op (0);
- w2r.hr.http_status = 0;
- w2r.hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
- break;
- }
- }
- break;
- case MHD_HTTP_INTERNAL_SERVER_ERROR:
- /* Server had an internal issue; we should retry, but this API
- leaves this to the application */
- w2r.hr.ec = TALER_JSON_get_error_code (j);
- w2r.hr.hint = TALER_JSON_get_error_hint (j);
- break;
- default:
- /* unexpected response code */
- GNUNET_break_op (0);
- w2r.hr.ec = TALER_JSON_get_error_code (j);
- w2r.hr.hint = TALER_JSON_get_error_hint (j);
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Unexpected response code %u/%d for donau withdraw\n",
- (unsigned int) response_code,
- (int) w2r.hr.ec);
- break;
- }
- if (NULL != wh->cb)
- {
- wh->cb (wh->cb_cls,
- &w2r);
- wh->cb = NULL;
- }
- DONAU_withdraw2_cancel (wh);
-}
-
-
-struct DONAU_Withdraw2Handle *
-DONAU_withdraw2 (
- struct GNUNET_CURL_Context *curl_ctx,
- const char *donau_url,
- struct DONAU_Keys *keys,
- const struct TALER_PlanchetDetail *pd,
- const struct TALER_ReservePrivateKeyP *reserve_priv,
- DONAU_Withdraw2Callback res_cb,
- void *res_cb_cls)
-{
- struct DONAU_Withdraw2Handle *wh;
- const struct DONAU_DenomPublicKey *dk;
- struct TALER_ReserveSignatureP reserve_sig;
- char arg_str[sizeof (struct TALER_ReservePublicKeyP) * 2 + 32];
- struct TALER_BlindedCoinHashP bch;
-
- GNUNET_assert (NULL != keys);
- dk = DONAU_get_denomination_key_by_hash (keys,
- &pd->denom_pub_hash);
- if (NULL == dk)
- {
- GNUNET_break (0);
- return NULL;
- }
- wh = GNUNET_new (struct DONAU_Withdraw2Handle);
- wh->keys = DONAU_keys_incref (keys);
- wh->cb = res_cb;
- wh->cb_cls = res_cb_cls;
- /* Compute how much we expected to charge to the reserve */
- if (0 >
- TALER_amount_add (&wh->requested_amount,
- &dk->value,
- &dk->fees.withdraw))
- {
- /* Overflow here? Very strange, our CPU must be fried... */
- GNUNET_break (0);
- GNUNET_free (wh);
- return NULL;
- }
-
- GNUNET_CRYPTO_eddsa_key_get_public (&reserve_priv->eddsa_priv,
- &wh->reserve_pub.eddsa_pub);
-
- {
- char pub_str[sizeof (struct TALER_ReservePublicKeyP) * 2];
- char *end;
-
- end = GNUNET_STRINGS_data_to_string (
- &wh->reserve_pub,
- sizeof (struct TALER_ReservePublicKeyP),
- pub_str,
- sizeof (pub_str));
- *end = '\0';
- GNUNET_snprintf (arg_str,
- sizeof (arg_str),
- "reserves/%s/withdraw",
- pub_str);
- }
-
- if (GNUNET_OK !=
- TALER_coin_ev_hash (&pd->blinded_planchet,
- &pd->denom_pub_hash,
- &bch))
- {
- GNUNET_break (0);
- GNUNET_free (wh);
- return NULL;
- }
-
- TALER_wallet_withdraw_sign (&pd->denom_pub_hash,
- &wh->requested_amount,
- &bch,
- reserve_priv,
- &reserve_sig);
- {
- json_t *withdraw_obj = GNUNET_JSON_PACK (
- GNUNET_JSON_pack_data_auto ("denom_pub_hash",
- &pd->denom_pub_hash),
- TALER_JSON_pack_blinded_planchet ("coin_ev",
- &pd->blinded_planchet),
- GNUNET_JSON_pack_data_auto ("reserve_sig",
- &reserve_sig));
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Attempting to withdraw from reserve %s\n",
- TALER_B2S (&wh->reserve_pub));
- wh->url = TALER_url_join (donau_url,
- arg_str,
- NULL);
- if (NULL == wh->url)
- {
- json_decref (withdraw_obj);
- GNUNET_free (wh);
- return NULL;
- }
- {
- CURL *eh;
-
- eh = DONAU_curl_easy_get_ (wh->url);
- if ( (NULL == eh) ||
- (GNUNET_OK !=
- TALER_curl_easy_post (&wh->post_ctx,
- eh,
- withdraw_obj)) )
- {
- GNUNET_break (0);
- if (NULL != eh)
- curl_easy_cleanup (eh);
- json_decref (withdraw_obj);
- GNUNET_free (wh->url);
- GNUNET_free (wh);
- return NULL;
- }
- json_decref (withdraw_obj);
- wh->job = GNUNET_CURL_job_add2 (curl_ctx,
- eh,
- wh->post_ctx.headers,
- &handle_reserve_withdraw_finished,
- wh);
- }
- }
- return wh;
-}
-
-
-void
-DONAU_withdraw2_cancel (struct DONAU_Withdraw2Handle *wh)
-{
- if (NULL != wh->job)
- {
- GNUNET_CURL_job_cancel (wh->job);
- wh->job = NULL;
- }
- GNUNET_free (wh->url);
- TALER_curl_easy_post_finished (&wh->post_ctx);
- DONAU_keys_decref (wh->keys);
- GNUNET_free (wh);
-}
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
- [taler-donau] branch master updated: cleanup, gnunet, 2024/01/01
- [taler-donau] branch master updated: cleanup, gnunet, 2024/01/02
- [taler-donau] branch master updated: cleanup, gnunet, 2024/01/02
- [taler-donau] branch master updated: cleanup, gnunet, 2024/01/02
- [taler-donau] branch master updated: cleanup,
gnunet <=
- [taler-donau] branch master updated: cleanup, gnunet, 2024/01/02
- [taler-donau] branch master updated: cleanup, gnunet, 2024/01/02
- [taler-donau] branch master updated: cleanup, gnunet, 2024/01/02
- [taler-donau] branch master updated: cleanup, gnunet, 2024/01/05