diff options
author | Christian Grothoff <christian@grothoff.org> | 2020-01-14 23:54:43 +0100 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2020-01-14 23:54:43 +0100 |
commit | 1d9049ab9963b69a6716943109ec0a7458135d1a (patch) | |
tree | 086df02d8bf9fa707f0cd5c36b22c094c84ce5f7 | |
parent | 2edee5ac4a4886e71db6e28314334cd24c6d3a55 (diff) |
add payto URL test, fix payto parser implementation
m--------- | doc/prebuilt | 0 | ||||
-rw-r--r-- | src/util/.gitignore | 1 | ||||
-rw-r--r-- | src/util/test_payto.c | 44 | ||||
-rw-r--r-- | src/util/util.c | 89 |
4 files changed, 114 insertions, 20 deletions
diff --git a/doc/prebuilt b/doc/prebuilt -Subproject ca53235ccfa0458ebf11c204888ca370e20ec3f +Subproject 934a6a18301e81c4fd1b3a8cda2dc13dca4741c diff --git a/src/util/.gitignore b/src/util/.gitignore index ec61c9e0c..648b4b116 100644 --- a/src/util/.gitignore +++ b/src/util/.gitignore @@ -1 +1,2 @@ taler-config +test_payto diff --git a/src/util/test_payto.c b/src/util/test_payto.c index 80bf652e0..f966e046f 100644 --- a/src/util/test_payto.c +++ b/src/util/test_payto.c @@ -21,13 +21,55 @@ #include "platform.h" #include "taler_util.h" +#define CHECK(a,b) do { \ + if (0 != strcmp (a,b)) { \ + GNUNET_break (0); \ + fprintf (stderr, "Got %s, wanted %s\n", b, a); \ + GNUNET_free (b); \ + return 1; \ + } else { \ + GNUNET_free (b); \ + } \ +} while (0) + int main (int argc, const char *const argv[]) { + char *r; - + GNUNET_log_setup ("test-payto", + "WARNING", + NULL); + r = TALER_payto_xtalerbank_make ("https://localhost/", + "account"); + CHECK ("payto://x-taler-bank/localhost/account", + r); + r = TALER_payto_xtalerbank_make ("http://localhost:80/", + "account"); + CHECK ("payto://x-taler-bank/localhost:80/account", + r); + r = TALER_payto_xtalerbank_make ("http://localhost/", + "account"); + CHECK ("payto://x-taler-bank/localhost:80/account", + r); + r = TALER_xtalerbank_base_url_from_payto ( + "payto://x-taler-bank/localhost/bob"); + CHECK ("https://localhost/", + r); + r = TALER_xtalerbank_base_url_from_payto ( + "payto://x-taler-bank/localhost:1080/bob"); + CHECK ("http://localhost:1080/", + r); + r = TALER_xtalerbank_account_url_from_payto ( + "payto://x-taler-bank/localhost/bob"); + CHECK ("https://localhost/bob", + r); + r = TALER_xtalerbank_account_url_from_payto ( + "payto://x-taler-bank/localhost:1080/alice"); + CHECK ("http://localhost:1080/alice", + r); return 0; } diff --git a/src/util/util.c b/src/util/util.c index 62f733a17..5a06a1229 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -789,16 +789,38 @@ TALER_payto_xtalerbank_make (const char *bank_url, const char *account_name) { char *payto; - int ends_slash; + int plaintext; + const char *port; + size_t slen; - if (0 < strlen (bank_url)) - ends_slash = '/' == bank_url[strlen (bank_url) - 1]; + if (0 == strncasecmp ("https://", + bank_url, + strlen ("https://"))) + { + bank_url += strlen ("https://"); + plaintext = GNUNET_NO; + } + else if (0 == strncasecmp ("http://", + bank_url, + strlen ("http://"))) + { + bank_url += strlen ("http://"); + plaintext = GNUNET_YES; + } else - ends_slash = 0; + return NULL; + slen = strlen (bank_url); + port = memchr (bank_url, + ':', + slen); + if ( (0 < slen) && + ('/' == bank_url[slen - 1]) ) + slen--; GNUNET_asprintf (&payto, - (ends_slash) - ? "payto://x-taler-bank/%s%s" - : "payto://x-taler-bank/%s/%s", + ( (NULL == port) && (GNUNET_YES == plaintext) ) + ? "payto://x-taler-bank/%.*s:80/%s" + : "payto://x-taler-bank/%.*s/%s", + (int) slen, bank_url, account_name); return payto; @@ -817,20 +839,35 @@ TALER_xtalerbank_base_url_from_payto (const char *payto) { const char *start; const char *end; + char *ret; + int https; + const char *colon; + unsigned int port; if (0 != strncasecmp (payto, "payto://x-taler-bank/", strlen ("payto://x-taler-bank/"))) - { return NULL; - } - start = &payto [strlen ("payto://x-taler-bank/")]; + start = &payto[strlen ("payto://x-taler-bank/")]; end = strchr (start, - (unsigned char) '/'); + '/'); if (NULL == end) end = &start[strlen (start)]; - return GNUNET_strndup (start, - end - start); + colon = strrchr (start, + ':'); + https = GNUNET_YES; + if ( (NULL != colon) && + (1 == sscanf (colon + 1, + "%u", + &port)) && + (443 != port) ) + https = GNUNET_NO; + GNUNET_asprintf (&ret, + "%s://%.*s/", + (https ? "https" : "http"), + (int) (end - start), + start); + return ret; } @@ -846,20 +883,34 @@ TALER_xtalerbank_account_url_from_payto (const char *payto) { const char *start; const char *end; + char *ret; + int https; + const char *colon; + unsigned int port; if (0 != strncasecmp (payto, "payto://x-taler-bank/", strlen ("payto://x-taler-bank/"))) - { return NULL; - } - start = &payto [strlen ("payto://x-taler-bank/")]; + start = &payto[strlen ("payto://x-taler-bank/")]; end = strchr (start, - (unsigned char) '?'); + '/'); if (NULL == end) end = &start[strlen (start)]; - return GNUNET_strndup (start, - end - start); + colon = strrchr (start, + ':'); + https = GNUNET_YES; + if ( (NULL != colon) && + (1 == sscanf (colon + 1, + "%u", + &port)) && + (443 != port) ) + https = GNUNET_NO; + GNUNET_asprintf (&ret, + "%s://%s", + (https ? "https" : "http"), + start); + return ret; } |