Update app.py

This commit is contained in:
2026-05-05 17:19:35 +02:00
committed by GitHub
parent 7623f432f8
commit 111f3cf37e
+35 -21
View File
@@ -60,7 +60,9 @@ class Config:
log_level = logging.DEBUG if os.getenv("DEBUG", "false").lower() == "true" else logging.INFO log_level = logging.DEBUG if os.getenv("DEBUG", "false").lower() == "true" else logging.INFO
logging.basicConfig(level=log_level) logging.basicConfig(level=log_level)
# 🔥 remove HTTP noise
logging.getLogger("werkzeug").setLevel(logging.ERROR) logging.getLogger("werkzeug").setLevel(logging.ERROR)
logger = logging.getLogger("matrix-interceptor") logger = logging.getLogger("matrix-interceptor")
def now_iso(): def now_iso():
@@ -121,55 +123,67 @@ def remember_user(user_id):
def get_role(user_id): def get_role(user_id):
return "admin" if user_id in config.admin_users else "user" return "admin" if user_id in config.admin_users else "user"
# ============================================================ def is_local_room(room_id):
# 🔥 NEW: LOCAL MEMBERSHIP CHECK try:
# ============================================================ return room_id.split(":")[1] == config.local_domain
except:
def is_user_in_local_rooms(user_id: str) -> bool:
if not config.admin_token:
return False 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( rooms_res = requests.get(
f"{config.tuwunel_url}/_matrix/client/v3/joined_rooms", f"{config.tuwunel_url}/_matrix/client/v3/joined_rooms",
headers=headers, headers=headers,
timeout=5 timeout=10
) )
if rooms_res.status_code != 200: if rooms_res.status_code != 200:
return False return
for room_id in rooms_res.json().get("joined_rooms", []): 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 continue
members_res = requests.get( members_res = requests.get(
f"{config.tuwunel_url}/_matrix/client/v3/rooms/{room_id}/joined_members", f"{config.tuwunel_url}/_matrix/client/v3/rooms/{room_id}/joined_members",
headers=headers, headers=headers,
timeout=5 timeout=10
) )
if members_res.status_code != 200: if members_res.status_code != 200:
continue continue
members = members_res.json().get("joined", {}) members = members_res.json().get("joined", {})
if user_id in members:
return True
except Exception: for user_id in members.keys():
return False 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 # DM DETECTION
# ============================================================ # ============================================================
def is_likely_dm_create(payload): def is_likely_dm_create(payload):
debug_log("CREATE PAYLOAD", payload)
if payload.get("is_direct"): if payload.get("is_direct"):
return True return True
@@ -300,9 +314,8 @@ def invite(room_id, event_id):
payload payload
) )
# 🔥 FIXED: combine cache + membership
if config.block_external_dms and is_dm and is_external(sender): 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( log_event(
"invite_blocked", "invite_blocked",
@@ -327,4 +340,5 @@ def invite(room_id, event_id):
# ============================================================ # ============================================================
if __name__ == '__main__': if __name__ == '__main__':
seed_known_users()
app.run(host='0.0.0.0', port=5000) app.run(host='0.0.0.0', port=5000)