gnunet-svn
[Top][All Lists]
Advanced

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

[taler-anastasis] branch master updated: improve error reporting from re


From: gnunet
Subject: [taler-anastasis] branch master updated: improve error reporting from reducer
Date: Fri, 19 Mar 2021 19:54:20 +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 2de3c77  improve error reporting from reducer
2de3c77 is described below

commit 2de3c77d1419229ac788b42926ced2e2672a45b2
Author: Christian Grothoff <grothoff@gnunet.org>
AuthorDate: Fri Mar 19 19:54:16 2021 +0100

    improve error reporting from reducer
---
 contrib/gana                               |   2 +-
 src/include/anastasis.h                    |  15 ++++
 src/lib/anastasis_recovery.c               |  26 +++++--
 src/reducer/anastasis_api_recovery_redux.c | 107 +++++++++++++++++++++++++----
 4 files changed, 129 insertions(+), 21 deletions(-)

diff --git a/contrib/gana b/contrib/gana
index f2a01a8..0d7ef35 160000
--- a/contrib/gana
+++ b/contrib/gana
@@ -1 +1 @@
-Subproject commit f2a01a8e1fa5bd9d4e90b080e4a2a9db4022e4fe
+Subproject commit 0d7ef35edeabec5de9c4e479c697fd643d92c26c
diff --git a/src/include/anastasis.h b/src/include/anastasis.h
index b58000b..7e10325 100644
--- a/src/include/anastasis.h
+++ b/src/include/anastasis.h
@@ -418,6 +418,21 @@ enum ANASTASIS_RecoveryStatus
    * The decompressed policy document was in malformed JSON.
    */
   ANASTASIS_RS_POLICY_MALFORMED_JSON,
+
+  /**
+   * The Anastasis server reported a transient error.
+   */
+  ANASTASIS_RS_POLICY_SERVER_ERROR,
+
+  /**
+   * The Anastasis server no longer has a policy (likely expired).
+   */
+  ANASTASIS_RS_POLICY_GONE,
+
+  /**
+   * The Anastasis server reported that the account is unknown.
+   */
+  ANASTASIS_RS_POLICY_UNKNOWN
 };
 
 
diff --git a/src/lib/anastasis_recovery.c b/src/lib/anastasis_recovery.c
index cc5e4de..7a893ce 100644
--- a/src/lib/anastasis_recovery.c
+++ b/src/lib/anastasis_recovery.c
@@ -546,24 +546,36 @@ policy_lookup_cb (void *cls,
   case MHD_HTTP_OK:
     break;
   case MHD_HTTP_NOT_FOUND:
-    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
-                "Policy unknown to server (HTTP status %u in %s:%u\n)",
-                http_status,
-                __FILE__,
-                __LINE__);
     r->csc (r->csc_cls,
-            ANASTASIS_RS_POLICY_DOWNLOAD_FAILED,
+            ANASTASIS_RS_POLICY_UNKNOWN,
+            NULL,
+            0);
+    ANASTASIS_recovery_abort (r);
+    return;
+  case MHD_HTTP_NO_CONTENT:
+    /* Account known, policy expired */
+    r->csc (r->csc_cls,
+            ANASTASIS_RS_POLICY_GONE,
+            NULL,
+            0);
+    ANASTASIS_recovery_abort (r);
+    return;
+  case MHD_HTTP_INTERNAL_SERVER_ERROR:
+    /* Bad server... */
+    r->csc (r->csc_cls,
+            ANASTASIS_RS_POLICY_SERVER_ERROR,
             NULL,
             0);
     ANASTASIS_recovery_abort (r);
     return;
+  case MHD_HTTP_NOT_MODIFIED:
+  /* Should not be possible, we do not cache, fall-through! */
   default:
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                 "Unexpected response code %u in %s:%u\n",
                 http_status,
                 __FILE__,
                 __LINE__);
-    // FIXME #6764: should differenciate by @a http_status here!
     r->csc (r->csc_cls,
             ANASTASIS_RS_POLICY_DOWNLOAD_FAILED,
             NULL,
diff --git a/src/reducer/anastasis_api_recovery_redux.c 
b/src/reducer/anastasis_api_recovery_redux.c
index 75fa5f2..e272cf1 100644
--- a/src/reducer/anastasis_api_recovery_redux.c
+++ b/src/reducer/anastasis_api_recovery_redux.c
@@ -180,6 +180,76 @@ sctx_free (void *cls)
 }
 
 
+/**
+ * Update @a state to reflect the error provided in @a rc.
+ *
+ * @param[in,out] state state to update
+ * @param rc error code to translate to JSON
+ * @return error code to use
+ */
+static enum TALER_ErrorCode
+update_state_by_error (json_t *state,
+                       enum ANASTASIS_RecoveryStatus rc)
+{
+  const char *msg = NULL;
+  enum TALER_ErrorCode ec;
+
+  switch (rc)
+  {
+  case ANASTASIS_RS_SUCCESS:
+    GNUNET_assert (0);
+    break;
+  case ANASTASIS_RS_POLICY_DOWNLOAD_FAILED:
+    msg = "download failed due to unexpected network issue";
+    ec = TALER_EC_ANASTASIS_REDUCER_NETWORK_FAILED;
+    break;
+  case ANASTASIS_RS_POLICY_DOWNLOAD_NO_POLICY:
+    msg = "policy document returned was malformed";
+    ec = TALER_EC_ANASTASIS_REDUCER_POLICY_MALFORMED;
+    break;
+  case ANASTASIS_RS_POLICY_DOWNLOAD_TOO_BIG:
+    msg = "policy document too large for client memory";
+    ec = TALER_EC_ANASTASIS_REDUCER_POLICY_MALFORMED;
+    break;
+  case ANASTASIS_RS_POLICY_DOWNLOAD_INVALID_COMPRESSION:
+    msg = "failed to decompress policy document";
+    ec = TALER_EC_ANASTASIS_REDUCER_POLICY_MALFORMED;
+    break;
+  case ANASTASIS_RS_POLICY_DOWNLOAD_NO_JSON:
+    msg = "policy document returned was not in JSON format";
+    ec = TALER_EC_ANASTASIS_REDUCER_POLICY_MALFORMED;
+    break;
+  case ANASTASIS_RS_POLICY_MALFORMED_JSON:
+    msg = "policy document returned was not in required JSON format";
+    ec = TALER_EC_ANASTASIS_REDUCER_POLICY_MALFORMED;
+    break;
+  case ANASTASIS_RS_POLICY_SERVER_ERROR:
+    msg = "Anastasis server reported transient internal error";
+    ec = TALER_EC_ANASTASIS_REDUCER_BACKUP_PROVIDER_FAILED;
+    break;
+  case ANASTASIS_RS_POLICY_GONE:
+    msg = "policy document no longer exists";
+    ec = TALER_EC_ANASTASIS_REDUCER_POLICY_LOOKUP_FAILED;
+    break;
+  case ANASTASIS_RS_POLICY_UNKNOWN:
+    msg = "account unknown to Anastasis server";
+    ec = TALER_EC_ANASTASIS_REDUCER_POLICY_LOOKUP_FAILED;
+    break;
+  }
+  GNUNET_assert (0 ==
+                 json_object_set_new (state,
+                                      "error_message",
+                                      json_string (msg)));
+  GNUNET_assert (0 ==
+                 json_object_set_new (state,
+                                      "error_code",
+                                      json_integer (rc)));
+  set_state (state,
+             ANASTASIS_GENERIC_STATE_ERROR);
+  return ec;
+}
+
+
 /**
  * This function is called whenever the recovery process ends.
  * On success, the secret is returned in @a secret.
@@ -196,17 +266,28 @@ core_secret_cb (void *cls,
                 size_t secret_size)
 {
   struct SelectChallengeContext *sctx = cls;
+  enum TALER_ErrorCode ec;
 
   sctx->r = NULL;
-  GNUNET_assert (0 ==
-                 json_object_set_new (sctx->state,
-                                      "core_secret",
-                                      GNUNET_JSON_from_data (secret,
-                                                             secret_size)));
-  set_state (sctx->state,
-             ANASTASIS_RECOVERY_STATE_RECOVERY_FINISHED);
+  if (ANASTASIS_RS_SUCCESS == rc)
+  {
+    GNUNET_assert (0 ==
+                   json_object_set_new (sctx->state,
+                                        "core_secret",
+                                        GNUNET_JSON_from_data (secret,
+                                                               secret_size)));
+    set_state (sctx->state,
+               ANASTASIS_RECOVERY_STATE_RECOVERY_FINISHED);
+    sctx->cb (sctx->cb_cls,
+              TALER_EC_NONE,
+              sctx->state);
+    sctx_free (sctx);
+    return;
+  }
+  ec = update_state_by_error (sctx->state,
+                              rc);
   sctx->cb (sctx->cb_cls,
-            TALER_EC_NONE,
+            ec,
             sctx->state);
   sctx_free (sctx);
 }
@@ -1662,6 +1743,7 @@ core_early_secret_cb (void *cls,
 {
   struct PolicyDownloadEntry *pd = cls;
   struct RecoverSecretState *rss = pd->rss;
+  enum TALER_ErrorCode ec;
 
   pd->recovery = NULL;
   GNUNET_assert (NULL == secret);
@@ -1673,13 +1755,12 @@ core_early_secret_cb (void *cls,
   if (NULL != rss->pd_head)
     return;   /* wait for another one */
   /* all failed! report failure! */
-  /* FIXME #6764: return 'rc' to application more nicely */
-  set_state (rss->state,
-             ANASTASIS_GENERIC_STATE_ERROR);
-
+  GNUNET_assert (ANASTASIS_RS_SUCCESS != rc);
+  ec = update_state_by_error (rss->state,
+                              rc);
   ANASTASIS_redux_fail_ (rss->cb,
                          rss->cb_cls,
-                         TALER_EC_ANASTASIS_REDUCER_POLICY_LOOKUP_FAILED,
+                         ec,
                          "Failed to obtain policy data");
   rss->cb = NULL;
   free_rss (rss);

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