challenger_do_challenge_set_address_and_pin.sql (3965B)
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 DROP FUNCTION IF EXISTS challenger_do_challenge_set_address_and_pin; 19 CREATE FUNCTION challenger_do_challenge_set_address_and_pin ( 20 IN in_nonce BYTEA, 21 IN in_address TEXT, 22 -- Newest last_tx_time for which a (re)transmission is still due, that is 23 -- 'now - retransmission_frequency'. Computed by the caller because 24 -- last_tx_time is only known here; see challenge_set_address_and_pin.c. 25 IN in_retransmit_cutoff INT8, 26 IN in_now INT8, 27 IN in_tan INT4, 28 OUT out_not_found BOOLEAN, 29 OUT out_last_tx_time INT8, 30 OUT out_last_pin INT4, 31 OUT out_state TEXT, 32 OUT out_pin_transmit BOOLEAN, 33 OUT out_auth_attempts_left INT4, 34 OUT out_client_redirect_uri TEXT, 35 OUT out_address_refused BOOLEAN, 36 OUT out_solved BOOLEAN) 37 LANGUAGE plpgsql 38 AS $$ 39 DECLARE 40 my_status RECORD; 41 my_do_update BOOL; 42 BEGIN 43 44 my_do_update = FALSE; 45 46 SELECT address 47 ,address_attempts_left 48 ,pin_transmissions_left 49 ,last_tx_time 50 ,client_redirect_uri 51 ,last_pin 52 ,auth_attempts_left 53 ,client_state 54 INTO my_status 55 FROM validations 56 WHERE nonce=in_nonce 57 AND expiration_time > in_now 58 FOR UPDATE; 59 60 IF NOT FOUND 61 THEN 62 out_not_found=TRUE; 63 out_last_tx_time=0; 64 out_last_pin=0; 65 out_pin_transmit=FALSE; 66 out_auth_attempts_left=0; 67 out_client_redirect_uri=NULL; 68 out_address_refused=TRUE; 69 out_solved=FALSE; 70 out_state=NULL; 71 RETURN; 72 END IF; 73 out_not_found=FALSE; 74 out_last_tx_time=my_status.last_tx_time; 75 out_last_pin=my_status.last_pin; 76 out_pin_transmit=FALSE; 77 out_auth_attempts_left=my_status.auth_attempts_left; 78 out_state=my_status.client_state; 79 out_client_redirect_uri=my_status.client_redirect_uri; 80 81 IF ( 0 > my_status.auth_attempts_left ) -- this challenge is solved 82 THEN 83 out_address_refused=TRUE; 84 out_solved=TRUE; 85 out_auth_attempts_left=0; 86 RETURN; 87 END IF; 88 out_solved=FALSE; 89 90 IF ( (0 = my_status.address_attempts_left) AND 91 (in_address != my_status.address) ) 92 THEN 93 out_address_refused=TRUE; 94 out_last_pin=0; 95 RETURN; 96 END IF; 97 out_address_refused=FALSE; 98 99 IF ( (my_status.address IS NULL) OR 100 (in_address != my_status.address) ) 101 THEN 102 -- we are changing the address, update counters 103 my_status.address_attempts_left 104 = GREATEST(0,my_status.address_attempts_left - 1); 105 my_status.address = in_address; 106 my_status.pin_transmissions_left = 3; 107 my_status.last_tx_time = 0; 108 my_do_update=TRUE; 109 END IF; 110 111 IF ( (my_status.pin_transmissions_left > 0) AND 112 (my_status.last_tx_time <= in_retransmit_cutoff) ) 113 THEN 114 -- enough time has passed since the last transmission, so 115 -- we are changing the PIN, update counters 116 my_status.pin_transmissions_left = my_status.pin_transmissions_left - 1; 117 my_status.last_pin = in_tan; 118 my_status.auth_attempts_left = 3; 119 my_status.last_tx_time = in_now; 120 out_auth_attempts_left = 3; 121 out_pin_transmit=TRUE; 122 out_last_pin = in_tan; 123 out_last_tx_time = in_now; 124 my_do_update=TRUE; 125 END IF; 126 127 IF my_do_update 128 THEN 129 UPDATE validations SET 130 address=my_status.address 131 ,address_attempts_left=my_status.address_attempts_left 132 ,pin_transmissions_left=my_status.pin_transmissions_left 133 ,last_tx_time=my_status.last_tx_time 134 ,last_pin=my_status.last_pin 135 ,auth_attempts_left=my_status.auth_attempts_left 136 WHERE nonce=in_nonce; 137 END IF; 138 139 RETURN; 140 141 END $$;