• v3.4.1 8fe67053e1

    nicolas 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.json est 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
    /launcher Fonctions 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-reborn Histoire, contenu, cassettes VHS, extension « L'abri » en développement, configuration
    /jeux/<jeu>/notes-de-version Toutes les notes de version du jeu
    /jeux/projet-multijoueur Jeu en préparation (page générique)
    /actualites Articles 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 lien mailto:, aucun formulaire.

    Ce que le site lit, et comment

    Fichier Usage Contrôles
    launcher/launcher-update.json Version, exécutable à télécharger, notes de la dernière version Signature ECDSA vérifiée (UpdateSignature, clé update-signing.pub inté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.json Version, 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. Liens javascript:, 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ête Server retiré.
    • Lecture seule : GET et HEAD seulement (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.bat Exe autonome linux-x64 (aucun .NET sur le VPS), archive + empreinte SHA-256
    website/deploy/installer-site.sh Archive vérifiée par son empreinte, binaires root dans /opt/lanisys-site, appsettings.Production.json conservé, sorties réseau recalculées (sortie.conf), retour à la version précédente si le site ne répond pas
    website/deploy/lanisys-site.service Compte 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ée
    website/deploy/nginx-site.conf Redirections 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.md Guide 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|webp Format des images (png par 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.html et report.md affichent 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 charge
    WebsiteNewsTests (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.json remplacerait celui de la Launcher API dans le dossier des tests).

    ⬆️ Mise à niveau

    1. 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).
    2. VPS du launcher, nginx, trousseau : aucune action.
    3. Site vitrine : website/deploy/LISEZMOI.md (VPS séparé, Debian 11 à 13), puis compléter appsettings.Production.json : adresse publique, contact, mentions légales.
    4. 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