Reprend les migrations RSS (#60) et Pronote (#61) restées hors de main après une fusion empilée erronée, les rebase sur main (qui contient déjà #59 CalDAV et les correctifs sécurité #53/#54/#58) et applique les corrections du ticket #63.
Rebase de 097a27f (RSS) et ee89f13 (Pronote) sur main — aucun correctif sécurité de main n'est annulé (fichiers #53/#54/#58 byte-identiques).
## Résumé
Reprend les migrations RSS (#60) et Pronote (#61) restées hors de `main` après une fusion empilée erronée, les rebase sur `main` (qui contient déjà #59 CalDAV et les correctifs sécurité #53/#54/#58) et applique les corrections du ticket #63.
- Rebase de `097a27f` (RSS) et `ee89f13` (Pronote) sur `main` — aucun correctif sécurité de `main` n'est annulé (fichiers #53/#54/#58 byte-identiques).
- Contrat `ExternalEndpoint` durci : schéma `file` retiré (réseau uniquement), URLs avec userinfo rejetées.
- `hide_input_in_errors=True` sur `PronoteSettings`/`CalDAVSettings`/`BlogSettings`.
- Fixtures `file://` migrées vers `https://` mocké (`responses`) ; matrice de tests paramétrée du contrat (précédence alias, loopback, extra/frozen, userinfo, redaction).
- Suppression du contournement `model_construct` de l'alias `CALDAV_URL` : l'alias est désormais validé comme le champ canonique.
- Retrait du support `file://` de `fetch_ical` (branche morte) et de l'exemple résiduel du guide.
- Documentation alignée : `README.LLM.md`, `.env.example`, `GUIDE_DEV_PYTHON.md`, `docs/pronote-auth.md`.
## Validation
- `pytest --cov` : 880 passés, couverture 95,17 %
- `ruff check .` et `ruff format --check .` : OK
- `mypy .` : Success (111 fichiers)
- `bandit -r pronote_sync/` : 0 constat
- Revue indépendante, audit de sécurité et vérification : APPROVED / APPROVED / VERIFIED
## Suivi
- Closes #16 (migration CalDAV + RSS + Pronote désormais complète dans `main`)
- Closes #63
- Supersedes #61 (à fermer sans merge)
Retire le schéma file du contrat ExternalEndpoint (CalDAV, Pronote iCal, Blog RSS) : seuls https et le loopback http CalDAV explicite restent acceptés. Rejette les URLs contenant userinfo. Ajoute hide_input_in_errors aux Settings. Réécrit les fixtures file:// en https mocké et ajoute une matrice de tests paramétrée du contrat.
Refs #63
Documente le schéma *_ENDPOINT__URL unique, le statut déprécié des anciens noms et le refus de file:// et des credentials embarqués dans README.LLM.md, .env.example, GUIDE_DEV_PYTHON.md et docs/pronote-auth.md.
Refs #63
Supprime le contournement model_construct : l'alias CALDAV_URL est désormais validé comme le champ canonique (userinfo, host et port rejetés). Retire le support file:// de fetch_ical et corrige l'exemple résiduel du guide. Ajoute les tests négatifs de l'alias legacy et adapte le test de sécurité CalDAV au contrat durci.
Refs #63
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Résumé
Reprend les migrations RSS (#60) et Pronote (#61) restées hors de
mainaprès une fusion empilée erronée, les rebase surmain(qui contient déjà #59 CalDAV et les correctifs sécurité #53/#54/#58) et applique les corrections du ticket #63.097a27f(RSS) etee89f13(Pronote) surmain— aucun correctif sécurité demainn'est annulé (fichiers #53/#54/#58 byte-identiques).ExternalEndpointdurci : schémafileretiré (réseau uniquement), URLs avec userinfo rejetées.hide_input_in_errors=TruesurPronoteSettings/CalDAVSettings/BlogSettings.file://migrées vershttps://mocké (responses) ; matrice de tests paramétrée du contrat (précédence alias, loopback, extra/frozen, userinfo, redaction).model_constructde l'aliasCALDAV_URL: l'alias est désormais validé comme le champ canonique.file://defetch_ical(branche morte) et de l'exemple résiduel du guide.README.LLM.md,.env.example,GUIDE_DEV_PYTHON.md,docs/pronote-auth.md.Validation
pytest --cov: 880 passés, couverture 95,17 %ruff check .etruff format --check .: OKmypy .: Success (111 fichiers)bandit -r pronote_sync/: 0 constatSuivi
main)