gnunet-svn
[Top][All Lists]
Advanced

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

[taler-anastasis] 01/02: move config request to reducer


From: gnunet
Subject: [taler-anastasis] 01/02: move config request to reducer
Date: Fri, 09 Oct 2020 20:43:53 +0200

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

dennis-neufeld pushed a commit to branch master
in repository anastasis.

commit 829c1ab9a76c0e30fda33c926d15ecd2f0f9f633
Author: Dennis Neufeld <dennis.neufeld@students.bfh.ch>
AuthorDate: Fri Oct 9 19:29:58 2020 +0200

    move config request to reducer
---
 contrib/provider-list.json    |  26 ++--
 src/include/anastasis_redux.h |  10 +-
 src/lib/Makefile.am           |   1 +
 src/lib/anastasis_api_redux.c | 298 ++++++++++++++++++++++++++++++++++++------
 4 files changed, 276 insertions(+), 59 deletions(-)

diff --git a/contrib/provider-list.json b/contrib/provider-list.json
index 8e5cc82..8a28b07 100644
--- a/contrib/provider-list.json
+++ b/contrib/provider-list.json
@@ -1,24 +1,24 @@
 {
-    "anastasis-provider": [
+    "anastasis_provider": [
        {
-        "provider-id" : "anastasis_01",
-        "provider-url" : "localhost:8086/",
-        "provider-name" : "Anastasis 1"
+        "provider_id" : "anastasis_01",
+        "provider_url" : "localhost:8086/",
+        "provider_name" : "Anastasis 1"
        },
        {
-           "provider-id" : "anastasis_02",
-        "provider-url" : "localhost:8087/",
-        "provider-name" : "Anastasis 2"
+           "provider_id" : "anastasis_02",
+        "provider_url" : "localhost:8087/",
+        "provider_name" : "Anastasis 2"
        },
        {
-           "provider-id" : "anastasis_03",
-        "provider-url" : "localhost:8088/",
-        "provider-name" : "Anastasis 3"
+           "provider_id" : "anastasis_03",
+        "provider_url" : "localhost:8088/",
+        "provider_name" : "Anastasis 3"
        },
        {
-           "provider-id" : "anastasis_04",
-        "provider-url" : "localhost:8089/",
-        "provider-name" : "Anastasis 4"
+           "provider_id" : "anastasis_04",
+        "provider_url" : "localhost:8089/",
+        "provider_name" : "Anastasis 4"
        }
        ]
 }
\ No newline at end of file
diff --git a/src/include/anastasis_redux.h b/src/include/anastasis_redux.h
index 7da95ae..0955c72 100644
--- a/src/include/anastasis_redux.h
+++ b/src/include/anastasis_redux.h
@@ -26,6 +26,7 @@
 #include <jansson.h>
 #include <gnunet/gnunet_util_lib.h>
 #include "anastasis_error_codes.h"
+#include "anastasis_service.h"
 
 #define FOREACH_STATE(REDUX_STATE) \
   REDUX_STATE (ContinentSelectionState)   \
@@ -53,11 +54,6 @@ static const char *STATE_STRING[] = {
  */
 extern const json_t *redux_id_attr;
 
-/**
- * JSON containing anastasis providers.
- */
-extern const json_t *provider_list;
-
 /**
  * Currency of chosen country
  */
@@ -175,10 +171,11 @@ ANASTASIS_recovery_action (json_t *state,
  * by a callback function.
  * This function can do network access to talk to anastasis service providers.
  *
- * @param[in,out] state input/output state (to be modified)
+ * @param state input state
  * @param action what action to perform
  * @param arguments data for the @a action
  * @param cb function to call with the result
+ * @param ctx Curl context
  * @param cb_cls closure for @a cb
  * @return failure state or new state
  */
@@ -187,6 +184,7 @@ ANASTASIS_redux_action (const json_t *state,
                         const char *action,
                         const json_t *arguments,
                         ANASTASIS_ActionCallback cb,
+                        struct GNUNET_CURL_Context *ctx,
                         void *cb_cls);
 
 
diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am
index 04b092b..cb319a8 100644
--- a/src/lib/Makefile.am
+++ b/src/lib/Makefile.am
@@ -110,6 +110,7 @@ libanastasisredux_la_LIBADD = \
   -lgnunetutil \
   -ltalerutil \
   -ltalerjson \
+  -lanastasisrest \
   -ljansson \
   $(XLIB)
 
diff --git a/src/lib/anastasis_api_redux.c b/src/lib/anastasis_api_redux.c
index 09e28a0..e5d7e10 100644
--- a/src/lib/anastasis_api_redux.c
+++ b/src/lib/anastasis_api_redux.c
@@ -25,17 +25,100 @@
 #include <jansson.h>
 #include "anastasis_redux.h"
 #include "anastasis_error_codes.h"
+#include <taler/taler_json_lib.h>
 
 
 /**
- * JSON containing country specific identity attributes to ask the user for.
+ * Server information
  */
-const json_t *redux_id_attr;
+struct ServerInfo
+{
+  /**
+   * URL of the anastasis backend.
+   */
+  char *backend_url;
+
+  /**
+   * id of the anastasis backend.
+   */
+  char *backend_id;
+
+  /**
+   * label of the anastasis backend.
+   */
+  char *backend_name;
+
+  /**
+   * currrency used by the anastasis backend.
+   */
+  char *backend_currency;
+
+  /**
+   * supported methods of the anastasis backend.
+   */
+  json_t *backend_methods;
+
+  /**
+   * insurance of the anastasis backend.
+   */
+  struct TALER_Amount backend_insurance;
+
+  /**
+   * cost of using the anastasis backend.
+   */
+  struct TALER_Amount backend_cost;
+};
+
+/**
+ * State for a "get config" CMD.
+ */
+struct ConfigState
+{
+  /**
+   * Expected status code.
+   */
+  unsigned int http_status;
+
+  /**
+   * The /config GET operation handle.
+   */
+  struct ANASTASIS_ConfigOperation *co;
+
+  /**
+   * Reference to a ServerInfo.
+   */
+  struct ServerInfo *server;
+
+  /**
+   * Current state
+   */
+  json_t *state;
+
+  /**
+   * Supported methods.
+   */
+  json_t *methods;
+};
+
+/**
+ * Curl context for communication with taler backend
+ */
+struct GNUNET_CURL_Context *curl_ctx;
+
+/**
+ * Information about the servers.
+ */
+static struct ServerInfo *servers;
+
+/**
+ * Amount of servers.
+ */
+static unsigned int servers_length = 0;
 
 /**
- * JSON containing anastasis providers.
+ * JSON containing country specific identity attributes to ask the user for.
  */
-const json_t *provider_list;
+const json_t *redux_id_attr;
 
 /**
  * Currency of chosen country
@@ -58,6 +141,91 @@ typedef void
                    void *cb_cls);
 
 
+/**
+ * Function called with the results of a #ANASTASIS_get_config().
+ *
+ * @param cls closure
+ * @param http_status HTTP status of the request
+ * @param methods supported methods by this provider
+ * @param annual_fee Annual fee of this service
+ */
+static void
+config_cb (void *cls,
+           unsigned int http_status,
+           const json_t *methods,
+           const char *conf_currency,
+           const struct TALER_Amount *annual_fee)
+{
+  json_t *method;
+  json_t *method_arr;
+  size_t index;
+  struct ConfigState *cs = cls;
+
+  cs->co = NULL;
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "At %s:%d url is %s\n", __FILE__, __LINE__,
+              cs->server->backend_url);
+  if (http_status != cs->http_status)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Unexpected response code %u in %s:%u\n",
+                http_status,
+                __FILE__,
+                __LINE__);
+    return;
+  }
+
+  cs->server->backend_methods = methods;
+  cs->server->backend_cost = *annual_fee;
+  cs->server->backend_currency = GNUNET_malloc (strlen (conf_currency));
+  GNUNET_strlcpy (cs->server->backend_currency,
+                  conf_currency,
+                  strlen (conf_currency));
+
+  /** FIXME: Wrong place...
+  method_arr = json_object_get (methods, "methods");
+  json_t *providers = json_object_get (cs->state, "authentication_providers");
+
+  if (NULL == providers)
+    providers = json_object ();
+  json_array_foreach (method_arr, index, method)
+  {
+    json_t *method_type = json_object_get (method, "method");
+    json_t *provider_method = json_object_get (providers,
+                                               json_string_value 
(method_type));
+    if (NULL == provider_method)
+      provider_method = json_object ();
+
+    json_t *provider_id = json_object_get (provider_method,
+                                           cs->server->backend_id);
+    if (NULL == provider_id)
+    {
+      json_t *method_cost = json_object ();
+      json_t *annual_cost = json_object ();
+
+      json_object_set_new (method_cost,
+                           "method_cost",
+                           json_object_get (method, "cost"));
+      json_object_set_new (provider_id,
+                           cs->server->backend_id,
+                           method_cost);
+      json_object_set_new (annual_cost,
+                           "annual_cost",
+                           TALER_JSON_from_amount (&cs->server->backend_cost));
+      json_object_set_new (provider_id,
+                           cs->server->backend_id,
+                           annual_cost);
+
+      json_object_set_new (provider_method,
+                           json_string_value (method_type),
+                           provider_id);
+    }
+    json_object_
+  }
+  */
+}
+
+
 /**
  * Returns the integer value to a string value of a state.
  * -1 if state unknown.
@@ -240,7 +408,89 @@ select_country (json_t *state,
                 void *cb_cls)
 {
   json_t *root;
+  const json_t *provider_list;
   json_t *country = json_object_get (arguments, "country_code");
+  char *dn;
+  json_error_t error;
+
+  // initialize provider list
+  {
+    char *path;
+
+    path = GNUNET_OS_installation_get_path (GNUNET_OS_IPK_PREFIX);
+    if (NULL == path)
+    {
+      GNUNET_break (0);
+      return;
+    }
+    GNUNET_asprintf (&dn,
+                     "%s/share/anastasis/provider-list.json",
+                     path);
+    GNUNET_free (path);
+  }
+  provider_list = json_load_file (dn, JSON_COMPACT, &error);
+  if (NULL == provider_list)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Failed to parse `%s': %s at %d:%d (%d)\n",
+                dn,
+                error.text,
+                error.line,
+                error.column,
+                error.position);
+    GNUNET_free (dn);
+    return;
+  }
+
+  // get configs from providers
+  {
+    size_t index;
+    json_t *provider;
+    json_t *provider_list = json_object_get (provider_list,
+                                             "anastasis_provider");
+
+    json_array_foreach (provider_list, index, provider)
+    {
+      struct ServerInfo *server = GNUNET_new (struct ServerInfo);
+      const char *url = json_string_value (json_object_get (provider,
+                                                            "provider_url"));
+      const char *provider_name = json_string_value (json_object_get (provider,
+                                                                      
"provider_name"));
+      const char *provider_id = json_string_value (json_object_get (provider,
+                                                                    
"provider_id"));
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                  "Url is: %s\n", url);
+      server->backend_url = GNUNET_malloc (strlen (url) + 1);
+      GNUNET_strlcpy (server->backend_url,
+                      url,
+                      strlen (url) + 1);
+      server->backend_name = GNUNET_malloc (strlen (provider_name) + 1);
+      GNUNET_strlcpy (server->backend_name,
+                      provider_name,
+                      strlen (provider_name) + 1);
+      server->backend_id = GNUNET_malloc (strlen (provider_id) + 1);
+      GNUNET_strlcpy (server->backend_id,
+                      provider_id,
+                      strlen (provider_id) + 1);
+      GNUNET_array_append (servers, servers_length, *server);
+    }
+
+    for (unsigned int i = 0; i < servers_length; i++)
+    {
+      struct ConfigState *cs = GNUNET_new (struct ConfigState);
+      cs->server = &servers[i];
+      cs->http_status = MHD_HTTP_OK;
+      cs->state = state;
+      cs->co = ANASTASIS_get_config (curl_ctx,
+                                     servers[i].backend_url,
+                                     config_cb,
+                                     cs);
+      if (NULL == cs->co)
+      {
+        /** FIXME: Error handling */
+      }
+    }
+  }
 
   GNUNET_assert (NULL != country);
   GNUNET_assert (NULL != state);
@@ -322,44 +572,12 @@ enter_user_attributes (json_t *state,
                        ANASTASIS_ActionCallback cb,
                        void *cb_cls)
 {
-  json_t *root;
-  char *dn;
-  json_error_t error;
   json_t *attributes = json_object_get (arguments, "identity_attributes");
 
   GNUNET_assert (NULL != attributes);
   GNUNET_assert (NULL != state);
   const char *s_mode = get_state_mode (state);
   GNUNET_assert (NULL != s_mode);
-  {
-    char *path;
-
-    path = GNUNET_OS_installation_get_path (GNUNET_OS_IPK_PREFIX);
-    if (NULL == path)
-    {
-      GNUNET_break (0);
-      return;
-    }
-    GNUNET_asprintf (&dn,
-                     "%s/share/anastasis/provider-list.json",
-                     path);
-    GNUNET_free (path);
-  }
-  provider_list = json_load_file (dn, JSON_COMPACT, &error);
-  if (NULL == provider_list)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Failed to parse `%s': %s at %d:%d (%d)\n",
-                dn,
-                error.text,
-                error.line,
-                error.column,
-                error.position);
-    GNUNET_free (dn);
-    return;
-  }
-  root = json_object_get (provider_list, "anastasis-provider");
-  GNUNET_assert (NULL != root);
   json_object_set_new (state,
                        s_mode,
                        json_string 
(STATE_STRING[AuthenticationsEditingState]));
@@ -367,10 +585,6 @@ enter_user_attributes (json_t *state,
   json_object_set_new (state,
                        "identity_attributes",
                        attributes);
-
-  json_object_set_new (state,
-                       "provider-list",
-                       root);
   cb (cb_cls,
       ANASTASIS_EC_NONE,
       state);
@@ -429,6 +643,7 @@ state_back (json_t *state,
  * @param action what action to perform
  * @param arguments data for the @a action
  * @param cb function to call with the result
+ * @param ctx Curl context
  * @param cb_cls closure for @a cb
  * @return failure state or new state
  */
@@ -437,6 +652,7 @@ ANASTASIS_redux_action (const json_t *state,
                         const char *action,
                         const json_t *arguments,
                         ANASTASIS_ActionCallback cb,
+                        struct GNUNET_CURL_Context *ctx,
                         void *cb_cls)
 {
   struct Dispatcher
@@ -520,6 +736,8 @@ ANASTASIS_redux_action (const json_t *state,
           NULL);
     }
   }
+  if (NULL != ctx)
+    curl_ctx = ctx;
   new_state = json_deep_copy (state);
   GNUNET_assert (NULL != new_state);
   for (unsigned int i = 0; NULL != dispatchers[i].fun; i++)

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