• v3.2.0 97df0ba721

    nicolas 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.bat capture 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'origine
    Monter / 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 .ico obligatoire, en-tête vérifié, 1 Mo au plus
    Taille 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é (.png renommé, 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.forms Formulaires 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 .ico relu sans bibliothèque, réécrit en PNG neuf sans métadonnées, 20 Ko au plus, couvert par la signature, revérifié partout
    Publications 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 uniquement
    Fichier 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 .bak et 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-snapshot

    Scène Contenu
    admin-page-feedback-forms-edit Page « Formulaires des demandes » : champ ajouté et déplié, erreur « lien », avertissement « donnée personnelle », aperçu
    admin-page-feedback-forms-new-type Type ajouté avec une icône importée, captures d'écran désactivées, déplacé en tête
    feedback-custom-kinds Choix du type avec des formulaires publiés : ordre, type ajouté avec son icône, type masqué
    feedback-custom Formulaire 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ées
    Server/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.cs Autorisation inconnue mais bien formée acceptée dans le trousseau, autorisation mal formée refusée
    Admin/FeedbackPanelTests.cs Libellé 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.cs
    • src/GameLauncher.Contracts/Feedback/FeedbackRules.cs
    • src/GameLauncher.Contracts/Feedback/FeedbackDtos.cs
    • src/GameLauncher.Contracts/ApiRoutes.cs
    • src/GameLauncher.Contracts/Dtos/SystemDtos.cs
    • src/GameLauncher.Contracts/Security/AdminPermissions.cs
    • src/GameLauncher.Contracts/Security/AdminRoles.cs
    • src/GameLauncher.Contracts/Signing/ContentSigning.cs
    • src/GameLauncher.Contracts/Signing/Keyring.cs

    Confiance et client de l'API

    • src/GameLauncher.Core/Trust/ContentTrustService.cs
    • src/GameLauncher.ApiClient/AdminSession.cs

    Serveur

    • server/GameLauncher.Server/Storage/FeedbackFormsStore.cs (nouveau)
    • server/GameLauncher.Server/Storage/FeedbackStore.cs
    • server/GameLauncher.Server/Modules/Feedback/FeedbackModule.cs
    • server/GameLauncher.Server/Hosting/LauncherApiOptions.cs

    Déploiement

    • server/deploy/nginx-api.conf
    • server/deploy/nginx-catalog.conf
    • server/deploy/LISEZMOI.md

    Module « Aide »

    • src/GameLauncher.Modules.Feedback/FeedbackFormsService.cs (nouveau)
    • src/GameLauncher.Modules.Feedback/FeedbackFieldViewModel.cs
    • src/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.cs
    • src/GameLauncher.Modules.Admin/Feedback/FeedbackItems.cs
    • src/GameLauncher.Modules.Admin/Feedback/FeedbackPanelViewModel.cs
    • src/GameLauncher.Modules.Admin/Audit/AuditPanelViewModel.cs
    • src/GameLauncher.Modules.Admin/GameLauncher.Modules.Admin.csproj
    • src/GameLauncher.Modules/Admin/PlayerSigningCheck.cs

    Launcher (WPF)

    • src/GameLauncher/Themes/FeedbackForms.xaml (nouveau)
    • src/GameLauncher/Themes/Admin.xaml
    • src/GameLauncher/Views/FeedbackWindow.xaml
    • src/GameLauncher/Services/FeedbackWindowService.cs
    • src/GameLauncher/App.xaml
    • src/GameLauncher/App.xaml.cs
    • src/GameLauncher/GameLauncher.csproj (version 3.2.0)

    Outil ui-snapshot

    • tools/UiSnapshot/Scenes/AdminScenes.cs
    • tools/UiSnapshot/Scenes/FeedbackScenes.cs
    • tools/UiSnapshot/Fakes/FakeApi.cs
    • tools/UiSnapshot/Fakes/SampleData.cs
    • tools/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.cs
    • tests/GameLauncher.Tests/Signing/ContentSigningTests.cs

    Documentation et notes

    • README.md
    • docs/ADMIN-ARCHITECTURE.md
    • tools/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.

    1. Serveur (Launcher API) : à redéployer (server/deploy/LISEZMOI.md, étape 8, puis étape 3 nonies). Rien à ajouter dans appsettings.Production.json : les formulaires sont écrits à côté du trousseau.

    2. nginx : ajouter

      • le bloc location = /catalog/feedback-forms.json de server/deploy/nginx-catalog.conf (lecture par les launchers) ;
      • le bloc location = /api/v1/feedback/forms de server/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.

    3. Launcher 3.2.0 : le publier (mise à jour signée habituelle) et laisser aux joueurs le temps de le recevoir.

    4. Permission et trousseau :

      1. page Groupes et permissions : donner feedback.forms (« Formulaires des demandes ») au groupe concerné (le groupe Propriétaire l'a d'office ; Administrateur l'a sur une installation neuve seulement) ;
      2. re-signer le trousseau (étape 3 quinquies) : l'autorisation « formulaires des demandes » apparaît, signalée « AUTORISATIONS ÉLARGIES » par tools\sign-keyring.bat : c'est attendu.
    5. 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

    Contributors

    Full Changelog: v3.1.0...v3.2.0

    Downloads