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é.
90 lines
7.1 KiB
Markdown
90 lines
7.1 KiB
Markdown
# Changelog
|
|
|
|
All notable changes to this project will be documented in this file.
|
|
|
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
|
## [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_url` → `url` dans `PronoteSettings`)
|
|
- `PRONOTE_ENT` rendu optionnel pour les connexions pronotepy directes
|
|
- `.env.example` corrigé (`eleve.html` → `parent.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.
|