gnunet-svn
[Top][All Lists]
Advanced

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

[taler-merchant] 02/03: implement #6545


From: gnunet
Subject: [taler-merchant] 02/03: implement #6545
Date: Tue, 13 Oct 2020 23:35:07 +0200

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

grothoff pushed a commit to branch master
in repository merchant.

commit 24dfb7588d70becba67851fedc7f9ec0308a6ffe
Author: Christian Grothoff <christian@grothoff.org>
AuthorDate: Tue Oct 13 23:34:52 2020 +0200

    implement #6545
---
 src/include/taler_merchant_service.h |  10 ++
 src/lib/merchant_api_common.c        | 284 +++++++++++++++--------------------
 2 files changed, 129 insertions(+), 165 deletions(-)

diff --git a/src/include/taler_merchant_service.h 
b/src/include/taler_merchant_service.h
index d68a6b1..e34226a 100644
--- a/src/include/taler_merchant_service.h
+++ b/src/include/taler_merchant_service.h
@@ -171,6 +171,11 @@ struct TALER_MERCHANT_PayUriData
    * to pay. May be NULL.
    */
   char *ssid;
+
+  /**
+   * true if the URI used taler+http.
+   */
+  bool use_http;
 };
 
 
@@ -221,6 +226,11 @@ struct TALER_MERCHANT_RefundUriData
    * to pay. May be NULL.
    */
   char *ssid;
+
+  /**
+   * true if the URI used taler+http.
+   */
+  bool use_http;
 };
 
 
diff --git a/src/lib/merchant_api_common.c b/src/lib/merchant_api_common.c
index 255b498..031e0f1 100644
--- a/src/lib/merchant_api_common.c
+++ b/src/lib/merchant_api_common.c
@@ -24,6 +24,7 @@
 #include <jansson.h>
 #include <microhttpd.h> /* just for HTTP status codes */
 #include <gnunet/gnunet_util_lib.h>
+#include <gnunet/gnunet_uri_lib.h>
 #include <gnunet/gnunet_curl_lib.h>
 #include "taler_merchant_service.h"
 #include <taler/taler_json_lib.h>
@@ -132,187 +133,130 @@ TALER_MERCHANT_baseurl_add_instance (const char 
*base_url,
 }
 
 
-/**
- * Parses the URI scheme and action of a URI. Ensures that the scheme is either
- * 'taler' or 'taler+http'.
- *
- * @param uri the uri to parse.
- * @param[out] action the action the URI is indicating.
- * @param[out] rest the substring of the URI following the action.
- * @return #GNUNET_SYSERR if the URI is malformed, #GNUNET_OK otherwise.
- */
-static int
-parse_taler_uri_scheme_action (const char *uri,
-                               char **action,
-                               char **rest)
+int
+TALER_MERCHANT_parse_pay_uri (const char *pay_uri,
+                              struct TALER_MERCHANT_PayUriData *parse_data)
 {
-  char *scheme = GNUNET_strdup (uri);
-  /* Check that the uri starts with "taler://pay" or "taler+http://pay"; and
-     then remove it */
-  char *path = strchr (scheme, ':');
+  char *cp = GNUNET_strdup (pay_uri);
+  struct GNUNET_Uri u;
 
-  if ( (NULL == path) ||
-       (strlen (path) < 3) )
+  if (0 !=
+      GNUNET_uri_parse (&u,
+                        cp))
   {
-    GNUNET_free (scheme);
+    GNUNET_free (cp);
     GNUNET_break_op (0);
     return GNUNET_SYSERR;
   }
-  path += 3; /* make path point to 'pay' */
-
-  {
-    char path_begin = *path;
-
-    *path = '\0';
-    if ((0 != strcmp ("taler://",
-                      scheme)) &&
-        (0 != strcmp ("taler+http://";,
-                      scheme)))
-    {
-      GNUNET_free (scheme);
-      GNUNET_break_op (0);
-      return GNUNET_SYSERR;
-    }
-    *path = path_begin;
-  }
-
+  if ((0 != strcasecmp ("taler",
+                        u.scheme)) &&
+      (0 != strcasecmp ("taler+http",
+                        u.scheme)))
   {
-    char *pqf = strchr (path, '/');
-
-    if (NULL == pqf)
-    {
-      GNUNET_free (scheme);
-      GNUNET_break_op (0);
-      return GNUNET_SYSERR;
-    }
-    *pqf = '\0';
-    ++pqf;
-    *rest = GNUNET_strdup (pqf);
+    fprintf (stderr,
+             "Bad schema %s\n",
+             u.scheme);
+    GNUNET_free (cp);
+    GNUNET_break_op (0);
+    return GNUNET_SYSERR;
   }
-  *action = GNUNET_strdup (path);
-
-  GNUNET_free (scheme);
-  return GNUNET_OK;
-}
-
-
-int
-TALER_MERCHANT_parse_pay_uri (const char *pay_uri,
-                              struct TALER_MERCHANT_PayUriData *parse_data)
-{
-  char *path = NULL;
+  parse_data->use_http = (0 == strcasecmp ("taler+http",
+                                           u.scheme));
+  if (0 != strcasecmp ("pay",
+                       u.host))
   {
-    char *action = NULL;
-
-    if ((GNUNET_OK !=
-         parse_taler_uri_scheme_action (pay_uri,
-                                        &action,
-                                        &path)) ||
-        (0 != strcmp ("pay",
-                      action)))
-    {
-      GNUNET_break_op (0);
-      GNUNET_free (action);
-      GNUNET_free (path);
-      return GNUNET_SYSERR;
-    }
-    GNUNET_free (action);
+    GNUNET_break_op (0);
+    GNUNET_free (cp);
+    return GNUNET_SYSERR;
   }
 
   {
-    char *mpp;
     char *order_id;
-    char *session_id = strrchr (path,
+    char *session_id = strrchr (u.path,
                                 '/');
     struct TALER_ClaimTokenP *claim_token = NULL;
-    char *ssid;
 
     if (NULL == session_id)
     {
       GNUNET_break_op (0);
-      GNUNET_free (path);
+      GNUNET_free (cp);
       return GNUNET_SYSERR;
     }
     *session_id = '\0';
     ++session_id;
 
-    order_id = strrchr (path,
+    order_id = strrchr (u.path,
                         '/');
     if (NULL == order_id)
     {
       GNUNET_break_op (0);
-      GNUNET_free (path);
+      GNUNET_free (cp);
       return GNUNET_SYSERR;
     }
     *order_id = '\0';
     ++order_id;
 
     {
-      char *ct_str = strchr (session_id,
-                             '?');
+      char *ct_str = u.query;
       char *ct_data;
-      if (NULL != ct_str)
-      {
-        *ct_str = '\0';
-        ++ct_str;
-      }
-
-      ssid = strchr (session_id,
-                     '#');
-      if (NULL != ssid)
-      {
-        *ssid = '\0';
-        ++ssid;
-      }
 
       if (NULL != ct_str)
       {
-        ct_data = strchr (ct_str,
+        ct_data = strchr (u.query,
                           '=');
         if (NULL == ct_data)
         {
           GNUNET_break_op (0);
-          GNUNET_free (path);
+          GNUNET_free (cp);
           return GNUNET_SYSERR;
         }
         *ct_data = '\0';
         ++ct_data;
         claim_token = GNUNET_new (struct TALER_ClaimTokenP);
-        if ((0 != strcmp ("c",
-                          ct_str)) ||
-            (GNUNET_OK !=
-             GNUNET_STRINGS_string_to_data (ct_data,
-                                            strlen (ct_data),
-                                            claim_token,
-                                            sizeof (*claim_token))))
+        if ( (0 != strcmp ("c",
+                           u.query)) ||
+             (GNUNET_OK !=
+              GNUNET_STRINGS_string_to_data (ct_data,
+                                             strlen (ct_data),
+                                             claim_token,
+                                             sizeof (*claim_token))) )
         {
           GNUNET_break_op (0);
-          GNUNET_free (path);
           GNUNET_free (claim_token);
+          GNUNET_free (cp);
           return GNUNET_SYSERR;
         }
       }
     }
 
-    mpp = strchr (path,
-                  '/');
-    if (NULL != mpp)
     {
-      *mpp = '\0';
-      ++mpp;
-    }
+      char *mpp;
 
-    parse_data->merchant_host = GNUNET_strdup (path);
-    parse_data->merchant_prefix_path =
-      (NULL == mpp) ? NULL : GNUNET_strdup (mpp);
+      mpp = strchr (u.path,
+                    '/');
+      if (NULL != mpp)
+      {
+        *mpp = '\0';
+        ++mpp;
+      }
+      parse_data->merchant_prefix_path
+        = (NULL == mpp)
+          ? NULL
+          : GNUNET_strdup (mpp);
+    }
+    parse_data->merchant_host = GNUNET_strdup (u.path);
     parse_data->order_id = GNUNET_strdup (order_id);
-    parse_data->session_id =
-      (0 < strlen (session_id)) ? GNUNET_strdup (session_id) : NULL;
+    parse_data->session_id
+      = (0 < strlen (session_id))
+        ? GNUNET_strdup (session_id)
+        : NULL;
     parse_data->claim_token = claim_token;
-    parse_data->ssid =
-      (NULL == ssid) ? NULL : GNUNET_strdup (ssid);
+    parse_data->ssid
+      = (NULL == u.fragment)
+        ? NULL
+        : GNUNET_strdup (u.fragment);
   }
-  GNUNET_free (path);
+  GNUNET_free (cp);
   return GNUNET_OK;
 }
 
@@ -335,83 +279,93 @@ TALER_MERCHANT_parse_refund_uri (
   const char *refund_uri,
   struct TALER_MERCHANT_RefundUriData *parse_data)
 {
-  char *path = NULL;
+  char *cp = GNUNET_strdup (refund_uri);
+  struct GNUNET_Uri u;
+
+  if (0 !=
+      GNUNET_uri_parse (&u,
+                        cp))
   {
-    char *action = NULL;
-
-    if ((GNUNET_OK !=
-         parse_taler_uri_scheme_action (refund_uri,
-                                        &action,
-                                        &path)) ||
-        (0 != strcmp ("refund",
-                      action)))
-    {
-      GNUNET_break_op (0);
-      GNUNET_free (action);
-      GNUNET_free (path);
-      return GNUNET_SYSERR;
-    }
-    GNUNET_free (action);
+    GNUNET_free (cp);
+    GNUNET_break_op (0);
+    return GNUNET_SYSERR;
+  }
+  if ((0 != strcasecmp ("taler",
+                        u.scheme)) &&
+      (0 != strcasecmp ("taler+http",
+                        u.scheme)))
+  {
+    GNUNET_free (cp);
+    GNUNET_break_op (0);
+    return GNUNET_SYSERR;
   }
+  parse_data->use_http = (0 == strcasecmp ("taler+http",
+                                           u.scheme));
+
+  if (0 != strcasecmp ("refund",
+                       u.host))
+  {
+    GNUNET_break_op (0);
+    GNUNET_free (cp);
+    return GNUNET_SYSERR;
+  }
+
 
   {
-    char *mpp;
     char *order_id;
-    char *last_seg = strrchr (path,
+    char *last_seg = strrchr (u.path,
                               '/');
-    char *ssid;
 
     if (NULL == last_seg)
     {
       GNUNET_break_op (0);
-      GNUNET_free (path);
+      GNUNET_free (cp);
       return GNUNET_SYSERR;
     }
     *last_seg = '\0';
     ++last_seg;
 
-    order_id = strrchr (path,
+    order_id = strrchr (u.path,
                         '/');
     if (NULL == order_id)
     {
       GNUNET_break_op (0);
-      GNUNET_free (path);
+      GNUNET_free (cp);
       return GNUNET_SYSERR;
     }
     *order_id = '\0';
     ++order_id;
-
-    ssid = strchr (last_seg,
-                   '#');
-    if (NULL != ssid)
-    {
-      *ssid = '\0';
-      ++ssid;
-    }
-
     if (0 != strlen (last_seg))
     {
       GNUNET_break_op (0);
-      GNUNET_free (path);
+      GNUNET_free (cp);
       return GNUNET_SYSERR;
     }
 
-    mpp = strchr (path,
-                  '/');
-    if (NULL != mpp)
     {
-      *mpp = '\0';
-      ++mpp;
-    }
+      char *mpp;
 
-    parse_data->merchant_host = GNUNET_strdup (path);
-    parse_data->merchant_prefix_path =
-      (NULL == mpp) ? NULL : GNUNET_strdup (mpp);
+      mpp = strchr (u.path,
+                    '/');
+      if (NULL != mpp)
+      {
+        *mpp = '\0';
+        ++mpp;
+      }
+
+      parse_data->merchant_prefix_path
+        = (NULL == mpp)
+          ? NULL
+          : GNUNET_strdup (mpp);
+    }
+    parse_data->merchant_host = GNUNET_strdup (u.path);
     parse_data->order_id = GNUNET_strdup (order_id);
-    parse_data->ssid =
-      (NULL == ssid) ? NULL : GNUNET_strdup (ssid);
+    parse_data->ssid
+      = (NULL == u.fragment)
+        ? NULL
+        : GNUNET_strdup (u.fragment);
   }
-  GNUNET_free (path);
+  GNUNET_free (cp);
   return GNUNET_OK;
 }
 

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