Update app.py
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user