This commit is contained in:
@@ -10,6 +10,13 @@ public static class TemplatePackage
|
||||
public static void Create(string outputPath, TemplateManifest manifest, string layoutSource,
|
||||
IReadOnlyDictionary<string, byte[]> assets)
|
||||
{
|
||||
if (!TemplateLoader.IsSafeRelativePath(manifest.MetadataFile))
|
||||
throw new InvalidDataException("metadataFile enthält einen unsicheren Pfad.");
|
||||
if (TemplateLoader.Normalize(manifest.MetadataFile).Equals(
|
||||
TemplateLoader.Normalize(manifest.LayoutFile), StringComparison.OrdinalIgnoreCase))
|
||||
throw new InvalidDataException("metadataFile und layoutFile dürfen nicht identisch sein.");
|
||||
var reservedPaths = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
|
||||
{ "manifest.json", TemplateLoader.Normalize(manifest.LayoutFile), TemplateLoader.Normalize(manifest.MetadataFile) };
|
||||
if (!string.Equals(Path.GetExtension(outputPath), Extension, StringComparison.OrdinalIgnoreCase))
|
||||
outputPath += Extension;
|
||||
var directory = Path.GetDirectoryName(outputPath);
|
||||
@@ -21,10 +28,13 @@ public static class TemplatePackage
|
||||
{
|
||||
WriteText(archive, "manifest.json", JsonSerializer.Serialize(manifest, TemplateLoader.JsonOptions));
|
||||
WriteText(archive, manifest.LayoutFile, layoutSource);
|
||||
WriteText(archive, manifest.MetadataFile, TemplateMetadataText.Serialize(manifest.Metadata));
|
||||
foreach (var asset in assets)
|
||||
{
|
||||
if (!TemplateLoader.IsSafeRelativePath(asset.Key))
|
||||
throw new InvalidDataException($"Unsicherer Assetpfad „{asset.Key}“.");
|
||||
if (reservedPaths.Contains(TemplateLoader.Normalize(asset.Key)))
|
||||
throw new InvalidDataException($"Assetpfad „{asset.Key}“ ist für Paketdaten reserviert.");
|
||||
var entry = archive.CreateEntry(TemplateLoader.Normalize(asset.Key), CompressionLevel.Optimal);
|
||||
using var stream = entry.Open(); stream.Write(asset.Value);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user