monitoring: fail bank auto-account if payto/webui invalid (like 405)

Public GET /intro/auto-account.json must return 200 with host:port payto
and absolute webui; 405/501/404 etc. are hard failures.
This commit is contained in:
Hernâni Marques 2026-07-10 22:28:00 +02:00
parent 9d45a9ba66
commit f4129e0988
No known key found for this signature in database

View file

@ -173,6 +173,67 @@ if [ "$code" = "200" ]; then
check_url_soft "bank /webui/" 200 "$BANK_PUBLIC/webui/"
check_url_soft "bank /intro/" 200 "$BANK_PUBLIC/intro/"
check_url_soft "bank /" 302,301,200 "$BANK_PUBLIC/"
# Auto-create personal account (landing “Create my bank account”)
# Must be GET 200 with valid payto (host:port) + absolute webui — 405/501 = broken
aa_code=$(http_body "$BANK_PUBLIC/intro/auto-account.json" "$tmp/aa.json")
case "$aa_code" in
200)
if python3 - "$tmp/aa.json" <<'PY'
import json, re, sys
from urllib.parse import urlparse
try:
d = json.load(open(sys.argv[1]))
except Exception as e:
print("bad json:", e)
sys.exit(1)
if not d.get("ok"):
print("ok!=true")
sys.exit(1)
payto = d.get("payto_uri") or ""
webui = d.get("webui") or d.get("account_url") or ""
# payto://x-taler-bank/host:port/account?...
m = re.match(r"^payto://x-taler-bank/([^/?#]+)/([^/?#]+)(\?.*)?$", payto)
if not m:
print("payto shape invalid:", payto[:120])
sys.exit(1)
auth, acct = m.group(1), m.group(2)
if ":" not in auth:
print("payto missing port (need host:port):", auth)
sys.exit(1)
host, port_s = auth.rsplit(":", 1)
if not host or not port_s.isdigit():
print("payto host:port invalid:", auth)
sys.exit(1)
if not acct:
print("payto account empty")
sys.exit(1)
u = urlparse(webui)
if u.scheme not in ("http", "https") or not u.netloc or "webui" not in (u.path or ""):
print("webui not absolute https …/webui/:", webui[:120])
sys.exit(1)
print(f"user={d.get('username','')} payto={auth}/{acct} webui={webui}")
sys.exit(0)
PY
then
ok "bank /intro/auto-account.json" "$(python3 -c 'import json;d=json.load(open("'"$tmp/aa.json"'"));print(d.get("username",""),"·",(d.get("payto_uri") or "")[:60])' 2>/dev/null || true)"
else
fail "bank /intro/auto-account.json" "invalid payto/webui — $(python3 - "$tmp/aa.json" <<'PY'
import json,sys
try:
d=json.load(open(sys.argv[1])); print((d.get("payto_uri") or "")[:100], (d.get("webui") or "")[:60])
except Exception as e:
print(e)
PY
)"
fi
;;
405|501|404|502|503|000)
fail "bank /intro/auto-account.json" "HTTP $aa_code (want 200; 405/501 = method/proxy broken)"
;;
*)
fail "bank /intro/auto-account.json" "HTTP $aa_code want 200"
;;
esac
fi
# Bank legal docs (landing nginx via Caddy /terms* /privacy* or /intro/*)