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:
@@ -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 = {
|
export const ENV = {
|
||||||
appId: process.env.VITE_APP_ID ?? "",
|
appId: process.env.VITE_APP_ID ?? "",
|
||||||
cookieSecret: process.env.JWT_SECRET ?? "",
|
cookieSecret: process.env.JWT_SECRET ?? "",
|
||||||
@@ -22,5 +28,8 @@ export const ENV = {
|
|||||||
mistralApiKey: process.env.MISTRAL_API_KEY ?? "",
|
mistralApiKey: process.env.MISTRAL_API_KEY ?? "",
|
||||||
geminiApiKey: process.env.GEMINI_API_KEY ?? "",
|
geminiApiKey: process.env.GEMINI_API_KEY ?? "",
|
||||||
referentielIaUrl: process.env.REFERENTIEL_IA_URL ?? "",
|
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,
|
||||||
|
),
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import {
|
|||||||
testReferentialIaConnection,
|
testReferentialIaConnection,
|
||||||
type ReferentielIaConnection,
|
type ReferentielIaConnection,
|
||||||
} from "./referentialIa";
|
} from "./referentialIa";
|
||||||
import { readSecretFile } from "./_core/env";
|
import { readSecretFile, resolveServerSecret } from "./_core/env";
|
||||||
|
|
||||||
const connection: ReferentielIaConnection = {
|
const connection: ReferentielIaConnection = {
|
||||||
baseUrl: "https://referentiel-ia.recette.santinova-soft.org",
|
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 () => {
|
it("transmet une requête OpenAI-compatible à la passerelle sélectionnée", async () => {
|
||||||
let receivedUrl = "";
|
let receivedUrl = "";
|
||||||
let receivedInit: RequestInit | undefined;
|
let receivedInit: RequestInit | undefined;
|
||||||
|
|||||||
5
todo.md
5
todo.md
@@ -9,6 +9,11 @@
|
|||||||
- [x] Vérifier une invocation contrôlée via la passerelle sans utiliser de document métier
|
- [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
|
- [ ] 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
|
## 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] 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
|
- [x] Ajouter l’API de déclenchement, le suivi de résultat et le bouton avec confirmation
|
||||||
|
|||||||
Reference in New Issue
Block a user