base_terms_parse.c (5454B)
1 /* 2 This file is part of TALER 3 (C) 2024, 2025 Taler Systems SA 4 5 TALER is free software; you can redistribute it and/or modify it under the 6 terms of the GNU Lesser General Public License as published by the Free Software 7 Foundation; either version 3, or (at your option) any later version. 8 9 TALER is distributed in the hope that it will be useful, but WITHOUT ANY 10 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR 11 A PARTICULAR PURPOSE. See the GNU General Public License for more details. 12 13 You should have received a copy of the GNU General Public License along with 14 TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> 15 */ 16 /** 17 * @file src/util/base_terms_parse.c 18 * @brief shared logic for order and contract terms parsing 19 * @author Iván Ávalos 20 * @author Christian Grothoff 21 */ 22 #include "platform.h" 23 #include <gnunet/gnunet_common.h> 24 #include <gnunet/gnunet_json_lib.h> 25 #include <jansson.h> 26 #include <stdbool.h> 27 #include <stdint.h> 28 #include <taler/taler_json_lib.h> 29 #include <taler/taler_util.h> 30 #include "taler/taler_merchant_util.h" 31 32 33 struct TALER_MERCHANT_ContractBaseTerms * 34 TALER_MERCHANT_base_terms_parse ( 35 json_t *input) 36 { 37 struct TALER_MERCHANT_ContractBaseTerms *ct 38 = GNUNET_new (struct TALER_MERCHANT_ContractBaseTerms); 39 struct GNUNET_JSON_Specification espec[] = { 40 GNUNET_JSON_spec_mark_optional ( 41 TALER_MERCHANT_spec_contract_version ("version", 42 &ct->version), 43 NULL), 44 GNUNET_JSON_spec_string_copy ("summary", 45 &ct->summary), 46 /* FIXME: do i18n_str validation in the future */ 47 GNUNET_JSON_spec_mark_optional ( 48 GNUNET_JSON_spec_object_copy ("summary_i18n", 49 &ct->summary_i18n), 50 NULL), 51 GNUNET_JSON_spec_mark_optional ( 52 TALER_JSON_spec_web_url_copy ("public_reorder_url", 53 &ct->public_reorder_url), 54 NULL), 55 GNUNET_JSON_spec_mark_optional ( 56 GNUNET_JSON_spec_string_copy ("fulfillment_url", 57 &ct->fulfillment_url), 58 NULL), 59 GNUNET_JSON_spec_mark_optional ( 60 GNUNET_JSON_spec_string_copy ("fulfillment_message", 61 &ct->fulfillment_message), 62 NULL), 63 GNUNET_JSON_spec_mark_optional ( 64 GNUNET_JSON_spec_object_copy ("fulfillment_message_i18n", 65 &ct->fulfillment_message_i18n), 66 NULL), 67 GNUNET_JSON_spec_mark_optional ( 68 GNUNET_JSON_spec_object_copy ("delivery_location", 69 &ct->delivery_location), 70 NULL), 71 GNUNET_JSON_spec_mark_optional ( 72 GNUNET_JSON_spec_timestamp ("delivery_date", 73 &ct->delivery_date), 74 NULL), 75 GNUNET_JSON_spec_mark_optional ( 76 GNUNET_JSON_spec_timestamp ("max_pickup_time", 77 &ct->max_pickup_time), 78 NULL), 79 GNUNET_JSON_spec_mark_optional ( 80 GNUNET_JSON_spec_relative_time ("auto_refund", 81 &ct->auto_refund), 82 NULL), 83 GNUNET_JSON_spec_mark_optional ( 84 GNUNET_JSON_spec_object_copy ("extra", 85 &ct->extra), 86 NULL), 87 GNUNET_JSON_spec_mark_optional ( 88 GNUNET_JSON_spec_array_copy ("amount_external", 89 &ct->amount_external), 90 NULL), 91 GNUNET_JSON_spec_mark_optional ( 92 GNUNET_JSON_spec_uint8 ("minimum_age", 93 &ct->minimum_age), 94 NULL), 95 GNUNET_JSON_spec_mark_optional ( 96 GNUNET_JSON_spec_uint64 ("order_default_money_pot", 97 &ct->default_money_pot), 98 NULL), 99 GNUNET_JSON_spec_end () 100 }; 101 enum GNUNET_GenericReturnValue res; 102 const char *ename; 103 unsigned int eline; 104 105 GNUNET_assert (NULL != input); 106 ct->max_pickup_time = GNUNET_TIME_UNIT_FOREVER_TS; 107 ct->version = TALER_MERCHANT_CONTRACT_VERSION_0; 108 res = GNUNET_JSON_parse (input, 109 espec, 110 &ename, 111 &eline); 112 if (GNUNET_OK != res) 113 { 114 GNUNET_break (0); 115 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 116 "Failed to parse common terms at field %s\n", 117 ename); 118 goto cleanup; 119 } 120 /* money pots are identified by their BIGINT serial */ 121 if (ct->default_money_pot > (uint64_t) INT64_MAX) 122 { 123 GNUNET_break_op (0); 124 goto cleanup; 125 } 126 return ct; 127 128 cleanup: 129 TALER_MERCHANT_base_terms_free (ct); 130 return NULL; 131 } 132 133 134 void 135 TALER_MERCHANT_base_terms_free ( 136 struct TALER_MERCHANT_ContractBaseTerms *ct) 137 { 138 if (NULL == ct) 139 return; 140 GNUNET_free (ct->public_reorder_url); 141 GNUNET_free (ct->summary); 142 GNUNET_free (ct->fulfillment_url); 143 GNUNET_free (ct->fulfillment_message); 144 if (NULL != ct->fulfillment_message_i18n) 145 { 146 json_decref (ct->fulfillment_message_i18n); 147 ct->fulfillment_message_i18n = NULL; 148 } 149 if (NULL != ct->delivery_location) 150 { 151 json_decref (ct->delivery_location); 152 ct->delivery_location = NULL; 153 } 154 if (NULL != ct->extra) 155 { 156 json_decref (ct->extra); 157 ct->extra = NULL; 158 } 159 if (NULL != ct->amount_external) 160 { 161 json_decref (ct->amount_external); 162 ct->amount_external = NULL; 163 } 164 if (NULL != ct->summary_i18n) 165 { 166 json_decref (ct->summary_i18n); 167 ct->summary_i18n = NULL; 168 } 169 GNUNET_free (ct); 170 }