anastasis

Credential backup and recovery protocol and service
Log | Files | Refs | Submodules | README | LICENSE

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:
Msrc/authorization/Makefile.am | 2++
Msrc/authorization/anastasis-authorization-sms-clicksend.sh | 3++-
Csrc/authorization/anastasis-authorization-sms.sh -> src/authorization/anastasis-authorization-sms-telesign.sh | 0
Msrc/authorization/anastasis-authorization-sms.sh | 155++++++++++---------------------------------------------------------------------
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 -