diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/merchant_api_track_transaction.c | 16 | ||||
-rw-r--r-- | src/lib/merchant_api_track_transfer.c | 107 |
2 files changed, 96 insertions, 27 deletions
diff --git a/src/lib/merchant_api_track_transaction.c b/src/lib/merchant_api_track_transaction.c index b494b993..7daceb55 100644 --- a/src/lib/merchant_api_track_transaction.c +++ b/src/lib/merchant_api_track_transaction.c @@ -44,12 +44,6 @@ struct TALER_MERCHANT_TrackTransactionHandle char *url; /** - * base32 identifier being the 'witd' parameter required by the - * exchange - */ - char *wtid; - - /** * Handle for the request. */ struct GNUNET_CURL_Job *job; @@ -80,9 +74,9 @@ struct TALER_MERCHANT_TrackTransactionHandle * @param json response body, NULL if not in JSON */ static void -handle_tracktransaction_finished (void *cls, - long response_code, - const json_t *json) +handle_track_transaction_finished (void *cls, + long response_code, + const json_t *json) { struct TALER_MERCHANT_TrackTransactionHandle *tdo = cls; @@ -131,6 +125,7 @@ handle_tracktransaction_finished (void *cls, NULL, GNUNET_TIME_UNIT_ZERO_ABS, NULL); + TALER_MERCHANT_track_transaction_cancel (tdo); } @@ -170,7 +165,7 @@ TALER_MERCHANT_track_transaction (struct GNUNET_CURL_Context *ctx, tdo->job = GNUNET_CURL_job_add (ctx, eh, GNUNET_YES, - &handle_tracktransaction_finished, + &handle_track_transaction_finished, tdo); return tdo; } @@ -191,7 +186,6 @@ TALER_MERCHANT_track_transaction_cancel (struct TALER_MERCHANT_TrackTransactionH tdo->job = NULL; } GNUNET_free (tdo->url); - GNUNET_free (tdo->wtid); GNUNET_free (tdo); } diff --git a/src/lib/merchant_api_track_transfer.c b/src/lib/merchant_api_track_transfer.c index 9dfaf2f7..661d2906 100644 --- a/src/lib/merchant_api_track_transfer.c +++ b/src/lib/merchant_api_track_transfer.c @@ -44,12 +44,6 @@ struct TALER_MERCHANT_TrackTransferHandle char *url; /** - * base32 identifier being the 'witd' parameter required by the - * exchange - */ - char *wtid; - - /** * Handle for the request. */ struct GNUNET_CURL_Job *job; @@ -72,6 +66,90 @@ struct TALER_MERCHANT_TrackTransferHandle /** + * We got a #MHD_HTTP_OK response for the /track/transfer request. + * Check that the response is well-formed and if it is, call the + * callback. If not, return an error code. + * + * This code is very similar to + * exchange_api_track_transfer.c::check_track_transfer_response_ok. + * (Except we do not check the signature, as that was done by the + * backend which we trust already.) + * Any changes should likely be reflected there as well. + * + * @param wdh handle to the operation + * @param json response we got + * @return #GNUNET_OK if we are done and all is well, + * #GNUNET_SYSERR if the response was bogus + */ +static int +check_track_transfer_response_ok (struct TALER_MERCHANT_TrackTransferHandle *wdh, + const json_t *json) +{ + json_t *details_j; + struct GNUNET_HashCode h_wire; + struct TALER_Amount total_amount; + struct TALER_MerchantPublicKeyP merchant_pub; + unsigned int num_details; + struct TALER_ExchangePublicKeyP exchange_pub; + struct GNUNET_JSON_Specification spec[] = { + TALER_JSON_spec_amount ("total", &total_amount), + GNUNET_JSON_spec_fixed_auto ("merchant_pub", &merchant_pub), + GNUNET_JSON_spec_fixed_auto ("H_wire", &h_wire), + GNUNET_JSON_spec_json ("deposits", &details_j), + GNUNET_JSON_spec_fixed_auto ("exchange_pub", &exchange_pub), + GNUNET_JSON_spec_end() + }; + + if (GNUNET_OK != + GNUNET_JSON_parse (json, + spec, + NULL, NULL)) + { + GNUNET_break_op (0); + return GNUNET_SYSERR; + } + num_details = json_array_size (details_j); + { + struct TALER_TrackTransferDetails details[num_details]; + unsigned int i; + + for (i=0;i<num_details;i++) + { + struct TALER_TrackTransferDetails *detail = &details[i]; + struct json_t *detail_j = json_array_get (details_j, i); + struct GNUNET_JSON_Specification spec_detail[] = { + GNUNET_JSON_spec_fixed_auto ("H_contract", &detail->h_contract), + GNUNET_JSON_spec_uint64 ("transaction_id", &detail->transaction_id), + GNUNET_JSON_spec_fixed_auto ("coin_pub", &detail->coin_pub), + TALER_JSON_spec_amount ("deposit_value", &detail->coin_value), + TALER_JSON_spec_amount ("deposit_fee", &detail->coin_fee), + GNUNET_JSON_spec_end() + }; + + if (GNUNET_OK != + GNUNET_JSON_parse (detail_j, + spec_detail, + NULL, NULL)) + { + GNUNET_break_op (0); + return GNUNET_SYSERR; + } + } + wdh->cb (wdh->cb_cls, + MHD_HTTP_OK, + &exchange_pub, + json, + &h_wire, + &total_amount, + num_details, + details); + } + TALER_MERCHANT_track_transfer_cancel (wdh); + return GNUNET_OK; +} + + +/** * Function called when we're done processing the * HTTP /track/transfer request. * @@ -92,18 +170,16 @@ handle_track_transfer_finished (void *cls, case 0: break; case MHD_HTTP_OK: - { - /* Work out argument for external callback from the body .. */ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "200 returned from /track/transfer\n"); - /* FIXME: actually verify signature */ - } + if (GNUNET_OK == + check_track_transfer_response_ok (tdo, + json)) + return; + GNUNET_break_op (0); + response_code = 0; break; case MHD_HTTP_NOT_FOUND: /* Nothing really to verify, this should never happen, we should pass the JSON reply to the application */ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "track transfer URI not found\n"); break; case MHD_HTTP_INTERNAL_SERVER_ERROR: /* Server had an internal issue; we should retry, but this API @@ -118,7 +194,6 @@ handle_track_transfer_finished (void *cls, response_code = 0; break; } - /* FIXME: pass proper results back! */ tdo->cb (tdo->cb_cls, response_code, NULL, @@ -127,6 +202,7 @@ handle_track_transfer_finished (void *cls, NULL, 0, NULL); + TALER_MERCHANT_track_transfer_cancel (tdo); } @@ -194,7 +270,6 @@ TALER_MERCHANT_track_transfer_cancel (struct TALER_MERCHANT_TrackTransferHandle tdo->job = NULL; } GNUNET_free (tdo->url); - GNUNET_free (tdo->wtid); GNUNET_free (tdo); } |