gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] [taler-exchange] branch master updated: fix auditor to prop


From: gnunet
Subject: [GNUnet-SVN] [taler-exchange] branch master updated: fix auditor to properly verify wire fee signatures and more gracefully handle arithmetic amount issue
Date: Thu, 04 Jan 2018 00:41:22 +0100

This is an automated email from the git hooks/post-receive script.

grothoff pushed a commit to branch master
in repository exchange.

The following commit(s) were added to refs/heads/master by this push:
     new 5587732  fix auditor to properly verify wire fee signatures and more 
gracefully handle arithmetic amount issue
5587732 is described below

commit 5587732f5276621ada83a53d1fb0ee8b6f80032b
Author: Christian Grothoff <address@hidden>
AuthorDate: Thu Jan 4 00:41:19 2018 +0100

    fix auditor to properly verify wire fee signatures and more gracefully 
handle arithmetic amount issue
---
 src/auditor/taler-auditor.c                        | 14 +++++++++--
 src/exchange-lib/test_exchange_api.c               |  2 +-
 src/exchange/taler-exchange-aggregator.c           |  1 +
 src/exchange/taler-exchange-httpd_track_transfer.c |  2 ++
 src/exchangedb/plugin_exchangedb_postgres.c        | 27 ++++++++++++++++++++--
 src/exchangedb/test_exchangedb.c                   | 23 ++++++++++++++----
 src/include/taler_exchangedb_plugin.h              |  4 ++++
 7 files changed, 64 insertions(+), 9 deletions(-)

diff --git a/src/auditor/taler-auditor.c b/src/auditor/taler-auditor.c
index 870a81a..89f0446 100644
--- a/src/auditor/taler-auditor.c
+++ b/src/auditor/taler-auditor.c
@@ -1664,10 +1664,15 @@ struct WireFeeInfo
   struct GNUNET_TIME_Absolute end_date;
 
   /**
-   * How high is the fee.
+   * How high is the wire fee.
    */
   struct TALER_Amount wire_fee;
 
+  /**
+   * How high is the closing fee.
+   */
+  struct TALER_Amount closing_fee;
+
 };
 
 
@@ -1815,6 +1820,7 @@ check_transaction_history (const struct 
TALER_CoinSpendPublicKeyP *coin_pub,
   struct TALER_Amount spent;
   struct TALER_Amount value;
   struct TALER_Amount merchant_loss;
+  struct TALER_Amount merchant_delta;
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Checking transaction history of coin %s\n",
@@ -2043,7 +2049,7 @@ check_transaction_history (const struct 
TALER_CoinSpendPublicKeyP *coin_pub,
 
   /* Finally, update @a merchant_gain by subtracting what he "lost" from 
refunds */
   if (GNUNET_SYSERR ==
-      TALER_amount_subtract (merchant_gain,
+      TALER_amount_subtract (&merchant_delta,
                              merchant_gain,
                              &merchant_loss))
   {
@@ -2055,6 +2061,7 @@ check_transaction_history (const struct 
TALER_CoinSpendPublicKeyP *coin_pub,
                                           0);
     return GNUNET_SYSERR;
   }
+  *merchant_gain = merchant_delta;
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Coin %s contributes %s to contract %s\n",
               TALER_B2S (coin_pub),
@@ -2276,6 +2283,7 @@ get_wire_fee (struct AggregationContext *ac,
                          &wfi->start_date,
                          &wfi->end_date,
                          &wfi->wire_fee,
+                        &wfi->closing_fee,
                          &master_sig))
   {
     GNUNET_break (0);
@@ -2299,6 +2307,8 @@ get_wire_fee (struct AggregationContext *ac,
     wp.end_date = GNUNET_TIME_absolute_hton (wfi->end_date);
     TALER_amount_hton (&wp.wire_fee,
                        &wfi->wire_fee);
+    TALER_amount_hton (&wp.closing_fee,
+                       &wfi->closing_fee);
     if (GNUNET_OK !=
         GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_MASTER_WIRE_FEES,
                                     &wp.purpose,
diff --git a/src/exchange-lib/test_exchange_api.c 
b/src/exchange-lib/test_exchange_api.c
index a1aa38c..3a9cfd1 100644
--- a/src/exchange-lib/test_exchange_api.c
+++ b/src/exchange-lib/test_exchange_api.c
@@ -3566,7 +3566,7 @@ run (void *cls)
       .label = "check-empty-after-refund" },
 
 
-#if 0
+#if 1
     /* Test refunded coins are never executed, even past
        refund deadline */
     { .oc = OC_ADMIN_ADD_INCOMING,
diff --git a/src/exchange/taler-exchange-aggregator.c 
b/src/exchange/taler-exchange-aggregator.c
index 3de5630..c9ff958 100644
--- a/src/exchange/taler-exchange-aggregator.c
+++ b/src/exchange/taler-exchange-aggregator.c
@@ -374,6 +374,7 @@ update_fees (struct WirePlugin *wp,
                                     p->start_date,
                                     p->end_date,
                                     &p->wire_fee,
+                                    &p->closing_fee,
                                     &p->master_sig);
     if (qs < 0)
     {
diff --git a/src/exchange/taler-exchange-httpd_track_transfer.c 
b/src/exchange/taler-exchange-httpd_track_transfer.c
index 4d28096..38c6c29 100644
--- a/src/exchange/taler-exchange-httpd_track_transfer.c
+++ b/src/exchange/taler-exchange-httpd_track_transfer.c
@@ -352,6 +352,7 @@ track_transfer_transaction (void *cls,
   struct GNUNET_TIME_Absolute wire_fee_start_date;
   struct GNUNET_TIME_Absolute wire_fee_end_date;
   struct TALER_MasterSignatureP wire_fee_master_sig;
+  struct TALER_Amount closing_fee;
 
   ctx->is_valid = GNUNET_NO;
   ctx->wdd_head = NULL;
@@ -393,6 +394,7 @@ track_transfer_transaction (void *cls,
                                 &wire_fee_start_date,
                                 &wire_fee_end_date,
                                 &ctx->wire_fee,
+                                &closing_fee,
                                 &wire_fee_master_sig);
   if (0 >= qs)
   {
diff --git a/src/exchangedb/plugin_exchangedb_postgres.c 
b/src/exchangedb/plugin_exchangedb_postgres.c
index 7e1ef54..8477464 100644
--- a/src/exchangedb/plugin_exchangedb_postgres.c
+++ b/src/exchangedb/plugin_exchangedb_postgres.c
@@ -383,6 +383,9 @@ postgres_create_tables (void *cls)
                            ",wire_fee_val INT8 NOT NULL"
                            ",wire_fee_frac INT4 NOT NULL"
                            ",wire_fee_curr VARCHAR("TALER_CURRENCY_LEN_STR") 
NOT NULL"
+                           ",closing_fee_val INT8 NOT NULL"
+                           ",closing_fee_frac INT4 NOT NULL"
+                           ",closing_fee_curr 
VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
                            ",master_sig BYTEA NOT NULL CHECK 
(LENGTH(master_sig)=64)"
                            ",PRIMARY KEY (wire_method, start_date)" /* this 
combo must be unique */
                            ");"),
@@ -1170,6 +1173,9 @@ postgres_prepare (PGconn *db_conn)
                             ",wire_fee_val"
                             ",wire_fee_frac"
                             ",wire_fee_curr"
+                            ",closing_fee_val"
+                            ",closing_fee_frac"
+                            ",closing_fee_curr"
                             ",master_sig"
                             " FROM wire_fee"
                             " WHERE wire_method=$1"
@@ -1185,10 +1191,13 @@ postgres_prepare (PGconn *db_conn)
                             ",wire_fee_val"
                             ",wire_fee_frac"
                             ",wire_fee_curr"
+                            ",closing_fee_val"
+                            ",closing_fee_frac"
+                            ",closing_fee_curr"
                             ",master_sig"
                             ") VALUES "
-                            "($1, $2, $3, $4, $5, $6, $7);",
-                            7),
+                            "($1, $2, $3, $4, $5, $6, $7, $8, $9, $10);",
+                            19),
     /* Used in #postgres_store_wire_transfer_out */
     GNUNET_PQ_make_prepare ("insert_wire_out",
                             "INSERT INTO wire_out "
@@ -4356,6 +4365,7 @@ postgres_insert_aggregation_tracking (void *cls,
  * @param[out] start_date when does the fee go into effect
  * @param[out] end_date when does the fee end being valid
  * @param[out] wire_fee how high is the wire transfer fee
+ * @param[out] closing_fee how high is the closing fee
  * @param[out] master_sig signature over the above by the exchange master key
  * @return status of the transaction
  */
@@ -4367,6 +4377,7 @@ postgres_get_wire_fee (void *cls,
                        struct GNUNET_TIME_Absolute *start_date,
                        struct GNUNET_TIME_Absolute *end_date,
                        struct TALER_Amount *wire_fee,
+                      struct TALER_Amount *closing_fee,
                        struct TALER_MasterSignatureP *master_sig)
 {
   struct GNUNET_PQ_QueryParam params[] = {
@@ -4378,6 +4389,7 @@ postgres_get_wire_fee (void *cls,
     TALER_PQ_result_spec_absolute_time ("start_date", start_date),
     TALER_PQ_result_spec_absolute_time ("end_date", end_date),
     TALER_PQ_result_spec_amount ("wire_fee", wire_fee),
+    TALER_PQ_result_spec_amount ("closing_fee", closing_fee),
     GNUNET_PQ_result_spec_auto_from_type ("master_sig", master_sig),
     GNUNET_PQ_result_spec_end
   };
@@ -4398,6 +4410,7 @@ postgres_get_wire_fee (void *cls,
  * @param start_date when does the fee go into effect
  * @param end_date when does the fee end being valid
  * @param wire_fee how high is the wire transfer fee
+ * @param closing_fee how high is the closing fee
  * @param master_sig signature over the above by the exchange master key
  * @return transaction status code
  */
@@ -4408,6 +4421,7 @@ postgres_insert_wire_fee (void *cls,
                           struct GNUNET_TIME_Absolute start_date,
                           struct GNUNET_TIME_Absolute end_date,
                           const struct TALER_Amount *wire_fee,
+                          const struct TALER_Amount *closing_fee,
                           const struct TALER_MasterSignatureP *master_sig)
 {
   struct GNUNET_PQ_QueryParam params[] = {
@@ -4415,10 +4429,12 @@ postgres_insert_wire_fee (void *cls,
     TALER_PQ_query_param_absolute_time (&start_date),
     TALER_PQ_query_param_absolute_time (&end_date),
     TALER_PQ_query_param_amount (wire_fee),
+    TALER_PQ_query_param_amount (closing_fee),
     GNUNET_PQ_query_param_auto_from_type (master_sig),
     GNUNET_PQ_query_param_end
   };
   struct TALER_Amount wf;
+  struct TALER_Amount cf;
   struct TALER_MasterSignatureP sig;
   struct GNUNET_TIME_Absolute sd;
   struct GNUNET_TIME_Absolute ed;
@@ -4431,6 +4447,7 @@ postgres_insert_wire_fee (void *cls,
                              &sd,
                              &ed,
                              &wf,
+                             &cf,
                              &sig);
   if (qs < 0)
     return qs;
@@ -4449,6 +4466,12 @@ postgres_insert_wire_fee (void *cls,
       GNUNET_break (0);
       return GNUNET_DB_STATUS_HARD_ERROR;
     }
+    if (0 != TALER_amount_cmp (closing_fee,
+                               &cf))
+      {
+      GNUNET_break (0);
+      return GNUNET_DB_STATUS_HARD_ERROR;
+    }
     if ( (sd.abs_value_us != start_date.abs_value_us) ||
          (ed.abs_value_us != end_date.abs_value_us) )
     {
diff --git a/src/exchangedb/test_exchangedb.c b/src/exchangedb/test_exchangedb.c
index 62ff2a7..a0eb50f 100644
--- a/src/exchangedb/test_exchangedb.c
+++ b/src/exchangedb/test_exchangedb.c
@@ -1062,10 +1062,12 @@ test_wire_fees (struct TALER_EXCHANGEDB_Session 
*session)
   struct GNUNET_TIME_Absolute start_date;
   struct GNUNET_TIME_Absolute end_date;
   struct TALER_Amount wire_fee;
+  struct TALER_Amount closing_fee;
   struct TALER_MasterSignatureP master_sig;
   struct GNUNET_TIME_Absolute sd;
   struct GNUNET_TIME_Absolute ed;
   struct TALER_Amount fee;
+  struct TALER_Amount fee2;
   struct TALER_MasterSignatureP ms;
 
   start_date = GNUNET_TIME_absolute_get ();
@@ -1075,6 +1077,9 @@ test_wire_fees (struct TALER_EXCHANGEDB_Session *session)
   GNUNET_assert (GNUNET_OK ==
                  TALER_string_to_amount (CURRENCY ":1.424242",
                                          &wire_fee));
+  GNUNET_assert (GNUNET_OK ==
+                 TALER_string_to_amount (CURRENCY ":2.424242",
+                                         &closing_fee));
   GNUNET_CRYPTO_random_block (GNUNET_CRYPTO_QUALITY_WEAK,
                               &master_sig,
                               sizeof (master_sig));
@@ -1085,6 +1090,7 @@ test_wire_fees (struct TALER_EXCHANGEDB_Session *session)
                                start_date,
                                end_date,
                                &wire_fee,
+                              &closing_fee,
                                &master_sig))
   {
     GNUNET_break (0);
@@ -1097,6 +1103,7 @@ test_wire_fees (struct TALER_EXCHANGEDB_Session *session)
                                start_date,
                                end_date,
                                &wire_fee,
+                              &closing_fee,
                                &master_sig))
   {
     GNUNET_break (0);
@@ -1112,6 +1119,7 @@ test_wire_fees (struct TALER_EXCHANGEDB_Session *session)
                             &sd,
                             &ed,
                             &fee,
+                           &fee2,
                             &ms))
   {
     GNUNET_break (0);
@@ -1125,6 +1133,7 @@ test_wire_fees (struct TALER_EXCHANGEDB_Session *session)
                             &sd,
                             &ed,
                             &fee,
+                           &fee2,
                             &ms))
   {
     GNUNET_break (0);
@@ -1134,6 +1143,8 @@ test_wire_fees (struct TALER_EXCHANGEDB_Session *session)
        (ed.abs_value_us != end_date.abs_value_us) ||
        (0 != TALER_amount_cmp (&fee,
                                &wire_fee)) ||
+       (0 != TALER_amount_cmp (&fee2,
+                               &closing_fee)) ||
        (0 != memcmp (&ms,
                      &master_sig,
                      sizeof (ms))) )
@@ -1956,7 +1967,8 @@ run (void *cls)
   refund.merchant_pub = deposit.merchant_pub;
   RND_BLK (&refund.merchant_sig);
   refund.h_contract_terms = deposit.h_contract_terms;
-  refund.rtransaction_id = GNUNET_CRYPTO_random_u64 
(GNUNET_CRYPTO_QUALITY_WEAK, UINT64_MAX);
+  refund.rtransaction_id = GNUNET_CRYPTO_random_u64 
(GNUNET_CRYPTO_QUALITY_WEAK,
+                                                    UINT64_MAX);
   refund.refund_amount = deposit.amount_with_fee;
   refund.refund_fee = fee_refund;
   FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
@@ -2198,9 +2210,11 @@ main (int argc,
                     NULL);
   plugin_name++;
   (void) GNUNET_asprintf (&testname,
-                          "test-exchange-db-%s", plugin_name);
+                          "test-exchange-db-%s",
+                         plugin_name);
   (void) GNUNET_asprintf (&config_filename,
-                          "%s.conf", testname);
+                          "%s.conf",
+                         testname);
   cfg = GNUNET_CONFIGURATION_create ();
   if (GNUNET_OK !=
       GNUNET_CONFIGURATION_parse (cfg,
@@ -2211,7 +2225,8 @@ main (int argc,
     GNUNET_free (testname);
     return 2;
   }
-  GNUNET_SCHEDULER_run (&run, cfg);
+  GNUNET_SCHEDULER_run (&run,
+                       cfg);
   GNUNET_CONFIGURATION_destroy (cfg);
   GNUNET_free (config_filename);
   GNUNET_free (testname);
diff --git a/src/include/taler_exchangedb_plugin.h 
b/src/include/taler_exchangedb_plugin.h
index c531d83..ae38856 100644
--- a/src/include/taler_exchangedb_plugin.h
+++ b/src/include/taler_exchangedb_plugin.h
@@ -1698,6 +1698,7 @@ struct TALER_EXCHANGEDB_Plugin
    * @param start_date when does the fee go into effect
    * @param end_date when does the fee end being valid
    * @param wire_fee how high is the wire transfer fee
+   * @param closing_fee how high is the closing fee
    * @param master_sig signature over the above by the exchange master key
    * @return transaction status code
    */
@@ -1708,6 +1709,7 @@ struct TALER_EXCHANGEDB_Plugin
                      struct GNUNET_TIME_Absolute start_date,
                      struct GNUNET_TIME_Absolute end_date,
                      const struct TALER_Amount *wire_fee,
+                     const struct TALER_Amount *closing_fee,
                      const struct TALER_MasterSignatureP *master_sig);
 
 
@@ -1721,6 +1723,7 @@ struct TALER_EXCHANGEDB_Plugin
    * @param[out] start_date when does the fee go into effect
    * @param[out] end_date when does the fee end being valid
    * @param[out] wire_fee how high is the wire transfer fee
+   * @param[out] closing_fee how high is the closing fee
    * @param[out] master_sig signature over the above by the exchange master key
    * @return query status of the transaction
    */
@@ -1732,6 +1735,7 @@ struct TALER_EXCHANGEDB_Plugin
                    struct GNUNET_TIME_Absolute *start_date,
                    struct GNUNET_TIME_Absolute *end_date,
                    struct TALER_Amount *wire_fee,
+                  struct TALER_Amount *closing_fee,
                    struct TALER_MasterSignatureP *master_sig);
 
 

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]