commit 839168902d0d2a5af1e0fe621c4b29808482c4a2
parent 07c013863b82f1086456eab618c86ebbd9d9b6e4
Author: Christian Grothoff <grothoff@gnunet.org>
Date: Wed, 22 Oct 2025 15:07:29 +0200
add meta-script with fallback SMS provider
Diffstat:
4 files changed, 23 insertions(+), 137 deletions(-)
diff --git a/src/authorization/Makefile.am b/src/authorization/Makefile.am
@@ -37,6 +37,8 @@ bin_PROGRAMS = \
bin_SCRIPTS = \
anastasis-authorization-email.sh \
anastasis-authorization-sms.sh \
+ anastasis-authorization-sms-clicksend.sh \
+ anastasis-authorization-sms-telesign.sh \
anastasis-authorization-post.sh
anastasis_helper_authorization_iban_SOURCES = \
diff --git a/src/authorization/anastasis-authorization-sms-clicksend.sh b/src/authorization/anastasis-authorization-sms-clicksend.sh
@@ -16,7 +16,8 @@ then
exit 1
fi
-if [ $# -ne 1 ]; then
+if [ $# -ne 1 ]
+then
echo "Usage: $0 <phone_number>" 1>&2
exit 1
fi
diff --git a/src/authorization/anastasis-authorization-sms.sh b/src/authorization/anastasis-authorization-sms-telesign.sh
diff --git a/src/authorization/anastasis-authorization-sms.sh b/src/authorization/anastasis-authorization-sms.sh
@@ -1,154 +1,37 @@
#!/bin/bash
# This file is in the public domain.
-# Send an SMS using Telesign API
+# Send an SMS
set -eu
-# Check shared secrets
-if [ -x "$TELESIGN_AUTH_TOKEN" ]
+if [ $# -ne 1 ]
then
- echo "TELESIGN_AUTH_TOKEN not set in environment"
- exit 1
-fi
-
-if [ $# -ne 1 ]; then
echo "Usage: $0 <phone_number>" 1>&2
exit 1
fi
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+SCRIPT_NAME=$(basename "$0")
+BASE="${SCRIPT_NAME%.sh}"
+
PHONE_NUMBER="$1"
MESSAGE=$(cat -)
-TMPFILE=$(mktemp /tmp/telesign-sms-logging-XXXXXX)
-
-RESPONSE=$(curl --silent --show-error --fail \
- --url https://rest-api.telesign.com/v1/messaging \
- --request POST \
- --header "Authorization: Basic $TELESIGN_AUTH_TOKEN" \
- --header "Content-Type: application/x-www-form-urlencoded" \
- --data account_livecycle_event=transact \
- --data "phone_number=$PHONE_NUMBER" \
- --data-urlencode "message=$MESSAGE" \
- --data "message_type=OTP")
+# List of sub-scripts to try.
+PROVIDERS="telesign clicksend"
-echo "$RESPONSE" > "$TMPFILE"
-REFERENCE_ID=$(jq -r '.reference_id' "$TMPFILE")
-
-if [ "$REFERENCE_ID" == "null" ];
-then
- echo "Failed to retrieve reference ID." 1>&2
- exit 1
-fi
-
-STATUS_CODE=$(echo "$RESPONSE" | jq -r '.status.code')
-
-case "$STATUS_CODE" in
- "200")
- # Delivered to headset. Should basically never happen here.
- exit 0
- ;;
- "203"|"292"|"295")
- # Delivered to gateway
- sleep 2
- ;;
- "207"|"211"|"220"|"221"|"222"|"231"|"237"|"238")
- # Failure to deliver (hard)
- echo "Could not deliver" 1>&2
- exit 1
- ;;
- "210")
- # Temporary phone error
- ;;
- "250")
- # Final status unknown
- echo "Final status unknown, assuming success" 1>&2
- exit 0
- ;;
- "290")
- # Message in progress, go into loop below
- sleep 2
- ;;
- "502"|"503"|"504"|"505"|"506"|"507"|"508"|"509"|"510"|"511"|"512"|"513"|"514"|"515"|"517"|"520"|"521")
- echo "Carrier problem ($STATUS_CODE)" 1>&2
- exit 1
- ;;
- "10000")
- # Internal error at telesign...
- echo "Telesign internal error" 1>&2
- exit 1
- ;;
- "10019"|"10020")
- # Rate limit exceeded. Treating as hard failure for now.
- echo "Rate limit exceeded" 1>&2
- exit 1
- ;;
- *)
- # Many possible status codes for failure...
- echo "Message delivery failed: $STATUS_CODE" 1>&2
- exit 1
- ;;
-esac
-
-MAX_ITERATIONS=12
-
-# Poll for message status
-echo "Polling message status (reference_id: $REFERENCE_ID)..." 1>&2
-for N in $(seq 1 "$MAX_ITERATIONS")
+for PROVIDER in $PROVIDERS
do
- STATUS_RESPONSE=$(curl --silent --show-error --fail \
- --url "https://rest-api.telesign.com/v1/messaging/$REFERENCE_ID" \
- --header "Authorization: Basic $TELESIGN_AUTH_TOKEN")
-
- echo "$STATUS_RESPONSE" >> "$TMPFILE"
-
- STATUS_CODE=$(echo "$STATUS_RESPONSE" | jq -r '.status.code')
- DESCRIPTION=$(echo "$STATUS_RESPONSE" | jq -r '.status.description')
-
- case "$STATUS_CODE" in
- "200")
- # Delivered to headset. Great!
- echo "Delivered to headset" 1>&2
+ SCRIPT_PATH="$SCRIPT_DIR/${BASE}-${PROVIDER}.sh"
+ if [ -x "$SCRIPT" ]
+ then
+ if echo "$MESSAGE" | "$SCRIPT_PATH" "$PHONE_NUMBER"
+ then
exit 0
- ;;
- "203"|"290"|"292"|"295")
- # Delivered to gateway, wait a bit for an update
- sleep 2
- ;;
- "210")
- # Temporary phone error
- sleep 15
- ;;
- "207"|"211"|"220"|"221"|"222"|"231"|"237"|"238")
- # Failure to deliver (hard)
- echo "Could not deliver" 1>&2
- exit 1
- ;;
- "250")
- # Final status unknown
- echo "Final status unknown, assuming success" 1>&2
- exit 0
- ;;
- "502"|"503"|"504"|"505"|"506"|"507"|"508"|"509"|"510"|"511"|"512"|"513"|"514"|"515"|"517"|"520"|"521")
- echo "Carrier problem ($STATUS_CODE)" 1>&2
- exit 1
- ;;
- "10000")
- # Internal error at telesign...
- echo "Telesign internal error" 1>&2
- exit 1
- ;;
- "10019"|"10020")
- # Rate limit exceeded. Treating as hard failure for now.
- echo "Rate limit exceeded" 1>&2
- exit 1
- ;;
- *)
- # Many possible status codes for failure...
- echo "Message delivery failed: $STATUS_CODE" 1>&2
- exit 1
- ;;
- esac
+ else
+ echo "$PROVIDER failed." 1>&2
+ fi
+ fi
done
-echo "Unclear message delivery status $STATUS_CODE ($DESCRIPTION) after $MAX_ITERATIONS iterations. Assuming failure." 1>&2
+echo "All SMS providers failed." 1>&2
exit 1
-