gnunet-svn
[Top][All Lists]
Advanced

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

[taler-merchant] branch master updated: implement parse refund uri (unte


From: gnunet
Subject: [taler-merchant] branch master updated: implement parse refund uri (untested) & add more tests for pay uri
Date: Mon, 10 Aug 2020 22:11:11 +0200

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

jonathan-buchanan pushed a commit to branch master
in repository merchant.

The following commit(s) were added to refs/heads/master by this push:
     new 280bbb5  implement parse refund uri (untested) & add more tests for 
pay uri
280bbb5 is described below

commit 280bbb526c245ac69762e989816cb4c4848cd22c
Author: Jonathan Buchanan <jonathan.russ.buchanan@gmail.com>
AuthorDate: Mon Aug 10 16:10:52 2020 -0400

    implement parse refund uri (untested) & add more tests for pay uri
---
 src/include/taler_merchant_service.h             |  54 +++++++--
 src/lib/merchant_api_common.c                    | 134 ++++++++++++++++++-----
 src/testing/testing_api_cmd_merchant_get_order.c |  40 ++++++-
 src/testing/testing_api_cmd_wallet_get_order.c   |  61 +++++++++++
 4 files changed, 251 insertions(+), 38 deletions(-)

diff --git a/src/include/taler_merchant_service.h 
b/src/include/taler_merchant_service.h
index b33941a..17d0f16 100644
--- a/src/include/taler_merchant_service.h
+++ b/src/include/taler_merchant_service.h
@@ -196,23 +196,55 @@ TALER_MERCHANT_parse_pay_uri_free (
   struct TALER_MERCHANT_PayUriData *parse_data);
 
 
+/**
+ * Contains information gathered from parsing a taler://refund URI.
+ */
+struct TALER_MERCHANT_RefundUriData
+{
+  /**
+   * Hostname (and possibly port) of the merchant.
+   */
+  char *merchant_host;
+
+  /**
+   * Prefix to the base url of the merchant backend. May be NULL.
+   */
+  char *merchant_prefix_path;
+
+  /**
+   * The id of the order to pay.
+   */
+  char *order_id;
+
+  /**
+   * A WLAN SSID that the wallet can use to connect to the internet in order to
+   * to pay. May be NULL.
+   */
+  char *ssid;
+};
+
+
 /**
  * Extracts information from a taler://refund URI.
  *
  * @param refund_uri the URI to parse.
- * @param[out] merchant_host the hostname of the merchant.
- * @param[out] merchant_prefix_path prefix of the base URL
- *             (NULL if not present).
- * @param[out] order_id the id of the order to pay.
- * @param[out] ssid the ssid for internet connectivity (NULL if not present).
- * @return GNUNET_OK on success, GNUNET_SYSERR otherwise.
+ * @param[out] parse_data data extracted from the URI. Must be free'd.
+ * @return GNUNET_SYSERR if @e refund_uri is malformed, GNUNET_OK otherwise.
  */
 int
-TALER_MERCHANT_parse_refund_uri (const char *refund_uri,
-                                 const char **merchant_host,
-                                 const char **merchant_prefix_path,
-                                 const char **order_id,
-                                 const char **ssid);
+TALER_MERCHANT_parse_refund_uri (
+  const char *refund_uri,
+  struct TALER_MERCHANT_RefundUriData *parse_data);
+
+
+/**
+ * Frees data contained in the result of parsing a taler://refund URI.
+ *
+ * @param parse_data the data to free.
+ */
+void
+TALER_MERCHANT_parse_refund_uri_free (
+  struct TALER_MERCHANT_RefundUriData *parse_data);
 
 
 /* ********************* /public/config ****************** */
diff --git a/src/lib/merchant_api_common.c b/src/lib/merchant_api_common.c
index 9745f77..123ad5b 100644
--- a/src/lib/merchant_api_common.c
+++ b/src/lib/merchant_api_common.c
@@ -210,27 +210,6 @@ parse_taler_uri_scheme_action (const char *uri,
 }
 
 
-/**
- * Finds the last occurrence of @e c in the string @e str.
- *
- * @param str the string to search in.
- * @param c the character to search for.
- * @return pointer to the last occurrence of @e c in @e str, if it exists,
- *         otherwise NULL.
- */
-static char *
-strchr_last (char *str,
-             char c)
-{
-  for (size_t i = strlen (str) - 1; i >= 0; --i)
-  {
-    if (c == str[i])
-      return &str[i];
-  }
-  return NULL;
-}
-
-
 /**
  * Extracts information from a taler://pay URI.
  *
@@ -263,8 +242,8 @@ TALER_MERCHANT_parse_pay_uri (const char *pay_uri,
   {
     char *mpp;
     char *order_id;
-    char *session_id = strchr_last (path,
-                                    '/');
+    char *session_id = strrchr (path,
+                                '/');
     struct TALER_ClaimTokenP *claim_token = NULL;
     char *ssid;
 
@@ -276,8 +255,8 @@ TALER_MERCHANT_parse_pay_uri (const char *pay_uri,
     *session_id = '\0';
     ++session_id;
 
-    order_id = strchr_last (path,
-                            '/');
+    order_id = strrchr (path,
+                        '/');
     if (NULL == order_id)
     {
       GNUNET_free (path);
@@ -370,3 +349,108 @@ TALER_MERCHANT_parse_pay_uri_free (
   GNUNET_free (parse_data->claim_token);
   GNUNET_free (parse_data->ssid);
 }
+
+
+/**
+ * Extracts information from a taler://refund URI.
+ *
+ * @param refund_uri the URI to parse.
+ * @param[out] parse_data data extracted from the URI. Must be free'd.
+ * @return GNUNET_SYSERR if @e refund_uri is malformed, GNUNET_OK otherwise.
+ */
+int
+TALER_MERCHANT_parse_refund_uri (
+  const char *refund_uri,
+  struct TALER_MERCHANT_RefundUriData *parse_data)
+{
+  char *path;
+  {
+    char *action;
+
+    if ((GNUNET_OK !=
+         parse_taler_uri_scheme_action (refund_uri,
+                                        &action,
+                                        &path)) ||
+        (0 != strcmp ("refund",
+                      action)))
+    {
+      GNUNET_free (action);
+      GNUNET_free (path);
+      return GNUNET_SYSERR;
+    }
+    GNUNET_free (action);
+  }
+
+  {
+    char *mpp;
+    char *order_id;
+    char *last_seg = strrchr (path,
+                              '/');
+    char *ssid;
+
+    if (NULL == last_seg)
+    {
+      GNUNET_free (path);
+      return GNUNET_SYSERR;
+    }
+    *last_seg = '\0';
+    ++last_seg;
+
+    order_id = strrchr (path,
+                        '/');
+    if (NULL == order_id)
+    {
+      GNUNET_free (path);
+      return GNUNET_SYSERR;
+    }
+    *order_id = '\0';
+    ++order_id;
+
+    ssid = strchr (last_seg,
+                   '#');
+    if (NULL != ssid)
+    {
+      *ssid = '\0';
+      ++ssid;
+    }
+
+    if (0 != strlen (last_seg))
+    {
+      GNUNET_free (path);
+      return GNUNET_SYSERR;
+    }
+
+    mpp = strchr (path,
+                  '/');
+    if (NULL != mpp)
+    {
+      *mpp = '\0';
+      ++mpp;
+    }
+
+    parse_data->merchant_host = GNUNET_strdup (path);
+    parse_data->merchant_prefix_path =
+      (NULL == mpp) ? NULL : GNUNET_strdup (mpp);
+    parse_data->order_id = GNUNET_strdup (order_id);
+    parse_data->ssid =
+      (NULL == ssid) ? NULL : GNUNET_strdup (ssid);
+  }
+  GNUNET_free (path);
+  return GNUNET_OK;
+}
+
+
+/**
+ * Frees data contained in the result of parsing a taler://refund URI.
+ *
+ * @param parse_data the data to free.
+ */
+void
+TALER_MERCHANT_parse_refund_uri_free (
+  struct TALER_MERCHANT_RefundUriData *parse_data)
+{
+  GNUNET_free (parse_data->merchant_host);
+  GNUNET_free (parse_data->merchant_prefix_path);
+  GNUNET_free (parse_data->order_id);
+  GNUNET_free (parse_data->ssid);
+}
diff --git a/src/testing/testing_api_cmd_merchant_get_order.c 
b/src/testing/testing_api_cmd_merchant_get_order.c
index 1da6b7b..1fed93a 100644
--- a/src/testing/testing_api_cmd_merchant_get_order.c
+++ b/src/testing/testing_api_cmd_merchant_get_order.c
@@ -445,6 +445,10 @@ merchant_get_order_cb (
     {
       /* FIXME: Check all of the members of `pud` */
       struct TALER_MERCHANT_PayUriData pud;
+      const struct TALER_TESTING_Command *order_cmd;
+      const char *order_id;
+      const struct TALER_ClaimTokenP *claim_token;
+
       if (GNUNET_OK !=
           TALER_MERCHANT_parse_pay_uri (osr->details.unpaid.taler_pay_uri,
                                         &pud))
@@ -455,12 +459,44 @@ merchant_get_order_cb (
         return;
       }
 
+      order_cmd = TALER_TESTING_interpreter_lookup_command (
+        gos->is,
+        gos->order_reference);
+
+      if (GNUNET_OK !=
+          TALER_TESTING_get_trait_order_id (order_cmd,
+                                            0,
+                                            &order_id))
+        TALER_TESTING_FAIL (gos->is);
+
+      if (GNUNET_OK !=
+          TALER_TESTING_get_trait_claim_token (order_cmd,
+                                               0,
+                                               &claim_token))
+        TALER_TESTING_FAIL (gos->is);
+
       if ((0 != strcmp ("localhost:8080",
                         pud.merchant_host)) ||
-          (NULL != pud.merchant_prefix_path))
+          (NULL != pud.merchant_prefix_path) ||
+          (0 != strcmp (order_id,
+                        pud.order_id)) ||
+          (NULL != pud.ssid))
+      {
+        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                    "Order pay uri does not match\n");
+        TALER_TESTING_interpreter_fail (gos->is);
+        TALER_MERCHANT_parse_pay_uri_free (&pud);
+        return;
+      }
+      /* The claim token is not given in the pay uri if the order
+         has been claimed already. */
+      if ((NULL != pud.claim_token) &&
+          ((NULL == claim_token) ||
+           (0 != GNUNET_memcmp (claim_token,
+                                pud.claim_token))))
       {
         GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                    "Taler pay uri is incorrect\n");
+                    "Order pay uri does not match\n");
         TALER_TESTING_interpreter_fail (gos->is);
         TALER_MERCHANT_parse_pay_uri_free (&pud);
         return;
diff --git a/src/testing/testing_api_cmd_wallet_get_order.c 
b/src/testing/testing_api_cmd_wallet_get_order.c
index 86072f4..76d620f 100644
--- a/src/testing/testing_api_cmd_wallet_get_order.c
+++ b/src/testing/testing_api_cmd_wallet_get_order.c
@@ -190,6 +190,67 @@ wallet_get_order_cb (
         return;
       }
     }
+    if (!paid_b)
+    {
+      /* FIXME: Check all of the members of `pud` */
+      struct TALER_MERCHANT_PayUriData pud;
+      const struct TALER_TESTING_Command *order_cmd;
+      const char *order_id;
+      const struct TALER_ClaimTokenP *claim_token;
+
+      if (GNUNET_OK !=
+          TALER_MERCHANT_parse_pay_uri (taler_pay_uri,
+                                        &pud))
+      {
+        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                    "Taler pay uri is malformed\n");
+        TALER_TESTING_interpreter_fail (gos->is);
+        return;
+      }
+
+      order_cmd = TALER_TESTING_interpreter_lookup_command (
+        gos->is,
+        gos->order_reference);
+
+      if (GNUNET_OK !=
+          TALER_TESTING_get_trait_order_id (order_cmd,
+                                            0,
+                                            &order_id))
+        TALER_TESTING_FAIL (gos->is);
+
+      if (GNUNET_OK !=
+          TALER_TESTING_get_trait_claim_token (order_cmd,
+                                               0,
+                                               &claim_token))
+        TALER_TESTING_FAIL (gos->is);
+
+      if ((0 != strcmp ("localhost:8080",
+                        pud.merchant_host)) ||
+          (NULL != pud.merchant_prefix_path) ||
+          (0 != strcmp (order_id,
+                        pud.order_id)) ||
+          (NULL != pud.ssid))
+      {
+        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                    "Order pay uri does not match\n");
+        TALER_TESTING_interpreter_fail (gos->is);
+        TALER_MERCHANT_parse_pay_uri_free (&pud);
+        return;
+      }
+      /* The claim token is not given in the pay uri if the order
+         has been claimed already. */
+      if ((NULL != pud.claim_token) &&
+          ((NULL == claim_token) ||
+           (0 != GNUNET_memcmp (claim_token,
+                                pud.claim_token))))
+      {
+        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                    "Order pay uri does not match\n");
+        TALER_TESTING_interpreter_fail (gos->is);
+        TALER_MERCHANT_parse_pay_uri_free (&pud);
+        return;
+      }
+    }
     break;
   default:
     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,

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