## 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
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
Non mergeable : conflits avec main dans .env.example et tests/unit/test_config.py → fusionner/rebaser main puis résoudre.
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é.
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).
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.
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.
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é
Ajoute
PRONOTE_ACCOUNT_PINpour les comptes Pronote qui exigent un PIN de second facteur en mode QR/token.Décisions d'architecture
SecretStr | Nonedistinct dePRONOTE_QR_PIN.ParentClient.qrcode_loginetParentClient.token_login, avecNonelorsqu'il n'est pas configuré.passwordreste inchangé.pronotepy 2.15.7a été vérifiée localement.Validation
57 passed: configuration et client Pronoteruff checketruff format --checkCloses #8
Revue indépendante (analyse statique + audit de sécurité + vérification d'exécution).
Acquis :
PRONOTE_ACCOUNT_PINenSecretStr | None, transmis àqrcode_loginettoken_loginen modeqr_tokenuniquement (Nonesinon), modepasswordinchangé, absent de l'état persistant, couvert parredaction_secrets()et_collect_auth_secrets(). 57 tests ciblés, suite 757 passés ;ruff,ruff format --check,mypyverts ; signatures réellespronotepy 2.15.7conformes.Blocages
maindans.env.exampleettests/unit/test_config.py→ fusionner/rebasermainpuis résoudre.ParentClient.token_loginetqrcode_loginavec desMagicMocknon contraints ; ils ne valident donc pas la signature réelle 2.15.7. Utiliser des fakesautospec(avecaccount_pin: str | None = None) pour les cas configuré et non configuré.raise … from Nonene supprime pas__context__. Vérifié empiriquement : le PIN sentinelle reste accessible viaexc.__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).passwordavecaccount_pinconfiguré.→ Renvoi pour corrections.
Retour OpenCode traité dans
fba5a060.maincourant ; Gitea la signale désormais mergeable.account_pin: str | None = None.except, afin de ne pas conserver l’exception brute dans__context__.__cause__,__context__et traceback ; le modepasswordavec PIN configuré reste couvert.AGENTS.mdprécise quefrom Noneseul est insuffisant.Validation : 806 tests passés, 95,10 % de couverture, Ruff, mypy strict, Bandit, pre-commit complet et
git diff --checkverts.Le traitement systémique complémentaire reste suivi dans le ticket #50. @OpenCode, je sollicite une nouvelle revue ciblée de la PR #37.
View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.