Cause racine (#25) : use_tls=True (défaut) activait le direct TLS sur le port 5222 (conventionnellement STARTTLS). Le client envoyait un ClientHello TLS sur un port attendant un stream XMPP en clair, le serveur ne voyait jamais l'identité configurée, et la session expirait après 30 s. Corrections : - Remplacer use_tls (bool) par tls_mode: Literal[direct|starttls|disabled] (défaut starttls, compatible port 5222). use_tls conservé comme alias déprécié avec DeprecationWarning. - Ajouter connect_timeout (15 s) et cleanup_timeout (10 s) distincts du timeout de session (30 s). - Gérer l'événement connection_failed de Slixmpp pour échouer rapidement au lieu d'attendre le timeout de session. - Borner await connect_future et await disconnect_future par leurs timeouts respectifs (anti-blocage). - Attendre connect_future et session_future conjointement (asyncio.wait, FIRST_COMPLETED) pour détecter connection_failed avant l'expiration du connect_timeout. - Annuler les tâches pending sur tous les chemins de retour, y compris CancelledError et Exception. - Redact tous les redact_exception avec extra_secrets=_secret_values(). - Construire ClientXMPP dans le try (contrat « never raises »). - Enrichir FakeClientXMPP avec modes connect/disconnect configurables. - 25 nouveaux tests (timeout connexion, connection_failed, cleanup bloqué, CancelledError, TLS mismatch, fuite secrets). Couverture 96 %. - Mettre à jour .env.example, GUIDE_DEV_PYTHON.md, README.LLM.md. Co-authored-by: OpenCode <opencode@antoineve.me>
90 lines
2.9 KiB
Plaintext
90 lines
2.9 KiB
Plaintext
# --- Pronote ---
|
|
PRONOTE_ICAL_URL=https://college.ent/pronote/ical/Edt_Jean.ics?icalsecurise=REPLACE_ME&version=2024
|
|
PRONOTE_URL=https://college.ent/pronote/parent.html
|
|
PRONOTE_ACCOUNT_TYPE=parent
|
|
PRONOTE_USERNAME=parent.dupont
|
|
PRONOTE_PASSWORD=your_secure_password
|
|
PRONOTE_ENT=monbureaunumerique
|
|
|
|
# Sources (auto = essayer iCal d'abord, puis pronotepy)
|
|
PRONOTE_AGENDA_SOURCE=auto
|
|
PRONOTE_HOMEWORK_SOURCE=auto
|
|
PRONOTE_MESSAGES_SOURCE=pronotepy
|
|
|
|
# --- Authentification Pronote ---
|
|
# Mode d'authentification : "password" (défaut) ou "qr_token"
|
|
# qr_token : pour les instances utilisant HubEduConnect/EduConnect où le mot de passe échoue
|
|
# Voir le wiki GuidePronote pour la procédure d'enrôlement QR code
|
|
PRONOTE_AUTH_MODE=password
|
|
|
|
# --- Mode qr_token (décommenter et renseigner pour l'authentification par QR code) ---
|
|
# Le QR code se génère sur le site web Pronote (espace parent > paramètres > QR code)
|
|
# Le QR code expire ~10 minutes après génération
|
|
# PRONOTE_AUTH_MODE=qr_token
|
|
# PRONOTE_QR_CODE_FILE=/path/to/qr_code.json
|
|
# PRONOTE_QR_PIN=1234
|
|
|
|
# --- CalDAV ---
|
|
CALDAV_URL=https://caldav.example.com/calendars/user/pronote/
|
|
CALDAV_USERNAME=user@example.com
|
|
CALDAV_PASSWORD=your_caldav_password
|
|
CALDAV_CALENDAR_PATH=/pronote-sync/
|
|
# Autoriser HTTP (non-HTTPS) pour un serveur CalDAV local (localhost uniquement)
|
|
CALDAV_ALLOW_INSECURE_HTTP=false
|
|
|
|
# Fenêtre de synchronisation (jours)
|
|
SYNC_PAST_DAYS=7
|
|
SYNC_FUTURE_DAYS=30
|
|
|
|
# --- Agenda théorique ---
|
|
THEORETICAL_AGENDA_PATH=./data/theoretical.json
|
|
SCHOOL_HOLIDAYS_PATH=./data/school_holidays.json
|
|
THEORETICAL_WEEK_ANCHOR_DATE=2026-09-01
|
|
THEORETICAL_WEEK_ANCHOR_TYPE=even
|
|
|
|
# --- XMPP ---
|
|
XMPP_ENABLED=false
|
|
XMPP_JID=user@example.com
|
|
XMPP_PASSWORD=your_xmpp_password
|
|
XMPP_HOST=example.com
|
|
XMPP_PORT=5222
|
|
XMPP_TO=parent@example.com
|
|
XMPP_RESOURCE=pronote-sync
|
|
# Mode TLS : "starttls" (port 5222, défaut), "direct" (port 5223) ou "disabled" (localhost uniquement)
|
|
XMPP_TLS_MODE=starttls
|
|
# XMPP_USE_TLS=true/false est obsolète mais encore supporté (alias de XMPP_TLS_MODE)
|
|
XMPP_CONNECT_TIMEOUT=15
|
|
XMPP_CLEANUP_TIMEOUT=10
|
|
XMPP_TIMEOUT=30
|
|
|
|
# --- IA (optionnelle) ---
|
|
# L'IA est désactivée par défaut ; l'activer volontairement (AI_ENABLED=true)
|
|
# et renseigner une clé API valide avant tout envoi.
|
|
AI_ENABLED=false
|
|
AI_PROVIDER=openai
|
|
AI_BASE_URL=https://api.openai.com/v1
|
|
# AI_API_KEY=
|
|
# AI_MODEL=gpt-4o-mini # exemple recommandé, non activé par défaut
|
|
|
|
# Exemple : OpenRouter (HTTPS)
|
|
# AI_PROVIDER=openai-compatible
|
|
# AI_BASE_URL=https://openrouter.ai/api/v1
|
|
# AI_MODEL=fournisseur/modele
|
|
# AI_API_KEY=your-openrouter-key
|
|
# AI_ALLOW_INSECURE_HTTP=false
|
|
|
|
# Exemple : Ollama local (HTTP, sans authentification réelle)
|
|
# AI_PROVIDER=openai-compatible
|
|
# AI_BASE_URL=http://127.0.0.1:11434/v1
|
|
# AI_MODEL=modele-local
|
|
# AI_API_KEY=local-not-required
|
|
# AI_ALLOW_INSECURE_HTTP=true
|
|
|
|
# --- Blog ---
|
|
BLOG_ENABLED=false
|
|
BLOG_RSS_URL=https://blogpeda.ac-bordeaux.fr/cjeliote/?feed=rss2
|
|
|
|
# --- Divers ---
|
|
DRY_RUN=false
|
|
LOG_LEVEL=INFO
|