diff options
author | Christian Grothoff <christian@grothoff.org> | 2020-10-13 23:34:52 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2020-10-13 23:34:52 +0200 |
commit | 24dfb7588d70becba67851fedc7f9ec0308a6ffe (patch) | |
tree | 2dd1fc30a5418dc2fb2e553675639b406f6876ff /src | |
parent | aba023e2a9a419e3be8daf449498f1ab3d3fe687 (diff) | |
download | merchant-24dfb7588d70becba67851fedc7f9ec0308a6ffe.tar.gz merchant-24dfb7588d70becba67851fedc7f9ec0308a6ffe.tar.bz2 merchant-24dfb7588d70becba67851fedc7f9ec0308a6ffe.zip |
implement #6545
Diffstat (limited to 'src')
-rw-r--r-- | src/include/taler_merchant_service.h | 10 | ||||
-rw-r--r-- | 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 d68a6b12..e34226a0 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 255b498f..031e0f16 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; } |