gnunet-svn
[Top][All Lists]
Advanced

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

[taler-anastasis] branch master updated (99a271a -> b5c7383)


From: gnunet
Subject: [taler-anastasis] branch master updated (99a271a -> b5c7383)
Date: Mon, 01 Mar 2021 13:15:13 +0100

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

grothoff pushed a change to branch master
in repository anastasis.

    from 99a271a  del => delete
     new b19fa78  update .gitignore
     new b5c7383  misc policy upload bugfixes

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:
 src/cli/.gitignore                             |   1 +
 src/cli/test_anastasis_reducer_enter_secret.sh |   8 +-
 src/lib/anastasis_backup.c                     |  58 ++++++----
 src/reducer/anastasis_api_backup_redux.c       | 154 +++++++++++++++++--------
 4 files changed, 145 insertions(+), 76 deletions(-)

diff --git a/src/cli/.gitignore b/src/cli/.gitignore
index 469eb87..bc8182c 100644
--- a/src/cli/.gitignore
+++ b/src/cli/.gitignore
@@ -2,3 +2,4 @@
 anastasis-reducer
 test_reducer_home
 *.trs
+taler-bank.err
diff --git a/src/cli/test_anastasis_reducer_enter_secret.sh 
b/src/cli/test_anastasis_reducer_enter_secret.sh
index a2e3bc3..36521d1 100755
--- a/src/cli/test_anastasis_reducer_enter_secret.sh
+++ b/src/cli/test_anastasis_reducer_enter_secret.sh
@@ -282,13 +282,13 @@ $PREFIX anastasis-reducer -a \
 STATE=`jq -r -e .backup_state < $TFILE`
 if test "$STATE" != "POLICIES_PAYING"
 then
-    exit_fail "Expected new state to be POLICIES_PAYING, got $STATE"
+    exit_fail "Expected new state to be 'POLICIES_PAYING', got '$STATE'"
 fi
 
-OBJECT_SIZE=`jq -r -e '.truth_uploads | length' < $TFILE`
-if test $OBJECT_SIZE -lt 3
+TMETHOD=`jq -r -e '.policies[0].methods[0].truth.type' < $TFILE`
+if test $TMETHOD != "question"
 then
-    exit_fail "Expected truth_uploads array length to be >= 3, got 
$OBJECT_SIZE"
+    exit_fail "Expected method to be >='question', got $TMETHOD"
 fi
 
 echo " OK"
diff --git a/src/lib/anastasis_backup.c b/src/lib/anastasis_backup.c
index b6b792f..9d0be85 100644
--- a/src/lib/anastasis_backup.c
+++ b/src/lib/anastasis_backup.c
@@ -63,7 +63,7 @@ struct ANASTASIS_Truth
   char *instructions;
 
   /**
-   * Mime type of the truth.
+   * Mime type of the truth, NULL if not given.
    */
   char *mime_type;
 
@@ -85,7 +85,7 @@ ANASTASIS_truth_from_json (const json_t *json)
   const char *url;
   const char *type;
   const char *instructions;
-  const char *mime_type;
+  const char *mime_type = NULL;
   struct GNUNET_JSON_Specification spec[] = {
     GNUNET_JSON_spec_string ("url",
                              &url),
@@ -93,8 +93,9 @@ ANASTASIS_truth_from_json (const json_t *json)
                              &type),
     GNUNET_JSON_spec_string ("instructions",
                              &instructions),
-    GNUNET_JSON_spec_string ("mime_type",
-                             &mime_type),
+    GNUNET_JSON_spec_mark_optional (
+      GNUNET_JSON_spec_string ("mime_type",
+                               &mime_type)),
     GNUNET_JSON_spec_fixed_auto ("uuid",
                                  &t->uuid),
     GNUNET_JSON_spec_fixed_auto ("key_share",
@@ -118,7 +119,8 @@ ANASTASIS_truth_from_json (const json_t *json)
   t->url = GNUNET_strdup (url);
   t->type = GNUNET_strdup (type);
   t->instructions = GNUNET_strdup (instructions);
-  t->mime_type = GNUNET_strdup (mime_type);
+  if (NULL != mime_type)
+    t->mime_type = GNUNET_strdup (mime_type);
   return t;
 }
 
@@ -137,7 +139,7 @@ ANASTASIS_truth_to_json (const struct ANASTASIS_Truth *t)
 {
   return json_pack (
     "{s:o,s:o,s:o,s:o"
-    ",s:s,s:s,s:s,s:s}",
+    ",s:s,s:s,s:s,s:s?}",
     "uuid",
     GNUNET_JSON_from_data_auto (&t->uuid),
     "key_share",
@@ -147,13 +149,13 @@ ANASTASIS_truth_to_json (const struct ANASTASIS_Truth *t)
     "salt",
     GNUNET_JSON_from_data_auto (&t->salt),
     "url",
-    json_string (t->url),
+    t->url,
     "type",
-    json_string (t->type),
+    t->type,
     "instructions",
-    json_string (t->instructions),
+    t->instructions,
     "mime_type",
-    json_string (t->mime_type));
+    t->mime_type);
 }
 
 
@@ -371,7 +373,8 @@ truth_dup (const struct ANASTASIS_Truth *t)
   d->url = GNUNET_strdup (t->url);
   d->type = GNUNET_strdup (t->type);
   d->instructions = GNUNET_strdup (t->instructions);
-  d->mime_type = GNUNET_strdup (t->mime_type);
+  if (NULL != t->mime_type)
+    d->mime_type = GNUNET_strdup (t->mime_type);
   return d;
 }
 
@@ -449,7 +452,7 @@ struct PolicyStoreState
   /**
    * URL of the anastasis backend.
    */
-  const char *anastasis_url;
+  char *anastasis_url;
 
   /**
    * Payment request returned by this provider, if any.
@@ -566,12 +569,16 @@ policy_store_cb (void *cls,
       struct ANASTASIS_ShareResult sr;
 
       for (unsigned int i = 0; i<ss->pss_length; i++)
+      {
+        struct PolicyStoreState *pssi = &ss->pss[i];
+
         if (NULL != ss->pss[i].payment_request)
         {
-          spr[off].payment_request_url = pss[i].payment_request;
-          spr[off].provider_url = pss[i].anastasis_url;
+          spr[off].payment_request_url = pssi->payment_request;
+          spr[off].provider_url = pssi->anastasis_url;
           off++;
         }
+      }
       if (off > 0)
       {
         sr.ss = ANASTASIS_SHARE_STATUS_PAYMENT_REQUIRED;
@@ -727,7 +734,7 @@ ANASTASIS_secret_share (struct GNUNET_CURL_Context *ctx,
 
     for (unsigned int l = 0; l < policy->truths_length; l++)
     {
-      struct ANASTASIS_Truth *pt = policy->truths[l];
+      const struct ANASTASIS_Truth *pt = policy->truths[l];
       bool unique = true;
 
       /* Only append each truth once */
@@ -799,12 +806,12 @@ ANASTASIS_secret_share (struct GNUNET_CURL_Context *ctx,
 
       /* new provider, setup per-provider data structure */
       {
-        struct PolicyStoreState *pss;
+        struct PolicyStoreState *pssi;
 
         GNUNET_assert (index_pss < pss_length);
-        pss = &ss->pss[index_pss++];
-        pss->anastasis_url = pt->url;
-        pss->server_salt = &pt->salt;
+        pssi = &ss->pss[index_pss++];
+        pssi->anastasis_url = GNUNET_strdup (pt->url);
+        pssi->server_salt = &pt->salt;
         for (unsigned int m = 0; 0 < pds_len; m++)
         {
           if (NULL == pds[m].provider_url)
@@ -812,7 +819,7 @@ ANASTASIS_secret_share (struct GNUNET_CURL_Context *ctx,
           if (0 == strcmp (pds[m].provider_url,
                            pt->url))
           {
-            pss->payment_secret = pds[m].payment_secret;
+            pssi->payment_secret = pds[m].payment_secret;
             break;
           }
         }
@@ -921,12 +928,15 @@ ANASTASIS_secret_share_cancel (struct 
ANASTASIS_SecretShare *ss)
 {
   for (unsigned int i = 0; i<ss->pss_length; i++)
   {
-    if (NULL != ss->pss[i].pso)
+    struct PolicyStoreState *pssi = &ss->pss[i];
+
+    if (NULL != pssi->pso)
     {
-      ANASTASIS_policy_store_cancel (ss->pss[i].pso);
-      ss->pss[i].pso = NULL;
+      ANASTASIS_policy_store_cancel (pssi->pso);
+      pssi->pso = NULL;
     }
-    GNUNET_free (ss->pss[i].payment_request);
+    GNUNET_free (pssi->anastasis_url);
+    GNUNET_free (pssi->payment_request);
   }
   GNUNET_free (ss->pss);
   GNUNET_free (ss);
diff --git a/src/reducer/anastasis_api_backup_redux.c 
b/src/reducer/anastasis_api_backup_redux.c
index a4c31e4..4619623 100644
--- a/src/reducer/anastasis_api_backup_redux.c
+++ b/src/reducer/anastasis_api_backup_redux.c
@@ -1298,6 +1298,50 @@ upload_cancel_cb (void *cls)
 }
 
 
+/**
+ * Take all of the ongoing truth uploads and serialize them into the @a uc
+ * state.
+ *
+ * @param[in,out] uc context to take truth uploads from and to update state of
+ */
+static void
+serialize_truth (struct UploadContext *uc)
+{
+  json_t *policies;
+
+  policies = json_object_get (uc->state,
+                              "policies");
+  GNUNET_assert (json_is_array (policies));
+  for (struct TruthUpload *tue = uc->tues_head;
+       NULL != tue;
+       tue = tue->next)
+  {
+    if (NULL == tue->t)
+      continue;
+    for (unsigned int i = 0; i<tue->policies_length; i++)
+    {
+      const struct PolicyMethodReference *pmr = &tue->policies[i];
+      json_t *policy = json_array_get (policies,
+                                       pmr->policy_index);
+      json_t *methods = json_object_get (policy,
+                                         "methods");
+      json_t *auth_method = json_array_get (methods,
+                                            pmr->method_index);
+      json_t *truth = ANASTASIS_truth_to_json (tue->t);
+
+      GNUNET_assert (NULL != policy);
+      GNUNET_assert (NULL != methods);
+      GNUNET_assert (NULL != auth_method);
+      GNUNET_assert (NULL != truth);
+      GNUNET_assert (0 ==
+                     json_object_set_new (auth_method,
+                                          "truth",
+                                          truth));
+    }
+  }
+}
+
+
 /**
  * Function called with the results of a #ANASTASIS_secret_share().
  *
@@ -1326,6 +1370,7 @@ secret_share_result_cb (void *cls,
 
       set_state (uc->state,
                  ANASTASIS_BACKUP_STATE_POLICIES_PAYING);
+      serialize_truth (uc);
       ra = json_array ();
       GNUNET_assert (NULL != ra);
       for (unsigned int i = 0; i<
@@ -1470,20 +1515,59 @@ share_secret (struct UploadContext *uc)
                                                   "truth");
 
           GNUNET_break (NULL != jmethod);
-          GNUNET_break (NULL != jtruth);
-          truths[j] = ANASTASIS_truth_from_json (jtruth);
-          if (NULL == truths[j])
+          if (NULL != jtruth)
           {
-            GNUNET_break (0);
-            for (unsigned int k = 0; k<j; k++)
-              ANASTASIS_truth_free (truths[k]);
-            ANASTASIS_redux_fail_ (uc->cb,
-                                   uc->cb_cls,
-                                   TALER_EC_ANASTASIS_REDUCER_STATE_INVALID,
-                                   "'truth' failed to decode");
-            GNUNET_JSON_parse_free (spec);
-            upload_cancel_cb (uc);
-            return;
+            /* Get truth by deserializing from state */
+            truths[j] = ANASTASIS_truth_from_json (jtruth);
+            if (NULL == truths[j])
+            {
+              GNUNET_break (0);
+              for (unsigned int k = 0; k<j; k++)
+                ANASTASIS_truth_free (truths[k]);
+              ANASTASIS_redux_fail_ (uc->cb,
+                                     uc->cb_cls,
+                                     TALER_EC_ANASTASIS_REDUCER_STATE_INVALID,
+                                     "'truth' failed to decode");
+              GNUNET_JSON_parse_free (spec);
+              upload_cancel_cb (uc);
+              return;
+            }
+          }
+          else
+          {
+            bool found = false;
+            /* Maybe we never serialized the truth; find it in our DLL */
+            for (struct TruthUpload *tue = uc->tues_head;
+                 NULL != tue;
+                 tue = tue->next)
+            {
+              GNUNET_break (NULL != tue->t);
+              if (tue->am_idx == j)
+              {
+                /* Duplicate truth object */
+                json_t *jt = ANASTASIS_truth_to_json (tue->t);
+
+                GNUNET_assert (NULL != jt);
+                truths[j] = ANASTASIS_truth_from_json (jt);
+                GNUNET_assert (NULL != truths[j]);
+                json_decref (jt);
+                found = true;
+                break;
+              }
+            }
+            if (! found)
+            {
+              GNUNET_break (0);
+              for (unsigned int k = 0; k<j; k++)
+                ANASTASIS_truth_free (truths[k]);
+              ANASTASIS_redux_fail_ (uc->cb,
+                                     uc->cb_cls,
+                                     TALER_EC_ANASTASIS_REDUCER_STATE_INVALID,
+                                     "'truth' failed to decode");
+              GNUNET_JSON_parse_free (spec);
+              upload_cancel_cb (uc);
+              return;
+            }
           }
           ctruths[j] = truths[j];
         }
@@ -1563,48 +1647,21 @@ static void
 request_truth_payment (struct UploadContext *uc)
 {
   json_t *payments;
-  json_t *policies;
 
-  policies = json_object_get (uc->state,
-                              "policies");
-  GNUNET_assert (json_is_array (policies));
   payments = json_array ();
   GNUNET_assert (NULL != payments);
+  serialize_truth (uc);
   for (struct TruthUpload *tue = uc->tues_head;
        NULL != tue;
        tue = tue->next)
   {
-    if (NULL != tue->payment_request)
-    {
-      GNUNET_assert (
-        0 ==
-        json_array_append_new (payments,
-                               json_string (
-                                 tue->payment_request)));
-    }
-    if (NULL != tue->t)
-    {
-      for (unsigned int i = 0; i<tue->policies_length; i++)
-      {
-        const struct PolicyMethodReference *pmr = &tue->policies[i];
-        json_t *policy = json_array_get (policies,
-                                         pmr->policy_index);
-        json_t *methods = json_object_get (policy,
-                                           "methods");
-        json_t *auth_method = json_array_get (methods,
-                                              pmr->method_index);
-        json_t *truth = ANASTASIS_truth_to_json (tue->t);
-
-        GNUNET_assert (NULL != policy);
-        GNUNET_assert (NULL != methods);
-        GNUNET_assert (NULL != auth_method);
-        GNUNET_assert (NULL != truth);
-        GNUNET_assert (0 ==
-                       json_object_set_new (auth_method,
-                                            "truth",
-                                            truth));
-      }
-    }
+    if (NULL == tue->payment_request)
+      continue;
+    GNUNET_assert (
+      0 ==
+      json_array_append_new (payments,
+                             json_string (
+                               tue->payment_request)));
   }
   GNUNET_assert (0 ==
                  json_object_set_new (uc->state,
@@ -1917,6 +1974,7 @@ check_truth_upload (struct UploadContext *uc,
     tue->policies = GNUNET_new (struct PolicyMethodReference);
     *tue->policies = *pmr;
     tue->provider_url = GNUNET_strdup (provider_url);
+    tue->am_idx = am_idx;
     tue->policies_length = 1;
     if (GNUNET_OK !=
         lookup_salt (uc->state,

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

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