• v0.1.2 999ed76ba7

    AntoineVe released this 2026-09-10 14:02:53 +02:00 | 0 commits to main since this release

    Authentification QR code / token

    Cette version 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 modifié).

    Fonctionnalités

    • Enrôlement initial via QR code généré sur le site web Pronote (espace parent → paramètres → QR code)
    • Token persistant : le token est sauvegardé dans .pronote_auth_state.json (permissions 0600, écriture atomique, symlink-safe) et réutilisé entre les exécutions
    • Rotation automatique : le token roté par le serveur Pronote pendant l'exécution est persisté après chaque opération de données réussie et même dans le chemin d'erreur
    • Notification XMPP : en cas d'échec de rotation du token, un message actionnable est envoyé via XMPP (si configuré et dry_run inactif)
    • Mode-aware fallback : _is_pronotepy_configured() ne requiert que PRONOTE_URL en mode qr_token
    • Sécurité : redaction des secrets explicites (token, PIN, jeton QR) dans tous les logs, PronoteAuthRotationError propagée sans wrapping

    Nouvelles variables

    Variable Description
    PRONOTE_AUTH_MODE password (défaut) ou qr_token
    PRONOTE_QR_CODE_FILE Chemin du fichier JSON QR code (enrôlement initial)
    PRONOTE_QR_PIN PIN à 4 chiffres (SecretStr, enrôlement initial)

    Corrections

    • PRONOTE_URL ignoré à cause du double préfixe env_prefix (renommage pronote_urlurl)
    • PRONOTE_ENT rendu optionnel pour les connexions pronotepy directes
    • .env.example corrigé (eleve.htmlparent.html)

    Validation

    • Instance : 0640036s.index-education.net (Bordeaux, HubEduConnect)
    • Premier run : enrôlement QR code → 144 événements agenda récupérés → token persisté
    • Second run : token_login avec token persisté → 144 événements → token roté et persisté
    • L'erreur 20 « La page a expiré » sur get_informations est non bloquante (mode dégradé)

    Qualité

    • 694 tests passés, couverture 94.93%
    • ruff check | ruff format | mypy | bandit
    • 35 nouveaux tests QR/token

    Issues connues (non bloquantes)

    • #20 — Triple authentification pronotepy (double INIT + refresh) lors d'un run
    • #21 — Erreur pronotepy 20 « La page a expiré ! (11) » sur get_informations

    Documentation

    • Wiki GuidePronote — section authentification QR code / token
    • AGENTS.md — contrat d'authentification QR code / token
    • .env.example — variables qr_token documentées
    Downloads