Aller au contenu
Documentation
Sur cette page

Archives et protection

Un niveau s'exporte en dossier, en tar.gz ou en zip, avec un mot de passe en option : zip avec AES-256 ou OpenPGP. Le SDK détecte le format d'un fichier reçu par ses premiers octets, pas par son nom

Modes d'export

Un niveau quitte l'appareil sous l'une des formes de LevelExportMode :

ValeurModeCe qui est écritProtection
0Folderun dossier simple, de la même forme que sur le disqueaucune
1FolderProtectedLevelun dossier où seul level.json.gpg est chiffréOpenPGP
2TarGz<name>.tar.gzaucune
3TarGzProtected<name>.tar.gz.gpgOpenPGP
4Zip<name>.zipaucune
5ZipProtected<name>.zip.gpgOpenPGP
6ZipEncrypted<name>.zip avec des entrées en AES-256celle du zip

Le numéro est l'identité du mode, il ne change jamais. L'ordre dans la liste déroulante de l'éditeur est fixé à part (DisplayOrder)

Chaque format est un standard ouvert. tar -xzf, gpg -d et n'importe quel archiveur les ouvrent sans le jeu :

gpg -d level.tar.gz.gpg > level.tar.gz
tar -xzf level.tar.gz

Deux schémas de protection

ZipEncrypted est la façon par défaut de verrouiller un niveau par mot de passe. Le destinataire a un archiveur, mais très probablement pas gpg

OpenPGP verrouille un document, un dossier et une archive avec un seul schéma. Lui seul peut protéger un dossier

Dans FolderProtectedLevel, les métadonnées, la couverture et les médias restent lisibles. Le navigateur de niveaux affiche donc toujours la carte

L'extension intérieure reste dans le nom : level.json.gpg. C'est exactement le nom que gpg -c level.json donne au fichier, donc le format se reconnaît sans deviner

Ce qui va à l'intérieur

LevelArchiveBuilder déduit le contenu à partir du modèle, pas de la liste des fichiers du dossier. Un fichier auquel le niveau ne renvoie pas reste dehors. Le rapport indique combien de ces fichiers ont été laissés

Les références du niveau sont traitées ainsi :

  • une ressource en AbsolutePath est copiée dans l'archive. Sa référence est réécrite en LevelPath, mais seulement dans la copie exportée
  • DirectUrl reste tel quel et va dans le rapport : une URL ne peut pas voyager dans un fichier
  • un fichier manquant va dans le rapport avec le code archive.resource_missing

Détection par les octets

N'importe qui peut écrire un nom de fichier. C'est pourquoi ArchiveFormatSniffer décide d'après les 8 premiers octets :

Premiers octetsFormat
1F 8BTarGz
50 4B 03 04, 50 4B 05 06, 50 4B 07 08, 50 4B 30 30Zip
37 7A BC AF 27 1CSevenZip
une étiquette de paquet OpenPGP, vérifiée en dernierOpenPgp : déchiffré puis détecté à nouveau
Avertissement

.7z n'est ni lu ni écrit. Il est détecté uniquement pour que le refus le nomme (Unsupported). La personne recompresse alors le niveau en zip au lieu de conclure que le fichier est cassé

Lecture

LevelArchiveReader.ReadAsync prend un dossier ou un Stream avec accès aléatoire. Il renvoie LevelArchiveContent, où LevelArchiveOpenResult prend l'une de ces valeurs :

RésultatSignification
Oklu
PassphraseRequiredil n'y a pas de mot de passe, il faut le demander
WrongPassphrasela personne a déjà saisi un mot de passe, et il est faux
Damagedle fichier est endommagé
NotAnArchivece n'est pas une archive
Unsupportedle format est reconnu mais pas pris en charge

PeekMetaAsync ne lit que les métadonnées, pour une carte ou un catalogue

Un serveur lit ce que quelqu'un a choisi d'envoyer. Le lecteur travaille donc dans les limites de ArchiveLimits. Par défaut, ce sont :

  • 4096 entrées
  • 512 Mio par entrée
  • 1 Gio au total

Rien n'est décompressé en dehors du stockage qui lui a été donné

L'export du côté de l'éditeur - Export et protection