diff --git a/app.py b/app.py index f33bc0a..f70ec9e 100644 --- a/app.py +++ b/app.py @@ -68,7 +68,6 @@ logging.getLogger("urllib3").setLevel(logging.WARNING) logging.getLogger("gunicorn.access").setLevel(logging.WARNING) logger = logging.getLogger("matrix-interceptor") -logger.propagate = False def now_iso(): return datetime.now(timezone.utc).isoformat() @@ -245,7 +244,7 @@ def seed_known_users(): def periodic_seed(): while True: seed_known_users() - time.sleep(300) + time.sleep(60) # ============================================================ # FALLBACK @@ -281,6 +280,21 @@ def is_user_in_local_rooms(user_id): logger.error(f"Fallback check failed: {e}") return False + +# ============================================================ +# FALLBACK RETRY (CRITICAL FOR CONSISTENCY) +# ============================================================ + +def fallback_check_with_retry(user_id): + """ + Retry membership check to handle Matrix eventual consistency. + User join may not be immediately visible via API. + """ + for _ in range(2): # 🔥 2 attempts + if is_user_in_local_rooms(user_id): + return True + time.sleep(0.5) # 🔥 short delay + return False # ============================================================ # DM DETECTION @@ -425,10 +439,12 @@ def invite(room_id, event_id): if not is_known_user(sender): - if is_user_in_local_rooms(sender): + if fallback_check_with_retry(sender): remember_user(sender) + with METRICS_LOCK: METRICS["invite_allowed"] += 1 + return forward_request( "PUT", f"{config.tuwunel_url}/_matrix/federation/v2/invite/{room_id}/{event_id}", @@ -448,17 +464,17 @@ def invite(room_id, event_id): ) return Response(status=403) - remember_user(sender) + remember_user(sender) - with METRICS_LOCK: + with METRICS_LOCK: METRICS["invite_allowed"] += 1 - return forward_request( - "PUT", - f"{config.tuwunel_url}/_matrix/federation/v2/invite/{room_id}/{event_id}", - request.headers, - payload - ) + return forward_request( + "PUT", + f"{config.tuwunel_url}/_matrix/federation/v2/invite/{room_id}/{event_id}", + request.headers, + payload + ) # ============================================================ # FORWARD