-
Launcher Version 3.4.2 Stable
released this
2026-11-10 21:02:49 +01:00 | 0 commits to master since this release🖥️ Launcher 3.4.2 — Journal des formulaires détaillé, nom de l'éditeur
Journal d'audit : les publications des formulaires des demandes sont détaillées. Auparavant, une publication n'y laissait qu'une ligne « Formulaires des demandes publiés » et un résumé (« 1 champ(s) modifié(s) »…) qui ne disait ni quel champ ni ce qui avait changé. Désormais, chaque type de demande ajouté, modifié ou supprimé a sa propre ligne, avec son nom, et chaque champ ajouté, supprimé ou modifié est indiqué, avec ce qui a changé.
Changement du nom de l'éditeur par défaut, désormais LanisysGames, repris dans les propriétés des exécutables.
Pour les joueurs, le launcher fonctionne exactement comme en 3.4.1. La Launcher API est à mettre à jour pour obtenir le nouveau détail du journal.
✨ En bref
Changement 🆕 Nouveau Journal d'audit : une ligne par type de demande ajouté, modifié ou supprimé, avec son nom 🆕 Nouveau Type modifié : tous ses changements, dont chaque champ ajouté, supprimé ou modifié et ce qui a changé 🔧 Amélioré Ligne de publication : types ajoutés, modifiés et supprimés par leur nom ; un détail long est réparti sur plusieurs lignes numérotées, rien n'est tronqué 🏷️ Éditeur Changement du nom de l'éditeur par défaut : LanisysGames (aussi dans les propriétés des exécutables) 📸 Documentation Captures de l'interface mises à jour (changement de l'éditeur), avec une version WebP 🖧 Serveur Launcher API à mettre à jour ; aucun réglage ni bloc nginx à ajouter 🧪 Qualité 1 nouveau test automatisé, 3 tests complétés
📋 Journal d'audit des formulaires des demandes
Avant / après
3.4.1 3.4.2 Lignes par publication 1 (« Formulaires des demandes publiés ») 1 de publication + 1 par type de demande ajouté, modifié ou supprimé Type concerné Dans le résumé, par son nom Cible de la ligne : « Problème technique » Champs Nombre seulement (« +3 champ(s) », « 1 champ(s) modifié(s) ») Nom de chaque champ et ce qui a changé dans chacun Présentation du type « présentation modifiée » Nom affiché, description, exemple de titre, informations techniques : lequel, avec l'ancienne et la nouvelle valeur quand elle est courte Détail long Coupé à 500 caractères Plusieurs lignes numérotées (1/2, 2/2…) Nouvelles actions
Action (code) Libellé du journal Cible Détail feedback.formsFormulaires des demandes publiés révision 5Types ajoutés, modifiés, supprimés par leur nom ; ordre des types ; signature feedback.form_createType de demande ajouté « Suggestion de niveau » Masqué ou non, icône, captures d'écran, informations techniques, chaque champ (type, obligatoire ou facultatif, nombre d'étoiles ou de choix) feedback.form_updateType de demande modifié « Problème technique » Tous les changements (ci-dessous) feedback.form_deleteType de demande supprimé « Autre » Plus proposé aux joueurs ; les demandes déjà reçues restent consultables Ces actions sont dans la catégorie « Demandes des joueurs » du filtre, dans la recherche et dans l'export CSV.
Changements indiqués pour un type modifié
Élément Exemple Type nom affiché : « Bug » → « Problème technique »,description : « … » → « … »,exemple de titre modifié,masqué (plus proposé aux joueurs),icône importée,captures d'écran retirées,« Joindre les informations techniques » décoché par défautChamp ajouté / supprimé champ ajouté : « Version affichée en jeu » (texte court, facultatif),champ supprimé : « Résultat attendu »Champ modifié champ « Gravité du problème » modifié : libellé « Gravité » → « Gravité du problème », rendu facultatif, choix ajouté « Très grave », choix renommé « Plantage » → « Plantage du jeu »Réglages d'un champ Libellé, type, obligatoire / facultatif, aide (ajoutée, modifiée, retirée), longueur maximale, nombre d'étoiles, choix (ajoutés, retirés, renommés, ordre), aperçu dans la liste des demandes Ordre ordre des champs modifié;ordre des types modifié(ligne de publication)Exemple dans la page « Journal d'audit » (du plus récent au plus ancien) :
Formulaires des demandes publiés — révision 5 — 1 type ajouté : « Suggestion de niveau » ; 1 type modifié : « Problème technique » ; signé (clé …) Type de demande ajouté — « Suggestion de niveau » — icône importée ; captures d'écran non proposées ; 1 champ(s) ; champ « Message » (zone de texte, obligatoire) Type de demande modifié — « Problème technique » — nom affiché : « Bug » → « Problème technique » ; champ supprimé : « Résultat attendu » ; champ ajouté : « Version affichée en jeu » (texte court, facultatif)- Un type inchangé n'a pas de ligne ; une publication sans changement indique « aucun changement ».
- Les lignes sont écrites dans l'ordre de lecture : la ligne de publication en tête, puis les types dans l'ordre publié, puis les types supprimés.
Compatibilité
Launcher Launcher API Résultat 3.4.2 mise à jour Détail complet, libellés en clair 3.4.1 ou antérieur mise à jour Détail complet ; les nouvelles actions s'affichent par leur code ( feedback.form_update…)3.4.2 ancienne Comme avant : une ligne « Formulaires des demandes publiés » avec son résumé 🏷️ Nom de l'éditeur
Fichier Changement src/GameLauncher.Core/Models/LauncherConfig.csÉditeur par défaut : LanisysGamesDirectory.Build.propsCompany,AuthorsetCopyright:LanisysGames(tous les projets de la solution)- L'éditeur par défaut ne sert que si
launcher.jsonn'en indique pas. Lelauncher.jsonintégré indique déjà"publisher": "LanisysGames": le dossier%AppData%\LanisysGames, la cléHKCU\Software\LanisysGameset les paramètres des joueurs ne changent pas. Directory.Build.propsest commun à toute la solution : la Launcher API, le site vitrine et les outils prennent aussi le nouveau nom à leur prochain build. Aucun code ne lit ces valeurs.
📸 Documentation
Fichier Changement docs/preview.png,docs/preview-update.pngChangement de l'éditeur docs/preview.webp,docs/preview-update.webpNouveaux : versions WebP (qualité 85) docs/ADMIN-ARCHITECTURE.mdRoute PUT v1/feedback/forms: nouvelles lignes d'auditREADME.mdPage « Formulaires des demandes » : détail du journal d'audit Le
README.mdaffiche toujours les captures PNG.🛡️ Sécurité
- Aucune donnée personnelle : le journal ne reçoit que les textes des formulaires (noms des types, libellés des champs et des choix), déjà publics dans
feedback-forms.json. Les aides des champs et les icônes ne sont pas recopiées. - Écriture après la publication réussie, avec l'administrateur, l'appareil, la clé et l'adresse IP, comme les autres actions.
- Textes nettoyés par le journal (caractères de contrôle retirés, 500 caractères au plus par champ) ; l'export CSV neutralise toujours les cellules qui ressemblent à une formule.
- Aucun changement de la signature des formulaires, des permissions ni des routes.
🧪 Tests
Test Vérifie FeedbackFormsModuleTests.Audit_names_every_changed_field_and_spreads_long_details_over_numbered_linesNouveau : chaque champ modifié nommé avec ce qui a changé (libellé, obligatoire, aperçu, aide, longueur, 20 choix ajoutés, choix retiré, ordre) ; lignes numérotées sous la limite ; publication sans changement FeedbackFormsModuleTests.Published_forms_are_signed_public_and_used_to_check_and_display_requestsComplété : une ligne par type modifié, nom affiché, champs ajoutés et supprimés, étoiles, type masqué, type inchangé absent FeedbackFormsModuleTests.Categories_can_be_added_removed_reordered_with_imported_icons_and_without_screenshotsComplété : 5 types ajoutés, 1 supprimé, détail d'un type ajouté FeedbackPanelTests.Feedback_audit_actions_have_friendly_labelsComplété : libellés des trois nouvelles actions ⬆️ Mise à niveau
- Launcher 3.4.2 : mise à jour signée habituelle, sans
--priority. - Launcher API : à mettre à jour (
tools\publish-server.bat, puisserver/deploy/LISEZMOI.md, étape 8). Aucun réglage ni bloc nginx à ajouter. - nginx, trousseau, site vitrine : aucune action. Le site affichera la 3.4.2 dès sa prochaine lecture de
launcher-update.json(10 minutes au plus).
- Administrateurs : aucune action. Les publications antérieures gardent leur ligne d'origine dans le journal.
- Joueurs : aucune action, la mise à jour est automatique.
- RGPD : aucune donnée personnelle concernée.
🔏 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.4.2 in #150
Contributors
Full Changelog: v3.4.1...v3.4.2
Downloads
-
Launcher Version 3.4.1 Stable
released this
2026-11-10 17:06:31 +01:00 | 8 commits to master since this release🖥️ Launcher 3.4.1 — Site vitrine et captures WebP
Nouveau : le site vitrine LanisysGames (
website/GameLauncher.Website, ASP.NET Core Razor Pages), en ligne sur https://www.games.lanisys.fr. Il présente les jeux et le launcher, propose le téléchargement du launcher vérifié par signature, toutes les notes de version d'Exovival Zombie Reborn et des actualités. Il est isolé de la Launcher API et déployé sur un VPS séparé.Le launcher lui-même ne change pas (numéro de version seulement). L'outil UiSnapshot produit désormais aussi des captures en WebP, le format des images du site.
Aucune action sur le VPS du launcher. Le site s'installe sur son propre VPS :
website/deploy/LISEZMOI.md.✨ En bref
Changement 🆕 Nouveau Site vitrine : accueil, launcher, jeux, notes de version, actualités, mentions légales, confidentialité 🆕 Nouveau Téléchargement du launcher affiché seulement si la signature de launcher-update.jsonest valide (même clé et même code que le launcher)🆕 Nouveau tools\ui-snapshot.bat --format webp --quality <1-100>: captures en WebP🛡️ Sécurité Site en lecture seule : CSP stricte, aucun cookie, aucune ressource externe ; service systemd durci, sorties réseau limitées au serveur du launcher 🖥️ Launcher Aucun changement fonctionnel 🖧 Serveur Aucun changement sur le VPS du launcher 🧪 Qualité 22 nouveaux tests automatisés (40 cas)
🌐 Site vitrine
Pages
Adresse Contenu /Téléchargement du launcher, jeux, dernières actualités /launcherFonctions du launcher (côté joueur), téléchargement (version, taille, empreinte SHA-256), première installation, notes de la dernière version, lien vers les publications Gitea, questions fréquentes /jeux/exovival-zombie-rebornHistoire, contenu, cassettes VHS, extension « L'abri » en développement, configuration /jeux/<jeu>/notes-de-versionToutes les notes de version du jeu /jeux/projet-multijoueurJeu en préparation (page générique) /actualitesArticles en Markdown ( Content/News/*.md)/mentions-legales,/confidentialiteÉditeur, hébergeur ; données (aucun cookie, journaux 14 jours) Un thème par univers :
launcher(violet / cyan, comme le thème « default »),exovival(noir, vert, titres condensés ; en-tête « lampe UV » qui révèle le message de Léa sous le pointeur),multi(jeu en préparation). Bouton « Nous contacter » : simple lienmailto:, aucun formulaire.Ce que le site lit, et comment
Fichier Usage Contrôles launcher/launcher-update.jsonVersion, exécutable à télécharger, notes de la dernière version Signature ECDSA vérifiée ( UpdateSignature, cléupdate-signing.pubintégrée à l'exe du site) ; exécutable sur le même serveur, en https ; produit attendu facultatif (Site:Launcher:Product) ; sections « Serveur », « Développement »… masquées<jeu>/manifest.jsonVersion, tailles, notes de version Jeu attendu ( GameId) ; notes bornées et nettoyées comme dans le launcher (ChangelogLimits.Normalize)- Lecture côté serveur, en arrière-plan, toutes les 10 minutes, avec requêtes conditionnelles (
ETag,Last-Modified). Les pages ne déclenchent aucune requête sortante ; le navigateur des visiteurs ne contacte le serveur du launcher qu'en cliquant sur « Télécharger ». - https uniquement, aucune redirection suivie, taille et délai bornés (256 Ko pour
launcher-update.json, 32 Mo pour un manifest). - Fichier refusé (signature, produit, serveur, autre jeu) : l'information est retirée du site. Serveur injoignable : la dernière version valide reste affichée.
- La Launcher API n'est jamais appelée.
Actualités en Markdown
Liseuse maison (
Services/SafeMarkdown.cs, sans dépendance) : titres, listes, citations, code, liens, images. Tout le texte est encodé : le HTML écrit dans un article s'affiche tel quel. Liensjavascript:,data:et//…retirés ; images du site (/img/…) uniquement. Brouillons (draft: true) visibles seulement en développement.🛡️ Sécurité du site
- CSP stricte : scripts, styles, images et polices du site uniquement ; aucun script en ligne ; aucune ressource externe (polices Sora et Barlow auto-hébergées, licence OFL).
- En-têtes : HSTS,
X-Content-Type-Options,X-Frame-Options: DENY,Referrer-Policy,Permissions-Policy,Cross-Origin-Opener-Policy,Cross-Origin-Resource-Policy; en-têteServerretiré. - Lecture seule :
GETetHEADseulement (405 sinon), corps de requête limité à 1 Ko. - Aucun cookie, aucun compte, aucune mesure d'audience ; clés de protection des données en mémoire.
- Limite de requêtes par adresse IP : site (300 / min) et nginx (10 / s).
- Certificat HTTPS du serveur du launcher : même règle que par défaut ; en cas de refus, le journal détaille la chaîne de certificats et la cause (
TlsDiagnostics). - Réglages contrôlés au démarrage : un réglage incorrect arrête le site avec un message clair.
🚀 Déploiement (VPS séparé)
Pourquoi un autre VPS : une faille du site n'atteint ni l'API d'administration, ni le journal d'audit, ni les demandes des joueurs, ni les fichiers des jeux ; un pic de trafic sur le site ne ralentit pas les téléchargements.
Fichier Rôle tools\publish-site.batExe autonome linux-x64 (aucun .NET sur le VPS), archive + empreinte SHA-256 website/deploy/installer-site.shArchive vérifiée par son empreinte, binaires root dans /opt/lanisys-site,appsettings.Production.jsonconservé, sorties réseau recalculées (sortie.conf), retour à la version précédente si le site ne répond paswebsite/deploy/lanisys-site.serviceCompte temporaire ( DynamicUser), système en lecture seule, aucun privilège, dossier personnel/var/lib/lanisys-site(700), connexions sortantes limitées au serveur du launcher et au DNS, mémoire limitéewebsite/deploy/nginx-site.confRedirections http → https et domaine nu → www, HTTP/2, TLS 1.2 / 1.3, renouvellement Let's Encrypt sans coupure (webroot), lectures seulement, fichiers cachés jamais servis website/deploy/LISEZMOI.mdGuide complet : domaine, publication, installation, nginx et HTTPS, mentions légales, journaux, actualités, ajout d'un jeu, dépannage Compatibilité Debian 11 (constatée lors de la mise en ligne) :
- .NET a besoin d'un dossier personnel pour vérifier un certificat HTTPS ; le compte temporaire de systemd n'en a pas sous Debian 11 →
StateDirectory=lanisys-site+HOME=/var/lib/lanisys-site. - nginx 1.18 ne connaît pas
http2 on;→listen 443 ssl http2;.
📸 UiSnapshot : captures en WebP
Option Effet --format png|webpFormat des images ( pngpar défaut) ; pages supplémentaires.p2.webp… comprises--quality <1-100>Qualité WebP (85 par défaut ; 100 = sans perte) ; ignorée en PNG tools\ui-snapshot.bat --filter "main-*,launcher-update-verified" --format webp --quality 85- Transparence conservée (
--backdrop transparent).index.htmletreport.mdaffichent PNG et WebP ; une série complète efface aussi les anciens.webp. - Encodage par SkiaSharp 3.119.1 (Microsoft, licence MIT) : Windows sait lire le WebP mais pas l'écrire. Utilisé par cet outil de développement seulement : le launcher, la Launcher API et le site n'en dépendent pas.
🧪 Tests
Classe Vérifie WebsiteRemoteContentTests(12 tests, 22 cas)launcher-update.json: signature valide, contenu modifié, autre clé, exécutable hors du serveur (autre hôte, http, autre port, paramètres, pas un.exe), produit inattendu, clé intégrée ; manifest : bornes et nettoyage des notes, autre jeu, fichier illisible ; adresses https uniquement ; lecture bornée ; message d'erreur détaillé (certificat refusé)WebsiteMarkdownTests(6 tests, 12 cas)HTML brut affiché tel quel, liens javascript:/data:////vbscript:retirés, injection d'attribut impossible, images hors du site refusées, syntaxe prise en chargeWebsiteNewsTests(4 tests, 6 cas)En-tête des articles, noms de fichiers invalides, valeurs inconnues neutralisées, brouillons Les sources du site sont compilées dans le projet de tests (sans référence au projet du site, dont l'
appsettings.jsonremplacerait celui de la Launcher API dans le dossier des tests).⬆️ Mise à niveau
- Launcher 3.4.1 : facultatif, il ne change rien pour les joueurs. Si publié : mise à jour signée habituelle, sans
--priority(une version prioritaire déjà publiée est reprise automatiquement). - VPS du launcher, nginx, trousseau : aucune action.
- Site vitrine :
website/deploy/LISEZMOI.md(VPS séparé, Debian 11 à 13), puis compléterappsettings.Production.json: adresse publique, contact, mentions légales. - Gitea : le lien « Toutes les versions » du site suppose un dépôt public ; sinon, vider
Site:Launcher:ReleasesUrl.
- Administrateurs : aucune action.
- Joueurs : aucune action. Le site leur permet désormais de télécharger le launcher et de lire les notes de version sans l'installer.
- RGPD : le site ne collecte aucune donnée personnelle (ni compte, ni cookie, ni formulaire) ; journaux nginx conservés 14 jours, détaillés sur la page « Confidentialité ».
🔏 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.4.0...v3.4.1
Downloads
- Lecture côté serveur, en arrière-plan, toutes les 10 minutes, avec requêtes conditionnelles (
-
Launcher Version 3.4.0 Stable
released this
2026-11-10 13:50:12 +01:00 | 20 commits to master since this release🖥️ Launcher 3.4.0 — Mises à jour prioritaires
Une version du launcher peut désormais être publiée comme prioritaire (correctif critique, faille de sécurité…) : elle est installée au démarrage même chez les joueurs qui ont désactivé la mise à jour automatique du launcher. Leur réglage n'est jamais modifié (
autoUpdatereste àfalsedansself-update.json) : effet ponctuel, le temps d'installer le correctif.Aucune action sur le serveur. Publier le launcher 3.4.0 comme d'habitude ; pour une version prioritaire :
tools\publish-launcher-update.bat --priority.✨ En bref
Changement 🆕 Nouveau Version prioritaire : installée au démarrage même avec la mise à jour automatique désactivée, réglage du joueur conservé 🆕 Nouveau publish-launcher-update.bat --priority(confirmation demandée) et--clear-priority🎨 Interface Pastille « Prioritaire » dans la fenêtre de mise à jour ; avertissement dans le bandeau et dans les Paramètres du launcher tant qu'elle n'est pas installée 🛡️ Sécurité L'indication « prioritaire » fait partie du contenu signé 🖧 Serveur Aucun changement 🧪 Qualité LauncherPriorityTests: 8 nouveaux tests automatisés (12 cas) ; scène UiSnapshotlauncher-update-priority
⚙️ Fonctionnement
Situation du joueur Version normale Version prioritaire Mise à jour auto activée Installée au démarrage Installée au démarrage (pastille « Prioritaire ») Mise à jour auto désactivée Bandeau « nouvelle version disponible » Installée au démarrage, réglage inchangé Launcher déjà à jour du correctif — Non concerné : son réglage s'applique aux versions suivantes « Plus tard » pendant le téléchargement Rien jusqu'au prochain démarrage Bandeau d'avertissement, nouvelle tentative au prochain démarrage Erreur de téléchargement Plus de tentative automatique Retentée au prochain démarrage La nouvelle version ne démarre pas Retour arrière, plus de tentative automatique Idem (évite 60 s d'attente à chaque lancement) + avertissement, bouton manuel Dossier protégé (Program Files) Bandeau Bandeau d'avertissement Reprise d'une publication à l'autre
launcher-update.jsonne décrit que la dernière version : la priorité est donc reprise (priorityVersion) par les publications suivantes.3.4.0 --priority → priorityVersion 3.4.0 3.5.0 (normale) → priorityVersion 3.4.0 reprise • joueur en 3.3.x, option désactivée → passe en 3.5.0 (il n'avait pas le correctif) • joueur en 3.4.0, option désactivée → reste en 3.4.0 (bandeau) 3.6.0 --clear-priority → plus aucune version imposéeLa reprise n'a lieu que si le
launcher-update.jsonprécédent est signé par votre clé ; sinon un avertissement propose de relancer avec--priority.🚀 Publier une version prioritaire
tools\publish-launcher-update.bat --priority- Bandeau « Version PRIORITAIRE » puis compilation.
- Confirmation
(o/N)avant la saisie de la phrase de passe ; « N » : rien n'est publié. - Résumé : ligne
Priorité : PRIORITAIRE — …. - Envoi WinSCP comme d'habitude (exe d'abord,
launcher-update.jsonen dernier).
Vérification :
LauncherPublisher verify …affiche désormais la lignePriorité.🛡️ Sécurité
priorityVersionest dans le payload signé (ECDSA P-256) : un serveur compromis ne peut ni imposer une mise à jour, ni retirer ou modifier la priorité d'un correctif.- Elle n'ouvre aucune nouvelle possibilité d'installation : seule une version signée, du bon produit, strictement supérieure, à la taille et au SHA-256 annoncés est installée, comme avant.
- Description incohérente refusée :
priorityVersionillisible ou supérieure à la version publiée. self-update.jsonn'est jamais écrit pour la priorité (aucun champ ajouté) : le réglage du joueur ne peut pas être forcé.- Option désactivée : le launcher interroge désormais le serveur au démarrage (
launcher-update.json, 1 à 2 Ko, 6 s au plus), comme les joueurs ayant l'option activée. Aucune donnée personnelle envoyée.
⚠️ Limite
Les launchers antérieurs à 3.4.0 ignorent l'indication (ils ne lisent pas
priorityVersionet ne cherchent pas de mise à jour au démarrage si l'option est désactivée). La priorité ne vaut que pour les joueurs déjà en 3.4.0 ou plus : publier cette 3.4.0 dès que possible.🧪 Tests
Test Vérifie The_priority_version_is_part_of_the_signed_contentPriorité lue après vérification de la signature ; payload modifié refusé A_release_without_priority_stays_compatible_with_older_launchersSans priorité : champ absent du JSON, comportement inchangé Only_launchers_older_than_the_priority_version_are_forced(4 cas)3.4.0 prioritaire puis 3.5.0 : 3.3.x forcé, 3.4.x non No_update_available_means_no_priorityPas de mise à jour disponible : jamais prioritaire An_inconsistent_priority_version_is_refused(2 cas)Version prioritaire supérieure ou illisible refusée A_blank_priority_version_means_noneValeur vide = aucune priorité The_publisher_marks_carries_over_or_clears_the_priority--priority, reprise,--clear-priority, options contradictoiresThe_player_setting_file_has_no_priority_fieldself-update.jsonsans champ de priorité,autoUpdate=falseconservé⬆️ Mise à niveau
- Launcher 3.4.0 : le publier (mise à jour signée habituelle, sans
--priority). - Serveur, nginx, trousseau : aucune action.
- Administrateurs : aucune action.
- Joueurs : mise à jour automatique, aucune action requise. Ceux qui ont désactivé l'option recevront la 3.4.0 par le bouton « Vérifier les mises à jour ».
- RGPD : aucune donnée personnelle concernée.
🔏 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.4.0 in #142
Contributors
Full Changelog: v3.3.1...v3.4.0
Downloads
-
Launcher Version 3.3.1 Stable
released this
2026-11-10 12:31:06 +01:00 | 28 commits to master since this release🖥️ Launcher 3.3.1 — Correctif du mode maintenance
Un launcher resté ouvert pendant la re-signature du trousseau ne voyait pas la maintenance activée ensuite : chaque relecture (toutes les 2 minutes) la refusait jusqu'au redémarrage du launcher. Le launcher retélécharge désormais le trousseau quand un contenu est signé par une clé qu'il connaît mais pas encore autorisée pour ce contenu, et le relit au plus toutes les 30 minutes quand il reste ouvert longtemps.
Aucune action sur le serveur. Publier le launcher 3.3.1 comme d'habitude.
✨ En bref
Changement 🐛 Corrigé Maintenance activée après la re-signature du trousseau non vue par un launcher déjà ouvert (redémarrage nécessaire en 3.3.0) 🔧 Amélioré Trousseau retéléchargé quand un contenu est signé par une clé absente ou présente sans l'autorisation de ce contenu (au plus une fois par minute) 🛡️ Sécurité Trousseau relu au plus toutes les 30 minutes : un appareil retiré du trousseau n'est plus accepté par un launcher laissé ouvert 🖧 Serveur Aucun changement 🧪 Qualité 3 nouveaux tests automatisés (370 au total), dont la reproduction du problème
🐛 Le problème
Symptôme Maintenance activée depuis le menu : toujours pas affichée au bout de 5 minutes ; affichée après un redémarrage complet du launcher Cause Le launcher gardait en mémoire le trousseau lu au démarrage. Il ne le retéléchargeait que pour une clé inconnue, pas pour une clé connue qui vient de recevoir une autorisation — exactement ce que fait l'étape 3 decies (autorisation « mode maintenance » ajoutée en re-signant le trousseau) Effet À chaque relecture : « la clé … n'est pas autorisée à signer ce contenu », maintenance ignorée (état précédent conservé) Hors cause La relecture toutes les 2 minutes fonctionnait ; aucun cache HTTP (requêtes no-cache, bloc nginx sans cache)Le même défaut touchait tout contenu signé par un appareil autorisé après le démarrage du launcher : formulaires « Aide », catalogue, versions des jeux.
🔁 Vérifications périodiques du launcher
Fichier Quand Changement 3.3.1 maintenance.jsonDémarrage (attendu 4 s au plus), puis toutes les 2 min (1 min pendant une maintenance), et aussitôt après une publication depuis le menu de ce PC Un fichier refusé est revérifié à chaque relecture, avec un trousseau à jour Manifest des jeux Démarrage, puis toutes les 30 min ( updateCheckIntervalMinutes)— keyring.jsonDémarrage ; après un échec réseau (1 min) ; clé inconnue ou non autorisée (1 min au plus, 5 min et clé inconnue seulement avant) ; au plus toutes les 30 min Nouveau : clé non autorisée, âge maximal catalog.jsonDémarrage seulement (2,5 s au plus, sinon cache) — Mise à jour du launcher Démarrage, et « Rechercher » dans les paramètres — feedback-forms.jsonÀ l'ouverture de la fenêtre « Aide » — 🛡️ Sécurité
- Chaque trousseau retéléchargé passe par les mêmes contrôles qu'au démarrage : signature de la clé racine, numéro jamais en baisse, différent sous le même numéro refusé, minimum
keyringMinSequence. Un serveur compromis qui ressert un ancien trousseau est refusé. - Serveur injoignable lors d'un nouveau téléchargement : dernier trousseau vérifié conservé, aucune erreur pour l'appelant.
- Gain : un appareil retiré du trousseau (ou une autorisation enlevée) n'est plus accepté par un launcher resté ouvert, au plus 30 minutes après.
- Le rythme des téléchargements reste limité (au plus une fois par minute pour une clé inconnue ou non autorisée).
🧪 Tests
Test Vérifie MaintenanceServiceTests.A_maintenance_published_after_the_keyring_gained_the_scope_is_applied_without_restartingReproduction du problème : trousseau re-signé avec « maintenance » pendant que le launcher tourne, maintenance appliquée à la relecture suivante (échouait en 3.3.0) ContentTrustTests.A_scope_granted_while_the_launcher_runs_is_found_by_downloading_the_keyring_againAutorisation ajoutée à une clé connue : trousseau retéléchargé, au plus une fois par KeyChangeRetryDelayContentTrustTests.A_launcher_left_open_downloads_the_keyring_again_and_stops_trusting_a_removed_keyÂge maximal : clé retirée refusée sans redémarrer ; hors ligne, dernier trousseau gardé ; ancien trousseau resservi refusé ⬆️ Mise à niveau
- Launcher 3.3.1 : le publier (mise à jour signée habituelle).
- Serveur, nginx, trousseau : aucune action.
- Administrateurs : aucune action. Les launchers 3.3.0 restés ouverts depuis la re-signature du trousseau doivent être redémarrés une fois (ou recevoir la 3.3.1).
- Joueurs : mise à jour automatique, aucune action requise.
- RGPD : aucune donnée personnelle concernée.
🔏 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.1 in #139
Contributors
Full Changelog: v3.3.0...v3.3.1
Downloads
- Chaque trousseau retéléchargé passe par les mêmes contrôles qu'au démarrage : signature de la clé racine, numéro jamais en baisse, différent sous le même numéro refusé, minimum
-
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
-
Launcher Version 3.2.1 Stable
released this
2026-11-10 10:04:55 +01:00 | 41 commits to master since this release🖥️ Launcher 3.2.1 — Signature des formulaires des demandes dans la page « Signature »
La page « Signature » affiche désormais l'état de signature des formulaires des demandes (
feedback-forms.json), sous les versions en ligne et le catalogue : formulaires d'origine, signés et valides, ou refusés par les launchers avec la raison et le remède.Les formulaires publiés depuis la 3.2.0 sont ainsi contrôlés au même endroit que le reste du contenu signé, y compris avant de re-signer le trousseau. Serveur à redéployer (voir Mise à niveau) ; aucun bloc nginx à ajouter.
✨ En bref
Changement 🔧 Amélioré Page « Signature » : ligne « Formulaires des demandes » dans « Contenu en ligne », sous les versions en ligne et le catalogue 🔧 Amélioré Vérification avec le trousseau publié (accepté ou refusé par les joueurs, et pourquoi) et avec le trousseau proposé (clé qui ne sera plus dans le trousseau) 🛡️ Sécurité Export de la demande de trousseau : les formulaires qui deviendraient invalides sont rappelés, comme les versions et le catalogue 🖧 Serveur À redéployer ; aucun bloc nginx à ajouter 🧰 Outils tools\ui-snapshot.bat: la scèneadmin-page-signingmontre les formulaires des demandes🧪 Qualité 1 nouveau test automatisé (356 au total)
🔏 Page « Signature »
La liste « Contenu en ligne » affiche, dans cet ordre : les versions en ligne de chaque jeu, le catalogue, puis les formulaires des demandes.
État Affichage Formulaires d'origine « Formulaires des demandes » · « Formulaires d'origine, intégrés au launcher : rien à signer tant que rien n'est publié. » Signés, clé autorisée « Formulaires des demandes (révision n) » · « Signé par … : valide pour les launchers. » Refusés par les launchers Raison (clé absente du trousseau, autorisation « formulaires » manquante…) et remède : « Republiez-les depuis la page « Formulaires des demandes » (ils sont signés à chaque publication). » Clé retirée du trousseau proposé « Attention : sa clé ne sera plus dans le trousseau proposé. » Fichier illisible sur le serveur Ligne en erreur, avec la marche à suivre : restaurer depuis feedback-forms-history/, dans les données privées du serveur- La vérification est faite par le launcher, avec le trousseau publié, exactement comme chez les joueurs.
- « Exporter la demande… » : si le nouveau trousseau rendait les formulaires invalides, ils figurent dans la confirmation « Contenu à signer d'abord », comme les versions et le catalogue.
- Serveur antérieur à la 3.2.1 : la ligne n'apparaît pas ; le reste de la page est inchangé.
🛡️ Sécurité
Point Comportement Accès Inchangé : GET v1/signingexige la session et la permissionadmins.manageContenu renvoyé Révision, condensé, signature et signataire des formulaires en vigueur : rien de secret (les formulaires sont publics) Fichier illisible Signalé sans bloquer la page ; le détail est écrit dans le journal du serveur seulement Vérification Faite par le launcher de l'administrateur avec le trousseau publié et la clé racine intégrée : le serveur ne peut pas faire afficher « valide » pour des formulaires que les joueurs refuseraient
🧰 Outil de débogage
ui-snapshotScène Contenu admin-page-signingContenu en ligne : versions, catalogue (révision 12), formulaires des demandes (révision 3)
🧪 Tests
Fichier Tests Admin/SigningPanelTests.cs+1 : formulaires des demandes sous le catalogue (d'origine, refusés sans l'autorisation « formulaires », valides après le nouveau trousseau) 356 tests au vert.
📂 Fichiers modifiés
Contrats
src/GameLauncher.Contracts/Signing/SigningDtos.cs
Serveur
server/GameLauncher.Server/Modules/Signing/SigningModule.cs
Menu d'administration
src/GameLauncher.Modules.Admin/Signing/SigningPanelViewModel.cs
Launcher (WPF)
src/GameLauncher/GameLauncher.csproj(version 3.2.1)
Outil ui-snapshot
tools/UiSnapshot/Fakes/FakeApi.cstools/UiSnapshot/LISEZMOI.md
Tests
tests/GameLauncher.Tests/Admin/SigningPanelTests.cs
Documentation et notes
docs/ADMIN-ARCHITECTURE.mdtools/notes-launcher.txt
⬆️ Mise à niveau
Ordre indifférent. Un launcher 3.2.1 relié à un serveur 3.2.0 n'affiche simplement pas la ligne des formulaires ; un launcher 3.2.0 relié à un serveur 3.2.1 ignore cette information.
- Serveur (Launcher API) : à redéployer (
server/deploy/LISEZMOI.md, étape 8). Aucun réglage ni bloc nginx à ajouter. - Administrateurs : aucune action. Après la mise à jour, vérifier dans la page « Signature » que les formulaires publiés sont valides pour les launchers ; sinon, re-signer le trousseau avec l'autorisation « formulaires des demandes » (étape 3 nonies de la 3.2.0).
- Joueurs : mise à jour automatique, aucune action requise.
🔏 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.2.1 in #136
Contributors
Full Changelog: v3.2.0...v3.2.1
Downloads
-
Launcher Version 3.2.0 Stable
released this
2026-11-10 09:28:10 +01:00 | 47 commits to master since this release🖥️ Launcher 3.2.0 — Formulaires des demandes modifiables depuis le menu
Les formulaires du bouton Aide se gèrent désormais depuis le menu d'administration : de 1 à 8 types de demande (ajout, suppression, ordre d'affichage, nom, description, icône, captures d'écran autorisées ou non, type masqué) et leurs champs (zone de texte, texte court, liste déroulante, cases à cocher, case oui/non, étoiles), avec un aperçu identique à la fenêtre des joueurs. Une icône peut être l'une des quatre d'origine ou un fichier .ico importé (image 64 × 64).
Les formulaires sont communs à tous les jeux, signés (nouvelle autorisation « formulaires » du trousseau) et vérifiés par le launcher : un serveur compromis ne peut pas faire afficher un faux formulaire. Aucun lien n'est accepté dans les textes. Serveur à redéployer, deux blocs nginx à ajouter, puis trousseau à re-signer après la diffusion de cette version (voir Mise à niveau).
✨ En bref
Changement 🆕 Nouveau Page « Formulaires des demandes » dans le menu : types de demande, champs, aperçu, contrôle en direct, publication signée 🆕 Nouveau 1 à 8 types de demande : ajout, suppression, ordre d'affichage, type masqué 🆕 Nouveau Icône d'un type : l'une des quatre d'origine, ou un fichier .ico importé (image 64 × 64 obligatoire) 🆕 Nouveau Captures d'écran autorisées ou non par type de demande (même système qu'avant : 3 au plus, conversion, contrôles) 🆕 Nouveau Nouveaux champs : texte court, cases à cocher, case oui/non, notes de 3, 5 ou 10 étoiles 🔧 Amélioré Fenêtre « Aide » : formulaires publiés lus à l'ouverture, nouveaux champs, saisie gardée si les formulaires changent pendant la saisie 🔧 Amélioré Page « Demandes des joueurs » : chaque demande garde le formulaire de son envoi (nom, icône, libellés) ; filtre par type publié 🛡️ Sécurité Formulaires signés et revérifiés par le launcher ; aucun lien dans les textes ; icône réécrite sans métadonnées et couverte par la signature 🖧 Serveur À redéployer, avec deux blocs nginx ; trousseau à re-signer après la diffusion de la 3.2.0 🧰 Outils tools\ui-snapshot.batcapture la nouvelle page et les formulaires publiés🧪 Qualité 13 nouveaux tests automatisés (355 au total)
🗂️ Page « Formulaires des demandes » (administration)
Nouvelle page du menu (permission
feedback.forms), en trois colonnes : types de demande, réglages du type et ses champs, aperçu.Types de demande
Action Comportement Ajouter un type de demande 8 types au plus ; nouveau type « Nouveau type » avec un champ « Message », placé à la fin ; identifiant généré ( type_1…), jamais celui d'un type publié ou d'origineMonter / Descendre L'ordre de la liste est l'ordre d'affichage dans la fenêtre « Aide » Supprimer Avec confirmation ; il reste toujours au moins un type. Les demandes déjà reçues restent consultables Réglages Nom, description, exemple de titre, informations techniques cochées par défaut, captures d'écran autorisées (3 au plus), masqué Icône L'une des quatre d'origine (étoile, ampoule, insecte, bulles), ou « Importer un fichier .ico… » / « Retirer l'icône importée » État Proposé / masqué, nouveau / modifié ; compteur « Types de demande · n / 8 » Champs
Action Comportement Ajouter un champ Par type de champ ; identifiant généré et fixe ( texte_1,cases_2…), jamais celui d'un champ publiéMonter / Descendre / Retirer Champs repliables, ordre libre Réglages Libellé, aide, obligatoire, aperçu dans la liste des demandes, longueur, nombre d'étoiles, choix ordonnés (2 à 20) 🧩 Types de champs
Type Saisie du joueur Zone de texte 20 à 2 000 caractères Texte court 1 à 200 caractères Liste déroulante Un seul choix Cases à cocher Plusieurs choix, remis dans l'ordre du formulaire Case oui/non Obligatoire = doit être cochée Étoiles Note sur 3, 5 ou 10 15 champs au plus par type ; l'aide d'un champ (4 lignes, 200 caractères) s'affiche sous le champ.
Contrôles, aperçu et publication
- Aperçu rendu avec les mêmes modèles que la fenêtre « Aide » des joueurs.
- Contrôle en direct avec les règles du serveur et du launcher : la publication reste bloquée tant qu'il reste une erreur (lien, texte trop long, identifiant en double…).
- Avertissements sans refus : libellé qui semble demander une donnée personnelle (e-mail, mot de passe, téléphone…), type sans champ.
- « Publier » : confirmation (types masqués rappelés), vérification que le trousseau publié autorise bien les formulaires, signature par la clé de ce PC, requête signée.
- « Annuler les modifications », « Revenir à l'origine » (les quatre types d'origine dans l'éditeur, à publier ensuite), « Recharger ».
- Si un autre administrateur a publié entre-temps : bandeau « Recharger », rien n'est écrasé.
🎨 Icônes importées
Règle Détail Fichier Extension .icoobligatoire, en-tête vérifié, 1 Mo au plusTaille Le fichier doit contenir une image de 64 × 64 pixels ; les autres tailles qu'il contient sont ignorées Formats PNG intégré (revérifié) ou bitmap 24/32 bits avec son masque ; 256 couleurs et moins refusés Réécriture Image relue sans bibliothèque, puis réécrite en PNG 64 × 64 neuf, sans métadonnées (20 Ko au plus) Signature Le PNG est intégré aux formulaires : il est couvert par la signature et revérifié par le serveur et par chaque launcher Un fichier refusé (
.pngrenommé, icône sans image 64 × 64, fichier abîmé) affiche un message qui explique pourquoi.
🪟 Fenêtre « Aide » (joueurs)
- Les formulaires publiés sont lus à l'ouverture de la fenêtre seulement (« Chargement des formulaires… », 8 s au plus), puis vérifiés : règles, signature, révision.
- Types présentés dans l'ordre choisi, avec leur icône (d'origine ou importée) ; les types masqués n'apparaissent pas.
- Nouveaux champs : texte court, cases à cocher arrondies, case oui/non, 3 à 10 étoiles ; aide affichée sous les champs.
- Section « Captures d'écran » masquée pour un type qui ne les autorise pas : aucune image n'est envoyée.
- Formulaires republiés pendant la saisie : le launcher les relit, reconstruit le formulaire et garde la saisie des champs inchangés, avec un message au joueur ; si le type a été masqué ou supprimé, retour au choix du type.
- Hors ligne, ou formulaires refusés : le launcher propose les formulaires d'origine, toujours acceptés par le serveur (sauf type masqué ou supprimé).
📋 Page « Demandes des joueurs » (administration)
Élément Comportement Formulaire conservé Chaque demande garde le formulaire tel qu'à l'envoi : elle reste lisible même si un champ est renommé ou supprimé ensuite Liste Nom et icône du type publié ; l'aperçu (gravité, note…) vient du champ coché « aperçu dans la liste » Filtre Types publiés, avec « (masqué) », et anciens types d'origine supprimés, avec « (supprimé) » Fiche Nom, icône et libellés du formulaire de la demande
📜 Journal d'audit
Action Libellé affiché feedback.formsFormulaires des demandes publiés Le détail indique les changements par type : nom (
ancien → « nouveau »), types ajoutés ou supprimés, ordre modifié, champs ajoutés ou retirés, icône importée ou d'origine, captures d'écran autorisées ou retirées, type masqué.
🛡️ Sécurité
Menace Défense Faux formulaire (« entrez votre mot de passe ») publié depuis un serveur compromis Formulaires signés par une clé autorisée « formulaires » dans le trousseau, lui-même signé par la clé racine du launcher ; vérifiés par chaque launcher, comme le catalogue Lien d'hameçonnage dans un texte Aucun lien accepté dans les noms, descriptions, libellés, aides et choix (même détection qu'en 3.1.0 : http, www, domaines, IP, e-mails, formes déguisées) ; refusé par le menu, le serveur et le launcher Demande de données personnelles Avertissement dans le menu avant publication Retour à d'anciens formulaires Révision inférieure à celle déjà gardée par le launcher : refusée Icône piégée .icorelu sans bibliothèque, réécrit en PNG neuf sans métadonnées, 20 Ko au plus, couvert par la signature, revérifié partoutPublications simultanées Révision attendue obligatoire : 409, rien n'est écrasé Jeton de session volé Publication par requête signée (clé de l'administrateur) avec la permission feedback.forms; formulaires signés par la clé de la session uniquementFichier démesuré Formulaires : 256 Ko au plus (icônes comprises) ; route de publication 264 Ko ; nginx 300 Ko Captures envoyées pour un type qui ne les autorise pas Demande refusée par le serveur Type masqué ou supprimé utilisé par un ancien launcher Demande refusée (« Ce type de demande n'est plus proposé. ») Formulaires changés pendant la saisie Révision annoncée par chaque demande ; révision dépassée : 409 avant le comptage des limites par adresse - Trousseau : une autorisation inconnue mais bien formée est désormais acceptée sans effet : les prochaines autorisations n'invalideront plus le trousseau des launchers à jour.
- Permission
feedback.forms: groupes Propriétaire et Administrateur par défaut, pas l'Éditeur.
🗄️ Choix du stockage
Les formulaires sont un fichier JSON signé (
feedback-forms.json) : référence privée côté serveur (avec un.baket l'historique des 20 dernières publications), copie publique à côté du trousseau (644, écriture atomique). SQLite a été écarté : un seul petit document, rarement modifié et publié en fichier de toute façon. Les icônes sont intégrées au document pour être couvertes par sa signature.
🧰 Outil de débogage
ui-snapshotScène Contenu admin-page-feedback-forms-editPage « Formulaires des demandes » : champ ajouté et déplié, erreur « lien », avertissement « donnée personnelle », aperçu admin-page-feedback-forms-new-typeType ajouté avec une icône importée, captures d'écran désactivées, déplacé en tête feedback-custom-kindsChoix du type avec des formulaires publiés : ordre, type ajouté avec son icône, type masqué feedback-customFormulaire publié avec tous les types de champs - L'API simulée connaît les routes des formulaires (lecture et publication).
🧪 Tests
Fichier Tests Contracts/FeedbackFormsTests.cs(nouveau)7 : formulaires d'origine et condensé signé, formulaires hors règles ou avec des liens refusés, nouveaux types de champs, icônes .ico(64 × 64 exigé, PNG ou bitmap, fichiers abîmés), formulaires publiés utilisés seulement s'ils sont signés par une clé « formulaires », fenêtre « Aide » rechargée pendant la saisie, icônes importées et captures masquéesServer/FeedbackFormsModuleTests.cs(nouveau)3 : publication signée et fichier public, permission, clé de la session et révision, 8 types avec icônes (plus de 64 Ko), captures refusées, type supprimé refusé, filtre par nouveau type Admin/FeedbackFormsPanelTests.cs(nouveau)3 : modification, contrôles en direct, aperçu et publication ; publication concurrente jamais écrasée ; ajout, ordre, suppression et import d'icône Signing/ContentSigningTests.csAutorisation inconnue mais bien formée acceptée dans le trousseau, autorisation mal formée refusée Admin/FeedbackPanelTests.csLibellé d'audit « Formulaires des demandes publiés » 355 tests au vert.
📂 Fichiers modifiés
Contrats
src/GameLauncher.Contracts/Feedback/FeedbackFormsDocument.cs(nouveau)src/GameLauncher.Contracts/Feedback/FeedbackIcons.cs(nouveau)src/GameLauncher.Contracts/Feedback/FeedbackForms.cssrc/GameLauncher.Contracts/Feedback/FeedbackRules.cssrc/GameLauncher.Contracts/Feedback/FeedbackDtos.cssrc/GameLauncher.Contracts/ApiRoutes.cssrc/GameLauncher.Contracts/Dtos/SystemDtos.cssrc/GameLauncher.Contracts/Security/AdminPermissions.cssrc/GameLauncher.Contracts/Security/AdminRoles.cssrc/GameLauncher.Contracts/Signing/ContentSigning.cssrc/GameLauncher.Contracts/Signing/Keyring.cs
Confiance et client de l'API
src/GameLauncher.Core/Trust/ContentTrustService.cssrc/GameLauncher.ApiClient/AdminSession.cs
Serveur
server/GameLauncher.Server/Storage/FeedbackFormsStore.cs(nouveau)server/GameLauncher.Server/Storage/FeedbackStore.csserver/GameLauncher.Server/Modules/Feedback/FeedbackModule.csserver/GameLauncher.Server/Hosting/LauncherApiOptions.cs
Déploiement
server/deploy/nginx-api.confserver/deploy/nginx-catalog.confserver/deploy/LISEZMOI.md
Module « Aide »
src/GameLauncher.Modules.Feedback/FeedbackFormsService.cs(nouveau)src/GameLauncher.Modules.Feedback/FeedbackFieldViewModel.cssrc/GameLauncher.Modules.Feedback/FeedbackFormViewModel.cs
Menu d'administration
src/GameLauncher.Modules.Admin/Feedback/FeedbackFormsPanelViewModel.cs(nouveau)src/GameLauncher.Modules.Admin/Feedback/FeedbackFormEditors.cs(nouveau)src/GameLauncher.Modules.Admin/Feedback/FeedbackAdminModule.cssrc/GameLauncher.Modules.Admin/Feedback/FeedbackItems.cssrc/GameLauncher.Modules.Admin/Feedback/FeedbackPanelViewModel.cssrc/GameLauncher.Modules.Admin/Audit/AuditPanelViewModel.cssrc/GameLauncher.Modules.Admin/GameLauncher.Modules.Admin.csprojsrc/GameLauncher.Modules/Admin/PlayerSigningCheck.cs
Launcher (WPF)
src/GameLauncher/Themes/FeedbackForms.xaml(nouveau)src/GameLauncher/Themes/Admin.xamlsrc/GameLauncher/Views/FeedbackWindow.xamlsrc/GameLauncher/Services/FeedbackWindowService.cssrc/GameLauncher/App.xamlsrc/GameLauncher/App.xaml.cssrc/GameLauncher/GameLauncher.csproj(version 3.2.0)
Outil ui-snapshot
tools/UiSnapshot/Scenes/AdminScenes.cstools/UiSnapshot/Scenes/FeedbackScenes.cstools/UiSnapshot/Fakes/FakeApi.cstools/UiSnapshot/Fakes/SampleData.cstools/UiSnapshot/LISEZMOI.md
Tests
tests/GameLauncher.Tests/Contracts/FeedbackFormsTests.cs(nouveau)tests/GameLauncher.Tests/Server/FeedbackFormsModuleTests.cs(nouveau)tests/GameLauncher.Tests/Admin/FeedbackFormsPanelTests.cs(nouveau)tests/GameLauncher.Tests/Admin/FeedbackPanelTests.cstests/GameLauncher.Tests/Signing/ContentSigningTests.cs
Documentation et notes
README.mddocs/ADMIN-ARCHITECTURE.mdtools/notes-launcher.txt
⬆️ Mise à niveau
Ordre obligatoire : serveur et nginx, puis launcher 3.2.0, puis trousseau, puis formulaires. Les launchers 3.1 et antérieurs ne connaissent pas l'autorisation « formulaires » : ils refusent un trousseau qui la contient et gardent le précédent. Re-signer le trousseau trop tôt n'empêche pas de jouer, mais un appareil ajouté au trousseau en même temps ne serait pas reconnu par ces launchers.
-
Serveur (Launcher API) : à redéployer (
server/deploy/LISEZMOI.md, étape 8, puis étape 3 nonies). Rien à ajouter dansappsettings.Production.json: les formulaires sont écrits à côté du trousseau. -
nginx : ajouter
- le bloc
location = /catalog/feedback-forms.jsondeserver/deploy/nginx-catalog.conf(lecture par les launchers) ; - le bloc
location = /api/v1/feedback/formsdeserver/deploy/nginx-api.conf(publication, 300 Ko : sans lui, une publication de plus de 64 Ko est refusée, par exemple avec plusieurs icônes importées) ;
puis
sudo nginx -t && sudo systemctl reload nginx. - le bloc
-
Launcher 3.2.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
feedback.forms(« Formulaires des demandes ») 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 « formulaires des demandes » apparaît, signalée « AUTORISATIONS ÉLARGIES » par
tools\sign-keyring.bat: c'est attendu.
- page Groupes et permissions : donner
-
Publier depuis le menu, page « Formulaires des demandes ».
- Compatibilité : les launchers 3.0 / 3.1 continuent d'envoyer leurs demandes avec les formulaires d'origine : acceptées, sauf pour un type masqué ou supprimé depuis. Tant que rien n'est publié, rien ne change pour les joueurs.
- Administrateurs : aucune action, hors permission ci-dessus.
- Joueurs : mise à jour automatique, aucune action requise.
- RGPD : si un nouveau type ou un nouveau champ collecte un autre type d'information, compléter la fiche du traitement « Demandes d'aide et retours des joueurs ». Les formulaires eux-mêmes ne contiennent aucune donnée de joueur.
🔏 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.2.0 in #135
Contributors
Full Changelog: v3.1.0...v3.2.0
Downloads
-
Launcher Version 3.1.0 Stable
released this
2026-11-09 16:46:23 +01:00 | 59 commits to master since this release🖥️ Launcher 3.1.0 — Captures d'écran et liens signalés dans les demandes des joueurs
Les demandes des joueurs gagnent les captures d'écran : depuis le bouton Aide, un joueur peut joindre jusqu'à 3 images (fichier ou Ctrl+V). Chaque image est contrôlée et débarrassée de ses métadonnées (ni position GPS, ni appareil, ni date), par le launcher puis par le serveur.
Côté administration, une demande contenant un lien (http, https, www, domaine, adresse IP, e-mail, formes déguisées…) est désormais signalée par un avertissement, liens désamorcés et jamais cliquables. Le journal d'audit affiche des libellés lisibles pour les actions des demandes, et la fenêtre « Aide » reste centrée avec un ascenseur. Serveur à redéployer et un bloc nginx à ajouter (voir Mise à niveau).
✨ En bref
Changement 🆕 Nouveau Captures d'écran jointes à une demande (3 au plus, fichier ou Ctrl+V) : vraie image exigée, PNG ou JPEG seulement, sans métadonnées 🆕 Nouveau Fiche d'une demande : captures d'écran (miniature, agrandissement), revérifiées avant l'affichage ⚠️ Nouveau Avertissement « lien » dans le menu : icône dans la liste, bandeau dans la fiche, liens désamorcés et jamais cliquables 🔧 Amélioré Journal d'audit : « Demande de joueur reçue », « … consultée », « … traitée »… au lieu de feedback.submit,feedback.view… ; catégorie « Demandes des joueurs »🔧 Amélioré Fenêtre « Aide » : centrée à chaque étape, formulaire long (Bug) avec ascenseur au lieu de déborder en bas de l'écran 🛡️ Sécurité Image contrôlée deux fois (launcher et serveur) ; envoi autorisé par un jeton propre à la demande ; plafond porté à 1 Go 🖧 Serveur À redéployer, avec un nouveau bloc nginx pour les captures (voir Mise à niveau) 🧰 Outils tools\ui-snapshot.batcapture désormais la fenêtre « Aide » et la fiche d'une demande🧪 Qualité 30 nouveaux tests automatisés (342 au total)
🖼️ Captures d'écran (joueurs)
Dans le formulaire du bouton Aide, une nouvelle section « Captures d'écran (facultatif) » apparaît sous les champs, pour tous les types de demande.
Action Comportement Ajouter une image… Choix d'un fichier PNG, JPEG, BMP, GIF ou WebP (30 Mo au plus) dans l'explorateur Windows (dossier Images par défaut) Coller (Ctrl+V) Image du presse-papiers, après Impr. écran ou Win+Maj+S. Ctrl+V fonctionne même depuis un champ de texte, quand le presse-papiers contient une image et pas de texte Miniatures Une vignette par image (dimensions et format), bouton « Retirer cette capture » (croix) avant l'envoi Après l'envoi Si une capture n'a pas pu être envoyée, un avertissement le précise : la demande, elle, est bien enregistrée Chaque image passe par ces étapes avant l'envoi :
- Format reconnu au contenu, jamais à l'extension : un fichier renommé en
.pngest refusé. - Dimensions lues avant le décodage : une image démesurée est refusée sans être chargée en mémoire.
- Décodage par Windows : preuve que c'est réellement une image.
- Réduction à 3 840 px de côté au plus (et sous la surface acceptée par le serveur).
- Réencodage en PNG (ou en JPEG pour une photo, ou si le PNG dépasse 4 Mo) sans aucune métadonnée : ni position GPS, ni appareil photo, ni date, ni logiciel.
Le nom du fichier n'est jamais envoyé : il n'est affiché qu'au joueur.
🗂️ Page « Demandes des joueurs » (administration)
Élément Comportement Liste Nouvelles icônes : image (la demande a des captures, nombre en info-bulle) et alerte (la demande contient un lien) Captures d'écran Section « Captures d'écran » dans la fiche : miniatures, « Agrandir » / « Réduire », dimensions, format et taille. Chaque image est revérifiée par le launcher (structure, dimensions) avant l'affichage ; rien n'est écrit sur le PC de l'administrateur Liens Bandeau d'avertissement en haut de la fiche (« n'ouvrez pas ces liens et ne les copiez pas dans un navigateur… En cas de doute, supprimez la demande ») listant les liens désamorcés ( hxxps[://]site[.]com), et champs concernés surlignés. Les liens ne sont jamais cliquables🔗 Formes de liens reconnues
Forme Exemples Adresses avec protocole http://,https://,ftp://,file:Protocoles dangereux javascript:,data:,vbscript:,ms-…:,steam:…Sans protocole www.site.com, domaines nus avec une extension connue (site.ru,discord.gg/…,bit.ly/…)Adresses techniques adresses IP, chemins réseau \\serveur\partage, adresses e-mailFormes déguisées hxxp,[.],(dot),dot, caractères « pleine chasse » (https://)Un texte ordinaire (« 3 FPS à 1920×1080 », « le log fait 2 Mo ; Windows 11 ») ne déclenche pas d'alerte.
📜 Journal d'audit lisible
Les nouvelles actions s'affichent avec un libellé en français, et une catégorie « Demandes des joueurs » permet de les filtrer.
Action Libellé affiché feedback.submitDemande de joueur reçue feedback.attachmentCapture d'écran reçue feedback.viewDemande de joueur consultée feedback.updateDemande de joueur traitée (statut ou note) feedback.deleteDemande de joueur supprimée feedback.purgeAnciennes demandes supprimées (conservation) audit.purgeAnciens mois du journal supprimés (conservation) keyring.publishTrousseau de signature publié release.signVersion en ligne signée - Nouvelle catégorie « Signature (trousseau) » ; la catégorie du journal devient « Journal d'audit (consultations, exports, purges) ».
🪟 Fenêtre « Aide »
- La fenêtre reste centrée quand on passe du choix du type au formulaire, puis à la référence : elle ne déborde plus vers le bas de l'écran.
- La zone du formulaire a une hauteur de base de 500 px (moins sur un petit écran) : un formulaire long, comme Bug, défile avec un ascenseur.
- Chaque nouvelle étape repart du haut du formulaire.
- Molette : elle fait défiler le formulaire, jamais une liste déroulante fermée (catégorie, gravité… ne changent plus par mégarde) ; un champ de texte arrivé en bout de course laisse défiler le formulaire. Même comportement que le menu d'administration.
🛡️ Sécurité
Menace Défense Fichier piégé déguisé en image Le serveur n'accepte que de vrais PNG ou JPEG, contrôlés sans bibliothèque de décodage : PNG (blocs et sommes de contrôle CRC, données décompressées et taille exacte de chaque ligne, filtres) ; JPEG (marqueurs, tables, début et fin d'image). Rien n'est accepté après la fin de l'image ; 16 à 4 096 px de côté, 4 Mo au plus Métadonnées personnelles Retirées par le launcher puis par le serveur : blocs facultatifs PNG (textes, EXIF, profils…), segments JPEG APP1 à APP15 (EXIF, XMP, GPS) et commentaires Capture envoyée hors d'une demande Jeton d'envoi remis par le serveur avec la demande : 128 bits, valable 15 minutes, pour cette demande et le nombre de captures annoncé seulement ; seule son empreinte est gardée, en mémoire ; comparaison à temps constant Disque rempli 3 captures de 4 Mo au plus par demande ; plafond global porté de 100 Mo à 1 Go (captures comprises) ; 500 Mo d'espace libre minimum Image piégée côté administrateur Capture servie en octets bruts ( nosniff), redécodée et revérifiée par le launcher avant l'affichage, jamais écrite sur le disqueLien malveillant dans une demande Signalé, désamorcé, jamais cliquable Jeton de session volé Inchangé : statut, note et suppression restent des requêtes signées par la clé de l'administrateur (horodatage et nonce, rejeu refusé), comme tout le menu ; les lectures (liste, fiche, captures) exigent la session et feedback.read, revérifiées à chaque requête et inscrites au journal🔒 Vie privée
- Captures sans métadonnées ; nom du fichier jamais envoyé.
- Audit
feedback.attachmentsans adresse IP, commefeedback.submit. - nginx n'écrit pas la route d'envoi des captures dans ses journaux (
access_log off), comme les deux autres routes des joueurs. - Captures supprimées avec leur demande (suppression manuelle ou purge automatique).
🗄️ Choix du stockage
Les captures sont des fichiers
<id>-<n>.png|jpgrangés à côté du JSON de leur demande, dans les données privées du serveur (0700/0600), écrits de façon atomique. SQLite a été écarté pour les captures : des images stockées en base alourdiraient les sauvegardes et la purge, sans gain de sécurité.
🧰 Outil de débogage
ui-snapshotScène Contenu feedback-kindChoix du type de demande feedback-reviewAvis noté (étoiles) feedback-bugBug rempli avec une capture d'écran ; formulaire qui défile (pages .p2.png…)feedback-bug-errorsBug, champs obligatoires signalés feedback-doneDemande envoyée, avec l'avertissement d'une capture refusée admin-page-feedback-requests-detailFiche d'une demande : lien signalé, captures d'écran - L'API simulée connaît les routes des demandes (six demandes d'exemple : tous les types et statuts, titre très long, liens, captures).
- Envoi simulé et images de démonstration dessinées par l'outil : aucun fichier choisi, presse-papiers intact.
tools/UiSnapshot/LISEZMOI.md: nouvelle section « Tenir l'outil à jour » (chaque nouvelle fenêtre ou nouveau menu s'y ajoute dans la même modification).
🧪 Tests
Fichier Tests Contracts/FeedbackContentTests.cs(nouveau)25 : liens sous toutes leurs formes (http, https, www, domaines, IP, chemins réseau, e-mails, protocoles dangereux, formes déguisées, pleine chasse), texte ordinaire sans fausse alerte, désamorçage, métadonnées PNG et JPEG (EXIF, commentaires) retirées, fausses images ou images abîmées refusées, formats reconnus au contenu Server/FeedbackModuleTests.cs+3 : captures (jeton, numéro, délai, vraie image, métadonnées retirées, lecture par le menu, suppression avec la demande), capture refusée sans perte de la demande, demandes avec liens signalées Admin/FeedbackPanelTests.cs+2 : captures du joueur jusqu'au menu (refus d'un faux fichier et d'un presse-papiers vide, avertissement « lien », agrandissement), libellés du journal d'audit 342 tests au vert.
📂 Fichiers modifiés
Contrats
src/GameLauncher.Contracts/Feedback/FeedbackLinks.cs(nouveau)src/GameLauncher.Contracts/Feedback/FeedbackImages.cs(nouveau)src/GameLauncher.Contracts/Feedback/FeedbackDtos.cssrc/GameLauncher.Contracts/Feedback/FeedbackRules.cssrc/GameLauncher.Contracts/ApiRoutes.cs
Client de l'API
src/GameLauncher.ApiClient/LauncherApiClient.cssrc/GameLauncher.ApiClient/AdminSession.cs
Serveur
server/GameLauncher.Server/Modules/Feedback/FeedbackModule.csserver/GameLauncher.Server/Security/FeedbackGuard.csserver/GameLauncher.Server/Storage/FeedbackStore.csserver/GameLauncher.Server/Storage/SecureFiles.csserver/GameLauncher.Server/Hosting/LauncherApiOptions.csserver/GameLauncher.Server/appsettings.json
Déploiement
server/deploy/nginx-api.confserver/deploy/LISEZMOI.md
Module « Aide »
src/GameLauncher.Modules.Feedback/FeedbackAttachments.cs(nouveau)src/GameLauncher.Modules.Feedback/FeedbackFormViewModel.cs
Menu d'administration
src/GameLauncher.Modules.Admin/Feedback/FeedbackItems.cssrc/GameLauncher.Modules.Admin/Feedback/FeedbackPanelViewModel.cssrc/GameLauncher.Modules.Admin/Audit/AuditPanelViewModel.cs
Launcher (WPF)
src/GameLauncher/Services/ScreenshotSource.cs(nouveau)src/GameLauncher/Services/FeedbackWindowService.cssrc/GameLauncher/Views/FeedbackWindow.xamlsrc/GameLauncher/Views/FeedbackWindow.xaml.cssrc/GameLauncher/Controls/AdminAssist.cssrc/GameLauncher/Themes/Admin.xamlsrc/GameLauncher/GameLauncher.csproj(version 3.1.0)
Outil ui-snapshot
tools/UiSnapshot/Scenes/FeedbackScenes.cs(nouveau)tools/UiSnapshot/Scenes/AdminScenes.cstools/UiSnapshot/Fakes/FakeApi.cstools/UiSnapshot/Fakes/SampleData.cstools/UiSnapshot/SnapshotRunner.cstools/UiSnapshot/LISEZMOI.mdtools/UiSnapshot/UiSnapshot.csproj
Tests
tests/GameLauncher.Tests/Contracts/FeedbackContentTests.cs(nouveau)tests/GameLauncher.Tests/Server/FeedbackModuleTests.cstests/GameLauncher.Tests/Admin/FeedbackPanelTests.cs
Documentation et notes
README.mddocs/ADMIN-ARCHITECTURE.mdtools/notes-launcher.txt
⬆️ Mise à niveau
Ordre conseillé : serveur d'abord, launcher ensuite. Un launcher 3.1.0 relié à un serveur 3.0.0 envoie bien les demandes, mais sans leurs captures : le joueur voit l'avertissement « … capture(s) sur … n'ont pas pu être envoyées. La demande, elle, est bien enregistrée. »
- Serveur (Launcher API) : à redéployer (
server/deploy/LISEZMOI.md, étape 8, puis étape 3 octies) :- nginx : ajouter le troisième bloc
location ^~ /api/v1/feedback/attachments/deserver/deploy/nginx-api.conf(corps de 5 Mo,access_log off, même zonefeedback_par_ip) à côté des deux blocs/api/v1/feedback…de la 3.0.0 ;sudo nginx -t && sudo systemctl reload nginx; - si
Feedback:MaxTotalMegabytesa été fixé dansappsettings.Production.json, le porter à 1024 (captures comprises) ; sinon, rien à faire ; sudo systemctl restart launcher-api(les sessions ouvertes sont fermées : reconnexion).
- Bloc nginx indispensable : sans lui, les captures passent par le bloc
/api/général, qui les refuse (corps limité à 64 Ko) et journalise l'adresse IP de la requête. Les demandes, elles, arrivent normalement.
- nginx : ajouter le troisième bloc
- Administrateurs : aucune action ; les permissions
feedback.readetfeedback.managedonnent accès aux captures. - Joueurs : mise à jour automatique, aucune action requise.
- RGPD : compléter la fiche du traitement « Demandes d'aide et retours des joueurs » : captures d'écran facultatives, sans métadonnées, conservées et supprimées avec la demande. Rappeler dans la politique de confidentialité de ne pas joindre d'image contenant des données personnelles.
🔏 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.1.0 in #133
Contributors
Full Changelog: v3.0.0...v3.1.0
Downloads
- Format reconnu au contenu, jamais à l'extension : un fichier renommé en
-
Launcher Version 3.0.0 Stable
released this
2026-11-09 15:09:38 +01:00 | 72 commits to master since this release🖥️ Launcher 3.0.0 — Bouton « Aide » et demandes des joueurs
Première fonction tournée vers les joueurs depuis le menu d'administration : un bouton Aide permet d'envoyer, sans compte, un avis, une demande d'évolution, un bug ou autre chose, pour le jeu sélectionné. Chaque type a ses propres champs (note en étoiles, gravité, étapes pour reproduire…), et le joueur reçoit une référence à citer.
Côté administration, une nouvelle page « Demandes des joueurs » range les demandes par jeu, avec statut et note interne. Les demandes sont anonymes : aucun compte, aucune adresse IP enregistrée. Le journal d'audit est désormais purgé automatiquement au-delà de 12 mois. Serveur à redéployer et à configurer avant de publier cette version (voir Mise à niveau).
✨ En bref
Changement 🆕 Nouveau Bouton Aide dans la barre de titre : avis, demande d'évolution, bug ou autre, pour le jeu sélectionné 🆕 Nouveau Formulaires à champs prédéfinis selon le type, contrôlés avant l'envoi ; référence FB-XXXX-XXXXremise au joueur🆕 Nouveau Page d'administration « Demandes des joueurs » : choix du jeu, filtres, fiche, statut, note interne, suppression 🆕 Nouveau Carte « Demandes des joueurs » sur le tableau de bord (nouvelles demandes par jeu) 🆕 Nouveau Purge automatique : demandes (12 mois après clôture, 24 mois au plus) et journal d'audit (12 mois) 🛡️ Sécurité Première route d'envoi ouverte à tous : défi anti-spam, limites par adresse, plafonds, contrôle complet du contenu 🛡️ Vie privée Demandes anonymes : ni compte, ni adresse IP, ni identifiant du PC ; informations techniques facultatives et affichées avant l'envoi 🖧 Serveur Nouveau module Feedback, nouvelles permissions : à redéployer et à configurer (voir Mise à niveau)🧪 Qualité 30 nouveaux tests automatisés (312 au total)
💬 Bouton « Aide » (joueurs)
Le bouton (bulle avec un point d'interrogation) se trouve dans la barre de titre, à gauche du bouton « Site officiel ». Il est le même pour tous les jeux : la demande est rattachée au jeu sélectionné dans la liste de gauche au moment de l'ouverture, affiché en en-tête (« Demande pour : … ») et non modifiable pendant la saisie.
Étape Contenu 1. Type Quatre tuiles : Avis, Demande d'évolution, Bug, Autre 2. Formulaire Titre + champs prédéfinis du type ; compteur de caractères ; erreurs signalées sous chaque champ 3. Envoyée Message de remerciement et référence FB-XXXX-XXXX(bouton « Copier »)Champs prédéfinis (* obligatoire)
Type Champs ⭐ Avis Note de 1 à 5 étoiles* ; sujet* (le jeu dans son ensemble, gameplay, graphismes, son et musique, performances, histoire et ambiance, launcher, autre) ; ce que vous aimez ; ce qui pourrait être amélioré ; recommanderiez-vous le jeu ? (oui / peut-être / non) 💡 Demande d'évolution Domaine* (gameplay, contenu, interface et menus, accessibilité, launcher, autre) ; description de l'idée* ; quel problème cela résoudrait-il ? ; importance (un petit plus / utile / importante) 🐞 Bug Catégorie* (plantage, graphismes, son, gameplay, performances, installation ou mise à jour, launcher, autre) ; gravité* (mineur / gênant / bloquant / plantage) ; fréquence* (à chaque fois / souvent / parfois / une seule fois) ; étapes pour reproduire* ; résultat attendu ; résultat obtenu* 💬 Autre Message* - Informations techniques (case à cocher) : version du launcher, version du jeu installée, version de Windows, langue. Le contenu exact est affiché avant l'envoi. La case est cochée par défaut pour un bug seulement.
- Contrôle avant l'envoi, avec les mêmes règles que le serveur : titre de 5 à 120 caractères, textes de 2 000 caractères et 40 lignes au plus, 8 000 caractères au total.
- Saisie conservée en cas d'échec (pas de réseau, serveur occupé…) : il suffit de cliquer de nouveau sur « Envoyer ». « Changer de type » garde aussi la saisie du type en cours.
- Échap ne ferme pas la fenêtre pendant la saisie (pas de texte perdu par mégarde).
- Le launcher ne contacte le serveur qu'au moment de l'envoi, jamais en arrière-plan.
- Pas de réponse possible : la demande est anonyme. Un futur module « comptes joueurs » permettra d'échanger avec l'équipe sur les nouvelles demandes ; celles envoyées d'ici là resteront anonymes.
- Bouton absent si le launcher n'a pas d'adresse d'API (
apiUrldelauncher.json).
🗂️ Page « Demandes des joueurs » (administration)
Élément Comportement Choix du jeu Une tuile par jeu, avec « N nouvelles · N à traiter · N au total » ; un seul jeu : choisi d'office. Les demandes d'un jeu ne se mélangent jamais à celles d'un autre Filtres Type ; statut (« À traiter » par défaut, nouvelles, en cours, closes, traitées, rejetées, doublons, toutes) ; recherche dans le titre ou la référence Liste Les plus récentes d'abord, 100 par page (« Charger plus ») ; point orange = nouvelle ; note (avis) ou gravité (bug) en aperçu Fiche Tous les champs avec leurs libellés, en texte brut (sélectionnable, jamais interprété) ; informations techniques ; référence copiable Traitement Statut Nouvelle → En cours → Traitée / Rejetée / Doublon ; note interne (500 caractères, visible des seuls administrateurs) ; suppression définitive après confirmation Bandeaux Réception désactivée sur le serveur ; plafond atteint ; demande modifiée par un autre administrateur (rien n'est écrasé, « Recharger ») Tableau de bord Carte « Demandes des joueurs » : nouvelles demandes par jeu, icône orange s'il y en a Permissions
Permission Propriétaire Administrateur Éditeur Usage feedback.read✔ ✔ Lire les demandes (chaque consultation est inscrite au journal) feedback.manage✔ ✔ Statut, note interne, suppression ⚠️ Serveur déjà installé : le groupe Propriétaire reçoit ces permissions d'office, mais pas les autres groupes existants. Aucun droit n'est ajouté sans l'action d'un propriétaire : page « Groupes et permissions » › « Administrateur » › cocher les deux permissions. L'Éditeur n'y a pas accès par défaut, car le texte libre peut contenir des données personnelles.
🗑️ Conservation et purge automatique
Le serveur applique ces durées au démarrage puis toutes les 24 heures :
Données Durée Réglage Journal Demande close (traitée, rejetée, doublon) 12 mois après la clôture Feedback:RetentionClosedMonthsfeedback.purgeToute demande 24 mois après réception Feedback:RetentionMaxMonthsfeedback.purgeJournal d'audit ( audit-AAAA-MM.jsonl)12 mois Audit:RetentionMonths(1 à 120)audit.purge- Cette purge corrige l'écart RGPD relevé sur le journal d'audit, qui était conservé sans limite. La CNIL recommande 6 mois à 1 an pour les journaux de sécurité.
- Un fichier mensuel d'audit est supprimé quand tous ses jours dépassent la durée : le mois le plus ancien conservé peut donc compter quelques semaines de plus.
🛡️ Sécurité
C'est la première route d'écriture ouverte à tous. Elle est désactivée par défaut, et le serveur reste seul juge : un launcher modifié ou un script ne contourne rien.
Menace Défense Spam, robots Défi anti-spam (calcul SHA-256, une fraction de seconde pour le joueur) sans état, à usage unique, valable 10 min ; aucun service tiers, aucun captcha Envois en rafale 3 demandes par 10 min et 10 par jour par adresse IP (IPv6 : par /64), comptées en mémoire seulement ; limite de débit ASP.NET (10/min) et nginx (6/min) ; 429 avec délai Disque rempli Corps de 16 Ko ; 300 demandes par jour et par jeu, 5 000 par jeu, 100 Mo au total, 500 Mo d'espace libre minimum ; au-delà, refus limité à ce module (503) Requête forgée Contrôle complet par le serveur, avec les mêmes règles que le launcher ; identifiant, référence, date et statut posés par le serveur Texte piégé Caractères de contrôle, invisibles, de mise en forme, d'inversion du sens d'écriture, d'usage privé et demi-caractères refusés ; affichage en texte brut dans le menu Chemin forgé Jeu accepté seulement s'il est configuré ; seul l'identifiant de la configuration sert à construire un chemin ( .et..refusés)Lecture non autorisée Permissions revérifiées à chaque requête ; consultations inscrites au journal ( feedback.view), sans le contenuJeton de session volé Statut, note et suppression en requêtes signées par la clé de l'administrateur 🔒 Vie privée
- Aucune adresse IP n'est enregistrée avec une demande, ni dans l'audit de son envoi (
feedback.submit: référence, jeu, type). - nginx n'écrit pas les deux routes des joueurs dans ses journaux (
access_log off) : l'heure d'envoi ne peut pas être rapprochée d'une adresse. - Aucun identifiant du PC n'est envoyé : ni nom du PC, ni nom d'utilisateur, ni chemin, ni matériel. Agent utilisateur générique
GameLauncher/<version>. - Stockage dans les données privées du serveur (
/var/lib/launcher-api/feedback, droits 0700/0600), jamais servi par nginx.
🗄️ Choix du stockage
Un fichier JSON par demande, rangé par jeu et par mois, écrit de façon atomique. Un index est gardé en mémoire.
SQLite a été évalué et écarté pour ce module, pour trois raisons :
- les volumes sont plafonnés et il n'y a aucune relation entre les données ;
- une demande se modifie seule, et la purge revient à supprimer des fichiers ;
- SQLite ajouterait une bibliothèque native à maintenir sur le VPS, sans gain de sécurité.
Il sera réévalué pour le futur module « comptes + échanges » (
docs/ADMIN-ARCHITECTURE.md, § 11 quinquies).
🧪 Tests
Fichier Tests Contracts/FeedbackRulesTests.cs(nouveau)12 : formulaires cohérents, texte normalisé, caractères invisibles ou spéciaux refusés, bornes, preuve anti-spam, références, validation complète Server/FeedbackModuleTests.cs(nouveau)14 : réception désactivée par défaut, demande anonyme enregistrée sans adresse IP, défi obligatoire et à usage unique, jeux acceptés ( ..,., inconnu), contenu refusé, limites par adresse, plafond, statut et note signés et journalisés, Éditeur sans accès, pages et filtres, purge des demandes et du journal d'auditAdmin/FeedbackPanelTests.cs(nouveau)4 : formulaire du joueur (contrôle local, envoi, référence ; saisie conservée en cas d'échec ; étoiles et choix facultatifs), page d'administration de bout en bout (tableau de bord, choix du jeu, fiche, traitement, filtres, suppression) 312 tests au vert.
📂 Fichiers modifiés
Contrats
src/GameLauncher.Contracts/Feedback/FeedbackForms.cs(nouveau)src/GameLauncher.Contracts/Feedback/FeedbackRules.cs(nouveau)src/GameLauncher.Contracts/Feedback/FeedbackProof.cs(nouveau)src/GameLauncher.Contracts/Feedback/FeedbackDtos.cs(nouveau)src/GameLauncher.Contracts/ApiRoutes.cssrc/GameLauncher.Contracts/Dtos/SystemDtos.cssrc/GameLauncher.Contracts/Security/AdminPermissions.cssrc/GameLauncher.Contracts/Security/AdminRoles.cssrc/GameLauncher.Contracts/Security/AdminGroups.cs
Client de l'API
src/GameLauncher.ApiClient/LauncherApiClient.cssrc/GameLauncher.ApiClient/AdminSession.cs
Serveur
server/GameLauncher.Server/Modules/Feedback/FeedbackModule.cs(nouveau)server/GameLauncher.Server/Security/FeedbackGuard.cs(nouveau)server/GameLauncher.Server/Storage/FeedbackStore.cs(nouveau)server/GameLauncher.Server/Hosting/RetentionService.cs(nouveau)server/GameLauncher.Server/Hosting/LauncherApiOptions.csserver/GameLauncher.Server/Hosting/ServerApp.csserver/GameLauncher.Server/Hosting/IApiModule.csserver/GameLauncher.Server/Storage/AuditLog.csserver/GameLauncher.Server/appsettings.json
Déploiement
server/deploy/nginx-api.confserver/deploy/LISEZMOI.md
Module « Aide » (nouveau projet)
src/GameLauncher.Modules.Feedback/GameLauncher.Modules.Feedback.csproj(nouveau)src/GameLauncher.Modules.Feedback/FeedbackFormViewModel.cs(nouveau)src/GameLauncher.Modules.Feedback/FeedbackFieldViewModel.cs(nouveau)src/GameLauncher.Modules.Feedback/FeedbackTech.cs(nouveau)GameLauncher.sln
Menu d'administration
src/GameLauncher.Modules.Admin/Feedback/FeedbackAdminModule.cs(nouveau)src/GameLauncher.Modules.Admin/Feedback/FeedbackPanelViewModel.cs(nouveau)src/GameLauncher.Modules.Admin/Feedback/FeedbackItems.cs(nouveau)src/GameLauncher.Modules.Admin/ViewModels/DashboardPanelViewModel.cs
Launcher (WPF)
src/GameLauncher/Views/FeedbackWindow.xaml(nouveau)src/GameLauncher/Views/FeedbackWindow.xaml.cs(nouveau)src/GameLauncher/Services/FeedbackWindowService.cs(nouveau)src/GameLauncher/Views/MainWindow.xamlsrc/GameLauncher/Views/MainWindow.xaml.cssrc/GameLauncher/ViewModels/LauncherViewModel.cssrc/GameLauncher/Themes/Icons.xamlsrc/GameLauncher/Themes/Admin.xamlsrc/GameLauncher/App.xaml.cssrc/GameLauncher/GameLauncher.csproj(version 3.0.0, référence au module « Aide »)
Tests
tests/GameLauncher.Tests/Contracts/FeedbackRulesTests.cs(nouveau)tests/GameLauncher.Tests/Server/FeedbackModuleTests.cs(nouveau)tests/GameLauncher.Tests/Admin/FeedbackPanelTests.cs(nouveau)tests/GameLauncher.Tests/GameLauncher.Tests.csproj
Documentation et notes
README.mddocs/ADMIN-ARCHITECTURE.mdtools/notes-launcher.txt
⬆️ Mise à niveau
Ordre conseillé : serveur d'abord, launcher ensuite. Un launcher 3.0.0 relié à un serveur pas encore à jour, ou dont la réception n'est pas activée, affiche le bouton « Aide » ; l'envoi répond alors « L'envoi des demandes n'est pas disponible pour le moment ».
- Serveur (Launcher API) : à redéployer et à configurer (
server/deploy/LISEZMOI.md, étape 8, puis étape 3 octies) :appsettings.Production.json› sectionLauncherApi:"Feedback": { "Enabled": true, "Games": [ "EZR" ] }(réception désactivée par défaut) ;- nginx : zone
limit_req_zone $binary_remote_addr zone=feedback_par_ip:10m rate=6r/m;dans/etc/nginx/conf.d/securite.conf, puis les deux blocslocation = /api/v1/feedback…deserver/deploy/nginx-api.conf;sudo nginx -t && sudo systemctl reload nginx; sudo systemctl restart launcher-api(les sessions ouvertes sont fermées : reconnexion).
- La purge du journal d'audit s'applique dès le premier démarrage : les fichiers de plus de 12 mois sont supprimés. Pour les garder plus longtemps, régler
Audit:RetentionMonthsavant le redéploiement. Une permission personnalisée nomméefeedback.readoufeedback.manageempêcherait le démarrage : la supprimer avant.
- Administrateurs : un propriétaire donne
feedback.readetfeedback.manageau groupe « Administrateur » (page « Groupes et permissions »). Puis menu d'administration › « Demandes des joueurs » › le jeu. - Joueurs : mise à jour automatique depuis la 2.5.0, aucune action requise. Le bouton « Aide » apparaît dans la barre de titre.
- RGPD : ajouter au registre des traitements « Demandes d'aide et retours des joueurs ». Base légale : intérêt légitime. Pas d'adresse IP. Durées : 12 mois après clôture, 24 mois au plus. Le mentionner aussi dans la politique de confidentialité.
🔏 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.0.0 in #131
Contributors
Full Changelog: v2.5.0...v3.0.0
Downloads
-
Launcher Version 2.5.0 Stable
released this
2026-11-08 15:56:14 +01:00 | 84 commits to master since this release🖥️ Launcher 2.5.0 — Plein écran et nom des appareils dans l'audit
Version d'affichage : la fenêtre du launcher et le menu d'administration peuvent maintenant s'agrandir sur tout l'écran, la barre des tâches restant visible. Leur mise en page s'adapte à la place disponible, sur grand comme sur petit écran, sans texte ni bouton coupé.
Côté administration, le journal d'audit indique désormais chaque appareil sous le nom choisi lors de l'invitation, et non plus sous le nom Windows du PC. Serveur à redéployer pour en profiter.
✨ En bref
Changement 🆕 Nouveau Plein écran pour la fenêtre du launcher et le menu d'administration : bouton entre « Réduire » et « Fermer », ou F11 🆕 Nouveau Le mode choisi (plein écran ou fenêtré) est retenu pour la fois suivante 💡 Amélioré Mise en page adaptée à la taille de l'écran : plus de place en plein écran, rien de coupé sur un petit écran 💡 Amélioré Journal d'audit : colonne « Appareil » dans l'export CSV, recherche par nom d'appareil 🐛 Corrigé Le journal d'audit affichait le nom Windows du PC au lieu du nom de l'appareil choisi à l'invitation 🛡️ Sécurité Le nom Windows du PC n'est plus envoyé au serveur ni conservé 🖧 Serveur Nom des appareils dans le journal d'audit : à redéployer (voir Mise à niveau) 🧪 Qualité 1 nouveau test automatisé (282 au total)
🖥️ Plein écran
Deux modes seulement, pour la fenêtre principale et le menu d'administration :
Mode Comportement Fenêtré Taille d'origine, coins arrondis et ombre ; toujours pas de redimensionnement par les bords ou les coins Plein écran La fenêtre s'agrandit comme une fenêtre Windows : tout l'écran où elle se trouve, barre des tâches visible (même en masquage automatique) ; ce n'est pas le plein écran exclusif d'un jeu - Bascule : bouton entre « Réduire » et « Fermer » (l'icône et l'info-bulle suivent le mode), ou touche F11.
- Le mode de chaque fenêtre est retenu pour la fois suivante (
window-modes.json, à côté delauncher-settings.json). - Une fenêtre réduite (barre des tâches ou icône près de l'horloge) revient dans son mode.
- Les autres fenêtres (paramètres, notes de version agrandies, messages) gardent leur taille fixe : elles ne contiennent pas assez d'informations pour le mériter.
📐 Mise en page adaptée à l'écran
Situation Effet Plein écran sur un grand écran Les notes de version s'élargissent (jusqu'à 560 px) ; les pages du menu d'administration utilisent toute la largeur Petit écran, mise à l'échelle Windows 125-150 % La fenêtre ne dépasse plus de l'écran ; si la place manque, le contenu est réduit d'un bloc, sans rien couper Présentation du jeu trop haute (description, liens et bandeau à la fois) Elle défile au lieu d'être coupée Plusieurs écrans Paramètres, notes agrandies et messages se limitent à l'écran de la fenêtre du launcher Menu d'administration
Élément Changement Messages d'erreur et de résultat Sur toute la largeur de la page (23 bandeaux) Pages en deux colonnes (« Jeux », « Notes de version », « Groupes et permissions ») Sur un très petit écran, la page entière défile en plus des deux colonnes : rien n'est coupé Navigation, titres, tableau de bord Libellés trop longs abrégés proprement (info-bulle pour le texte complet) Choix du jeu Liste à largeur souple Messages longs (boîtes de dialogue) Ils défilent, la fenêtre ne dépasse jamais l'écran 💡 Modulaire : une future page d'administration s'affiche dans la même fenêtre et profite du plein écran sans code supplémentaire. Une future fenêtre de module l'active avec deux attributs XAML. Règles de mise en page :
docs/ADMIN-ARCHITECTURE.md, § 5.3.
🏷️ Journal d'audit : nom des appareils
Jusqu'ici, à la connexion, le launcher envoyait « GameLauncher 2.4.1 (NOM-WINDOWS) » : c'est ce nom Windows qui apparaissait dans le journal, et non le nom de l'appareil choisi lors de l'invitation (« J'ai une invitation »).
Où Avant Maintenant Ligne « Connexion » GameLauncher 2.4.1 (DESKTOP-ABC123)appareil « PC bureau » · GameLauncher 2.5.0Chaque entrée liée à une clé IP et clé Appareil « PC bureau » · IP · clé Export CSV — Nouvelle colonne « Appareil » Recherche Nom, IP, clé Nom, appareil, IP, clé - Les anciennes entrées en profitent aussi : le nom de l'appareil est ajouté par le serveur à la lecture.
- Seules les lignes « Connexion » déjà écrites gardent leur texte d'origine : le journal n'est jamais réécrit (ajout seul).
🛡️ Sécurité
- Le nom Windows du PC n'est plus envoyé au serveur ; celui qu'envoient les launchers plus anciens est retiré par le serveur (ni journalisé, ni conservé dans la session).
- Le nom de l'appareil est ajouté par le serveur à la lecture, d'après
admins.json: il n'est jamais écrit dans les fichiers du journal, et ce champ ne peut venir que du serveur. - Export CSV : la nouvelle colonne suit les mêmes règles que les autres (cellules entre guillemets, aucune formule exécutée par le tableur).
window-modes.json: simple préférence d'affichage, sans donnée personnelle ; taille limitée, contenu vérifié, ignoré s'il est illisible.
🧪 Tests
Fichier Tests Server/AuditModuleTests.cs1 nouveau : nom de l'appareil choisi à l'enregistrement, nom Windows retiré d'un ancien launcher, jamais écrit dans le fichier du journal, absent pour une entrée sans clé Admin/AuditPanelTests.csComplété : colonne « Appareil » de l'export CSV, texte « Appareil « … » » de chaque entrée 282 tests au vert.
📂 Fichiers modifiés
Launcher (WPF) : plein écran et mise en page
src/GameLauncher/Controls/WindowModeAssist.cs(nouveau)src/GameLauncher/Controls/ScaleToFitDecorator.cs(nouveau)src/GameLauncher/Platform/WindowModeStore.cs(nouveau)src/GameLauncher/Themes/Controls.xamlsrc/GameLauncher/Themes/Icons.xamlsrc/GameLauncher/Themes/Admin.xamlsrc/GameLauncher/Converters/Converters.cssrc/GameLauncher/Views/MainWindow.xamlsrc/GameLauncher/Views/MainWindow.xaml.cssrc/GameLauncher/Views/Admin/AdminWindow.xamlsrc/GameLauncher/Views/Admin/AdminWindow.xaml.cssrc/GameLauncher/Views/ModernDialog.xamlsrc/GameLauncher/Views/ModernDialog.xaml.cssrc/GameLauncher/Views/ChangelogWindow.xaml.cssrc/GameLauncher/Views/SettingsWindow.xaml.cssrc/GameLauncher/Platform/WindowService.cssrc/GameLauncher/Services/AdminWindowService.cssrc/GameLauncher/App.xaml.cssrc/GameLauncher/GameLauncher.csproj(version 2.5.0)
Journal d'audit
src/GameLauncher.Contracts/Dtos/AuditDtos.cssrc/GameLauncher.Modules.Admin/Audit/AuditPanelViewModel.cssrc/GameLauncher.Modules.Admin/ViewModels/AdminEnvironment.cssrc/GameLauncher.Modules.Admin/Services/AdminLoginService.cs
Serveur
server/GameLauncher.Server/Modules/Auth/AuthModule.csserver/GameLauncher.Server/Modules/Audit/AuditModule.cs
Tests
tests/GameLauncher.Tests/Server/AuditModuleTests.cstests/GameLauncher.Tests/Admin/AuditPanelTests.cs
Documentation et notes
README.mddocs/ADMIN-ARCHITECTURE.mdtools/notes-launcher.txt
⬆️ Mise à niveau
- Joueurs : mise à jour automatique depuis la 2.4.1, aucune action requise. Le launcher démarre en mode fenêtré, comme avant ; F11 ou le nouveau bouton pour passer en plein écran.
- Serveur (Launcher API) : à redéployer (
server/deploy/LISEZMOI.md, étape 8 : étapes 1 et 2). Aucun réglage nouveau ; les sessions ouvertes sont fermées (reconnexion). Sans redéploiement, la colonne « Appareil » du journal reste vide. - Administrateurs : rien à faire. Le nom affiché pour un appareil est celui saisi dans « J'ai une invitation » (page « Mes appareils »).
🔏 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/2.5.0 in #125
Contributors
Full Changelog: v2.4.1...v2.5.0
Downloads