-
Launcher Version 3.3.0 Stable
released this
2026-11-10 11:51:35 +01:00 | 32 commits to master since this release🖥️ Launcher 3.3.0 — Mode maintenance
Nouvelle page « Maintenance » dans le menu d'administration : un bouton met tous les launchers (tous les jeux) en mode maintenance. Chez les joueurs, le launcher passe au rouge / orange, affiche « Maintenance en cours — merci de revenir plus tard » au centre (avec, au choix, une précision de l'administrateur) et bloque tout, sauf la désinstallation des jeux et le menu d'administration.
Le mode maintenance est signé (nouvelle autorisation « mode maintenance » du trousseau) et vérifié par le launcher, comme le catalogue : un serveur compromis ne peut ni déclencher une fausse maintenance, ni la prolonger. Serveur à redéployer, un bloc nginx à ajouter, puis trousseau à re-signer après la diffusion de cette version (voir Mise à niveau).
✨ En bref
Changement 🆕 Nouveau Page « Maintenance » (permission maintenance.manage) : activer, modifier le message, terminer🆕 Nouveau Launcher : thème rouge / orange, carte « Maintenance en cours » au centre, bouton principal « MAINTENANCE » 🆕 Nouveau Tout est bloqué chez les joueurs, sauf la désinstallation des jeux et le menu d'administration 🔧 Amélioré Tableau de bord : bandeau « Maintenance en cours » ; page « Signature » : ligne « Mode maintenance » ; journal d'audit : catégorie « Mode maintenance » 🛡️ Sécurité Document signé (autorisation maintenance), vérifié par les launchers, retour en arrière refusé, aucun lien accepté dans le message🖧 Serveur Module Maintenance(GET/PUT v1/maintenance) : à redéployer, bloc nginxmaintenance.jsonà ajouter🧰 Outils tools\ui-snapshot.bat: scènesmain-maintenance,main-maintenance-plain,admin-page-maintenance,admin-page-maintenance-edit🧪 Qualité 11 nouveaux tests automatisés (367 au total)
🚧 Page « Maintenance » (menu d'administration)
Accès : permission
maintenance.manage(« Mode maintenance »), placée juste après le tableau de bord, icône cône de chantier.Élément Comportement État publié « Launchers accessibles » ou « Maintenance en cours », depuis quand, par qui (appareil), dernier message modifié ; adresse du fichier lu par les launchers Message affiché aux joueurs Facultatif : précision sous le texte principal (raison, heure de retour…). 300 caractères, 6 lignes, texte brut, aucun lien (http, www, domaine, e-mail, formes déguisées…) ; compteur et contrôle en direct Aperçu La carte telle que les joueurs la verront « Activer la maintenance » Confirmation détaillée (ce qui est bloqué, ce qui continue), contrôle du trousseau des joueurs, publication signée « Modifier le message » Pendant une maintenance : nouveau message, même heure de début « Terminer la maintenance » Confirmation, publication signée ; les launchers recherchent aussitôt les mises à jour des jeux Barre du bas « Recharger » et les actions restent visibles, comme sur les autres pages Conflit Si un autre administrateur a publié entre-temps : refus (409), état relu, saisie gardée - Le launcher de l'administrateur qui publie bascule aussitôt (sans attendre la relecture périodique).
- Tableau de bord : tout administrateur voit le bandeau « Maintenance en cours depuis … (activée par …) » ; bouton « Gérer » avec la permission.
🎮 Côté joueurs
Affichage
Élément Pendant la maintenance Couleurs Palette rouge / orange par-dessus le thème du jeu (logo, boutons, lueur, bordure, fond teinté) Centre de la fenêtre Carte : cône de chantier, bandes de chantier, « Maintenance en cours », « Merci de revenir plus tard. », précision de l'administrateur (texte sélectionnable, jamais interprété), « Depuis le mardi 10 novembre à 14:05 », rappel « la désinstallation reste possible » Barre d'action « Maintenance en cours » · « Seule la désinstallation des jeux reste possible (menu « … ») » ; bouton « MAINTENANCE » désactivé Transition Début et fin avec le fondu enchaîné d'un changement de jeu Ce qui est bloqué / ce qui reste possible
Bloqué Toujours possible Non interrompu Installation, mise à jour (automatique ou non), recherche de mises à jour, vérification, réparation, localisation, « Oublier l'installation », lancement du jeu (bouton, raccourci du Bureau), paramètres du launcher et du jeu, ouverture du dossier, bouton « Aide », site officiel Désinstallation (menu « … » ou « Applications installées » de Windows), menu d'administration, choix du jeu (plusieurs jeux), réduction, plein écran, fermeture Téléchargement déjà commencé (toujours annulable), partie en cours, mise à jour du launcher lui-même (signée par la clé racine : moyen de corriger un launcher défectueux) Chaque action bloquée est refusée deux fois : bouton désactivé, et refus à l'entrée de l'action (bandeau d'explication) — y compris pour ce qui part tout seul (mise à jour automatique, raccourci du Bureau, recherche périodique).
Lecture du mode maintenance
Moment Comportement Démarrage Lu en parallèle du catalogue et de la mise à jour du launcher, attendu 4 s au plus avant la recherche des mises à jour des jeux (pas d'attente pour une désinstallation lancée depuis Windows) Ensuite Relu toutes les 2 minutes (toutes les minutes pendant une maintenance) Fin de la maintenance Les jeux recherchent aussitôt leurs mises à jour (mise à jour automatique selon le réglage du jeu) Hors ligne au démarrage Pas de maintenance : le jeu installé reste jouable (aucun joueur sans connexion n'est bloqué) Coupure pendant une maintenance Dernier état vérifié conservé
🛡️ Sécurité
Point Comportement Publication Permission maintenance.manage(Propriétaire d'office ; Administrateur sur une installation neuve ; pas l'Éditeur), requête signée ET document signé par la clé de la session, révision attendue (409 sinon), audit (maintenance.enable,maintenance.update,maintenance.disable)Signature Type de contenu maintenance, nouvelle autorisation du trousseaumaintenance; une signature d'un autre type de contenu (catalogue…) est refuséeVérification par les launchers Selon contentSigning: « require » = document non signé, mal signé, signé par une clé sans l'autorisation, plus ancien que le dernier vu (révision et date de signature, même après un redémarrage) ou hors limites : ignoré ; « warn » : appliqué et signalé dans le journal ; « off » : appliquéContenu Règles communes au menu, au serveur et au launcher : 8 Ko, message nettoyé (caractères invisibles, de mise en forme ou d'inversion du sens d'écriture refusés), aucun lien, début à la seconde et pas dans le futur Titre affiché Fixe, dans le code : seul le message vient du serveur Lecture GET v1/maintenance: tout administrateur connecté (le contenu est public de toute façon)Limite assumée C'est un affichage, pas une barrière : un launcher modifié peut l'ignorer. Si les serveurs du jeu doivent refuser les connexions, c'est à eux de le faire
🖧 Serveur
Élément Détail Module Modules/Maintenance/MaintenanceModule+Storage/MaintenanceStoreRoutes GET v1/maintenance(administrateur connecté),PUT v1/maintenance(maintenance.manage, signée)Fichiers Référence privée maintenance.json(+.bak, historique de 20 révisionsmaintenance-history/) ; fichier publicmaintenance.jsonà côté du trousseau (644, écrit atomiquement, public d'abord)Réglages Aucun : l'emplacement est déduit du trousseau (ou du catalogue). Nom réservé : le catalogue et le trousseau ne peuvent pas s'appeler maintenance.jsonPage « Signature » GET v1/signingrenvoie aussi la signature du mode maintenancenginx Nouveau bloc location = /catalog/maintenance.json(sans cache) dansserver/deploy/nginx-catalog.confSQLite Évalué et écarté : un seul petit document, rarement modifié, publié en fichier de toute façon
🧰 Outil de débogage
ui-snapshotScène Contenu main-maintenanceFenêtre principale en maintenance, jeu installé, précision de l'administrateur sur deux lignes main-maintenance-plainFenêtre principale en maintenance, sans précision, jeu non installé admin-page-maintenancePage « Maintenance » : maintenance en cours (révision 4) admin-page-maintenance-editPage « Maintenance » : message avec un lien, refusé ; aperçu admin-page-signingContenu en ligne : ligne « Mode maintenance »
🧪 Tests
Fichier Tests Contracts/MaintenanceRulesTests.cs(nouveau)Message (nettoyage, liens, longueur, lignes, caractères invisibles), validation, condensé canonique, permission et autorisation du trousseau Server/MaintenanceModuleTests.cs(nouveau)Activation, nouveau message, fin, fichier public signé, audit, page « Signature » ; droits, clé de la session, révision, contenu, début inchangé ; publication non configurée Signing/MaintenanceServiceTests.cs(nouveau)Lecture côté joueur : changements signalés une fois, coupure, faux / non signé / modifié / rejoué (même après redémarrage) ignorés en « require », clé sans l'autorisation, hors ligne, « warn » / « off », fichier trop gros Admin/MaintenancePanelTests.cs(nouveau)Page « Maintenance » : lien refusé, activation, tableau de bord, nouveau message (même début), fin confirmée ou annulée, launcher prévenu Admin/SigningPanelTests.csLigne « Mode maintenance » en dernière position du contenu en ligne 367 tests au vert.
📂 Fichiers modifiés
Contrats
src/GameLauncher.Contracts/Maintenance/MaintenanceDocument.cs(nouveau)src/GameLauncher.Contracts/ApiRoutes.cssrc/GameLauncher.Contracts/Security/AdminPermissions.cssrc/GameLauncher.Contracts/Security/AdminRoles.cssrc/GameLauncher.Contracts/Signing/ContentSigning.cssrc/GameLauncher.Contracts/Signing/SigningDtos.cs
Serveur
server/GameLauncher.Server/Modules/Maintenance/MaintenanceModule.cs(nouveau)server/GameLauncher.Server/Storage/MaintenanceStore.cs(nouveau)server/GameLauncher.Server/Hosting/IApiModule.csserver/GameLauncher.Server/Hosting/LauncherApiOptions.csserver/GameLauncher.Server/Modules/Signing/SigningModule.csserver/deploy/nginx-catalog.confserver/deploy/LISEZMOI.md(étape 3 decies)
Client de l'API
src/GameLauncher.ApiClient/AdminSession.cs
Logique du launcher (Core)
src/GameLauncher.Core/Maintenance/MaintenanceService.cs(nouveau)src/GameLauncher.Core/Trust/ContentTrustService.cs
Modules
src/GameLauncher.Modules/Admin/IAdminContext.cssrc/GameLauncher.Modules/Admin/PlayerSigningCheck.cs
Menu d'administration
src/GameLauncher.Modules.Admin/Maintenance/MaintenanceAdminModule.cs(nouveau)src/GameLauncher.Modules.Admin/Maintenance/MaintenancePanelViewModel.cs(nouveau)src/GameLauncher.Modules.Admin/ViewModels/AdminEnvironment.cssrc/GameLauncher.Modules.Admin/ViewModels/AdminWorkspaceViewModel.cssrc/GameLauncher.Modules.Admin/ViewModels/DashboardPanelViewModel.cssrc/GameLauncher.Modules.Admin/Signing/SigningPanelViewModel.cssrc/GameLauncher.Modules.Admin/Audit/AuditPanelViewModel.cs
Launcher (WPF)
src/GameLauncher/Themes/Maintenance.xaml(nouveau)src/GameLauncher/App.xaml.cssrc/GameLauncher/GameLauncher.csproj(version 3.3.0)src/GameLauncher/Services/AdminWindowService.cssrc/GameLauncher/Themes/Admin.xamlsrc/GameLauncher/Themes/Icons.xaml(icôneTrafficCone)src/GameLauncher/ViewModels/GameViewModel.cssrc/GameLauncher/ViewModels/LauncherViewModel.cssrc/GameLauncher/Views/MainWindow.xamlsrc/GameLauncher/Views/MainWindow.xaml.cs
Outil ui-snapshot
tools/UiSnapshot/Fakes/FakeApi.cstools/UiSnapshot/Fakes/SampleData.cstools/UiSnapshot/Scenes/AdminScenes.cstools/UiSnapshot/Scenes/PlayerScenes.cstools/UiSnapshot/LISEZMOI.md
Tests
tests/GameLauncher.Tests/Contracts/MaintenanceRulesTests.cs(nouveau)tests/GameLauncher.Tests/Server/MaintenanceModuleTests.cs(nouveau)tests/GameLauncher.Tests/Signing/MaintenanceServiceTests.cs(nouveau)tests/GameLauncher.Tests/Admin/MaintenancePanelTests.cs(nouveau)tests/GameLauncher.Tests/Admin/SigningPanelTests.cs
Documentation et notes
README.mddocs/ADMIN-ARCHITECTURE.md(§ 7, § 11 septies, § 13)tools/notes-launcher.txt
⬆️ Mise à niveau
Ordre obligatoire : serveur et nginx, puis launcher 3.3.0, puis trousseau, puis première maintenance. Les launchers 3.2 acceptent un trousseau contenant la nouvelle autorisation (sans effet pour eux) ; les launchers 3.1 et antérieurs le refusent et gardent le précédent. Les launchers antérieurs à la 3.3.0 ignorent la maintenance.
- Serveur (Launcher API) : à redéployer (
server/deploy/LISEZMOI.md, étape 8, puis étape 3 decies). Rien à ajouter dansappsettings.Production.json: le fichier est écrit à côté du trousseau, dans le dossier déjà autorisé en écriture. - nginx : ajouter le bloc
location = /catalog/maintenance.jsondeserver/deploy/nginx-catalog.conf, puissudo nginx -t && sudo systemctl reload nginx. - Launcher 3.3.0 : le publier (mise à jour signée habituelle) et laisser aux joueurs le temps de le recevoir.
- Permission et trousseau :
- page Groupes et permissions : donner
maintenance.manage(« Mode maintenance ») au groupe concerné (le groupe Propriétaire l'a d'office ; Administrateur l'a sur une installation neuve seulement) ; - re-signer le trousseau (étape 3 quinquies) : l'autorisation « mode maintenance » apparaît, signalée « AUTORISATIONS ÉLARGIES » par
tools\sign-keyring.bat: c'est attendu.
- page Groupes et permissions : donner
- Tester depuis la page « Maintenance » : activer, vérifier le launcher (le vôtre bascule aussitôt), terminer.
- Administrateurs : aucune action, hors permission ci-dessus. Pendant une maintenance, le menu d'administration reste disponible chez tout le monde.
- Joueurs : mise à jour automatique, aucune action requise. Tant qu'aucune maintenance n'est activée, rien ne change.
- RGPD : aucune donnée personnelle (le document est public, sans donnée de joueur ; l'audit enregistre l'administrateur, comme pour les autres publications).
🔏 La sécurité des mises à jour du launcher ne change pas : la signature numérique et l'empreinte SHA-256 de chaque nouvelle version sont vérifiées avant toute installation.
What's Changed
- Dev/3.3.0 in #138
Contributors
Full Changelog: v3.2.1...v3.3.0
Downloads