gnunet-svn
[Top][All Lists]
Advanced

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

[taler-anastasis] branch master updated: finish first pass over backup r


From: gnunet
Subject: [taler-anastasis] branch master updated: finish first pass over backup redux logic
Date: Sat, 20 Feb 2021 11:47:09 +0100

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

grothoff pushed a commit to branch master
in repository anastasis.

The following commit(s) were added to refs/heads/master by this push:
     new c05599c  finish first pass over backup redux logic
c05599c is described below

commit c05599c10aa2c90c7304be613ac16c017643e126
Author: Christian Grothoff <christian@grothoff.org>
AuthorDate: Sat Feb 20 11:47:06 2021 +0100

    finish first pass over backup redux logic
---
 src/reducer/anastasis_api_backup_redux.c | 156 ++++++++++++++++++++++++++-----
 1 file changed, 135 insertions(+), 21 deletions(-)

diff --git a/src/reducer/anastasis_api_backup_redux.c 
b/src/reducer/anastasis_api_backup_redux.c
index aa8431f..7bc138d 100644
--- a/src/reducer/anastasis_api_backup_redux.c
+++ b/src/reducer/anastasis_api_backup_redux.c
@@ -1386,10 +1386,63 @@ secret_share_result_cb (void *cls,
   struct UploadContext *uc = cls;
 
   uc->ss = NULL;
-  GNUNET_break (0); // FIXME: not implemented
-  uc->cb (uc->cb_cls,
-          TALER_EC_INVALID,
-          NULL);
+  switch (sr->ss)
+  {
+  case ANASTASIS_SHARE_STATUS_SUCCESS:
+    set_state (uc->state,
+               ANASTASIS_BACKUP_STATE_BACKUP_FINISHED);
+    uc->cb (uc->cb_cls,
+            TALER_EC_NONE,
+            uc->state);
+    break;
+  case ANASTASIS_SHARE_STATUS_PAYMENT_REQUIRED:
+    {
+      json_t *ra;
+
+      set_state (uc->state,
+                 ANASTASIS_BACKUP_STATE_POLICIES_PAYING);
+      ra = json_array ();
+      GNUNET_assert (NULL != ra);
+      for (unsigned int i = 0; i<
+           sr->details.payment_required.payment_requests_length; i++)
+      {
+        const struct ANASTASIS_SharePaymentRequest *spr;
+        json_t *pr;
+
+        spr = &sr->details.payment_required.payment_requests[i];
+        pr = json_pack ("{s:s, s:s}",
+                        "payto",
+                        spr->payment_request_url,
+                        "provider",
+                        spr->provider_url);
+        GNUNET_assert (0 ==
+                       json_array_append_new (ra,
+                                              pr));
+      }
+      GNUNET_assert (0 ==
+                     json_object_set_new (uc->state,
+                                          "policy_payment_requests",
+                                          ra));
+    }
+    uc->cb (uc->cb_cls,
+            TALER_EC_NONE,
+            uc->state);
+    break;
+  case ANASTASIS_SHARE_STATUS_PROVIDER_FAILED:
+    // FIXME-#6764: extract more failure data from sr to give back to 
application
+    ANASTASIS_redux_fail_ (uc->cb,
+                           uc->cb_cls,
+                           TALER_EC_INVALID,
+                           "provider failure");
+    break;
+  default:
+    GNUNET_break (0);
+    ANASTASIS_redux_fail_ (uc->cb,
+                           uc->cb_cls,
+                           TALER_EC_INVALID,
+                           "unexpected share result");
+    break;
+  }
   upload_cancel_cb (uc);
 }
 
@@ -1405,7 +1458,7 @@ share_secret (struct UploadContext *uc)
   json_t *user_id;
   size_t core_secret_size;
   void *core_secret;
-  json_t *policies;
+  json_t *jpolicies;
   json_t *payments = NULL;
   unsigned int policies_len;
   unsigned int pds_len;
@@ -1413,7 +1466,7 @@ share_secret (struct UploadContext *uc)
     GNUNET_JSON_spec_json ("identity_attributes",
                            &user_id),
     GNUNET_JSON_spec_json ("policies",
-                           &policies),
+                           &jpolicies),
     GNUNET_JSON_spec_mark_optional (
       GNUNET_JSON_spec_json ("policy_payments",
                              &payments)),
@@ -1437,8 +1490,8 @@ share_secret (struct UploadContext *uc)
   }
 
   if ( (! json_is_object (user_id)) ||
-       (! json_is_array (policies)) ||
-       (0 == json_array_size (policies)) ||
+       (! json_is_array (jpolicies)) ||
+       (0 == json_array_size (jpolicies)) ||
        ( (NULL != payments) &&
          (! json_is_array (payments)) ) )
   {
@@ -1450,7 +1503,7 @@ share_secret (struct UploadContext *uc)
     upload_cancel_cb (uc);
     return;
   }
-  policies_len = json_array_size (policies);
+  policies_len = json_array_size (jpolicies);
   pds_len = json_array_size (payments);
 
   {
@@ -1458,29 +1511,89 @@ share_secret (struct UploadContext *uc)
     const struct ANASTASIS_Policy *policies[policies_len];
     struct ANASTASIS_PaymentDetails pds[GNUNET_NZL (pds_len)];
 
+    /* initialize policies/vpolicies arrays */
     for (unsigned int i = 0; i<policies_len; i++)
     {
+      json_t *jtruths = json_array_get (jpolicies,
+                                        i);
       unsigned int truths_len;
-      json_t *jtruths;
 
-      jtruths = NULL;
-      truths_len = 42; // FIXME
-      // FIXME: initialize truths/truths_len
+      if ( (! json_is_array (jtruths)) ||
+           (0 == json_array_size (jtruths)) )
+      {
+        GNUNET_break (0);
+        ANASTASIS_redux_fail_ (uc->cb,
+                               uc->cb_cls,
+                               TALER_EC_INVALID,
+                               "'methods' must be an array");
+        GNUNET_JSON_parse_free (spec);
+        upload_cancel_cb (uc);
+        return;
+      }
+      truths_len = json_array_size (jtruths);
       {
         struct ANASTASIS_Policy *p;
-        const struct ANASTASIS_Truth *truths[truths_len];
+        struct ANASTASIS_Truth *truths[truths_len];
+        const struct ANASTASIS_Truth *ctruths[truths_len];
 
         for (unsigned int j = 0; j<truths_len; j++)
         {
-          truths[j] = NULL; // FIXME!
+          json_t *jtruth = json_array_get (jtruths,
+                                           j);
+
+          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_INVALID,
+                                   "'truth' failed to decode");
+            GNUNET_JSON_parse_free (spec);
+            upload_cancel_cb (uc);
+            return;
+          }
+          ctruths[j] = truths[j];
         }
-        p = ANASTASIS_policy_create (truths,
+        p = ANASTASIS_policy_create (ctruths,
                                      truths_len);
         vpolicies[i] = p;
         policies[i] = p;
+        for (unsigned int k = 0; k<truths_len; k++)
+          ANASTASIS_truth_free (truths[k]);
+      }
+    }
+
+    /* initialize 'pds' array */
+    for (unsigned int i = 0; i<pds_len; i++)
+    {
+      json_t *pdj = json_array_get (payments,
+                                    i);
+      struct GNUNET_JSON_Specification ispec[] = {
+        GNUNET_JSON_spec_fixed_auto ("payment_secret",
+                                     &pds[i]),
+        GNUNET_JSON_spec_end ()
+      };
+
+      if (GNUNET_OK !=
+          GNUNET_JSON_parse (pdj,
+                             ispec,
+                             NULL, NULL))
+      {
+        GNUNET_break (0);
+        ANASTASIS_redux_fail_ (uc->cb,
+                               uc->cb_cls,
+                               TALER_EC_INVALID,
+                               NULL);
+        for (unsigned int i = 0; i<policies_len; i++)
+          ANASTASIS_policy_destroy (vpolicies[i]);
+        upload_cancel_cb (uc);
+        GNUNET_JSON_parse_free (spec);
+        return;
       }
     }
-    // FIXME: initialize pds
 
     uc->ss = ANASTASIS_secret_share (ANASTASIS_REDUX_ctx_,
                                      user_id,
@@ -1488,7 +1601,7 @@ share_secret (struct UploadContext *uc)
                                      policies_len,
                                      pds,
                                      pds_len,
-                                     false, /* do not insist on payment */
+                                     false,  /* FIXME-#6759: support forced 
payments */
                                      &secret_share_result_cb,
                                      uc,
                                      core_secret,
@@ -1500,9 +1613,10 @@ share_secret (struct UploadContext *uc)
   if (NULL == uc->ss)
   {
     GNUNET_break (0);
-    uc->cb (uc->cb_cls,
-            TALER_EC_INVALID,
-            NULL);
+    ANASTASIS_redux_fail_ (uc->cb,
+                           uc->cb_cls,
+                           TALER_EC_INVALID,
+                           NULL);
     upload_cancel_cb (uc);
     return;
   }

-- 
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]