#!/bin/bash ## Test wire_gateway conformance to documentation and its security set -eu # Create temp file TEMP_FILE=$(mktemp) # Cleanup to run whenever we exit function cleanup() { rm -f $TEMP_FILE wait } # Install cleanup handler (except for kill -9) trap cleanup EXIT source "${BASH_SOURCE%/*}/../common.sh" ADDRESS=mpTJZxWPerz1Gife6mQSdHT8mMuJK6FP85 SCHEMA=btc.sql echo "----- Setup -----" echo "Load config file" load_config echo "Start database" setup_db echo "Start gateway" gateway echo "" echo "----- Gateway API -----" echo -n "Making wire transfer to exchange:" for n in `seq 1 9`; do taler-exchange-wire-gateway-client \ -b $BANK_ENDPOINT \ -D payto://bitcoin/$ADDRESS \ -a BTC:0.0000$n > /dev/null done echo " OK" echo -n "Requesting exchange incoming transaction list:" ALL=`taler-exchange-wire-gateway-client -b $BANK_ENDPOINT -i` for n in `seq 1 9`; do echo $ALL | grep BTC:0.0000$n > /dev/null done echo " OK" echo -n "Making wire transfer from exchange:" for n in `seq 1 9`; do taler-exchange-wire-gateway-client \ -b $BANK_ENDPOINT \ -C payto://bitcoin/$ADDRESS \ -a BTC:0.0000$n > /dev/null done echo " OK" echo -n "Requesting exchange's outgoing transaction list:" ALL=`taler-exchange-wire-gateway-client -b $BANK_ENDPOINT -o` for n in `seq 1 9`; do echo $ALL | grep BTC:0.0000$n > /dev/null done echo " OK" echo "----- Endpoint & Method -----" echo -n "Unknown endpoint:" test `curl -w %{http_code} -s -o /dev/null ${BANK_ENDPOINT}test` -eq 404 && echo " OK" || echo " Failed" echo -n "Method not allowed:" test `curl -w %{http_code} -s -o /dev/null ${BANK_ENDPOINT}transfer` -eq 405 && echo " OK" || echo " Failed" echo "----- Request format -----" echo -n "Bad payto url:" for bad_payto in http://bitcoin/$ADDRESS payto://btc/$ADDRESS payto://bitcoin/$ADDRESS?id=admin payto://bitcoin/$ADDRESS#admin; do taler-exchange-wire-gateway-client -b $BANK_ENDPOINT -C $bad_payto -a BTC:0.00042 2>&1 | grep -q "(400/24)" && echo -n " OK" || echo " Failed" done echo "" echo -n "Bad bitcoin address:" taler-exchange-wire-gateway-client -b $BANK_ENDPOINT -C payto://bitcoin/42$ADDRESS -a BTC:0.00042 2>&1 | grep -q "(400/24)" && echo " OK" || echo " Failed" echo -n "Bad transaction amount:" taler-exchange-wire-gateway-client -b $BANK_ENDPOINT -C payto://bitcoin/$ADDRESS -a ATC:0.00042 2>&1 | grep -q "(400/26)" && echo " OK" || echo " Failed" echo -n "Bad history delta:" for bad_delta in incoming outgoing incoming?delta=0 outgoing?delta=0; do test `curl -w %{http_code} -s -o /dev/null "${BANK_ENDPOINT}history/$bad_delta"` -eq 400 && echo -n " OK" || echo -n " Failed" done echo "" echo "----- History delta -----" for endpoint in incoming outgoing; do echo -n "History $endpoint:" check_delta ${endpoint}?delta=-9 "seq 1 9" && echo -n " OK" || echo -n " Failed" check_delta ${endpoint}?delta=9 "seq 1 9" && echo -n " OK" || echo -n " Failed" check_delta ${endpoint}?delta=-4 "seq 6 9" && echo -n " OK" || echo -n " Failed" check_delta ${endpoint}?delta=4 "seq 1 4" && echo -n " OK" || echo -n " Failed" check_delta "${endpoint}?delta=-3&start=5" "seq 2 4" && echo -n " OK" || echo -n " Failed" check_delta "${endpoint}?delta=3&start=4" "seq 5 7" && echo -n " OK" || echo -n " Failed" echo "" done echo "----- Transfer idempotence -----" DATA="{\"request_uid\":\"0ZSX8SH0M30KHX8K3Y1DAMVGDQV82XEF9DG1HC4QMQ3QWYT4AF00ZSX8SH0M30KHX8K3Y1DAMVGDQV82XEF9DG1HC4QMQ3QWYT4AF00\",\"amount\":\"BTC:0.000034\",\"exchange_base_url\":\"$BASE_URL\",\"wtid\":\"0ZSX8SH0M30KHX8K3Y1DAMVGDQV82XEF9DG1HC4QMQ3QWYT4AF00\",\"credit_account\":\"payto://bitcoin/$ADDRESS\"}" echo -n "Same:" test `curl -w %{http_code} -s -o /dev/null -H "Content-Type: application/json" -d $DATA ${BANK_ENDPOINT}transfer` -eq 200 && echo -n " OK" || echo -n " Failed" test `curl -w %{http_code} -s -o /dev/null -H "Content-Type: application/json" -d $DATA ${BANK_ENDPOINT}transfer` -eq 200 && echo " OK" || echo " Failed" echo -n "Collision:" DATA="{\"request_uid\":\"0ZSX8SH0M30KHX8K3Y1DAMVGDQV82XEF9DG1HC4QMQ3QWYT4AF00ZSX8SH0M30KHX8K3Y1DAMVGDQV82XEF9DG1HC4QMQ3QWYT4AF00\",\"amount\":\"BTC:0.000042\",\"exchange_base_url\":\"$BASE_URL\",\"wtid\":\"0ZSX8SH0M30KHX8K3Y1DAMVGDQV82XEF9DG1HC4QMQ3QWYT4AF00\",\"credit_account\":\"payto://bitcoin/$ADDRESS\"}" test `curl -w %{http_code} -s -o /dev/null -H "Content-Type: application/json" -d $DATA ${BANK_ENDPOINT}transfer` -eq 409 && echo " OK" || echo " Failed" echo "----- Security -----" # Generate big random file printf 'HelloWorld%s' {1..1000} > $TEMP_FILE echo -n "Handle huge body:" test `curl -w %{http_code} -X POST -s -o /dev/null -d @$TEMP_FILE ${BANK_ENDPOINT}transfer` -eq 400 && echo " OK" || echo " Failed" echo -n "Handle body length liar:" test `curl -w %{http_code} -X POST -H"Content-Length:1024" -s -o /dev/null -d @$TEMP_FILE ${BANK_ENDPOINT}transfer` -eq 400 && echo " OK" || echo " Failed" # Generate compression bomb printf 'HelloWorld%s' {1..1000} | pigz -z9 > $TEMP_FILE echo -n "Handle compression bomb:" test `curl -w %{http_code} -X POST -H"Content-Encoding:deflate" -s -o /dev/null --data-binary @$TEMP_FILE ${BANK_ENDPOINT}transfer` -eq 400 && echo " OK" || echo " Failed" echo "All tests passed"