Spaces:
Runtime error
Runtime error
Commit History
26 days ago
-
fix(deploiement): corrections de la seconde revue
Revue adversariale du deploiement, trouvailles verifiees une a une. - demarrer.sh : un psql en echec dans la condition d'un if passait pour une base sans table, donc a restaurer. Une mise a jour pouvait ainsi faire DROP DATABASE de la production, puis restaurer le corpus du premier jour, sans un compte. La reponse doit etre t ou f, sinon arret. Le dump initial est renomme apres une restauration reussie : plus aucune mise a jour ne peut le rejouer. Un temoin fait reprendre une restauration interrompue. Une sauvegarde precede chaque mise a jour. - ADMIN_PASSWORD : docker compose interprete $, # et les guillemets ; « Jurix2026$admin » arrivait sous la forme « Jurix2026 ». Refuses. - create_admin.py promouvait superadmin un compte ordinaire deja inscrit a ADMIN_EMAIL, avec son propre mot de passe, alors que le site est public avant la creation de l'administrateur. Refus sans --promouvoir, qui remplace alors le mot de passe. Le test qui devait prouver « aucun acces a …7cf23f7
29 days ago
-
fix(deploiement): trois pannes trouvees par l'essai de bout en bout
Essai complet de demarrer.sh dans une copie isolee (https://localhost) : base neuve, migrations depuis zero, relance a l'identique, restauration d'un dump sur un schema deja cree, sauvegarde. - demarrer.sh s'arretait sur une base neuve, avant toute restauration : PostgreSQL resout `laws` a l'analyse, meme dans la branche non prise du CASE. Deux requetes a la place. Le premier deploiement aurait echoue. - Les redirections de l'API (barre oblique finale) partaient vers http:// : uvicorn ne croyait pas les en-tetes X-Forwarded-* de Caddy, et le navigateur bloque une redirection vers http depuis une page https. FORWARDED_ALLOW_IPS="*" : sans danger, seul Caddy joint l'API. - Un ADMIN_PASSWORD hors politique (sans majuscule) faisait echouer create_admin.py, qui affichait l'erreur Pydantic entiere, mot de passe en clair compris. Le script n'affiche plus que le champ et la regle, et demarrer.sh verifie la politique des l'etape 1, avant vingt minutes de construction. Aussi …6e91d61
-
chore: dernieres corrections ruff automatiques
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>c7fa337 -
fix(qualite): ruff devient une vraie barriere, et trouve un schema mort et casse
Ruff tournait sans jeu de regles declare : 1332 signalements, dont 98 faux positifs sur le motif `Depends()` de FastAPI et 615 modernisations de style. Un controle que personne ne peut passer n'est pas un controle. Le jeu retenu ne garde que ce qui signale un defaut reel (F, E4, E7, E9, I, RUF100), avec des exceptions nommees la ou l'ordre des imports EST la protection : env.py doit poser sys.path avant d'importer les modeles, conftest doit surcharger DATABASE_URL avant d'importer l'application. Ce que le controle a alors trouve : - UN SCHEMA MORT ET CASSE. `LawDetailResponse` existait deja, exposant `List[ArticleResponse]`. Il n'etait branche sur aucune route, et il etait doublement inutilisable : ArticleResponse porte le CONTENU integral de chaque article — pour le Code Minier, 166 Ko servis deux fois — et son `number` etait plafonne a 20 caracteres alors que la colonne en fait 64 depuis qu'elle accueille « QUATRE-VINGT-DIX-SEPTIEME ». Le plafond du schema est corrige, et…7435134
-
Etape 11 : authentification reelle branchee (demande n°2)
app/core/auth.py (188 lignes, JWT + bcrypt + roles) etait complet et importe par PERSONNE. Les 9 endpoints d'administration passaient par deux stubs renvoyant {"id": 1, "role": "admin"} : ils etaient ouverts a tous. BUG BLOQUANT decouvert en chemin : passlib 1.7.4 (derniere version, 2020) est incompatible avec bcrypt >= 4.1 — il lit bcrypt.__about__.__version__, supprime depuis. Avec bcrypt 5.x installe, hash_password echouait avec "password cannot be longer than 72 bytes" MEME pour 13 caracteres : l'authentification aurait ete inutilisable telle que declaree. -> bcrypt utilise directement, passlib retire des manifestes. Pre-hachage SHA-256 + base64 avant bcrypt : entree de longueur fixe, donc support des phrases de passe longues sans la troncature silencieuse a 72 octets de bcrypt (deux mots de passe partageant leurs 72 premiers octets etaient equivalents). Ajouts : - app/api/routes/auth.py : POST /login (formulaire OAuth2, l'URL exacte attendue par oauth2_scheme, donc le…da2ad52