challenger_do_challenge_set_address_and_pin.sql (3547B)
1 -- 2 -- This file is part of TALER 3 -- Copyright (C) 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 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 18 CREATE OR REPLACE FUNCTION challenger_do_challenge_set_address_and_pin ( 19 IN in_nonce BYTEA, 20 IN in_address TEXT, 21 IN in_next_tx_time INT8, 22 IN in_now INT8, 23 IN in_tan INT4, 24 OUT out_not_found BOOLEAN, 25 OUT out_last_tx_time INT8, 26 OUT out_last_pin INT4, 27 OUT out_state TEXT, 28 OUT out_pin_transmit BOOLEAN, 29 OUT out_auth_attempts_left INT4, 30 OUT out_client_redirect_uri TEXT, 31 OUT out_address_refused BOOLEAN, 32 OUT out_solved BOOLEAN) 33 LANGUAGE plpgsql 34 AS $$ 35 DECLARE 36 my_status RECORD; 37 my_do_update BOOL; 38 BEGIN 39 40 my_do_update = FALSE; 41 42 SELECT address 43 ,address_attempts_left 44 ,pin_transmissions_left 45 ,last_tx_time 46 ,client_redirect_uri 47 ,last_pin 48 ,auth_attempts_left 49 ,client_state 50 INTO my_status 51 FROM validations 52 WHERE nonce=in_nonce; 53 54 IF NOT FOUND 55 THEN 56 out_not_found=TRUE; 57 out_last_tx_time=0; 58 out_last_pin=0; 59 out_pin_transmit=FALSE; 60 out_auth_attempts_left=0; 61 out_client_redirect_uri=NULL; 62 out_address_refused=TRUE; 63 out_solved=FALSE; 64 out_state=NULL; 65 RETURN; 66 END IF; 67 out_not_found=FALSE; 68 out_last_tx_time=my_status.last_tx_time; 69 out_last_pin=my_status.last_pin; 70 out_pin_transmit=FALSE; 71 out_auth_attempts_left=my_status.auth_attempts_left; 72 out_state=my_status.client_state; 73 out_client_redirect_uri=my_status.client_redirect_uri; 74 75 IF ( 0 > my_status.auth_attempts_left ) -- this challenge is solved 76 THEN 77 out_address_refused=TRUE; 78 out_solved=TRUE; 79 out_auth_attempts_left=0; 80 RETURN; 81 END IF; 82 out_solved=FALSE; 83 84 IF ( (0 = my_status.address_attempts_left) AND 85 (in_address != my_status.address) ) 86 THEN 87 out_address_refused=TRUE; 88 out_last_pin=0; 89 RETURN; 90 END IF; 91 out_address_refused=FALSE; 92 93 IF ( (my_status.address IS NULL) OR 94 (in_address != my_status.address) ) 95 THEN 96 -- we are changing the address, update counters 97 my_status.address_attempts_left = my_status.address_attempts_left - 1; 98 my_status.address = in_address; 99 my_status.pin_transmissions_left = 3; 100 my_status.last_tx_time = 0; 101 my_do_update=TRUE; 102 END IF; 103 104 IF ( (my_status.pin_transmissions_left > 0) AND 105 (my_status.last_tx_time <= in_next_tx_time) ) 106 THEN 107 -- we are changing the PIN, update counters 108 my_status.pin_transmissions_left = my_status.pin_transmissions_left - 1; 109 my_status.last_pin = in_tan; 110 my_status.auth_attempts_left = 3; 111 my_status.last_tx_time = in_now; 112 out_auth_attempts_left = 3; 113 out_pin_transmit=TRUE; 114 out_last_pin = in_tan; 115 out_last_tx_time = in_now; 116 my_do_update=TRUE; 117 END IF; 118 119 IF my_do_update 120 THEN 121 UPDATE validations SET 122 address=my_status.address 123 ,address_attempts_left=my_status.address_attempts_left 124 ,pin_transmissions_left=my_status.pin_transmissions_left 125 ,last_tx_time=my_status.last_tx_time 126 ,last_pin=my_status.last_pin 127 ,auth_attempts_left=my_status.auth_attempts_left 128 WHERE nonce=$1; 129 END IF; 130 131 RETURN; 132 133 END $$;