Ajoute le mode d'authentification PRONOTE_AUTH_MODE=qr_token comme alternative au mode password pour les instances Pronote utilisant HubEduConnect/EduConnect où l'authentification par mot de passe échoue (CAPTCHA, MFA, flux SAML). Nouveaux éléments : - PronoteSettings : auth_mode, qr_code_file, qr_pin (SecretStr) - PronoteAuthState : persistance du token rotatif dans .pronote_auth_state.json (écriture atomique, permissions 0600, symlink-safe via O_EXCL|O_NOFOLLOW) - PronoteClient._connect_qr_token() : token_login avec creds persistés, qrcode_login pour l'enrôlement initial, export_credentials persisté après chaque login réussi - PronoteAuthRotationError : levée en cas d'échec de rotation du token, propagée sans wrapping à travers PronoteFetcher et fetch_step jusqu'à PipelineRunner.run() qui notifie via XMPP (si canal disponible et dry_run inactif) - _is_pronotepy_configured() mode-aware : qr_token ne requiert que PRONOTE_URL - _collect_auth_secrets() : redaction des secrets explicites (token, PIN, jeton QR) dans tous les logs du chemin d'authentification Documentation : - .env.example : PRONOTE_AUTH_MODE, PRONOTE_QR_CODE_FILE, PRONOTE_QR_PIN - AGENTS.md : contrat d'authentification QR code / token - Wiki GuidePronote : section enrôlement, exécutions suivantes, ré-enrôlement Tests (686 passés, couverture 94.87%) : - 5 tests config QR, 9 tests auth_state, 10 tests client QR, 3 tests propagation, 4 tests intégration rotation end-to-end, 4 tests fallback mode-aware - Tests de non-fuite : sentinelles distinctes pour token, PIN, jeton QR Co-authored-by: coder/litellm/coder <coder@agents.invalid>
86 lines
2.6 KiB
Plaintext
86 lines
2.6 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
|
|
|
|
# Mode d'authentification Pronote
|
|
# "password" (défaut) : authentification classique URL + identifiant + mot de passe
|
|
# "qr_token" : authentification par QR code puis token persistant
|
|
PRONOTE_AUTH_MODE=password
|
|
|
|
# Fichier JSON du QR code Pronote (enrôlement initial, mode qr_token uniquement)
|
|
# À générer depuis l'application mobile Pronote. Le QR code expire ~10 minutes.
|
|
# PRONOTE_QR_CODE_FILE=/path/to/qr_code.json
|
|
|
|
# PIN à 4 chiffres pour l'enrôlement QR code (mode qr_token uniquement)
|
|
# SENSIBLE : ne jamais committer cette valeur
|
|
# 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
|
|
XMPP_USE_TLS=true
|
|
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
|