summaryrefslogtreecommitdiff
path: root/src/lib/merchant_api_common.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2020-10-13 23:34:52 +0200
committerChristian Grothoff <christian@grothoff.org>2020-10-13 23:34:52 +0200
commit24dfb7588d70becba67851fedc7f9ec0308a6ffe (patch)
tree2dd1fc30a5418dc2fb2e553675639b406f6876ff /src/lib/merchant_api_common.c
parentaba023e2a9a419e3be8daf449498f1ab3d3fe687 (diff)
downloadmerchant-24dfb7588d70becba67851fedc7f9ec0308a6ffe.tar.gz
merchant-24dfb7588d70becba67851fedc7f9ec0308a6ffe.tar.bz2
merchant-24dfb7588d70becba67851fedc7f9ec0308a6ffe.zip
implement #6545
Diffstat (limited to 'src/lib/merchant_api_common.c')
-rw-r--r--src/lib/merchant_api_common.c284
1 files changed, 119 insertions, 165 deletions
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;
}