From 7c2de4c5e6b7b1184d059057e1d412d6f0133816 Mon Sep 17 00:00:00 2001 From: MS Date: Mon, 27 Jul 2020 12:48:48 +0200 Subject: payto parser: extract 'subject' parameter. --- src/include/taler_util.h | 9 +++++++++ src/util/payto.c | 39 +++++++++++++++++++++++++++++++++++++++ src/util/test_payto.c | 11 +++++++++++ 3 files changed, 59 insertions(+) diff --git a/src/include/taler_util.h b/src/include/taler_util.h index 22d7f7f2a..1d1c01eaf 100644 --- a/src/include/taler_util.h +++ b/src/include/taler_util.h @@ -297,6 +297,15 @@ TALER_payto_get_method (const char *payto_uri); char * TALER_xtalerbank_account_from_payto (const char *payto); +/** + * Extract the subject value from the URI parameters. + * + * @param payto_uri the URL to parse + * @return NULL if the subject parameter is not found. + * The caller should free the returned value. + */ +char * +TALER_payto_get_subject (const char *payto_uri); /** * Possible values for a binary filter. diff --git a/src/util/payto.c b/src/util/payto.c index 3540052c1..4b2bbf4e3 100644 --- a/src/util/payto.c +++ b/src/util/payto.c @@ -28,6 +28,45 @@ #define PAYTO "payto://" +/** + * Extract the subject value from the URI parameters. + * + * @param payto_uri the URL to parse + * @return NULL if the subject parameter is not found. + * The caller should free the returned value. + */ +char * +TALER_payto_get_subject (const char *payto_uri) +{ + const char *key; + const char *value_start; + const char *value_end; + + key = strchr (payto_uri, + (unsigned char) '?'); + if (NULL == key) + return NULL; + + do { + if (0 == strncasecmp (++key, + "subject", + strlen ("subject"))) + { + value_start = strchr (key, + (unsigned char) '='); + if (NULL == value_start) + return NULL; + value_end = strchrnul (value_start, + (unsigned char) '&'); + + return GNUNET_strndup (value_start + 1, + value_end - value_start - 1); + } + } while ( (key = strchr (key, + (unsigned char) '&')) ); + return NULL; +} + /** * Obtain the payment method from a @a payto_uri. The * format of a payto URI is 'payto://$METHOD/$SOMETHING'. diff --git a/src/util/test_payto.c b/src/util/test_payto.c index 7dc2eb142..c809a0396 100644 --- a/src/util/test_payto.c +++ b/src/util/test_payto.c @@ -22,6 +22,8 @@ #include "taler_util.h" #define CHECK(a,b) do { \ + GNUNET_assert (a != NULL); \ + GNUNET_assert (b != NULL); \ if (0 != strcmp (a,b)) { \ GNUNET_break (0); \ fprintf (stderr, "Got %s, wanted %s\n", b, a); \ @@ -52,6 +54,15 @@ main (int argc, "payto://x-taler-bank/localhost:1080/alice?subject=hello&amount=EUR:1"); CHECK ("alice", r); + + r = TALER_payto_get_subject ( + "payto://x-taler-bank/localhost:1080/alice?subject=hello&amount=EUR:1"); + CHECK ("hello", + r); + + r = TALER_payto_get_subject ( + "payto://x-taler-bank/localhost:1080/alice"); + GNUNET_assert (r == NULL); return 0; } -- cgit v1.2.3 From 680b671b298201809e89592f761e92c393757058 Mon Sep 17 00:00:00 2001 From: MS Date: Mon, 27 Jul 2020 12:57:47 +0200 Subject: Extend bank transfer tool. Find subject among payto parameters. --- src/bank-lib/taler-bank-transfer.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/bank-lib/taler-bank-transfer.c b/src/bank-lib/taler-bank-transfer.c index bc4ebcfbc..f3b393372 100644 --- a/src/bank-lib/taler-bank-transfer.c +++ b/src/bank-lib/taler-bank-transfer.c @@ -408,6 +408,10 @@ execute_wire_transfer () GNUNET_SCHEDULER_shutdown (); return; } + + // See if subject was given as a payto-parameter. + if (NULL == subject) + subject = TALER_payto_get_subject (credit_account); if (NULL != subject) { if (GNUNET_OK != -- cgit v1.2.3 From 6fd44ff2ea8f86655ac6450efd88da85b48211cf Mon Sep 17 00:00:00 2001 From: MS Date: Mon, 27 Jul 2020 14:03:11 +0200 Subject: fix segfault --- src/bank-lib/taler-bank-transfer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bank-lib/taler-bank-transfer.c b/src/bank-lib/taler-bank-transfer.c index f3b393372..9065122d5 100644 --- a/src/bank-lib/taler-bank-transfer.c +++ b/src/bank-lib/taler-bank-transfer.c @@ -132,7 +132,7 @@ do_shutdown (void *cls) TALER_BANK_debit_history_cancel (dhh); dhh = NULL; } - if (NULL != eh) + if ( (NULL != eh) && (0 != global_ret)) { TALER_BANK_transfer_cancel (eh); eh = NULL; -- cgit v1.2.3