public static void GenerateNupkgMetadataFile(string nupkgPath, string installPath, string hashPath, string nupkgMetadataPath)
        {
            ConcurrencyUtilities.ExecuteWithFileLocked(nupkgPath,
                                                       action: () =>
            {
                // make sure new hash file doesn't exists within File lock before actually creating it.
                if (!File.Exists(nupkgMetadataPath))
                {
                    var tempNupkgMetadataFilePath = Path.Combine(installPath, Path.GetRandomFileName());
                    using (var stream = File.Open(nupkgPath, FileMode.Open, FileAccess.Read, FileShare.Read))
                        using (var packageReader = new PackageArchiveReader(stream))
                        {
                            // get hash of unsigned content of signed package
                            var packageHash = packageReader.GetContentHashForSignedPackage(CancellationToken.None);

                            // if null, then it's unsigned package so just read the existing sha512 file
                            if (string.IsNullOrEmpty(packageHash))
                            {
                                packageHash = File.ReadAllText(hashPath);
                            }

                            // write the new hash file
                            var hashFile = new NupkgMetadataFile()
                            {
                                ContentHash = packageHash
                            };

                            NupkgMetadataFileFormat.Write(tempNupkgMetadataFilePath, hashFile);
                            File.Move(tempNupkgMetadataFilePath, nupkgMetadataPath);
                        }
                }
            });
        }
Example #2
0
        public void Equals_DifferentContentHash_ReturnsFalse()
        {
            Func <NupkgMetadataFile> getMetadataFile = () =>
            {
                var metadataFile = new NupkgMetadataFile()
                {
                    Version     = 1,
                    ContentHash = "tempContentHash"
                };

                return(metadataFile);
            };

            var self  = getMetadataFile();
            var other = getMetadataFile();

            other.ContentHash = "contentHashChanged";

            Assert.NotSame(self, other);
            Assert.NotEqual(self, other);
        }
Example #3
0
        public void Equals_DifferentSource_ReturnsFalse()
        {
            Func <NupkgMetadataFile> getMetadataFile = () =>
            {
                var metadataFile = new NupkgMetadataFile()
                {
                    Version     = 2,
                    ContentHash = "tempContentHash",
                    Source      = "https://source/v3/index.json"
                };

                return(metadataFile);
            };

            var self  = getMetadataFile();
            var other = getMetadataFile();

            other.Source = "https://other/v3/index.json";

            Assert.NotSame(self, other);
            Assert.NotEqual(self, other);
        }
Example #4
0
        public void NupkgMetadataFileFormat_Write()
        {
            var nupkgMetadataFileContent = @"{
                ""version"": 1,
                ""contentHash"": ""NhfNp80eWq5ms7fMrjuRqpwhL1H56IVzXF9d+OIDcEfQ92m1DyE0c+ufUE1ogB09+sYLd58IO4eJ8jyn7AifbA==""
            }";

            NupkgMetadataFile metadataFile = null;

            using (var reader = new StringReader(nupkgMetadataFileContent))
            {
                metadataFile = NupkgMetadataFileFormat.Read(reader, NullLogger.Instance, string.Empty);
            }

            using (var writer = new StringWriter())
            {
                NupkgMetadataFileFormat.Write(writer, metadataFile);
                var output   = JObject.Parse(writer.ToString());
                var expected = JObject.Parse(nupkgMetadataFileContent);

                Assert.Equal(expected.ToString(), output.ToString());
            }
        }
Example #5
0
        public void Equals_SameContents_ReturnsTrue(int fileVersion)
        {
            Func <NupkgMetadataFile> getMetadataFile = () =>
            {
                var metadataFile = new NupkgMetadataFile()
                {
                    Version     = fileVersion,
                    ContentHash = "tempContentHash"
                };
                if (fileVersion >= 2)
                {
                    metadataFile.Source = "https://source/v3/index.json";
                }

                return(metadataFile);
            };

            var self  = getMetadataFile();
            var other = getMetadataFile();

            Assert.NotSame(self, other);
            Assert.Equal(self, other);
        }