Zum Inhalt springen
Dokumentation
Auf dieser Seite

Archive und Schutz

Ein Level wird als Ordner, tar.gz oder zip exportiert, auf Wunsch mit Passwort: zip mit AES-256 oder OpenPGP. Das SDK erkennt das Format einer empfangenen Datei an ihren ersten Bytes, nicht am Namen

Exportmodi

Ein Level verlässt das Gerät in einer der Formen von LevelExportMode:

WertModusWas geschrieben wirdSchutz
0Folderein einfacher Ordner, dieselbe Form wie auf der Festplattekeiner
1FolderProtectedLevelein Ordner, in dem nur level.json.gpg verschlüsselt istOpenPGP
2TarGz<name>.tar.gzkeiner
3TarGzProtected<name>.tar.gz.gpgOpenPGP
4Zip<name>.zipkeiner
5ZipProtected<name>.zip.gpgOpenPGP
6ZipEncrypted<name>.zip mit AES-256-Einträgender eigene von zip

Die Nummer ist die Identität des Modus, sie ändert sich nie. Die Reihenfolge in der Auswahlliste des Editors wird getrennt festgelegt (DisplayOrder)

Jedes Format ist ein offener Standard. tar -xzf, gpg -d und jedes Archivprogramm öffnen sie ohne das Spiel:

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

Zwei Schutzverfahren

ZipEncrypted ist der Standardweg, ein Level mit einem Passwort zu sperren. Der Empfänger hat ein Archivprogramm, aber höchstwahrscheinlich kein gpg

OpenPGP sperrt ein Dokument, einen Ordner und ein Archiv mit einem Verfahren. Nur damit lässt sich ein Ordner schützen

In FolderProtectedLevel bleiben die Metadaten, das Cover und die Medien lesbar. So zeigt der Levelbrowser die Karte weiterhin an

Die innere Endung bleibt im Namen: level.json.gpg. Genau so nennt gpg -c level.json die Datei, daher ist das Format ohne Raten bekannt

Was hineinkommt

LevelArchiveBuilder ermittelt den Inhalt aus dem Modell, nicht aus der Dateiliste des Ordners. Eine Datei, auf die das Level nicht verweist, bleibt draußen. Der Bericht nennt, wie viele solcher Dateien ausgelassen wurden

Die Verweise des Levels werden so behandelt:

  • eine Ressource mit AbsolutePath wird ins Archiv kopiert. Ihr Verweis wird auf LevelPath umgeschrieben, aber nur in der exportierten Kopie
  • DirectUrl bleibt, wie es ist, und kommt in den Bericht: Eine URL kann nicht in einer Datei mitreisen
  • eine fehlende Datei kommt mit dem Code archive.resource_missing in den Bericht

Erkennung an den Bytes

Einen Dateinamen kann jeder schreiben. Deshalb entscheidet ArchiveFormatSniffer anhand der ersten 8 Bytes:

Erste BytesFormat
1F 8BTarGz
50 4B 03 04, 50 4B 05 06, 50 4B 07 08, 50 4B 30 30Zip
37 7A BC AF 27 1CSevenZip
ein OpenPGP-Paket-Tag, zuletzt geprüftOpenPgp: wird entschlüsselt und erneut erkannt
Warnung

.7z wird weder gelesen noch geschrieben. Es wird nur erkannt, damit die Ablehnung es beim Namen nennt (Unsupported). Dann packt man das Level als zip neu, statt die Datei für kaputt zu halten

Lesen

LevelArchiveReader.ReadAsync nimmt einen Ordner oder einen Stream mit Suchzugriff. Es gibt LevelArchiveContent zurück, wobei LevelArchiveOpenResult einer dieser Werte ist:

ErgebnisBedeutung
Okgelesen
PassphraseRequiredes gibt kein Passwort, es muss abgefragt werden
WrongPassphrasees wurde bereits ein Passwort eingegeben, und es ist falsch
Damageddie Datei ist beschädigt
NotAnArchivedas ist kein Archiv
Unsupporteddas Format ist erkannt, wird aber nicht unterstützt

PeekMetaAsync liest nur die Metadaten, für eine Karte oder einen Katalog

Ein Server liest, was auch immer jemand hochladen wollte. Deshalb arbeitet der Leser innerhalb von ArchiveLimits. Standardmäßig sind das:

  • 4096 Einträge
  • 512 MiB pro Eintrag
  • 1 GiB insgesamt

Nichts wird außerhalb des Speichers entpackt, der dafür übergeben wurde

Export aus Sicht des Editors - Export und Schutz