comms: rename numeric guests via db

This commit is contained in:
Brad Stein 2026-01-08 11:59:51 -03:00
parent 59305ca27c
commit 831f368493

View File

@ -42,12 +42,25 @@ spec:
value: http://matrix-authentication-service:8080/oauth2/token value: http://matrix-authentication-service:8080/oauth2/token
- name: SEEDER_USER - name: SEEDER_USER
value: othrys-seeder value: othrys-seeder
- name: PGHOST
value: postgres-service.postgres.svc.cluster.local
- name: PGPORT
value: "5432"
- name: PGDATABASE
value: synapse
- name: PGUSER
value: synapse
- name: PGPASSWORD
valueFrom:
secretKeyRef:
name: synapse-db
key: POSTGRES_PASSWORD
command: command:
- /bin/sh - /bin/sh
- -c - -c
- | - |
set -euo pipefail set -euo pipefail
pip install --no-cache-dir requests >/dev/null pip install --no-cache-dir requests psycopg2-binary >/dev/null
python - <<'PY' python - <<'PY'
import base64 import base64
import os import os
@ -55,6 +68,7 @@ spec:
import requests import requests
import time import time
import urllib.parse import urllib.parse
import psycopg2
ADJ = [ ADJ = [
"brisk","calm","eager","gentle","merry","nifty","rapid","sunny","witty","zesty", "brisk","calm","eager","gentle","merry","nifty","rapid","sunny","witty","zesty",
@ -74,6 +88,7 @@ spec:
MAS_TOKEN_URL = os.environ["MAS_TOKEN_URL"] MAS_TOKEN_URL = os.environ["MAS_TOKEN_URL"]
SEEDER_USER = os.environ["SEEDER_USER"] SEEDER_USER = os.environ["SEEDER_USER"]
ROOM_ALIAS = "#othrys:live.bstein.dev" ROOM_ALIAS = "#othrys:live.bstein.dev"
SERVER_NAME = "live.bstein.dev"
def mas_admin_token(): def mas_admin_token():
with open(MAS_ADMIN_CLIENT_SECRET_FILE, "r", encoding="utf-8") as f: with open(MAS_ADMIN_CLIENT_SECRET_FILE, "r", encoding="utf-8") as f:
@ -241,6 +256,51 @@ spec:
def needs_rename_display(display): def needs_rename_display(display):
return not display or display.isdigit() or display.startswith("guest-") return not display or display.isdigit() or display.startswith("guest-")
def db_rename_numeric(existing_names):
user_ids = []
profiles = {}
conn = psycopg2.connect(
host=os.environ["PGHOST"],
port=int(os.environ["PGPORT"]),
dbname=os.environ["PGDATABASE"],
user=os.environ["PGUSER"],
password=os.environ["PGPASSWORD"],
)
try:
with conn:
with conn.cursor() as cur:
cur.execute(
"SELECT name FROM users WHERE name ~ %s",
(f\"^@\\\\d+:{SERVER_NAME}$\",),
)
user_ids = [row[0] for row in cur.fetchall()]
if not user_ids:
return
cur.execute(
\"SELECT user_id, displayname FROM profiles WHERE user_id = ANY(%s)\",
(user_ids,),
)
profiles = {row[0]: row[1] for row in cur.fetchall()}
for user_id in user_ids:
display = profiles.get(user_id)
if display and not needs_rename_display(display):
continue
new = None
for _ in range(30):
candidate = f\"{random.choice(ADJ)}-{random.choice(NOUN)}\"
if candidate not in existing_names:
new = candidate
existing_names.add(candidate)
break
if not new:
continue
cur.execute(
\"INSERT INTO profiles (user_id, displayname) VALUES (%s, %s) ON CONFLICT (user_id) DO UPDATE SET displayname = EXCLUDED.displayname\",
(user_id, new),
)
finally:
conn.close()
admin_token = mas_admin_token() admin_token = mas_admin_token()
seeder_id = mas_user_id(admin_token, SEEDER_USER) seeder_id = mas_user_id(admin_token, SEEDER_USER)
seeder_token, seeder_session = mas_personal_session(admin_token, seeder_id) seeder_token, seeder_session = mas_personal_session(admin_token, seeder_id)
@ -307,6 +367,7 @@ spec:
continue continue
if not set_displayname_admin(seeder_token, user_id, new): if not set_displayname_admin(seeder_token, user_id, new):
continue continue
db_rename_numeric(existing)
finally: finally:
mas_revoke_session(admin_token, seeder_session) mas_revoke_session(admin_token, seeder_session)
PY PY