Checkpoint: Correction recette : une variable REFERENTIEL_IA_TOKEN vide masquait le secret Docker monté. Le serveur privilégie désormais un jeton explicite non vide et bascule vers le fichier secret sinon. Test de non-régression ajouté ; 89 tests, TypeScript et build validés.

This commit is contained in:
Manus
2026-10-02 15:01:42 +00:00
parent eba192e159
commit edb4726d5f
3 changed files with 30 additions and 2 deletions

View File

@@ -10,6 +10,12 @@ export function readSecretFile(path: string | undefined): string {
}
}
/** Préfère un secret explicite, puis le secret Docker si la variable est absente ou vide. */
export function resolveServerSecret(value: string | undefined, secretPath: string | undefined): string {
const environmentValue = value?.trim();
return environmentValue || readSecretFile(secretPath);
}
export const ENV = {
appId: process.env.VITE_APP_ID ?? "",
cookieSecret: process.env.JWT_SECRET ?? "",
@@ -22,5 +28,8 @@ export const ENV = {
mistralApiKey: process.env.MISTRAL_API_KEY ?? "",
geminiApiKey: process.env.GEMINI_API_KEY ?? "",
referentielIaUrl: process.env.REFERENTIEL_IA_URL ?? "",
referentielIaToken: process.env.REFERENTIEL_IA_TOKEN ?? readSecretFile(process.env.REFERENTIEL_IA_TOKEN_FILE),
referentielIaToken: resolveServerSecret(
process.env.REFERENTIEL_IA_TOKEN,
process.env.REFERENTIEL_IA_TOKEN_FILE,
),
};

View File

@@ -7,7 +7,7 @@ import {
testReferentialIaConnection,
type ReferentielIaConnection,
} from "./referentialIa";
import { readSecretFile } from "./_core/env";
import { readSecretFile, resolveServerSecret } from "./_core/env";
const connection: ReferentielIaConnection = {
baseUrl: "https://referentiel-ia.recette.santinova-soft.org",
@@ -34,6 +34,20 @@ describe("Référentiel IA", () => {
}
});
it("utilise le secret monté lorsque la variable d'environnement est vide", () => {
const directory = mkdtempSync(join(tmpdir(), "referentiel-ia-"));
const secretFile = join(directory, "token");
try {
writeFileSync(secretFile, " mounted-secret\n", { mode: 0o600 });
expect(resolveServerSecret("", secretFile)).toBe("mounted-secret");
expect(resolveServerSecret(" ", secretFile)).toBe("mounted-secret");
expect(resolveServerSecret("environment-secret", secretFile)).toBe("environment-secret");
} finally {
rmSync(directory, { recursive: true, force: true });
}
});
it("transmet une requête OpenAI-compatible à la passerelle sélectionnée", async () => {
let receivedUrl = "";
let receivedInit: RequestInit | undefined;

View File

@@ -9,6 +9,11 @@
- [x] Vérifier une invocation contrôlée via la passerelle sans utiliser de document métier
- [ ] Vérifier une extraction réelle via la passerelle et sa traçabilité dans le Référentiel IA
## Correction connexion Référentiel IA — recette — 02/10/2026
- [x] Identifier le repli bloqué par une variable de jeton vide dans le conteneur
- [x] Corriger la lecture du secret Docker lorsqu’une variable vide est présente
- [ ] Valider et déployer le correctif en recette sans toucher à MySQL ni au volume PDF
## Import manuel des connecteurs web — 30/09/2026
- [x] Analyser le flux serveur d’import web et définir le déclenchement manuel sécurisé
- [x] Ajouter l’API de déclenchement, le suivi de résultat et le bouton avec confirmation