summaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorChristian Blättler <blatc2@bfh.ch>2024-02-25 16:20:49 +0100
committerChristian Blättler <blatc2@bfh.ch>2024-02-25 16:20:49 +0100
commit021cc6e5ab2cac569784e0f8fa08a6f7227c0536 (patch)
tree960766c0c6e9b8af31d54af2ec3dd8888dff83c9 /src/backend
parented0a15461984c963d25478d820feb2827f7886a1 (diff)
downloadmerchant-021cc6e5ab2cac569784e0f8fa08a6f7227c0536.tar.gz
merchant-021cc6e5ab2cac569784e0f8fa08a6f7227c0536.tar.bz2
merchant-021cc6e5ab2cac569784e0f8fa08a6f7227c0536.zip
rought first draft of v1 contract terms data structures
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/taler-merchant-httpd_private-post-orders.c575
1 files changed, 461 insertions, 114 deletions
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().
@@ -1451,6 +1762,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;
const char *merchant_base_url = NULL;
@@ -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