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 (0d5a3d7b -> d40f01b


From: gnunet
Subject: [GNUnet-SVN] [taler-exchange] branch master updated (0d5a3d7b -> d40f01b6)
Date: Wed, 09 Oct 2019 14:23:42 +0200

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

grothoff pushed a change to branch master
in repository exchange.

    from 0d5a3d7b more comprehensive test-auditor.sh, including 
generate-auditor-basedb now
     new 4e54a41f use denomination key issue data from adb, not edb
     new d40f01b6 expand test to cover withdrawing expired denominations, fix 
auditor-report template

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 contrib/auditor-report.tex.j2 |   4 +-
 src/auditor/taler-auditor.c   | 316 ++++++++++++++++++++++++------------------
 src/auditor/test-auditor.sh   |  47 ++++++-
 3 files changed, 225 insertions(+), 142 deletions(-)

diff --git a/contrib/auditor-report.tex.j2 b/contrib/auditor-report.tex.j2
index 52b3675d..648b09cf 100644
--- a/contrib/auditor-report.tex.j2
+++ b/contrib/auditor-report.tex.j2
@@ -1004,11 +1004,12 @@ withdrawal at the time when the exchange claims to have 
signed a coin
 with it.  This would be irregular, but has no obvious financial
 implications.
 
+% Table generation tested by testcase #23 in test-auditor.sh
 
 {% if data.denomination_key_validity_withdraw_inconsistencies|length() == 0 %}
   {\bf All denomination keys were valid at the time of withdrawals.}
 {% else %}
-  \begin{longtable}{p{7.5cm}|c}
+  \begin{longtable}{p{7.5cm}|r}
   {\bf Reserve} & {\bf Table row} \\
   {\bf Denomination key hash} & {\bf Execution time} \\ \hline \hline
 \endfirsthead
@@ -1028,7 +1029,6 @@ implications.
 {% for item in data.denomination_key_validity_withdraw_inconsistencies %}
   {\tt \small \truncate{0.6\textwidth}{ {{ item.reserve_pub }} } } & {{ 
item.row }} \\
 \nopagebreak
-  &
   {\tt \small \truncate{0.6\textwidth}{ {{ item.denompub_h }} } } & {{ 
item.execution_date }} \\ \hline
 {% endfor %}
   \end{longtable}
diff --git a/src/auditor/taler-auditor.c b/src/auditor/taler-auditor.c
index df4afd49..398c0b04 100644
--- a/src/auditor/taler-auditor.c
+++ b/src/auditor/taler-auditor.c
@@ -409,30 +409,29 @@ report (json_t *array,
  * emergency request to all wallets to deposit pending coins for the
  * denomination (and as an exchange suffer a huge financial loss).
  *
- * @param dki denomination key where the loss was detected
- * @param risk maximum risk that might have just become real (coins created by 
this @a dki)
+ * @param issue denomination key where the loss was detected
+ * @param risk maximum risk that might have just become real (coins created by 
this @a issue)
  * @param loss actual losses already (actualized before denomination was 
revoked)
  */
 static void
-report_emergency_by_amount (const struct
-                            TALER_EXCHANGEDB_DenominationKeyInformationP *dki,
+report_emergency_by_amount (const struct TALER_DenominationKeyValidityPS 
*issue,
                             const struct TALER_Amount *risk,
                             const struct TALER_Amount *loss)
 {
   report (report_emergencies,
           json_pack ("{s:o, s:o, s:o, s:o, s:o, s:o}",
                      "denompub_hash",
-                     GNUNET_JSON_from_data_auto (&dki->properties.denom_hash),
+                     GNUNET_JSON_from_data_auto (&issue->denom_hash),
                      "denom_risk",
                      TALER_JSON_from_amount (risk),
                      "denom_loss",
                      TALER_JSON_from_amount (loss),
                      "start",
-                     json_from_time_abs_nbo (dki->properties.start),
+                     json_from_time_abs_nbo (issue->start),
                      "deposit_end",
-                     json_from_time_abs_nbo (dki->properties.expire_deposit),
+                     json_from_time_abs_nbo (issue->expire_deposit),
                      "value",
-                     TALER_JSON_from_amount_nbo (&dki->properties.value)));
+                     TALER_JSON_from_amount_nbo (&issue->value)));
   GNUNET_assert (GNUNET_OK ==
                  TALER_amount_add (&reported_emergency_risk_by_amount,
                                    &reported_emergency_risk_by_amount,
@@ -453,14 +452,13 @@ report_emergency_by_amount (const struct
  * coins for the denomination (and as an exchange suffer a huge
  * financial loss).
  *
- * @param dki denomination key where the loss was detected
+ * @param issue denomination key where the loss was detected
  * @param num_issued number of coins that were issued
  * @param num_known number of coins that have been deposited
  * @param risk amount that is at risk
  */
 static void
-report_emergency_by_count (const struct
-                           TALER_EXCHANGEDB_DenominationKeyInformationP *dki,
+report_emergency_by_count (const struct TALER_DenominationKeyValidityPS *issue,
                            uint64_t num_issued,
                            uint64_t num_known,
                            const struct TALER_Amount *risk)
@@ -470,7 +468,7 @@ report_emergency_by_count (const struct
   report (report_emergencies_by_count,
           json_pack ("{s:o, s:I, s:I, s:o, s:o, s:o, s:o}",
                      "denompub_hash",
-                     GNUNET_JSON_from_data_auto (&dki->properties.denom_hash),
+                     GNUNET_JSON_from_data_auto (&issue->denom_hash),
                      "num_issued",
                      (json_int_t) num_issued,
                      "num_known",
@@ -478,17 +476,17 @@ report_emergency_by_count (const struct
                      "denom_risk",
                      TALER_JSON_from_amount (risk),
                      "start",
-                     json_from_time_abs_nbo (dki->properties.start),
+                     json_from_time_abs_nbo (issue->start),
                      "deposit_end",
-                     json_from_time_abs_nbo (dki->properties.expire_deposit),
+                     json_from_time_abs_nbo (issue->expire_deposit),
                      "value",
-                     TALER_JSON_from_amount_nbo (&dki->properties.value)));
+                     TALER_JSON_from_amount_nbo (&issue->value)));
   GNUNET_assert (GNUNET_OK ==
                  TALER_amount_add (&reported_emergency_risk_by_count,
                                    &reported_emergency_risk_by_count,
                                    risk));
   TALER_amount_ntoh (&denom_value,
-                     &dki->properties.value);
+                     &issue->value);
   for (uint64_t i = num_issued; i<num_known; i++)
     GNUNET_assert (GNUNET_OK ==
                    TALER_amount_add (&reported_emergency_loss_by_count,
@@ -644,81 +642,120 @@ report_row_inconsistency (const char *table,
 /* ************************* Transaction-global state ************************ 
*/
 
 /**
- * Results about denominations, cached per-transaction.
+ * Results about denominations, cached per-transaction, maps denomination pub 
hashes
+ * to `struct TALER_DenominationKeyValidityPS`.
  */
 static struct GNUNET_CONTAINER_MultiHashMap *denominations;
 
 
 /**
- * Obtain information about a @a denom_pub.
+ * Function called with the results of select_denomination_info()
  *
- * @param dh hash of the denomination public key to look up
- * @param[out] dki set to detailed information about @a denom_pub, NULL if not 
found, must
- *                 NOT be freed by caller
- * @return transaction status code
+ * @param cls closure, NULL
+ * @param issue issuing information with value, fees and other info about the 
denomination.
+ * @return #GNUNET_OK (to continue)
  */
-static enum GNUNET_DB_QueryStatus
-get_denomination_info_by_hash (const struct GNUNET_HashCode *dh,
-                               const struct
-                               TALER_EXCHANGEDB_DenominationKeyInformationP **
-                               dki)
+static int
+add_denomination (void *cls,
+                  const struct TALER_DenominationKeyValidityPS *issue)
 {
-  struct TALER_EXCHANGEDB_DenominationKeyInformationP *dkip;
-  enum GNUNET_DB_QueryStatus qs;
+  struct TALER_DenominationKeyValidityPS *i;
 
-  if (NULL == denominations)
-    denominations = GNUNET_CONTAINER_multihashmap_create (256,
-                                                          GNUNET_NO);
-  dkip = GNUNET_CONTAINER_multihashmap_get (denominations,
-                                            dh);
-  if (NULL != dkip)
-  {
-    /* cache hit */
-    *dki = dkip;
-    return GNUNET_DB_STATUS_SUCCESS_ONE_RESULT;
-  }
-  dkip = GNUNET_new (struct TALER_EXCHANGEDB_DenominationKeyInformationP);
-  qs = edb->get_denomination_info (edb->cls,
-                                   esession,
-                                   dh,
-                                   dkip);
-  if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != qs)
-  {
-    GNUNET_free (dkip);
-    *dki = NULL;
-    return qs;
-  }
+  (void) cls;
+  if (NULL !=
+      GNUNET_CONTAINER_multihashmap_get (denominations,
+                                         &issue->denom_hash))
+    return; /* value already known */
   {
     struct TALER_Amount value;
 
     TALER_amount_ntoh (&value,
-                       &dkip->properties.value);
+                       &issue->value);
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Tracking denomination `%s' (%s)\n",
-                GNUNET_h2s (dh),
+                GNUNET_h2s (&issue->denom_hash),
                 TALER_amount2s (&value));
     TALER_amount_ntoh (&value,
-                       &dkip->properties.fee_withdraw);
+                       &issue->fee_withdraw);
     GNUNET_log (GNUNET_ERROR_TYPE_INFO,
                 "Withdraw fee is %s\n",
                 TALER_amount2s (&value));
     GNUNET_log (GNUNET_ERROR_TYPE_INFO,
                 "Start time is %s\n",
                 GNUNET_STRINGS_absolute_time_to_string
-                  (GNUNET_TIME_absolute_ntoh (dkip->properties.start)));
+                  (GNUNET_TIME_absolute_ntoh (issue->start)));
     GNUNET_log (GNUNET_ERROR_TYPE_INFO,
                 "Expire deposit time is %s\n",
                 GNUNET_STRINGS_absolute_time_to_string
-                  (GNUNET_TIME_absolute_ntoh (
-                    dkip->properties.expire_deposit)));
+                  (GNUNET_TIME_absolute_ntoh (issue->expire_deposit)));
   }
-  *dki = dkip;
+  i = GNUNET_new (struct TALER_DenominationKeyValidityPS);
+  *i = *issue;
   GNUNET_assert (GNUNET_OK ==
                  GNUNET_CONTAINER_multihashmap_put (denominations,
-                                                    dh,
-                                                    dkip,
+                                                    &issue->denom_hash,
+                                                    i,
                                                     
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
-  return GNUNET_DB_STATUS_SUCCESS_ONE_RESULT;
+  return GNUNET_OK;
+}
+
+
+/**
+ * Obtain information about a @a denom_pub.
+ *
+ * @param dh hash of the denomination public key to look up
+ * @param[out] issue set to detailed information about @a denom_pub, NULL if 
not found, must
+ *                 NOT be freed by caller
+ * @return transaction status code
+ */
+static enum GNUNET_DB_QueryStatus
+get_denomination_info_by_hash (const struct GNUNET_HashCode *dh,
+                               const struct
+                               TALER_DenominationKeyValidityPS **issue)
+{
+  const struct TALER_DenominationKeyValidityPS *i;
+
+  if (NULL == denominations)
+  {
+    enum GNUNET_DB_QueryStatus qs;
+
+    denominations = GNUNET_CONTAINER_multihashmap_create (256,
+                                                          GNUNET_NO);
+    qs = adb->select_denomination_info (adb->cls,
+                                        asession,
+                                        &master_pub,
+                                        &add_denomination,
+                                        NULL);
+    if (0 > qs)
+    {
+      *issue = NULL;
+      return qs;
+    }
+  }
+  i = GNUNET_CONTAINER_multihashmap_get (denominations,
+                                         dh);
+  if (NULL != i)
+  {
+    /* cache hit */
+    *issue = i;
+    return GNUNET_DB_STATUS_SUCCESS_ONE_RESULT;
+  }
+  /* maybe database changed since we last iterated, give it one more shot */
+  qs = adb->select_denomination_info (adb->cls,
+                                      asession,
+                                      &master_pub,
+                                      &add_denomination,
+                                      NULL);
+  i = GNUNET_CONTAINER_multihashmap_get (denominations,
+                                         dh);
+  if (NULL != i)
+  {
+    /* cache hit */
+    *issue = i;
+    return GNUNET_DB_STATUS_SUCCESS_ONE_RESULT;
+  }
+  /* nope, definitively not there, hard error */
+  return GNUNET_DB_STATUS_HARD_ERROR;
 }
 
 
@@ -726,7 +763,7 @@ get_denomination_info_by_hash (const struct GNUNET_HashCode 
*dh,
  * Obtain information about a @a denom_pub.
  *
  * @param denom_pub key to look up
- * @param[out] dki set to detailed information about @a denom_pub, NULL if not 
found, must
+ * @param[out] issue set to detailed information about @a denom_pub, NULL if 
not found, must
  *                 NOT be freed by caller
  * @param[out] dh set to the hash of @a denom_pub, may be NULL
  * @return transaction status code
@@ -734,7 +771,7 @@ get_denomination_info_by_hash (const struct GNUNET_HashCode 
*dh,
 static enum GNUNET_DB_QueryStatus
 get_denomination_info (const struct TALER_DenominationPublicKey *denom_pub,
                        const struct
-                       TALER_EXCHANGEDB_DenominationKeyInformationP **dki,
+                       TALER_DenominationKeyValidityPS **issue,
                        struct GNUNET_HashCode *dh)
 {
   struct GNUNET_HashCode hc;
@@ -744,7 +781,7 @@ get_denomination_info (const struct 
TALER_DenominationPublicKey *denom_pub,
   GNUNET_CRYPTO_rsa_public_key_hash (denom_pub->rsa_public_key,
                                      dh);
   return get_denomination_info_by_hash (dh,
-                                        dki);
+                                        issue);
 }
 
 
@@ -761,12 +798,12 @@ free_dk_info (void *cls,
               const struct GNUNET_HashCode *key,
               void *value)
 {
-  struct TALER_EXCHANGEDB_DenominationKeyInformationP *dki = value;
+  struct TALER_DenominationKeyValidityPS *issue = value;
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Done with denomination `%s'\n",
               GNUNET_h2s (key));
-  GNUNET_free (dki);
+  GNUNET_free (issue);
   return GNUNET_OK;
 }
 
@@ -1054,7 +1091,7 @@ handle_reserve_out (void *cls,
   struct TALER_WithdrawRequestPS wsrd;
   struct GNUNET_HashCode key;
   struct ReserveSummary *rs;
-  const struct TALER_EXCHANGEDB_DenominationKeyInformationP *dki;
+  const struct TALER_DenominationKeyValidityPS *issue;
   struct TALER_Amount withdraw_fee;
   struct GNUNET_TIME_Absolute valid_start;
   struct GNUNET_TIME_Absolute expire_withdraw;
@@ -1066,7 +1103,7 @@ handle_reserve_out (void *cls,
 
   /* lookup denomination pub data (make sure denom_pub is valid, establish 
fees) */
   qs = get_denomination_info (denom_pub,
-                              &dki,
+                              &issue,
                               &wsrd.h_denomination_pub);
   if (0 > qs)
   {
@@ -1084,8 +1121,13 @@ handle_reserve_out (void *cls,
   }
 
   /* check that execution date is within withdraw range for denom_pub  */
-  valid_start = GNUNET_TIME_absolute_ntoh (dki->properties.start);
-  expire_withdraw = GNUNET_TIME_absolute_ntoh 
(dki->properties.expire_withdraw);
+  valid_start = GNUNET_TIME_absolute_ntoh (issue->start);
+  expire_withdraw = GNUNET_TIME_absolute_ntoh (issue->expire_withdraw);
+  GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+              "Checking withdraw timing: %llu, expire: %llu, timing: %llu\n",
+              (unsigned long long) valid_start.abs_value_us,
+              (unsigned long long) expire_withdraw.abs_value_us,
+              (unsigned long long) execution_date.abs_value_us);
   if ( (valid_start.abs_value_us > execution_date.abs_value_us) ||
        (expire_withdraw.abs_value_us < execution_date.abs_value_us) )
   {
@@ -1105,7 +1147,7 @@ handle_reserve_out (void *cls,
   wsrd.reserve_pub = *reserve_pub;
   TALER_amount_hton (&wsrd.amount_with_fee,
                      amount_with_fee);
-  wsrd.withdraw_fee = dki->properties.fee_withdraw;
+  wsrd.withdraw_fee = issue->fee_withdraw;
   wsrd.h_coin_envelope = *h_blind_ev;
   if (GNUNET_OK !=
       GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_WALLET_RESERVE_WITHDRAW,
@@ -1168,7 +1210,7 @@ handle_reserve_out (void *cls,
               TALER_B2S (reserve_pub),
               TALER_amount2s (amount_with_fee));
   TALER_amount_ntoh (&withdraw_fee,
-                     &dki->properties.fee_withdraw);
+                     &issue->fee_withdraw);
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
               "Increasing withdraw profits by fee %s\n",
               TALER_amount2s (&withdraw_fee));
@@ -2143,7 +2185,7 @@ struct WireCheckContext
  * @param coin_pub public key of the coin (for reporting)
  * @param h_contract_terms hash of the proposal for which we calculate the 
amount
  * @param merchant_pub public key of the merchant (who is allowed to issue 
refunds)
- * @param dki denomination information about the coin
+ * @param issue denomination information about the coin
  * @param tl_head head of transaction history to verify
  * @param[out] merchant_gain amount the coin contributes to the wire transfer 
to the merchant
  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
@@ -2156,8 +2198,7 @@ check_transaction_history_for_deposit (const struct
                                        const struct
                                        TALER_MerchantPublicKeyP *merchant_pub,
                                        const struct
-                                       
TALER_EXCHANGEDB_DenominationKeyInformationP
-                                       *dki,
+                                       TALER_DenominationKeyValidityPS *issue,
                                        const struct
                                        TALER_EXCHANGEDB_TransactionList 
*tl_head,
                                        struct TALER_Amount *merchant_gain)
@@ -2230,7 +2271,7 @@ check_transaction_history_for_deposit (const struct
       }
       amount_with_fee = &tl->details.deposit->amount_with_fee;
       fee = &tl->details.deposit->deposit_fee;
-      fee_dki = &dki->properties.fee_deposit;
+      fee_dki = &issue->fee_deposit;
       if (GNUNET_OK !=
           TALER_amount_add (&expenditures,
                             &expenditures,
@@ -2284,7 +2325,7 @@ check_transaction_history_for_deposit (const struct
     case TALER_EXCHANGEDB_TT_REFRESH_MELT:
       amount_with_fee = &tl->details.melt->session.amount_with_fee;
       fee = &tl->details.melt->melt_fee;
-      fee_dki = &dki->properties.fee_refresh;
+      fee_dki = &issue->fee_refresh;
       if (GNUNET_OK !=
           TALER_amount_add (&expenditures,
                             &expenditures,
@@ -2308,7 +2349,7 @@ check_transaction_history_for_deposit (const struct
     case TALER_EXCHANGEDB_TT_REFUND:
       amount_with_fee = &tl->details.refund->refund_amount;
       fee = &tl->details.refund->refund_fee;
-      fee_dki = &dki->properties.fee_refund;
+      fee_dki = &issue->fee_refund;
       if (GNUNET_OK !=
           TALER_amount_add (&refunds,
                             &refunds,
@@ -2422,7 +2463,7 @@ check_transaction_history_for_deposit (const struct
 
   /* Now check that 'spent' is less or equal than total coin value */
   TALER_amount_ntoh (&value,
-                     &dki->properties.value);
+                     &issue->value);
   if (1 == TALER_amount_cmp (&spent,
                              &value))
   {
@@ -2493,7 +2534,7 @@ wire_transfer_information_cb (void *cls,
                               const struct TALER_Amount *deposit_fee)
 {
   struct WireCheckContext *wcc = cls;
-  const struct TALER_EXCHANGEDB_DenominationKeyInformationP *dki;
+  const struct TALER_DenominationKeyValidityPS *issue;
   struct TALER_Amount computed_value;
   struct TALER_Amount coin_value_without_fee;
   struct TALER_EXCHANGEDB_TransactionList *tl;
@@ -2559,7 +2600,7 @@ wire_transfer_information_cb (void *cls,
   }
   GNUNET_assert (NULL != coin); /* hard check that switch worked */
   qs = get_denomination_info_by_hash (&coin->denom_pub_hash,
-                                      &dki);
+                                      &issue);
   if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != qs)
   {
     GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
@@ -2581,7 +2622,7 @@ wire_transfer_information_cb (void *cls,
                        "row", (json_int_t) rowid,
                        "loss", TALER_JSON_from_amount (coin_value),
                        "key_pub", GNUNET_JSON_from_data_auto (
-                         &dki->properties.denom_hash)));
+                         &issue->denom_hash)));
     GNUNET_break (GNUNET_OK ==
                   TALER_amount_add (&total_bad_sig_loss,
                                     &total_bad_sig_loss,
@@ -2596,14 +2637,14 @@ wire_transfer_information_cb (void *cls,
     return;
   }
 
-  GNUNET_assert (NULL != dki); /* mostly to help static analysis */
+  GNUNET_assert (NULL != issue); /* mostly to help static analysis */
   /* Check transaction history to see if it supports aggregate
      valuation */
   if (GNUNET_OK !=
       check_transaction_history_for_deposit (coin_pub,
                                              h_contract_terms,
                                              merchant_pub,
-                                             dki,
+                                             issue,
                                              tl,
                                              &computed_value))
   {
@@ -3156,7 +3197,7 @@ struct DenominationSummary
   /**
    * Denomination key information for this denomination.
    */
-  const struct TALER_EXCHANGEDB_DenominationKeyInformationP *dki;
+  const struct TALER_DenominationKeyValidityPS *issue;
 
   /**
    * #GNUNET_YES if this record already existed in the DB.
@@ -3297,14 +3338,13 @@ init_denomination (const struct GNUNET_HashCode 
*denom_hash,
  * Obtain the denomination summary for the given @a dh
  *
  * @param cc our execution context
- * @param dki denomination key information for @a dh
+ * @param issue denomination key information for @a dh
  * @param dh the denomination hash to use for the lookup
  * @return NULL on error
  */
 static struct DenominationSummary *
 get_denomination_summary (struct CoinContext *cc,
-                          const struct
-                          TALER_EXCHANGEDB_DenominationKeyInformationP *dki,
+                          const struct TALER_DenominationKeyValidityPS *issue,
                           const struct GNUNET_HashCode *dh)
 {
   struct DenominationSummary *ds;
@@ -3314,7 +3354,7 @@ get_denomination_summary (struct CoinContext *cc,
   if (NULL != ds)
     return ds;
   ds = GNUNET_new (struct DenominationSummary);
-  ds->dki = dki;
+  ds->issue = issue;
   if (0 > (cc->qs = init_denomination (dh,
                                        ds)))
   {
@@ -3348,14 +3388,14 @@ sync_denomination (void *cls,
 {
   struct CoinContext *cc = cls;
   struct DenominationSummary *ds = value;
-  const struct TALER_EXCHANGEDB_DenominationKeyInformationP *dki = ds->dki;
+  const struct TALER_DenominationKeyValidityPS *issue = ds->issue;
   struct GNUNET_TIME_Absolute now;
   struct GNUNET_TIME_Absolute expire_deposit;
   struct GNUNET_TIME_Absolute expire_deposit_grace;
   enum GNUNET_DB_QueryStatus qs;
 
   now = GNUNET_TIME_absolute_get ();
-  expire_deposit = GNUNET_TIME_absolute_ntoh (dki->properties.expire_deposit);
+  expire_deposit = GNUNET_TIME_absolute_ntoh (issue->expire_deposit);
   /* add day grace period to deal with clocks not being perfectly synchronized 
*/
   expire_deposit_grace = GNUNET_TIME_absolute_add (expire_deposit,
                                                    DEPOSIT_GRACE_PERIOD);
@@ -3434,14 +3474,14 @@ sync_denomination (void *cls,
     {
       if (ds->num_issued < (uint64_t) cnt)
       {
-        report_emergency_by_count (dki,
+        report_emergency_by_count (issue,
                                    ds->num_issued,
                                    cnt,
                                    &ds->denom_risk);
       }
       if (GNUNET_YES == ds->report_emergency)
       {
-        report_emergency_by_amount (dki,
+        report_emergency_by_amount (issue,
                                     &ds->denom_risk,
                                     &ds->denom_loss);
 
@@ -3515,7 +3555,7 @@ withdraw_cb (void *cls,
   struct CoinContext *cc = cls;
   struct DenominationSummary *ds;
   struct GNUNET_HashCode dh;
-  const struct TALER_EXCHANGEDB_DenominationKeyInformationP *dki;
+  const struct TALER_DenominationKeyValidityPS *issue;
   struct TALER_Amount value;
   enum GNUNET_DB_QueryStatus qs;
 
@@ -3523,7 +3563,7 @@ withdraw_cb (void *cls,
   ppc.last_withdraw_serial_id = rowid + 1;
 
   qs = get_denomination_info (denom_pub,
-                              &dki,
+                              &issue,
                               &dh);
   if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != qs)
   {
@@ -3534,7 +3574,7 @@ withdraw_cb (void *cls,
     return GNUNET_SYSERR;
   }
   ds = get_denomination_summary (cc,
-                                 dki,
+                                 issue,
                                  &dh);
   if (NULL == ds)
   {
@@ -3542,7 +3582,7 @@ withdraw_cb (void *cls,
     return GNUNET_SYSERR;
   }
   TALER_amount_ntoh (&value,
-                     &dki->properties.value);
+                     &issue->value);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Issued coin in denomination `%s' of total value %s\n",
               GNUNET_h2s (&dh),
@@ -3604,7 +3644,7 @@ struct RevealContext
   struct TALER_DenominationPublicKey *new_dps;
 
   /**
-   * Size of the @a new_dp and @a new_dki arrays.
+   * Size of the @a new_dp and @a new_dps arrays.
    */
   unsigned int num_newcoins;
 };
@@ -3720,7 +3760,7 @@ refresh_session_cb (void *cls,
 {
   struct CoinContext *cc = cls;
   struct TALER_RefreshMeltCoinAffirmationPS rmc;
-  const struct TALER_EXCHANGEDB_DenominationKeyInformationP *dki;
+  const struct TALER_DenominationKeyValidityPS *issue;
   struct DenominationSummary *dso;
   struct TALER_Amount amount_without_fee;
   struct TALER_Amount tmp;
@@ -3730,7 +3770,7 @@ refresh_session_cb (void *cls,
   ppc.last_melt_serial_id = rowid + 1;
 
   qs = get_denomination_info (denom_pub,
-                              &dki,
+                              &issue,
                               NULL);
   if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != qs)
   {
@@ -3754,7 +3794,7 @@ refresh_session_cb (void *cls,
   rmc.rc = *rc;
   TALER_amount_hton (&rmc.amount_with_fee,
                      amount_with_fee);
-  rmc.melt_fee = dki->properties.fee_refresh;
+  rmc.melt_fee = issue->fee_refresh;
   rmc.coin_pub = *coin_pub;
   if (GNUNET_OK !=
       GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_WALLET_COIN_MELT,
@@ -3777,7 +3817,7 @@ refresh_session_cb (void *cls,
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Melting coin %s in denomination `%s' of value %s\n",
               TALER_B2S (coin_pub),
-              GNUNET_h2s (&dki->properties.denom_hash),
+              GNUNET_h2s (&issue->denom_hash),
               TALER_amount2s (amount_with_fee));
 
   {
@@ -3821,9 +3861,8 @@ refresh_session_cb (void *cls,
     }
 
     {
-      const struct
-      TALER_EXCHANGEDB_DenominationKeyInformationP *new_dkis[reveal_ctx.
-                                                             num_newcoins];
+      const struct TALER_DenominationKeyValidityPS *new_issues[reveal_ctx.
+                                                               num_newcoins];
 
       /* Update outstanding amounts for all new coin's denominations, and check
          that the resulting amounts are consistent with the value being 
refreshed. */
@@ -3832,7 +3871,7 @@ refresh_session_cb (void *cls,
       {
         /* lookup new coin denomination key */
         qs = get_denomination_info (&reveal_ctx.new_dps[i],
-                                    &new_dkis[i],
+                                    &new_issues[i],
                                     NULL);
         if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != qs)
         {
@@ -3858,9 +3897,9 @@ refresh_session_cb (void *cls,
         struct TALER_Amount value;
 
         TALER_amount_ntoh (&fee,
-                           &new_dkis[i]->properties.fee_withdraw);
+                           &new_issues[i]->fee_withdraw);
         TALER_amount_ntoh (&value,
-                           &new_dkis[i]->properties.value);
+                           &new_issues[i]->value);
         if ( (GNUNET_OK !=
               TALER_amount_add (&refresh_cost,
                                 &refresh_cost,
@@ -3881,7 +3920,7 @@ refresh_session_cb (void *cls,
         struct TALER_Amount melt_fee;
 
         TALER_amount_ntoh (&melt_fee,
-                           &dki->properties.fee_refresh);
+                           &issue->fee_refresh);
         if (GNUNET_OK !=
             TALER_amount_subtract (&amount_without_fee,
                                    amount_with_fee,
@@ -3913,18 +3952,18 @@ refresh_session_cb (void *cls,
         struct TALER_Amount value;
 
         dsi = get_denomination_summary (cc,
-                                        new_dkis[i],
-                                        &new_dkis[i]->properties.denom_hash);
+                                        new_issues[i],
+                                        &new_issues[i]->denom_hash);
         if (NULL == dsi)
         {
           GNUNET_break (0);
           return GNUNET_SYSERR;
         }
         TALER_amount_ntoh (&value,
-                           &new_dkis[i]->properties.value);
+                           &new_issues[i]->value);
         GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                     "Created fresh coin in denomination `%s' of value %s\n",
-                    GNUNET_h2s (&new_dkis[i]->properties.denom_hash),
+                    GNUNET_h2s (&new_issues[i]->denom_hash),
                     TALER_amount2s (&value));
         dsi->num_issued++;
         if (GNUNET_OK !=
@@ -3947,7 +3986,7 @@ refresh_session_cb (void *cls,
         }
         GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                     "New balance of denomination `%s' is %s\n",
-                    GNUNET_h2s (&new_dkis[i]->properties.denom_hash),
+                    GNUNET_h2s (&new_issues[i]->denom_hash),
                     TALER_amount2s (&dsi->denom_balance));
         if (GNUNET_OK !=
             TALER_amount_add (&total_escrow_balance,
@@ -3973,8 +4012,8 @@ refresh_session_cb (void *cls,
 
   /* update old coin's denomination balance */
   dso = get_denomination_summary (cc,
-                                  dki,
-                                  &dki->properties.denom_hash);
+                                  issue,
+                                  &issue->denom_hash);
   if (NULL == dso)
   {
     GNUNET_break (0);
@@ -4021,7 +4060,7 @@ refresh_session_cb (void *cls,
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "New balance of denomination `%s' after melt is %s\n",
-              GNUNET_h2s (&dki->properties.denom_hash),
+              GNUNET_h2s (&issue->denom_hash),
               TALER_amount2s (&dso->denom_balance));
 
   /* update global melt fees */
@@ -4029,7 +4068,7 @@ refresh_session_cb (void *cls,
     struct TALER_Amount rfee;
 
     TALER_amount_ntoh (&rfee,
-                       &dki->properties.fee_refresh);
+                       &issue->fee_refresh);
     if (GNUNET_OK !=
         TALER_amount_add (&total_melt_fee_income,
                           &total_melt_fee_income,
@@ -4083,7 +4122,7 @@ deposit_cb (void *cls,
             int done)
 {
   struct CoinContext *cc = cls;
-  const struct TALER_EXCHANGEDB_DenominationKeyInformationP *dki;
+  const struct TALER_DenominationKeyValidityPS *issue;
   struct DenominationSummary *ds;
   struct TALER_DepositRequestPS dr;
   struct TALER_Amount tmp;
@@ -4093,7 +4132,7 @@ deposit_cb (void *cls,
   ppc.last_deposit_serial_id = rowid + 1;
 
   qs = get_denomination_info (denom_pub,
-                              &dki,
+                              &issue,
                               NULL);
   if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != qs)
   {
@@ -4127,7 +4166,7 @@ deposit_cb (void *cls,
   dr.refund_deadline = GNUNET_TIME_absolute_hton (refund_deadline);
   TALER_amount_hton (&dr.amount_with_fee,
                      amount_with_fee);
-  dr.deposit_fee = dki->properties.fee_deposit;
+  dr.deposit_fee = issue->fee_deposit;
   dr.merchant = *merchant_pub;
   dr.coin_pub = *coin_pub;
   if (GNUNET_OK !=
@@ -4151,13 +4190,13 @@ deposit_cb (void *cls,
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Deposited coin %s in denomination `%s' of value %s\n",
               TALER_B2S (coin_pub),
-              GNUNET_h2s (&dki->properties.denom_hash),
+              GNUNET_h2s (&issue->denom_hash),
               TALER_amount2s (amount_with_fee));
 
   /* update old coin's denomination balance */
   ds = get_denomination_summary (cc,
-                                 dki,
-                                 &dki->properties.denom_hash);
+                                 issue,
+                                 &issue->denom_hash);
   if (NULL == ds)
   {
     GNUNET_break (0);
@@ -4205,7 +4244,7 @@ deposit_cb (void *cls,
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "New balance of denomination `%s' after deposit is %s\n",
-              GNUNET_h2s (&dki->properties.denom_hash),
+              GNUNET_h2s (&issue->denom_hash),
               TALER_amount2s (&ds->denom_balance));
 
   /* update global up melt fees */
@@ -4213,7 +4252,7 @@ deposit_cb (void *cls,
     struct TALER_Amount dfee;
 
     TALER_amount_ntoh (&dfee,
-                       &dki->properties.fee_deposit);
+                       &issue->fee_deposit);
     if (GNUNET_OK !=
         TALER_amount_add (&total_deposit_fee_income,
                           &total_deposit_fee_income,
@@ -4258,7 +4297,7 @@ refund_cb (void *cls,
            const struct TALER_Amount *amount_with_fee)
 {
   struct CoinContext *cc = cls;
-  const struct TALER_EXCHANGEDB_DenominationKeyInformationP *dki;
+  const struct TALER_DenominationKeyValidityPS *issue;
   struct DenominationSummary *ds;
   struct TALER_RefundRequestPS rr;
   struct TALER_Amount amount_without_fee;
@@ -4269,7 +4308,7 @@ refund_cb (void *cls,
   ppc.last_refund_serial_id = rowid + 1;
 
   qs = get_denomination_info (denom_pub,
-                              &dki,
+                              &issue,
                               NULL);
   if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != qs)
   {
@@ -4286,7 +4325,7 @@ refund_cb (void *cls,
   rr.rtransaction_id = GNUNET_htonll (rtransaction_id);
   TALER_amount_hton (&rr.refund_amount,
                      amount_with_fee);
-  rr.refund_fee = dki->properties.fee_refund;
+  rr.refund_fee = issue->fee_refund;
   if (GNUNET_OK !=
       GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_MERCHANT_REFUND,
                                   &rr.purpose,
@@ -4307,7 +4346,7 @@ refund_cb (void *cls,
   }
 
   TALER_amount_ntoh (&refund_fee,
-                     &dki->properties.fee_refund);
+                     &issue->fee_refund);
   if (GNUNET_OK !=
       TALER_amount_subtract (&amount_without_fee,
                              amount_with_fee,
@@ -4324,13 +4363,13 @@ refund_cb (void *cls,
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Refunding coin %s in denomination `%s' value %s\n",
               TALER_B2S (coin_pub),
-              GNUNET_h2s (&dki->properties.denom_hash),
+              GNUNET_h2s (&issue->denom_hash),
               TALER_amount2s (amount_with_fee));
 
   /* update coin's denomination balance */
   ds = get_denomination_summary (cc,
-                                 dki,
-                                 &dki->properties.denom_hash);
+                                 issue,
+                                 &issue->denom_hash);
   if (NULL == ds)
   {
     GNUNET_break (0);
@@ -4375,7 +4414,7 @@ refund_cb (void *cls,
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "New balance of denomination `%s' after refund is %s\n",
-              GNUNET_h2s (&dki->properties.denom_hash),
+              GNUNET_h2s (&issue->denom_hash),
               TALER_amount2s (&ds->denom_balance));
 
   /* update total refund fee balance */
@@ -4418,7 +4457,7 @@ check_payback (struct CoinContext *cc,
   struct TALER_PaybackRequestPS pr;
   struct DenominationSummary *ds;
   enum GNUNET_DB_QueryStatus qs;
-  const struct TALER_EXCHANGEDB_DenominationKeyInformationP *dki;
+  const struct TALER_DenominationKeyValidityPS *issue;
 
   if (GNUNET_OK !=
       TALER_test_coin_valid (coin,
@@ -4437,7 +4476,7 @@ check_payback (struct CoinContext *cc,
                                     amount));
   }
   qs = get_denomination_info (denom_pub,
-                              &dki,
+                              &issue,
                               &pr.h_denom_pub);
   if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != qs)
   {
@@ -4471,8 +4510,8 @@ check_payback (struct CoinContext *cc,
     return GNUNET_OK;
   }
   ds = get_denomination_summary (cc,
-                                 dki,
-                                 &dki->properties.denom_hash);
+                                 issue,
+                                 &issue->denom_hash);
   if (GNUNET_NO == ds->was_revoked)
   {
     /* Woopsie, we allowed payback on non-revoked denomination!? */
@@ -5448,6 +5487,7 @@ run (void *cls,
                       /* Tested in test-auditor.sh #14/#15 */
                       "row_inconsistencies",
                       report_row_inconsistencies,
+                      /* Tested in test-auditor.sh #23 */
                       "denomination_key_validity_withdraw_inconsistencies",
                       denomination_key_validity_withdraw_inconsistencies,
                       "coin_inconsistencies",
diff --git a/src/auditor/test-auditor.sh b/src/auditor/test-auditor.sh
index 7e9f826d..83dcdcd9 100755
--- a/src/auditor/test-auditor.sh
+++ b/src/auditor/test-auditor.sh
@@ -59,7 +59,7 @@ function pre_audit () {
     if test ${1:-no} = "aggregator"
     then
         echo -n "Running exchange aggregator ..."
-        taler-exchange-aggregator -L INFO -t -c $CONF 2> aggregator.log
+        taler-exchange-aggregator -L INFO -t -c $CONF 2> aggregator.log || 
exit_fail "FAIL"
         echo " DONE"
     fi
 }
@@ -84,7 +84,18 @@ function audit_only () {
 # Cleanup to run after the auditor
 function post_audit () {
     kill -TERM `jobs -p` >/dev/null 2>/dev/null || true
-    sleep 1
+    echo -n "Waiting for servers to die ..."
+    for n in `seq 1 20`
+    do
+        echo -n "."
+        sleep 0.1
+        OK=0
+        # bank
+        wget --timeout=0.1 http://localhost:8082/ -o /dev/null -O /dev/null 
>/dev/null && continue
+        OK=1
+        break
+    done
+    echo "DONE"
     echo -n "TeXing ."
     ../../contrib/render.py test-audit.json test-wire-audit.json < 
../../contrib/auditor-report.tex.j2 > test-report.tex || exit_fail "Renderer 
failed"
 
@@ -135,6 +146,7 @@ jq -e .wire_out_amount_inconsistencies[0] < 
test-wire-audit.json > /dev/null &&
 jq -e .reserve_in_amount_inconsistencies[0] < test-wire-audit.json > /dev/null 
&& exit_fail "Unexpected reserve in inconsistency detected in ordinary run"
 jq -e .missattribution_inconsistencies[0] < test-wire-audit.json > /dev/null 
&& exit_fail "Unexpected missattribution inconsistency detected in ordinary run"
 jq -e .row_inconsistencies[0] < test-wire-audit.json > /dev/null && exit_fail 
"Unexpected row inconsistency detected in ordinary run"
+jq -e .denomination_key_validity_withdraw_inconsistencies[0] < test-audit.json 
> /dev/null && exit_fail "Unexpected denomination key withdraw inconsistency 
detected in ordinary run"
 jq -e .row_minor_inconsistencies[0] < test-wire-audit.json > /dev/null && 
exit_fail "Unexpected minor row inconsistency detected in ordinary run"
 jq -e .lag_details[0] < test-wire-audit.json > /dev/null && exit_fail 
"Unexpected lag detected in ordinary run"
 jq -e .wire_format_inconsistencies[0] < test-wire-audit.json > /dev/null && 
exit_fail "Unexpected wire format inconsistencies detected in ordinary run"
@@ -1218,6 +1230,8 @@ fi
 
 # Undo
 echo "UPDATE reserves_in SET 
execution_date='${OLD_TIME}',credit_val=${OLD_VAL} WHERE 
reserve_in_serial_id=1;" | psql -Aqt $DB
+echo "UPDATE reserves SET current_balance_val=current_balance_val-100 WHERE 
reserve_pub='${RES_PUB}';" | psql -Aqt $DB
+
 }
 
 
@@ -1282,6 +1296,35 @@ fi
 
 
 
+
+# Test use of withdraw-expired denomination key
+function test_23() {
+echo "===========23: denomination key expired ================="
+
+H_DENOM=`echo 'SELECT denom_pub_hash FROM reserves_out LIMIT 1;' | psql $DB 
-Aqt`
+
+OLD_START=`echo "SELECT valid_from FROM auditor_denominations WHERE 
denom_pub_hash='${H_DENOM}';" | psql $DB -Aqt`
+OLD_WEXP=`echo "SELECT expire_withdraw FROM auditor_denominations WHERE 
denom_pub_hash='${H_DENOM}';" | psql $DB -Aqt`
+# Basically expires 'immediately', so that the withdraw must have been 
'invalid'
+NEW_WEXP=`expr $OLD_START + 1`
+
+echo "UPDATE auditor_denominations SET expire_withdraw=${NEW_WEXP} WHERE 
denom_pub_hash='${H_DENOM}';" | psql -Aqt $DB
+
+
+run_audit
+
+echo -n "Testing inconsistency detection... "
+# FIXME
+jq -e .denomination_key_validity_withdraw_inconsistencies[0] < test-audit.json 
> /dev/null || exit_fail "Denomination key withdraw inconsistency not detected"
+
+echo PASS
+
+# Undo modification
+echo "UPDATE auditor_denominations SET expire_withdraw=${OLD_WEXP} WHERE 
denom_pub_hash='${H_DENOM}';" | psql -Aqt $DB
+
+}
+
+
 # **************************************************
 # FIXME: Add more tests here! :-)
 # Specifically:

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



reply via email to

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