challenge_set_address_and_pin.c (4171B)
1 /* 2 This file is part of Challenger 3 Copyright (C) 2023 Taler Systems SA 4 5 Challenger is free software; you can redistribute it and/or modify it under the 6 terms of the GNU General Public License as published by the Free Software 7 Foundation; either version 3, or (at your option) any later version. 8 9 Challenger 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 Challenger; see the file COPYING. If not, see <http://www.gnu.org/licenses/> 15 */ 16 /** 17 * @file src/challengerdb/challenge_set_address_and_pin.c 18 * @brief Implementation of the challenge_set_address_and_pin function for Postgres 19 * @author Christian Grothoff 20 */ 21 #include "platform.h" 22 #include <taler/taler_error_codes.h> 23 #include <taler/taler_dbevents.h> 24 #include <taler/taler_pq_lib.h> 25 #include "challenge_set_address_and_pin.h" 26 #include "pg_helper.h" 27 28 29 enum GNUNET_DB_QueryStatus 30 CHALLENGERDB_challenge_set_address_and_pin (struct CHALLENGERDB_PostgresContext *ctx, 31 const struct CHALLENGER_ValidationNonceP *nonce, 32 const json_t *address, 33 struct GNUNET_TIME_Relative validation_duration, 34 uint32_t *tan, 35 char **state, 36 struct GNUNET_TIME_Absolute *last_tx_time, 37 uint32_t *auth_attempts_left, 38 bool *pin_transmit, 39 char **client_redirect_uri, 40 bool *address_refused, 41 bool *solved) 42 { 43 struct GNUNET_TIME_Absolute now 44 = GNUNET_TIME_absolute_get (); 45 struct GNUNET_TIME_Absolute next_tx_time 46 = GNUNET_TIME_absolute_subtract (now, 47 validation_duration); 48 struct GNUNET_PQ_QueryParam params[] = { 49 GNUNET_PQ_query_param_auto_from_type (nonce), 50 TALER_PQ_query_param_json (address), 51 GNUNET_PQ_query_param_absolute_time (&next_tx_time), 52 GNUNET_PQ_query_param_absolute_time (&now), 53 GNUNET_PQ_query_param_uint32 (tan), 54 GNUNET_PQ_query_param_end 55 }; 56 bool not_found; 57 struct GNUNET_PQ_ResultSpec rs[] = { 58 GNUNET_PQ_result_spec_bool ("not_found", 59 ¬_found), 60 GNUNET_PQ_result_spec_absolute_time ("last_tx_time", 61 last_tx_time), 62 GNUNET_PQ_result_spec_uint32 ("last_pin", 63 tan), 64 GNUNET_PQ_result_spec_bool ("pin_transmit", 65 pin_transmit), 66 GNUNET_PQ_result_spec_uint32 ("auth_attempts_left", 67 auth_attempts_left), 68 GNUNET_PQ_result_spec_allow_null ( 69 GNUNET_PQ_result_spec_string ("client_redirect_uri", 70 client_redirect_uri), 71 NULL), 72 GNUNET_PQ_result_spec_allow_null ( 73 GNUNET_PQ_result_spec_string ("state", 74 state), 75 NULL), 76 GNUNET_PQ_result_spec_bool ("address_refused", 77 address_refused), 78 GNUNET_PQ_result_spec_bool ("solved", 79 solved), 80 GNUNET_PQ_result_spec_end 81 }; 82 enum GNUNET_DB_QueryStatus qs; 83 84 *client_redirect_uri = NULL; 85 PREPARE (ctx, 86 "do_challenge_set_address_and_pin", 87 "SELECT " 88 " out_not_found AS not_found" 89 ",out_last_tx_time AS last_tx_time" 90 ",out_pin_transmit AS pin_transmit" 91 ",out_last_pin AS last_pin" 92 ",out_state AS state" 93 ",out_auth_attempts_left AS auth_attempts_left" 94 ",out_client_redirect_uri AS client_redirect_uri" 95 ",out_address_refused AS address_refused" 96 ",out_solved AS solved" 97 " FROM challenger_do_challenge_set_address_and_pin" 98 " ($1,$2,$3,$4,$5);"); 99 qs = GNUNET_PQ_eval_prepared_singleton_select (ctx->conn, 100 "do_challenge_set_address_and_pin", 101 params, 102 rs); 103 if (qs <= 0) 104 return qs; 105 if (not_found) 106 return GNUNET_DB_STATUS_SUCCESS_NO_RESULTS; 107 return qs; 108 }