summaryrefslogtreecommitdiff
path: root/src/backend/taler-merchant-httpd_private-post-orders.c
diff options
context:
space:
mode:
authorChristian Blättler <blatc2@bfh.ch>2024-02-29 11:59:29 +0100
committerChristian Blättler <blatc2@bfh.ch>2024-02-29 11:59:29 +0100
commitca9274bae258f32639b411021e2c304f95813985 (patch)
tree1be493683758d0e2b0c5cf2e866ff7253d24c7b2 /src/backend/taler-merchant-httpd_private-post-orders.c
parent021cc6e5ab2cac569784e0f8fa08a6f7227c0536 (diff)
downloadmerchant-ca9274bae258f32639b411021e2c304f95813985.tar.gz
merchant-ca9274bae258f32639b411021e2c304f95813985.tar.bz2
merchant-ca9274bae258f32639b411021e2c304f95813985.zip
separate structs implement discussed changes
Diffstat (limited to 'src/backend/taler-merchant-httpd_private-post-orders.c')
-rw-r--r--src/backend/taler-merchant-httpd_private-post-orders.c461
1 files changed, 112 insertions, 349 deletions
diff --git a/src/backend/taler-merchant-httpd_private-post-orders.c b/src/backend/taler-merchant-httpd_private-post-orders.c
index 776d8c62..f886d9f2 100644
--- a/src/backend/taler-merchant-httpd_private-post-orders.c
+++ b/src/backend/taler-merchant-httpd_private-post-orders.c
@@ -33,6 +33,7 @@
#include <taler/taler_json_lib.h>
#include "taler-merchant-httpd_private-post-orders.h"
#include "taler-merchant-httpd_exchanges.h"
+#include "taler-merchant-httpd_contract.h"
#include "taler-merchant-httpd_helper.h"
#include "taler-merchant-httpd_private-get-orders.h"
@@ -228,19 +229,92 @@ struct OrderContext
/**
* Specified version of the order.
*/
- const char *version;
+ enum TALER_MerchantContractVersion version;
/**
- * Order information passed in in v0 format.
+ * URL where the same contract could be ordered again (if available).
+ */
+ const char *public_reorder_url;
+
+ /**
+ * Our order ID.
+ */
+ const char *order_id;
+
+ /**
+ * Merchant base URL.
+ */
+ char *merchant_base_url;
+
+ /**
+ * 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;
+
+ /**
+ * 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;
+
+ /**
+ * Timestamp of the order.
+ */
+ struct GNUNET_TIME_Timestamp timestamp;
+
+ /**
+ * Deadline for refunds.
+ */
+ struct GNUNET_TIME_Timestamp refund_deadline;
+
+ /**
+ * Specifies for how long the wallet should try to get an
+ * automatic refund for the purchase.
+ */
+ struct GNUNET_TIME_Relative auto_refund;
+
+ /**
+ * 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;
+
+ /**
+ * 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;
+
+ /**
+ * Order information in v0 format.
*/
struct
{
/**
- * Our order ID.
- */
- const char *order_id;
-
- /**
* Summary of the order.
*/
const char *summary;
@@ -251,11 +325,6 @@ struct OrderContext
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.
*/
@@ -273,62 +342,11 @@ struct OrderContext
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.
*/
@@ -338,23 +356,6 @@ struct OrderContext
* 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;
/**
@@ -363,299 +364,61 @@ struct OrderContext
struct
{
/**
- * Our order ID.
+ * Array of possible specific contracts the wallet/customer may choose
+ * from by selecting the respective index when signing the deposit
+ * confirmation.
*/
- const char *order_id;
+ struct TALER_MerchantContractChoice *choices;
+ /**
+ * Length of the @e choices array.
+ */
+ unsigned int choices_len;
+
+ /**
+ * TODO: This was moved out a level: Change design document according to this.
+ * Array of token authorities.
+ */
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.
+ * Label of the token authority.
*/
- const char *fulfillment_message;
+ const char *label;
/**
- * Map from IETF BCP 47 language tags to localized fulfillment messages.
+ * Human-readable description of the semantics of the tokens issued by
+ * this authority.
*/
- json_t *fulfillment_message_i18n;
+ const char *summary;
/**
- * Array of products that are part of the purchase.
+ * Map from IETF BCP 47 language tags to localized summaries.
*/
- const json_t *products;
+ json_t *summary_i18n;
/**
- * List of inputs the wallet must provision (all of them) to
- * satisfy the conditions for the contract.
+ * Public key used to validate tokens signed by this authority.
*/
- 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;
+ struct TALER_TokenFamilyPublicKey key;
/**
- * Map from authority labels to metadata about the respective token
- * authority.
+ * When will tokens signed by this key expire?
*/
- 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;
+ struct GNUNET_TIME_Timestamp token_expiration;
- /**
- * 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;
+ } *token_authorities;
/**
- * Nonce generated by the wallet and echoed by the merchant
- * in this field when the proposal is generated.
+ * Length of the @e token_authorities array.
*/
- const char *nonce;
+ unsigned int token_authorities_len;
/**
- * Extra data that is only interpreted by the merchant frontend.
+ * TODO: Model this
+ * Fee limits and wire account details by currency.
+ * limits: { [currency:string] : CurrencyLimit };
*/
- const json_t *extra;
} v1;
} parse_order;
@@ -981,7 +744,7 @@ execute_transaction (struct OrderContext *oc)
&oc->parse_request.h_post_data,
oc->parse_order.pay_deadline,
&oc->parse_request.claim_token,
- oc->serialize_order.contract, /* called 'contract terms' at database. */
+ oc->serialize_order.contract, /* called 'contract terms' in database. */
oc->parse_request.pos_key,
oc->parse_request.pos_algorithm);
if (qs <= 0)