summaryrefslogtreecommitdiff
path: root/src/lib/merchant_api_merchant_get_order.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/merchant_api_merchant_get_order.c')
-rw-r--r--src/lib/merchant_api_merchant_get_order.c335
1 files changed, 149 insertions, 186 deletions
diff --git a/src/lib/merchant_api_merchant_get_order.c b/src/lib/merchant_api_merchant_get_order.c
index 0e6b53bf..3bd4003b 100644
--- a/src/lib/merchant_api_merchant_get_order.c
+++ b/src/lib/merchant_api_merchant_get_order.c
@@ -34,6 +34,17 @@
/**
+ * Maximum number of refund details we return.
+ */
+#define MAX_REFUND_DETAILS 1024
+
+/**
+ * Maximum number of wire details we return.
+ */
+#define MAX_WIRE_DETAILS 1024
+
+
+/**
* @brief A GET /private/orders/$ORDER handle
*/
struct TALER_MERCHANT_OrderMerchantGetHandle
@@ -81,21 +92,21 @@ handle_unpaid (struct TALER_MERCHANT_OrderMerchantGetHandle *omgh,
struct GNUNET_JSON_Specification spec[] = {
TALER_JSON_spec_amount_any (
"total_amount",
- &osr->details.success.details.unpaid.contract_amount),
+ &osr->details.ok.details.unpaid.contract_amount),
GNUNET_JSON_spec_mark_optional (
GNUNET_JSON_spec_string (
"already_paid_order_id",
- &osr->details.success.details.unpaid.already_paid_order_id),
+ &osr->details.ok.details.unpaid.already_paid_order_id),
NULL),
GNUNET_JSON_spec_string (
"taler_pay_uri",
- &osr->details.success.details.unpaid.taler_pay_uri),
+ &osr->details.ok.details.unpaid.taler_pay_uri),
GNUNET_JSON_spec_string (
"summary",
- &osr->details.success.details.unpaid.summary),
+ &osr->details.ok.details.unpaid.summary),
GNUNET_JSON_spec_timestamp (
"creation_time",
- &osr->details.success.details.unpaid.creation_time),
+ &osr->details.ok.details.unpaid.creation_time),
GNUNET_JSON_spec_end ()
};
@@ -111,7 +122,7 @@ handle_unpaid (struct TALER_MERCHANT_OrderMerchantGetHandle *omgh,
osr);
return;
}
- osr->details.success.status = TALER_MERCHANT_OSC_UNPAID;
+ osr->details.ok.status = TALER_MERCHANT_OSC_UNPAID;
omgh->cb (omgh->cb_cls,
osr);
}
@@ -130,9 +141,9 @@ handle_claimed (struct TALER_MERCHANT_OrderMerchantGetHandle *omgh,
struct TALER_MERCHANT_OrderStatusResponse *osr)
{
struct GNUNET_JSON_Specification spec[] = {
- GNUNET_JSON_spec_json ("contract_terms",
- (json_t **) &osr->details.success.details.claimed.
- contract_terms),
+ GNUNET_JSON_spec_object_const (
+ "contract_terms",
+ &osr->details.ok.details.claimed.contract_terms),
GNUNET_JSON_spec_end ()
};
@@ -148,10 +159,9 @@ handle_claimed (struct TALER_MERCHANT_OrderMerchantGetHandle *omgh,
osr);
return;
}
- osr->details.success.status = TALER_MERCHANT_OSC_CLAIMED;
+ osr->details.ok.status = TALER_MERCHANT_OSC_CLAIMED;
omgh->cb (omgh->cb_cls,
osr);
- GNUNET_JSON_parse_free (spec);
}
@@ -167,35 +177,36 @@ static void
handle_paid (struct TALER_MERCHANT_OrderMerchantGetHandle *omgh,
struct TALER_MERCHANT_OrderStatusResponse *osr)
{
- uint32_t ec32;
uint32_t hc32;
- json_t *wire_details;
- json_t *wire_reports;
- json_t *refund_details;
+ const json_t *wire_details;
+ const json_t *refund_details;
struct GNUNET_JSON_Specification spec[] = {
GNUNET_JSON_spec_bool ("refunded",
- &osr->details.success.details.paid.refunded),
+ &osr->details.ok.details.paid.refunded),
GNUNET_JSON_spec_bool ("refund_pending",
- &osr->details.success.details.paid.refund_pending),
+ &osr->details.ok.details.paid.refund_pending),
GNUNET_JSON_spec_bool ("wired",
- &osr->details.success.details.paid.wired),
+ &osr->details.ok.details.paid.wired),
TALER_JSON_spec_amount_any ("deposit_total",
- &osr->details.success.details.paid.deposit_total),
- GNUNET_JSON_spec_uint32 ("exchange_code",
- &ec32),
+ &osr->details.ok.details.paid.deposit_total),
+ TALER_JSON_spec_ec ("exchange_code",
+ &osr->details.ok.details.paid.exchange_ec),
GNUNET_JSON_spec_uint32 ("exchange_http_status",
&hc32),
TALER_JSON_spec_amount_any ("refund_amount",
- &osr->details.success.details.paid.refund_amount),
- GNUNET_JSON_spec_json (
+ &osr->details.ok.details.paid.refund_amount),
+ GNUNET_JSON_spec_object_const (
"contract_terms",
- (json_t **) &osr->details.success.details.paid.contract_terms),
- GNUNET_JSON_spec_json ("wire_details",
- &wire_details),
- GNUNET_JSON_spec_json ("wire_reports",
- &wire_reports),
- GNUNET_JSON_spec_json ("refund_details",
- &refund_details),
+ &osr->details.ok.details.paid.contract_terms),
+ GNUNET_JSON_spec_array_const ("wire_details",
+ &wire_details),
+ GNUNET_JSON_spec_array_const ("refund_details",
+ &refund_details),
+ /* Only available since **v14** */
+ GNUNET_JSON_spec_mark_optional (
+ GNUNET_JSON_spec_timestamp ("last_payment",
+ &osr->details.ok.details.paid.last_payment),
+ NULL),
GNUNET_JSON_spec_end ()
};
@@ -211,143 +222,107 @@ handle_paid (struct TALER_MERCHANT_OrderMerchantGetHandle *omgh,
osr);
return;
}
- if (! (json_is_array (wire_details) &&
- json_is_array (wire_reports) &&
- json_is_array (refund_details) &&
- json_is_object (osr->details.success.details.paid.contract_terms)) )
- {
- GNUNET_break_op (0);
- osr->hr.http_status = 0;
- osr->hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
- omgh->cb (omgh->cb_cls,
- osr);
- GNUNET_JSON_parse_free (spec);
- return;
- }
- osr->details.success.status = TALER_MERCHANT_OSC_PAID;
- osr->details.success.details.paid.exchange_ec = (enum TALER_ErrorCode) ec32;
- osr->details.success.details.paid.exchange_hc = (unsigned int) hc32;
+ osr->details.ok.status = TALER_MERCHANT_OSC_PAID;
+
+ osr->details.ok.details.paid.exchange_hc = (unsigned int) hc32;
{
- unsigned int wts_len = json_array_size (wire_details);
- unsigned int wrs_len = json_array_size (wire_reports);
- unsigned int ref_len = json_array_size (refund_details);
- struct TALER_MERCHANT_WireTransfer wts[wts_len];
- struct TALER_MERCHANT_WireReport wrs[wrs_len];
- struct TALER_MERCHANT_RefundOrderDetail ref[ref_len];
-
- for (unsigned int i = 0; i<wts_len; i++)
+ unsigned int wts_len = (unsigned int) json_array_size (wire_details);
+ unsigned int ref_len = (unsigned int) json_array_size (refund_details);
+
+ if ( (json_array_size (wire_details) != (size_t) wts_len) ||
+ (wts_len > MAX_WIRE_DETAILS) )
{
- struct TALER_MERCHANT_WireTransfer *wt = &wts[i];
- const json_t *w = json_array_get (wire_details,
- i);
- struct GNUNET_JSON_Specification ispec[] = {
- GNUNET_JSON_spec_string ("exchange_url",
- &wt->exchange_url),
- GNUNET_JSON_spec_fixed_auto ("wtid",
- &wt->wtid),
- GNUNET_JSON_spec_timestamp ("execution_time",
- &wt->execution_time),
- TALER_JSON_spec_amount_any ("amount",
- &wt->total_amount),
- GNUNET_JSON_spec_bool ("confirmed",
- &wt->confirmed),
- GNUNET_JSON_spec_end ()
- };
-
- if (GNUNET_OK !=
- GNUNET_JSON_parse (w,
- ispec,
- NULL, NULL))
- {
- GNUNET_break_op (0);
- osr->hr.http_status = 0;
- osr->hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
- omgh->cb (omgh->cb_cls,
- osr);
- GNUNET_JSON_parse_free (spec);
- return;
- }
+ GNUNET_break (0);
+ osr->hr.http_status = 0;
+ osr->hr.ec = TALER_EC_GENERIC_ALLOCATION_FAILURE;
+ omgh->cb (omgh->cb_cls,
+ osr);
+ return;
+ }
+ if ( (json_array_size (refund_details) != (size_t) ref_len) ||
+ (ref_len > MAX_REFUND_DETAILS) )
+ {
+ GNUNET_break (0);
+ osr->hr.http_status = 0;
+ osr->hr.ec = TALER_EC_GENERIC_ALLOCATION_FAILURE;
+ omgh->cb (omgh->cb_cls,
+ osr);
+ return;
}
-
- for (unsigned int i = 0; i<wrs_len; i++)
{
- struct TALER_MERCHANT_WireReport *wr = &wrs[i];
- const json_t *w = json_array_get (wire_reports, i);
- uint32_t c32;
- uint32_t eec32;
- uint32_t ehs32;
- struct GNUNET_JSON_Specification ispec[] = {
- GNUNET_JSON_spec_uint32 ("code",
- &c32),
- GNUNET_JSON_spec_string ("hint",
- &wr->hint),
- GNUNET_JSON_spec_uint32 ("exchange_code",
- &eec32),
- GNUNET_JSON_spec_uint32 ("exchange_http_status",
- &ehs32),
- GNUNET_JSON_spec_fixed_auto ("coin_pub",
- &wr->coin_pub),
- GNUNET_JSON_spec_end ()
- };
-
- if (GNUNET_OK !=
- GNUNET_JSON_parse (w,
- ispec,
- NULL, NULL))
+ struct TALER_MERCHANT_WireTransfer wts[GNUNET_NZL (wts_len)];
+ struct TALER_MERCHANT_RefundOrderDetail ref[GNUNET_NZL (ref_len)];
+
+ for (unsigned int i = 0; i<wts_len; i++)
{
- GNUNET_break_op (0);
- osr->hr.http_status = 0;
- osr->hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
- omgh->cb (omgh->cb_cls,
- osr);
- GNUNET_JSON_parse_free (spec);
- return;
+ struct TALER_MERCHANT_WireTransfer *wt = &wts[i];
+ const json_t *w = json_array_get (wire_details,
+ i);
+ struct GNUNET_JSON_Specification ispec[] = {
+ TALER_JSON_spec_web_url ("exchange_url",
+ &wt->exchange_url),
+ GNUNET_JSON_spec_fixed_auto ("wtid",
+ &wt->wtid),
+ GNUNET_JSON_spec_timestamp ("execution_time",
+ &wt->execution_time),
+ TALER_JSON_spec_amount_any ("amount",
+ &wt->total_amount),
+ GNUNET_JSON_spec_bool ("confirmed",
+ &wt->confirmed),
+ GNUNET_JSON_spec_end ()
+ };
+
+ if (GNUNET_OK !=
+ GNUNET_JSON_parse (w,
+ ispec,
+ NULL, NULL))
+ {
+ GNUNET_break_op (0);
+ osr->hr.http_status = 0;
+ osr->hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
+ omgh->cb (omgh->cb_cls,
+ osr);
+ return;
+ }
}
- wr->code = (enum TALER_ErrorCode) c32;
- wr->hr.ec = (enum TALER_ErrorCode) eec32;
- wr->hr.http_status = (unsigned int) ehs32;
- }
- for (unsigned int i = 0; i<ref_len; i++)
- {
- struct TALER_MERCHANT_RefundOrderDetail *ro = &ref[i];
- const json_t *w = json_array_get (refund_details,
- i);
- struct GNUNET_JSON_Specification ispec[] = {
- TALER_JSON_spec_amount_any ("amount",
- &ro->refund_amount),
- GNUNET_JSON_spec_string ("reason",
- &ro->reason),
- GNUNET_JSON_spec_timestamp ("timestamp",
- &ro->refund_time),
- GNUNET_JSON_spec_end ()
- };
-
- if (GNUNET_OK !=
- GNUNET_JSON_parse (w,
- ispec,
- NULL, NULL))
+ for (unsigned int i = 0; i<ref_len; i++)
{
- GNUNET_break_op (0);
- osr->hr.http_status = 0;
- osr->hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
- omgh->cb (omgh->cb_cls,
- osr);
- GNUNET_JSON_parse_free (spec);
- return;
+ struct TALER_MERCHANT_RefundOrderDetail *ro = &ref[i];
+ const json_t *w = json_array_get (refund_details,
+ i);
+ struct GNUNET_JSON_Specification ispec[] = {
+ TALER_JSON_spec_amount_any ("amount",
+ &ro->refund_amount),
+ GNUNET_JSON_spec_string ("reason",
+ &ro->reason),
+ GNUNET_JSON_spec_timestamp ("timestamp",
+ &ro->refund_time),
+ GNUNET_JSON_spec_end ()
+ };
+
+ if (GNUNET_OK !=
+ GNUNET_JSON_parse (w,
+ ispec,
+ NULL, NULL))
+ {
+ GNUNET_break_op (0);
+ osr->hr.http_status = 0;
+ osr->hr.ec = TALER_EC_GENERIC_REPLY_MALFORMED;
+ omgh->cb (omgh->cb_cls,
+ osr);
+ return;
+ }
}
- }
- osr->details.success.details.paid.wts = wts;
- osr->details.success.details.paid.wts_len = wts_len;
- osr->details.success.details.paid.wrs = wrs;
- osr->details.success.details.paid.wrs_len = wrs_len;
- osr->details.success.details.paid.refunds = ref;
- osr->details.success.details.paid.refunds_len = ref_len;
- omgh->cb (omgh->cb_cls,
- osr);
+ osr->details.ok.details.paid.wts = wts;
+ osr->details.ok.details.paid.wts_len = wts_len;
+ osr->details.ok.details.paid.refunds = ref;
+ osr->details.ok.details.paid.refunds_len = ref_len;
+ omgh->cb (omgh->cb_cls,
+ osr);
+ }
}
- GNUNET_JSON_parse_free (spec);
}
@@ -464,27 +439,20 @@ handle_merchant_order_get_finished (void *cls,
struct TALER_MERCHANT_OrderMerchantGetHandle *
-TALER_MERCHANT_merchant_order_get (struct GNUNET_CURL_Context *ctx,
- const char *backend_url,
- const char *order_id,
- const char *session_id,
- bool transfer,
- struct GNUNET_TIME_Relative timeout,
- TALER_MERCHANT_OrderMerchantGetCallback cb,
- void *cb_cls)
+TALER_MERCHANT_merchant_order_get (
+ struct GNUNET_CURL_Context *ctx,
+ const char *backend_url,
+ const char *order_id,
+ const char *session_id,
+ struct GNUNET_TIME_Relative timeout,
+ TALER_MERCHANT_OrderMerchantGetCallback cb,
+ void *cb_cls)
{
struct TALER_MERCHANT_OrderMerchantGetHandle *omgh;
- unsigned long long tms;
- long tlong;
-
- tms = (unsigned long long) (timeout.rel_value_us
- / GNUNET_TIME_UNIT_MILLISECONDS.rel_value_us);
- /* set curl timeout to *our* long poll timeout plus one minute
- (for network latency and processing delays) */
- tlong = (long) (GNUNET_TIME_relative_add (timeout,
- GNUNET_TIME_UNIT_MINUTES).
- rel_value_us
- / GNUNET_TIME_UNIT_MILLISECONDS.rel_value_us);
+ unsigned int tms;
+
+ tms = (unsigned int) (timeout.rel_value_us
+ / GNUNET_TIME_UNIT_MILLISECONDS.rel_value_us);
omgh = GNUNET_new (struct TALER_MERCHANT_OrderMerchantGetHandle);
omgh->ctx = ctx;
omgh->cb = cb;
@@ -495,7 +463,7 @@ TALER_MERCHANT_merchant_order_get (struct GNUNET_CURL_Context *ctx,
GNUNET_snprintf (timeout_ms,
sizeof (timeout_ms),
- "%llu",
+ "%u",
tms);
GNUNET_asprintf (&path,
"private/orders/%s",
@@ -503,7 +471,6 @@ TALER_MERCHANT_merchant_order_get (struct GNUNET_CURL_Context *ctx,
omgh->url = TALER_url_join (backend_url,
path,
"session_id", session_id,
- "transfer", transfer ? "YES" : "NO",
"timeout_ms", (0 != tms) ? timeout_ms : NULL,
NULL);
GNUNET_free (path);
@@ -527,16 +494,12 @@ TALER_MERCHANT_merchant_order_get (struct GNUNET_CURL_Context *ctx,
GNUNET_free (omgh);
return NULL;
}
- if (CURLE_OK !=
- curl_easy_setopt (eh,
- CURLOPT_TIMEOUT_MS,
- tlong))
+ if (0 != tms)
{
- GNUNET_break (0);
- curl_easy_cleanup (eh);
- GNUNET_free (omgh->url);
- GNUNET_free (omgh);
- return NULL;
+ GNUNET_break (CURLE_OK ==
+ curl_easy_setopt (eh,
+ CURLOPT_TIMEOUT_MS,
+ (long) (tms + 100L)));
}
GNUNET_log (GNUNET_ERROR_TYPE_INFO,