gnunet-svn
[Top][All Lists]
Advanced

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

[taler-merchant] branch master updated (7d425da4 -> a7cc5eb7)


From: gnunet
Subject: [taler-merchant] branch master updated (7d425da4 -> a7cc5eb7)
Date: Fri, 16 Apr 2021 23:07:56 +0200

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

grothoff pushed a change to branch master
in repository merchant.

    from 7d425da4 add test foer #6836
     new 4a6f9171 enable use of per-instance APIs also in C API
     new a7cc5eb7 implement #6779 (still needs tests)

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/include/taler_merchant_service.h       |  57 ++++++-
 src/lib/Makefile.am                        |   1 +
 src/lib/merchant_api_delete_instance.c     |  25 ++--
 src/lib/merchant_api_patch_instance.c      |   9 ++
 src/lib/merchant_api_patch_instance_auth.c | 229 +++++++++++++++++++++++++++++
 5 files changed, 305 insertions(+), 16 deletions(-)
 create mode 100644 src/lib/merchant_api_patch_instance_auth.c

diff --git a/src/include/taler_merchant_service.h 
b/src/include/taler_merchant_service.h
index 67f544e9..b897bd2c 100644
--- a/src/include/taler_merchant_service.h
+++ b/src/include/taler_merchant_service.h
@@ -1,6 +1,6 @@
 /*
   This file is part of TALER
-  Copyright (C) 2014-2020 Taler Systems SA
+  Copyright (C) 2014-2021 Taler Systems SA
 
   TALER is free software; you can redistribute it and/or modify it under the
   terms of the GNU Affero General Public License as published by the Free 
Software
@@ -561,8 +561,10 @@ typedef void
  * Modify an existing instance in the backend.
  *
  * @param ctx the context
- * @param backend_url HTTP base URL for the backend
- * @param instance_id identity of the instance to get information about
+ * @param backend_url HTTP base URL for the backend (top-level "default" 
instance
+ *                    or base URL of an instance if @a instance_id is NULL)
+ * @param instance_id identity of the instance to modify information about; 
NULL
+ *                    if the instance is identified as part of the @a 
backend_url
  * @param accounts_length length of the @a accounts array
  * @param payto_uris URIs of the bank accounts of the merchant instance
  * @param name name of the merchant instance
@@ -573,7 +575,6 @@ typedef void
  * @param default_max_deposit_fee default maximum deposit fee merchant is 
willing to pay
  * @param default_wire_transfer_delay default wire transfer delay merchant 
will ask for
  * @param default_pay_delay default validity period for offers merchant makes
- * @param auth_token authorization token needed to access the instance, can be 
NULL
  * @param cb function to call with the
  *        backend's instances information
  * @param cb_cls closure for @a config_cb
@@ -609,6 +610,48 @@ TALER_MERCHANT_instance_patch_cancel (
   struct TALER_MERCHANT_InstancePatchHandle *iph);
 
 
+/**
+ * Handle for an operation to modify authentication settings.
+ */
+struct TALER_MERCHANT_InstanceAuthPatchHande;
+
+
+/**
+ * Modify authentication for an existing instance in the backend.
+ *
+ * @param ctx the context
+ * @param backend_url HTTP base URL for the backend (top-level "default" 
instance
+ *                    or base URL of an instance if @a instance_id is NULL)
+ * @param instance_id identity of the instance to patch the authentication 
for; NULL
+ *                    if the instance is identified as part of the @a 
backend_url
+ * @param auth_token authorization token needed to access the instance, can be 
NULL
+ *                   to swith to no (or external) authentication
+ * @param cb function to call with the backend's response
+ * @param cb_cls closure for @a config_cb
+ * @return the instances handle; NULL upon error
+ */
+struct TALER_MERCHANT_InstanceAuthPatchHandle *
+TALER_MERCHANT_instance_auth_patch (
+  struct GNUNET_CURL_Context *ctx,
+  const char *backend_url,
+  const char *instance_id,
+  const char *auth_token,
+  TALER_MERCHANT_InstancePatchCallback cb,
+  void *cb_cls);
+
+
+/**
+ * Cancel /private/auth request.  Must not be called by clients after
+ * the callback was invoked.  Afterwards, the authentication may or
+ * may not have been updated.
+ *
+ * @param iaph request to cancel.
+ */
+void
+TALER_MERCHANT_instance_auth_patch_cancel (
+  struct TALER_MERCHANT_InstanceAuthPatchHandle *iaph);
+
+
 /**
  * Handle for a GET /instances/$ID operation.
  */
@@ -769,8 +812,10 @@ typedef void
  * (i.e. for taxation).
  *
  * @param ctx the context
- * @param backend_url HTTP base URL for the backend
- * @param instance_id which instance should be deleted
+ * @param backend_url HTTP base URL for the backend (top-level "default" 
instance
+ *                    or base URL of an instance if @a instance_id is NULL)
+ * @param instance_id identity of the instance to modify information about; 
NULL
+ *                    if the instance is identified as part of the @a 
backend_url
  * @param instances_cb function to call with the
  *        backend's return
  * @param instances_cb_cls closure for @a config_cb
diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am
index 57e40902..a06089b3 100644
--- a/src/lib/Makefile.am
+++ b/src/lib/Makefile.am
@@ -34,6 +34,7 @@ libtalermerchant_la_SOURCES = \
   merchant_api_patch_instance.c \
   merchant_api_patch_order_forget.c \
   merchant_api_patch_product.c \
+  merchant_api_patch_instance_auth.c \
   merchant_api_post_instances.c \
   merchant_api_post_orders.c \
   merchant_api_post_order_abort.c \
diff --git a/src/lib/merchant_api_delete_instance.c 
b/src/lib/merchant_api_delete_instance.c
index 4568f7e1..4ef40952 100644
--- a/src/lib/merchant_api_delete_instance.c
+++ b/src/lib/merchant_api_delete_instance.c
@@ -140,24 +140,29 @@ instance_delete (struct GNUNET_CURL_Context *ctx,
   idh->ctx = ctx;
   idh->cb = cb;
   idh->cb_cls = cb_cls;
+  if (NULL != instance_id)
   {
     char *path;
 
     GNUNET_asprintf (&path,
                      "instances/%s/private",
                      instance_id);
-    if (purge)
-      idh->url = TALER_url_join (backend_url,
-                                 path,
-                                 "purge",
-                                 "yes",
-                                 NULL);
-    else
-      idh->url = TALER_url_join (backend_url,
-                                 path,
-                                 NULL);
+    idh->url = TALER_url_join (backend_url,
+                               path,
+                               "purge",
+                               (purge) ? "yes" : NULL,
+                               NULL);
     GNUNET_free (path);
   }
+  else
+  {
+    /* backend_url is already identifying the instance */
+    idh->url = TALER_url_join (backend_url,
+                               "/private",
+                               "purge",
+                               (purge) ? "yes" : NULL,
+                               NULL);
+  }
   if (NULL == idh->url)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
diff --git a/src/lib/merchant_api_patch_instance.c 
b/src/lib/merchant_api_patch_instance.c
index 2fc8eaff..f51bb953 100644
--- a/src/lib/merchant_api_patch_instance.c
+++ b/src/lib/merchant_api_patch_instance.c
@@ -223,6 +223,7 @@ TALER_MERCHANT_instance_patch (
   iph->ctx = ctx;
   iph->cb = cb;
   iph->cb_cls = cb_cls;
+  if (NULL != instance_id)
   {
     char *path;
 
@@ -234,6 +235,13 @@ TALER_MERCHANT_instance_patch (
                                NULL);
     GNUNET_free (path);
   }
+  else
+  {
+    /* backend_url is already identifying the instance */
+    iph->url = TALER_url_join (backend_url,
+                               "/private",
+                               NULL);
+  }
   if (NULL == iph->url)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
@@ -253,6 +261,7 @@ TALER_MERCHANT_instance_patch (
     {
       GNUNET_break (0);
       json_decref (req_obj);
+      GNUNET_free (iph->url);
       GNUNET_free (iph);
       return NULL;
     }
diff --git a/src/lib/merchant_api_patch_instance_auth.c 
b/src/lib/merchant_api_patch_instance_auth.c
new file mode 100644
index 00000000..d0bf56d1
--- /dev/null
+++ b/src/lib/merchant_api_patch_instance_auth.c
@@ -0,0 +1,229 @@
+/*
+  This file is part of TALER
+  Copyright (C) 2014-2018, 2020 Taler Systems SA
+
+  TALER is free software; you can redistribute it and/or modify it under the
+  terms of the GNU Lesser General Public License as published by the Free 
Software
+  Foundation; either version 2.1, or (at your option) any later version.
+
+  TALER is distributed in the hope that it will be useful, but WITHOUT ANY
+  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+  A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more 
details.
+
+  You should have received a copy of the GNU Lesser General Public License 
along with
+  TALER; see the file COPYING.LGPL.  If not, see
+  <http://www.gnu.org/licenses/>
+*/
+/**
+ * @file merchant_api_patch_instance_auth.c
+ * @brief Implementation of the PATCH /instance/$ID/private/auth request
+ * @author Christian Grothoff
+ */
+#include "platform.h"
+#include <curl/curl.h>
+#include <jansson.h>
+#include <microhttpd.h> /* just for HTTP status codes */
+#include <gnunet/gnunet_util_lib.h>
+#include <gnunet/gnunet_curl_lib.h>
+#include "taler_merchant_service.h"
+#include <taler/taler_json_lib.h>
+#include <taler/taler_signatures.h>
+#include <taler/taler_curl_lib.h>
+
+
+/**
+ * Handle for a PATCH /instances/$ID/private/auth operation.
+ */
+struct TALER_MERCHANT_InstanceAuthPatchHandle
+{
+  /**
+   * The url for this request.
+   */
+  char *url;
+
+  /**
+   * Handle for the request.
+   */
+  struct GNUNET_CURL_Job *job;
+
+  /**
+   * Function to call with the result.
+   */
+  TALER_MERCHANT_InstancePatchCallback cb;
+
+  /**
+   * Closure for @a cb.
+   */
+  void *cb_cls;
+
+  /**
+   * Reference to the execution context.
+   */
+  struct GNUNET_CURL_Context *ctx;
+
+  /**
+   * Minor context that holds body and headers.
+   */
+  struct TALER_CURL_PostContext post_ctx;
+
+};
+
+
+/**
+ * Function called when we're done processing the
+ * HTTP GET /instances/$ID/private/auth request.
+ *
+ * @param cls the `struct TALER_MERCHANT_InstanceAuthPatchHandle`
+ * @param response_code HTTP response code, 0 on error
+ * @param response response body, NULL if not in JSON
+ */
+static void
+handle_patch_instance_auth_finished (void *cls,
+                                     long response_code,
+                                     const void *response)
+{
+  struct TALER_MERCHANT_InstanceAuthPatchHandle *iaph = cls;
+  const json_t *json = response;
+  struct TALER_MERCHANT_HttpResponse hr = {
+    .http_status = (unsigned int) response_code,
+    .reply = json
+  };
+
+  iaph->job = NULL;
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Got /instances/$ID response with status code %u\n",
+              (unsigned int) response_code);
+  switch (response_code)
+  {
+  case MHD_HTTP_NO_CONTENT:
+    break;
+  case MHD_HTTP_UNAUTHORIZED:
+    hr.ec = TALER_JSON_get_error_code (json);
+    hr.hint = TALER_JSON_get_error_hint (json);
+    /* Nothing really to verify, merchant says we need to authenticate. */
+    break;
+  default:
+    /* unexpected response code */
+    hr.ec = TALER_JSON_get_error_code (json);
+    hr.hint = TALER_JSON_get_error_hint (json);
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Unexpected response code %u/%d\n",
+                (unsigned int) response_code,
+                (int) hr.ec);
+    break;
+  }
+  iaph->cb (iaph->cb_cls,
+            &hr);
+  TALER_MERCHANT_instance_auth_patch_cancel (iaph);
+}
+
+
+struct TALER_MERCHANT_InstanceAuthPatchHandle *
+TALER_MERCHANT_instance_auth_patch (
+                                    struct GNUNET_CURL_Context *ctx,
+  const char *backend_url,
+  const char *instance_id,
+  const char *auth_token,
+  TALER_MERCHANT_InstancePatchCallback cb,
+  void *cb_cls)
+{
+  struct TALER_MERCHANT_InstanceAuthPatchHandle *iaph;
+  json_t *req_obj;
+
+  iaph = GNUNET_new (struct TALER_MERCHANT_InstanceAuthPatchHandle);
+  iaph->ctx = ctx;
+  iaph->cb = cb;
+  iaph->cb_cls = cb_cls;
+  if (NULL != instance_id)
+  {
+    char *path;
+
+    GNUNET_asprintf (&path,
+                     "instances/%s/private/auth",
+                     instance_id);
+    iaph->url = TALER_url_join (backend_url,
+                               path,
+                               NULL);
+    GNUNET_free (path);
+  }
+  else
+  {
+    /* backend_url is already identifying the instance */
+    iaph->url = TALER_url_join (backend_url,
+                               "/private/auth",
+                               NULL);
+  }
+  if (NULL == iaph->url)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Could not construct request URL.\n");
+    GNUNET_free (iaph);
+    return NULL;
+  }
+  if (NULL == auth_token)
+  {
+    req_obj = json_pack ("{s:s}",
+                         "method",
+                         "external");
+  }
+  else
+  {
+    req_obj = json_pack ("{s:s, s:s}",
+                         "method",
+                         "token",
+                         "token",
+                         auth_token);
+  }
+  if (NULL == req_obj)
+  {
+    GNUNET_break (0);
+    GNUNET_free (iaph->url);
+    GNUNET_free (iaph);
+    return NULL;
+  }
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Requesting URL '%s'\n",
+              iaph->url);
+  {
+    CURL *eh;
+
+    eh = curl_easy_init ();
+    if (GNUNET_OK !=
+        TALER_curl_easy_post (&iaph->post_ctx,
+                              eh,
+                              req_obj))
+    {
+      GNUNET_break (0);
+      json_decref (req_obj);
+      GNUNET_free (iaph->url);
+      GNUNET_free (iaph);
+      return NULL;
+    }
+    json_decref (req_obj);
+    GNUNET_assert (CURLE_OK ==
+                   curl_easy_setopt (eh,
+                                     CURLOPT_URL,
+                                     iaph->url));
+    GNUNET_assert (CURLE_OK ==
+                   curl_easy_setopt (eh,
+                                     CURLOPT_CUSTOMREQUEST,
+                                     MHD_HTTP_METHOD_POST)); // FIXME: PATCH?
+    iaph->job = GNUNET_CURL_job_add (ctx,
+                                     eh,
+                                     &handle_patch_instance_auth_finished,
+                                     iaph);
+  }
+  return iaph;
+}
+
+
+void
+TALER_MERCHANT_instance_auth_patch_cancel (
+  struct TALER_MERCHANT_InstanceAuthPatchHandle *iaph)
+{
+  if (NULL != iaph->job)
+    GNUNET_CURL_job_cancel (iaph->job);
+  TALER_curl_easy_post_finished (&iaph->post_ctx);
+  GNUNET_free (iaph->url);
+  GNUNET_free (iaph);
+}

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