diff --git a/src/auditor/Makefile.am b/src/auditor/Makefile.am index c19005c79..eb8025a6c 100644 --- a/src/auditor/Makefile.am +++ b/src/auditor/Makefile.am @@ -218,6 +218,7 @@ EXTRA_DIST = \ taler-auditor.in \ taler-helper-auditor-render.py \ auditor.conf \ + setup.sh \ test-sync-in.conf \ test-sync-out.conf \ generate-auditor-basedb.sh \ diff --git a/src/auditor/generate-auditor-basedb.conf b/src/auditor/generate-auditor-basedb.conf index 4c34ad052..9cc329c8f 100644 --- a/src/auditor/generate-auditor-basedb.conf +++ b/src/auditor/generate-auditor-basedb.conf @@ -1,14 +1,27 @@ -[exchange-offline] -MASTER_PRIV_FILE = auditor-basedb.mpriv +[PATHS] +TALER_CACHE_HOME = $TALER_HOME/.cache/taler/ +TALER_CONFIG_HOME = $TALER_HOME/.config/taler/ +TALER_DATA_HOME = $TALER_HOME/.local/share/taler/ +TALER_HOME = ${PWD}/generate_auditordb_home/ -[instance-default] -KEYFILE = ${TALER_DATA_HOME}/merchant/default.priv -NAME = Merchant Inc. +[taler] +CURRENCY = TESTKUDOS +CURRENCY_ROUND_UNIT = TESTKUDOS:0.01 + +[exchange] +MASTER_PUBLIC_KEY = M4FGP18EQFXFGGFQ1AWXHACN2JX0SMVK9CNF6459Z1WG18JSN0BG +SIGNKEY_DURATION = 4 weeks +LOOKAHEAD_SIGN = 32 weeks 1 day +SIGNKEY_LEGAL_DURATION = 4 weeks +AML_THRESHOLD = TESTKUDOS:1000000 + +[exchangedb-postgres] +CONFIG = postgres:///auditor-basedb [exchange-account-1] PAYTO_URI = payto://iban/SANDBOXX/DE989651?receiver-name=Exchange+Company -enable_debit = yes -enable_credit = yes +ENABLE_DEBIT = YES +ENABLE_CREDIT = YES [exchange-accountcredentials-1] WIRE_GATEWAY_URL = http://localhost:8082/facades/test-facade/taler-wire-gateway/ @@ -16,24 +29,38 @@ WIRE_GATEWAY_AUTH_METHOD = basic USERNAME = exchange PASSWORD = x -[merchant-account-merchant] -PAYTO_URI = payto://x-taler-bank/localhost/42 -HONOR_default = YES -ACTIVE_default = YES +[merchant] +WIREFORMAT = default +DEFAULT_MAX_DEPOSIT_FEE = TESTKUDOS:0.1 +KEYFILE = ${TALER_DATA_HOME}/merchant/merchant.priv +DEFAULT_MAX_WIRE_FEE = TESTKUDOS:0.10 +WIRE_TRANSFER_DELAY = 1 minute +FORCE_AUDIT = YES + +[merchantdb-postgres] +CONFIG = postgres:///auditor-basedb [merchant-exchange-default] -MASTER_KEY = RKNMPRGXCX35H11WEYXDXYHPR7NX2QK9BG15MT0QEF75PC5KR470 +MASTER_KEY = M4FGP18EQFXFGGFQ1AWXHACN2JX0SMVK9CNF6459Z1WG18JSN0BG EXCHANGE_BASE_URL = http://localhost:8081/ CURRENCY = TESTKUDOS -[payments-generator] -currency = TESTKUDOS -instance = default -bank = http://localhost:8082/ -merchant = http://localhost:9966/ -exchange_admin = http://localhost:18080/ -exchange-admin = http://localhost:18080/ -exchange = http://localhost:8081/ +[bank] +HTTP_PORT = 8082 + +[libeufin-nexus] +DB_CONNECTION="jdbc:postgresql://localhost/auditor-basedb?socketFactory=org.newsclub.net.unix.AFUNIXSocketFactory$FactoryArg&socketFactoryArg=/var/run/postgresql/.s.PGSQL.5432" + +[libeufin-sandbox] +DB_CONNECTION="jdbc:postgresql://localhost/auditor-basedb?socketFactory=org.newsclub.net.unix.AFUNIXSocketFactory$FactoryArg&socketFactoryArg=/var/run/postgresql/.s.PGSQL.5432" + +[auditor] +BASE_URL = http://localhost:8083/ +TINY_AMOUNT = TESTKUDOS:0.01 +PUBLIC_KEY = 0EHPW5WEKHXPPN4MPJNGA7Z6D29JP21GKVNV8ARFB1YW7WWJX20G + +[auditordb-postgres] +CONFIG = postgres:///auditor-basedb [coin_kudos_ct_1] value = TESTKUDOS:0.01 @@ -130,61 +157,3 @@ fee_refresh = TESTKUDOS:0.03 fee_refund = TESTKUDOS:0.01 CIPHER = RSA rsa_keysize = 1024 - -[benchmark] -BANK_DETAILS = bank_details.json -MERCHANT_DETAILS = merchant_details.json - -[arm] -CONFIG = /research/taler/exchange/src/auditor/auditor-basedb.conf - -[taler] -CURRENCY_ROUND_UNIT = TESTKUDOS:0.01 -CURRENCY = TESTKUDOS -AML_THRESHOLD = TESTKUDOS:1000000 - -[merchantdb-postgres] -CONFIG = postgres:///auditor-basedb - -[merchant] -WIREFORMAT = default -DEFAULT_MAX_DEPOSIT_FEE = TESTKUDOS:0.1 -KEYFILE = ${TALER_DATA_HOME}/merchant/merchant.priv -DEFAULT_MAX_WIRE_FEE = TESTKUDOS:0.10 -WIRE_TRANSFER_DELAY = 1 minute -FORCE_AUDIT = YES -UNIXPATH = ${TALER_RUNTIME_DIR}/merchant.http - -[exchangedb-postgres] -CONFIG = postgres:///auditor-basedb - -[exchange] -MASTER_PUBLIC_KEY = RKNMPRGXCX35H11WEYXDXYHPR7NX2QK9BG15MT0QEF75PC5KR470 -SIGNKEY_DURATION = 4 weeks -LOOKAHEAD_SIGN = 32 weeks 1 day -SIGNKEY_LEGAL_DURATION = 4 weeks -UNIXPATH = ${TALER_RUNTIME_DIR}/exchange.http - -[bank] -HTTP_PORT = 8082 -SUGGESTED_EXCHANGE = http://localhost:8081/ -SUGGESTED_EXCHANGE_PAYTO = payto://x-taler-bank/localhost/2 -ALLOW_REGISTRATIONS = YES -SERVE = http -MAX_DEBT_BANK = TESTKUDOS:100000.0 -MAX_DEBT = TESTKUDOS:50.0 -DATABASE = postgres:///auditor-basedb - -[auditordb-postgres] -CONFIG = postgres:///auditor-basedb - -[auditor] -BASE_URL = http://localhost:8083/ -TINY_AMOUNT = TESTKUDOS:0.01 -PUBLIC_KEY = 0EHPW5WEKHXPPN4MPJNGA7Z6D29JP21GKVNV8ARFB1YW7WWJX20G - -[PATHS] -TALER_CACHE_HOME = $TALER_HOME/.cache/taler/ -TALER_CONFIG_HOME = $TALER_HOME/.config/taler/ -TALER_DATA_HOME = $TALER_HOME/.local/share/taler/ -TALER_HOME = ${PWD}/generate_auditordb_home/ diff --git a/src/auditor/generate-auditor-basedb.sh b/src/auditor/generate-auditor-basedb.sh index 95fc2216c..2dc2b2a48 100755 --- a/src/auditor/generate-auditor-basedb.sh +++ b/src/auditor/generate-auditor-basedb.sh @@ -1,412 +1,61 @@ #!/bin/bash -# Script to generate the basic database for auditor -# testing from a 'correct' interaction between exchange, -# wallet and merchant. +# This file is in the public domain. # -# Creates $BASEDB.sql, $BASEDB.fees, -# $BASEDB.{mpub,mpriv}. -# Default $BASEDB is "auditor-basedb", override via $1. +# Script to generate the basic database for auditor testing from a 'correct' +# interaction between exchange, wallet and merchant. # -# Currently must be run online as it interacts with -# bank.test.taler.net; also requires the wallet CLI -# to be installed and in the path. Furthermore, the -# user running this script must be Postgres superuser -# and be allowed to create/drop databases. +# Creates "$1.sql". +# +# Requires the wallet CLI to be installed and in the path. Furthermore, the +# user running this script must be Postgres superuser and be allowed to +# create/drop databases. # set -eu -#set -x -# Cleanup to run whenever we exit -function exit_cleanup() -{ - echo "Running generate-auditor-basedb exit cleanup logic..." - if test -f ${MY_TMP_DIR:-/}/libeufin-sandbox.pid - then - PID=`cat ${MY_TMP_DIR}/libeufin-sandbox.pid 2> /dev/null` - kill $PID 2> /dev/null || true - rm ${MY_TMP_DIR}/libeufin-sandbox.pid - echo "Killed libeufin sandbox $PID" - wait $PID || true - fi - if test -f ${MY_TMP_DIR:-/}/libeufin-nexus.pid - then - PID=`cat ${MY_TMP_DIR}/libeufin-nexus.pid 2> /dev/null` - kill $PID 2> /dev/null || true - rm ${MY_TMP_DIR}/libeufin-nexus.pid - echo "Killed libeufin nexus $PID" - wait $PID || true - fi - echo "killing libeufin DONE" - for n in `jobs -p` - do - kill $n 2> /dev/null || true - done - wait || true -} - -# Install cleanup handler (except for kill -9) -trap exit_cleanup EXIT - - -# Exit, with status code "skip" (no 'real' failure) -function exit_skip() { - echo "SKIPPING: $1" - exit 77 -} # Where do we write the result? -BASEDB=${1:-"auditor-basedb"} -# Name of the Postgres database we will use for the script. -# Will be dropped, do NOT use anything that might be used -# elsewhere -export TARGET_DB=`basename ${BASEDB}` +BASEDB="$1" -export WALLET_DB=${BASEDB:-"wallet"}.wdb +. setup.sh -# delete existing wallet database -rm -f $WALLET_DB - -# Configuration file will be edited, so we create one -# from the template. -export CONF=$1.conf -cp generate-auditor-basedb.conf $CONF -echo "Created configuration at ${CONF}" -DATA_DIR=$1/exchange-data-dir/ -mkdir -p $DATA_DIR -taler-config -c $CONF -s PATHS -o TALER_HOME -V $DATA_DIR - -echo -n "Testing for libeufin" -libeufin-cli --help >/dev/null /dev/null /dev/null /dev/null 2>/dev/null || true -createdb $TARGET_DB || exit_skip "Could not create database $TARGET_DB" -ORIGIN=`pwd` -MY_TMP_DIR=`dirname $1` +echo -n "Reset 'auditor-basedb' database ..." +dropdb "auditor-basedb" >/dev/null 2>/dev/null || true +createdb "auditor-basedb" || exit_skip "Could not create database '$BASEDB'" +echo " DONE" + +# Launch exchange, merchant and bank. +setup -c "$CONF" \ + -aenmsw \ + -d "iban" # obtain key configuration data -MASTER_PRIV_FILE=$1.mpriv -MASTER_PRIV_DIR=`dirname $MASTER_PRIV_FILE` -taler-config -f -c ${CONF} -s exchange-offline -o MASTER_PRIV_FILE -V ${MASTER_PRIV_FILE} -rm -f "${MASTER_PRIV_FILE}" -mkdir -p $MASTER_PRIV_DIR -gnunet-ecc -l/dev/null -g1 $MASTER_PRIV_FILE > /dev/null -export MASTER_PUB=`gnunet-ecc -p $MASTER_PRIV_FILE` -export EXCHANGE_URL=`taler-config -c $CONF -s EXCHANGE -o BASE_URL` -MERCHANT_PORT=`taler-config -c $CONF -s MERCHANT -o PORT` -export MERCHANT_URL=http://localhost:${MERCHANT_PORT}/ -BANK_PORT=`taler-config -c $CONF -s BANK -o HTTP_PORT` +EXCHANGE_URL=$(taler-config -c "$CONF" -s EXCHANGE -o BASE_URL) +MERCHANT_PORT=$(taler-config -c "$CONF" -s MERCHANT -o PORT) +MERCHANT_URL="http://localhost:${MERCHANT_PORT}/" +BANK_PORT=$(taler-config -c "$CONF" -s BANK -o HTTP_PORT) BANK_URL="http://localhost:1${BANK_PORT}" -export AUDITOR_URL=http://localhost:8083/ -AUDITOR_PRIV_FILE=$1.apriv -AUDITOR_PRIV_DIR=`dirname $AUDITOR_PRIV_FILE` -taler-config -f -c ${CONF} -s auditor -o AUDITOR_PRIV_FILE -V ${AUDITOR_PRIV_FILE} -mkdir -p $AUDITOR_PRIV_DIR -gnunet-ecc -l/dev/null -g1 $AUDITOR_PRIV_FILE > /dev/null -AUDITOR_PUB=`gnunet-ecc -p $AUDITOR_PRIV_FILE` - -echo "MASTER PUB is ${MASTER_PUB} using file ${MASTER_PRIV_FILE}" -echo "AUDITOR PUB is ${AUDITOR_PUB} using file ${AUDITOR_PRIV_FILE}" - -# patch configuration -taler-config -c $CONF -s exchange -o MASTER_PUBLIC_KEY -V $MASTER_PUB -taler-config -c $CONF -s auditor -o PUBLIC_KEY -V $AUDITOR_PUB -taler-config -c $CONF -s merchant-exchange-default -o MASTER_KEY -V $MASTER_PUB - -taler-config -c $CONF -s exchangedb-postgres -o CONFIG -V postgres:///$TARGET_DB -taler-config -c $CONF -s auditordb-postgres -o CONFIG -V postgres:///$TARGET_DB -taler-config -c $CONF -s merchantdb-postgres -o CONFIG -V postgres:///$TARGET_DB -taler-config -c $CONF -s bank -o database -V postgres:///$TARGET_DB - -# setup exchange -echo "Setting up exchange" -taler-exchange-dbinit -c $CONF - -echo "Setting up merchant" -taler-merchant-dbinit -c $CONF - -# setup auditor -echo "Setting up auditor" -taler-auditor-dbinit -c $CONF || exit_skip "Failed to initialize auditor DB" -taler-auditor-exchange -c $CONF -m $MASTER_PUB -u $EXCHANGE_URL || exit_skip "Failed to add exchange to auditor" - -# Launch services -echo "Launching services (pre audit DB: $TARGET_DB)" - -rm -rf ${TARGET_DB}-sandbox.sqlite3 -export LIBEUFIN_SANDBOX_DB_CONNECTION="jdbc:sqlite:${TARGET_DB}-sandbox.sqlite3" -# Create the default demobank. -cd $MY_TMP_DIR -export LIBEUFIN_SANDBOX_ADMIN_PASSWORD=secret -libeufin-sandbox config --currency "TESTKUDOS" default -libeufin-sandbox serve --port "1${BANK_PORT}" \ - > ${MY_TMP_DIR}/libeufin-sandbox-stdout.log \ - 2> ${MY_TMP_DIR}/libeufin-sandbox-stderr.log & -echo $! > ${MY_TMP_DIR}/libeufin-sandbox.pid -cd $ORIGIN -export LIBEUFIN_SANDBOX_URL="http://localhost:1${BANK_PORT}" -set +e -echo -n "Waiting for Sandbox..." -OK=0 -for n in `seq 1 100`; do - echo -n "." - sleep 1 - if wget --timeout=1 \ - --user admin --password secret --auth-no-challenge \ - --tries=3 --waitretry=0 \ - -o /dev/null -O /dev/null \ - ${LIBEUFIN_SANDBOX_URL}; - then - OK=1 - break - fi -done -if test $OK != 1 -then - exit_skip " Failed to launch sandbox" -fi -echo "OK" - -register_sandbox_account() { - export LIBEUFIN_SANDBOX_USERNAME=$1 - export LIBEUFIN_SANDBOX_PASSWORD=$2 - cd $MY_TMP_DIR - libeufin-cli sandbox \ - demobank \ - register --name "$3" - cd $ORIGIN - unset LIBEUFIN_SANDBOX_USERNAME - unset LIBEUFIN_SANDBOX_PASSWORD -} -set -e -echo -n "Register the 'fortytwo' Sandbox user.." -register_sandbox_account fortytwo x "Forty Two" -echo OK -echo -n "Register the 'fortythree' Sandbox user.." -register_sandbox_account fortythree x "Forty Three" -echo OK -echo -n "Register 'exchange' Sandbox user.." -register_sandbox_account exchange x "Exchange Company" -echo OK -echo -n "Specify exchange's PAYTO_URI in the config ..." -export LIBEUFIN_SANDBOX_USERNAME=exchange -export LIBEUFIN_SANDBOX_PASSWORD=x -cd $MY_TMP_DIR -PAYTO=`libeufin-cli sandbox demobank info --bank-account exchange | jq --raw-output '.paytoUri'` -taler-config -c $CONF -s exchange-account-1 -o PAYTO_URI -V $PAYTO -echo " OK" -echo -n "Setting this exchange as the bank's default ..." -EXCHANGE_PAYTO=`libeufin-cli sandbox demobank info --bank-account exchange | jq --raw-output '.paytoUri'` -libeufin-sandbox default-exchange "$EXCHANGE_URL" "$EXCHANGE_PAYTO" -echo " OK" -# Prepare EBICS: create Ebics host and Exchange subscriber. -# Shortly becoming admin to setup Ebics. -export LIBEUFIN_SANDBOX_USERNAME=admin -export LIBEUFIN_SANDBOX_PASSWORD=secret -echo -n "Create EBICS host at Sandbox.." -libeufin-cli sandbox \ - --sandbox-url "http://localhost:1${BANK_PORT}" \ - ebicshost create --host-id "talerebics" -echo "OK" -echo -n "Create exchange EBICS subscriber at Sandbox.." -libeufin-cli sandbox \ - demobank new-ebicssubscriber --host-id talerebics \ - --user-id exchangeebics --partner-id talerpartner \ - --bank-account exchange # that's a username _and_ a bank account name -echo "OK" -unset LIBEUFIN_SANDBOX_USERNAME -unset LIBEUFIN_SANDBOX_PASSWORD -# Prepare Nexus, which is the side actually talking -# to the exchange. -rm -rf ${TARGET_DB}-nexus.sqlite3 -export LIBEUFIN_NEXUS_DB_CONNECTION="jdbc:sqlite:${TARGET_DB}-nexus.sqlite3" -# For convenience, username and password are -# identical to those used at the Sandbox. -echo -n "Create exchange Nexus user..." -libeufin-nexus superuser exchange --password x -echo " OK" -libeufin-nexus serve --port ${BANK_PORT} \ - 2> ${MY_TMP_DIR}/libeufin-nexus-stderr.log \ - > ${MY_TMP_DIR}/libeufin-nexus-stdout.log & -echo $! > ${MY_TMP_DIR}/libeufin-nexus.pid -export LIBEUFIN_NEXUS_URL="http://localhost:${BANK_PORT}" -echo -n "Waiting for Nexus..." -set +e -OK=0 -for n in `seq 1 50`; do - echo -n "." - sleep 1 - if wget --timeout=1 \ - --tries=3 --waitretry=0 \ - -o /dev/null -O /dev/null \ - $LIBEUFIN_NEXUS_URL; - then - OK=1 - break - fi -done -if test $OK != 1 -then - exit_skip " Failed to launch Nexus at $LIBEUFIN_NEXUS_URL" -fi -set -e -echo "OK" -export LIBEUFIN_NEXUS_USERNAME=exchange -export LIBEUFIN_NEXUS_PASSWORD=x -echo -n "Creating an EBICS connection at Nexus..." -libeufin-cli connections new-ebics-connection \ - --ebics-url "http://localhost:1${BANK_PORT}/ebicsweb" \ - --host-id "talerebics" \ - --partner-id "talerpartner" \ - --ebics-user-id "exchangeebics" \ - talerconn -echo "OK" -echo -n "Setup EBICS keying..." -libeufin-cli connections connect "talerconn" > /dev/null -echo "OK" -echo -n "Download bank account name from Sandbox..." -libeufin-cli connections download-bank-accounts "talerconn" -echo "OK" -echo -n "Importing bank account info into Nexus..." -libeufin-cli connections import-bank-account \ - --offered-account-id "exchange" \ - --nexus-bank-account-id "exchange-nexus" \ - "talerconn" -echo "OK" -echo -n "Setup payments submission task..." -# Tries every second. -libeufin-cli accounts task-schedule \ - --task-type submit \ - --task-name "exchange-payments" \ - --task-cronspec "* * *" \ - "exchange-nexus" -echo "OK" -# Tries every second. Ask C52 -echo -n "Setup history fetch task..." -libeufin-cli accounts task-schedule \ - --task-type fetch \ - --task-name "exchange-history" \ - --task-cronspec "* * *" \ - --task-param-level report \ - --task-param-range-type latest \ - "exchange-nexus" -echo "OK" -# create Taler facade. -echo -n "Create the Taler facade at Nexus..." -libeufin-cli facades \ - new-taler-wire-gateway-facade \ - --currency "TESTKUDOS" --facade-name "test-facade" \ - "talerconn" "exchange-nexus" -echo "OK" -cd $ORIGIN -# Facade schema: http://localhost:$BANK_PORT/facades/test-facade/taler-wire-gateway/ - - -TFN=`which taler-exchange-httpd` -TBINPFX=`dirname $TFN` -TLIBEXEC=${TBINPFX}/../lib/taler/libexec/ -taler-exchange-secmod-eddsa -c $CONF 2> ${MY_TMP_DIR}/taler-exchange-secmod-eddsa.log & -taler-exchange-secmod-rsa -c $CONF 2> ${MY_TMP_DIR}/taler-exchange-secmod-rsa.log & -taler-exchange-secmod-cs -c $CONF 2> ${MY_TMP_DIR}/taler-exchange-secmod-cs.log & -taler-exchange-httpd -c $CONF 2> ${MY_TMP_DIR}/taler-exchange-httpd.log & -taler-merchant-httpd -c $CONF -L INFO 2> ${MY_TMP_DIR}/taler-merchant-httpd.log & -taler-exchange-wirewatch -c $CONF 2> ${MY_TMP_DIR}/taler-exchange-wirewatch.log & -taler-auditor-httpd -L INFO -c $CONF 2> ${MY_TMP_DIR}/taler-auditor-httpd.log & -export BANK_PORT -export EXCHANGE_URL -export MERCHANT_URL -export AUDITOR_URL - -echo -n "Waiting for services to be available " -# Wait for all bank to be available (usually the slowest) -for n in `seq 1 50` -do - echo -n "." - sleep 0.2 - OK=0 - # bank - wget http://localhost:${BANK_PORT}/ -o /dev/null -O /dev/null >/dev/null || continue - OK=1 - break -done - -if [ 1 != $OK ] -then - exit_skip "Failed to launch services (bank)" -fi - -# Wait for all services to be available -for n in `seq 1 50` -do - echo -n "." - sleep 0.1 - OK=0 - # exchange - wget ${EXCHANGE_URL}seed -o /dev/null -O /dev/null >/dev/null || continue - # merchant - wget ${MERCHANT_URL} -o /dev/null -O /dev/null >/dev/null || continue - # Auditor - wget ${AUDITOR_URL} -o /dev/null -O /dev/null >/dev/null || continue - OK=1 - break -done - -if [ 1 != $OK ] -then - bash - exit_skip "Failed to launch services (Taler)" -fi -echo -n "Setting up keys" -taler-exchange-offline -c $CONF \ - download sign \ - enable-account `taler-config -c $CONF -s exchange-account-1 -o PAYTO_URI` \ - enable-auditor $AUDITOR_PUB $AUDITOR_URL "TESTKUDOS Auditor" \ - wire-fee now iban TESTKUDOS:0.07 TESTKUDOS:0.01 \ - global-fee now TESTKUDOS:0.01 TESTKUDOS:0.01 TESTKUDOS:0.01 1h 1year 5 \ - upload &> ${MY_TMP_DIR}/taler-exchange-offline.log - -echo -n "." - -for n in `seq 1 2` -do - echo -n "." - OK=0 - wget --timeout=1 http://localhost:8081/keys -o /dev/null -O /dev/null >/dev/null || continue - OK=1 - break -done - -if [ 1 != $OK ] -then - exit_skip "Failed to setup keys" -fi - -echo " DONE" -echo -n "Adding auditor signatures ..." - -taler-auditor-offline -c $CONF \ - download sign upload &> ${MY_TMP_DIR}/taler-auditor-offline.log - -echo " DONE" -# Setup merchant - -echo -n "Setting up merchant" - -curl -H "Content-Type: application/json" -X POST -d '{"auth":{"method":"external"},"accounts":[{"payto_uri":"payto://iban/SANDBOXX/DE474361?receiver-name=Merchant43"}],"id":"default","name":"default","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1", "default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us" : 3600000000},"default_pay_delay":{"d_us": 3600000000}}' http://localhost:9966/management/instances - +echo -n "Setting up merchant ..." +curl -H "Content-Type: application/json" -X POST -d '{"auth":{"method":"external"},"accounts":[{"payto_uri":"payto://iban/SANDBOXX/DE474361?receiver-name=Merchant43"}],"id":"default","name":"default","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1", "default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us" : 3600000000},"default_pay_delay":{"d_us": 3600000000}}' "${MERCHANT_URL}management/instances" echo " DONE" -# run wallet CLI -echo "Running wallet" +# delete existing wallet database +export WALLET_DB="wallet.wdb" +rm -f "$WALLET_DB" -taler-wallet-cli --no-throttle --wallet-db=$WALLET_DB api --expect-success 'runIntegrationTest' \ +echo -n "Running wallet ..." +taler-wallet-cli \ + --no-throttle \ + --wallet-db="$WALLET_DB" \ + api \ + --expect-success \ + 'runIntegrationTest' \ "$(jq -n ' { amountToSpend: "TESTKUDOS:4", @@ -418,28 +67,25 @@ taler-wallet-cli --no-throttle --wallet-db=$WALLET_DB api --expect-success 'runI --arg MERCHANT_URL "$MERCHANT_URL" \ --arg EXCHANGE_URL "$EXCHANGE_URL" \ --arg BANK_URL "$BANK_URL/demobanks/default/access-api/" - )" &> ${MY_TMP_DIR}/taler-wallet-cli.log - -echo "Shutting down services" -exit_cleanup + )" &> taler-wallet-cli.log +echo " DONE" # Dump database -echo "Dumping database ${BASEDB}(-libeufin).sql" -pg_dump -O $TARGET_DB | sed -e '/AS integer/d' > ${BASEDB}.sql -cd $MY_TMP_DIR -sqlite3 ${TARGET_DB}-nexus.sqlite3 ".dump" > ${BASEDB}-libeufin-nexus.sql -sqlite3 ${TARGET_DB}-sandbox.sqlite3 ".dump" > ${BASEDB}-libeufin-sandbox.sql -rm ${TARGET_DB}-sandbox.sqlite3 ${TARGET_DB}-nexus.sqlite3 # libeufin DB -cd $ORIGIN +mkdir -p "$(dirname "$BASEDB")" -echo $MASTER_PUB > ${BASEDB}.mpub +echo "Dumping database ${BASEDB}.sql" +pg_dump -O "auditor-basedb" | sed -e '/AS integer/d' > "${BASEDB}.sql" # clean up -echo "Final clean up" -dropdb $TARGET_DB +echo -n "Final clean up ..." +kill -TERM "$SETUP_PID" +wait +unset SETUP_PID +dropdb "auditor-basedb" +echo " DONE" echo "=====================================" -echo " Finished generation of $BASEDB" +echo "Finished generation of ${BASEDB}.sql" echo "=====================================" exit 0 diff --git a/src/auditor/generate-revoke-basedb.sh b/src/auditor/generate-revoke-basedb.sh index 745b96b72..4acfac280 100755 --- a/src/auditor/generate-revoke-basedb.sh +++ b/src/auditor/generate-revoke-basedb.sh @@ -8,405 +8,50 @@ set -eu # set -x -# Cleanup to run whenever we exit -function exit_cleanup() -{ - echo "Running generate-revoke-basedb exit cleanup logic..." - if test -f ${MY_TMP_DIR:-/}/libeufin-sandbox.pid - then - PID=`cat ${MY_TMP_DIR}/libeufin-sandbox.pid 2> /dev/null` - kill $PID 2> /dev/null || true - rm ${MY_TMP_DIR}/libeufin-sandbox.pid - echo "Killed libeufin sandbox $PID" - wait $PID || true - fi - if test -f ${MY_TMP_DIR}/libeufin-nexus.pid - then - PID=`cat ${MY_TMP_DIR}/libeufin-nexus.pid 2> /dev/null` - kill $PID 2> /dev/null || true - rm ${MY_TMP_DIR}/libeufin-nexus.pid - echo "Killed libeufin nexus $PID" - wait $PID || true - fi - echo "killing libeufin DONE" - for n in `jobs -p` - do - kill $n 2> /dev/null || true - done - wait -} +. setup.sh -function get_payto_uri() { - export LIBEUFIN_SANDBOX_USERNAME=$1 - export LIBEUFIN_SANDBOX_PASSWORD=$2 - export LIBEUFIN_SANDBOX_URL=$BANK_URL - cd $MY_TMP_DIR - libeufin-cli sandbox demobank info --bank-account $1 | jq --raw-output '.paytoUri' - cd $ORIGIN -} - -# Install cleanup handler (except for kill -9) -trap exit_cleanup EXIT - -# Exit, with status code "skip" (no 'real' failure) -function exit_skip() { - echo $1 - exit 77 -} - -# Where do we write the result? -export BASEDB=${1:-"revoke-basedb"} - -# Name of the Postgres database we will use for the script. -# Will be dropped, do NOT use anything that might be used -# elsewhere -export TARGET_DB=`basename ${BASEDB}` -TMP_DIR=`mktemp -d revocation-tmp-XXXXXX` -export WALLET_DB=wallet-revocation.json -rm -f $WALLET_DB - -# Configuration file will be edited, so we create one -# from the template. -export CONF=${BASEDB}.conf -cp generate-auditor-basedb.conf $CONF -echo "Created configuration at ${CONF}" -DATA_DIR=$1/exchange-data-dir/ -mkdir -p $DATA_DIR -taler-config -c $CONF -s PATHS -o TALER_HOME -V $DATA_DIR - -echo -n "Testing for libeufin(-cli)" -libeufin-cli --help >/dev/null /dev/null /dev/null /dev/null 2>/dev/null || true -createdb $TARGET_DB || exit_skip "Could not create database $TARGET_DB" -ORIGIN=`pwd` -MY_TMP_DIR=`dirname $1` +CONF="generate-auditor-basedb.conf" +# reset database +echo -n "Reset 'auditor-basedb' database ..." +dropdb "auditor-basedb" >/dev/null 2>/dev/null || true +createdb "auditor-basedb" || exit_skip "Could not create database '$BASEDB'" +echo " DONE" + +# Launch exchange, merchant and bank. +setup -c "$CONF" \ + -aenmsw \ + -d "iban" # obtain key configuration data -MASTER_PRIV_FILE=$1.mpriv -MASTER_PRIV_DIR=`dirname $MASTER_PRIV_FILE` -taler-config -f -c $CONF -s exchange-offline -o MASTER_PRIV_FILE -V ${MASTER_PRIV_FILE} -mkdir -p $MASTER_PRIV_DIR -rm -f "${MASTER_PRIV_FILE}" -gnunet-ecc -g1 $MASTER_PRIV_FILE > /dev/null -export MASTER_PUB=`gnunet-ecc -p $MASTER_PRIV_FILE` -export EXCHANGE_URL=`taler-config -c $CONF -s EXCHANGE -o BASE_URL` -MERCHANT_PORT=`taler-config -c $CONF -s MERCHANT -o PORT` -export MERCHANT_URL=http://localhost:${MERCHANT_PORT}/ -BANK_PORT=`taler-config -c $CONF -s BANK -o HTTP_PORT` -export BANK_URL=http://localhost:1${BANK_PORT} -export AUDITOR_URL=http://localhost:8083/ -AUDITOR_PRIV_FILE=$1.apriv -AUDITOR_PRIV_DIR=`dirname $AUDITOR_PRIV_FILE` -taler-config -f -c ${CONF} -s auditor -o AUDITOR_PRIV_FILE -V ${AUDITOR_PRIV_FILE} -mkdir -p $AUDITOR_PRIV_DIR -gnunet-ecc -l /dev/null -g1 $AUDITOR_PRIV_FILE > /dev/null -AUDITOR_PUB=`gnunet-ecc -p $AUDITOR_PRIV_FILE` +EXCHANGE_URL=$(taler-config -c "$CONF" -s EXCHANGE -o BASE_URL) +MERCHANT_PORT=$(taler-config -c "$CONF" -s MERCHANT -o PORT) +MERCHANT_URL="http://localhost:${MERCHANT_PORT}/" +BANK_PORT=$(taler-config -c "$CONF" -s BANK -o HTTP_PORT) +BANK_URL="http://localhost:1${BANK_PORT}" -echo "MASTER PUB is ${MASTER_PUB} using file ${MASTER_PRIV_FILE}" -echo "AUDITOR PUB is ${AUDITOR_PUB} using file ${AUDITOR_PRIV_FILE}" - - -# patch configuration -taler-config -c $CONF -s exchange -o MASTER_PUBLIC_KEY -V $MASTER_PUB -taler-config -c $CONF -s auditor -o PUBLIC_KEY -V $AUDITOR_PUB -taler-config -c $CONF -s merchant-exchange-default -o MASTER_KEY -V $MASTER_PUB -taler-config -c $CONF -s exchangedb-postgres -o CONFIG -V postgres:///$TARGET_DB -taler-config -c $CONF -s auditordb-postgres -o CONFIG -V postgres:///$TARGET_DB -taler-config -c $CONF -s merchantdb-postgres -o CONFIG -V postgres:///$TARGET_DB -taler-config -c $CONF -s bank -o database -V postgres:///$TARGET_DB -taler-config -c $CONF -s exchange -o KEYDIR -V "${TMP_DIR}/keydir/" -taler-config -c $CONF -s exchange -o REVOCATION_DIR -V "${TMP_DIR}/revdir/" - -# setup exchange -echo "Setting up exchange" -taler-exchange-dbinit -c $CONF - -echo "Setting up merchant" -taler-merchant-dbinit -c $CONF - -# setup auditor -echo "Setting up auditor" -taler-auditor-dbinit -c $CONF -taler-auditor-exchange -c $CONF -m $MASTER_PUB -u $EXCHANGE_URL - -# Launch services -echo "Launching services" - -export LIBEUFIN_SANDBOX_DB_CONNECTION="jdbc:sqlite:${TARGET_DB}-sandbox.sqlite3" -# Create the default demobank. -cd $MY_TMP_DIR -export LIBEUFIN_SANDBOX_ADMIN_PASSWORD=secret -libeufin-sandbox config --currency "TESTKUDOS" default -libeufin-sandbox serve --port "1${BANK_PORT}" \ - > ${MY_TMP_DIR}/libeufin-sandbox-stdout.log \ - 2> ${MY_TMP_DIR}/libeufin-sandbox-stderr.log & -echo $! > ${MY_TMP_DIR}/libeufin-sandbox.pid -cd $ORIGIN -export LIBEUFIN_SANDBOX_URL="http://localhost:1${BANK_PORT}" -set +e -echo -n "Waiting for Sandbox..." -OK=0 -for n in `seq 1 50`; do - echo -n "." - sleep 1 - if wget --timeout=1 \ - --user admin --password secret --auth-no-challenge \ - --tries=3 --waitretry=0 \ - -o /dev/null -O /dev/null \ - ${LIBEUFIN_SANDBOX_URL}; - then - OK=1 - break - fi -done -if test $OK != 1 -then - exit_skip " Failed to launch sandbox" -fi -echo "OK" - -register_sandbox_account() { - export LIBEUFIN_SANDBOX_USERNAME=$1 - export LIBEUFIN_SANDBOX_PASSWORD=$2 - cd $MY_TMP_DIR - libeufin-cli sandbox \ - demobank \ - register --name "$3" - cd $ORIGIN - unset LIBEUFIN_SANDBOX_USERNAME - unset LIBEUFIN_SANDBOX_PASSWORD -} -set -e -echo -n "Register the 'fortytwo' Sandbox user.." -register_sandbox_account fortytwo x "Forty Two" -echo OK -echo -n "Register the 'fortythree' Sandbox user.." -register_sandbox_account fortythree x "Forty Three" -echo OK -echo -n "Register 'exchange' Sandbox user.." -register_sandbox_account exchange x "Exchange Company" -echo OK -echo -n "Specify exchange's PAYTO_URI in the config ..." -export LIBEUFIN_SANDBOX_USERNAME=exchange -export LIBEUFIN_SANDBOX_PASSWORD=x -cd $MY_TMP_DIR -PAYTO=`libeufin-cli sandbox demobank info --bank-account exchange | jq --raw-output '.paytoUri'` -taler-config -c $CONF -s exchange-account-1 -o PAYTO_URI -V $PAYTO -echo " OK" -echo -n "Setting this exchange as the bank's default ..." -EXCHANGE_PAYTO=`libeufin-cli sandbox demobank info --bank-account exchange | jq --raw-output '.paytoUri'` -libeufin-sandbox default-exchange "$EXCHANGE_URL" "$EXCHANGE_PAYTO" -echo " OK" -# Prepare EBICS: create Ebics host and Exchange subscriber. -# Shortly becoming admin to setup Ebics. -export LIBEUFIN_SANDBOX_USERNAME=admin -export LIBEUFIN_SANDBOX_PASSWORD=secret -echo -n "Create EBICS host at Sandbox.." -libeufin-cli sandbox \ - --sandbox-url "http://localhost:1${BANK_PORT}" \ - ebicshost create --host-id "talerebics" -echo "OK" -echo -n "Create exchange EBICS subscriber at Sandbox.." -libeufin-cli sandbox \ - demobank new-ebicssubscriber --host-id talerebics \ - --user-id exchangeebics --partner-id talerpartner \ - --bank-account exchange # that's a username _and_ a bank account name -echo "OK" -unset LIBEUFIN_SANDBOX_USERNAME -unset LIBEUFIN_SANDBOX_PASSWORD -# Prepare Nexus, which is the side actually talking -# to the exchange. -export LIBEUFIN_NEXUS_DB_CONNECTION="jdbc:sqlite:${TARGET_DB}-nexus.sqlite3" -# For convenience, username and password are -# identical to those used at the Sandbox. -echo -n "Create exchange Nexus user..." -libeufin-nexus superuser exchange --password x -echo " OK" -libeufin-nexus serve --port ${BANK_PORT} \ - 2> ${MY_TMP_DIR}/libeufin-nexus-stderr.log \ - > ${MY_TMP_DIR}/libeufin-nexus-stdout.log & -echo $! > ${MY_TMP_DIR}/libeufin-nexus.pid -export LIBEUFIN_NEXUS_URL="http://localhost:${BANK_PORT}" -echo -n "Waiting for Nexus..." -set +e -OK=0 -for n in `seq 1 50`; do - echo -n "." - sleep 1 - if wget --timeout=1 \ - --tries=3 --waitretry=0 \ - -o /dev/null -O /dev/null \ - $LIBEUFIN_NEXUS_URL; - then - OK=1 - break - fi -done -if test $OK != 1 -then - exit_skip " Failed to launch Nexus at $LIBEUFIN_NEXUS_URL" -fi -set -e -echo "OK" -export LIBEUFIN_NEXUS_USERNAME=exchange -export LIBEUFIN_NEXUS_PASSWORD=x -echo -n "Creating an EBICS connection at Nexus..." -libeufin-cli connections new-ebics-connection \ - --ebics-url "http://localhost:1${BANK_PORT}/ebicsweb" \ - --host-id "talerebics" \ - --partner-id "talerpartner" \ - --ebics-user-id "exchangeebics" \ - talerconn -echo "OK" -echo -n "Setup EBICS keying..." -libeufin-cli connections connect "talerconn" > /dev/null -echo "OK" -echo -n "Download bank account name from Sandbox..." -libeufin-cli connections download-bank-accounts "talerconn" -echo "OK" -echo -n "Importing bank account info into Nexus..." -libeufin-cli connections import-bank-account \ - --offered-account-id "exchange" \ - --nexus-bank-account-id "exchange-nexus" \ - "talerconn" -echo "OK" -echo -n "Setup payments submission task..." -# Tries every second. -libeufin-cli accounts task-schedule \ - --task-type submit \ - --task-name "exchange-payments" \ - --task-cronspec "* * *" \ - "exchange-nexus" -echo "OK" -# Tries every second. Ask C52 -echo -n "Setup history fetch task..." -libeufin-cli accounts task-schedule \ - --task-type fetch \ - --task-name "exchange-history" \ - --task-cronspec "* * *" \ - --task-param-level report \ - --task-param-range-type latest \ - "exchange-nexus" -echo "OK" -# create Taler facade. -echo -n "Create the Taler facade at Nexus..." -libeufin-cli facades \ - new-taler-wire-gateway-facade \ - --currency "TESTKUDOS" --facade-name "test-facade" \ - "talerconn" "exchange-nexus" -echo "OK" -cd $ORIGIN -# Facade schema: http://localhost:$BANK_PORT/facades/test-facade/taler-wire-gateway/ - -TFN=`which taler-exchange-httpd` -TBINPFX=`dirname $TFN` -TLIBEXEC=${TBINPFX}/../lib/taler/libexec/ -taler-exchange-secmod-eddsa -c $CONF 2> ${MY_TMP_DIR}/taler-exchange-secmod-eddsa.log & -SIGNKEY_HELPER_PID=$! -taler-exchange-secmod-rsa -c $CONF 2> ${MY_TMP_DIR}/taler-exchange-secmod-rsa.log & -RSA_DENOM_HELPER_PID=$! -taler-exchange-secmod-cs -c $CONF 2> ${MY_TMP_DIR}/taler-exchange-secmod-cs.log & -CS_DENOM_HELPER_PID=$! -taler-exchange-httpd -c $CONF 2> ${MY_TMP_DIR}/taler-exchange-httpd.log & -EXCHANGE_PID=$! -taler-merchant-httpd -c $CONF -L INFO 2> ${MY_TMP_DIR}/taler-merchant-httpd.log & -MERCHANT_PID=$! -taler-exchange-wirewatch -c $CONF 2> ${MY_TMP_DIR}/taler-exchange-wirewatch.log & -taler-auditor-httpd -c $CONF 2> ${MY_TMP_DIR}/taler-auditor-httpd.log & - -# Wait for all bank to be available (usually the slowest) -for n in `seq 1 50` -do - echo -n "." - sleep 0.2 - OK=0 - # bank - wget http://localhost:8082/ -o /dev/null -O /dev/null >/dev/null || continue - OK=1 - break -done - -if [ 1 != $OK ] -then - exit_skip "Failed to launch Bank services" -fi - -# Wait for all other services to be available -for n in `seq 1 50` -do - echo -n "." - sleep 0.1 - OK=0 - # exchange - wget http://localhost:8081/seed -o /dev/null -O /dev/null >/dev/null || continue - # merchant - wget http://localhost:9966/ -o /dev/null -O /dev/null >/dev/null || continue - # Auditor - wget http://localhost:8083/ -o /dev/null -O /dev/null >/dev/null || continue - OK=1 - break -done - -if [ 1 != $OK ] -then - exit_cleanup - exit_skip "Failed to launch Taler services" -fi -echo " DONE" - -echo -n "Setting up keys" - -taler-exchange-offline -c $CONF \ - download sign \ - enable-account `taler-config -c $CONF -s exchange-account-1 -o PAYTO_URI` \ - enable-auditor $AUDITOR_PUB $AUDITOR_URL "TESTKUDOS Auditor" \ - wire-fee now iban TESTKUDOS:0.01 TESTKUDOS:0.01 \ - global-fee now TESTKUDOS:0.01 TESTKUDOS:0.01 TESTKUDOS:0.01 1h 1year 5 \ - upload &> ${MY_TMP_DIR}/taler-exchange-offline.log - -echo -n "." - -for n in `seq 1 2` -do - echo -n "." - OK=0 - # bank - wget --timeout=1 http://localhost:8081/keys -o /dev/null -O /dev/null >/dev/null || continue - OK=1 - break -done - -if [ 1 != $OK ] -then - exit_skip "Failed to setup keys" -fi - - -taler-auditor-offline -c $CONF \ - download sign upload &> ${MY_TMP_DIR}/taler-auditor-offline.log - -echo " DONE" # Setup merchant -echo -n "Setting up merchant" - -curl -H "Content-Type: application/json" -X POST -d '{"auth": {"method": "external"}, "accounts":[{"payto_uri":"payto://iban/SANDBOXX/DE474361?receiver-name=Merchant43"}],"id":"default","name":"default","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1", "default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us" : 3600000000},"default_pay_delay":{"d_us": 3600000000}}' http://localhost:9966/management/instances +echo -n "Setting up merchant ..." +curl -H "Content-Type: application/json" -X POST -d '{"auth": {"method": "external"}, "accounts":[{"payto_uri":"payto://iban/SANDBOXX/DE474361?receiver-name=Merchant43"}],"id":"default","name":"default","address":{},"jurisdiction":{},"default_max_wire_fee":"TESTKUDOS:1", "default_max_deposit_fee":"TESTKUDOS:1","default_wire_fee_amortization":1,"default_wire_transfer_delay":{"d_us" : 3600000000},"default_pay_delay":{"d_us": 3600000000}}' "${MERCHANT_URL}management/instances" +echo " DONE" # run wallet CLI echo "Running wallet" -taler-wallet-cli --no-throttle --wallet-db=$WALLET_DB api --expect-success 'withdrawTestBalance' \ +export WALLET_DB="wallet.wdb" +rm -f "$WALLET_DB" + +taler-wallet-cli \ + --no-throttle \ + --wallet-db="$WALLET_DB" \ + api \ + --expect-success 'withdrawTestBalance' \ "$(jq -n ' { amount: "TESTKUDOS:8", @@ -414,57 +59,85 @@ taler-wallet-cli --no-throttle --wallet-db=$WALLET_DB api --expect-success 'with exchangeBaseUrl: $EXCHANGE_URL, }' \ --arg BANK_URL "$BANK_URL/demobanks/default/access-api/" \ - --arg EXCHANGE_URL $EXCHANGE_URL - )" + --arg EXCHANGE_URL "$EXCHANGE_URL" + )" &> taler-wallet-cli-withdraw.log -taler-wallet-cli --no-throttle --wallet-db=$WALLET_DB run-until-done +taler-wallet-cli \ + --no-throttle \ + --wallet-db="$WALLET_DB" \ + run-until-done \ + &> taler-wallet-cli-withdraw-finish.log -export coins=$(taler-wallet-cli --wallet-db=$WALLET_DB advanced dump-coins) +export COINS=$(taler-wallet-cli --wallet-db="$WALLET_DB" advanced dump-coins) echo -n "COINS are:" -echo $coins +echo "$COINS" # Find coin we want to revoke -export rc=$(echo "$coins" | jq -r '[.coins[] | select((.denom_value == "TESTKUDOS:2"))][0] | .coin_pub') +export rc=$(echo "$COINS" | jq -r '[.coins[] | select((.denom_value == "TESTKUDOS:2"))][0] | .coin_pub') # Find the denom -export rd=$(echo "$coins" | jq -r '[.coins[] | select((.denom_value == "TESTKUDOS:2"))][0] | .denom_pub_hash') -echo "Revoking denomination ${rd} (to affect coin ${rc})" +export rd=$(echo "$COINS" | jq -r '[.coins[] | select((.denom_value == "TESTKUDOS:2"))][0] | .denom_pub_hash') +echo -n "Revoking denomination ${rd} (to affect coin ${rc}) ..." # Find all other coins, which will be suspended -export susp=$(echo "$coins" | jq --arg rc "$rc" '[.coins[] | select(.coin_pub != $rc) | .coin_pub]') +export susp=$(echo "$COINS" | jq --arg rc "$rc" '[.coins[] | select(.coin_pub != $rc) | .coin_pub]') # Do the revocation -taler-exchange-offline -c $CONF \ - revoke-denomination "${rd}" upload &> ${MY_TMP_DIR}/taler-exchange-offline-revoke.log +taler-exchange-offline \ + -c $CONF \ + revoke-denomination "${rd}" \ + upload \ + &> taler-exchange-offline-revoke.log +echo "DONE" +echo -n "Signing replacement keys ..." sleep 1 # Give exchange time to create replacmenent key # Re-sign replacement keys -taler-auditor-offline -c $CONF \ - download sign upload &> ${MY_TMP_DIR}/taler-auditor-offline.log +taler-auditor-offline \ + -c $CONF \ + download \ + sign \ + upload \ + &> taler-auditor-offline-reinit.log +echo " DONE" # Now we suspend the other coins, so later we will pay with the recouped coin -taler-wallet-cli --wallet-db=$WALLET_DB advanced suspend-coins "$susp" +taler-wallet-cli \ + --wallet-db="$WALLET_DB" \ + advanced \ + suspend-coins "$susp" # Update exchange /keys so recoup gets scheduled -taler-wallet-cli --wallet-db=$WALLET_DB exchanges update \ - -f $EXCHANGE_URL +taler-wallet-cli \ + --wallet-db="$WALLET_DB" \ + exchanges \ + update \ + -f "$EXCHANGE_URL" # Block until scheduled operations are done -taler-wallet-cli --wallet-db=$WALLET_DB run-until-done +taler-wallet-cli \ + --wallet-db="$WALLET_DB"\ + run-until-done -# Now we buy something, only the coins resulting from recouped will be +# Now we buy something, only the coins resulting from recoup will be # used, as other ones are suspended -taler-wallet-cli --no-throttle --wallet-db=$WALLET_DB api 'testPay' \ +taler-wallet-cli \ + --no-throttle \ + --wallet-db="$WALLET_DB" \ + api \ + 'testPay' \ "$(jq -n ' { amount: "TESTKUDOS:1", merchantBaseUrl: $MERCHANT_URL, summary: "foo", }' \ - --arg MERCHANT_URL $MERCHANT_URL + --arg MERCHANT_URL "$MERCHANT_URL" )" -taler-wallet-cli --wallet-db=$WALLET_DB run-until-done +taler-wallet-cli \ + --wallet-db="$WALLET_DB" \ + run-until-done echo "Purchase with recoup'ed coin (via reserve) done" @@ -477,9 +150,6 @@ echo "Will refresh coin ${rrc} of denomination ${zombie_denom}" # Find all other coins, which will be suspended export susp=$(echo "$coins" | jq --arg rrc "$rrc" '[.coins[] | select(.coin_pub != $rrc) | .coin_pub]') -export rrc -export zombie_denom - # Travel into the future! (must match DURATION_WITHDRAW option) export TIMETRAVEL="--timetravel=604800000000" @@ -510,8 +180,15 @@ do done echo "Refreshing coin $rrc" -taler-wallet-cli $TIMETRAVEL --wallet-db=$WALLET_DB advanced force-refresh "$rrc" -taler-wallet-cli $TIMETRAVEL --wallet-db=$WALLET_DB run-until-done +taler-wallet-cli \ + "$TIMETRAVEL" \ + --wallet-db="$WALLET_DB" \ + advanced force-refresh \ + "$rrc" +taler-wallet-cli \ + "$TIMETRAVEL" \ + --wallet-db="$WALLET_DB" \ + run-until-done # Update our list of the coins export coins=$(taler-wallet-cli $TIMETRAVEL --wallet-db=$WALLET_DB advanced dump-coins) @@ -534,29 +211,49 @@ export susp=$(echo "$coins" | jq --arg freshc "$freshc" '[.coins[] | select(.coi # Do the revocation of freshc echo "Revoking ${fresh_denom} (to affect coin ${freshc})" -taler-exchange-offline -c $CONF \ - revoke-denomination "${fresh_denom}" upload &> ${MY_TMP_DIR}/taler-exchange-offline-revoke-2.log +taler-exchange-offline \ + -c "$CONF" \ + revoke-denomination \ + "${fresh_denom}" \ + upload &> taler-exchange-offline-revoke-2.log sleep 1 # Give exchange time to create replacmenent key # Re-sign replacement keys -taler-auditor-offline -c $CONF \ - download sign upload &> ${MY_TMP_DIR}/taler-auditor-offline.log +taler-auditor-offline \ + -c "$CONF" \ + download \ + sign \ + upload &> taler-auditor-offline.log # Now we suspend the other coins, so later we will pay with the recouped coin -taler-wallet-cli $TIMETRAVEL --wallet-db=$WALLET_DB advanced suspend-coins "$susp" +taler-wallet-cli \ + "$TIMETRAVEL" \ + --wallet-db="$WALLET_DB" \ + advanced \ + suspend-coins "$susp" # Update exchange /keys so recoup gets scheduled -taler-wallet-cli $TIMETRAVEL --wallet-db=$WALLET_DB exchanges update \ - -f $EXCHANGE_URL +taler-wallet-cli \ + "$TIMETRAVEL"\ + --wallet-db="$WALLET_DB" \ + exchanges update \ + -f "$EXCHANGE_URL" # Block until scheduled operations are done -taler-wallet-cli $TIMETRAVEL --wallet-db=$WALLET_DB run-until-done +taler-wallet-cli \ + "$TIMETRAVEL" \ + --wallet-db="$WALLET_DB" \ + run-until-done echo "Restarting merchant (so new keys are known)" kill -TERM $MERCHANT_PID -taler-merchant-httpd -c $CONF -L INFO 2> ${MY_TMP_DIR}/taler-merchant-httpd.log & +taler-merchant-httpd \ + -c "$CONF" \ + -L INFO \ + 2> ${MY_TMP_DIR}/taler-merchant-httpd.log & MERCHANT_PID=$! + # Wait for merchant to be again available for n in `seq 1 50` do @@ -580,7 +277,10 @@ taler-wallet-cli $TIMETRAVEL --no-throttle --wallet-db=$WALLET_DB api 'testPay' }' \ --arg MERCHANT_URL $MERCHANT_URL )" -taler-wallet-cli $TIMETRAVEL --wallet-db=$WALLET_DB run-until-done +taler-wallet-cli \ + "$TIMETRAVEL" \ + --wallet-db="$WALLET_DB" \ + run-until-done echo "Bought something with refresh-recouped coin" @@ -588,26 +288,24 @@ echo "Shutting down services" exit_cleanup +# Where do we write the result? +export BASEDB=${1:-"revoke-basedb"} + + # Dump database -echo "Dumping database" -echo "Dumping PostgreSQL database: ${BASEDB}.sql" -pg_dump -O $TARGET_DB | sed -e '/AS integer/d' > ${BASEDB}.sql -echo "Dumping libeufin database: ${TARGET_DB}-libeufin-*.sql" -cd $MY_TMP_DIR -sqlite3 ${TARGET_DB}-nexus.sqlite3 ".dump" > ${BASEDB}-libeufin-nexus.sql -sqlite3 ${TARGET_DB}-sandbox.sqlite3 ".dump" > ${BASEDB}-libeufin-sandbox.sql +echo "Dumping database ${BASEDB}.sql" +pg_dump -O "auditor-basedb" | sed -e '/AS integer/d' > "${BASEDB}.sql" -rm ${TARGET_DB}-sandbox.sqlite3 ${TARGET_DB}-nexus.sqlite3 # libeufin DB - -cd $ORIGIN - -echo $MASTER_PUB > ${BASEDB}.mpub - -echo "Final clean up" -dropdb $TARGET_DB +# clean up +echo -n "Final clean up ..." +kill -TERM "$SETUP_PID" +wait +unset SETUP_PID +dropdb "auditor-basedb" +echo " DONE" echo "=====================================" -echo " Finished generation of $BASEDB " +echo "Finished generation of ${BASEDB}.sql" echo "=====================================" exit 0 diff --git a/src/auditor/generate_auditordb_home/.local/share/taler/exchange-offline/master.priv b/src/auditor/generate_auditordb_home/.local/share/taler/exchange-offline/master.priv new file mode 100644 index 000000000..85195dd8f --- /dev/null +++ b/src/auditor/generate_auditordb_home/.local/share/taler/exchange-offline/master.priv @@ -0,0 +1 @@ +%I7qYÿ®ÜX˜2@–šò%'1†”ÂOàÔæJ³Ô¦‘ \ No newline at end of file diff --git a/src/auditor/setup.sh b/src/auditor/setup.sh new file mode 100755 index 000000000..2af154949 --- /dev/null +++ b/src/auditor/setup.sh @@ -0,0 +1,72 @@ +#!/bin/sh +# This file is in the public domain + +# Script to be inlined into the main test scripts. Defines function 'setup()' +# which wraps around 'taler-unified-setup.sh' to launch GNU Taler services. +# Call setup() with the arguments to pass to 'taler-unified-setup'. setup() +# will then launch GNU Taler, wait for the process to be complete before +# returning. The script will also install an exit handler to ensure the GNU +# Taler processes are stopped when the shell exits. + +set -eu + +# Cleanup to run whenever we exit +function exit_cleanup() +{ + if [ ! -z ${SETUP_PID+x} ] + then + echo "Killing taler-unified-setup ($SETUP_PID)" >&2 + kill -TERM "$SETUP_PID" + wait + fi +} + +# Install cleanup handler (except for kill -9) +trap exit_cleanup EXIT + +function setup() +{ + echo "Starting test system ..." >&2 + # Create a named pipe in a temp directory we own. + FIFO_DIR=$(mktemp -d fifo-XXXXXX) + FIFO_OUT=$(echo "$FIFO_DIR/out") + mkfifo "$FIFO_OUT" + # Open pipe as FD 3 (RW) and FD 4 (RO) + exec 3<> "$FIFO_OUT" 4< "$FIFO_OUT" + rm -rf "$FIFO_DIR" + # We require '-W' for our termination logic to work. + taler-unified-setup.sh -W "$@" >&3 & + SETUP_PID=$! + # Close FD3 + exec 3>&- + sed -u '/<>/ q' <&4 + # Close FD4 + exec 4>&- + echo "Test system ready" >&2 +} + +# Exit, with status code "skip" (no 'real' failure) +function exit_fail() { + echo "$@" >&2 + exit 1 +} + +# Exit, with status code "skip" (no 'real' failure) +function exit_skip() { + echo "SKIPPING: $1" + exit 77 +} + +function get_payto_uri() { + export LIBEUFIN_SANDBOX_USERNAME="$1" + export LIBEUFIN_SANDBOX_PASSWORD="$2" + export LIBEUFIN_SANDBOX_URL="http://localhost:18082" + libeufin-cli sandbox demobank info --bank-account "$1" | jq --raw-output '.paytoUri' +} + +function get_bankaccount_transactions() { + export LIBEUFIN_SANDBOX_USERNAME=$1 + export LIBEUFIN_SANDBOX_PASSWORD=$2 + export LIBEUFIN_SANDBOX_URL="http://localhost:18082" + libeufin-cli sandbox demobank list-transactions --bank-account $1 +} diff --git a/src/auditor/test-auditor.sh b/src/auditor/test-auditor.sh index 7f4ec1cab..da9a90e02 100755 --- a/src/auditor/test-auditor.sh +++ b/src/auditor/test-auditor.sh @@ -1,7 +1,7 @@ #!/bin/bash # # This file is part of TALER -# Copyright (C) 2014-2022 Taler Systems SA +# Copyright (C) 2014-2023 Taler Systems SA # # TALER is free software; you can redistribute it and/or modify it under the # terms of the GNU General Public License as published by the Free Software @@ -49,17 +49,7 @@ VALGRIND="" # history request. LIBEUFIN_SETTLE_TIME=1 -# Exit, with status code "skip" (no 'real' failure) -function exit_skip() { - echo "SKIPPING test: $1" - exit 77 -} - -# Exit, with error message (hard failure) -function exit_fail() { - echo "FAILING test: $1" - exit 1 -} +. setup.sh # Stop libeufin sandbox and nexus (if running) function stop_libeufin() @@ -2002,12 +1992,12 @@ function check_with_database() { BASEDB=$1 CONF=$1.conf - ORIGIN=`pwd` - MY_TMP_DIR=`dirname $1` + ORIGIN=$(pwd) + MY_TMP_DIR=$(dirname $1) echo "Running test suite with database $BASEDB using configuration $CONF" MASTER_PRIV_FILE=${BASEDB}.mpriv taler-config -f -c ${CONF} -s exchange-offline -o MASTER_PRIV_FILE -V ${MASTER_PRIV_FILE} - MASTER_PUB=`gnunet-ecc -p $MASTER_PRIV_FILE` + MASTER_PUB=$(gnunet-ecc -p $MASTER_PRIV_FILE) echo "MASTER PUB is ${MASTER_PUB} using file ${MASTER_PRIV_FILE}" @@ -2037,7 +2027,7 @@ function check_with_database() # ####### Setup globals ###### # Postgres database to use -export DB=auditor-basedb +export DB="auditor-basedb" # test required commands exist echo "Testing for jq" @@ -2059,12 +2049,12 @@ INITDB_BIN=$(command -v initdb) || true if [[ ! -z "$INITDB_BIN" ]]; then echo " FOUND (in path) at" $INITDB_BIN else - HAVE_INITDB=`find /usr -name "initdb" | head -1 2> /dev/null | grep postgres` || exit_skip " MISSING" - echo " FOUND at" `dirname $HAVE_INITDB` - INITDB_BIN=`echo $HAVE_INITDB | grep bin/initdb | grep postgres | sort -n | tail -n1` + HAVE_INITDB=$(find /usr -name "initdb" | head -1 2> /dev/null | grep postgres) || exit_skip " MISSING" + echo " FOUND at" $(dirname $HAVE_INITDB) + INITDB_BIN=$(echo $HAVE_INITDB | grep bin/initdb | grep postgres | sort -n | tail -n1) fi -POSTGRES_PATH=`dirname $INITDB_BIN` -MYDIR=`mktemp -d /tmp/taler-auditor-basedbXXXXXX` +POSTGRES_PATH=$(dirname $INITDB_BIN) +MYDIR=$(mktemp -d /tmp/taler-auditor-basedbXXXXXX) echo "Using $MYDIR for logging and temporary data" TMPDIR="$MYDIR/postgres/" mkdir -p $TMPDIR @@ -2089,9 +2079,9 @@ PGHOST="$TMPDIR/sockets" export PGHOST echo "Generating fresh database at $MYDIR" -if faketime -f '-1 d' ./generate-auditor-basedb.sh $MYDIR/$DB +if faketime -f '-1 d' ./generate-auditor-basedb.sh "$MYDIR/$DB" then - check_with_database $MYDIR/$DB + check_with_database "$MYDIR/$DB" if test x$fail != x0 then exit $fail diff --git a/src/testing/taler-unified-setup.sh b/src/testing/taler-unified-setup.sh index 1ddc3316e..201250bf7 100755 --- a/src/testing/taler-unified-setup.sh +++ b/src/testing/taler-unified-setup.sh @@ -251,7 +251,7 @@ then echo -n "Configuring sandbox " libeufin-sandbox config --currency "$CURRENCY" default &> libeufin-sandbox-config.log echo "DONE" - echo -n "Launching sandbox " + echo -n "Launching sandbox ... " export LIBEUFIN_SANDBOX_ADMIN_PASSWORD="secret" libeufin-sandbox serve \ --port "$SANDBOX_PORT" \ @@ -660,6 +660,8 @@ then enable-account "$EXCHANGE_PAYTO_URI" \ upload &> "taler-exchange-offline-account.log" echo " OK" + else + echo "WARNING: Account ${USE_ACCOUNT} not enabled (set to: '$ENABLED')" fi if [ "1" = "$START_AUDITOR" ] then