diff options
author | Christian Grothoff <christian@grothoff.org> | 2020-05-31 15:06:00 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2020-05-31 15:06:00 +0200 |
commit | a043dd973bad7c46f1bb222ccacc935b76141d37 (patch) | |
tree | 051533ab4f1e64b155e0a499aa5f680d89f70e65 /src | |
parent | 059797b86a96e95ca4d61ccbcec690620957aaf9 (diff) | |
download | merchant-a043dd973bad7c46f1bb222ccacc935b76141d37.tar.gz merchant-a043dd973bad7c46f1bb222ccacc935b76141d37.tar.bz2 merchant-a043dd973bad7c46f1bb222ccacc935b76141d37.zip |
work on tip APIs
Diffstat (limited to 'src')
-rw-r--r-- | src/backenddb/plugin_merchantdb_postgres.c | 13 | ||||
-rw-r--r-- | src/include/taler_merchant_service.h | 503 | ||||
-rw-r--r-- | src/lib/merchant_api_tip_authorize.c | 73 | ||||
-rw-r--r-- | src/lib/merchant_api_tip_pickup.c | 16 | ||||
-rw-r--r-- | src/lib/merchant_api_tip_pickup2.c | 18 | ||||
-rw-r--r-- | src/lib/merchant_api_tip_query.c | 79 | ||||
-rw-r--r-- | src/testing/testing_api_cmd_tip_authorize.c | 8 | ||||
-rw-r--r-- | src/testing/testing_api_cmd_tip_pickup.c | 2 | ||||
-rw-r--r-- | src/testing/testing_api_cmd_tip_query.c | 43 |
9 files changed, 551 insertions, 204 deletions
diff --git a/src/backenddb/plugin_merchantdb_postgres.c b/src/backenddb/plugin_merchantdb_postgres.c index 42d5f331..44fbe3d8 100644 --- a/src/backenddb/plugin_merchantdb_postgres.c +++ b/src/backenddb/plugin_merchantdb_postgres.c @@ -7049,8 +7049,17 @@ libtaler_plugin_merchantdb_postgres_init (void *cls) " WHERE merchant_id=$1)", 2), /* for postgres_lookup_tip_details() */ - // FIXME! - + GNUNET_PQ_make_prepare ("lookup_pickup_details", + "SELECT" + " pickup_id" + ",amount_val" + ",amount_frac" + ",num_planchets" + ",COUNT(blind_sig)" + " FROM merchant_tip_pickups" + " JOIN merchant_tip_pickup_signatures USING (pickup_serial)" + " WHERE tip_serial = $1", + 1), /* for postgres_insert_pickup() */ GNUNET_PQ_make_prepare ("insert_pickup", "INSERT INTO merchant_tip_pickups" diff --git a/src/include/taler_merchant_service.h b/src/include/taler_merchant_service.h index ce0d22c2..79391c42 100644 --- a/src/include/taler_merchant_service.h +++ b/src/include/taler_merchant_service.h @@ -2372,32 +2372,269 @@ TALER_MERCHANT_transfers_get_cancel ( /* ******************* /reserves *************** */ -/* ********************* OLD ************************** */ +/** + * @brief Handle to a POST /reserves operation at a merchant's backend. + */ +struct TALER_MERCHANT_PostReservesHandle; + + +/** + * Callbacks of this type are used to work the result of submitting a + * POST /reserves request to a merchant + * + * @param cls closure + * @param hr HTTP response details + * @param reserve_pub public key of the created reserve, NULL on error + * @param payto_url where to make the payment to for filling the reserve, NULL on error + */ +typedef void +(*TALER_MERCHANT_PostReservesCallback) ( + void *cls, + const struct TALER_MERCHANT_HttpResponse *hr, + const struct TALER_ReservePublicKeyP *reserve_pub, + const char *payto_url); + + +/** + * Request backend to create a reserve. + * + * @param ctx execution context + * @param backend_url base URL of the backend + * @param initial_balance desired initial balance for the reserve + * @param exchange_url what is the URL of the exchange where the reserve should be set up + * @param wire_method desired wire method, for example "iban" or "x-taler-bank" + * @param cb the callback to call when a reply for this request is available + * @param cb_cls closure for @a cb + * @return a handle for this request + */ +struct TALER_MERCHANT_PostReservesHandle * +TALER_MERCHANT_reserves_post ( + struct GNUNET_CURL_Context *ctx, + const char *backend_url, + const struct TALER_Amount *initial_balance, + const char *exchange_url, + const char *wire_method, + TALER_MERCHANT_PostReservesCallback cb, + void *cls); + + +/** + * Cancel a POST /reserves request. This function cannot be used + * on a request handle if a response is already served for it. + * + * @param pth the operation to cancel + */ +void +TALER_MERCHANT_reserves_post_cancel ( + struct TALER_MERCHANT_PostReservesHandle *prh); + + +/** + * Handle for a GET /reserves operation. + */ +struct TALER_MERCHANT_ReservesGetHandle; + + +/** + * Information about a reserve. + */ +struct TALER_MERCHANT_ReserveSummary +{ + /** + * Public key of the reserve + */ + struct TALER_ReservePublicKeyP reserve_pub; + + /** + * Timestamp when it was established + */ + struct GNUNET_TIME_Absolute creation_time; + + /** + * Timestamp when it expires + */ + struct GNUNET_TIME_Absolute expiration_time; + + /** + * Initial amount as per reserve creation call + */ + struct TALER_Amount merchant_initial_amount; + + /** + * Initial amount as per exchange, 0 if exchange did + * not confirm reserve creation yet. + */ + struct TALER_Amount exchange_initial_amount; + + /** + * Amount picked up so far. + */ + struct TALER_Amount pickup_amount; + + /** + * Amount approved for tips that exceeds the pickup_amount. + */ + struct TALER_Amount committed_amount; + + /** + * Is this reserve active (false if it was deleted but not purged) + */ + bool active; +}; + + +/** + * Callback to process a GET /reserves request + * + * @param cls closure + * @param hr HTTP response details + * @param reserves_length length of the @a reserves array + * @param reserves array with details about the reserves, NULL on error + */ +typedef void +(*TALER_MERCHANT_ReservesGetCallback) ( + void *cls, + const struct TALER_MERCHANT_HttpResponse *hr, + unsigned int reserves_length, + const struct TALER_MERCHANT_ReserveSummary reserves[]); + + +/** + * Issue a GET /reserves request to the backend. Informs the backend + * that a customer wants to pick up a reserves. + * + * @param ctx execution context + * @param backend_url base URL of the merchant backend + * @param after filter for reserves created after this date, use 0 for no filtering + * @param active filter for reserves that are active + * @param failures filter for reserves where we disagree about the balance with + * the exchange + * @param cb function to call with the result(s) + * @param cb_cls closure for @a cb + * @return handle for this operation, NULL upon errors + */ +struct TALER_MERCHANT_ReservesGetHandle * +TALER_MERCHANT_reserves_get (struct GNUNET_CURL_Context *ctx, + const char *backend_url, + struct GNUNET_TIME_Absolute after, + enum TALER_MERCHANT_YesNoAll active, + enum TALER_MERCHANT_YesNoAll failures, + TALER_MERCHANT_ReservesGetCallback cb, + void *cb_cls); + + +/** + * Cancel a GET /reserves request. + * + * @param rgh handle to the request to be canceled + */ +void +TALER_MERCHANT_reserves_get_cancel ( + struct TALER_MERCHANT_ReservesGetHandle *rgh); + + +/** + * Handle for a request to obtain details on a specific + * (tipping) reserve. + */ +struct TALER_MERCHANT_ReserveGetHandle; -/* ********************** /tip-authorize ********************** */ +/** + * Details about a tip granted by the merchant. + */ +struct TALER_MERCHANT_TipDetails +{ + /** + * Identifier for the tip. + */ + struct GNUNET_HashCode tip_id; + + /** + * Total value of the tip (including fees). + */ + struct TALER_Amount amount; + + /** + * Human-readable reason for why the tip was granted. + */ + const char *reason; + +}; + + +/** + * Callback to process a GET /reserve/$RESERVE_PUB request + * + * @param cls closure + * @param hr HTTP response details + * @param rs reserve summary for the reserve, NULL on error + * @param tips_length length of the @a reserves array + * @param tips array with details about the tips granted, NULL on error + */ +typedef void +(*TALER_MERCHANT_ReserveGetCallback) ( + void *cls, + const struct TALER_MERCHANT_HttpResponse *hr, + const struct TALER_MERCHANT_ReserveSummary *rs, + unsigned int tips_length, + const struct TALER_MERCHANT_TipDetails tips[]); + + +/** + * Issue a GET /reserve/$RESERVE_ID request to the backend. Queries the backend + * about the status of a reserve. + * + * @param ctx execution context + * @param backend_url base URL of the merchant backend + * @param reserve_pub which reserve should be queried + * @param tips should we return details about the tips issued from the reserve + * @param cb function to call with the result(s) + * @param cb_cls closure for @a cb + * @return handle for this operation, NULL upon errors + */ +struct TALER_MERCHANT_ReserveGetHandle * +TALER_MERCHANT_reserve_get (struct GNUNET_CURL_Context *ctx, + const char *backend_url, + const struct TALER_ReservePublicKeyP *reserve_pub, + bool fetch_tips, + TALER_MERCHANT_ReservesGetCallback cb, + void *cb_cls); + + +/** + * Cancel a GET /reserve/$RESERVE_ID request. + * + * @param rgh handle to the request to be canceled + */ +void +TALER_MERCHANT_reserve_get_cancel ( + struct TALER_MERCHANT_ReserveGetHandle *rgh); + /** * Handle for a /tip-authorize operation. */ -struct TALER_MERCHANT_TipAuthorizeOperation; +struct TALER_MERCHANT_TipAuthorizeHandle; /** - * Callback for a /tip-authorize request. Returns the result of + * Callback for a /reserves/$RESERVE_PUB/tip-authorize request. Returns the result of * the operation. * * @param cls closure * @param hr HTTP response details * @param tip_id which tip ID should be used to pickup the tip * @param tip_uri URI for the tip + * @param tip_expiration when does the tip expire */ typedef void (*TALER_MERCHANT_TipAuthorizeCallback) ( void *cls, const struct TALER_MERCHANT_HttpResponse *hr, struct GNUNET_HashCode *tip_id, - const char *tip_uri); + const char *tip_uri, + struct GNUNET_TIME_Absolute tip_expiration); /** @@ -2406,7 +2643,7 @@ typedef void * * @param ctx execution context * @param backend_url base URL of the merchant backend - * @param pickup_url frontend URL for where the tip can be picked up + * @param reserve_pub public key of the reserve * @param next_url where the browser should proceed after picking up the tip * @param amount amount to be handed out as a tip * @param justification which justification should be stored (human-readable reason for the tip) @@ -2414,10 +2651,35 @@ typedef void * @param authorize_cb_cls closure to pass to @a authorize_cb * @return handle for this operation, NULL upon errors */ -struct TALER_MERCHANT_TipAuthorizeOperation * +struct TALER_MERCHANT_TipAuthorizeHandle * +TALER_MERCHANT_tip_authorize2 ( + struct GNUNET_CURL_Context *ctx, + const char *backend_url, + const struct TALER_ReservePublicKeyP *reserve_pub, + const char *next_url, + const struct TALER_Amount *amount, + const char *justification, + TALER_MERCHANT_TipAuthorizeCallback authorize_cb, + void *authorize_cb_cls); + + +/** + * Issue a POST /tips request to the backend. Informs the backend that a tip + * should be created. In contrast to #TALER_MERCHANT_tip_authorize2(), the + * backend gets to pick the reserve with this API. + * + * @param ctx execution context + * @param backend_url base URL of the merchant backend + * @param next_url where the browser should proceed after picking up the tip + * @param amount amount to be handed out as a tip + * @param justification which justification should be stored (human-readable reason for the tip) + * @param authorize_cb callback which will work the response gotten from the backend + * @param authorize_cb_cls closure to pass to @a authorize_cb + * @return handle for this operation, NULL upon errors + */ +struct TALER_MERCHANT_TipAuthorizeHandle * TALER_MERCHANT_tip_authorize (struct GNUNET_CURL_Context *ctx, const char *backend_url, - const char *pickup_url, const char *next_url, const struct TALER_Amount *amount, const char *justification, @@ -2432,19 +2694,140 @@ TALER_MERCHANT_tip_authorize (struct GNUNET_CURL_Context *ctx, */ void TALER_MERCHANT_tip_authorize_cancel ( - struct TALER_MERCHANT_TipAuthorizeOperation *ta); + struct TALER_MERCHANT_TipAuthorizeHandle *ta); + + +/** + * Handle for a request to delete or purge a specific reserve. + */ +struct TALER_MERCHANT_ReserveDeleteHandle; + + +/** + * Callback to process a DELETE /reserve/$RESERVE_PUB request + * + * @param cls closure + * @param hr HTTP response details + */ +typedef void +(*TALER_MERCHANT_ReserveDeleteCallback) ( + void *cls, + const struct TALER_MERCHANT_HttpResponse *hr); -/* ********************** /tip-pickup ************************* */ + +/** + * Issue a DELETE /reserve/$RESERVE_ID request to the backend. Only + * deletes the private key of the reserve, preserves tipping data. + * + * @param ctx execution context + * @param backend_url base URL of the merchant backend + * @param reserve_pub which reserve should be queried + * @param cb function to call with the result + * @param cb_cls closure for @a cb + * @return handle for this operation, NULL upon errors + */ +struct TALER_MERCHANT_ReserveDeleteHandle * +TALER_MERCHANT_reserve_delete ( + struct GNUNET_CURL_Context *ctx, + const char *backend_url, + const struct TALER_ReservePublicKeyP *reserve_pub, + TALER_MERCHANT_ReserveDeleteCallback cb, + void *cb_cls); /** - * Handle for a /tip-pickup operation. + * Issue a DELETE /reserve/$RESERVE_ID request to the backend. + * Purges the reserve, deleting all associated data. DANGEROUS. + * + * @param ctx execution context + * @param backend_url base URL of the merchant backend + * @param reserve_pub which reserve should be queried + * @param cb function to call with the result + * @param cb_cls closure for @a cb + * @return handle for this operation, NULL upon errors */ -struct TALER_MERCHANT_TipPickupOperation; +struct TALER_MERCHANT_ReserveDeleteHandle * +TALER_MERCHANT_reserve_purge (struct GNUNET_CURL_Context *ctx, + const char *backend_url, + const struct TALER_ReservePublicKeyP *reserve_pub, + TALER_MERCHANT_ReserveDeleteCallback cb, + void *cb_cls); /** - * Callback for a /tip-pickup request. Returns the result of the operation. + * Cancel a DELETE (or purge) /reserve/$RESERVE_ID request. + * + * @param rdh handle to the request to be canceled + */ +void +TALER_MERCHANT_reserve_delete_cancel ( + struct TALER_MERCHANT_ReserveDeleteHandle *rdh); + + +/* ********************* /tips ************************** */ + + +/** + * Handle for a GET /tips/$TIP_ID (public variant) operation. + */ +struct TALER_MERCHANT_TipGetHandle; + + +/** + * Callback to process a GET /tips/$TIP_ID request + * + * @param cls closure + * @param hr HTTP response details + * @param expiration when the tip will expire + * @param exchange_url exchange from which the coins should be withdrawn + * @param amount_remaining total amount still available for the tip + */ +typedef void +(*TALER_MERCHANT_TipGetCallback) ( + void *cls, + const struct TALER_MERCHANT_HttpResponse *hr, + struct GNUNET_TIME_Absolute expiration, + const char *exchange_url, + struct TALER_Amount *amount_remaining); + + +/** + * Issue a GET /tips/$TIP_ID (public variant) request to the backend. Returns + * information needed to pick up a tip. + * + * @param ctx execution context + * @param backend_url base URL of the merchant backend + * @param tip_id which tip should we query + * @param cb function to call with the result + * @param cb_cls closure for @a cb + * @return handle for this operation, NULL upon errors + */ +struct TALER_MERCHANT_TipGetHandle * +TALER_MERCHANT_tip_get (struct GNUNET_CURL_Context *ctx, + const char *backend_url, + const struct GNUNET_HashCode *tip_id, + TALER_MERCHANT_TipGetCallback cb, + void *cb_cls); + + +/** + * Cancel a GET /tip-get request. + * + * @param tqo handle to the request to be canceled + */ +void +TALER_MERCHANT_tip_get_cancel (struct TALER_MERCHANT_TipGetHandle *tqh); + + +/** + * Handle for a POST /tips/$TIP_ID/pickup operation. + */ +struct TALER_MERCHANT_TipPickupHandle; + + +/** + * Callback for a POST /tips/$TIP_ID/pickup request. Returns the result of + * the operation. * * @param cls closure * @param hr HTTP response details @@ -2456,7 +2839,7 @@ typedef void void *cls, const struct TALER_MERCHANT_HttpResponse *hr, unsigned int num_sigs, - const struct TALER_DenominationSignature *sigs); + const struct TALER_DenominationSignature sigs[]); /** @@ -2477,41 +2860,41 @@ struct TALER_MERCHANT_PlanchetData }; /** - * Issue a /tip-pickup request to the backend. Informs the backend - * that a customer wants to pick up a tip. + * Issue a POST /tips/$TIP_ID/pickup request to the backend. Informs the + * backend that a customer wants to pick up a tip. * * @param ctx execution context * @param backend_url base URL of the merchant backend * @param tip_id unique identifier for the tip * @param num_planches number of planchets provided in @a pds - * @param pds array of planchet secrets to be signed into existence for the tip + * @param planchets array of planchet secrets to be signed into existence for the tip * @param pickup_cb callback which will work the response gotten from the backend * @param pickup_cb_cls closure to pass to @a pickup_cb * @return handle for this operation, NULL upon errors */ -struct TALER_MERCHANT_TipPickupOperation * +struct TALER_MERCHANT_TipPickupHandle * TALER_MERCHANT_tip_pickup (struct GNUNET_CURL_Context *ctx, const char *backend_url, const struct GNUNET_HashCode *tip_id, unsigned int num_planchets, - const struct TALER_MERCHANT_PlanchetData *pds, + const struct TALER_MERCHANT_PlanchetData planchets[], TALER_MERCHANT_TipPickupCallback pickup_cb, void *pickup_cb_cls); /** - * Cancel a pending /tip-pickup request + * Cancel a pending /tips/$TIP_ID/pickup request * * @param tp handle from the operation to cancel */ void -TALER_MERCHANT_tip_pickup_cancel (struct TALER_MERCHANT_TipPickupOperation *tp); +TALER_MERCHANT_tip_pickup_cancel (struct TALER_MERCHANT_TipPickupHandle *tph); /** * Handle for a low-level /tip-pickup operation (without unblinding). */ -struct TALER_MERCHANT_TipPickup2Operation; +struct TALER_MERCHANT_TipPickup2Handle; /** * A blind signature returned via tipping API. @@ -2527,8 +2910,9 @@ struct TALER_MERCHANT_BlindSignature /** - * Callback for a /tip-pickup request. Returns the result of the operation. - * Note that the client MUST still do the unblinding of the @a blind_sigs. + * Callback for a POST /tips/$TIP_ID/pickup request. Returns the result of + * the operation. Note that the client MUST still do the unblinding of the @a + * blind_sigs. * * @param cls closure * @param hr HTTP response details @@ -2540,12 +2924,12 @@ typedef void void *cls, const struct TALER_MERCHANT_HttpResponse *hr, unsigned int num_blind_sigs, - const struct TALER_MERCHANT_BlindSignature *blind_sigs); + const struct TALER_MERCHANT_BlindSignature blind_sigs[]); /** - * Issue a /tip-pickup request to the backend. Informs the backend - * that a customer wants to pick up a tip. + * Issue a POST /tips/$TIP_ID/pickup request to the backend. Informs the + * backend that a customer wants to pick up a tip. * * @param ctx execution context * @param backend_url base URL of the merchant backend @@ -2556,12 +2940,12 @@ typedef void * @param pickup_cb_cls closure to pass to @a pickup_cb * @return handle for this operation, NULL upon errors */ -struct TALER_MERCHANT_TipPickup2Operation * +struct TALER_MERCHANT_TipPickup2Handle * TALER_MERCHANT_tip_pickup2 (struct GNUNET_CURL_Context *ctx, const char *backend_url, const struct GNUNET_HashCode *tip_id, unsigned int num_planchets, - struct TALER_PlanchetDetail *planchets, + const struct TALER_PlanchetDetail planchets[], TALER_MERCHANT_TipPickup2Callback pickup_cb, void *pickup_cb_cls); @@ -2573,70 +2957,13 @@ TALER_MERCHANT_tip_pickup2 (struct GNUNET_CURL_Context *ctx, */ void TALER_MERCHANT_tip_pickup2_cancel ( - struct TALER_MERCHANT_TipPickup2Operation *tp); + struct TALER_MERCHANT_TipPickup2Handle *tp); /* ********************** /tip-query ************************* */ -/** - * Handle for a /tip-query operation. - */ -struct TALER_MERCHANT_TipQueryOperation; - - -/** - * Callback to process a GET /tip-query request - * - * @param cls closure - * @param hr HTTP response details - * @param reserve_expiration when the tip reserve will expire - * @param reserve_pub tip reserve public key - * @param amount_authorized total amount authorized on tip reserve - * @param amount_available total amount still available on tip reserve - * @param amount_picked_up total amount picked up from tip reserve - */ -typedef void -(*TALER_MERCHANT_TipQueryCallback) ( - void *cls, - const struct TALER_MERCHANT_HttpResponse *hr, - struct GNUNET_TIME_Absolute reserve_expiration, - struct TALER_ReservePublicKeyP *reserve_pub, - struct TALER_Amount *amount_authorized, - struct TALER_Amount *amount_available, - struct TALER_Amount *amount_picked_up); - - -/** - * Cancel a GET /tip-query request. - * - * @param cph handle to the request to be canceled - */ -void -TALER_MERCHANT_tip_query_cancel (struct TALER_MERCHANT_TipQueryOperation *tqo); - - -/** - * Issue a /tip-query request to the backend. Informs the backend - * that a customer wants to pick up a tip. - * - * @param ctx execution context - * @param backend_url base URL of the merchant backend - * @return handle for this operation, NULL upon errors - */ -struct TALER_MERCHANT_TipQueryOperation * -TALER_MERCHANT_tip_query (struct GNUNET_CURL_Context *ctx, - const char *backend_url, - TALER_MERCHANT_TipQueryCallback query_cb, - void *query_cb_cls); - -/** - * Cancel a GET /tip-query request. - * - * @param tqo handle to the request to be canceled - */ -void -TALER_MERCHANT_tip_query_cancel (struct TALER_MERCHANT_TipQueryOperation *tqh); +/* ********************** GET /private/reserves ************************* */ /* ********************* /track/transaction (UNSPEC!) *********************** */ diff --git a/src/lib/merchant_api_tip_authorize.c b/src/lib/merchant_api_tip_authorize.c index 37ad3904..2a172387 100644 --- a/src/lib/merchant_api_tip_authorize.c +++ b/src/lib/merchant_api_tip_authorize.c @@ -35,7 +35,7 @@ /** * @brief A handle for tip authorizations. */ -struct TALER_MERCHANT_TipAuthorizeOperation +struct TALER_MERCHANT_TipAuthorizeHandle { /** @@ -80,13 +80,15 @@ struct TALER_MERCHANT_TipAuthorizeOperation * @return #GNUNET_OK if response is valid */ static int -check_ok (struct TALER_MERCHANT_TipAuthorizeOperation *tao, +check_ok (struct TALER_MERCHANT_TipAuthorizeHandle *tao, const json_t *json) { - const char *taler_tip_uri; + const char *taler_tip_url; struct GNUNET_HashCode tip_id; + struct GNUNET_TIME_Absolute expiration_time; struct GNUNET_JSON_Specification spec[] = { - GNUNET_JSON_spec_string ("taler_tip_uri", &taler_tip_uri), + GNUNET_JSON_spec_string ("tip_redirect_url", &taler_tip_url), + GNUNET_JSON_spec_absolute_time ("tip_expiration", &expiration_time), GNUNET_JSON_spec_fixed_auto ("tip_id", &tip_id), GNUNET_JSON_spec_end () }; @@ -114,7 +116,8 @@ check_ok (struct TALER_MERCHANT_TipAuthorizeOperation *tao, tao->cb (tao->cb_cls, &hr, &tip_id, - taler_tip_uri); + taler_tip_url, + expiration_time); tao->cb = NULL; /* do not call twice */ GNUNET_JSON_parse_free (spec); return GNUNET_OK; @@ -123,9 +126,9 @@ check_ok (struct TALER_MERCHANT_TipAuthorizeOperation *tao, /** * Function called when we're done processing the - * HTTP /track/transaction request. + * HTTP /reservers/$TIP_ID/tip-authorize request. * - * @param cls the `struct TALER_MERCHANT_TipAuthorizeOperation` + * @param cls the `struct TALER_MERCHANT_TipAuthorizeHandle` * @param response_code HTTP response code, 0 on error * @param json response body, NULL if not in JSON */ @@ -134,7 +137,7 @@ handle_tip_authorize_finished (void *cls, long response_code, const void *response) { - struct TALER_MERCHANT_TipAuthorizeOperation *tao = cls; + struct TALER_MERCHANT_TipAuthorizeHandle *tao = cls; const json_t *json = response; struct TALER_MERCHANT_HttpResponse hr = { .http_status = (unsigned int) response_code, @@ -195,7 +198,8 @@ handle_tip_authorize_finished (void *cls, tao->cb (tao->cb_cls, &hr, NULL, - NULL); + NULL, + GNUNET_TIME_UNIT_ZERO_ABS); TALER_MERCHANT_tip_authorize_cancel (tao); } @@ -206,7 +210,7 @@ handle_tip_authorize_finished (void *cls, * * @param ctx execution context * @param backend_url base URL of the merchant backend - * @param pickup_url frontend URL for where the tip can be picked up + * @param reserve_pub public key of the reserve * @param next_url where the browser should proceed after picking up the tip * @param amount amount to be handed out as a tip * @param justification which justification should be stored (human-readable reason for the tip) @@ -214,27 +218,44 @@ handle_tip_authorize_finished (void *cls, * @param authorize_cb_cls closure to pass to @a authorize_cb * @return handle for this operation, NULL upon errors */ -struct TALER_MERCHANT_TipAuthorizeOperation * -TALER_MERCHANT_tip_authorize (struct GNUNET_CURL_Context *ctx, - const char *backend_url, - const char *pickup_url, - const char *next_url, - const struct TALER_Amount *amount, - const char *justification, - TALER_MERCHANT_TipAuthorizeCallback authorize_cb, - void *authorize_cb_cls) +struct TALER_MERCHANT_TipAuthorizeHandle * +TALER_MERCHANT_tip_authorize2 ( + struct GNUNET_CURL_Context *ctx, + const char *backend_url, + const struct TALER_ReservePublicKeyP *reserve_pub, + const char *next_url, + const struct TALER_Amount *amount, + const char *justification, + TALER_MERCHANT_TipAuthorizeCallback authorize_cb, + void *authorize_cb_cls) { - struct TALER_MERCHANT_TipAuthorizeOperation *tao; + struct TALER_MERCHANT_TipAuthorizeHandle *tao; CURL *eh; json_t *te_obj; - tao = GNUNET_new (struct TALER_MERCHANT_TipAuthorizeOperation); + tao = GNUNET_new (struct TALER_MERCHANT_TipAuthorizeHandle); tao->ctx = ctx; tao->cb = authorize_cb; tao->cb_cls = authorize_cb_cls; - tao->url = TALER_url_join (backend_url, - "tip-authorize", - NULL); + + { + char res_str[sizeof (struct GNUNET_HashCode) * 2]; + char arg_str[sizeof (struct TALER_CoinSpendPublicKeyP) * 2 + 32]; + char *end; + + end = GNUNET_STRINGS_data_to_string (reserve_pub, + sizeof (*reserve_pub), + res_str, + sizeof (res_str)); + *end = '\0'; + GNUNET_snprintf (arg_str, + sizeof (arg_str), + "/reserves/%s/tip-authorize", + res_str); + tao->url = TALER_url_join (backend_url, + arg_str, + NULL); + } if (NULL == tao->url) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, @@ -245,12 +266,10 @@ TALER_MERCHANT_tip_authorize (struct GNUNET_CURL_Context *ctx, te_obj = json_pack ("{" " s:o," /* amount */ " s:s," /* justification */ - " s:s," /* pickup_url */ " s:s," /* next_url */ "}", "amount", TALER_JSON_from_amount (amount), "justification", justification, - "pickup_url", pickup_url, "next_url", next_url); if (NULL == te_obj) { @@ -297,7 +316,7 @@ TALER_MERCHANT_tip_authorize (struct GNUNET_CURL_Context *ctx, */ void TALER_MERCHANT_tip_authorize_cancel ( - struct TALER_MERCHANT_TipAuthorizeOperation *tao) + struct TALER_MERCHANT_TipAuthorizeHandle *tao) { if (NULL != tao->job) { diff --git a/src/lib/merchant_api_tip_pickup.c b/src/lib/merchant_api_tip_pickup.c index 6e48f169..08f59359 100644 --- a/src/lib/merchant_api_tip_pickup.c +++ b/src/lib/merchant_api_tip_pickup.c @@ -57,7 +57,7 @@ struct PlanchetData /** * Handle for a /tip-pickup operation. */ -struct TALER_MERCHANT_TipPickupOperation +struct TALER_MERCHANT_TipPickupHandle { /** @@ -73,7 +73,7 @@ struct TALER_MERCHANT_TipPickupOperation /** * Handle for the actual (internal) withdraw operation. */ - struct TALER_MERCHANT_TipPickup2Operation *tpo2; + struct TALER_MERCHANT_TipPickup2Handle *tpo2; /** * Number of planchets/coins used for this operation. @@ -92,7 +92,7 @@ struct TALER_MERCHANT_TipPickupOperation * Callback for a /tip-pickup request. Returns the result of the operation. * Note that the client MUST still do the unblinding of the @a blind_sigs. * - * @param cls closure, a `struct TALER_MERCHANT_TipPickupOperation *` + * @param cls closure, a `struct TALER_MERCHANT_TipPickupHandle *` * @param hr HTTP response details * @param num_blind_sigs length of the @a reserve_sigs array, 0 on error * @param blind_sigs array of blind signatures over the planchets, NULL on error @@ -103,7 +103,7 @@ pickup_done_cb (void *cls, unsigned int num_blind_sigs, const struct TALER_MERCHANT_BlindSignature *blind_sigs) { - struct TALER_MERCHANT_TipPickupOperation *tp = cls; + struct TALER_MERCHANT_TipPickupHandle *tp = cls; tp->tpo2 = NULL; if (NULL == blind_sigs) @@ -180,7 +180,7 @@ pickup_done_cb (void *cls, * @param pickup_cb_cls closure to pass to @a pickup_cb * @return handle for this operation, NULL upon errors */ -struct TALER_MERCHANT_TipPickupOperation * +struct TALER_MERCHANT_TipPickupHandle * TALER_MERCHANT_tip_pickup (struct GNUNET_CURL_Context *ctx, const char *backend_url, const struct GNUNET_HashCode *tip_id, @@ -189,7 +189,7 @@ TALER_MERCHANT_tip_pickup (struct GNUNET_CURL_Context *ctx, TALER_MERCHANT_TipPickupCallback pickup_cb, void *pickup_cb_cls) { - struct TALER_MERCHANT_TipPickupOperation *tp; + struct TALER_MERCHANT_TipPickupHandle *tp; struct TALER_PlanchetDetail details[GNUNET_NZL (num_planchets)]; if (0 == num_planchets) @@ -197,7 +197,7 @@ TALER_MERCHANT_tip_pickup (struct GNUNET_CURL_Context *ctx, GNUNET_break (0); return NULL; } - tp = GNUNET_new (struct TALER_MERCHANT_TipPickupOperation); + tp = GNUNET_new (struct TALER_MERCHANT_TipPickupHandle); GNUNET_array_grow (tp->planchets, tp->num_planchets, num_planchets); @@ -249,7 +249,7 @@ TALER_MERCHANT_tip_pickup (struct GNUNET_CURL_Context *ctx, * @param tp handle from the operation to cancel */ void -TALER_MERCHANT_tip_pickup_cancel (struct TALER_MERCHANT_TipPickupOperation *tp) +TALER_MERCHANT_tip_pickup_cancel (struct TALER_MERCHANT_TipPickupHandle *tp) { for (unsigned int i = 0; i<tp->num_planchets; i++) GNUNET_CRYPTO_rsa_public_key_dup (tp->planchets[i].pk.key.rsa_public_key); diff --git a/src/lib/merchant_api_tip_pickup2.c b/src/lib/merchant_api_tip_pickup2.c index 751d1267..a06de612 100644 --- a/src/lib/merchant_api_tip_pickup2.c +++ b/src/lib/merchant_api_tip_pickup2.c @@ -35,7 +35,7 @@ /** * @brief A handle for tracking transactions. */ -struct TALER_MERCHANT_TipPickup2Operation +struct TALER_MERCHANT_TipPickup2Handle { /** @@ -85,7 +85,7 @@ struct TALER_MERCHANT_TipPickup2Operation * @return #GNUNET_OK if response is valid */ static int -check_ok (struct TALER_MERCHANT_TipPickup2Operation *tpo, +check_ok (struct TALER_MERCHANT_TipPickup2Handle *tpo, const json_t *json) { json_t *ja; @@ -154,7 +154,7 @@ check_ok (struct TALER_MERCHANT_TipPickup2Operation *tpo, * Function called when we're done processing the * HTTP /track/transaction request. * - * @param cls the `struct TALER_MERCHANT_TipPickupOperation` + * @param cls the `struct TALER_MERCHANT_TipPickupHandle` * @param response_code HTTP response code, 0 on error * @param json response body, NULL if not in JSON */ @@ -163,7 +163,7 @@ handle_tip_pickup_finished (void *cls, long response_code, const void *response) { - struct TALER_MERCHANT_TipPickup2Operation *tpo = cls; + struct TALER_MERCHANT_TipPickup2Handle *tpo = cls; const json_t *json = response; struct TALER_MERCHANT_HttpResponse hr = { .http_status = (unsigned int) response_code, @@ -235,16 +235,16 @@ handle_tip_pickup_finished (void *cls, * @param pickup_cb_cls closure to pass to @a pickup_cb * @return handle for this operation, NULL upon errors */ -struct TALER_MERCHANT_TipPickup2Operation * +struct TALER_MERCHANT_TipPickup2Handle * TALER_MERCHANT_tip_pickup2 (struct GNUNET_CURL_Context *ctx, const char *backend_url, const struct GNUNET_HashCode *tip_id, unsigned int num_planchets, - struct TALER_PlanchetDetail *planchets, + const struct TALER_PlanchetDetail planchets[], TALER_MERCHANT_TipPickup2Callback pickup_cb, void *pickup_cb_cls) { - struct TALER_MERCHANT_TipPickup2Operation *tpo; + struct TALER_MERCHANT_TipPickup2Handle *tpo; CURL *eh; json_t *pa; json_t *tp_obj; @@ -294,7 +294,7 @@ TALER_MERCHANT_tip_pickup2 (struct GNUNET_CURL_Context *ctx, GNUNET_break (0); return NULL; } - tpo = GNUNET_new (struct TALER_MERCHANT_TipPickup2Operation); + tpo = GNUNET_new (struct TALER_MERCHANT_TipPickup2Handle); tpo->num_planchets = num_planchets; tpo->ctx = ctx; tpo->cb = pickup_cb; @@ -347,7 +347,7 @@ TALER_MERCHANT_tip_pickup2 (struct GNUNET_CURL_Context *ctx, */ void TALER_MERCHANT_tip_pickup2_cancel ( - struct TALER_MERCHANT_TipPickup2Operation *tpo) + struct TALER_MERCHANT_TipPickup2Handle *tpo) { if (NULL != tpo->job) { diff --git a/src/lib/merchant_api_tip_query.c b/src/lib/merchant_api_tip_query.c index 250d26d0..b25fac85 100644 --- a/src/lib/merchant_api_tip_query.c +++ b/src/lib/merchant_api_tip_query.c @@ -15,7 +15,7 @@ <http://www.gnu.org/licenses/> */ /** - * @file lib/merchant_api_tip_query.c + * @file lib/merchant_api_tip_query.c => FIXME: rename! * @brief Implementation of the /tip-query request of the merchant's HTTP API * @author Florian Dold */ @@ -31,9 +31,9 @@ /** - * @brief A handle for tracking /tip-query operations + * @brief A handle for tracking /tip-get operations */ -struct TALER_MERCHANT_TipQueryOperation +struct TALER_MERCHANT_TipGetHandle { /** * The url for this request. @@ -48,7 +48,7 @@ struct TALER_MERCHANT_TipQueryOperation /** * Function to call with the result. */ - TALER_MERCHANT_TipQueryCallback cb; + TALER_MERCHANT_TipGetCallback cb; /** * Closure for @a cb. @@ -67,16 +67,16 @@ struct TALER_MERCHANT_TipQueryOperation * Function called when we're done processing the * HTTP /track/transaction request. * - * @param cls the `struct TALER_MERCHANT_TipQueryOperation` + * @param cls the `struct TALER_MERCHANT_TipGetHandle` * @param response_code HTTP response code, 0 on error * @param json response body, NULL if not in JSON */ static void -handle_tip_query_finished (void *cls, - long response_code, - const void *response) +handle_tip_get_finished (void *cls, + long response_code, + const void *response) { - struct TALER_MERCHANT_TipQueryOperation *tqo = cls; + struct TALER_MERCHANT_TipGetHandle *tqo = cls; const json_t *json = response; struct TALER_MERCHANT_HttpResponse hr = { .http_status = (unsigned int) response_code, @@ -84,7 +84,7 @@ handle_tip_query_finished (void *cls, }; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Got /tip-query response with status code %u\n", + "Got /tip-get response with status code %u\n", (unsigned int) response_code); tqo->job = NULL; @@ -93,17 +93,14 @@ handle_tip_query_finished (void *cls, case MHD_HTTP_OK: { struct GNUNET_TIME_Absolute reserve_expiration; - struct TALER_Amount amount_authorized; - struct TALER_Amount amount_available; - struct TALER_Amount amount_picked_up; + const char *exchange_url; + struct TALER_Amount amount_remaining; struct TALER_ReservePublicKeyP reserve_pub; struct GNUNET_JSON_Specification spec[] = { GNUNET_JSON_spec_fixed_auto ("reserve_pub", &reserve_pub), - GNUNET_JSON_spec_absolute_time ("reserve_expiration", - &reserve_expiration), - TALER_JSON_spec_amount ("amount_authorized", &amount_authorized), - TALER_JSON_spec_amount ("amount_available", &amount_available), - TALER_JSON_spec_amount ("amount_picked_up", &amount_picked_up), + GNUNET_JSON_spec_string ("exchange_url", + &exchange_url), + TALER_JSON_spec_amount ("amount_remaining", &amount_remaining), GNUNET_JSON_spec_end () }; @@ -120,11 +117,9 @@ handle_tip_query_finished (void *cls, tqo->cb (tqo->cb_cls, &hr, reserve_expiration, - &reserve_pub, - &amount_authorized, - &amount_available, - &amount_picked_up); - TALER_MERCHANT_tip_query_cancel (tqo); + exchange_url, + &amount_remaining); + TALER_MERCHANT_tip_get_cancel (tqo); return; } case MHD_HTTP_INTERNAL_SERVER_ERROR: @@ -154,36 +149,38 @@ handle_tip_query_finished (void *cls, &hr, GNUNET_TIME_UNIT_ZERO_ABS, NULL, - NULL, - NULL, NULL); - TALER_MERCHANT_tip_query_cancel (tqo); + TALER_MERCHANT_tip_get_cancel (tqo); } /** - * Issue a /tip-query request to the backend. Informs the backend + * Issue a /tip-get request to the backend. Informs the backend * that a customer wants to pick up a tip. * * @param ctx execution context * @param backend_url base URL of the merchant backend + * @param tip_id which tip should we query + * @param cb function to call with the result + * @param cb_cls closure for @a cb * @return handle for this operation, NULL upon errors */ -struct TALER_MERCHANT_TipQueryOperation * -TALER_MERCHANT_tip_query (struct GNUNET_CURL_Context *ctx, - const char *backend_url, - TALER_MERCHANT_TipQueryCallback query_cb, - void *query_cb_cls) +struct TALER_MERCHANT_TipGetHandle * +TALER_MERCHANT_tip_get (struct GNUNET_CURL_Context *ctx, + const char *backend_url, + const struct GNUNET_HashCode *tip_id, + TALER_MERCHANT_TipGetCallback cb, + void *cb_cls) { - struct TALER_MERCHANT_TipQueryOperation *tqo; + struct TALER_MERCHANT_TipGetHandle *tqo; CURL *eh; - tqo = GNUNET_new (struct TALER_MERCHANT_TipQueryOperation); + tqo = GNUNET_new (struct TALER_MERCHANT_TipGetHandle); tqo->ctx = ctx; - tqo->cb = query_cb; - tqo->cb_cls = query_cb_cls; + tqo->cb = cb; + tqo->cb_cls = cb_cls; tqo->url = TALER_url_join (backend_url, - "tip-query", + "tip-get", NULL); if (NULL == tqo->url) { @@ -206,20 +203,20 @@ TALER_MERCHANT_tip_query (struct GNUNET_CURL_Context *ctx, tqo->job = GNUNET_CURL_job_add (ctx, eh, GNUNET_YES, - &handle_tip_query_finished, + &handle_tip_get_finished, tqo); return tqo; } /** - * Cancel a /tip-query request. This function cannot be used + * Cancel a /tip-get request. This function cannot be used * on a request handle if a response is already served for it. * * @param tqo handle to the operation being cancelled */ void -TALER_MERCHANT_tip_query_cancel (struct TALER_MERCHANT_TipQueryOperation *tqo) +TALER_MERCHANT_tip_get_cancel (struct TALER_MERCHANT_TipGetHandle *tqo) { if (NULL != tqo->job) { @@ -231,4 +228,4 @@ TALER_MERCHANT_tip_query_cancel (struct TALER_MERCHANT_TipQueryOperation *tqo) } -/* end of merchant_api_tip_query.c */ +/* end of merchant_api_tip_get.c */ diff --git a/src/testing/testing_api_cmd_tip_authorize.c b/src/testing/testing_api_cmd_tip_authorize.c index 928ec04d..ff7f9c0a 100644 --- a/src/testing/testing_api_cmd_tip_authorize.c +++ b/src/testing/testing_api_cmd_tip_authorize.c @@ -80,7 +80,7 @@ struct TipAuthorizeState /** * Handle to the on-going /tip-authorize request. */ - struct TALER_MERCHANT_TipAuthorizeOperation *tao; + struct TALER_MERCHANT_TipAuthorizeHandle *tao; /** * The interpreter state. @@ -103,7 +103,8 @@ static void tip_authorize_cb (void *cls, const struct TALER_MERCHANT_HttpResponse *hr, struct GNUNET_HashCode *tip_id, - const char *taler_tip_uri) + const char *taler_tip_uri, + struct GNUNET_TIME_Absolute expiration) { struct TipAuthorizeState *tas = cls; @@ -191,10 +192,9 @@ tip_authorize_run (void *cls, tas->tao = TALER_MERCHANT_tip_authorize (is->ctx, tas->merchant_url, "http://merchant.com/pickup", - "http://merchant.com/continue", &amount, tas->justification, - tip_authorize_cb, + &tip_authorize_cb, tas); GNUNET_assert (NULL != tas->tao); diff --git a/src/testing/testing_api_cmd_tip_pickup.c b/src/testing/testing_api_cmd_tip_pickup.c index dd963520..d05b20d4 100644 --- a/src/testing/testing_api_cmd_tip_pickup.c +++ b/src/testing/testing_api_cmd_tip_pickup.c @@ -65,7 +65,7 @@ struct TipPickupState /** * Handle to a on-going /tip/pickup request. */ - struct TALER_MERCHANT_TipPickupOperation *tpo; + struct TALER_MERCHANT_TipPickupHandle *tpo; /** * The interpreter state. diff --git a/src/testing/testing_api_cmd_tip_query.c b/src/testing/testing_api_cmd_tip_query.c index 70e59c12..27a82a99 100644 --- a/src/testing/testing_api_cmd_tip_query.c +++ b/src/testing/testing_api_cmd_tip_query.c @@ -49,7 +49,7 @@ struct TipQueryState /** * The handle to the current /tip-query request. */ - struct TALER_MERCHANT_TipQueryOperation *tqo; + struct TALER_MERCHANT_TipGetHandle *tqo; /** * The interpreter state. @@ -82,35 +82,27 @@ struct TipQueryState * @param cls closure * @param hr HTTP response * @param reserve_expiration when the tip reserve will expire - * @param reserve_pub tip reserve public key - * @param amount_authorized total amount authorized on tip reserve - * @param amount_available total amount still available on - * tip reserve - * @param amount_picked_up total amount picked up from tip reserve + * @param exchange_url from where to pick up the tip + * @param amount_remaining how much is remaining */ static void tip_query_cb (void *cls, const struct TALER_MERCHANT_HttpResponse *hr, struct GNUNET_TIME_Absolute reserve_expiration, - struct TALER_ReservePublicKeyP *reserve_pub, - struct TALER_Amount *amount_authorized, - struct TALER_Amount *amount_available, - struct TALER_Amount *amount_picked_up) + const char *exchange_url, + struct TALER_Amount *amount_remaining) { struct TipQueryState *tqs = cls; - struct TALER_Amount a; tqs->tqo = NULL; GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Tip query callback at command `%s'\n", TALER_TESTING_interpreter_get_current_label (tqs->is)); - GNUNET_assert (NULL != reserve_pub); - GNUNET_assert (NULL != amount_authorized); - GNUNET_assert (NULL != amount_available); - GNUNET_assert (NULL != amount_picked_up); - +#if FIXME_LATER if (tqs->expected_amount_available) { + struct TALER_Amount a; + GNUNET_assert (GNUNET_OK == TALER_string_to_amount (tqs->expected_amount_available, &a)); @@ -131,6 +123,7 @@ tip_query_cb (void *cls, if (tqs->expected_amount_authorized) { + struct TALER_Amount a; char *str; GNUNET_assert (GNUNET_OK == @@ -149,6 +142,7 @@ tip_query_cb (void *cls, if (tqs->expected_amount_picked_up) { + struct TALER_Amount a; char *str; GNUNET_assert (GNUNET_OK == @@ -164,7 +158,7 @@ tip_query_cb (void *cls, &a)) TALER_TESTING_FAIL (tqs->is); } - +#endif if (tqs->http_status != hr->http_status) TALER_TESTING_FAIL (tqs->is); TALER_TESTING_interpreter_next (tqs->is); @@ -186,9 +180,8 @@ tip_query_cleanup (void *cls, if (NULL != tqs->tqo) { - TALER_LOG_WARNING ("Tip-query operation" - " did not complete\n"); - TALER_MERCHANT_tip_query_cancel (tqs->tqo); + TALER_LOG_WARNING ("Tip-query operation did not complete\n"); + TALER_MERCHANT_tip_get_cancel (tqs->tqo); } GNUNET_free (tqs); } @@ -207,12 +200,14 @@ tip_query_run (void *cls, struct TALER_TESTING_Interpreter *is) { struct TipQueryState *tqs = cls; + struct GNUNET_HashCode tip_id; // FIXME: big bad bug, need to pass this in. Done like this just to quickly fix FTBFS! tqs->is = is; - tqs->tqo = TALER_MERCHANT_tip_query (is->ctx, - tqs->merchant_url, - &tip_query_cb, - tqs); + tqs->tqo = TALER_MERCHANT_tip_get (is->ctx, + tqs->merchant_url, + &tip_id, + &tip_query_cb, + tqs); GNUNET_assert (NULL != tqs->tqo); } |