Files
college-infos/CHANGELOG.md
T
OpenCode 202e787cf0 release: v0.2.0 — endpoint unifié et PIN de compte Pronote
Bump version 0.1.2 → 0.2.0.
CHANGELOG mis à jour : contrat ExternalEndpoint commun, unification
AI_BASE_URL, PIN de compte Pronote et durcissement sécurité.
2026-09-13 18:43:02 +02:00

7.1 KiB

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[0.2.0] - 2026-09-13

Added

  • Prise en charge du PIN de compte Pronote (PRONOTE_ACCOUNT_PIN) pour l'authentification par mot de passe (#8).
  • Contrat ExternalEndpoint commun (Pydantic v2 : SecretStr, frozen, extra='forbid') pour les endpoints CalDAV, RSS et Pronote, avec nouvelles variables canoniques CALDAV_ENDPOINT__URL, BLOG_ENDPOINT__URL, PRONOTE_ENDPOINT__URL, PRONOTE_ICAL_ENDPOINT__URL (#16).

Changed

  • Unification du contrat AI_BASE_URL entre les fournisseurs de synthèse (#17).
  • Les anciennes variables CALDAV_URL, BLOG_RSS_URL, PRONOTE_URL et PRONOTE_ICAL_URL restent acceptées comme alias dépréciés (DeprecationWarning).
  • hide_input_in_errors=True sur les paramètres Pronote/CalDAV/Blog : les valeurs sensibles ne fuitent plus dans les erreurs de validation.
  • Schéma file:// retiré du contrat des endpoints réseau ; HTTP restreint au loopback explicitement autorisé.
  • Documentation alignée (README.LLM.md, .env.example, GUIDE_DEV_PYTHON.md, docs/pronote-auth.md) et métadonnées de packaging (identité et URL Gitea réelles).

Fixed

  • Sécurité : détection des PIN *_PIN littéraux (#48), des PIN en query string (?pin=, #58) et des placeholders d'URL documentaires (#34) par check_secrets.py.
  • Sécurité : neutralisation de __context__ et du traceback des exceptions expurgées (raise ... from None sorti des handlers) (#50).
  • qr_token : get_informations() ignorée en mode qr_token (erreur pronotepy 20 sur les instances HubEduConnect) (#21).
  • RSS : état mémoire confirmé après remplacement atomique avant l'acquittement des GUID (#49) ; GUID acquittés après livraison XMPP (#12).
  • CalDAV : devoirs rendus transparents (#11) ; événements gérés sans UID ignorés (#47).
  • Configuration : fenêtres de synchronisation négatives refusées (#14).
  • CLI : exécutions dégradées rendues observables (#13).
  • Pronote : parsing iCal fiabilisé pour l'année scolaire 2026.
  • XMPP : correction du timeout (mode TLS et timeouts de connexion/nettoyage).
  • Dry-run : simulation garantie sans persistance ; sérialisation du cycle QR/token local.
  • Documentation : commande cd corrigée après clonage du dépôt Gitea (#56).

[0.1.2] - 2026-09-10

Added

  • Authentification QR code / token (PRONOTE_AUTH_MODE=qr_token) : alternative au mode password pour les instances Pronote utilisant HubEduConnect/EduConnect où l'authentification par mot de passe échoue (CAPTCHA, MFA, flux SAML modifié).
    • Enrôlement initial via QR code (pronotepy.qrcode_login)
    • Persistance du token rotatif dans .pronote_auth_state.json (permissions 0600, écriture atomique, symlink-safe)
    • Login subsequent via pronotepy.token_login avec token persisté
    • Notification XMPP actionnable en cas d'échec de rotation (PronoteAuthRotationError)
    • Persistance du token après chaque opération de données réussie et dans le chemin d'erreur (refresh pronotepy)
    • _is_pronotepy_configured() mode-aware : qr_token ne requiert que PRONOTE_URL
    • Redaction des secrets explicites (token, PIN, jeton QR) dans tous les logs
  • Nouvelles variables d'environnement : PRONOTE_AUTH_MODE, PRONOTE_QR_CODE_FILE, PRONOTE_QR_PIN
  • Documentation : section "Contrat d'authentification QR code / token" dans AGENTS.md, section QR code dans le wiki GuidePronote

Fixed

  • PRONOTE_URL ignoré à cause du double préfixe env_prefix (renommage pronote_urlurl dans PronoteSettings)
  • PRONOTE_ENT rendu optionnel pour les connexions pronotepy directes
  • .env.example corrigé (eleve.htmlparent.html)
  • #20/#21 — get_informations() ignorée en mode qr_token : retourne [] immédiatement, sans connexion, verrou ni appel réseau, évitant l'échec systématique de l'endpoint PageActualites (erreur pronotepy 20 sur les instances HubEduConnect testées) et le refresh redondant du token associé.

Changed

  • Wiki GuidePronote enrichi : section "Quand l'ENT est obligatoire" (EduConnect/HubEduConnect), exemple Bordeaux
  • AGENTS.md : ajout de la section §13 "Versionnage et releases"

Tests

  • 694 tests passés, couverture 94.93%
  • 35 nouveaux tests QR/token : config, auth_state, client, propagation, intégration end-to-end

[0.1.0] - 2026-09-08

Initial release covering milestones M1 through M15, except the optional Gitea Actions workflow.

Added

  • M1 (Scaffolding): Python project structure with pyproject.toml, and tooling configuration for ruff, mypy, bandit, and pre-commit.
  • M2 (Configuration & secrets): Pydantic Settings for configuration management, SecretStr for sensitive fields, and redaction utilities (redact_url, redact_secrets, redact_exception) with RedactingFormatter for logging.
  • M3 (Data models): 16 Pydantic models and 6 enums across 10 modules, including frozen contracts and mutable work results.
  • M4 (Pronote sources): iCal fetch and parse, pronotepy.ParentClient integration, automatic fallback logic for auto, ical, and pronotepy modes, and error redaction for sensitive data.
  • M5 (Blog RSS): feedparser-based RSS client with GUID deduplication, HTTP cache support (ETag/If-Modified-Since), and BlogRSSState persistence.
  • M6 (Theoretical agenda): JSON provider with week parity (even/odd), school holidays calendar, and deterministic IDs for events.
  • M7 (CalDAV sync): Differential synchronization by UID, X-PRONOTE-SYNC-MANAGED marker for managed events, idempotent operations, preserved cancelled events, and dry-run support.
  • M8 (Agenda diff): AgendaComparator with deterministic matching, and generation of AgendaDiff/AgendaChange objects for tracking differences.
  • M9 (AI synthesis): SynthesisProvider protocol, OpenAI provider, optional litellm provider, and openai-compatible provider with degraded mode (returns None on failure).
  • M10 (XMPP channel): XmppChannel using slixmpp, formatted messages (synthesis, homeworks, changes, messages, blog), and error handling that returns False on failure.
  • M11 (Pipeline orchestration): PipelineRunner as composition root, 7 pipeline steps, degraded error handling, dry-run mode, and iCal reuse within a single run.
  • M12 (CLI entry point): pronote-sync command with --dry-run and --log-level options, redacted error display, and safe traceback in DEBUG mode.
  • M13 (Tests & coverage): 636 tests with 95.67% coverage, test fixtures (pronote-4e.ics, pronote-6e.ics), shared conftest.py, and secret non-leak tests.
  • M14 (Deployment): systemd service and timer (daily at 18:00), logrotate configuration (daily, rotate 7, compress), check_secrets.py pre-deployment scanner, and exploitation guide.
  • M15 (Documentation): README, README.LLM.md (AI agent setup guide), MIT LICENSE, CHANGELOG, and local validation procedures. Gitea Actions CI/CD remains optional and is not delivered in this release.