diff options
Diffstat (limited to 'src/exchangedb')
| -rw-r--r-- | src/exchangedb/.gitignore | 3 | ||||
| -rw-r--r-- | src/exchangedb/0004-wire_accounts.sql | 26 | ||||
| -rw-r--r-- | src/exchangedb/Makefile.am | 13 | ||||
| -rw-r--r-- | src/exchangedb/bench_db.c | 12 | ||||
| -rw-r--r-- | src/exchangedb/drop.sql | 1 | ||||
| -rw-r--r-- | src/exchangedb/exchange-0004.sql.in | 24 | ||||
| -rw-r--r-- | src/exchangedb/pg_aggregate.c | 69 | ||||
| -rw-r--r-- | src/exchangedb/pg_get_wire_accounts.c | 32 | ||||
| -rw-r--r-- | src/exchangedb/pg_insert_wire.c | 15 | ||||
| -rw-r--r-- | src/exchangedb/pg_insert_wire.h | 6 | ||||
| -rw-r--r-- | src/exchangedb/pg_lookup_records_by_table.c | 6 | ||||
| -rw-r--r-- | src/exchangedb/pg_update_wire.c | 20 | ||||
| -rw-r--r-- | src/exchangedb/pg_update_wire.h | 8 | 
13 files changed, 189 insertions, 46 deletions
| diff --git a/src/exchangedb/.gitignore b/src/exchangedb/.gitignore index fa833d81..6e67fadb 100644 --- a/src/exchangedb/.gitignore +++ b/src/exchangedb/.gitignore @@ -12,4 +12,5 @@ test-exchangedb-batch-reserves-in-insert-postgres  test-exchangedb-by-j-postgres  test-exchangedb-populate-link-data-postgres  test-exchangedb-populate-ready-deposit-postgres -test-exchangedb-populate-select-refunds-by-coin-postgres
\ No newline at end of file +test-exchangedb-populate-select-refunds-by-coin-postgres +exchange-0004.sql diff --git a/src/exchangedb/0004-wire_accounts.sql b/src/exchangedb/0004-wire_accounts.sql new file mode 100644 index 00000000..6114c821 --- /dev/null +++ b/src/exchangedb/0004-wire_accounts.sql @@ -0,0 +1,26 @@ +-- +-- This file is part of TALER +-- Copyright (C) 2023 Taler Systems SA +-- +-- TALER is free software; you can redistribute it and/or modify it under the +-- terms of the GNU General Public License as published by the Free Software +-- Foundation; either version 3, or (at your option) any later version. +-- +-- TALER is distributed in the hope that it will be useful, but WITHOUT ANY +-- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +-- A PARTICULAR PURPOSE.  See the GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License along with +-- TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/> +-- + +ALTER TABLE wire_accounts +  ADD COLUMN conversion_url VARCHAR DEFAULT (NULL), +  ADD COLUMN debit_restrictions VARCHAR DEFAULT (NULL), +  ADD COLUMN credit_restrictions VARCHAR DEFAULT (NULL); +COMMENT ON COLUMN wire_accounts.conversion_url +  IS 'URL of a currency conversion service if conversion is needed when this account is used; NULL if there is no conversion.'; +COMMENT ON COLUMN wire_accounts.debit_restrictions +  IS 'JSON array describing restrictions imposed when debiting this account. Empty for no restrictions, NULL if account was migrated from previous database revision or account is disabled.'; +COMMENT ON COLUMN wire_accounts.credit_restrictions +  IS 'JSON array describing restrictions imposed when crediting this account. Empty for no restrictions, NULL if account was migrated from previous database revision or account is disabled.'; diff --git a/src/exchangedb/Makefile.am b/src/exchangedb/Makefile.am index de76997c..ee78b87f 100644 --- a/src/exchangedb/Makefile.am +++ b/src/exchangedb/Makefile.am @@ -20,7 +20,9 @@ sqlinputs = \    0002-*.sql \    exchange-0002.sql.in \    0003-*.sql \ -  exchange-0003.sql.in +  exchange-0003.sql.in \ +  0004-*.sql \ +  exchange-0004.sql.in  sql_DATA = \    benchmark-0001.sql \ @@ -28,6 +30,7 @@ sql_DATA = \    exchange-0001.sql \    exchange-0002.sql \    exchange-0003.sql \ +  exchange-0004.sql \    drop.sql \    procedures.sql @@ -39,7 +42,8 @@ BUILT_SOURCES = \  CLEANFILES = \    exchange-0002.sql \ -  exchange-0003.sql +  exchange-0003.sql \ +  exchange-0004.sql  procedures.sql: procedures.sql.in exchange_do_*.sql  	chmod +w $@ || true @@ -56,6 +60,11 @@ exchange-0003.sql: exchange-0003.sql.in 0003-*.sql  	gcc -E -P -undef - < exchange-0003.sql.in 2>/dev/null | sed -e "s/--.*//" | awk 'NF' - >$@  	chmod ugo-w $@ +exchange-0004.sql: exchange-0004.sql.in 0004-*.sql +	chmod +w $@ || true +	gcc -E -P -undef - < exchange-0004.sql.in 2>/dev/null | sed -e "s/--.*//" | awk 'NF' - >$@ +	chmod ugo-w $@ +  EXTRA_DIST = \    exchangedb.conf \    exchangedb-postgres.conf \ diff --git a/src/exchangedb/bench_db.c b/src/exchangedb/bench_db.c index a85834d1..302d2306 100644 --- a/src/exchangedb/bench_db.c +++ b/src/exchangedb/bench_db.c @@ -169,9 +169,9 @@ bem_insert (struct GNUNET_PQ_Context *conn,    GNUNET_CRYPTO_hash (&b,                        sizeof (b),                        &hc); -  memcpy (&ihc, -          &hc, -          sizeof (ihc)); +  GNUNET_memcpy (&ihc, +                 &hc, +                 sizeof (ihc));    {      struct GNUNET_PQ_QueryParam params[] = {        GNUNET_PQ_query_param_auto_from_type (&hc), @@ -265,9 +265,9 @@ bem_select (struct GNUNET_PQ_Context *conn,    GNUNET_CRYPTO_hash (&b,                        sizeof (b),                        &hc); -  memcpy (&ihc, -          &hc, -          sizeof (ihc)); +  GNUNET_memcpy (&ihc, +                 &hc, +                 sizeof (ihc));    {      struct GNUNET_PQ_QueryParam params[] = {        GNUNET_PQ_query_param_uint32 (&ihc), diff --git a/src/exchangedb/drop.sql b/src/exchangedb/drop.sql index ecebde6f..843cda8e 100644 --- a/src/exchangedb/drop.sql +++ b/src/exchangedb/drop.sql @@ -21,6 +21,7 @@ BEGIN;  SELECT _v.unregister_patch('exchange-0001');  SELECT _v.unregister_patch('exchange-0002');  SELECT _v.unregister_patch('exchange-0003'); +SELECT _v.unregister_patch('exchange-0004');  DROP SCHEMA exchange CASCADE; diff --git a/src/exchangedb/exchange-0004.sql.in b/src/exchangedb/exchange-0004.sql.in new file mode 100644 index 00000000..00979e19 --- /dev/null +++ b/src/exchangedb/exchange-0004.sql.in @@ -0,0 +1,24 @@ +-- +-- 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 MERCHANTABILITY or FITNESS FOR +-- A PARTICULAR PURPOSE.  See the GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License along with +-- TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/> +-- + +BEGIN; + +SELECT _v.register_patch('exchange-0004', NULL, NULL); +SET search_path TO exchange; + +#include "0004-wire_accounts.sql" + +COMMIT; diff --git a/src/exchangedb/pg_aggregate.c b/src/exchangedb/pg_aggregate.c index 6e94cbeb..76d0adec 100644 --- a/src/exchangedb/pg_aggregate.c +++ b/src/exchangedb/pg_aggregate.c @@ -22,6 +22,7 @@  #include "taler_error_codes.h"  #include "taler_dbevents.h"  #include "taler_pq_lib.h" +#include "pg_event_notify.h"  #include "pg_aggregate.h"  #include "pg_helper.h" @@ -35,34 +36,12 @@ TEH_PG_aggregate (  {    struct PostgresClosure *pg = cls;    struct GNUNET_TIME_Absolute now = {0}; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_absolute_time (&now), -    GNUNET_PQ_query_param_auto_from_type (merchant_pub), -    GNUNET_PQ_query_param_auto_from_type (h_payto), -    GNUNET_PQ_query_param_auto_from_type (wtid), -    GNUNET_PQ_query_param_end -  };    uint64_t sum_deposit_value;    uint64_t sum_deposit_frac;    uint64_t sum_refund_value;    uint64_t sum_refund_frac;    uint64_t sum_fee_value;    uint64_t sum_fee_frac; -  struct GNUNET_PQ_ResultSpec rs[] = { -    GNUNET_PQ_result_spec_uint64 ("sum_deposit_value", -                                  &sum_deposit_value), -    GNUNET_PQ_result_spec_uint64 ("sum_deposit_fraction", -                                  &sum_deposit_frac), -    GNUNET_PQ_result_spec_uint64 ("sum_refund_value", -                                  &sum_refund_value), -    GNUNET_PQ_result_spec_uint64 ("sum_refund_fraction", -                                  &sum_refund_frac), -    GNUNET_PQ_result_spec_uint64 ("sum_fee_value", -                                  &sum_fee_value), -    GNUNET_PQ_result_spec_uint64 ("sum_fee_fraction", -                                  &sum_fee_frac), -    GNUNET_PQ_result_spec_end -  };    enum GNUNET_DB_QueryStatus qs;    struct TALER_Amount sum_deposit;    struct TALER_Amount sum_refund; @@ -71,8 +50,6 @@ TEH_PG_aggregate (    now = GNUNET_TIME_absolute_round_down (GNUNET_TIME_absolute_get (),                                           pg->aggregator_shift); - -  /* Used in #postgres_aggregate() */    PREPARE (pg,             "aggregate",             "WITH dep AS (" /* restrict to our merchant and account and mark as done */ @@ -148,11 +125,35 @@ TEH_PG_aggregate (             "   FULL OUTER JOIN ref ON (FALSE)"    /* We just want all sums */             "   FULL OUTER JOIN fees ON (FALSE);"); +  { +    struct GNUNET_PQ_QueryParam params[] = { +      GNUNET_PQ_query_param_absolute_time (&now), +      GNUNET_PQ_query_param_auto_from_type (merchant_pub), +      GNUNET_PQ_query_param_auto_from_type (h_payto), +      GNUNET_PQ_query_param_auto_from_type (wtid), +      GNUNET_PQ_query_param_end +    }; +    struct GNUNET_PQ_ResultSpec rs[] = { +      GNUNET_PQ_result_spec_uint64 ("sum_deposit_value", +                                    &sum_deposit_value), +      GNUNET_PQ_result_spec_uint64 ("sum_deposit_fraction", +                                    &sum_deposit_frac), +      GNUNET_PQ_result_spec_uint64 ("sum_refund_value", +                                    &sum_refund_value), +      GNUNET_PQ_result_spec_uint64 ("sum_refund_fraction", +                                    &sum_refund_frac), +      GNUNET_PQ_result_spec_uint64 ("sum_fee_value", +                                    &sum_fee_value), +      GNUNET_PQ_result_spec_uint64 ("sum_fee_fraction", +                                    &sum_fee_frac), +      GNUNET_PQ_result_spec_end +    }; -  qs = GNUNET_PQ_eval_prepared_singleton_select (pg->conn, -                                                 "aggregate", -                                                 params, -                                                 rs); +    qs = GNUNET_PQ_eval_prepared_singleton_select (pg->conn, +                                                   "aggregate", +                                                   params, +                                                   rs); +  }    if (qs < 0)    {      GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs); @@ -165,6 +166,18 @@ TEH_PG_aggregate (                                            total));      return qs;    } +  { +    struct TALER_CoinDepositEventP rep = { +      .header.size = htons (sizeof (rep)), +      .header.type = htons (TALER_DBEVENT_EXCHANGE_DEPOSIT_STATUS_CHANGED), +      .merchant_pub = *merchant_pub +    }; + +    TEH_PG_event_notify (pg, +                         &rep.header, +                         NULL, +                         0); +  }    GNUNET_assert (GNUNET_OK ==                   TALER_amount_set_zero (pg->currency,                                          &sum_deposit)); diff --git a/src/exchangedb/pg_get_wire_accounts.c b/src/exchangedb/pg_get_wire_accounts.c index 43590acf..23b93904 100644 --- a/src/exchangedb/pg_get_wire_accounts.c +++ b/src/exchangedb/pg_get_wire_accounts.c @@ -66,10 +66,25 @@ get_wire_accounts_cb (void *cls,    for (unsigned int i = 0; i < num_results; i++)    {      char *payto_uri; +    char *conversion_url = NULL; +    json_t *debit_restrictions = NULL; +    json_t *credit_restrictions = NULL;      struct TALER_MasterSignatureP master_sig;      struct GNUNET_PQ_ResultSpec rs[] = {        GNUNET_PQ_result_spec_string ("payto_uri",                                      &payto_uri), +      GNUNET_PQ_result_spec_allow_null ( +        GNUNET_PQ_result_spec_string ("conversion_url", +                                      &conversion_url), +        NULL), +      GNUNET_PQ_result_spec_allow_null ( +        TALER_PQ_result_spec_json ("debit_restrictions", +                                   &debit_restrictions), +        NULL), +      GNUNET_PQ_result_spec_allow_null ( +        TALER_PQ_result_spec_json ("credit_restrictions", +                                   &credit_restrictions), +        NULL),        GNUNET_PQ_result_spec_auto_from_type ("master_sig",                                              &master_sig),        GNUNET_PQ_result_spec_end @@ -84,8 +99,21 @@ get_wire_accounts_cb (void *cls,        ctx->status = GNUNET_SYSERR;        return;      } +    if (NULL == debit_restrictions) +    { +      debit_restrictions = json_array (); +      GNUNET_assert (NULL != debit_restrictions); +    } +    if (NULL == credit_restrictions) +    { +      credit_restrictions = json_array (); +      GNUNET_assert (NULL != credit_restrictions); +    }      ctx->cb (ctx->cb_cls,               payto_uri, +             conversion_url, +             debit_restrictions, +             credit_restrictions,               &master_sig);      GNUNET_PQ_cleanup_result (rs);    } @@ -112,6 +140,9 @@ TEH_PG_get_wire_accounts (void *cls,             "get_wire_accounts",             "SELECT"             " payto_uri" +           ",conversion_url" +           ",debit_restrictions" +           ",credit_restrictions"             ",master_sig"             " FROM wire_accounts"             " WHERE is_active"); @@ -123,5 +154,4 @@ TEH_PG_get_wire_accounts (void *cls,    if (GNUNET_OK != ctx.status)      return GNUNET_DB_STATUS_HARD_ERROR;    return qs; -  } diff --git a/src/exchangedb/pg_insert_wire.c b/src/exchangedb/pg_insert_wire.c index 75323b6f..8329a04a 100644 --- a/src/exchangedb/pg_insert_wire.c +++ b/src/exchangedb/pg_insert_wire.c @@ -1,6 +1,6 @@  /*     This file is part of TALER -   Copyright (C) 2022 Taler Systems SA +   Copyright (C) 2022, 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 @@ -29,12 +29,20 @@  enum GNUNET_DB_QueryStatus  TEH_PG_insert_wire (void *cls,                      const char *payto_uri, +                    const char *conversion_url, +                    json_t *debit_restrictions, +                    json_t *credit_restrictions,                      struct GNUNET_TIME_Timestamp start_date,                      const struct TALER_MasterSignatureP *master_sig)  {    struct PostgresClosure *pg = cls;    struct GNUNET_PQ_QueryParam params[] = {      GNUNET_PQ_query_param_string (payto_uri), +    NULL == conversion_url +    ? GNUNET_PQ_query_param_null () +    : GNUNET_PQ_query_param_string (conversion_url), +    TALER_PQ_query_param_json (debit_restrictions), +    TALER_PQ_query_param_json (credit_restrictions),      GNUNET_PQ_query_param_auto_from_type (master_sig),      GNUNET_PQ_query_param_timestamp (&start_date),      GNUNET_PQ_query_param_end @@ -44,11 +52,14 @@ TEH_PG_insert_wire (void *cls,             "insert_wire",             "INSERT INTO wire_accounts "             "(payto_uri" +           ",conversion_url" +           ",debit_restrictions" +           ",credit_restrictions"             ",master_sig"             ",is_active"             ",last_change"             ") VALUES " -           "($1, $2, true, $3);"); +           "($1, $2, $3, $4, $5, true, $6);");    return GNUNET_PQ_eval_prepared_non_select (pg->conn,                                               "insert_wire",                                               params); diff --git a/src/exchangedb/pg_insert_wire.h b/src/exchangedb/pg_insert_wire.h index 670928d7..c949327d 100644 --- a/src/exchangedb/pg_insert_wire.h +++ b/src/exchangedb/pg_insert_wire.h @@ -29,6 +29,9 @@   *   * @param cls closure   * @param payto_uri wire account of the exchange + * @param conversion_url URL of a conversion service, NULL if there is no conversion + * @param debit_restrictions JSON array with debit restrictions on the account + * @param credit_restrictions JSON array with credit restrictions on the account   * @param start_date date when the account was added by the offline system   *                      (only to be used for replay detection)   * @param master_sig public signature affirming the existence of the account, @@ -38,6 +41,9 @@  enum GNUNET_DB_QueryStatus  TEH_PG_insert_wire (void *cls,                      const char *payto_uri, +                    const char *conversion_url, +                    json_t *debit_restrictions, +                    json_t *credit_restrictions,                      struct GNUNET_TIME_Timestamp start_date,                      const struct TALER_MasterSignatureP *master_sig); diff --git a/src/exchangedb/pg_lookup_records_by_table.c b/src/exchangedb/pg_lookup_records_by_table.c index efa0fec5..534e9a1d 100644 --- a/src/exchangedb/pg_lookup_records_by_table.c +++ b/src/exchangedb/pg_lookup_records_by_table.c @@ -1118,9 +1118,9 @@ lrbt_cb_table_refresh_transfer_keys (void *cls,        ctx->error = true;        return;      } -    memcpy (&td.details.refresh_transfer_keys.tprivs[0], -            tpriv, -            tpriv_size); +    GNUNET_memcpy (&td.details.refresh_transfer_keys.tprivs[0], +                   tpriv, +                   tpriv_size);      ctx->cb (ctx->cb_cls,               &td);      GNUNET_PQ_cleanup_result (rs); diff --git a/src/exchangedb/pg_update_wire.c b/src/exchangedb/pg_update_wire.c index 4059348c..0c4ec7b5 100644 --- a/src/exchangedb/pg_update_wire.c +++ b/src/exchangedb/pg_update_wire.c @@ -1,6 +1,6 @@  /*     This file is part of TALER -   Copyright (C) 2022 Taler Systems SA +   Copyright (C) 2022, 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 @@ -29,6 +29,9 @@  enum GNUNET_DB_QueryStatus  TEH_PG_update_wire (void *cls,                      const char *payto_uri, +                    const char *conversion_url, +                    json_t *debit_restrictions, +                    json_t *credit_restrictions,                      struct GNUNET_TIME_Timestamp change_date,                      bool enabled)  { @@ -36,17 +39,28 @@ TEH_PG_update_wire (void *cls,    struct GNUNET_PQ_QueryParam params[] = {      GNUNET_PQ_query_param_string (payto_uri),      GNUNET_PQ_query_param_bool (enabled), +    NULL == conversion_url +    ? GNUNET_PQ_query_param_null () +    : GNUNET_PQ_query_param_string (conversion_url), +    enabled +    ? TALER_PQ_query_param_json (debit_restrictions) +    : GNUNET_PQ_query_param_null (), +    enabled +    ? TALER_PQ_query_param_json (credit_restrictions) +    : GNUNET_PQ_query_param_null (),      GNUNET_PQ_query_param_timestamp (&change_date),      GNUNET_PQ_query_param_end    }; -  /* used in #postgres_update_wire() */    PREPARE (pg,             "update_wire",             "UPDATE wire_accounts"             " SET"             "  is_active=$2" -           " ,last_change=$3" +           " ,conversion_url=$3" +           " ,debit_restrictions=$4" +           " ,credit_restrictions=$5" +           " ,last_change=$6"             " WHERE payto_uri=$1");    return GNUNET_PQ_eval_prepared_non_select (pg->conn,                                               "update_wire", diff --git a/src/exchangedb/pg_update_wire.h b/src/exchangedb/pg_update_wire.h index 67038b58..360b8845 100644 --- a/src/exchangedb/pg_update_wire.h +++ b/src/exchangedb/pg_update_wire.h @@ -24,11 +24,16 @@  #include "taler_util.h"  #include "taler_json_lib.h"  #include "taler_exchangedb_plugin.h" + +  /**   * Update information about a wire account of the exchange.   *   * @param cls closure   * @param payto_uri account the update is about + * @param conversion_url URL of a conversion service, NULL if there is no conversion + * @param debit_restrictions JSON array with debit restrictions on the account; NULL allowed if not @a enabled + * @param credit_restrictions JSON array with credit restrictions on the account; NULL allowed if not @a enabled   * @param change_date date when the account status was last changed   *                      (only to be used for replay detection)   * @param enabled true to enable, false to disable (the actual change) @@ -37,6 +42,9 @@  enum GNUNET_DB_QueryStatus  TEH_PG_update_wire (void *cls,                      const char *payto_uri, +                    const char *conversion_url, +                    json_t *debit_restrictions, +                    json_t *credit_restrictions,                      struct GNUNET_TIME_Timestamp change_date,                      bool enabled); | 
