Files
g9-migration/g9-migration/scripts/23-synapse-admin-fix.sh
T

75 lines
3.5 KiB
Bash

#!/usr/bin/env bash
# 23-synapse-admin-fix.sh — répare ce que la voie « register » a abîmé.
#
# Erreur mesurée : dans `21-…`, les arguments du bloc python étaient décalés -> le compte a été
# créé avec **password = <localpart>**, et Synapse a ignoré le localpart demandé (mxid aléatoire).
# Le compte créé porte donc admin=1 (mis à jour) et un mot de passe faible.
#
# Ce script, avec le mot de passe faible passé en argument (jamais affiché) :
# 1. login -> token admin ; 2. remplace le mot de passe par celui du fichier de credential ;
# 3. crée le compte propre @<localpart>:<domain> admin=true ; 4. désactive le compte aléatoire ;
# 5. vérifie en lecture seule.
# Usage : bash 23-synapse-admin-fix.sh <mxid_aleatoire> <localpart_souhaite> <mot_de_passe_faible>
set -euo pipefail
CREATED="${1:?mxid aléatoire créé}"
WANT="${2:?localpart souhaité}"
WEAK="${3:?mot de passe actuellement en base sur ce compte}"
CTN="${CTN:-synapse}"
DB="${DB:-/data/homeserver.db}"
URL="${URL:-http://192.168.1.24:8008}"
CRED="${CRED:-/home/folzo/synapse-admin-$WANT.cred}"
DOMAIN="${DOMAIN:-192.168.1.24}"
PW="$(python3 -c "print(open('$CRED').read().split('password=')[1].strip())")"
TOKEN="$(python3 - "$CREATED" "$WEAK" <<'PY'
import json, subprocess, sys
body = json.dumps({"type": "m.login.password",
"identifier": {"type": "m.id.user", "user": sys.argv[1]},
"password": sys.argv[2]})
out = subprocess.run(["curl", "-s", "-m", "15", "-X", "POST",
"http://192.168.1.24:8008/_matrix/client/v3/login",
"-H", "Content-Type: application/json", "-d", body],
capture_output=True, text=True).stdout
print(json.loads(out).get("access_token", ""))
PY
)"
if [[ -z "$TOKEN" ]]; then echo "KO login admin — abandon (rien n'est modifié)"; exit 1; fi
echo "login admin OK (token ${#TOKEN} car., jamais affiché)"
api() { # methode url corps
curl -s -m 20 -X "$1" "$2" -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' -d "$3"
}
echo "== 1. mot de passe fort sur le compte admin existant =="
api POST "$URL/_synapse/admin/v2/users/$CREATED" \
"$(python3 - "$PW" <<'PY'
import json, sys
print(json.dumps({"password": sys.argv[1]}))
PY
)" | python3 -c 'import json,sys; d=json.load(sys.stdin); print(" ", d.get("name") or d.get("error") or d)' 2>/dev/null
echo "== 2. créer @${WANT}:${DOMAIN} (admin=true) =="
api POST "$URL/_synapse/admin/v2/users/@${WANT}:${DOMAIN}" \
"$(python3 - "$PW" <<'PY'
import json, sys
print(json.dumps({"password": sys.argv[1], "admin": True, "deactivated": False}))
PY
)" | python3 -c 'import json,sys; d=json.load(sys.stdin); print(" ", d.get("name") or d.get("error") or d)' 2>/dev/null
echo "== 3. désactiver le compte aléatoire =="
api PUT "$URL/_synapse/admin/v2/users/$CREATED" '{"deactivated": true}' \
| python3 -c 'import json,sys; d=json.load(sys.stdin); print(" ", d.get("name") or d.get("error") or d)' 2>/dev/null
echo "== vérification (lecture seule) =="
docker exec "$CTN" python3 -c "
import sqlite3
c = sqlite3.connect('file:$DB?mode=ro', uri=True).cursor()
print(' total/admin/deactivated:', c.execute('select count(*), sum(admin), sum(deactivated) from users').fetchone())
for r in c.execute('select name, admin, locked, deactivated from users order by admin desc'):
print(' ', r)
"
echo "credential : $CRED (600) — user=@${WANT}:${DOMAIN} ; à changer à la première connexion, puis 2FA (C-MX3)"
unset TOKEN PW