challenger

OAuth 2.0-based authentication service that validates user can receive messages at a certain address
Log | Files | Refs | Submodules | README | LICENSE

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 $$;