gnunet-svn
[Top][All Lists]
Advanced

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

[taler-exchange] branch master updated: fix #8465


From: gnunet
Subject: [taler-exchange] branch master updated: fix #8465
Date: Wed, 21 Feb 2024 20:53:25 +0100

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

grothoff pushed a commit to branch master
in repository exchange.

The following commit(s) were added to refs/heads/master by this push:
     new f27484a6 fix #8465
f27484a6 is described below

commit f27484a6c21a9e02278cf8560aae56b51c0da668
Author: Christian Grothoff <christian@grothoff.org>
AuthorDate: Wed Feb 21 20:53:22 2024 +0100

    fix #8465
---
 src/util/payto.c      | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 src/util/test_payto.c | 27 +++++++++++++++++
 2 files changed, 106 insertions(+), 1 deletion(-)

diff --git a/src/util/payto.c b/src/util/payto.c
index 21889377..4670e35f 100644
--- a/src/util/payto.c
+++ b/src/util/payto.c
@@ -155,7 +155,6 @@ validate_payto_iban (const char *account_url)
                         IBAN_PREFIX,
                         strlen (IBAN_PREFIX)))
     return NULL; /* not an IBAN */
-
   iban = strrchr (account_url, '/') + 1;
 #undef IBAN_PREFIX
   q = strchr (iban,
@@ -189,6 +188,83 @@ validate_payto_iban (const char *account_url)
 }
 
 
+/**
+ * Validate payto://x-taler-bank/ account URL (only account information,
+ * wire subject and amount are ignored).
+ *
+ * @param account_url payto URL to parse
+ * @return NULL on success, otherwise an error message
+ *      to be freed by the caller
+ */
+static char *
+validate_payto_xtalerbank (const char *account_url)
+{
+  const char *user;
+  const char *host;
+  bool dot_ok;
+
+#define XTALERBANK_PREFIX "payto://x-taler-bank/"
+  if (0 != strncasecmp (account_url,
+                        XTALERBANK_PREFIX,
+                        strlen (XTALERBANK_PREFIX)))
+    return NULL; /* not an IBAN */
+  host = &account_url[strlen (XTALERBANK_PREFIX)];
+#undef XTALERBANK_PREFIX
+  user = strchr (host, '/');
+  if (NULL == user)
+  {
+    return GNUNET_strdup ("account name missing");
+  }
+  if (user == host)
+  {
+    return GNUNET_strdup ("domain name missing");
+  }
+  if ('-' == host[0])
+    return GNUNET_strdup ("invalid character '-' at start of domain name");
+  if (NULL != strchr (user + 1, '/'))
+    return GNUNET_strdup ("invalid character '/' after account name");
+  dot_ok = false;
+  while (host != user)
+  {
+    char c = host[0];
+
+    if ('.' == c)
+    {
+      if (! dot_ok)
+        return GNUNET_strdup ("invalid domain name (misplaced '.')");
+      dot_ok = false;
+    }
+    else
+    {
+      if (! ( ('-' == c) ||
+              ( ('0' <= c) && ('9' >= c) ) ||
+              ( ('a' <= c) && ('z' >= c) ) ||
+              ( ('A' <= c) && ('Z' >= c) ) ) )
+      {
+        char *err;
+
+        GNUNET_asprintf (&err,
+                         "invalid character '%c' in domain name",
+                         c);
+        return err;
+      }
+      dot_ok = true;
+    }
+    host++;
+  }
+  {
+    char *target;
+
+    target = payto_get_key (account_url,
+                            "receiver-name=");
+    if (NULL == target)
+      return GNUNET_strdup ("'receiver-name' parameter missing");
+    GNUNET_free (target);
+  }
+  return NULL;
+}
+
+
 char *
 TALER_payto_validate (const char *payto_uri)
 {
@@ -229,6 +305,8 @@ TALER_payto_validate (const char *payto_uri)
 
   if (NULL != (ret = validate_payto_iban (payto_uri)))
     return ret; /* got a definitive answer */
+  if (NULL != (ret = validate_payto_xtalerbank (payto_uri)))
+    return ret; /* got a definitive answer */
 
   /* Insert other bank account validation methods here later! */
 
diff --git a/src/util/test_payto.c b/src/util/test_payto.c
index 4dc73a96..b37a6f72 100644
--- a/src/util/test_payto.c
+++ b/src/util/test_payto.c
@@ -50,6 +50,33 @@ main (int argc,
                  TALER_iban_validate ("FR1420041010050500013M02606"));
   GNUNET_assert (NULL ==
                  TALER_iban_validate ("DE89370400440532013000"));
+  r = TALER_payto_validate (
+    "payto://x-taler-bank/hostname/username?receiver-name=foo");
+  GNUNET_assert (NULL == r);
+  r = TALER_payto_validate (
+    "payto://x-taler-bank/https://hostname/username?receiver-name=foo";);
+  GNUNET_assert (NULL != r);
+  GNUNET_free (r);
+  r = TALER_payto_validate (
+    "payto://x-taler-bank/hostname/username/extra?receiver-name=foo");
+  GNUNET_assert (NULL != r);
+  GNUNET_free (r);
+  r = TALER_payto_validate (
+    "payto://x-taler-bank/-hostname/username?receiver-name=foo");
+  GNUNET_assert (NULL != r);
+  GNUNET_free (r);
+  r = TALER_payto_validate (
+    "payto://x-taler-bank/domain..name/username?receiver-name=foo");
+  GNUNET_assert (NULL != r);
+  GNUNET_free (r);
+  r = TALER_payto_validate (
+    "payto://x-taler-bank/domain..name/?receiver-name=foo");
+  GNUNET_assert (NULL != r);
+  GNUNET_free (r);
+  r = TALER_payto_validate (
+    "payto://x-taler-bank/domain.name/username");
+  GNUNET_assert (NULL != r);
+  GNUNET_free (r);
   r = TALER_xtalerbank_account_from_payto (
     "payto://x-taler-bank/localhost:1080/alice");
   CHECK ("alice",

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