taler-auditor-httpd_deposit-confirmation-get.c (6496B)
1 /* 2 This file is part of TALER 3 Copyright (C) 2014-2024 Taler Systems SA 4 5 TALER is free software; you can redistribute it and/or modify it under the 6 terms of the GNU Affero 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 Affero General Public License for more details. 12 13 You should have received a copy of the GNU Affero General Public License along with 14 TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> 15 */ 16 /** 17 * @file taler-auditor-httpd_deposit-confirmation-get.c 18 * @brief Handle /deposit-confirmation requests; return list of deposit confirmations from merchant 19 * that were not received from the exchange, by auditor. 20 * @author Nic Eigel 21 */ 22 #include "taler/platform.h" 23 #include <gnunet/gnunet_util_lib.h> 24 #include <gnunet/gnunet_json_lib.h> 25 #include <jansson.h> 26 #include <microhttpd.h> 27 #include <pthread.h> 28 #include "taler/taler_json_lib.h" 29 #include "taler/taler_mhd_lib.h" 30 #include "taler-auditor-httpd.h" 31 #include "taler-auditor-httpd_deposit-confirmation-get.h" 32 33 34 /** 35 * Add deposit confirmation to the list. 36 * 37 * @param[in,out] cls a `json_t *` array to extend 38 * @param dc struct of deposit confirmation 39 * @return #GNUNET_OK to continue to iterate, #GNUNET_SYSERR to stop iterating 40 */ 41 static enum GNUNET_GenericReturnValue 42 add_deposit_confirmation ( 43 void *cls, 44 const struct TALER_AUDITORDB_DepositConfirmation *dc) 45 { 46 json_t *list = cls; 47 json_t *obj; 48 json_t *coin_pubs_json = json_array (); 49 json_t *coin_sigs_json = json_array (); 50 51 GNUNET_assert (NULL != coin_pubs_json); 52 GNUNET_assert (NULL != coin_sigs_json); 53 for (unsigned int i = 0; i < dc->num_coins; i++) 54 { 55 json_t *pub; 56 json_t *sig; 57 58 pub = GNUNET_JSON_from_data_auto (&dc->coin_pubs[i]); 59 GNUNET_assert (0 == 60 json_array_append_new (coin_pubs_json, 61 pub)); 62 sig = GNUNET_JSON_from_data_auto (&dc->coin_sigs[i]); 63 GNUNET_assert (0 == 64 json_array_append_new (coin_sigs_json, 65 sig)); 66 } 67 68 obj = GNUNET_JSON_PACK ( 69 GNUNET_JSON_pack_int64 ("deposit_confirmation_serial_id", 70 dc->row_id), 71 GNUNET_JSON_pack_data_auto ("h_contract_terms", 72 &dc->h_contract_terms), 73 GNUNET_JSON_pack_data_auto ("h_policy", 74 &dc->h_policy), 75 GNUNET_JSON_pack_data_auto ("h_wire", 76 &dc->h_wire), 77 GNUNET_JSON_pack_timestamp ("exchange_timestamp", 78 dc->exchange_timestamp), 79 GNUNET_JSON_pack_timestamp ("refund_deadline", 80 dc->refund_deadline), 81 GNUNET_JSON_pack_timestamp ("wire_deadline", 82 dc->wire_deadline), 83 TALER_JSON_pack_amount ("total_without_fee", 84 &dc->total_without_fee), 85 GNUNET_JSON_pack_array_steal ("coin_pubs", 86 coin_pubs_json), 87 GNUNET_JSON_pack_array_steal ("coin_sigs", 88 coin_sigs_json), 89 GNUNET_JSON_pack_data_auto ("merchant_pub", 90 &dc->merchant), 91 GNUNET_JSON_pack_data_auto ("exchange_sig", 92 &dc->exchange_sig), 93 GNUNET_JSON_pack_data_auto ("exchange_pub", 94 &dc->exchange_pub), 95 GNUNET_JSON_pack_data_auto ("master_sig", 96 &dc->master_sig), 97 GNUNET_JSON_pack_bool ("suppressed", 98 dc->suppressed) 99 ); 100 GNUNET_break (0 == 101 json_array_append_new (list, 102 obj)); 103 return GNUNET_OK; 104 } 105 106 107 MHD_RESULT 108 TAH_DEPOSIT_CONFIRMATION_handler_get ( 109 struct TAH_RequestHandler *rh, 110 struct MHD_Connection *connection, 111 void **connection_cls, 112 const char *upload_data, 113 size_t *upload_data_size, 114 const char *const args[]) 115 { 116 json_t *ja; 117 enum GNUNET_DB_QueryStatus qs; 118 bool return_suppressed = false; 119 int64_t limit = -20; 120 uint64_t offset; 121 122 (void) rh; 123 (void) connection_cls; 124 (void) upload_data; 125 (void) upload_data_size; 126 if (GNUNET_SYSERR == 127 TAH_plugin->preflight (TAH_plugin->cls)) 128 { 129 GNUNET_break (0); 130 return TALER_MHD_reply_with_error (connection, 131 MHD_HTTP_INTERNAL_SERVER_ERROR, 132 TALER_EC_GENERIC_DB_SETUP_FAILED, 133 NULL); 134 } 135 TALER_MHD_parse_request_snumber (connection, 136 "limit", 137 &limit); 138 if (limit < 0) 139 offset = INT64_MAX; 140 else 141 offset = 0; 142 TALER_MHD_parse_request_number (connection, 143 "offset", 144 &offset); 145 { 146 const char *ret_s = MHD_lookup_connection_value (connection, 147 MHD_GET_ARGUMENT_KIND, 148 "return_suppressed"); 149 if ( (NULL != ret_s) && 150 (0 == strcmp (ret_s, "true")) ) 151 { 152 return_suppressed = true; 153 } 154 } 155 156 ja = json_array (); 157 GNUNET_break (NULL != ja); 158 qs = TAH_plugin->get_deposit_confirmations ( 159 TAH_plugin->cls, 160 limit, 161 offset, 162 return_suppressed, 163 &add_deposit_confirmation, 164 ja); 165 if (0 > qs) 166 { 167 GNUNET_break (GNUNET_DB_STATUS_HARD_ERROR == qs); 168 json_decref (ja); 169 TALER_LOG_WARNING ( 170 "Failed to handle GET /deposit-confirmation in database\n"); 171 return TALER_MHD_reply_with_error (connection, 172 MHD_HTTP_INTERNAL_SERVER_ERROR, 173 TALER_EC_GENERIC_DB_FETCH_FAILED, 174 "deposit-confirmation"); 175 } 176 return TALER_MHD_REPLY_JSON_PACK ( 177 connection, 178 MHD_HTTP_OK, 179 GNUNET_JSON_pack_array_steal ("deposit_confirmation", 180 ja)); 181 } 182 183 184 /* end of taler-auditor-httpd_deposit-confirmation-get.c */