From 111f3cf37ea9b59414b4e23f902476ba63e6fd79 Mon Sep 17 00:00:00 2001 From: Dome Date: Tue, 5 May 2026 17:19:35 +0200 Subject: [PATCH] Update app.py --- app.py | 56 +++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/app.py b/app.py index 23ba6d4..aa73d00 100644 --- a/app.py +++ b/app.py @@ -60,7 +60,9 @@ class Config: log_level = logging.DEBUG if os.getenv("DEBUG", "false").lower() == "true" else logging.INFO logging.basicConfig(level=log_level) +# 🔥 remove HTTP noise logging.getLogger("werkzeug").setLevel(logging.ERROR) + logger = logging.getLogger("matrix-interceptor") def now_iso(): @@ -121,55 +123,67 @@ def remember_user(user_id): def get_role(user_id): return "admin" if user_id in config.admin_users else "user" -# ============================================================ -# 🔥 NEW: LOCAL MEMBERSHIP CHECK -# ============================================================ - -def is_user_in_local_rooms(user_id: str) -> bool: - if not config.admin_token: +def is_local_room(room_id): + try: + return room_id.split(":")[1] == config.local_domain + except: return False - try: - headers = {"Authorization": f"Bearer {config.admin_token}"} +# ============================================================ +# SEED (Membership Cache) +# ============================================================ +def seed_known_users(): + if not config.admin_token: + logger.warning("No ADMIN_TOKEN → skipping seed") + return + + logger.info("Seeding known external users...") + + headers = {"Authorization": f"Bearer {config.admin_token}"} + seeded = 0 + + try: rooms_res = requests.get( f"{config.tuwunel_url}/_matrix/client/v3/joined_rooms", headers=headers, - timeout=5 + timeout=10 ) if rooms_res.status_code != 200: - return False + return for room_id in rooms_res.json().get("joined_rooms", []): - if room_id.split(":")[1] != config.local_domain: + + if not is_local_room(room_id): continue members_res = requests.get( f"{config.tuwunel_url}/_matrix/client/v3/rooms/{room_id}/joined_members", headers=headers, - timeout=5 + timeout=10 ) if members_res.status_code != 200: continue members = members_res.json().get("joined", {}) - if user_id in members: - return True - except Exception: - return False + for user_id in members.keys(): + if is_external(user_id): + remember_user(user_id) + seeded += 1 - return False + logger.info(f"Seeded {seeded} external users (local membership)") + + except Exception as e: + logger.error(f"Seed failed: {e}") # ============================================================ # DM DETECTION # ============================================================ def is_likely_dm_create(payload): - debug_log("CREATE PAYLOAD", payload) - if payload.get("is_direct"): return True @@ -300,9 +314,8 @@ def invite(room_id, event_id): payload ) - # 🔥 FIXED: combine cache + membership if config.block_external_dms and is_dm and is_external(sender): - if not (is_known_user(sender) or is_user_in_local_rooms(sender)): + if not is_known_user(sender): log_event( "invite_blocked", @@ -327,4 +340,5 @@ def invite(room_id, event_id): # ============================================================ if __name__ == '__main__': + seed_known_users() app.run(host='0.0.0.0', port=5000)