mirror of
https://github.com/pewdiepie-archdaemon/odysseus.git
synced 2026-06-17 10:15:27 -04:00
Use shared IMAP timeout for account tests (#1088)
This commit is contained in:
+32
-12
@@ -608,7 +608,32 @@ def _list_email_accounts() -> list[dict]:
|
||||
|
||||
# ── IMAP helpers ──
|
||||
|
||||
_IMAP_TIMEOUT_SECONDS = 15
|
||||
def _coerce_imap_timeout_seconds(raw: str | None) -> int:
|
||||
try:
|
||||
value = int(raw or "30")
|
||||
except (TypeError, ValueError):
|
||||
value = 30
|
||||
return max(5, min(value, 300))
|
||||
|
||||
|
||||
_IMAP_TIMEOUT_SECONDS = _coerce_imap_timeout_seconds(os.environ.get("ODYSSEUS_IMAP_TIMEOUT_SECONDS"))
|
||||
|
||||
|
||||
def _open_imap_connection(host: str, port: int, *, starttls: bool, timeout: int = _IMAP_TIMEOUT_SECONDS):
|
||||
"""Open an IMAP connection using the configured security mode."""
|
||||
port = int(port or 993)
|
||||
if starttls:
|
||||
conn = imaplib.IMAP4(host, port, timeout=timeout)
|
||||
conn.starttls()
|
||||
elif port == 993:
|
||||
conn = imaplib.IMAP4_SSL(host, port, timeout=timeout)
|
||||
else:
|
||||
conn = imaplib.IMAP4(host, port, timeout=timeout)
|
||||
try:
|
||||
conn.sock.settimeout(timeout)
|
||||
except Exception:
|
||||
pass
|
||||
return conn
|
||||
|
||||
def _imap_connect(account_id: str | None = None, owner: str = ""):
|
||||
# SECURITY: passing `owner` scopes the fallback config lookup so a brand
|
||||
@@ -622,17 +647,12 @@ def _imap_connect(account_id: str | None = None, owner: str = ""):
|
||||
# The last branch is critical: previously this fell into IMAP4_SSL
|
||||
# for any non-STARTTLS port, which would fail the TLS handshake on
|
||||
# plain local servers (Dovecot on 31143, etc.).
|
||||
if cfg.get("imap_starttls"):
|
||||
conn = imaplib.IMAP4(cfg["imap_host"], cfg["imap_port"], timeout=_IMAP_TIMEOUT_SECONDS)
|
||||
conn.starttls()
|
||||
elif int(cfg.get("imap_port") or 993) == 993:
|
||||
conn = imaplib.IMAP4_SSL(cfg["imap_host"], cfg["imap_port"], timeout=_IMAP_TIMEOUT_SECONDS)
|
||||
else:
|
||||
conn = imaplib.IMAP4(cfg["imap_host"], cfg["imap_port"], timeout=_IMAP_TIMEOUT_SECONDS)
|
||||
try:
|
||||
conn.sock.settimeout(_IMAP_TIMEOUT_SECONDS)
|
||||
except Exception:
|
||||
pass
|
||||
conn = _open_imap_connection(
|
||||
cfg["imap_host"],
|
||||
cfg["imap_port"],
|
||||
starttls=bool(cfg.get("imap_starttls")),
|
||||
timeout=_IMAP_TIMEOUT_SECONDS,
|
||||
)
|
||||
conn.login(cfg["imap_user"], cfg["imap_password"])
|
||||
return conn
|
||||
|
||||
|
||||
@@ -17,7 +17,6 @@ import sqlite3 as _sql3
|
||||
import email as email_mod
|
||||
import email.header
|
||||
import email.utils
|
||||
import imaplib
|
||||
import smtplib
|
||||
import json
|
||||
import re
|
||||
@@ -41,6 +40,7 @@ from routes.email_helpers import (
|
||||
_q, _attach_compose_uploads, _cleanup_compose_uploads,
|
||||
_load_settings, _save_settings, _get_email_config,
|
||||
_send_smtp_message, _smtp_security_mode,
|
||||
_IMAP_TIMEOUT_SECONDS, _open_imap_connection,
|
||||
_imap_connect, _imap, _decode_header, _detect_sent_folder, _detect_drafts_folder,
|
||||
_extract_attachment_text, _list_attachments_from_msg,
|
||||
_extract_attachment_to_disk, _extract_html, _extract_text,
|
||||
@@ -3103,13 +3103,12 @@ def setup_email_routes():
|
||||
# port (Dovecot on 31143, etc.) would always fail the SSL
|
||||
# handshake because they're not actually wrapped in TLS.
|
||||
try:
|
||||
if imap_starttls:
|
||||
conn = imaplib.IMAP4(imap_host, imap_port, timeout=10)
|
||||
conn.starttls()
|
||||
elif imap_port == 993:
|
||||
conn = imaplib.IMAP4_SSL(imap_host, imap_port, timeout=10)
|
||||
else:
|
||||
conn = imaplib.IMAP4(imap_host, imap_port, timeout=10)
|
||||
conn = _open_imap_connection(
|
||||
imap_host,
|
||||
imap_port,
|
||||
starttls=imap_starttls,
|
||||
timeout=_IMAP_TIMEOUT_SECONDS,
|
||||
)
|
||||
try:
|
||||
conn.login(imap_user, imap_pass)
|
||||
imap_result = {"ok": True}
|
||||
|
||||
Reference in New Issue
Block a user