Refuser les modes de contrôle et versions de sauvegarde invalides #74

Closed
opened 2026-06-22 10:50:52 +00:00 by Reliodas · 0 comments
Owner

Party.from_save_data() convertit directement n’importe quel entier vers ControlMode. Une valeur 999 est actuellement acceptée. GameState._party_from_snapshot() accepte aussi toute version future format_version >= 1 comme si elle était compatible. Ces données peuvent produire des membres impossibles à piloter ou charger silencieusement un format inconnu.

Périmètre :

  • valider explicitement les valeurs de ControlMode ;
  • refuser une version de sauvegarde supérieure à la version supportée ;
  • valider la cohérence leader/actif sans repli silencieux ambigu ;
  • préserver l’application atomique : aucun champ de GameState ne change en cas de refus.

Critères d’acceptation :

  • seuls PLAYER, AUTO_ALLY et SCRIPTED_GUEST sont acceptés ;
  • une version future ou négative est refusée proprement ;
  • actif non vide avec leader absent/invalide suit un contrat explicite et testé ;
  • SaveManager.load_from_slot() renvoie faux sans altérer la partie courante ;
  • les sauvegardes 0.15.0 et 0.16.0 valides restent compatibles.

Tests automatisés à ajouter :

  • control_mode = -1 et 999 ;
  • version négative et version SAVE_FORMAT_VERSION + 1 ;
  • leader vide avec actif non vide, leader hors roster et ids dupliqués ;
  • pour chaque refus, vérifier Party, carte, positions et rencontres inchangés ;
  • migration réelle d’un fichier 0.15.0 conservée.
`Party.from_save_data()` convertit directement n’importe quel entier vers `ControlMode`. Une valeur 999 est actuellement acceptée. `GameState._party_from_snapshot()` accepte aussi toute version future `format_version >= 1` comme si elle était compatible. Ces données peuvent produire des membres impossibles à piloter ou charger silencieusement un format inconnu. Périmètre : - valider explicitement les valeurs de `ControlMode` ; - refuser une version de sauvegarde supérieure à la version supportée ; - valider la cohérence leader/actif sans repli silencieux ambigu ; - préserver l’application atomique : aucun champ de `GameState` ne change en cas de refus. Critères d’acceptation : - seuls PLAYER, AUTO_ALLY et SCRIPTED_GUEST sont acceptés ; - une version future ou négative est refusée proprement ; - actif non vide avec leader absent/invalide suit un contrat explicite et testé ; - `SaveManager.load_from_slot()` renvoie faux sans altérer la partie courante ; - les sauvegardes 0.15.0 et 0.16.0 valides restent compatibles. Tests automatisés à ajouter : - `control_mode = -1` et `999` ; - version négative et version `SAVE_FORMAT_VERSION + 1` ; - leader vide avec actif non vide, leader hors roster et ids dupliqués ; - pour chaque refus, vérifier Party, carte, positions et rencontres inchangés ; - migration réelle d’un fichier 0.15.0 conservée.
Reliodas added this to the 0.16.0 milestone 2026-06-22 10:50:52 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: jeux/beaulieu-sur-brume#74
No description provided.