gestion_table_tournante_libre/electron/main.js

130 lines
5.7 KiB
JavaScript
Raw Normal View History

[ADD] electron: own shell, portable Windows exe built under podman The deliverable is a single-file portable executable whose Electron the project updates itself. The shell keeps context isolation on, Node integration off and the page sandboxed; one IPC channel returns the folder the portable launcher publishes. The build runs in a no-Wine image pinned by digest, relays no host variable, refuses to overwrite a built number, removes what a failed build leaves, and accepts only the name version.json gives. The spec stops claiming the portable target needs Wine. Checked: exe built in 86 s, resource FileVersion 2026.1005.1.0 and © 2026 TechnoLibre; 109 node tests pass; two end-of-build mutations fail. --- FR --- [ADD] electron : coquille propre, exécutable portable construit sous podman Le livrable est un exécutable portable à fichier unique, dont le projet met lui-même Electron à jour. La coquille garde l'isolation de contexte, coupe l'intégration de Node et isole la page ; un seul canal IPC rend le dossier que publie le lanceur portable. La construction s'exécute dans une image sans Wine épinglée par empreinte, ne relaie aucune variable de l'hôte, refuse d'écraser un numéro construit, retire ce qu'un échec laisse, et n'accepte que le nom que donne version.json. Le spec cesse d'affirmer que la cible portable exige Wine. Vérifié : exécutable construit en 86 s, ressource FileVersion 2026.1005.1.0 et © 2026 TechnoLibre ; 109 épreuves node passent ; deux mutations du contrôle de fin échouent. Assisted-by: Claude Opus 5.5
2026-10-05 13:13:32 -04:00
// © 2026 TechnoLibre (http://www.technolibre.ca)
// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
// Processus principal de la coquille Electron (§ 13.1) : une fenêtre qui
[ADD] electron: confined file system, atomic writes, lock, bridge The shell carries the file-system boundary (§ 13.1): the page names a root the main process defines — data/ beside the published executable, the product folder in Documents, or one the operator picks in a dialog — and a relative path, refused if absolute, with .., a NUL, or a real path outside the root. Writes go to a temporary file, flushed, renamed over the target with retries; a failed rename never truncates it. The lock records session, process and host. Chromium's profile lives in a temporary folder removed at exit, not in AppData nor in the events. Checked: node and real-folder long tests; real Electron start under Ozone. --- FR --- [ADD] electron : système de fichiers confiné, écriture atomique, verrou La coquille porte la frontière du système de fichiers (§ 13.1) : la page nomme une racine que le processus principal définit — data/ à côté de l'exécutable publié, le dossier du produit dans Documents, ou un dossier choisi par dialogue — et un chemin relatif, refusé s'il est absolu, porte .., un NUL, ou un chemin réel hors de la racine. Une écriture passe par un temporaire vidé sur le disque puis renommé par-dessus, réessayé ; un renommage manqué ne tronque jamais la cible. Le profil de Chromium vit dans un dossier temporaire effacé à la sortie, hors d'AppData. Vérifié : épreuves node et longues sur dossier réel ; Electron réel lancé. Assisted-by: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01EUXSGcwCLSC69FWEdCtWSb
2026-10-06 17:34:31 -04:00
// charge la page construite par Vite dans www/, et le système de fichiers de
// la plateforme (electron/fichiers.js), offert à la page par un canal IPC
[ADD] interface: application shell — banner, sections, theme, about The window showed only a banner; it now holds the application. App mounts the session, the facade and the generation, settles the working folder and lists its events before it reports ready, re-reading the list once a question is answered or a refused determination succeeds. The banner carries version, mode and the event list command; an open event shows its sections in their first form; the theme follows the system at each start and the operator's choice lasts the session; À propos names the build. Errors are collected for a report, and Electron removes the session's locks at exit. Checked: 2189 node, 193 browser, 60 node-long; the Electron start check. --- FR --- [ADD] interface : coquille — bandeau, sections, thème, À propos La fenêtre ne montrait qu'un bandeau ; elle tient désormais l'application. App monte la séance, la façade et la génération, règle le dossier de travail et liste ses événements avant de se dire prête, et relit la liste une fois une question répondue ou une détermination refusée réussie. Le bandeau porte version, mode et la commande de la liste ; un événement ouvert montre ses sections dans leur première forme ; le thème suit le système à chaque démarrage et le choix de l'opérateur vaut pour la séance ; À propos nomme la construction. Les erreurs se collectent pour un signalement, et Electron efface à la sortie les verrous de la séance. Vérifié : 2189 node, 193 navigateur, 60 node-long ; démarrage d'Electron. Assisted-by: Claude Opus 5.5
2026-10-07 07:22:05 -04:00
// par primitive, que electron/preload.cjs expose sous window.gtt.fichiers ;
// un canal de plus, gtt:copier, remet un texte au presse-papiers du système
// (window.gtt.copier).
[ADD] electron: own shell, portable Windows exe built under podman The deliverable is a single-file portable executable whose Electron the project updates itself. The shell keeps context isolation on, Node integration off and the page sandboxed; one IPC channel returns the folder the portable launcher publishes. The build runs in a no-Wine image pinned by digest, relays no host variable, refuses to overwrite a built number, removes what a failed build leaves, and accepts only the name version.json gives. The spec stops claiming the portable target needs Wine. Checked: exe built in 86 s, resource FileVersion 2026.1005.1.0 and © 2026 TechnoLibre; 109 node tests pass; two end-of-build mutations fail. --- FR --- [ADD] electron : coquille propre, exécutable portable construit sous podman Le livrable est un exécutable portable à fichier unique, dont le projet met lui-même Electron à jour. La coquille garde l'isolation de contexte, coupe l'intégration de Node et isole la page ; un seul canal IPC rend le dossier que publie le lanceur portable. La construction s'exécute dans une image sans Wine épinglée par empreinte, ne relaie aucune variable de l'hôte, refuse d'écraser un numéro construit, retire ce qu'un échec laisse, et n'accepte que le nom que donne version.json. Le spec cesse d'affirmer que la cible portable exige Wine. Vérifié : exécutable construit en 86 s, ressource FileVersion 2026.1005.1.0 et © 2026 TechnoLibre ; 109 épreuves node passent ; deux mutations du contrôle de fin échouent. Assisted-by: Claude Opus 5.5
2026-10-05 13:13:32 -04:00
//
// La page n'a ni Node ni accès au disque : isolation de contexte active,
// intégration de Node coupée, rendu en bac à sable. Elle n'atteint le
[ADD] electron: confined file system, atomic writes, lock, bridge The shell carries the file-system boundary (§ 13.1): the page names a root the main process defines — data/ beside the published executable, the product folder in Documents, or one the operator picks in a dialog — and a relative path, refused if absolute, with .., a NUL, or a real path outside the root. Writes go to a temporary file, flushed, renamed over the target with retries; a failed rename never truncates it. The lock records session, process and host. Chromium's profile lives in a temporary folder removed at exit, not in AppData nor in the events. Checked: node and real-folder long tests; real Electron start under Ozone. --- FR --- [ADD] electron : système de fichiers confiné, écriture atomique, verrou La coquille porte la frontière du système de fichiers (§ 13.1) : la page nomme une racine que le processus principal définit — data/ à côté de l'exécutable publié, le dossier du produit dans Documents, ou un dossier choisi par dialogue — et un chemin relatif, refusé s'il est absolu, porte .., un NUL, ou un chemin réel hors de la racine. Une écriture passe par un temporaire vidé sur le disque puis renommé par-dessus, réessayé ; un renommage manqué ne tronque jamais la cible. Le profil de Chromium vit dans un dossier temporaire effacé à la sortie, hors d'AppData. Vérifié : épreuves node et longues sur dossier réel ; Electron réel lancé. Assisted-by: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01EUXSGcwCLSC69FWEdCtWSb
2026-10-06 17:34:31 -04:00
// processus principal que par ces canaux, et n'y désigne un fichier que par
// une racine que ce processus connaît et un chemin relatif à elle. Un nom
// importé interprété comme du balisage reste ainsi une faute d'affichage, et
// non un accès au disque.
[ADD] interface: application shell — banner, sections, theme, about The window showed only a banner; it now holds the application. App mounts the session, the facade and the generation, settles the working folder and lists its events before it reports ready, re-reading the list once a question is answered or a refused determination succeeds. The banner carries version, mode and the event list command; an open event shows its sections in their first form; the theme follows the system at each start and the operator's choice lasts the session; À propos names the build. Errors are collected for a report, and Electron removes the session's locks at exit. Checked: 2189 node, 193 browser, 60 node-long; the Electron start check. --- FR --- [ADD] interface : coquille — bandeau, sections, thème, À propos La fenêtre ne montrait qu'un bandeau ; elle tient désormais l'application. App monte la séance, la façade et la génération, règle le dossier de travail et liste ses événements avant de se dire prête, et relit la liste une fois une question répondue ou une détermination refusée réussie. Le bandeau porte version, mode et la commande de la liste ; un événement ouvert montre ses sections dans leur première forme ; le thème suit le système à chaque démarrage et le choix de l'opérateur vaut pour la séance ; À propos nomme la construction. Les erreurs se collectent pour un signalement, et Electron efface à la sortie les verrous de la séance. Vérifié : 2189 node, 193 navigateur, 60 node-long ; démarrage d'Electron. Assisted-by: Claude Opus 5.5
2026-10-07 07:22:05 -04:00
import { app, BrowserWindow, clipboard, dialog, ipcMain, Menu, shell } from 'electron';
import { mkdtempSync, readFileSync, rmSync } from 'node:fs';
[ADD] electron: confined file system, atomic writes, lock, bridge The shell carries the file-system boundary (§ 13.1): the page names a root the main process defines — data/ beside the published executable, the product folder in Documents, or one the operator picks in a dialog — and a relative path, refused if absolute, with .., a NUL, or a real path outside the root. Writes go to a temporary file, flushed, renamed over the target with retries; a failed rename never truncates it. The lock records session, process and host. Chromium's profile lives in a temporary folder removed at exit, not in AppData nor in the events. Checked: node and real-folder long tests; real Electron start under Ozone. --- FR --- [ADD] electron : système de fichiers confiné, écriture atomique, verrou La coquille porte la frontière du système de fichiers (§ 13.1) : la page nomme une racine que le processus principal définit — data/ à côté de l'exécutable publié, le dossier du produit dans Documents, ou un dossier choisi par dialogue — et un chemin relatif, refusé s'il est absolu, porte .., un NUL, ou un chemin réel hors de la racine. Une écriture passe par un temporaire vidé sur le disque puis renommé par-dessus, réessayé ; un renommage manqué ne tronque jamais la cible. Le profil de Chromium vit dans un dossier temporaire effacé à la sortie, hors d'AppData. Vérifié : épreuves node et longues sur dossier réel ; Electron réel lancé. Assisted-by: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01EUXSGcwCLSC69FWEdCtWSb
2026-10-06 17:34:31 -04:00
import { readdir, rm } from 'node:fs/promises';
import { join } from 'node:path';
[ADD] electron: own shell, portable Windows exe built under podman The deliverable is a single-file portable executable whose Electron the project updates itself. The shell keeps context isolation on, Node integration off and the page sandboxed; one IPC channel returns the folder the portable launcher publishes. The build runs in a no-Wine image pinned by digest, relays no host variable, refuses to overwrite a built number, removes what a failed build leaves, and accepts only the name version.json gives. The spec stops claiming the portable target needs Wine. Checked: exe built in 86 s, resource FileVersion 2026.1005.1.0 and © 2026 TechnoLibre; 109 node tests pass; two end-of-build mutations fail. --- FR --- [ADD] electron : coquille propre, exécutable portable construit sous podman Le livrable est un exécutable portable à fichier unique, dont le projet met lui-même Electron à jour. La coquille garde l'isolation de contexte, coupe l'intégration de Node et isole la page ; un seul canal IPC rend le dossier que publie le lanceur portable. La construction s'exécute dans une image sans Wine épinglée par empreinte, ne relaie aucune variable de l'hôte, refuse d'écraser un numéro construit, retire ce qu'un échec laisse, et n'accepte que le nom que donne version.json. Le spec cesse d'affirmer que la cible portable exige Wine. Vérifié : exécutable construit en 86 s, ressource FileVersion 2026.1005.1.0 et © 2026 TechnoLibre ; 109 épreuves node passent ; deux mutations du contrôle de fin échouent. Assisted-by: Claude Opus 5.5
2026-10-05 13:13:32 -04:00
import { fileURLToPath } from 'node:url';
[ADD] electron: confined file system, atomic writes, lock, bridge The shell carries the file-system boundary (§ 13.1): the page names a root the main process defines — data/ beside the published executable, the product folder in Documents, or one the operator picks in a dialog — and a relative path, refused if absolute, with .., a NUL, or a real path outside the root. Writes go to a temporary file, flushed, renamed over the target with retries; a failed rename never truncates it. The lock records session, process and host. Chromium's profile lives in a temporary folder removed at exit, not in AppData nor in the events. Checked: node and real-folder long tests; real Electron start under Ozone. --- FR --- [ADD] electron : système de fichiers confiné, écriture atomique, verrou La coquille porte la frontière du système de fichiers (§ 13.1) : la page nomme une racine que le processus principal définit — data/ à côté de l'exécutable publié, le dossier du produit dans Documents, ou un dossier choisi par dialogue — et un chemin relatif, refusé s'il est absolu, porte .., un NUL, ou un chemin réel hors de la racine. Une écriture passe par un temporaire vidé sur le disque puis renommé par-dessus, réessayé ; un renommage manqué ne tronque jamais la cible. Le profil de Chromium vit dans un dossier temporaire effacé à la sortie, hors d'AppData. Vérifié : épreuves node et longues sur dossier réel ; Electron réel lancé. Assisted-by: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01EUXSGcwCLSC69FWEdCtWSb
2026-10-06 17:34:31 -04:00
import { creerFichiers, decrireSysteme, processusVivant, servir } from './fichiers.js';
[ADD] electron: own shell, portable Windows exe built under podman The deliverable is a single-file portable executable whose Electron the project updates itself. The shell keeps context isolation on, Node integration off and the page sandboxed; one IPC channel returns the folder the portable launcher publishes. The build runs in a no-Wine image pinned by digest, relays no host variable, refuses to overwrite a built number, removes what a failed build leaves, and accepts only the name version.json gives. The spec stops claiming the portable target needs Wine. Checked: exe built in 86 s, resource FileVersion 2026.1005.1.0 and © 2026 TechnoLibre; 109 node tests pass; two end-of-build mutations fail. --- FR --- [ADD] electron : coquille propre, exécutable portable construit sous podman Le livrable est un exécutable portable à fichier unique, dont le projet met lui-même Electron à jour. La coquille garde l'isolation de contexte, coupe l'intégration de Node et isole la page ; un seul canal IPC rend le dossier que publie le lanceur portable. La construction s'exécute dans une image sans Wine épinglée par empreinte, ne relaie aucune variable de l'hôte, refuse d'écraser un numéro construit, retire ce qu'un échec laisse, et n'accepte que le nom que donne version.json. Le spec cesse d'affirmer que la cible portable exige Wine. Vérifié : exécutable construit en 86 s, ressource FileVersion 2026.1005.1.0 et © 2026 TechnoLibre ; 109 épreuves node passent ; deux mutations du contrôle de fin échouent. Assisted-by: Claude Opus 5.5
2026-10-05 13:13:32 -04:00
// Chemins relatifs à ce module : ils valent dans le dépôt comme dans
// l'archive app.asar de l'exécutable, qui reproduit electron/ et www/.
const PRECHARGEMENT = fileURLToPath(new URL('./preload.cjs', import.meta.url));
const PAGE = fileURLToPath(new URL('../www/index.html', import.meta.url));
[ADD] electron: confined file system, atomic writes, lock, bridge The shell carries the file-system boundary (§ 13.1): the page names a root the main process defines — data/ beside the published executable, the product folder in Documents, or one the operator picks in a dialog — and a relative path, refused if absolute, with .., a NUL, or a real path outside the root. Writes go to a temporary file, flushed, renamed over the target with retries; a failed rename never truncates it. The lock records session, process and host. Chromium's profile lives in a temporary folder removed at exit, not in AppData nor in the events. Checked: node and real-folder long tests; real Electron start under Ozone. --- FR --- [ADD] electron : système de fichiers confiné, écriture atomique, verrou La coquille porte la frontière du système de fichiers (§ 13.1) : la page nomme une racine que le processus principal définit — data/ à côté de l'exécutable publié, le dossier du produit dans Documents, ou un dossier choisi par dialogue — et un chemin relatif, refusé s'il est absolu, porte .., un NUL, ou un chemin réel hors de la racine. Une écriture passe par un temporaire vidé sur le disque puis renommé par-dessus, réessayé ; un renommage manqué ne tronque jamais la cible. Le profil de Chromium vit dans un dossier temporaire effacé à la sortie, hors d'AppData. Vérifié : épreuves node et longues sur dossier réel ; Electron réel lancé. Assisted-by: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01EUXSGcwCLSC69FWEdCtWSb
2026-10-06 17:34:31 -04:00
// Profil de Chromium (§ 8.6) : un dossier neuf sous le dossier temporaire du
// système, nommé gtt-profil-<pid>-…, posé avant que l'application soit
// prête — Chromium l'ouvre alors —, et retiré à la sortie. L'application ne
// garde rien dans ce profil, et un exécutable portable ne laisse ainsi rien
// dans AppData, ni dans le dossier de travail.
//
// Le retrait de la sortie n'est qu'un premier temps : Chromium écrit encore
// dans le profil après l'évènement quit — son état local, ses préférences,
// le stockage de session —, et le dossier renaît, réduit à quelques fichiers.
// Une séance qui s'arrête sans sortir n'en retire rien. Chaque démarrage
// retire donc, après l'ouverture de la fenêtre, les profils des séances
// terminées : le pid de leur nom ne désigne plus aucun processus de ce
// poste. Le profil d'une séance qui tourne encore reste.
const TEMPORAIRE = app.getPath('temp');
const PROFIL_DE_SEANCE = /^gtt-profil-(\d+)-/;
const PROFIL = mkdtempSync(join(TEMPORAIRE, `gtt-profil-${process.pid}-`));
app.setPath('userData', PROFIL);
app.on('quit', () => {
try {
rmSync(PROFIL, { recursive: true, force: true });
} catch {
// Au mieux : le démarrage suivant le retire.
}
});
async function retirerProfilsTermines() {
for (const nom of await readdir(TEMPORAIRE)) {
const pid = Number(PROFIL_DE_SEANCE.exec(nom)?.[1]);
if (!(pid > 0) || pid === process.pid || processusVivant(pid)) continue;
await rm(join(TEMPORAIRE, nom), { recursive: true, force: true }).catch(() => {});
}
}
// Le système de fichiers : emplacements et racines lus une fois, au
// démarrage (§ 8.6) ; les dialogues s'ouvrent sur la fenêtre de la page. Les
// gestionnaires sont posés avant le chargement de la page, qui peut les
// appeler dès son premier script.
let fenetre = null;
const fichiers = creerFichiers({
...decrireSysteme({
env: process.env,
plateforme: process.platform,
cheminSysteme: (nom) => app.getPath(nom),
nomProduit: app.getName(),
}),
dialog,
shell,
fenetre: () => fenetre,
});
servir(fichiers, (canal, gestionnaire) => ipcMain.handle(canal, gestionnaire));
[ADD] electron: own shell, portable Windows exe built under podman The deliverable is a single-file portable executable whose Electron the project updates itself. The shell keeps context isolation on, Node integration off and the page sandboxed; one IPC channel returns the folder the portable launcher publishes. The build runs in a no-Wine image pinned by digest, relays no host variable, refuses to overwrite a built number, removes what a failed build leaves, and accepts only the name version.json gives. The spec stops claiming the portable target needs Wine. Checked: exe built in 86 s, resource FileVersion 2026.1005.1.0 and © 2026 TechnoLibre; 109 node tests pass; two end-of-build mutations fail. --- FR --- [ADD] electron : coquille propre, exécutable portable construit sous podman Le livrable est un exécutable portable à fichier unique, dont le projet met lui-même Electron à jour. La coquille garde l'isolation de contexte, coupe l'intégration de Node et isole la page ; un seul canal IPC rend le dossier que publie le lanceur portable. La construction s'exécute dans une image sans Wine épinglée par empreinte, ne relaie aucune variable de l'hôte, refuse d'écraser un numéro construit, retire ce qu'un échec laisse, et n'accepte que le nom que donne version.json. Le spec cesse d'affirmer que la cible portable exige Wine. Vérifié : exécutable construit en 86 s, ressource FileVersion 2026.1005.1.0 et © 2026 TechnoLibre ; 109 épreuves node passent ; deux mutations du contrôle de fin échouent. Assisted-by: Claude Opus 5.5
2026-10-05 13:13:32 -04:00
[ADD] interface: application shell — banner, sections, theme, about The window showed only a banner; it now holds the application. App mounts the session, the facade and the generation, settles the working folder and lists its events before it reports ready, re-reading the list once a question is answered or a refused determination succeeds. The banner carries version, mode and the event list command; an open event shows its sections in their first form; the theme follows the system at each start and the operator's choice lasts the session; À propos names the build. Errors are collected for a report, and Electron removes the session's locks at exit. Checked: 2189 node, 193 browser, 60 node-long; the Electron start check. --- FR --- [ADD] interface : coquille — bandeau, sections, thème, À propos La fenêtre ne montrait qu'un bandeau ; elle tient désormais l'application. App monte la séance, la façade et la génération, règle le dossier de travail et liste ses événements avant de se dire prête, et relit la liste une fois une question répondue ou une détermination refusée réussie. Le bandeau porte version, mode et la commande de la liste ; un événement ouvert montre ses sections dans leur première forme ; le thème suit le système à chaque démarrage et le choix de l'opérateur vaut pour la séance ; À propos nomme la construction. Les erreurs se collectent pour un signalement, et Electron efface à la sortie les verrous de la séance. Vérifié : 2189 node, 193 navigateur, 60 node-long ; démarrage d'Electron. Assisted-by: Claude Opus 5.5
2026-10-07 07:22:05 -04:00
// Le presse-papiers : le texte reçu, une chaîne, remplace son contenu.
ipcMain.handle('gtt:copier', (_evenement, texte) => {
if (typeof texte !== 'string') throw new TypeError("le texte à copier n'est pas une chaîne");
clipboard.writeText(texte);
});
// Les verrous que la page a pris et pas rendus s'effacent à la sortie (§ 8.8) :
// la page ne survit pas au processus principal, et une fermeture de la fenêtre
// ne lui laisse pas le temps de les rendre elle-même. Chacun se relit, de
// façon synchrone comme le retrait du profil — Electron n'attend aucune
// promesse d'un écouteur de sortie —, et ne s'efface que s'il porte encore la
// séance qui l'a pris : un verrou repris par une autre séance reste.
app.on('quit', () => {
for (const { chemin, seance } of fichiers.verrousTenus()) {
try {
if (JSON.parse(readFileSync(chemin, 'utf8'))?.seance === seance) rmSync(chemin, { force: true });
} catch {
// Absent, illisible ou inaccessible : rien à rendre.
}
}
});
[ADD] electron: own shell, portable Windows exe built under podman The deliverable is a single-file portable executable whose Electron the project updates itself. The shell keeps context isolation on, Node integration off and the page sandboxed; one IPC channel returns the folder the portable launcher publishes. The build runs in a no-Wine image pinned by digest, relays no host variable, refuses to overwrite a built number, removes what a failed build leaves, and accepts only the name version.json gives. The spec stops claiming the portable target needs Wine. Checked: exe built in 86 s, resource FileVersion 2026.1005.1.0 and © 2026 TechnoLibre; 109 node tests pass; two end-of-build mutations fail. --- FR --- [ADD] electron : coquille propre, exécutable portable construit sous podman Le livrable est un exécutable portable à fichier unique, dont le projet met lui-même Electron à jour. La coquille garde l'isolation de contexte, coupe l'intégration de Node et isole la page ; un seul canal IPC rend le dossier que publie le lanceur portable. La construction s'exécute dans une image sans Wine épinglée par empreinte, ne relaie aucune variable de l'hôte, refuse d'écraser un numéro construit, retire ce qu'un échec laisse, et n'accepte que le nom que donne version.json. Le spec cesse d'affirmer que la cible portable exige Wine. Vérifié : exécutable construit en 86 s, ressource FileVersion 2026.1005.1.0 et © 2026 TechnoLibre ; 109 épreuves node passent ; deux mutations du contrôle de fin échouent. Assisted-by: Claude Opus 5.5
2026-10-05 13:13:32 -04:00
function creerFenetre() {
[ADD] electron: confined file system, atomic writes, lock, bridge The shell carries the file-system boundary (§ 13.1): the page names a root the main process defines — data/ beside the published executable, the product folder in Documents, or one the operator picks in a dialog — and a relative path, refused if absolute, with .., a NUL, or a real path outside the root. Writes go to a temporary file, flushed, renamed over the target with retries; a failed rename never truncates it. The lock records session, process and host. Chromium's profile lives in a temporary folder removed at exit, not in AppData nor in the events. Checked: node and real-folder long tests; real Electron start under Ozone. --- FR --- [ADD] electron : système de fichiers confiné, écriture atomique, verrou La coquille porte la frontière du système de fichiers (§ 13.1) : la page nomme une racine que le processus principal définit — data/ à côté de l'exécutable publié, le dossier du produit dans Documents, ou un dossier choisi par dialogue — et un chemin relatif, refusé s'il est absolu, porte .., un NUL, ou un chemin réel hors de la racine. Une écriture passe par un temporaire vidé sur le disque puis renommé par-dessus, réessayé ; un renommage manqué ne tronque jamais la cible. Le profil de Chromium vit dans un dossier temporaire effacé à la sortie, hors d'AppData. Vérifié : épreuves node et longues sur dossier réel ; Electron réel lancé. Assisted-by: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01EUXSGcwCLSC69FWEdCtWSb
2026-10-06 17:34:31 -04:00
fenetre = new BrowserWindow({
[ADD] electron: own shell, portable Windows exe built under podman The deliverable is a single-file portable executable whose Electron the project updates itself. The shell keeps context isolation on, Node integration off and the page sandboxed; one IPC channel returns the folder the portable launcher publishes. The build runs in a no-Wine image pinned by digest, relays no host variable, refuses to overwrite a built number, removes what a failed build leaves, and accepts only the name version.json gives. The spec stops claiming the portable target needs Wine. Checked: exe built in 86 s, resource FileVersion 2026.1005.1.0 and © 2026 TechnoLibre; 109 node tests pass; two end-of-build mutations fail. --- FR --- [ADD] electron : coquille propre, exécutable portable construit sous podman Le livrable est un exécutable portable à fichier unique, dont le projet met lui-même Electron à jour. La coquille garde l'isolation de contexte, coupe l'intégration de Node et isole la page ; un seul canal IPC rend le dossier que publie le lanceur portable. La construction s'exécute dans une image sans Wine épinglée par empreinte, ne relaie aucune variable de l'hôte, refuse d'écraser un numéro construit, retire ce qu'un échec laisse, et n'accepte que le nom que donne version.json. Le spec cesse d'affirmer que la cible portable exige Wine. Vérifié : exécutable construit en 86 s, ressource FileVersion 2026.1005.1.0 et © 2026 TechnoLibre ; 109 épreuves node passent ; deux mutations du contrôle de fin échouent. Assisted-by: Claude Opus 5.5
2026-10-05 13:13:32 -04:00
width: 1366,
height: 768,
webPreferences: {
preload: PRECHARGEMENT,
contextIsolation: true,
nodeIntegration: false,
sandbox: true,
},
});
// La page ne quitte jamais www/ : toute nouvelle fenêtre est refusée, toute
// navigation annulée, quelle que soit sa cible.
fenetre.webContents.setWindowOpenHandler(() => ({ action: 'deny' }));
fenetre.webContents.on('will-navigate', (evenement) => evenement.preventDefault());
fenetre.loadFile(PAGE);
}
// Sans menu posé par l'application, Electron installe le sien : en anglais,
// alors que l'interface est en français (§ 2), et porteur de « Reload » et
// des outils de développement. null le retire, et retire avec lui la barre
// de menu des fenêtres sous Windows et Linux ; il est posé avant la première
// fenêtre, qui naîtrait sinon avec la barre.
app.whenReady().then(() => {
Menu.setApplicationMenu(null);
creerFenetre();
[ADD] electron: confined file system, atomic writes, lock, bridge The shell carries the file-system boundary (§ 13.1): the page names a root the main process defines — data/ beside the published executable, the product folder in Documents, or one the operator picks in a dialog — and a relative path, refused if absolute, with .., a NUL, or a real path outside the root. Writes go to a temporary file, flushed, renamed over the target with retries; a failed rename never truncates it. The lock records session, process and host. Chromium's profile lives in a temporary folder removed at exit, not in AppData nor in the events. Checked: node and real-folder long tests; real Electron start under Ozone. --- FR --- [ADD] electron : système de fichiers confiné, écriture atomique, verrou La coquille porte la frontière du système de fichiers (§ 13.1) : la page nomme une racine que le processus principal définit — data/ à côté de l'exécutable publié, le dossier du produit dans Documents, ou un dossier choisi par dialogue — et un chemin relatif, refusé s'il est absolu, porte .., un NUL, ou un chemin réel hors de la racine. Une écriture passe par un temporaire vidé sur le disque puis renommé par-dessus, réessayé ; un renommage manqué ne tronque jamais la cible. Le profil de Chromium vit dans un dossier temporaire effacé à la sortie, hors d'AppData. Vérifié : épreuves node et longues sur dossier réel ; Electron réel lancé. Assisted-by: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01EUXSGcwCLSC69FWEdCtWSb
2026-10-06 17:34:31 -04:00
retirerProfilsTermines().catch(() => {});
});