-
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