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
45 lines
1.6 KiB
JavaScript
45 lines
1.6 KiB
JavaScript
// © 2026 TechnoLibre (http://www.technolibre.ca)
|
|
// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
|
|
|
|
// Préchargement de la coquille (§ 13.1) : le seul pont entre la page et le
|
|
// processus principal. Il expose window.gtt.fichiers et rien d'autre : une
|
|
// fonction par primitive du système de fichiers, qui invoque le canal de
|
|
// cette primitive, gtt:fichiers:<primitive>, et rend la réponse du processus
|
|
// principal (electron/fichiers.js). La page ne reçoit jamais ipcRenderer
|
|
// lui-même, ni une fonction qui invoquerait un canal de son choix.
|
|
//
|
|
// Un préchargement exécuté en bac à sable est un script CommonJS, d'où
|
|
// l'extension .cjs dans un paquet de type module. Son require ne connaît
|
|
// qu'electron et quelques modules de Node, et non les fichiers du projet :
|
|
// les primitives s'écrivent donc ici, dans l'ordre de l'interface, et
|
|
// test/coquille.test.js éprouve qu'elles sont celles des canaux que pose le
|
|
// processus principal.
|
|
const { contextBridge, ipcRenderer } = require('electron');
|
|
|
|
const PRIMITIVES = [
|
|
'emplacements',
|
|
'racines',
|
|
'choisirDossier',
|
|
'sonder',
|
|
'typeSupport',
|
|
'lireTexte',
|
|
'ecrireAtomique',
|
|
'ajouterLigne',
|
|
'lister',
|
|
'creerDossier',
|
|
'deplacer',
|
|
'supprimer',
|
|
'verrouiller',
|
|
'deverrouiller',
|
|
'ouvrirDansExplorateur',
|
|
'choisirFichierAImporter',
|
|
'enregistrerSous',
|
|
];
|
|
|
|
const fichiers = {};
|
|
for (const primitive of PRIMITIVES) {
|
|
const canal = `gtt:fichiers:${primitive}`;
|
|
fichiers[primitive] = (...parametres) => ipcRenderer.invoke(canal, ...parametres);
|
|
}
|
|
|
|
contextBridge.exposeInMainWorld('gtt', { fichiers });
|