From 021cc6e5ab2cac569784e0f8fa08a6f7227c0536 Mon Sep 17 00:00:00 2001 From: Christian Blättler Date: Sun, 25 Feb 2024 16:20:49 +0100 Subject: rought first draft of v1 contract terms data structures --- .../taler-merchant-httpd_private-post-orders.c | 575 +++++++++++++++++---- 1 file changed, 461 insertions(+), 114 deletions(-) (limited to 'src/backend') diff --git a/src/backend/taler-merchant-httpd_private-post-orders.c b/src/backend/taler-merchant-httpd_private-post-orders.c index 3c3f9ab8..776d8c62 100644 --- a/src/backend/taler-merchant-httpd_private-post-orders.c +++ b/src/backend/taler-merchant-httpd_private-post-orders.c @@ -226,125 +226,437 @@ struct OrderContext struct { /** - * Our order ID. - */ - const char *order_id; - - /** - * Summary of the order. - */ - const char *summary; - - /** - * Internationalized summary. - */ - json_t *summary_i18n; - - /** - * URL where the same contract could be ordered again (if available). - */ - const char *public_reorder_url; - - /** - * URL that will show that the order was successful - * after it has been paid for. - */ - const char *fulfillment_url; - - /** - * Message shown to the customer after paying for the order. - * Either fulfillment_url or fulfillment_message must be specified. - */ - const char *fulfillment_message; - - /** - * Map from IETF BCP 47 language tags to localized fulfillment messages. - */ - json_t *fulfillment_message_i18n; - - /** - * Merchant base URL. - */ - char *merchant_base_url; - - /** - * Timestamp of the order. - */ - struct GNUNET_TIME_Timestamp timestamp; - - /** - * Deadline for refunds. - */ - struct GNUNET_TIME_Timestamp refund_deadline; - - /** - * Payment deadline. - */ - struct GNUNET_TIME_Timestamp pay_deadline; - - /** - * Wire transfer deadline. - */ - struct GNUNET_TIME_Timestamp wire_deadline; - - /** - * Delivery date. - */ - struct GNUNET_TIME_Timestamp delivery_date; - - /** - * Delivery location. - */ - json_t *delivery_location; - - /** - * Array of products that are part of the purchase. - */ - const json_t *products; - - /** - * TODO: Maybe remove this and set it from settings where we serialize - * the order to JSON? - * - * Information like name, website, email, etc. about the merchant. - */ - json_t *merchant; - - /** - * TODO: Maybe remove this and set it from settings where we serialize - * the order to JSON? - * - * Merchant's public key - */ - struct TALER_MerchantPublicKeyP merchant_pub; - - /** - * Gross amount value of the contract. Used to - * compute @e max_stefan_fee. + * Specified version of the order. */ - struct TALER_Amount brutto; - - /** - * Maximum fee as given by the client request. - */ - struct TALER_Amount max_fee; + const char *version; /** - * Specifies for how long the wallet should try to get an - * automatic refund for the purchase. - */ - struct GNUNET_TIME_Relative auto_refund; + * Order information passed in in v0 format. + */ + struct + { + /** + * Our order ID. + */ + const char *order_id; + + /** + * Summary of the order. + */ + const char *summary; + + /** + * Internationalized summary. + */ + json_t *summary_i18n; + + /** + * URL where the same contract could be ordered again (if available). + */ + const char *public_reorder_url; + + /** + * URL that will show that the order was successful + * after it has been paid for. + */ + const char *fulfillment_url; + + /** + * Message shown to the customer after paying for the order. + * Either fulfillment_url or fulfillment_message must be specified. + */ + const char *fulfillment_message; + + /** + * Map from IETF BCP 47 language tags to localized fulfillment messages. + */ + json_t *fulfillment_message_i18n; + + /** + * Merchant base URL. + */ + char *merchant_base_url; + + /** + * Timestamp of the order. + */ + struct GNUNET_TIME_Timestamp timestamp; + + /** + * Deadline for refunds. + */ + struct GNUNET_TIME_Timestamp refund_deadline; + + /** + * Payment deadline. + */ + struct GNUNET_TIME_Timestamp pay_deadline; + + /** + * Wire transfer deadline. + */ + struct GNUNET_TIME_Timestamp wire_deadline; + + /** + * Delivery date. + */ + struct GNUNET_TIME_Timestamp delivery_date; + + /** + * Delivery location. + */ + json_t *delivery_location; + + /** + * Array of products that are part of the purchase. + */ + const json_t *products; + + /** + * TODO: Maybe remove this and set it from settings where we serialize + * the order to JSON? + * + * Information like name, website, email, etc. about the merchant. + */ + json_t *merchant; + + /** + * TODO: Maybe remove this and set it from settings where we serialize + * the order to JSON? + * + * Merchant's public key + */ + struct TALER_MerchantPublicKeyP merchant_pub; + + /** + * Gross amount value of the contract. Used to + * compute @e max_stefan_fee. + */ + struct TALER_Amount brutto; + + /** + * Maximum fee as given by the client request. + */ + struct TALER_Amount max_fee; + + /** + * Specifies for how long the wallet should try to get an + * automatic refund for the purchase. + */ + struct GNUNET_TIME_Relative auto_refund; + + /** + * Nonce generated by the wallet and echoed by the merchant + * in this field when the proposal is generated. + */ + const char *nonce; + + /** + * Extra data that is only interpreted by the merchant frontend. + */ + const json_t *extra; + } v0; /** - * Nonce generated by the wallet and echoed by the merchant - * in this field when the proposal is generated. - */ - const char *nonce; + * Order information passed in in v1 format. + */ + struct + { + /** + * Our order ID. + */ + const char *order_id; - /** - * Extra data that is only interpreted by the merchant frontend. - */ - const json_t *extra; + struct + { + /** + * Summary of the order. + */ + const char *summary; + + /** + * Internationalized summary. + */ + json_t *summary_i18n; + + /** + * URL that will show that the order was successful + * after it has been paid for. + */ + const char *fulfillment_url; + + /** + * Message shown to the customer after paying for the order. + * Either fulfillment_url or fulfillment_message must be specified. + */ + const char *fulfillment_message; + + /** + * Map from IETF BCP 47 language tags to localized fulfillment messages. + */ + json_t *fulfillment_message_i18n; + + /** + * Array of products that are part of the purchase. + */ + const json_t *products; + + /** + * List of inputs the wallet must provision (all of them) to + * satisfy the conditions for the contract. + */ + union + { + /** + * Coin-based input. + */ + struct + { + /** + * Input type. Is "coin" for coin-based inputs. + */ + const char *type; + + /** + * Price to be paid. + */ + struct TALER_Amount price; + } coin; + + /** + * Token-based input. + */ + struct { + /** + * Input type. Is "token" for token-based inputs. + */ + const char *type; + + /** + * Hash over the public key used to sign the type of subscription + * token required. + */ + struct TALER_TokenFamilyPublicKeyHash h_issuer; + + /** + * Number of tokens of this type required. Defaults to one if the + * field is not provided. + */ + unsigned int number; + } token; + } *inputs; + + union + { + /** + * Currency-based output. + */ + struct { + /** + * Output type. Is "currency" for currency-based outputs. + */ + const char *type; + + /** + * Amount of currency that will be yielded. This excludes any + * applicable withdraw fees. + */ + struct TALER_Amount brutto_yield; + + /** + * Base URL of the exchange that will issue the coins. + */ + const char *exchange_url; + } currency; + + /** + * Tax-receipt output. + */ + struct + { + /** + * Output type. Is "tax-receipt" for tax-receipt outputs. + */ + const char *type; + + /** + * ase URL of the donation authority that will issue the tax + * receipt. + */ + const char *donau_url; + } tax_receipt; + + /** + * Token-based output. + */ + struct + { + /** + * Output type. Is "token" for token-based outputs. + */ + const char *type; + + /** + * Label of the token authority in the 'token_types' map on the + * top-level. + */ + const char *authority_label; + + /** + * Must a wallet understand this token type to process contracts + * that consume or yield it? + */ + bool critical; + + /** + * Information about the class of token that will be yielded. + */ + union + { + /** + * Subscription token. + */ + struct + { + /** + * Token class. Is "subscription" for subscription tokens. + */ + const char *class; + + /** + * When does the subscription period start? + */ + struct GNUNET_TIME_Absolute start_date; + + /** + * When does the subscription period end? + */ + struct GNUNET_TIME_Absolute end_date; + + /** + * Array of domain names where this subscription + * can be safely used (e.g. the issuer warrants that + * these sites will re-issue tokens of this type + * if the respective contract says so). May contain + * "*" for any domain or subdomain. + */ + const char *trusted_domains; + } subscription; + + /** + * Discount token. + */ + struct + { + /** + * Token class. Is "discount" for discount tokens. + */ + const char *class; + + /** + * Array of domain names where this discount token + * is intended to be used. May contain "*" for any + * domain or subdomain. Users should be warned about + * sites proposing to consume discount tokens of this + * type that are not in this list that the merchant + * is accepting a coupon from a competitor and thus + * may be attaching different semantics (like get 20% + * discount for my competitors 30% discount token). + */ + const char *trusted_domains; + } discount; + } details; + + } token; + } *ouputs; + + /** + * Map from authority labels to metadata about the respective token + * authority. + */ + json_t *token_types; + + } *choices; + + /** + * TODO: Maybe remove this and set it from settings where we serialize + * the order to JSON? + * + * Information like name, website, email, etc. about the merchant. + */ + json_t *merchant; + + /** + * TODO: Maybe remove this and set it from settings where we serialize + * the order to JSON? + * + * Merchant's public key + */ + struct TALER_MerchantPublicKeyP merchant_pub; + + /** + * Gross amount value of the contract. Used to + * compute @e max_stefan_fee. + */ + struct TALER_Amount brutto; + + /** + * URL where the same contract could be ordered again (if available). + */ + const char *public_reorder_url; + + /** + * Merchant base URL. + */ + char *merchant_base_url; + + /** + * Timestamp of the order. + */ + struct GNUNET_TIME_Timestamp timestamp; + + /** + * Deadline for refunds. + */ + struct GNUNET_TIME_Timestamp refund_deadline; + + /** + * Payment deadline. + */ + struct GNUNET_TIME_Timestamp pay_deadline; + + /** + * Wire transfer deadline. + */ + struct GNUNET_TIME_Timestamp wire_deadline; + + /** + * Delivery date. + */ + struct GNUNET_TIME_Timestamp delivery_date; + + /** + * Delivery location. + */ + json_t *delivery_location; + + /** + * Specifies for how long the wallet should try to get an + * automatic refund for the purchase. + */ + struct GNUNET_TIME_Relative auto_refund; + + /** + * Nonce generated by the wallet and echoed by the merchant + * in this field when the proposal is generated. + */ + const char *nonce; + + /** + * Extra data that is only interpreted by the merchant frontend. + */ + const json_t *extra; + } v1; } parse_order; @@ -1441,7 +1753,6 @@ set_exchanges (struct OrderContext *oc) return false; } - /** * Add missing fields to the order. Upon success, continue * processing with merge_inventory(). @@ -1450,6 +1761,32 @@ set_exchanges (struct OrderContext *oc) */ static void parse_order (struct OrderContext *oc) +{ + const char *version = NULL; + + struct GNUNET_JSON_Specification spec[] = { + GNUNET_JSON_spec_mark_optional ( + GNUNET_JSON_spec_string ("version", + &version), + NULL), + GNUNET_JSON_spec_end () + } + enum GNUNET_GenericReturnValue ret; + + ret = TALER_MHD_parse_json_data (oc->connection, + oc->parse_request.order, + spec); + + +} + +/** + * Parse order fields if order.version is null or 0. + * + * @param[in,out] oc order context + */ +static void +parse_order_v0 (struct OrderContext *oc) { const struct TALER_MERCHANTDB_InstanceSettings *settings = &oc->hc->instance->settings; @@ -1890,6 +2227,16 @@ parse_order (struct OrderContext *oc) oc->phase++; } +/** + * Parse order fields if order.version is 1. + * + * @param[in,out] oc order context + */ +static void +parse_order_v1 (struct OrderContext *oc) +{ + +} /** * Process the @a payment_target and add the details of how the -- cgit v1.2.3