Commit Graph
132 Commits
Author SHA1 Message Date
Codex ed0946e4c2 fix(docs): corriger le répertoire de clonage 2026-09-13 00:25:11 +02:00
Codex a21acaa409 docs(packaging): aligner les métadonnées du projet
Closes #18

Co-authored-by: Codex <codex@antoineve.me>
2026-09-13 00:24:10 +02:00
Codex f261fed1af fix(blog): confirmer l'état mémoire après sauvegarde
Closes #49

Co-authored-by: Codex <codex@antoineve.me>
2026-09-13 00:15:07 +02:00
Codex e6f0659cbf fix(caldav): ignorer les événements gérés sans UID
Closes #47

Co-authored-by: Codex <codex@antoineve.me>
2026-09-13 00:13:29 +02:00
OpenCode 50c3696b06 Merge pull request 'fix(security) : ignorer les placeholders URL documentaires' (#36) from fix/issue-34-secret-placeholder into main 2026-09-12 23:58:01 +02:00
OpenCode c0a1c5ca62 Merge pull request 'feat(auth) : prendre en charge le PIN de compte Pronote' (#37) from feat/issue-8-account-pin into main 2026-09-12 23:57:48 +02:00
OpenCode 52c791695c Merge remote-tracking branch 'origin/main' into feat/issue-8-account-pin
# Conflicts:
#	docs/exploitation.md
2026-09-12 23:57:06 +02:00
OpenCode 9433a69d70 Merge pull request 'fix(blog) : acquitter les GUID après livraison XMPP' (#39) from fix/issue-12-blog-delivery into main 2026-09-12 23:54:12 +02:00
OpenCode 4f95ca9256 Merge pull request 'fix(cli) : rendre les exécutions dégradées observables' (#40) from fix/issue-13-observable-status into main 2026-09-12 23:53:58 +02:00
OpenCode 81ff7238dd Merge pull request 'fix(caldav) : rendre les devoirs transparents' (#41) from fix/issue-11-caldav-homework into main 2026-09-12 23:53:44 +02:00
Codex c47325ef14 fix(security): durcir les placeholders URL documentaires 2026-09-12 22:25:29 +02:00
Codex fba5a060df fix(auth): corriger les retours de revue du PIN Pronote 2026-09-12 22:20:09 +02:00
OpenCode 1f03b114a9 Merge pull request 'docs(auth): rendre la référence Pronote vérifiable' (#45) from docs/issue-10-pronote-auth-reference into main 2026-09-12 21:18:05 +02:00
OpenCode 4c6b8dbee8 Merge remote-tracking branch 'origin/main' into docs/issue-10-pronote-auth-reference 2026-09-12 21:17:35 +02:00
OpenCode 423a32f220 docs(pronote-auth): reconstruire le source LaTeX et régénérer le PDF
Les fichiers de chapitres référencés par docs/pronote-auth.tex (preamble, frontmatter, ch-*, annex-*) n'avaient jamais été committés, rendant le PDF non reproductible. Reconstitution fidèle depuis docs/pronote-auth.md, correction des instructions de compilation (TEXINPUTS + -output-directory), ajout de l'Annexe C, du Glossaire et de l'Historique des révisions, PDF régénéré (27 pages).
2026-09-12 21:17:23 +02:00
OpenCode 79ef5434ee Merge pull request 'refactor(ia): unifier le contrat AI_BASE_URL entre les providers' (#43) from refactor/issue-17-ai-base-url into main 2026-09-12 20:00:41 +02:00
OpenCode d5e4964887 Merge remote-tracking branch 'origin/main' into refactor/issue-17-ai-base-url
# Conflicts:
#	.secrets.baseline
2026-09-12 19:58:13 +02:00
OpenCode 35e93cc993 Merge pull request 'fix(pronote): ignorer les informations en mode qr_token' (#44) from fix/issue-21-qr-token-informations into main 2026-09-12 19:21:25 +02:00
OpenCode 9cd3918291 Merge pull request 'fix(config): refuser les fenêtres de synchronisation négatives' (#42) from fix/issue-14-negative-sync-window into main 2026-09-12 19:21:08 +02:00
OpenCode f421a386f5 refactor(ia): unifier le contrat AI_BASE_URL entre les providers
Applique une validation structurelle partagée (https, absence de credentials et de paramètres sensibles, aucun ajout /v1) aux providers openai, litellm et openai-compatible ; homogénéise les warnings expurgés et durcit le parsing pour que la factory ne lève jamais.

Refs #17
2026-09-12 19:20:03 +02:00
OpenCode 79858a0849 fix(pronote): ignorer les informations en mode qr_token
En mode qr_token, get_informations() retourne [] sans connexion ni verrou, ce qui évite l'échec systématique de PageActualites (erreur pronotepy 20) et le refresh redondant du token sur les instances HubEduConnect.

Refs #21
Refs #20
2026-09-12 19:20:03 +02:00
OpenCode 8efac8645b docs(auth): rendre la référence Pronote vérifiable
Qualifie sources et hypothèses (pronotepy 2.15.7, 2026-09-12), corrige le nombre d'ENT, exclut CAS/SAML/EduConnect générique, aligne la procédure QR sur .env.example et supprime les exemples copiables.

Refs #10
2026-09-12 19:18:28 +02:00
OpenCode 8c6a0e3f29 fix(config): refuser les fenêtres de synchronisation négatives
Contraint SYNC_PAST_DAYS et SYNC_FUTURE_DAYS à ge=0 et documente l'effet réel de 0 jour (le jour courant reste inclus).

Refs #14
2026-09-12 19:18:27 +02:00
Codex 4ad62ad50f Merge branch 'main' into feat/issue-8-account-pin
# Conflicts:
#	docs/exploitation.md
2026-09-12 18:11:57 +02:00
Codex 6575a5f60b fix(caldav): rendre les devoirs transparents 2026-09-12 15:43:12 +02:00
Codex 5bd97402bf fix(cli): exposer les executions degradees 2026-09-12 15:37:11 +02:00
Codex 75dd78ee1e fix(blog): acquitter les GUID apres livraison XMPP 2026-09-12 15:33:59 +02:00
Codex 6bb8ad1ed1 docs(deploiement) : imposer les permissions de la configuration
Aligne la documentation d'exploitation et le wiki sur les permissions protegees des secrets et de l'etat d'authentification.

Co-authored-by: Codex <codex@antoineve.me>
2026-09-12 15:26:57 +02:00
Codex 2d55ac8d2b feat(auth): prendre en charge le PIN de compte Pronote 2026-09-12 15:18:00 +02:00
Codex 0ff6e687b6 fix(security): ignorer les placeholders URL documentaires 2026-09-12 15:17:54 +02:00
Codex 573705a3d0 chore(integration): intégrer les PR Pronote critiques dans main
Revue Codex validée. Intégration dans main de la chaîne des PR #31, #32 et #33.

Co-authored-by: Codex <codex@antoineve.me>
Co-committed-by: Codex <codex@antoineve.me>
2026-09-12 15:00:32 +02:00
Codex d45d38d365 fix(ical): fiabiliser le parsing Pronote 2026
Revue Codex validée. Corrections de parsing iCal, conservation du contexte des devoirs et fixtures anonymisées.

Co-authored-by: Codex <codex@antoineve.me>
Co-committed-by: Codex <codex@antoineve.me>
2026-09-12 14:54:55 +02:00
AntoineVe f194ed985d fix(xmpp): corriger le timeout XMPP — TLS mode + timeouts de connexion/cleanup (#25) (#26) 2026-09-11 17:25:21 +02:00
AntoineVe d124f78b55 fix(dry-run) : garantir une simulation sans persistance (#24) 2026-09-11 12:00:40 +02:00
Codex 0dd4ee68c1 docs: define strict dry-run contract
# Conflicts:
#	.secrets.baseline
2026-09-11 11:57:21 +02:00
Codex fde8fbe264 fix: reject QR token dry-run 2026-09-11 11:44:13 +02:00
Codex 145dace289 fix: wire dry-run source state policy 2026-09-11 11:44:13 +02:00
Codex 642bbf16c1 fix: prevent source state writes in dry-run 2026-09-11 11:44:13 +02:00
AntoineVe 2b82ffb38d fix(auth) : sérialiser le cycle QR/token local (#23) 2026-09-11 11:41:57 +02:00
Codex 4228c1e636 fix: ignore QR token lockfile 2026-09-10 23:41:19 +02:00
Codex 8b924b55d1 docs: document QR token state locking 2026-09-10 21:26:43 +02:00
Codex 22a662ab39 fix: serialize QR token client operations 2026-09-10 21:24:11 +02:00
Codex 5188761209 fix: add QR token state lock primitive 2026-09-10 21:15:08 +02:00
AntoineVe 999ed76ba7 release: v0.1.2 — authentification QR code / token Pronote
Bump version 0.1.0 → 0.1.2.
CHANGELOG mis à jour avec les ajouts, corrections et issues connues.
v0.1.2
2026-09-10 14:02:37 +02:00
AntoineVeandcoder/litellm/coder 6a8685fc9d feat: authentification QR code / token pour Pronote (#6)
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.

Validé en production sur l'instance Bordeaux (0640036s.index-education.net) :
- Enrôlement QR code → token persisté → second run avec token_login → succès
- 144 événements agenda récupérés
- Token roté et persisté correctement même en cas d'erreur 20 (page expirée)

Issues connues non bloquantes : #20 (triple auth), #21 (erreur 20 get_informations)

Co-authored-by: coder/litellm/coder <coder@agents.invalid>
2026-09-10 13:59:42 +02:00
AntoineVe 4df930bfe6 fix: persister le token même dans le chemin d'erreur de get_informations/get_messages
Cause racine : quand pronotepy reçoit une PronoteAPIError (ex. code 20 « page
expirée »), il appelle refresh() en interne, qui peut roter le token en mémoire
(client.password mis à jour avec un nouveau jetonConnexionAppliMobile). Le retry
peut aussi échouer — l'exception atteint get_informations()/get_messages() qui
l'attrapent et retournent [] (mode dégradé). Mais _persist_credentials()
n'était appelé que dans le chemin de SUCCÈS — le token rafraîchi en mémoire
n'était jamais persisté. Au run suivant, token_login utilisait le token
périmé → échec KeyError 'dataSec' → PronoteAuthRotationError.

Correction : appeler _persist_credentials() aussi dans le chemin d'erreur de
get_informations() et get_messages(), avant le return []. L'ancien token est
déjà invalidé côté serveur lors du refresh — ne pas persister le nouveau token
garantit la perte du seul token valide.

Tests : 3 nouveaux tests (persistance dans le chemin d'erreur, sauvegarde du
token rafraîchi sur erreur). 694 passés, couverture 94.93%.
2026-09-10 13:34:51 +02:00
AntoineVe d26cef8d3d fix: persister le token après chaque opération de données + corriger doc QR code
Cause racine : pronotepy peut rafraîchir (rotater) le token en mémoire pendant
l'exécution via refresh() automatique après une PronoteAPIError. L'ancien code
ne persistait les credentials qu'après le login initial, pas après les
opérations de données. Le token roté en mémoire était perdu → au run suivant,
token_login échouait avec le token périmé (KeyError 'dataSec').

Correction :
- PronoteClient._persist_credentials() : méthode centralisée qui persiste
  export_credentials() après chaque opération réussie (get_lessons,
  get_homeworks, get_messages, get_informations)
- Le token rafraîchi par le serveur pendant l'exécution est maintenant
  toujours persisté, même si le pipeline échoue ensuite

Documentation :
- .env.example : variables QR plus visibles (exemple qr_token décommentable)
- AGENTS.md : QR code depuis le site web Pronote (pas l'app mobile),
  persistance après chaque opération de données
- Wiki GuidePronote : procédure corrigée (site web, pas app Android/iOS),
  mention de la persistance après chaque opération

Tests : 5 nouveaux tests de persistance (691 passés, couverture 94.92%)
2026-09-10 12:10:42 +02:00
OpenCodeandWarp 7dc48f6f43 docs: nettoyer AGENTS.md des règles redondantes
Retrait des sections de règles de développement de AGENTS.md, désormais centralisées dans orchestrator.md.

Co-Authored-By: Warp <agent@warp.dev>
2026-09-10 11:30:33 +02:00
AntoineVe bc79ebf680 docs: création d'un document de référence (non officiel) pour l'authentification pronote. 2026-09-10 11:25:49 +02:00
AntoineVeandcoder/litellm/coder 0363898669 feat: authentification QR code / token pour Pronote
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>
2026-09-08 23:15:06 +02:00