Exemple #1
0
    private static ManifestEntry BuildEntry(XElement element)
    {
        RuntimeHelpers.EnsureSufficientExecutionStack();
        if (element.NodeType != XmlNodeType.Element)
        {
            throw new InvalidOperationException($"Invalid manifest format. Expected a 'File' or a 'Directory' node:" +
                                                $" '{element}'");
        }

        if (string.Equals(element.Name.LocalName, "File", StringComparison.Ordinal))
        {
            var entryName = EnsureName(element);
            var path      = EnsureElement(element, "ResourcePath");
            var pathValue = EnsureText(path);
            return(new ManifestFile(entryName, pathValue));
        }

        if (string.Equals(element.Name.LocalName, "Directory", StringComparison.Ordinal))
        {
            var directoryName = EnsureName(element);
            var children      = new List <ManifestEntry>();
            foreach (var child in element.Elements())
            {
                children.Add(BuildEntry(child));
            }

            ValidateEntries(children);

            return(ManifestDirectory.CreateDirectory(directoryName, children.ToArray()));
        }

        throw new InvalidOperationException($"Invalid manifest format.Expected a 'File' or a 'Directory' node. " +
                                            $"Got '{element.Name.LocalName}' instead.");
    }
Exemple #2
0
    internal EmbeddedFilesManifest(ManifestDirectory rootDirectory)
    {
        if (rootDirectory == null)
        {
            throw new ArgumentNullException(nameof(rootDirectory));
        }

        _rootDirectory = rootDirectory;
    }
Exemple #3
0
    protected internal virtual void SetParent(ManifestDirectory directory)
    {
        if (Parent != null)
        {
            throw new InvalidOperationException("Directory already has a parent.");
        }

        Parent = directory;
    }
    public ManifestDirectoryInfo(ManifestDirectory directory, DateTimeOffset lastModified)
    {
        if (directory == null)
        {
            throw new ArgumentNullException(nameof(directory));
        }

        Directory    = directory;
        LastModified = lastModified;
    }
    public void TraversingRootDirectoryWithDotDot_ReturnsSinkDirectory()
    {
        // Arrange
        var directory = ManifestDirectory.CreateRootDirectory(Array.Empty <ManifestEntry>());

        // Act
        var result = directory.Traverse("..");

        // Assert
        Assert.Equal(ManifestEntry.UnknownPath, result);
    }
    public void TraversingWithDot_ReturnsSelf()
    {
        // Arrange
        var directory = ManifestDirectory.CreateDirectory("a", Array.Empty <ManifestEntry>());

        // Act
        var result = directory.Traverse(".");

        // Assert
        Assert.Same(directory, result);
    }
    public void TraversingANonExistingFile_ReturnsUnknownPath()
    {
        // Arrange
        var directory = ManifestDirectory.CreateDirectory("a", Array.Empty <ManifestEntry>());

        // Act
        var result = directory.Traverse("missing.txt");

        // Assert
        Assert.Equal(ManifestEntry.UnknownPath, result);
    }
    public void TraversingWithDotDot_ReturnsParent()
    {
        // Arrange
        var childDirectory = ManifestDirectory.CreateDirectory("b", Array.Empty <ManifestEntry>());
        var directory      = ManifestDirectory.CreateDirectory("a", new[] { childDirectory });

        // Act
        var result = childDirectory.Traverse("..");

        // Assert
        Assert.Equal(directory, result);
    }
Exemple #9
0
    public static EmbeddedFilesManifest Parse(Assembly assembly, string name)
    {
        if (assembly == null)
        {
            throw new ArgumentNullException(nameof(assembly));
        }

        if (name == null)
        {
            throw new ArgumentNullException(nameof(name));
        }

        var stream = assembly.GetManifestResourceStream(name);

        if (stream == null)
        {
            throw new InvalidOperationException($"Could not load the embedded file manifest " +
                                                $"'{name}' for assembly '{assembly.GetName().Name}'.");
        }

        var document = XDocument.Load(stream);

        var manifest        = EnsureElement(document, "Manifest");
        var manifestVersion = EnsureElement(manifest, "ManifestVersion");
        var version         = EnsureText(manifestVersion);

        if (!string.Equals("1.0", version, StringComparison.Ordinal))
        {
            throw new InvalidOperationException($"The embedded file manifest '{name}' for " +
                                                $"assembly '{assembly.GetName().Name}' specifies an unsupported file format" +
                                                $" version: '{version}'.");
        }
        var fileSystem = EnsureElement(manifest, "FileSystem");

        var entries     = fileSystem.Elements();
        var entriesList = new List <ManifestEntry>();

        foreach (var element in entries)
        {
            var entry = BuildEntry(element);
            entriesList.Add(entry);
        }

        ValidateEntries(entriesList);

        var rootDirectory = ManifestDirectory.CreateRootDirectory(entriesList.ToArray());

        return(new EmbeddedFilesManifest(rootDirectory));
    }
Exemple #10
0
    public ManifestDirectoryContents(Assembly assembly, ManifestDirectory directory, DateTimeOffset lastModified)
    {
        if (assembly == null)
        {
            throw new ArgumentNullException(nameof(assembly));
        }

        if (directory == null)
        {
            throw new ArgumentNullException(nameof(directory));
        }

        Assembly      = assembly;
        Directory     = directory;
        _lastModified = lastModified;
    }
    internal static void ValidateChildrenAndSetParent(ManifestEntry[] children, ManifestDirectory parent)
    {
        foreach (var child in children)
        {
            if (child == UnknownPath)
            {
                throw new InvalidOperationException($"Invalid entry type '{nameof(ManifestSinkDirectory)}'");
            }

            if (child is ManifestRootDirectory)
            {
                throw new InvalidOperationException($"Can't add a root folder as a child");
            }

            child.SetParent(parent);
        }
    }
    public static ManifestDirectory CreateDirectory(string name, ManifestEntry[] children)
    {
        if (string.IsNullOrWhiteSpace(name))
        {
            throw new ArgumentException($"'{nameof(name)}' must not be null, empty or whitespace.", nameof(name));
        }

        if (children == null)
        {
            throw new ArgumentNullException(nameof(children));
        }

        var result = new ManifestDirectory(name, children);

        ValidateChildrenAndSetParent(children, result);

        return(result);
    }
    public void ScopingAFolderAndTryingToGetAScopedFile_ReturnsSinkDirectory()
    {
        // Arrange
        var directory = ManifestDirectory.CreateRootDirectory(new[] {
            ManifestDirectory.CreateDirectory("a",
                                              new[] { new ManifestFile("test1.txt", "text.txt") }),
            ManifestDirectory.CreateDirectory("b",
                                              new[] { new ManifestFile("test2.txt", "test2.txt") })
        });

        var newRoot = ((ManifestDirectory)directory.Traverse("a")).ToRootDirectory();

        // Act
        var result = newRoot.Traverse("../b/test.txt");

        // Assert
        Assert.Same(ManifestEntry.UnknownPath, result);
    }
    public void ResolveEntry_AllowsSingleDirectorySeparator(string path)
    {
        // Arrange
        var manifest = new EmbeddedFilesManifest(
            ManifestDirectory.CreateRootDirectory(
                new[]
        {
            ManifestDirectory.CreateDirectory("wwwroot",
                                              new[]
            {
                new ManifestFile("jquery.validate.js", "wwwroot.jquery.validate.js")
            })
        }));
        // Act
        var entry = manifest.ResolveEntry(path);

        // Assert
        Assert.NotNull(entry);
    }
            public void Create(List <string> InFiles, string BaseFolder)
            {
                BaseFolder = CombinePaths(BaseFolder, "/");
                if (!BaseFolder.EndsWith("/") && !BaseFolder.EndsWith("\\"))
                {
                    throw new AutomationException("base folder {0} should end with a separator", BaseFolder);
                }

                foreach (string InFilename in InFiles)
                {
                    var Filename = CombinePaths(InFilename);
                    Robust_FileExists_NoExceptions(true, Filename, "Could not add {0} to manifest because it does not exist");

                    FileInfo Info = new FileInfo(Filename);
                    Filename = Info.FullName;
                    Robust_FileExists_NoExceptions(true, Filename, "Could not add {0} to manifest because it does not exist2");

                    if (!Filename.StartsWith(BaseFolder, StringComparison.InvariantCultureIgnoreCase))
                    {
                        throw new AutomationException("Could not add {0} to manifest because it does not start with the base folder {1}", Filename, BaseFolder);
                    }
                    var RelativeFile = Filename.Substring(BaseFolder.Length);
                    List <TempStorageFileInfo> ManifestDirectory;
                    string DirectoryName = CombinePaths(Path.GetDirectoryName(Filename), "/");
                    if (!DirectoryName.StartsWith(BaseFolder, StringComparison.InvariantCultureIgnoreCase))
                    {
                        throw new AutomationException("Could not add directory {0} to manifest because it does not start with the base folder {1}", DirectoryName, BaseFolder);
                    }
                    var RelativeDir = DirectoryName.Substring(BaseFolder.Length).Replace("\\", "/");
                    if (Directories.TryGetValue(RelativeDir, out ManifestDirectory) == false)
                    {
                        ManifestDirectory = new List <TempStorageFileInfo>();
                        Directories.Add(RelativeDir, ManifestDirectory);
                    }
                    ManifestDirectory.Add(new TempStorageFileInfo(Filename, RelativeFile));
                }

                Stats("Created manifest");
            }
Exemple #16
0
        public void TestListPaths()
        {
            var normalFile = new ManifestNormalFile("123", new DateTime(), 10, "normal");
            var dir1 = new ManifestDirectory("/dir1");
            var executableFile = new ManifestExecutableFile("123", new DateTime(), 10, "executable");
            var dir2 = new ManifestDirectory("/dir2");
            var symlink = new ManifestSymlink("123", 10, "symlink");
            var manifest = new Manifest(ManifestFormat.Sha256New, normalFile, dir1, executableFile, dir2, symlink);

            manifest.ListPaths().Should().Equal(
                new KeyValuePair<string, ManifestNode>("normal", normalFile),
                new KeyValuePair<string, ManifestNode>("dir1", dir1),
                new KeyValuePair<string, ManifestNode>(Path.Combine("dir1", "executable"), executableFile),
                new KeyValuePair<string, ManifestNode>("dir2", dir2),
                new KeyValuePair<string, ManifestNode>(Path.Combine("dir2", "symlink"), symlink));
        }
 internal void LinkToParent(ManifestDirectory parent)
 {
     parent.Files.Add(this);
     FullName = Path.Combine(parent.FullName, FullName);
 }
 private static void DirectoryMustExistInDirectory(ManifestDirectory node, string packageRoot)
 {
     string fullPath = Path.Combine(packageRoot, node.FullPath.Replace('/', Path.DirectorySeparatorChar).Substring(1));
     Assert.IsTrue(Directory.Exists(fullPath), "Directory " + fullPath + " does not exist.");
 }