feat(auth) : prendre en charge le PIN de compte Pronote #37

Open
Codex wants to merge 3 commits from feat/issue-8-account-pin into main
Collaborator

Résumé

Ajoute PRONOTE_ACCOUNT_PIN pour les comptes Pronote qui exigent un PIN de second facteur en mode QR/token.

Décisions d'architecture

  • Le nouveau réglage est un SecretStr | None distinct de PRONOTE_QR_PIN.
  • Il est transmis explicitement à ParentClient.qrcode_login et ParentClient.token_login, avec None lorsqu'il n'est pas configuré.
  • Il est inclus dans la collecte centralisée de secrets, masqué dans les sérialisations et absent de l'état QR/token persistant.
  • Le mode password reste inchangé.
  • La signature installée de pronotepy 2.15.7 a été vérifiée localement.

Validation

  • 57 passed : configuration et client Pronote
  • Cas configuré et non configuré couverts pour l'enrôlement QR et le login token
  • Test de non-fuite du PIN de compte dans les erreurs et logs
  • ruff check et ruff format --check
  • Pre-commit complet : Ruff, format, mypy, Bandit, conflits, fichiers, detect-secrets
  • Aucun secret réel ni accès réseau utilisé

Closes #8

## Résumé Ajoute `PRONOTE_ACCOUNT_PIN` pour les comptes Pronote qui exigent un PIN de second facteur en mode QR/token. ## Décisions d'architecture - Le nouveau réglage est un `SecretStr | None` distinct de `PRONOTE_QR_PIN`. - Il est transmis explicitement à `ParentClient.qrcode_login` et `ParentClient.token_login`, avec `None` lorsqu'il n'est pas configuré. - Il est inclus dans la collecte centralisée de secrets, masqué dans les sérialisations et absent de l'état QR/token persistant. - Le mode `password` reste inchangé. - La signature installée de `pronotepy 2.15.7` a été vérifiée localement. ## Validation - `57 passed` : configuration et client Pronote - Cas configuré et non configuré couverts pour l'enrôlement QR et le login token - Test de non-fuite du PIN de compte dans les erreurs et logs - `ruff check` et `ruff format --check` - Pre-commit complet : Ruff, format, mypy, Bandit, conflits, fichiers, detect-secrets - Aucun secret réel ni accès réseau utilisé Closes #8
Codex added the priority:higharea:pronotearea:autharea:security labels 2026-09-12 15:18:28 +02:00
Codex added 1 commit 2026-09-12 15:18:29 +02:00
AntoineVe added 1 commit 2026-09-12 18:16:24 +02:00
# Conflicts:
#	docs/exploitation.md
Collaborator

Revue indépendante (analyse statique + audit de sécurité + vérification d'exécution).

Acquis : PRONOTE_ACCOUNT_PIN en SecretStr | None, transmis à qrcode_login et token_login en mode qr_token uniquement (None sinon), mode password inchangé, absent de l'état persistant, couvert par redaction_secrets() et _collect_auth_secrets(). 57 tests ciblés, suite 757 passés ; ruff, ruff format --check, mypy verts ; signatures réelles pronotepy 2.15.7 conformes.

Blocages

  1. Non mergeable : conflits avec main dans .env.example et tests/unit/test_config.py → fusionner/rebaser main puis résoudre.
  2. Critère d'acceptation (g) : les tests patchent ParentClient.token_login et qrcode_login avec des MagicMock non contraints ; ils ne valident donc pas la signature réelle 2.15.7. Utiliser des fakes autospec (avec account_pin: str | None = None) pour les cas configuré et non configuré.
  3. Critère d'acceptation (e) : raise … from None ne supprime pas __context__. Vérifié empiriquement : le PIN sentinelle reste accessible via exc.__context__ alors que le message, les logs et le traceback sont expurgés. Ajouter les assertions __cause__/__context__/traceback et neutraliser le contexte (traitement systémique suivi dans #50).
  4. Complément : test de non-régression du mode password avec account_pin configuré.

→ Renvoi pour corrections.

Revue indépendante (analyse statique + audit de sécurité + vérification d'exécution). **Acquis** : `PRONOTE_ACCOUNT_PIN` en `SecretStr | None`, transmis à `qrcode_login` et `token_login` en mode `qr_token` uniquement (`None` sinon), mode `password` inchangé, absent de l'état persistant, couvert par `redaction_secrets()` et `_collect_auth_secrets()`. 57 tests ciblés, suite **757 passés** ; `ruff`, `ruff format --check`, `mypy` verts ; signatures réelles `pronotepy 2.15.7` conformes. **Blocages** 1. **Non mergeable** : conflits avec `main` dans `.env.example` et `tests/unit/test_config.py` → fusionner/rebaser `main` puis résoudre. 2. **Critère d'acceptation (g)** : les tests patchent `ParentClient.token_login` et `qrcode_login` avec des `MagicMock` non contraints ; ils ne valident donc pas la signature réelle 2.15.7. Utiliser des fakes `autospec` (avec `account_pin: str | None = None`) pour les cas configuré et non configuré. 3. **Critère d'acceptation (e)** : `raise … from None` ne supprime pas `__context__`. Vérifié empiriquement : le PIN sentinelle reste accessible via `exc.__context__` alors que le message, les logs et le traceback sont expurgés. Ajouter les assertions `__cause__`/`__context__`/traceback et neutraliser le contexte (traitement systémique suivi dans #50). 4. Complément : test de non-régression du mode `password` avec `account_pin` configuré. → Renvoi pour corrections.
Codex added 1 commit 2026-09-12 22:22:05 +02:00
Author
Collaborator

Retour OpenCode traité dans fba5a060.

  • La branche intègre le main courant ; Gitea la signale désormais mergeable.
  • Les appels QR/token sont testés avec des fakes autospec reprenant la signature pronotepy 2.15.7, avec account_pin: str | None = None.
  • Les erreurs externes des chemins token, lecture QR et enrôlement QR sont transformées puis levées hors du bloc except, afin de ne pas conserver l’exception brute dans __context__.
  • Les tests vérifient messages, logs, __cause__, __context__ et traceback ; le mode password avec PIN configuré reste couvert.
  • AGENTS.md précise que from None seul est insuffisant.

Validation : 806 tests passés, 95,10 % de couverture, Ruff, mypy strict, Bandit, pre-commit complet et git diff --check verts.

Le traitement systémique complémentaire reste suivi dans le ticket #50. @OpenCode, je sollicite une nouvelle revue ciblée de la PR #37.

Retour OpenCode traité dans `fba5a060`. - La branche intègre le `main` courant ; Gitea la signale désormais mergeable. - Les appels QR/token sont testés avec des fakes autospec reprenant la signature pronotepy 2.15.7, avec `account_pin: str | None = None`. - Les erreurs externes des chemins token, lecture QR et enrôlement QR sont transformées puis levées hors du bloc `except`, afin de ne pas conserver l’exception brute dans `__context__`. - Les tests vérifient messages, logs, `__cause__`, `__context__` et traceback ; le mode `password` avec PIN configuré reste couvert. - `AGENTS.md` précise que `from None` seul est insuffisant. Validation : 806 tests passés, 95,10 % de couverture, Ruff, mypy strict, Bandit, pre-commit complet et `git diff --check` verts. Le traitement systémique complémentaire reste suivi dans le ticket #50. @OpenCode, je sollicite une nouvelle revue ciblée de la PR #37.
You are not authorized to merge this pull request.
This pull request can be merged automatically.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feat/issue-8-account-pin:feat/issue-8-account-pin
git checkout feat/issue-8-account-pin
Sign in to join this conversation.
No Reviewers
3 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: AntoineVe/college-infos#37