diff --git a/services/comms/guest-name-job.yaml b/services/comms/guest-name-job.yaml index 40b0a52..d1466e5 100644 --- a/services/comms/guest-name-job.yaml +++ b/services/comms/guest-name-job.yaml @@ -42,12 +42,25 @@ spec: value: http://matrix-authentication-service:8080/oauth2/token - name: SEEDER_USER 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: - /bin/sh - -c - | set -euo pipefail - pip install --no-cache-dir requests >/dev/null + pip install --no-cache-dir requests psycopg2-binary >/dev/null python - <<'PY' import base64 import os @@ -55,6 +68,7 @@ spec: import requests import time import urllib.parse + import psycopg2 ADJ = [ "brisk","calm","eager","gentle","merry","nifty","rapid","sunny","witty","zesty", @@ -74,6 +88,7 @@ spec: MAS_TOKEN_URL = os.environ["MAS_TOKEN_URL"] SEEDER_USER = os.environ["SEEDER_USER"] ROOM_ALIAS = "#othrys:live.bstein.dev" + SERVER_NAME = "live.bstein.dev" def mas_admin_token(): with open(MAS_ADMIN_CLIENT_SECRET_FILE, "r", encoding="utf-8") as f: @@ -241,6 +256,51 @@ spec: def needs_rename_display(display): 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() seeder_id = mas_user_id(admin_token, SEEDER_USER) seeder_token, seeder_session = mas_personal_session(admin_token, seeder_id) @@ -307,6 +367,7 @@ spec: continue if not set_displayname_admin(seeder_token, user_id, new): continue + db_rename_numeric(existing) finally: mas_revoke_session(admin_token, seeder_session) PY