75 lines
3.5 KiB
Bash
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
|