exchange

Base system with REST service to issue digital coins, run by the payment service provider
Log | Files | Refs | Submodules | README | LICENSE

taler-exchange-helper-measure-validate-accepted-tos (5092B)


      1 #!/bin/bash
      2 #
      3 #  This file is part of TALER
      4 #  Copyright (C) 2024, 2025 Taler Systems SA
      5 #
      6 #  TALER is free software; you can redistribute it and/or modify it under the
      7 #  terms of the GNU General Public License as published by the Free Software
      8 #  Foundation; either version 3, or (at your option) any later version.
      9 #
     10 #  TALER is distributed in the hope that it will be useful, but WITHOUT ANY
     11 #  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
     12 #  A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
     13 #
     14 #  You should have received a copy of the GNU General Public License along with
     15 #  TALER; see the file COPYING.  If not, If not, see <http://www.gnu.org/license>
     16 #
     17 
     18 # Hard error reporting on.
     19 set -eu
     20 
     21 
     22 # Exit, with error message (hard failure)
     23 function exit_fail() {
     24     echo " FAIL: " "$@" >&2
     25     EXIT_STATUS=1
     26     exit "$EXIT_STATUS"
     27 }
     28 
     29 CONF="$HOME/.config/taler-exchange.conf"
     30 VERBOSE=0
     31 
     32 while getopts 'ac:hirvV' OPTION;
     33 do
     34     case "$OPTION" in
     35         a)
     36             # Terms of service status is required.
     37             echo "ACCEPTED_TERMS_OF_SERVICE"
     38             exit 0
     39             ;;
     40         c)
     41             # shellcheck disable=SC2034
     42             CONF="$OPTARG"
     43             ;;
     44         h)
     45             echo "This is a KYC measure program that lifts restrictions after the terms of service were accepted. Expiration rules are set based on the context."
     46             echo 'Supported options:'
     47             echo '  -a           -- show required attributes'
     48             # shellcheck disable=SC2016
     49             echo '  -c $CONF     -- set configuration'
     50             echo '  -h           -- print this help'
     51             echo '  -i           -- show required inputs'
     52             echo '  -r           -- show required context'
     53             echo '  -v           -- show version'
     54             echo '  -V           -- be verbose'
     55             exit 0
     56             ;;
     57         i)
     58             # Need context and current_rules.
     59             echo "attributes"
     60             echo "context"
     61             echo "current_rules"
     62             exit 0
     63             ;;
     64         r)
     65             # What to do next?
     66             echo "validity_years"
     67             echo "successor_measure"
     68             exit 0
     69             ;;
     70         v)
     71             echo "$0 v0.0.2"
     72             exit 0
     73             ;;
     74         V)
     75             VERBOSE=1
     76             ;;
     77         ?)
     78         exit_fail "Unrecognized command line option"
     79         ;;
     80     esac
     81 done
     82 
     83 if [ 1 = "$VERBOSE" ]
     84 then
     85     echo "Running $0" 1>&2
     86 fi
     87 
     88 # See https://docs.taler.net/taler-kyc-manual.html#tsref-type-AmlProgramInput
     89 # for the full JSON with possible inputs.
     90 
     91 # First, extract inputs we need
     92 INPUTS=$(jq '{"current_rules":.current_rules,"attributes":.attributes,"context":.context}')
     93 
     94 # Check form ID, must be 'accept-tos'
     95 FORM_ID=$(echo "$INPUTS" | jq -r '.attributes.FORM_ID')
     96 
     97 # The 'form' here should be the accept TOS form
     98 if [ "$FORM_ID" != "accept-tos" ]
     99 then
    100     echo "Unexpected form ID $FORM_ID" 1>&2
    101     echo "$INPUTS" | exec taler-exchange-helper-measure-freeze
    102     exit 1
    103 fi
    104 
    105 echo "$INPUTS" \
    106     | jq '.attributes' \
    107     | jq -r 'def get($k):
    108          if has($k)
    109             then .[$k]
    110             else error("attribute missing")
    111          end;
    112         {"DOWNLOADED_TERMS_OF_SERVICE":get("DOWNLOADED_TERMS_OF_SERVICE"),
    113          "ACCEPTED_TERMS_OF_SERVICE":get("ACCEPTED_TERMS_OF_SERVICE")}' \
    114     > /dev/null \
    115     || exec taler-exchange-helper-measure-freeze
    116 
    117 # Get ToS acceptance confirmation.
    118 TOS_ACCEPTED=$(echo "$INPUTS" | jq '.attributes.ACCEPTED_TERMS_OF_SERVICE // null')
    119 # Get current rules.
    120 CURRENT_RULES=$(echo "$INPUTS" | jq '.current_rules // null')
    121 # Get context values.
    122 VALIDITY_YEARS=$(echo "$INPUTS" | jq -r '.context.validity_years')
    123 # Convert to seconds after epoch
    124 EXPIRATION_STAMP=$((VALIDITY_YEARS * 365 * 24 * 60 * 60 + $(date +%s)))
    125 # Convert to GNUnet-style JSON timestamp
    126 EXPIRATION_TIME=$(jq -n --argjson es "$EXPIRATION_STAMP" '{"t_s":$es}')
    127 
    128 SUCCESSOR_MEASURE=$(echo "$INPUTS" | jq '.context.successor_measure // .current_rules.successor_measure // null')
    129 CUSTOM_MEASURES=$(echo "$INPUTS" | jq '.context.custom_measures // null')
    130 
    131 # Validate accepted ToS version
    132 if eval echo "$TOS_ACCEPTED" | grep "${EXCHANGE_AML_PROGRAM_TOPS_ENABLE_DEPOSITS_TOS_NAME}" > /dev/null
    133 then
    134     # Valid ToS acceptance
    135     # Remove limitation from current rules.
    136     NEW_RULES=$(echo "$CURRENT_RULES" | jq '(.rules[] |= if (.measures[0]=="accept-tos") then del(.) else . end)')
    137 else
    138     # Invalid ToS version
    139     echo "Version of accepted ToS ${TOS_ACCEPTED} invalid, wanted ${EXCHANGE_AML_PROGRAM_TOPS_ENABLE_DEPOSITS_TOS_NAME}." 1>&2
    140     NEW_RULES="$CURRENT_RULES"
    141 fi
    142 
    143 set -x
    144 
    145 # Finally, output the new rules.
    146 # See https://docs.taler.net/taler-kyc-manual.html#tsref-type-AmlOutcome
    147 # for the required output format.
    148 jq -n \
    149     --argjson et "$EXPIRATION_TIME" \
    150     --argjson sm "$SUCCESSOR_MEASURE" \
    151     --argjson cm "$CUSTOM_MEASURES" \
    152     --argjson nr "$NEW_RULES" \
    153     '{"new_rules":($nr+{"expiration_time":$et,"successor_measure":$sm,"custom_measures":({}+$cm)})}|del(..|nulls)'
    154 
    155 exit 0