merchant

Merchant backend to process payments, run by merchants
Log | Files | Refs | Submodules | README | LICENSE

commit d79af27618a095b7f48f1d5b359dd5f80559e238
parent 779cbf3018791b2b366a727eab70a96453bc4c9f
Author: Christian Grothoff <christian@grothoff.org>
Date:   Tue, 28 Oct 2025 22:57:10 +0100

add
DEFAULT_WIRE_TRANSFER_ROUNDING_INTERVAL merchant option, ensure refund deadlines computed from default refund delays do not exceed order-specific wire transfer deadlines

Diffstat:
Msrc/backend/taler-merchant-httpd.c | 66++++++++++++++++++++++++++++++++++++++++++++++++++++--------------
Msrc/backend/taler-merchant-httpd.h | 6++++++
Msrc/backend/taler-merchant-httpd_private-post-instances.c | 12++++++++----
Msrc/backend/taler-merchant-httpd_private-post-orders.c | 11+++++++++++
4 files changed, 77 insertions(+), 18 deletions(-)

diff --git a/src/backend/taler-merchant-httpd.c b/src/backend/taler-merchant-httpd.c @@ -143,12 +143,14 @@ struct TALER_MERCHANTDB_Plugin *TMH_db; struct GNUNET_CONTAINER_MultiHashMap *TMH_by_id_map; -struct GNUNET_TIME_Relative TMH_default_wire_transfer_delay; - struct GNUNET_TIME_Relative TMH_default_pay_delay; struct GNUNET_TIME_Relative TMH_default_refund_delay; +struct GNUNET_TIME_Relative TMH_default_wire_transfer_delay; + +enum GNUNET_TIME_RounderInterval TMH_default_wire_transfer_rounding_interval; + int TMH_strict_v19; int TMH_auth_disabled; @@ -2872,18 +2874,6 @@ run (void *cls, if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_time (cfg, "merchant", - "DEFAULT_WIRE_TRANSFER_DELAY", - &TMH_default_wire_transfer_delay)) - { - GNUNET_log_config_missing (GNUNET_ERROR_TYPE_INFO, - "merchant", - "DEFAULT_WIRE_TRANSFER_DELAY"); - TMH_default_wire_transfer_delay = GNUNET_TIME_UNIT_MONTHS; - } - - if (GNUNET_OK != - GNUNET_CONFIGURATION_get_value_time (cfg, - "merchant", "DEFAULT_PAY_DELAY", &TMH_default_pay_delay)) { @@ -2907,6 +2897,54 @@ run (void *cls, 15); } + if (GNUNET_OK != + GNUNET_CONFIGURATION_get_value_time (cfg, + "merchant", + "DEFAULT_WIRE_TRANSFER_DELAY", + &TMH_default_wire_transfer_delay)) + { + GNUNET_log_config_missing (GNUNET_ERROR_TYPE_INFO, + "merchant", + "DEFAULT_WIRE_TRANSFER_DELAY"); + TMH_default_wire_transfer_delay = GNUNET_TIME_UNIT_MONTHS; + } + + { + char *dwtri; + + if (GNUNET_OK != + GNUNET_CONFIGURATION_get_value_string ( + cfg, + "merchant", + "DEFAULT_WIRE_TRANSFER_ROUNDING_INTERVAL", + &dwtri)) + { + GNUNET_log_config_missing (GNUNET_ERROR_TYPE_INFO, + "merchant", + "DEFAULT_WIRE_TRANSFER_ROUNDING_INTERVAL"); + TMH_default_wire_transfer_rounding_interval = GNUNET_TIME_RI_NONE; + } + else + { + if (GNUNET_OK != + GNUNET_TIME_string_to_round_interval ( + dwtri, + &TMH_default_wire_transfer_rounding_interval)) + { + GNUNET_log_config_invalid ( + GNUNET_ERROR_TYPE_ERROR, + "merchant", + "DEFAULT_WIRE_TRANSFER_ROUNDING_INTERVAL", + "invalid time rounding interval"); + global_ret = EXIT_NOTCONFIGURED; + GNUNET_free (dwtri); + GNUNET_SCHEDULER_shutdown (); + return; + } + GNUNET_free (dwtri); + } + } + if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string (cfg, diff --git a/src/backend/taler-merchant-httpd.h b/src/backend/taler-merchant-httpd.h @@ -797,6 +797,12 @@ extern struct GNUNET_TIME_Relative TMH_legal_expiration; extern struct GNUNET_TIME_Relative TMH_default_wire_transfer_delay; /** + * Default rounding interval to be applied to new instances. + */ +extern enum GNUNET_TIME_RounderInterval + TMH_default_wire_transfer_rounding_interval; + +/** * Default payment delay for new instances. */ extern struct GNUNET_TIME_Relative TMH_default_pay_delay; diff --git a/src/backend/taler-merchant-httpd_private-post-instances.c b/src/backend/taler-merchant-httpd_private-post-instances.c @@ -64,9 +64,10 @@ post_instances (const struct TMH_RequestHandler *rh, struct TMH_WireMethod *wm_head = NULL; struct TMH_WireMethod *wm_tail = NULL; const json_t *jauth; - bool no_transfer_delay; bool no_pay_delay; bool no_refund_delay; + bool no_transfer_delay; + bool no_rounding_interval; struct GNUNET_JSON_Specification spec[] = { GNUNET_JSON_spec_string ("id", (const char **) &is.id), @@ -112,7 +113,7 @@ post_instances (const struct TMH_RequestHandler *rh, GNUNET_JSON_spec_time_rounder_interval ( "default_wire_transfer_rounding_interval", &is.default_wire_transfer_rounding_interval), - NULL), + &no_rounding_interval), GNUNET_JSON_spec_end () }; @@ -127,12 +128,15 @@ post_instances (const struct TMH_RequestHandler *rh, ? MHD_YES : MHD_NO; } - if (no_transfer_delay) - is.default_wire_transfer_delay = TMH_default_wire_transfer_delay; if (no_pay_delay) is.default_pay_delay = TMH_default_pay_delay; if (no_refund_delay) is.default_refund_delay = TMH_default_refund_delay; + if (no_transfer_delay) + is.default_wire_transfer_delay = TMH_default_wire_transfer_delay; + if (no_rounding_interval) + is.default_wire_transfer_rounding_interval + = TMH_default_wire_transfer_rounding_interval; { enum GNUNET_GenericReturnValue ret; diff --git a/src/backend/taler-merchant-httpd_private-post-orders.c b/src/backend/taler-merchant-httpd_private-post-orders.c @@ -3693,6 +3693,7 @@ phase_parse_order (struct OrderContext *oc) GNUNET_JSON_spec_end () }; enum GNUNET_GenericReturnValue ret; + bool computed_refund_deadline; oc->parse_order.refund_deadline = GNUNET_TIME_UNIT_FOREVER_TS; oc->parse_order.wire_deadline = GNUNET_TIME_UNIT_FOREVER_TS; @@ -3975,6 +3976,7 @@ phase_parse_order (struct OrderContext *oc) } else { + computed_refund_deadline = true; oc->parse_order.refund_deadline = GNUNET_TIME_absolute_to_timestamp ( GNUNET_TIME_absolute_add (oc->parse_order.pay_deadline.abs_time, @@ -4037,6 +4039,15 @@ phase_parse_order (struct OrderContext *oc) return; } } + else if (computed_refund_deadline) + { + /* if we computed the refund_deadline from default settings + and did have a configured wire_deadline, make sure that + the refund_deadline is at or below the wire_deadline. */ + oc->parse_order.refund_deadline + = GNUNET_TIME_timestamp_min (oc->parse_order.refund_deadline, + oc->parse_order.wire_deadline); + } if (GNUNET_TIME_timestamp_cmp (oc->parse_order.wire_deadline, <, oc->parse_order.refund_deadline))