-merge eufin branch (manually)

This commit is contained in:
Christian Grothoff 2022-08-06 13:25:54 +02:00
parent 6834b1290f
commit c602e11a36
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
20 changed files with 675 additions and 17283 deletions

View File

@ -4,24 +4,176 @@
# testing accounts before launching the bank properly. # testing accounts before launching the bank properly.
# #
# Takes 3 arguments: # Takes 3 arguments:
# $1: the configuration file name # $1: the Nexus port (Sandbox port prepends 1 to it)
# $2: the database name # $2: the database name
# $3: serve-http or serve-uwsgi # $3: exchange base URL (used to specify the default exchange)
# $4: config file (needs patch to specify exchange's PAYTO_URI)
set -eu set -eu
if [ "$#" -ne 3 ]; if [ "$#" -ne 4 ];
then then
echo "illegal number of parameters" echo "illegal number of parameters. \
Give: Nexus port number, SQLIte file path, exchange base URL, config file path."
exit 1 exit 1
fi fi
# Ensure starting accounts exist # Must not terminate jobs here, as they are needed
taler-bank-manage -c $1 --with-db $2 django provide_accounts # by the script _importing_ this one. Those script
taler-bank-manage -c $1 --with-db $2 django add_bank_account 42 # will then manage the termination.
taler-bank-manage -c $1 --with-db $2 django add_bank_account 43 # trap cleanup EXIT
taler-bank-manage -c $1 --with-db $2 django changepassword_unsafe Exchange x export LIBEUFIN_SANDBOX_DB_CONNECTION="jdbc:sqlite:$2"
# Create the default demobank.
libeufin-sandbox config --currency TESTKUDOS default
export LIBEUFIN_SANDBOX_ADMIN_PASSWORD=secret
libeufin-sandbox serve --port "1$1" \
> libeufin-sandbox-stdout.log \
2> libeufin-sandbox-stderr.log &
echo $! > libeufin-sandbox.pid
export LIBEUFIN_SANDBOX_URL="http://localhost:1$1/demobanks/default"
set +e
echo -n "Waiting for Sandbox.."
for n in `seq 1 50`; do
echo -n "."
sleep 1
wget --timeout=1 \
--tries=3 --waitretry=0 \
-o /dev/null -O /dev/null \
$LIBEUFIN_SANDBOX_URL
break
done
echo OK
# Now run Django for good register_sandbox_account() {
exec taler-bank-manage -c $1 --with-db $2 $3 export LIBEUFIN_SANDBOX_USERNAME=$1
export LIBEUFIN_SANDBOX_PASSWORD=$2
libeufin-cli sandbox \
demobank \
register --name "$3"
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 "Register 'tor' Sandbox user.."
register_sandbox_account tor x "Tor Project"
echo OK
echo -n "Register 'gnunet' Sandbox user.."
register_sandbox_account gnunet x "GNUnet"
echo OK
echo -n "Register 'tutorial' Sandbox user.."
register_sandbox_account tutorial x "Tutorial"
echo OK
echo -n "Register 'survey' Sandbox user.."
register_sandbox_account survey x "Survey"
echo OK
echo -n "Specify exchange's PAYTO_URI in the config ..."
export LIBEUFIN_SANDBOX_USERNAME=exchange
export LIBEUFIN_SANDBOX_PASSWORD=x
PAYTO=`libeufin-cli sandbox demobank info --bank-account exchange | jq --raw-output '.paytoUri'`
taler-config -c $4 -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 "$3" "$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$1 \
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:$2"
# 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 $1 \
2> libeufin-nexus-stderr.log \
> libeufin-nexus-stdout.log &
echo $! > libeufin-nexus.pid
export LIBEUFIN_NEXUS_URL=http://localhost:$1
echo -n Waiting for Nexus..
set +e
for n in `seq 1 50`; do
echo -n "."
sleep 1
wget --timeout=1 \
--tries=3 --waitretry=0 \
-o /dev/null -O /dev/null \
$LIBEUFIN_NEXUS_URL
break
done
set -e
echo OK
export LIBEUFIN_NEXUS_USERNAME=exchange
export LIBEUFIN_NEXUS_PASSWORD=x
echo -n Creating a EBICS connection at Nexus..
libeufin-cli connections new-ebics-connection \
--ebics-url "http://localhost:1$1/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
# TBD: 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
# Facade schema: http://localhost:$1/facades/test-facade/taler-wire-gateway/

View File

@ -1,128 +1,115 @@
#!/usr/bin/env python3 #!/bin/bash
# This file is in the public domain.
from requests import get, post set -eu
from subprocess import call
import base64
# EBICS details # EBICS details
EBICS_URL = "http://localhost:5000/ebicsweb" EBICS_URL="http://localhost:5000/ebicsweb"
HOST_ID = "HOST01" HOST_ID="HOST01"
PARTNER_ID = "PARTNER1" PARTNER_ID="PARTNER1"
USER_ID = "USER1" USER_ID="USER1"
EBICS_VERSION = "H004"
SUBSCRIBER_IBAN = "ES9121000418450200051332" # This is used _both_ at Sandbox and at Nexus.
SUBSCRIBER_BIC = "BIC" # Basically, Nexus imports the offered bank account
SUBSCRIBER_NAME = "Exchange" # using the same name used by the Sandbox.
BANK_ACCOUNT_LABEL="my-bank-account"
BANK_ACCOUNT_LABEL = "my-bank-account" BANK_CONNECTION_LABEL="my-bank-connection"
BANK_CONNECTION_LABEL = "my-bank-connection"
FACADE_LABEL="my-facade" FACADE_LABEL="my-facade"
USERNAME="Exchange" export LIBEUFIN_SANDBOX_USERNAME=exchange
USER_AUTHORIZATION_HEADER = "basic {}".format( export LIBEUFIN_SANDBOX_PASSWORD=x
base64.b64encode(b"Exchange:x").decode("utf-8") export LIBEUFIN_SANDBOX_URL=http://localhost:5000/demobanks/default
) libeufin-cli sandbox demobank register --name "Exchange Company"
def assertResponse(response): export LIBEUFIN_SANDBOX_USERNAME=fortytwo
if response.status_code != 200: export LIBEUFIN_SANDBOX_PASSWORD=x
print("Test failed on URL: {}".format(response.url)) export LIBEUFIN_SANDBOX_URL=http://localhost:5000/demobanks/default
# stdout/stderr from both services is A LOT of text. libeufin-cli sandbox demobank register \
# Confusing to dump all that to console. --name User42 --iban FR7630006000011234567890189
print("Check nexus.log and sandbox.log, probably under /tmp")
exit(1)
# Allows for finer grained checks.
return response
# Create a nexus (super-) user export LIBEUFIN_SANDBOX_USERNAME=fortythree
check_call(["libeufin-nexus", export LIBEUFIN_SANDBOX_PASSWORD=x
"superuser", export LIBEUFIN_SANDBOX_URL=http://localhost:5000/demobanks/default
"--db-name", "/tmp/nexus-exchange-test.sqlite3", libeufin-cli sandbox demobank register \
"Exchange", --name User43 --iban GB33BUKB20201555555555
"--password", "x"]
)
# Create a EBICS bank connection. export LIBEUFIN_SANDBOX_USERNAME=admin
assertResponse( export LIBEUFIN_SANDBOX_PASSWORD=secret
post( export LIBEUFIN_SANDBOX_URL=http://localhost:5000/demobanks/default
"http://localhost:5001/bank-connections", echo -n "Create EBICS host at Sandbox..."
json=dict( libeufin-cli sandbox \
name=BANK_CONNECTION_LABEL, --sandbox-url "http://localhost:5000" \
source="new", ebicshost create --host-id $HOST_ID
type="ebics", echo " OK"
data=dict(
ebicsURL=EBICS_URL, hostID=HOST_ID, partnerID=PARTNER_ID, userID=USER_ID
),
),
headers=dict(Authorization=USER_AUTHORIZATION_HEADER),
)
)
# Create a facade echo -n "Create exchange EBICS subscriber at Sandbox..."
assertResponse( libeufin-cli sandbox \
post( demobank new-ebicssubscriber --host-id $HOST_ID \
"http://localhost:5001/facades", --user-id $USER_ID --partner-id $PARTNER_ID \
json=dict( --bank-account exchange # that's a username _and_ a bank account name
name=FACADE_LABEL, echo " OK"
type="taler-wire-gateway", unset LIBEUFIN_SANDBOX_USERNAME
creator=USERNAME, unset LIBEUFIN_SANDBOX_PASSWORD
config=dict( unset LIBEUFIN_SANDBOX_URL
bankAccount=BANK_ACCOUNT_LABEL,
bankConnection=BANK_CONNECTION_LABEL,
reserveTransferLevel="UNUSED",
intervalIncremental="UNUSED"
)
),
headers=dict(Authorization=USER_AUTHORIZATION_HEADER),
)
)
# Create the EBICS host at the Sandbox. export LIBEUFIN_NEXUS_USERNAME=exchange
assertResponse( export LIBEUFIN_NEXUS_PASSWORD=x
post( export LIBEUFIN_NEXUS_URL=http://localhost:5001/
"http://localhost:5000/admin/ebics/host",
json=dict(hostID=HOST_ID, ebicsVersion=EBICS_VERSION),
)
)
# Create Exchange EBICS subscriber at the Sandbox. echo -n "Create the exchange (super)user at Nexus..."
assertResponse( libeufin-nexus superuser exchange --password x
post( echo " DONE"
"http://localhost:5000/admin/ebics/subscribers",
json=dict(hostID=HOST_ID, partnerID=PARTNER_ID, userID=USER_ID),
)
)
# Create a bank account associated to the Exchange's EBICS subscriber, echo -n "Creating a EBICS connection at Nexus..."
# again at the Sandbox. libeufin-cli connections new-ebics-connection \
assertResponse( --ebics-url $EBICS_URL \
post( --host-id $HOST_ID \
"http://localhost:5000/admin/ebics/bank-accounts", --partner-id $PARTNER_ID \
json=dict( --ebics-user-id $USER_ID \
subscriber=dict(hostID=HOST_ID, partnerID=PARTNER_ID, userID=USER_ID), $BANK_CONNECTION_LABEL
iban=SUBSCRIBER_IBAN, echo " OK"
bic=SUBSCRIBER_BIC,
name=SUBSCRIBER_NAME,
label=BANK_ACCOUNT_LABEL,
),
)
)
# 'connect' to the bank: upload+download keys. echo -n "Setup EBICS keying..."
assertResponse( libeufin-cli connections connect $BANK_CONNECTION_LABEL > /dev/null
post( echo " OK"
"http://localhost:5001/bank-connections/{}/connect".format(BANK_CONNECTION_LABEL),
json=dict(),
headers=dict(Authorization=USER_AUTHORIZATION_HEADER),
)
)
# Download bank accounts. echo -n "Download bank account name from Sandbox..."
assertResponse( libeufin-cli connections download-bank-accounts $BANK_CONNECTION_LABEL
post( echo " OK"
"http://localhost:5001/bank-connections/{}/ebics/import-accounts".format(BANK_CONNECTION_LABEL),
json=dict(), echo -n "Importing bank account info into Nexus..."
headers=dict(Authorization=USER_AUTHORIZATION_HEADER), libeufin-cli connections import-bank-account \
) --offered-account-id exchange \
) --nexus-bank-account-id $BANK_ACCOUNT_LABEL \
$BANK_CONNECTION_LABEL
echo " OK"
echo -n "Create the Taler facade at Nexus..."
libeufin-cli facades \
new-taler-wire-gateway-facade \
--currency KUDOS --facade-name $FACADE_LABEL \
$BANK_CONNECTION_LABEL $BANK_ACCOUNT_LABEL
echo " DONE"
echo -n Setup payments submission task..
# Tries every second.
libeufin-cli accounts task-schedule \
--task-type submit \
--task-name exchange-payments \
--task-cronspec "* * *" \
$BANK_ACCOUNT_LABEL
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 \
$BANK_ACCOUNT_LABEL
echo OK
# unset, in case the script gets 'source'd.
unset LIBEUFIN_NEXUS_USERNAME
unset LIBEUFIN_NEXUS_PASSWORD
unset LIBEUFIN_NEXUS_URL

View File

@ -110,7 +110,7 @@ currency = TESTKUDOS
[merchant-exchange-default] [merchant-exchange-default]
CURRENCY = TESTKUDOS CURRENCY = TESTKUDOS
EXCHANGE_BASE_URL = http://localhost:8081/ EXCHANGE_BASE_URL = http://localhost:8081/
MASTER_KEY = JM0NJXHM6Y6HYAPK2WDFH3HDJ2E9KZWGKM3E0FYRV2V3HCTB3DQ0 MASTER_KEY = EBN9WPH07EP1SCEXWH9CGZ83S6ERGFXANDD78WF3SV4AKF8X4QH0
[merchant-account-merchant] [merchant-account-merchant]
ACTIVE_default = YES ACTIVE_default = YES
@ -119,9 +119,9 @@ PAYTO_URI = payto://x-taler-bank/localhost/42
[exchange-accountcredentials-1] [exchange-accountcredentials-1]
PASSWORD = x PASSWORD = x
USERNAME = Exchange USERNAME = exchange
WIRE_GATEWAY_AUTH_METHOD = basic WIRE_GATEWAY_AUTH_METHOD = basic
WIRE_GATEWAY_URL = http://localhost:8082/taler-wire-gateway/Exchange/ WIRE_GATEWAY_URL = http://localhost:8082/facades/test-facade/taler-wire-gateway/
[exchange-account-1] [exchange-account-1]
enable_credit = yes enable_credit = yes
@ -154,7 +154,7 @@ CONFIG = postgres:///auditor-basedb
[exchange] [exchange]
LOOKAHEAD_SIGN = 32 weeks 1 day LOOKAHEAD_SIGN = 32 weeks 1 day
SIGNKEY_DURATION = 4 weeks SIGNKEY_DURATION = 4 weeks
MASTER_PUBLIC_KEY = JM0NJXHM6Y6HYAPK2WDFH3HDJ2E9KZWGKM3E0FYRV2V3HCTB3DQ0 MASTER_PUBLIC_KEY = EBN9WPH07EP1SCEXWH9CGZ83S6ERGFXANDD78WF3SV4AKF8X4QH0
SIGNKEY_LEGAL_DURATION = 4 weeks SIGNKEY_LEGAL_DURATION = 4 weeks
UNIXPATH = ${TALER_RUNTIME_DIR}/exchange.http UNIXPATH = ${TALER_RUNTIME_DIR}/exchange.http
@ -172,7 +172,7 @@ DATABASE = postgres:///auditor-basedb
CONFIG = postgres:///auditor-basedb CONFIG = postgres:///auditor-basedb
[auditor] [auditor]
PUBLIC_KEY = 73NJKBP4MHJF8274K88F4WFWKNYMK8T6MTSE6HHYS6WC01H9YH7G PUBLIC_KEY = VZ14T1ZX99S51PCHBKFTGGNJ89ZF9FRY1BSDQXBYZ9H5W2PWETX0
TINY_AMOUNT = TESTKUDOS:0.01 TINY_AMOUNT = TESTKUDOS:0.01
BASE_URL = http://localhost:8083/ BASE_URL = http://localhost:8083/
@ -181,3 +181,4 @@ TALER_CACHE_HOME = $TALER_HOME/.cache/taler/
TALER_CONFIG_HOME = $TALER_HOME/.config/taler/ TALER_CONFIG_HOME = $TALER_HOME/.config/taler/
TALER_DATA_HOME = $TALER_HOME/.local/share/taler/ TALER_DATA_HOME = $TALER_HOME/.local/share/taler/
TALER_HOME = ${PWD}/generate_auditordb_home/ TALER_HOME = ${PWD}/generate_auditordb_home/

Binary file not shown.

View File

@ -74,9 +74,9 @@ enable_debit = yes
enable_credit = yes enable_credit = yes
[exchange-accountcredentials-1] [exchange-accountcredentials-1]
WIRE_GATEWAY_URL = "http://localhost:8082/taler-wire-gateway/Exchange/" WIRE_GATEWAY_URL = http://localhost:8082/facades/test-facade/taler-wire-gateway/
WIRE_GATEWAY_AUTH_METHOD = basic WIRE_GATEWAY_AUTH_METHOD = basic
USERNAME = Exchange USERNAME = exchange
PASSWORD = x PASSWORD = x
[merchant-account-merchant] [merchant-account-merchant]

View File

@ -15,6 +15,20 @@
# #
set -eu set -eu
function get_iban() {
export LIBEUFIN_SANDBOX_USERNAME=$1
export LIBEUFIN_SANDBOX_PASSWORD=$2
export LIBEUFIN_SANDBOX_URL=$BANK_URL
libeufin-cli sandbox demobank info --bank-account $1 | jq --raw-output '.iban'
}
function get_payto_uri() {
export LIBEUFIN_SANDBOX_USERNAME=$1
export LIBEUFIN_SANDBOX_PASSWORD=$2
export LIBEUFIN_SANDBOX_URL=$BANK_URL
libeufin-cli sandbox demobank info --bank-account $1 | jq --raw-output '.paytoUri'
}
# Cleanup to run whenever we exit # Cleanup to run whenever we exit
function cleanup() function cleanup()
{ {
@ -22,6 +36,9 @@ function cleanup()
do do
kill $n 2> /dev/null || true kill $n 2> /dev/null || true
done done
echo Killing euFin..
kill `cat libeufin-sandbox.pid 2> /dev/null` &> /dev/null || true
kill `cat libeufin-nexus.pid 2> /dev/null` &> /dev/null || true
wait wait
} }
@ -34,10 +51,8 @@ function exit_skip() {
echo $1 echo $1
exit 77 exit 77
} }
# Where do we write the result? # Where do we write the result?
BASEDB=${1:-"auditor-basedb"} BASEDB=${1:-"auditor-basedb"}
# Name of the Postgres database we will use for the script. # Name of the Postgres database we will use for the script.
# Will be dropped, do NOT use anything that might be used # Will be dropped, do NOT use anything that might be used
# elsewhere # elsewhere
@ -47,16 +62,15 @@ export WALLET_DB=${BASEDB:-"wallet"}.wdb
# delete existing wallet database # delete existing wallet database
rm -f $WALLET_DB rm -f $WALLET_DB
# delete libeufin database
rm -f $TARGET_DB
# Configuration file will be edited, so we create one # Configuration file will be edited, so we create one
# from the template. # from the template.
CONF=${BASEDB}.conf CONF_ONCE=${BASEDB}.conf
cp generate-auditor-basedb.conf $CONF cp generate-auditor-basedb.conf $CONF_ONCE
echo -n "Testing for libeufin"
libeufin-cli --help >/dev/null </dev/null || exit_skip " MISSING"
echo -n "Testing for taler-bank-manage"
taler-bank-manage --help >/dev/null </dev/null || exit_skip " MISSING"
echo " FOUND" echo " FOUND"
echo -n "Testing for taler-wallet-cli" echo -n "Testing for taler-wallet-cli"
taler-wallet-cli -v >/dev/null </dev/null || exit_skip " MISSING" taler-wallet-cli -v >/dev/null </dev/null || exit_skip " MISSING"
@ -69,7 +83,7 @@ echo " FOUND"
pwd pwd
# Clean up # Clean up
DATA_DIR=`taler-config -f -c $CONF -s PATHS -o TALER_HOME` DATA_DIR=`taler-config -f -c $CONF_ONCE -s PATHS -o TALER_HOME`
rm -rf $DATA_DIR || true rm -rf $DATA_DIR || true
# reset database # reset database
@ -78,59 +92,59 @@ createdb $TARGET_DB || exit_skip "Could not create database $TARGET_DB"
# obtain key configuration data # obtain key configuration data
MASTER_PRIV_FILE=`taler-config -f -c $CONF -s exchange-offline -o MASTER_PRIV_FILE` MASTER_PRIV_FILE=`taler-config -f -c $CONF_ONCE -s exchange-offline -o MASTER_PRIV_FILE`
MASTER_PRIV_DIR=`dirname $MASTER_PRIV_FILE` MASTER_PRIV_DIR=`dirname $MASTER_PRIV_FILE`
mkdir -p $MASTER_PRIV_DIR mkdir -p $MASTER_PRIV_DIR
gnunet-ecc -g1 $MASTER_PRIV_FILE > /dev/null gnunet-ecc -g1 $MASTER_PRIV_FILE > /dev/null
MASTER_PUB=`gnunet-ecc -p $MASTER_PRIV_FILE` MASTER_PUB=`gnunet-ecc -p $MASTER_PRIV_FILE`
EXCHANGE_URL=`taler-config -c $CONF -s EXCHANGE -o BASE_URL` MERCHANT_PORT=`taler-config -c $CONF_ONCE -s MERCHANT -o PORT`
MERCHANT_PORT=`taler-config -c $CONF -s MERCHANT -o PORT`
MERCHANT_URL=http://localhost:${MERCHANT_PORT}/ MERCHANT_URL=http://localhost:${MERCHANT_PORT}/
BANK_PORT=`taler-config -c $CONF -s BANK -o HTTP_PORT`
BANK_URL=http://localhost:${BANK_PORT}/
AUDITOR_URL=http://localhost:8083/ AUDITOR_URL=http://localhost:8083/
AUDITOR_PRIV_FILE=`taler-config -f -c $CONF -s AUDITOR -o AUDITOR_PRIV_FILE` AUDITOR_PRIV_FILE=`taler-config -f -c $CONF_ONCE -s AUDITOR -o AUDITOR_PRIV_FILE`
AUDITOR_PRIV_DIR=`dirname $AUDITOR_PRIV_FILE` AUDITOR_PRIV_DIR=`dirname $AUDITOR_PRIV_FILE`
mkdir -p $AUDITOR_PRIV_DIR mkdir -p $AUDITOR_PRIV_DIR
gnunet-ecc -g1 $AUDITOR_PRIV_FILE > /dev/null gnunet-ecc -g1 $AUDITOR_PRIV_FILE > /dev/null
AUDITOR_PUB=`gnunet-ecc -p $AUDITOR_PRIV_FILE` AUDITOR_PUB=`gnunet-ecc -p $AUDITOR_PRIV_FILE`
EXCHANGE_URL=`taler-config -c $CONF_ONCE -s EXCHANGE -o BASE_URL`
BANK_PORT=`taler-config -c $CONF_ONCE -s BANK -o HTTP_PORT`
BANK_URL="http://localhost:1${BANK_PORT}/demobanks/default"
echo "AUDITOR PUB is $AUDITOR_PUB using file $AUDITOR_PRIV_FILE" echo "AUDITOR PUB is $AUDITOR_PUB using file $AUDITOR_PRIV_FILE"
# patch configuration # patch configuration
taler-config -c $CONF -s exchange -o MASTER_PUBLIC_KEY -V $MASTER_PUB taler-config -c $CONF_ONCE -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_ONCE -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_ONCE -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_ONCE -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_ONCE -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_ONCE -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_ONCE -s bank -o database -V postgres:///$TARGET_DB
# setup exchange # setup exchange
echo "Setting up exchange" echo "Setting up exchange"
taler-exchange-dbinit -c $CONF taler-exchange-dbinit -c $CONF_ONCE
echo "Setting up merchant" echo "Setting up merchant"
taler-merchant-dbinit -c $CONF taler-merchant-dbinit -c $CONF_ONCE
# setup auditor # setup auditor
echo "Setting up auditor" echo "Setting up auditor"
taler-auditor-dbinit -c $CONF || exit_skip "Failed to initialize auditor DB" taler-auditor-dbinit -c $CONF_ONCE || 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" taler-auditor-exchange -c $CONF_ONCE -m $MASTER_PUB -u $EXCHANGE_URL || exit_skip "Failed to add exchange to auditor"
# Launch services # Launch services
echo "Launching services" echo "Launching services (pre audit DB: $TARGET_DB)"
taler-bank-manage-testing $CONF postgres:///$TARGET_DB serve &> taler-bank.log & taler-bank-manage-testing $BANK_PORT $TARGET_DB $EXCHANGE_URL $CONF_ONCE
TFN=`which taler-exchange-httpd` TFN=`which taler-exchange-httpd`
TBINPFX=`dirname $TFN` TBINPFX=`dirname $TFN`
TLIBEXEC=${TBINPFX}/../lib/taler/libexec/ TLIBEXEC=${TBINPFX}/../lib/taler/libexec/
taler-exchange-secmod-eddsa -c $CONF 2> taler-exchange-secmod-eddsa.log & taler-exchange-secmod-eddsa -c $CONF_ONCE 2> taler-exchange-secmod-eddsa.log &
taler-exchange-secmod-rsa -c $CONF 2> taler-exchange-secmod-rsa.log & taler-exchange-secmod-rsa -c $CONF_ONCE 2> taler-exchange-secmod-rsa.log &
taler-exchange-secmod-cs -c $CONF 2> taler-exchange-secmod-cs.log & taler-exchange-secmod-cs -c $CONF_ONCE 2> taler-exchange-secmod-cs.log &
taler-exchange-httpd -c $CONF 2> taler-exchange-httpd.log & taler-exchange-httpd -c $CONF_ONCE 2> taler-exchange-httpd.log &
taler-merchant-httpd -c $CONF -L INFO 2> taler-merchant-httpd.log & taler-merchant-httpd -c $CONF_ONCE -L INFO 2> taler-merchant-httpd.log &
taler-exchange-wirewatch -c $CONF 2> taler-exchange-wirewatch.log & taler-exchange-wirewatch -c $CONF_ONCE 2> taler-exchange-wirewatch.log &
taler-auditor-httpd -L INFO -c $CONF 2> taler-auditor-httpd.log & taler-auditor-httpd -L INFO -c $CONF_ONCE 2> taler-auditor-httpd.log &
# Wait for all bank to be available (usually the slowest) # Wait for all bank to be available (usually the slowest)
for n in `seq 1 50` for n in `seq 1 50`
@ -169,14 +183,12 @@ if [ 1 != $OK ]
then then
exit_skip "Failed to launch services" exit_skip "Failed to launch services"
fi fi
echo " DONE"
echo -n "Setting up keys" echo -n "Setting up keys"
taler-exchange-offline -c $CONF \ taler-exchange-offline -c $CONF_ONCE \
download sign \ download sign \
enable-account payto://x-taler-bank/localhost/Exchange \ enable-account `taler-config -c $CONF_ONCE -s exchange-account-1 -o PAYTO_URI` \
enable-auditor $AUDITOR_PUB $AUDITOR_URL "TESTKUDOS Auditor" \ enable-auditor $AUDITOR_PUB $AUDITOR_URL "TESTKUDOS Auditor" \
wire-fee now x-taler-bank TESTKUDOS:0.07 TESTKUDOS:0.01 TESTKUDOS:0.01 \ wire-fee now iban TESTKUDOS:0.07 TESTKUDOS:0.01 TESTKUDOS:0.01 \
global-fee now TESTKUDOS:0.01 TESTKUDOS:0.01 TESTKUDOS:0.01 TESTKUDOS:0.01 1h 1h 1year 5 \ global-fee now TESTKUDOS:0.01 TESTKUDOS:0.01 TESTKUDOS:0.01 TESTKUDOS:0.01 1h 1h 1year 5 \
upload &> taler-exchange-offline.log upload &> taler-exchange-offline.log
@ -199,7 +211,7 @@ fi
echo " DONE" echo " DONE"
echo -n "Adding auditor signatures ..." echo -n "Adding auditor signatures ..."
taler-auditor-offline -c $CONF \ taler-auditor-offline -c $CONF_ONCE \
download sign upload &> taler-auditor-offline.log download sign upload &> taler-auditor-offline.log
echo " DONE" echo " DONE"
@ -227,16 +239,16 @@ taler-wallet-cli --no-throttle --wallet-db=$WALLET_DB api 'runIntegrationTest' \
}' \ }' \
--arg MERCHANT_URL "$MERCHANT_URL" \ --arg MERCHANT_URL "$MERCHANT_URL" \
--arg EXCHANGE_URL "$EXCHANGE_URL" \ --arg EXCHANGE_URL "$EXCHANGE_URL" \
--arg BANK_URL "$BANK_URL" --arg BANK_URL "$BANK_URL/access-api/"
)" &> taler-wallet-cli.log )" &> taler-wallet-cli.log
echo "Shutting down services" echo "Shutting down services"
cleanup cleanup
# Dump database # Dump database
echo "Dumping database" echo "Dumping database ${BASEDB}(-libeufin).sql"
pg_dump -O $TARGET_DB | sed -e '/AS integer/d' > ${BASEDB}.sql pg_dump -O $TARGET_DB | sed -e '/AS integer/d' > ${BASEDB}.sql
sqlite3 $TARGET_DB ".dump" > ${BASEDB}-libeufin.sql
echo $MASTER_PUB > ${BASEDB}.mpub echo $MASTER_PUB > ${BASEDB}.mpub
@ -245,7 +257,7 @@ date +%s > ${BASEDB}.age
# clean up # clean up
echo "Final clean up" echo "Final clean up"
dropdb $TARGET_DB dropdb $TARGET_DB
rm $TARGET_DB # libeufin DB
rm -rf $DATA_DIR || true rm -rf $DATA_DIR || true
echo "=====================================" echo "====================================="

View File

@ -14,9 +14,19 @@ function cleanup()
do do
kill $n 2> /dev/null || true kill $n 2> /dev/null || true
done done
echo Killing euFin..
kill `cat libeufin-sandbox.pid 2> /dev/null` &> /dev/null || true
kill `cat libeufin-nexus.pid 2> /dev/null` &> /dev/null || true
wait wait
} }
function get_payto_uri() {
export LIBEUFIN_SANDBOX_USERNAME=$1
export LIBEUFIN_SANDBOX_PASSWORD=$2
export LIBEUFIN_SANDBOX_URL=$BANK_URL
libeufin-cli sandbox demobank info --bank-account $1 | jq --raw-output '.paytoUri'
}
# Install cleanup handler (except for kill -9) # Install cleanup handler (except for kill -9)
trap cleanup EXIT trap cleanup EXIT
@ -43,8 +53,8 @@ export CONF=generate-auditor-basedb-revocation.conf
cp generate-auditor-basedb.conf $CONF cp generate-auditor-basedb.conf $CONF
echo -n "Testing for taler-bank-manage" echo -n "Testing for libeufin(-cli)"
taler-bank-manage --help >/dev/null </dev/null || exit_skip " MISSING" libeufin-cli --help >/dev/null </dev/null || exit_skip " MISSING"
echo " FOUND" echo " FOUND"
echo -n "Testing for taler-wallet-cli" echo -n "Testing for taler-wallet-cli"
taler-wallet-cli -v >/dev/null </dev/null || exit_skip " MISSING" taler-wallet-cli -v >/dev/null </dev/null || exit_skip " MISSING"
@ -53,8 +63,6 @@ echo -n "Testing for curl"
curl --help >/dev/null </dev/null || exit_skip " MISSING" curl --help >/dev/null </dev/null || exit_skip " MISSING"
echo " FOUND" echo " FOUND"
# Clean up # Clean up
DATA_DIR=`taler-config -f -c $CONF -s PATHS -o TALER_HOME` DATA_DIR=`taler-config -f -c $CONF -s PATHS -o TALER_HOME`
rm -rf $DATA_DIR || true rm -rf $DATA_DIR || true
@ -62,6 +70,7 @@ rm -rf $DATA_DIR || true
# reset database # reset database
dropdb $TARGET_DB >/dev/null 2>/dev/null || true dropdb $TARGET_DB >/dev/null 2>/dev/null || true
createdb $TARGET_DB || exit_skip "Could not create database $TARGET_DB" createdb $TARGET_DB || exit_skip "Could not create database $TARGET_DB"
rm $TARGET_DB >/dev/null 2>/dev/null || true # libeufin
# obtain key configuration data # obtain key configuration data
MASTER_PRIV_FILE=`taler-config -f -c $CONF -s exchange-offline -o MASTER_PRIV_FILE` MASTER_PRIV_FILE=`taler-config -f -c $CONF -s exchange-offline -o MASTER_PRIV_FILE`
@ -73,7 +82,7 @@ export EXCHANGE_URL=`taler-config -c $CONF -s EXCHANGE -o BASE_URL`
MERCHANT_PORT=`taler-config -c $CONF -s MERCHANT -o PORT` MERCHANT_PORT=`taler-config -c $CONF -s MERCHANT -o PORT`
export MERCHANT_URL=http://localhost:${MERCHANT_PORT}/ export MERCHANT_URL=http://localhost:${MERCHANT_PORT}/
BANK_PORT=`taler-config -c $CONF -s BANK -o HTTP_PORT` BANK_PORT=`taler-config -c $CONF -s BANK -o HTTP_PORT`
export BANK_URL=http://localhost:${BANK_PORT}/ export BANK_URL=http://localhost:1${BANK_PORT}/demobanks/default
export AUDITOR_URL=http://localhost:8083/ export AUDITOR_URL=http://localhost:8083/
AUDITOR_PRIV_FILE=`taler-config -f -c $CONF -s AUDITOR -o AUDITOR_PRIV_FILE` AUDITOR_PRIV_FILE=`taler-config -f -c $CONF -s AUDITOR -o AUDITOR_PRIV_FILE`
AUDITOR_PRIV_DIR=`dirname $AUDITOR_PRIV_FILE` AUDITOR_PRIV_DIR=`dirname $AUDITOR_PRIV_FILE`
@ -105,7 +114,7 @@ taler-auditor-exchange -c $CONF -m $MASTER_PUB -u $EXCHANGE_URL
# Launch services # Launch services
echo "Launching services" echo "Launching services"
taler-bank-manage-testing $CONF postgres:///$TARGET_DB serve &> revocation-bank.log & taler-bank-manage-testing $BANK_PORT $TARGET_DB $EXCHANGE_URL $CONF
TFN=`which taler-exchange-httpd` TFN=`which taler-exchange-httpd`
TBINPFX=`dirname $TFN` TBINPFX=`dirname $TFN`
TLIBEXEC=${TBINPFX}/../lib/taler/libexec/ TLIBEXEC=${TBINPFX}/../lib/taler/libexec/
@ -166,9 +175,9 @@ echo -n "Setting up keys"
taler-exchange-offline -c $CONF \ taler-exchange-offline -c $CONF \
download sign \ download sign \
enable-account payto://x-taler-bank/localhost/Exchange \ enable-account `taler-config -c $CONF -s exchange-account-1 -o PAYTO_URI` \
enable-auditor $AUDITOR_PUB $AUDITOR_URL "TESTKUDOS Auditor" \ enable-auditor $AUDITOR_PUB $AUDITOR_URL "TESTKUDOS Auditor" \
wire-fee now x-taler-bank TESTKUDOS:0.01 TESTKUDOS:0.01 TESTKUDOS:0.01 \ wire-fee now iban TESTKUDOS:0.01 TESTKUDOS:0.01 TESTKUDOS:0.01 \
global-fee now TESTKUDOS:0.01 TESTKUDOS:0.01 TESTKUDOS:0.01 TESTKUDOS:0.01 1h 1h 1year 5 \ global-fee now TESTKUDOS:0.01 TESTKUDOS:0.01 TESTKUDOS:0.01 TESTKUDOS:0.01 1h 1h 1year 5 \
upload &> taler-exchange-offline.log upload &> taler-exchange-offline.log
@ -211,7 +220,7 @@ taler-wallet-cli --no-throttle --wallet-db=$WALLET_DB api 'withdrawTestBalance'
bankBaseUrl: $BANK_URL, bankBaseUrl: $BANK_URL,
exchangeBaseUrl: $EXCHANGE_URL, exchangeBaseUrl: $EXCHANGE_URL,
}' \ }' \
--arg BANK_URL $BANK_URL \ --arg BANK_URL "$BANK_URL/access-api/" \
--arg EXCHANGE_URL $EXCHANGE_URL --arg EXCHANGE_URL $EXCHANGE_URL
)" )"
@ -388,7 +397,10 @@ cleanup
# Dump database # Dump database
echo "Dumping database" echo "Dumping database"
echo "Dumping PostgreSQL database: ${BASEDB}.sql"
pg_dump -O $TARGET_DB | sed -e '/AS integer/d' > ${BASEDB}.sql pg_dump -O $TARGET_DB | sed -e '/AS integer/d' > ${BASEDB}.sql
echo "Dumping libeufin database: ${BASEDB}-libeufin.sql"
sqlite3 $TARGET_DB ".dump" > ${BASEDB}-libeufin.sql
echo $MASTER_PUB > ${BASEDB}.mpub echo $MASTER_PUB > ${BASEDB}.mpub
date +%s > ${BASEDB}.age date +%s > ${BASEDB}.age
@ -396,6 +408,7 @@ date +%s > ${BASEDB}.age
# clean up # clean up
echo "Final clean up" echo "Final clean up"
dropdb $TARGET_DB dropdb $TARGET_DB
rm $TARGET_DB # libeufin
rm -rf $DATA_DIR || true rm -rf $DATA_DIR || true
rm -f $CONF rm -f $CONF
rm -r $TMP_DIR rm -r $TMP_DIR

View File

@ -1 +0,0 @@
1655640625

View File

@ -9,9 +9,9 @@ enable_debit = yes
enable_credit = yes enable_credit = yes
[exchange-accountcredentials-1] [exchange-accountcredentials-1]
WIRE_GATEWAY_URL = "http://localhost:8082/taler-wire-gateway/Exchange/" WIRE_GATEWAY_URL = "http://localhost:8082/facades/test-facade/taler-wire-gateway/"
WIRE_GATEWAY_AUTH_METHOD = basic WIRE_GATEWAY_AUTH_METHOD = basic
USERNAME = Exchange USERNAME = exchange
PASSWORD = x PASSWORD = x
[exchangedb] [exchangedb]

Binary file not shown.

View File

@ -1 +0,0 @@
MREDG0XYVSX4RPYSA6JNQZ93P2DDBG45F3M6RBZXRS49M0JTVN40

File diff suppressed because it is too large Load Diff

View File

@ -1576,10 +1576,12 @@ process_debits (void *cls)
"Checking bank DEBIT records of account `%s'\n", "Checking bank DEBIT records of account `%s'\n",
wa->ai->section_name); wa->ai->section_name);
GNUNET_assert (NULL == wa->dhh); GNUNET_assert (NULL == wa->dhh);
// FIXME: handle the case where more than INT32_MAX transactions exist.
// (CG: used to be INT64_MAX, changed by MS to INT32_MAX, why? To be discussed with him!)
wa->dhh = TALER_BANK_debit_history (ctx, wa->dhh = TALER_BANK_debit_history (ctx,
wa->ai->auth, wa->ai->auth,
wa->out_wire_off, wa->out_wire_off,
INT64_MAX, INT32_MAX,
GNUNET_TIME_UNIT_ZERO, GNUNET_TIME_UNIT_ZERO,
&history_debit_cb, &history_debit_cb,
wa); wa);
@ -2012,10 +2014,12 @@ process_credits (void *cls)
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Starting bank CREDIT history of account `%s'\n", "Starting bank CREDIT history of account `%s'\n",
wa->ai->section_name); wa->ai->section_name);
// NOTE: handle the case where more than INT32_MAX transactions exist.
// (CG: used to be INT64_MAX, changed by MS to INT32_MAX, why? To be discussed with him!)
wa->chh = TALER_BANK_credit_history (ctx, wa->chh = TALER_BANK_credit_history (ctx,
wa->ai->auth, wa->ai->auth,
wa->in_wire_off, wa->in_wire_off,
INT64_MAX, INT32_MAX,
GNUNET_TIME_UNIT_ZERO, GNUNET_TIME_UNIT_ZERO,
&history_credit_cb, &history_credit_cb,
wa); wa);

View File

@ -28,6 +28,11 @@ TESTS=${1:-$ALL_TESTS}
# VALGRIND=valgrind # VALGRIND=valgrind
VALGRIND="" VALGRIND=""
# Number of seconds to let libeuifn background
# tasks apply a cycle of payment submission and
# history request.
LIBEUFIN_SETTLE_TIME=1
# Exit, with status code "skip" (no 'real' failure) # Exit, with status code "skip" (no 'real' failure)
function exit_skip() { function exit_skip() {
echo $1 echo $1
@ -48,17 +53,72 @@ function cleanup()
kill $n 2> /dev/null || true kill $n 2> /dev/null || true
done done
wait wait
# kill euFin
echo Killing euFin..
kill `cat libeufin-sandbox.pid 2> /dev/null` &> /dev/null || true
kill `cat libeufin-nexus.pid 2> /dev/null` &> /dev/null || true
} }
# Install cleanup handler (except for kill -9) # Install cleanup handler (except for kill -9)
trap cleanup EXIT trap cleanup EXIT
function launch_libeufin () {
export LIBEUFIN_NEXUS_DB_CONNECTION="jdbc:sqlite:$DB.sqlite3"
libeufin-nexus serve --port 8082 \
2> libeufin-nexus-stderr.log \
> libeufin-nexus-stdout.log &
echo $! > libeufin-nexus.pid
export LIBEUFIN_SANDBOX_DB_CONNECTION="jdbc:sqlite:$DB.sqlite3"
export LIBEUFIN_SANDBOX_ADMIN_PASSWORD=secret
libeufin-sandbox serve --port 18082 \
> libeufin-sandbox-stdout.log \
2> libeufin-sandbox-stderr.log &
echo $! > libeufin-sandbox.pid
}
# Downloads new transactions from the bank.
function nexus_fetch_transactions () {
export LIBEUFIN_NEXUS_USERNAME=exchange
export LIBEUFIN_NEXUS_PASSWORD=x
export LIBEUFIN_NEXUS_URL=http://localhost:8082/
libeufin-cli accounts fetch-transactions \
--range-type since-last --level report exchange-nexus > /dev/null
unset LIBEUFIN_NEXUS_USERNAME
unset LIBEUFIN_NEXUS_PASSWORD
unset LIBEUFIN_NEXUS_URL
}
# Instruct Nexus to all the prepared payments (= those
# POSTed to /transfer by the exchange).
function nexus_submit_to_sandbox () {
export LIBEUFIN_NEXUS_USERNAME=exchange
export LIBEUFIN_NEXUS_PASSWORD=x
export LIBEUFIN_NEXUS_URL=http://localhost:8082/
libeufin-cli accounts submit-payments exchange-nexus
unset LIBEUFIN_NEXUS_USERNAME
unset LIBEUFIN_NEXUS_PASSWORD
unset LIBEUFIN_NEXUS_URL
}
# Operations to run before the actual audit # Operations to run before the actual audit
function pre_audit () { function pre_audit () {
# Launch bank # Launch bank
echo -n "Launching bank " echo -n "Launching bank"
taler-bank-manage-testing $CONF postgres:///$DB serve 2>bank.err >bank.log & EXCHANGE_URL=`taler-config -c $CONF -s EXCHANGE -o BASE_URL`
launch_libeufin
for n in `seq 1 80`
do
echo -n "."
sleep 0.1
OK=1
wget http://localhost:18082/ -o /dev/null -O /dev/null >/dev/null && break
OK=0
done
if [ 1 != $OK ]
then
exit_skip "Failed to launch Sandbox"
fi
sleep $LIBEUFIN_SETTLE_TIME
for n in `seq 1 80` for n in `seq 1 80`
do do
echo -n "." echo -n "."
@ -69,7 +129,7 @@ function pre_audit () {
done done
if [ 1 != $OK ] if [ 1 != $OK ]
then then
exit_skip "Failed to launch bank" exit_skip "Failed to launch Nexus"
fi fi
echo " DONE" echo " DONE"
if test ${1:-no} = "aggregator" if test ${1:-no} = "aggregator"
@ -83,6 +143,13 @@ function pre_audit () {
echo -n "Running exchange transfer ..." echo -n "Running exchange transfer ..."
taler-exchange-transfer -L INFO -t -c $CONF 2> transfer.log || exit_fail "FAIL" taler-exchange-transfer -L INFO -t -c $CONF 2> transfer.log || exit_fail "FAIL"
echo " DONE" echo " DONE"
echo -n "Running Nexus payment submitter ..."
nexus_submit_to_sandbox
echo " DONE"
# Make outgoing transactions appear in the TWG:
echo -n "Download bank transactions ..."
nexus_fetch_transactions
echo " DONE"
fi fi
} }
@ -111,7 +178,7 @@ function audit_only () {
echo -n "." echo -n "."
$VALGRIND taler-helper-auditor-wire -i -L DEBUG -c $CONF -m $MASTER_PUB > test-audit-wire.json 2> test-wire-audit.log || exit_fail "wire audit failed" $VALGRIND taler-helper-auditor-wire -i -L DEBUG -c $CONF -m $MASTER_PUB > test-audit-wire.json 2> test-wire-audit.log || exit_fail "wire audit failed"
echo -n "." echo -n "."
$VALGRIND taler-helper-auditor-wire -i -L DEBUG -c $CONF -m $MASTER_PUB > test-audit-wire-inc.json 2> test-wire-audit-inc.log || exit_fail "wire audit failed" $VALGRIND taler-helper-auditor-wire -i -L DEBUG -c $CONF -m $MASTER_PUB > test-audit-wire-inc.json 2> test-wire-audit-inc.log || exit_fail "wire audit inc failed"
echo -n "." echo -n "."
echo " DONE" echo " DONE"
@ -166,11 +233,14 @@ function run_audit () {
# Do a full reload of the (original) database # Do a full reload of the (original) database
full_reload() full_reload()
{ {
echo -n "Doing full reload of the database... " echo "Doing full reload of the database... "
dropdb $DB 2> /dev/null || true dropdb $DB 2> /dev/null || true
rm $DB.sqlite3 2> /dev/null || true # libeufin
createdb -T template0 $DB || exit_skip "could not create database" createdb -T template0 $DB || exit_skip "could not create database"
# Import pre-generated database, -q(ietly) using single (-1) transaction # Import pre-generated database, -q(ietly) using single (-1) transaction
psql -Aqt $DB -q -1 -f ${BASEDB}.sql > /dev/null || exit_skip "Failed to load database" psql -Aqt $DB -q -1 -f ${BASEDB}.sql > /dev/null || exit_skip "Failed to load database"
echo "Loading libeufin basedb: ${BASEDB}-libeufin.sql"
sqlite3 $DB.sqlite3 < ${BASEDB}-libeufin.sql || exit_skip "Failed to load libEufin database"
echo "DONE" echo "DONE"
} }
@ -179,7 +249,6 @@ function test_0() {
echo "===========0: normal run with aggregator===========" echo "===========0: normal run with aggregator==========="
run_audit aggregator run_audit aggregator
echo "Checking output" echo "Checking output"
# if an emergency was detected, that is a bug and we should fail # if an emergency was detected, that is a bug and we should fail
echo -n "Test for emergencies... " echo -n "Test for emergencies... "
@ -379,7 +448,7 @@ echo "OK"
# Change amount of wire transfer reported by exchange # Change amount of wire transfer reported by exchange
function test_2() { function test_2() {
echo "===========2: reserves_in inconsistency===========" echo "===========2: reserves_in inconsistency ==========="
echo "UPDATE reserves_in SET credit_val=5 WHERE reserve_in_serial_id=1" | psql -At $DB echo "UPDATE reserves_in SET credit_val=5 WHERE reserve_in_serial_id=1" | psql -At $DB
run_audit run_audit
@ -671,10 +740,10 @@ echo "UPDATE reserves_out SET reserve_sig='$OLD_SIG' WHERE h_blind_ev='$HBE'" |
function test_8() { function test_8() {
echo "===========8: wire-transfer-subject disagreement===========" echo "===========8: wire-transfer-subject disagreement==========="
OLD_ID=`echo "SELECT id FROM app_banktransaction WHERE amount='TESTKUDOS:10' ORDER BY id LIMIT 1;" | psql $DB -Aqt` OLD_ID=`echo "SELECT id FROM NexusBankTransactions WHERE amount='10' AND currency='TESTKUDOS' ORDER BY id LIMIT 1;" | sqlite3 $DB.sqlite3`
OLD_WTID=`echo "SELECT subject FROM app_banktransaction WHERE id='$OLD_ID';" | psql $DB -Aqt` OLD_WTID=`echo "SELECT reservePublicKey FROM TalerIncomingPayments WHERE payment='$OLD_ID';" | sqlite3 $DB.sqlite3`
NEW_WTID="CK9QBFY972KR32FVA1MW958JWACEB6XCMHHKVFMCH1A780Q12SVG" NEW_WTID="CK9QBFY972KR32FVA1MW958JWACEB6XCMHHKVFMCH1A780Q12SVG"
echo "UPDATE app_banktransaction SET subject='$NEW_WTID' WHERE id='$OLD_ID';" | psql -Aqt $DB echo "UPDATE TalerIncomingPayments SET reservePublicKey='$NEW_WTID' WHERE payment='$OLD_ID';" | sqlite3 $DB.sqlite3
run_audit run_audit
@ -731,19 +800,18 @@ fi
echo PASS echo PASS
# Undo database modification # Undo database modification
echo "UPDATE app_banktransaction SET subject='$OLD_WTID' WHERE id='$OLD_ID';" | psql -Aqt $DB echo "UPDATE TalerIncomingPayments SET reservePublicKey='$OLD_WTID' WHERE payment='$OLD_ID';" | sqlite3 $DB.sqlite3
} }
# Test wire origin disagreement! # Test wire origin disagreement!
function test_9() { function test_9() {
echo "===========9: wire-origin disagreement===========" echo "===========9: wire-origin disagreement==========="
OLD_ID=`echo "SELECT id FROM app_banktransaction WHERE amount='TESTKUDOS:10' ORDER BY id LIMIT 1;" | psql $DB -Aqt` OLD_ID=`echo "SELECT id FROM NexusBankTransactions WHERE amount='10' AND currency='TESTKUDOS' ORDER BY id LIMIT 1;" | sqlite3 $DB.sqlite3`
OLD_ACC=`echo "SELECT debit_account_id FROM app_banktransaction WHERE id='$OLD_ID';" | psql $DB -Aqt` OLD_ACC=`echo "SELECT incomingPaytoUri FROM TalerIncomingPayments WHERE payment='$OLD_ID';" | sqlite3 $DB.sqlite3`
echo "UPDATE app_banktransaction SET debit_account_id=1 WHERE id='$OLD_ID';" | psql -Aqt $DB echo "UPDATE TalerIncomingPayments SET incomingPaytoUri='payto://iban/SANDBOXX/DE144373?receiver-name=New+Exchange+Company' WHERE payment='$OLD_ID';" | sqlite3 $DB.sqlite3
run_audit run_audit
@ -761,18 +829,18 @@ fi
echo PASS echo PASS
# Undo database modification # Undo database modification
echo "UPDATE app_banktransaction SET debit_account_id=$OLD_ACC WHERE id='$OLD_ID';" | psql -Aqt $DB echo "UPDATE TalerIncomingPayments SET incomingPaytoUri='$OLD_ACC' WHERE payment='$OLD_ID';" | sqlite3 $DB.sqlite3
} }
# Test wire_in timestamp disagreement! # Test wire_in timestamp disagreement!
function test_10() { function test_10() {
NOW_MS=`date +%s`000
echo "===========10: wire-timestamp disagreement===========" echo "===========10: wire-timestamp disagreement==========="
OLD_ID=`echo "SELECT id FROM app_banktransaction WHERE amount='TESTKUDOS:10' ORDER BY id LIMIT 1;" | psql $DB -Aqt` OLD_ID=`echo "SELECT id FROM NexusBankTransactions WHERE amount='10' AND currency='TESTKUDOS' ORDER BY id LIMIT 1;" | sqlite3 $DB.sqlite3`
OLD_DATE=`echo "SELECT date FROM app_banktransaction WHERE id='$OLD_ID';" | psql $DB -Aqt` OLD_DATE=`echo "SELECT timestampMs FROM TalerIncomingPayments WHERE payment='$OLD_ID';" | sqlite3 $DB.sqlite3`
echo "UPDATE app_banktransaction SET date=NOW() WHERE id=$OLD_ID;" | psql -Aqt $DB echo "UPDATE TalerIncomingPayments SET timestampMs=$NOW_MS WHERE payment=$OLD_ID;" | sqlite3 $DB.sqlite3
run_audit run_audit
@ -790,24 +858,35 @@ fi
echo PASS echo PASS
# Undo database modification # Undo database modification
echo "UPDATE app_banktransaction SET date='$OLD_DATE' WHERE id=$OLD_ID;" | psql -Aqt $DB echo "UPDATE TalerIncomingPayments SET timestampMs='$OLD_DATE' WHERE payment=$OLD_ID;" | sqlite3 $DB.sqlite3
} }
# Test for extra outgoing wire transfer. # Test for extra outgoing wire transfer.
# In case of changing the subject in the Nexus
# ingested table: '.batches[0].batchTransactions[0].details.unstructuredRemittanceInformation'
function test_11() { function test_11() {
echo "===========11: spurious outgoing transfer ===========" echo "===========11: spurious outgoing transfer ==========="
OLD_ID=`echo "SELECT id FROM app_banktransaction WHERE amount='TESTKUDOS:10' ORDER BY id LIMIT 1;" | psql $DB -Aqt` OLD_ID=`echo "SELECT id FROM NexusBankTransactions WHERE amount='10' AND currency='TESTKUDOS' ORDER BY id LIMIT 1;" | sqlite3 $DB.sqlite3`
OLD_ACC=`echo "SELECT debit_account_id FROM app_banktransaction WHERE id=$OLD_ID;" | psql $DB -Aqt` OLD_TX=`echo "SELECT transactionJson FROM NexusBankTransactions WHERE id='$OLD_ID';" | sqlite3 $DB.sqlite3`
OLD_SUBJECT=`echo "SELECT subject FROM app_banktransaction WHERE id=$OLD_ID;" | psql $DB -Aqt`
# Change wire transfer to be FROM the exchange (#2) to elsewhere! # Change wire transfer to be FROM the exchange (#2) to elsewhere!
# (Note: this change also causes a missing incoming wire transfer, but # (Note: this change also causes a missing incoming wire transfer, but
# this test is only concerned about the outgoing wire transfer # this test is only concerned about the outgoing wire transfer
# being detected as such, and we simply ignore the other # being detected as such, and we simply ignore the other
# errors being reported.) # errors being reported.)
echo -e "UPDATE app_banktransaction SET debit_account_id=2,credit_account_id=1,subject='CK9QBFY972KR32FVA1MW958JWACEB6XCMHHKVFMCH1A780Q12SVG http://exchange.example.com/' WHERE id=$OLD_ID;" | psql -Aqt $DB OTHER_IBAN=`echo -e "SELECT iban FROM BankAccounts WHERE label='fortytwo'" | sqlite3 $DB.sqlite3`
NEW_TX=$(echo "$OLD_TX" | jq .batches[0].batchTransactions[0].details.creditDebitIndicator='"DBIT"' | jq 'del(.batches[0].batchTransactions[0].details.debtor)' | jq 'del(.batches[0].batchTransactions[0].details.debtorAccount)' | jq 'del(.batches[0].batchTransactions[0].details.debtorAgent)' | jq '.batches[0].batchTransactions[0].details.creditor'='{"name": "Forty Two"}' | jq .batches[0].batchTransactions[0].details.creditorAccount='{"iban": "'$OTHER_IBAN'"}' | jq .batches[0].batchTransactions[0].details.creditorAgent='{"bic": "SANDBOXX"}' | jq .batches[0].batchTransactions[0].details.unstructuredRemittanceInformation='"CK9QBFY972KR32FVA1MW958JWACEB6XCMHHKVFMCH1A780Q12SVG http://exchange.example.com/"')
echo -e "UPDATE NexusBankTransactions SET transactionJson='"$NEW_TX"' WHERE id=$OLD_ID" | sqlite3 $DB.sqlite3
# Now fake that the exchange prepared this payment (= it POSTed to /transfer)
# This step is necessary, because the TWG table that accounts for outgoing
# payments needs it. Worth noting here is the column 'rawConfirmation' that
# points to the transaction from the main Nexus ledger; without that column set,
# a prepared payment won't appear as actually outgoing.
echo -e "INSERT INTO PaymentInitiations (bankAccount,preparationDate,submissionDate,sum,currency,endToEndId,paymentInformationId,instructionId,subject,creditorIban,creditorBic,creditorName,submitted,messageId,rawConfirmation) VALUES (1,1,1,10,'TESTKUDOS','NOTGIVEN','unused','unused','CK9QBFY972KR32FVA1MW958JWACEB6XCMHHKVFMCH1A780Q12SVG http://exchange.example.com/','"$OTHER_IBAN"','SANDBOXX','Forty Two','unused',1,$OLD_ID)" | sqlite3 $DB.sqlite3
# Now populate the TWG table that accounts for outgoing payments, in
# order to let /history/outgoing return one result.
echo -e "INSERT INTO TalerRequestedPayments (facade,payment,requestUid,amount,exchangeBaseUrl,wtid,creditAccount) VALUES (1,1,'unused','TESTKUDOS:10','http://exchange.example.com/','CK9QBFY972KR32FVA1MW958JWACEB6XCMHHKVFMCH1A780Q12SVG','payto://iban/SANDBOXX/"$OTHER_IBAN"?receiver-name=Forty+Two')" | sqlite3 $DB.sqlite3
run_audit run_audit
@ -839,13 +918,14 @@ then
fi fi
echo PASS echo PASS
# Undo database modification (exchange always has account #2) # Undo database modification
echo "UPDATE app_banktransaction SET debit_account_id=$OLD_ACC,credit_account_id=2,subject='$OLD_SUBJECT' WHERE id=$OLD_ID;" | psql -Aqt $DB echo -e "UPDATE NexusBankTransactions SET transactionJson='"$OLD_TX"' WHERE id=$OLD_ID;" | sqlite3 $DB.sqlite3
# No other prepared payment should exist at this point,
# so OK to remove the number 1.
echo -e "DELETE FROM PaymentInitiations WHERE id=1" | sqlite3 $DB.sqlite3
echo -e "DELETE FROM TalerRequestedPayments WHERE id=1" | sqlite3 $DB.sqlite3
} }
# Test for hanging/pending refresh. # Test for hanging/pending refresh.
function test_12() { function test_12() {
@ -999,13 +1079,11 @@ then
pre_audit aggregator pre_audit aggregator
# Modify wire amount, such that it is inconsistent with 'aggregation' # Modify wire amount, such that it is inconsistent with 'aggregation'
# (exchange account is #2, so the logic below should select the outgoing # (Only one payment out exist, so the logic below should select the outgoing
# wire transfer): # wire transfer):
OLD_ID=`echo "SELECT id FROM app_banktransaction WHERE debit_account_id=2 ORDER BY id LIMIT 1;" | psql $DB -Aqt` OLD_AMOUNT=`echo "SELECT amount FROM TalerRequestedPayments WHERE id='1';" | sqlite3 $DB.sqlite3`
OLD_AMOUNT=`echo "SELECT amount FROM app_banktransaction WHERE id='${OLD_ID}';" | psql $DB -Aqt`
NEW_AMOUNT="TESTKUDOS:50" NEW_AMOUNT="TESTKUDOS:50"
echo "UPDATE app_banktransaction SET amount='${NEW_AMOUNT}' WHERE id='${OLD_ID}';" | psql -Aqt $DB echo "UPDATE TalerRequestedPayments SET amount='${NEW_AMOUNT}' WHERE id='1';" | sqlite3 $DB.sqlite3
audit_only audit_only
echo -n "Testing inconsistency detection... " echo -n "Testing inconsistency detection... "
@ -1034,8 +1112,7 @@ then
echo "Second modification: wire nothing" echo "Second modification: wire nothing"
NEW_AMOUNT="TESTKUDOS:0" NEW_AMOUNT="TESTKUDOS:0"
echo "UPDATE app_banktransaction SET amount='${NEW_AMOUNT}' WHERE id='${OLD_ID}';" | psql -Aqt $DB echo "UPDATE TalerRequestedPayments SET amount='${NEW_AMOUNT}' WHERE id='1';" | sqlite3 $DB.sqlite3
audit_only audit_only
echo -n "Testing inconsistency detection... " echo -n "Testing inconsistency detection... "
@ -1078,7 +1155,6 @@ fi
# Test where wire-out timestamp is wrong # Test where wire-out timestamp is wrong
function test_17() { function test_17() {
echo "===========17: incorrect wire_out timestamp=================" echo "===========17: incorrect wire_out timestamp================="
# Check wire transfer lag reported (no aggregator!) # Check wire transfer lag reported (no aggregator!)
# NOTE: This test is EXPECTED to fail for ~1h after # NOTE: This test is EXPECTED to fail for ~1h after
# re-generating the test database as we do not # re-generating the test database as we do not
@ -1092,14 +1168,15 @@ then
pre_audit aggregator pre_audit aggregator
# Modify wire amount, such that it is inconsistent with 'aggregation' # Modify wire amount, such that it is inconsistent with 'aggregation'
# (exchange account is #2, so the logic below should select the outgoing # (exchange payed only once, so the logic below should select the outgoing
# wire transfer): # wire transfer):
OLD_ID=`echo "SELECT id FROM app_banktransaction WHERE debit_account_id=2 ORDER BY id LIMIT 1;" | psql $DB -Aqt` OLD_ID=1
OLD_DATE=`echo "SELECT date FROM app_banktransaction WHERE id='${OLD_ID}';" | psql $DB -Aqt` OLD_PREP=`echo "SELECT payment FROM TalerRequestedPayments WHERE id='${OLD_ID}';" | sqlite3 $DB.sqlite3`
OLD_DATE=`echo "SELECT preparationDate FROM PaymentInitiations WHERE id='${OLD_ID}';" | sqlite3 $DB.sqlite3`
# Note: need - interval '1h' as "NOW()" may otherwise be exactly what is already in the DB # Note: need - interval '1h' as "NOW()" may otherwise be exactly what is already in the DB
# (due to rounding, if this machine is fast...) # (due to rounding, if this machine is fast...)
echo "UPDATE app_banktransaction SET date=NOW()- interval '1 hour' WHERE id='${OLD_ID}';" | psql -Aqt $DB NOW_1HR=$(expr $(date +%s) - 3600)
echo "UPDATE PaymentInitiations SET preparationDate='$NOW_1HR' WHERE id='${OLD_PREP}';" | sqlite3 $DB.sqlite3
audit_only audit_only
post_audit post_audit
@ -1272,8 +1349,8 @@ then
pre_audit aggregator pre_audit aggregator
# remove transaction from bank DB # remove transaction from bank DB
echo "DELETE FROM app_banktransaction WHERE debit_account_id=2 AND amount='TESTKUDOS:${VAL_DELTA}';" | psql -Aqt $DB # Currently emulating this (to be deleted):
echo "DELETE FROM TalerRequestedPayments WHERE amount='TESTKUDOS:${VAL_DELTA}'" | sqlite3 $DB.sqlite3
audit_only audit_only
post_audit post_audit
@ -1559,12 +1636,13 @@ then
pre_audit aggregator pre_audit aggregator
# Obtain data to duplicate. # Obtain data to duplicate.
ID=`echo "SELECT id FROM app_banktransaction WHERE debit_account_id=2 LIMIT 1" | psql $DB -Aqt` WTID=`echo SELECT wtid FROM TalerRequestedPayments WHERE id=1 | sqlite3 $DB.sqlite3`
WTID=`echo "SELECT subject FROM app_banktransaction WHERE debit_account_id=2 LIMIT 1" | psql $DB -Aqt`
echo WTID=$WTID echo WTID=$WTID
UUID="992e8936-a64d-4845-87d7-021440330f8a" OTHER_IBAN=`echo -e "SELECT iban FROM BankAccounts WHERE label='fortytwo'" | sqlite3 $DB.sqlite3`
echo "INSERT INTO app_banktransaction (amount,subject,date,credit_account_id,debit_account_id,cancelled,request_uid) VALUES ('TESTKUDOS:1','$WTID',NOW(),12,2,'f','$UUID')" | psql -Aqt $DB # 'rawConfirmation' is set to 2 here, that doesn't
# point to any record. That's only needed to set a non null value.
echo -e "INSERT INTO PaymentInitiations (bankAccount,preparationDate,submissionDate,sum,currency,endToEndId,paymentInformationId,instructionId,subject,creditorIban,creditorBic,creditorName,submitted,messageId,rawConfirmation) VALUES (1,$(date +%s),$(expr $(date +%s) + 2),10,'TESTKUDOS','NOTGIVEN','unused','unused','$WTID http://exchange.example.com/','$OTHER_IBAN','SANDBOXX','Forty Two','unused',1,2)" | sqlite3 $DB.sqlite3
echo -e "INSERT INTO TalerRequestedPayments (facade,payment,requestUid,amount,exchangeBaseUrl,wtid,creditAccount) VALUES (1,2,'unused','TESTKUDOS:1','http://exchange.example.com/','$WTID','payto://iban/SANDBOXX/$OTHER_IBAN?receiver-name=Forty+Two')" | sqlite3 $DB.sqlite3
audit_only audit_only
post_audit post_audit
@ -2003,8 +2081,9 @@ CONF=${DB}.conf
# test required commands exist # test required commands exist
echo "Testing for jq" echo "Testing for jq"
jq -h > /dev/null || exit_skip "jq required" jq -h > /dev/null || exit_skip "jq required"
echo "Testing for taler-bank-manage" # NOTE: really check for all three libeufin commands?
taler-bank-manage --help >/dev/null </dev/null || exit_skip "taler-bank-manage required" echo "Testing for libeufin"
libeufin-cli --help >/dev/null </dev/null || exit_skip "libeufin required"
echo "Testing for pdflatex" echo "Testing for pdflatex"
which pdflatex > /dev/null </dev/null || exit_skip "pdflatex required" which pdflatex > /dev/null </dev/null || exit_skip "pdflatex required"

View File

@ -47,17 +47,89 @@ function cleanup()
kill $n 2> /dev/null || true kill $n 2> /dev/null || true
done done
wait wait
# kill euFin
echo Killing euFin..
kill `cat libeufin-sandbox.pid 2> /dev/null` &> /dev/null || true
kill `cat libeufin-nexus.pid 2> /dev/null` &> /dev/null || true
# So far only Sandbox gave exit issues / delays ..
count=0
while ps xo pid | grep `cat libeufin-sandbox.pid`; do
if test $count = 5; then
echo "Sandbox unkillable, failing now .."
exit 1
fi
echo "Sandbox didn't exit yet.."
sleep 1;
count=`expr $count + 1`
done
} }
# Install cleanup handler (except for kill -9) # Install cleanup handler (except for kill -9)
trap cleanup EXIT trap cleanup EXIT
# Downloads new transactions from the bank.
function nexus_fetch_transactions () {
export LIBEUFIN_NEXUS_USERNAME=exchange
export LIBEUFIN_NEXUS_PASSWORD=x
export LIBEUFIN_NEXUS_URL=http://localhost:8082/
libeufin-cli accounts fetch-transactions \
--range-type since-last --level report exchange-nexus > /dev/null
unset LIBEUFIN_NEXUS_USERNAME
unset LIBEUFIN_NEXUS_PASSWORD
unset LIBEUFIN_NEXUS_URL
}
# Instruct Nexus to all the prepared payments (= those
# POSTed to /transfer by the exchange).
function nexus_submit_to_sandbox () {
export LIBEUFIN_NEXUS_USERNAME=exchange
export LIBEUFIN_NEXUS_PASSWORD=x
export LIBEUFIN_NEXUS_URL=http://localhost:8082/
libeufin-cli accounts submit-payments exchange-nexus
unset LIBEUFIN_NEXUS_USERNAME
unset LIBEUFIN_NEXUS_PASSWORD
unset LIBEUFIN_NEXUS_URL
}
function get_payto_uri() {
export LIBEUFIN_SANDBOX_USERNAME=$1
export LIBEUFIN_SANDBOX_PASSWORD=$2
export LIBEUFIN_SANDBOX_URL=http://localhost:18082/demobanks/default
libeufin-cli sandbox demobank info --bank-account $1 | jq --raw-output '.paytoUri'
}
function launch_libeufin () {
export LIBEUFIN_NEXUS_DB_CONNECTION="jdbc:sqlite:$DB.sqlite3"
libeufin-nexus serve --port 8082 \
2> libeufin-nexus-stderr.log \
> libeufin-nexus-stdout.log &
echo $! > libeufin-nexus.pid
export LIBEUFIN_SANDBOX_DB_CONNECTION="jdbc:sqlite:$DB.sqlite3"
export LIBEUFIN_SANDBOX_ADMIN_PASSWORD=secret
libeufin-sandbox serve --port 18082 \
> libeufin-sandbox-stdout.log \
2> libeufin-sandbox-stderr.log &
echo $! > libeufin-sandbox.pid
}
# Operations to run before the actual audit # Operations to run before the actual audit
function pre_audit () { function pre_audit () {
# Launch bank # Launch bank
echo -n "Launching bank " echo -n "Launching bank "
taler-bank-manage-testing $CONF postgres:///$DB serve 2>bank.err >bank.log & EXCHANGE_URL=`taler-config -c $CONF -s EXCHANGE -o BASE_URL`
launch_libeufin
for n in `seq 1 80`
do
echo -n "."
sleep 0.1
OK=1
wget http://localhost:18082/ -o /dev/null -O /dev/null >/dev/null && break
OK=0
done
if [ 1 != $OK ]
then
exit_skip "Failed to launch Sandbox"
fi
for n in `seq 1 80` for n in `seq 1 80`
do do
echo -n "." echo -n "."
@ -68,14 +140,13 @@ function pre_audit () {
done done
if [ 1 != $OK ] if [ 1 != $OK ]
then then
exit_skip "Failed to launch bank" exit_skip "Failed to launch Nexus"
fi fi
echo " DONE" echo " DONE"
if test ${1:-no} = "aggregator" if test ${1:-no} = "aggregator"
then then
export CONF export CONF
echo -n "Running exchange aggregator ..." echo -n "Running exchange aggregator ... (config: $CONF)"
taler-exchange-aggregator -L INFO -t -c $CONF -y 2> aggregator.log || exit_fail "FAIL" taler-exchange-aggregator -L INFO -t -c $CONF -y 2> aggregator.log || exit_fail "FAIL"
echo " DONE" echo " DONE"
echo -n "Running exchange closer ..." echo -n "Running exchange closer ..."
@ -84,13 +155,20 @@ function pre_audit () {
echo -n "Running exchange transfer ..." echo -n "Running exchange transfer ..."
taler-exchange-transfer -L INFO -t -c $CONF 2> transfer.log || exit_fail "FAIL" taler-exchange-transfer -L INFO -t -c $CONF 2> transfer.log || exit_fail "FAIL"
echo " DONE" echo " DONE"
echo -n "Running Nexus payment submitter ..."
nexus_submit_to_sandbox
echo " DONE"
# Make outgoing transactions appear in the TWG:
echo -n "Download bank transactions ..."
nexus_fetch_transactions
echo " DONE"
fi fi
} }
# actual audit run # actual audit run
function audit_only () { function audit_only () {
# Run the auditor! # Run the auditor!
echo -n "Running audit(s) ..." echo -n "Running audit(s) ... (conf is $CONF)"
# Restart so that first run is always fresh, and second one is incremental # Restart so that first run is always fresh, and second one is incremental
taler-auditor-dbinit -r -c $CONF taler-auditor-dbinit -r -c $CONF
@ -152,10 +230,22 @@ full_reload()
{ {
echo -n "Doing full reload of the database... " echo -n "Doing full reload of the database... "
dropdb $DB 2> /dev/null || true dropdb $DB 2> /dev/null || true
rm -f $DB.sqlite3 || true # libeufin
createdb -T template0 $DB || exit_skip "could not create database" createdb -T template0 $DB || exit_skip "could not create database"
# Import pre-generated database, -q(ietly) using single (-1) transaction # Import pre-generated database, -q(ietly) using single (-1) transaction
psql -Aqt $DB -q -1 -f ${BASEDB}.sql > /dev/null || exit_skip "Failed to load database" psql -Aqt $DB -q -1 -f ${BASEDB}.sql > /dev/null || exit_skip "Failed to load database"
sqlite3 $DB.sqlite3 < ${BASEDB}-libeufin.sql || exit_skip "Failed to load libEufin database"
echo "DONE" echo "DONE"
# Exchange payto URI contains the (dynamically generated)
# IBAN, that can only be written in CONF after libeufin is
# setup.
taler-config -c $CONF -s exchange-account-1 -o PAYTO_URI &> /dev/null || (
echo -n "Specifying exchange payto URI in the configuration ($CONF) (grab IBAN from $DB.sqlite3)...";
EXCHANGE_IBAN=`echo "SELECT iban FROM BankAccounts WHERE label='exchange'" | sqlite3 $DB.sqlite3`;
taler-config -c $CONF -s exchange-account-1 -o PAYTO_URI \
-V "payto://iban/SANDBOXX/$EXCHANGE_IBAN?receiver-name=Exchange+Company"
echo " DONE"
)
} }
@ -462,7 +552,6 @@ check_with_database()
# Load database # Load database
full_reload full_reload
# Run test suite # Run test suite
fail=0 fail=0
for i in $TESTS for i in $TESTS
@ -492,8 +581,8 @@ CONF=revoke-basedb.conf
# test required commands exist # test required commands exist
echo "Testing for jq" echo "Testing for jq"
jq -h > /dev/null || exit_skip "jq required" jq -h > /dev/null || exit_skip "jq required"
echo "Testing for taler-bank-manage" echo "Testing for libeufin(-cli)"
taler-bank-manage --help >/dev/null </dev/null || exit_skip "taler-bank-manage required" libeufin-cli --help >/dev/null </dev/null || exit_skip "libeufin required"
echo "Testing for pdflatex" echo "Testing for pdflatex"
which pdflatex > /dev/null </dev/null || exit_skip "pdflatex required" which pdflatex > /dev/null </dev/null || exit_skip "pdflatex required"

View File

@ -37,6 +37,13 @@
#define CONFIG_FILE_PYBANK "test_bank_api_pybank.conf" #define CONFIG_FILE_PYBANK "test_bank_api_pybank.conf"
#define CONFIG_FILE_NEXUS "test_bank_api_nexus.conf" #define CONFIG_FILE_NEXUS "test_bank_api_nexus.conf"
/**
* Configuration file. It changes based on
* whether Nexus or Fakebank are used.
*/
const char *cfgfile;
/** /**
* Bank configuration data. * Bank configuration data.
*/ */
@ -88,14 +95,24 @@ run (void *cls,
"KUDOS:5.01", "KUDOS:5.01",
&bc.exchange_auth, &bc.exchange_auth,
bc.user42_payto), bc.user42_payto),
/**
* This CMD doesn't care about the HTTP response code; that's
* because Fakebank and euFin behaves differently when a reserve
* pub is duplicate. Fakebank responds with 409, whereas euFin
* with 200 but it bounces the payment back to the customer.
*/
TALER_TESTING_cmd_admin_add_incoming_with_ref ("credit-1-fail", TALER_TESTING_cmd_admin_add_incoming_with_ref ("credit-1-fail",
"KUDOS:2.01", "KUDOS:2.01",
&bc.exchange_auth, &bc.exchange_auth,
bc.user42_payto, bc.user42_payto,
"credit-1", "credit-1",
MHD_HTTP_CONFLICT), -1),
TALER_TESTING_cmd_sleep ("Waiting 4s for 'credit-1' to settle", TALER_TESTING_cmd_sleep ("Waiting 4s for 'credit-1' to settle",
4), 4),
/**
* Check that the incoming payment with a duplicate
* reserve public key didn't make it to the exchange.
*/
TALER_TESTING_cmd_bank_credits ("history-1c", TALER_TESTING_cmd_bank_credits ("history-1c",
&bc.exchange_auth, &bc.exchange_auth,
NULL, NULL,
@ -164,7 +181,6 @@ main (int argc,
char *const *argv) char *const *argv)
{ {
int rv; int rv;
const char *cfgfile;
(void) argc; (void) argc;
(void) argv; (void) argv;

View File

@ -1,22 +1,20 @@
# This file is in the public domain. # This file is in the public domain.
[taler] [taler]
currency = KUDOS currency = TESTKUDOS
[exchange-account-2] [exchange-account-2]
PAYTO_URI = payto://iban/BIC/ES9121000418450200051332?receiver-name=Exchange PAYTO_URI = payto://iban/BIC/ES9121000418450200051332?receiver-name=Exchange
[exchange-accountcredentials-2] [exchange-accountcredentials-2]
WIRE_GATEWAY_URL = http://localhost:5001/facades/my-facade/taler/ WIRE_GATEWAY_URL = http://localhost:5001/facades/my-facade/taler-wire-gateway/
WIRE_GATEWAY_AUTH_METHOD = basic WIRE_GATEWAY_AUTH_METHOD = basic
# the exchange authenticates as the 'admin' user, USERNAME = exchange
# since that makes the test preparation just easier.
USERNAME = Exchange
PASSWORD = x PASSWORD = x
[bank] [bank]
# not (!) used by the nexus, only by the helper # not (!) used by the nexus, only by the helper
# check to make sure the port is free for the nexus. # check to make sure the port is free for Nexus.
HTTP_PORT = 5001 HTTP_PORT = 5001
[auditor] [auditor]

View File

@ -217,6 +217,26 @@ confirmation_cb (void *cls,
fts->reserve_history.details.in_details.timestamp = timestamp; fts->reserve_history.details.in_details.timestamp = timestamp;
fts->reserve_history.details.in_details.wire_reference = serial_id; fts->reserve_history.details.in_details.wire_reference = serial_id;
fts->aih = NULL; fts->aih = NULL;
/**
* Test case not caring about the HTTP status code.
* That helps when Fakebank and Libeufin diverge in
* the response status code. An example is the
* /admin/add-incoming: libeufin return ALWAYS '200 OK'
* (see note below) whereas the Fakebank responds with
* '409 Conflict' upon a duplicate reserve public key.
*
* Note: this decision aims at avoiding to put Taler
* logic into the Sandbox; that's because banks DO allow
* their customers to wire the same subject multiple
* times. Hence, instead of triggering any error, libeufin
* bounces the payment back in the same way it does for
* malformed reserve public keys.
*/
if (-1 == fts->expected_http_status)
{
TALER_TESTING_interpreter_next (is);
return;
}
if (http_status != fts->expected_http_status) if (http_status != fts->expected_http_status)
{ {
GNUNET_break (0); GNUNET_break (0);

View File

@ -168,9 +168,6 @@ build_history (struct TALER_TESTING_Interpreter *is,
unsigned int start; unsigned int start;
unsigned int end; unsigned int end;
/* @var turns GNUNET_YES whenever either no 'start' value was
* given for the history query, or the given value is found
* in the list of all the CMDs. *///
int ok; int ok;
const uint64_t *row_id_start = NULL; const uint64_t *row_id_start = NULL;
@ -208,7 +205,11 @@ build_history (struct TALER_TESTING_Interpreter *is,
start = is->ip - 1; start = is->ip - 1;
end = 0; end = 0;
} }
/**
* ok equals GNUNET_YES whenever a starting row_id
* was provided AND was found among the CMDs, OR no
* starting row was given in the first place.
*/
ok = GNUNET_NO; ok = GNUNET_NO;
if (NULL == row_id_start) if (NULL == row_id_start)
ok = GNUNET_YES; ok = GNUNET_YES;
@ -228,9 +229,11 @@ build_history (struct TALER_TESTING_Interpreter *is,
const struct TALER_ReservePublicKeyP *reserve_pub; const struct TALER_ReservePublicKeyP *reserve_pub;
const char **exchange_credit_url; const char **exchange_credit_url;
/* The following command allows us to skip over those CMDs /**
* The following command allows us to skip over those CMDs
* that do not offer a "row_id" trait. Such skipped CMDs are * that do not offer a "row_id" trait. Such skipped CMDs are
* not interesting for building a history. */// * not interesting for building a history.
*/
if ( (GNUNET_OK != if ( (GNUNET_OK !=
TALER_TESTING_get_trait_bank_row (cmd, TALER_TESTING_get_trait_bank_row (cmd,
&row_id)) || &row_id)) ||
@ -250,22 +253,29 @@ build_history (struct TALER_TESTING_Interpreter *is,
TALER_TESTING_get_trait_exchange_bank_account_url ( TALER_TESTING_get_trait_exchange_bank_account_url (
cmd, cmd,
&exchange_credit_url)) ) &exchange_credit_url)) )
continue; /* not an interesting event */ continue; // Not an interesting event
/* Seek "/history/incoming" starting row. */ /**
* Is the interesting event a match with regard to
* the row_id value? If yes, store this condition
* to the state and analyze the next CMDs.
*/
if ( (NULL != row_id_start) && if ( (NULL != row_id_start) &&
(*row_id_start == *row_id) && (*row_id_start == *row_id) &&
(GNUNET_NO == ok) ) (GNUNET_NO == ok) )
{ {
/* Until here, nothing counted. */
ok = GNUNET_YES; ok = GNUNET_YES;
continue; continue;
} }
/* when 'start' was _not_ given, then ok == GNUNET_YES */ /**
* The interesting event didn't match the wanted
* row_id value, analyze the next CMDs. Note: this
* branch is relevant only when row_id WAS given.
*/
if (GNUNET_NO == ok) if (GNUNET_NO == ok)
continue; /* skip until we find the marker */ continue;
if (0 != strcasecmp (hs->account_url, if (0 != strcasecmp (hs->account_url,
*exchange_credit_url)) *exchange_credit_url))
continue; /* account mismatch */ continue; // Account mismatch
if (total >= GNUNET_MAX (hs->num_results, if (total >= GNUNET_MAX (hs->num_results,
-hs->num_results) ) -hs->num_results) )
{ {

View File

@ -92,6 +92,12 @@ TALER_TESTING_run_libeufin (const struct TALER_TESTING_BankConfiguration *bc)
struct TALER_TESTING_LibeufinServices ret = { 0 }; struct TALER_TESTING_LibeufinServices ret = { 0 };
unsigned int iter; unsigned int iter;
char *curl_check_cmd; char *curl_check_cmd;
const char *db_conn = "jdbc:sqlite:/tmp/libeufin-exchange-test.sqlite3";
setenv (
"LIBEUFIN_NEXUS_DB_CONNECTION",
db_conn,
1); // not overwriting any potentially existing DB.
nexus_proc = GNUNET_OS_start_process ( nexus_proc = GNUNET_OS_start_process (
GNUNET_OS_INHERIT_STD_ERR, GNUNET_OS_INHERIT_STD_ERR,
@ -99,7 +105,6 @@ TALER_TESTING_run_libeufin (const struct TALER_TESTING_BankConfiguration *bc)
"libeufin-nexus", "libeufin-nexus",
"libeufin-nexus", "libeufin-nexus",
"serve", "serve",
"--db-name", "/tmp/nexus-exchange-test.sqlite3",
NULL); NULL);
if (NULL == nexus_proc) if (NULL == nexus_proc)
{ {
@ -139,14 +144,26 @@ TALER_TESTING_run_libeufin (const struct TALER_TESTING_BankConfiguration *bc)
// start sandbox. // start sandbox.
GNUNET_free (curl_check_cmd); GNUNET_free (curl_check_cmd);
fprintf (stderr, "\n"); fprintf (stderr, "\n");
setenv (
"LIBEUFIN_SANDBOX_DB_CONNECTION",
db_conn,
1); // not overwriting existing any potentially existing DB.
setenv (
"LIBEUFIN_SANDBOX_ADMIN_PASSWORD",
"secret",
1);
if (0 != system ("libeufin-sandbox config --currency=KUDOS default"))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Could not create the default demobank.\n");
return ret;
}
sandbox_proc = GNUNET_OS_start_process ( sandbox_proc = GNUNET_OS_start_process (
GNUNET_OS_INHERIT_STD_ERR, GNUNET_OS_INHERIT_STD_ERR,
NULL, NULL, NULL, NULL, NULL, NULL,
"libeufin-sandbox", "libeufin-sandbox",
"libeufin-sandbox", "libeufin-sandbox",
"serve", "serve",
"--db-name", "/tmp/sandbox-exchange-test.sqlite3",
NULL); NULL);
if (NULL == sandbox_proc) if (NULL == sandbox_proc)
{ {
@ -350,8 +367,7 @@ TALER_TESTING_prepare_nexus (const char *config_filename,
/* DB preparation */ /* DB preparation */
if (GNUNET_YES == reset_db) if (GNUNET_YES == reset_db)
{ {
if (0 != system ( if (0 != system ("rm -f /tmp/libeufin-exchange-test.sqlite3"))
"rm -f /tmp/nexus-exchange-test.sqlite3 && rm -f /tmp/sandbox-exchange-test.sqlite3"))
{ {
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Failed to invoke db-removal command.\n"); "Failed to invoke db-removal command.\n");
@ -384,9 +400,9 @@ TALER_TESTING_prepare_nexus (const char *config_filename,
GNUNET_CONFIGURATION_destroy (cfg); GNUNET_CONFIGURATION_destroy (cfg);
bc->exchange_payto = exchange_payto_uri; bc->exchange_payto = exchange_payto_uri;
bc->user42_payto = bc->user42_payto =
"payto://iban/BIC/FR7630006000011234567890189?receiver-name=User42"; "payto://iban/SANDBOXX/FR7630006000011234567890189?receiver-name=User42";
bc->user43_payto = bc->user43_payto =
"payto://iban/BIC/GB33BUKB20201555555555?receiver-name=User43"; "payto://iban/SANDBOXX/GB33BUKB20201555555555?receiver-name=User43";
GNUNET_log (GNUNET_ERROR_TYPE_INFO, GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"Relying on nexus %s on port %u\n", "Relying on nexus %s on port %u\n",
bc->exchange_auth.wire_gateway_url, bc->exchange_auth.wire_gateway_url,