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:
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))