• v3.3.0 0e371518b5

    nicolas 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 nginx maintenance.json à ajouter
    🧰 Outils tools\ui-snapshot.bat : scènes main-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 trousseau maintenance ; une signature d'un autre type de contenu (catalogue…) est refusée
    Vé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/MaintenanceStore
    Routes 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évisions maintenance-history/) ; fichier public maintenance.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.json
    Page « Signature » GET v1/signing renvoie aussi la signature du mode maintenance
    nginx Nouveau bloc location = /catalog/maintenance.json (sans cache) dans server/deploy/nginx-catalog.conf
    SQLite Évalué et écarté : un seul petit document, rarement modifié, publié en fichier de toute façon

    🧰 Outil de débogage ui-snapshot

    Scène Contenu
    main-maintenance Fenêtre principale en maintenance, jeu installé, précision de l'administrateur sur deux lignes
    main-maintenance-plain Fenêtre principale en maintenance, sans précision, jeu non installé
    admin-page-maintenance Page « Maintenance » : maintenance en cours (révision 4)
    admin-page-maintenance-edit Page « Maintenance » : message avec un lien, refusé ; aperçu
    admin-page-signing Contenu 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.cs Ligne « 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.cs
    • src/GameLauncher.Contracts/Security/AdminPermissions.cs
    • src/GameLauncher.Contracts/Security/AdminRoles.cs
    • src/GameLauncher.Contracts/Signing/ContentSigning.cs
    • src/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.cs
    • server/GameLauncher.Server/Hosting/LauncherApiOptions.cs
    • server/GameLauncher.Server/Modules/Signing/SigningModule.cs
    • server/deploy/nginx-catalog.conf
    • server/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.cs
    • src/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.cs
    • src/GameLauncher.Modules.Admin/ViewModels/AdminWorkspaceViewModel.cs
    • src/GameLauncher.Modules.Admin/ViewModels/DashboardPanelViewModel.cs
    • src/GameLauncher.Modules.Admin/Signing/SigningPanelViewModel.cs
    • src/GameLauncher.Modules.Admin/Audit/AuditPanelViewModel.cs

    Launcher (WPF)

    • src/GameLauncher/Themes/Maintenance.xaml (nouveau)
    • src/GameLauncher/App.xaml.cs
    • src/GameLauncher/GameLauncher.csproj (version 3.3.0)
    • src/GameLauncher/Services/AdminWindowService.cs
    • src/GameLauncher/Themes/Admin.xaml
    • src/GameLauncher/Themes/Icons.xaml (icône TrafficCone)
    • src/GameLauncher/ViewModels/GameViewModel.cs
    • src/GameLauncher/ViewModels/LauncherViewModel.cs
    • src/GameLauncher/Views/MainWindow.xaml
    • src/GameLauncher/Views/MainWindow.xaml.cs

    Outil ui-snapshot

    • tools/UiSnapshot/Fakes/FakeApi.cs
    • tools/UiSnapshot/Fakes/SampleData.cs
    • tools/UiSnapshot/Scenes/AdminScenes.cs
    • tools/UiSnapshot/Scenes/PlayerScenes.cs
    • tools/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.md
    • docs/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.

    1. Serveur (Launcher API) : à redéployer (server/deploy/LISEZMOI.md, étape 8, puis étape 3 decies). Rien à ajouter dans appsettings.Production.json : le fichier est écrit à côté du trousseau, dans le dossier déjà autorisé en écriture.
    2. nginx : ajouter le bloc location = /catalog/maintenance.json de server/deploy/nginx-catalog.conf, puis sudo nginx -t && sudo systemctl reload nginx.
    3. Launcher 3.3.0 : le publier (mise à jour signée habituelle) et laisser aux joueurs le temps de le recevoir.
    4. Permission et trousseau :
      1. 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) ;
      2. 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.
    5. 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

    Contributors

    Full Changelog: v3.2.1...v3.3.0

    Downloads