Architecture Globale du Système
Gens-Launcher est l'interface graphique officielle (GUI) de l'écosystème Gens. Conçu sur Electron, son rôle principal est d'orchestrer :
- L'authentification sécurisée des joueurs via l'API Microsoft / Xbox.
- Le téléchargement, la vérification d'intégrité et le lancement du jeu Minecraft via le moteur interne
gens-core. - La communication asynchrone avec Gens-Horizon, le moteur déporté de synchronisation cloud différentielle.
Modèle de Processus Isolés
L'architecture respecte scrupuleusement le paradigme natif d'Electron en scindant l'application en trois royaumes étanches :
+-------------------------------------------------------------------+
| MAIN PROCESS (Node.js) |
| - main.js : Cycle de vie, fenêtres, CSP globale |
| - src/main/ipc-auth.js : Proxy Mojang, tokens Microsoft |
| - src/main/ipc-game.js : Préparation JVM, child_process execFile |
| - src/main/ipc-horizon.js : Bridge binaire Horizon.exe |
| - src/main/crypto-utils.js : Primitives PBKDF2 / AES-256-GCM |
+---------------------------------+---------------------------------+
|
IPC Asynchrone | (ipcMain.handle / invoke)
Whitelist Stricte |
v
+-------------------------------------------------------------------+
| SECURITY BRIDGE (preload.js) |
| - contextIsolation: true |
| - enforceSandbox() / enforceReadSandbox() : Bloque Zip Slip |
| - window.api : Seul point d'entrée exposé au DOM |
+---------------------------------+---------------------------------+
|
v
+-------------------------------------------------------------------+
| RENDERER PROCESS (Vanilla JS) |
| - renderer.js, HTML5, Vanilla CSS |
| - Aucune dépendance Node.js directe (require() interdit) |
| - Gestionnaires UI : AccountUI, InstancesUI, ModsUI, CloudUI |
+-------------------------------------------------------------------+Description des Composants
1. Main Process (Processus Principal)
Il s'exécute dans un contexte Node.js complet avec accès au système de fichiers et au réseau bas niveau :
main.js: Point d'entrée de l'application. Initialise les fenêtresBrowserWindow, installe la politique globaleContent-Security-Policy(CSP) et charge les modules IPC.src/main/ipc-auth.js: Gère les flux OAuth2 Device Code et agit comme proxy sécurisé pour interroger les API Mojang (skins et capes) en contournant les restrictions CORS sans exposer le Renderer.src/main/ipc-game.js: Moteur de lancement. Assemble les arguments JVM, télécharge les bibliothèques et déclenche l'exécution viachild_process.execFile(garantissant l'absence d'injection de shell).src/main/ipc-horizon.js: Passerelle exclusive avec le binaire autonomeHorizon.exe. Valide le hash SHA-256 du binaire local par rapport aux releases GitHub officielles (avec cache mémoire de 2 heures) et filtre les arguments via une whitelist stricte.src/main/crypto-utils.js: Primitives cryptographiques. Clé de chiffrement dérivée par PBKDF2 (600 000 itérations avec sel aléatoire de 16 octets dans.key_salt) et chiffrement en AES-256-GCM.
2. Le Pont de Sécurité (Preload)
preload.js: S'exécute dans le Renderer mais configure la passerelle avant de fermer l'accès aux API internes :- Expose un objet scellé
window.apiau DOM viacontextBridge.exposeInMainWorld. - Implémente le bouclier Software Security Shield : les fonctions
enforceSandbox()etenforceReadSandbox()valident mathématiquement tous les chemins pour prévenir les attaques de typeZip SlipetPath Traversal. - L'écriture est strictement limitée à
%AppData%\GensLauncher. - La lecture hors sandbox est restreinte aux répertoires légitimes (
.minecraft/, runtimes Java identifiés et dossiers temporaires autorisés).
- Expose un objet scellé
3. Renderer Process (Interface Utilisateur)
renderer.js/ HTML / CSS : Développé en Vanilla JS pour des performances optimales sans framework lourd.- L'interface n'a aucun accès direct à
require()ou àprocess. - Toutes les actions système (lancer le jeu, explorer un fichier, synchroniser le cloud) s'effectuent par appels asynchrones sur
window.api.invoke().
Cycle de Vie et Performance Asynchrone
- Interdiction de
sendSync: Toutes les opérations bloquantes sont asynchrones (ipcRenderer.invokecôté Renderer etipcMain.handlecôté Main). L'interface utilisateur ne se fige jamais, même lors du téléchargement d'un modpack de plusieurs gigaoctets. - Injection Précoce d'Environnement : Les métadonnées système (plateforme, architecture, version, appData) sont injectées via
BrowserWindow.additionalArgumentsdès la création de la fenêtre, éliminant tout appel synchrone à l'initialisation.