private static string CheckFile(string url, IPackageFile file)
        {
            var binary = new BinaryStoreManager();
            var symbol = new SymbolStoreManager();

            var name           = Path.ChangeExtension(Path.GetFileName(file.Path), "pdb");
            var compressedName = name.Substring(0, name.Length - 1) + '_';

            string hash;

            using (var stream = file.GetStream())
                hash = binary.ReadPdbHash(stream);

            byte[] buffer;

            try
            {
                using (var client = new WebClient())
                    buffer = client.DownloadData(string.Format("{0}/{1}/{2}/{3}", url, name, hash, compressedName));
            }
            catch (WebException exception)
            {
                return(((HttpWebResponse)exception.Response).StatusCode.ToString());
            }

            //using (var stream = new MemoryStream(buffer))
            //    if (symbol.ReadHash(stream) != hash)
            //        return "MISMATCHED";

            return("FOUND");
        }
        public object GetView(string extension, Stream stream)
        {
            var builder = new StringBuilder();

            var store = new SymbolStoreManager();

            builder.AppendLine("Symbol hash:");
            builder.AppendLine(store.ReadHash(stream));

            builder.AppendLine("");

            var extractor = new ManagedSourceExtractor();

            builder.AppendLine("Compiled sources:");
            var sources = extractor.ReadSources(null, stream);

            foreach (var source in sources)
            {
                builder.AppendLine(source);
            }

            return(builder);
        }
Example #3
0
        public static IEnumerable <PackageIssue> Validate(IPackage package)
        {
            var binaryStore = new BinaryStoreManager();
            var symbolStore = new SymbolStoreManager();

            var files = package.GetFiles().ToArray();

            var hasSymbols = files.Where(PackageHelper.IsSymbolFile).Any();
            var hasSources = files.Where(PackageHelper.IsSourceFile).Any();

            var hasName        = package.FileName != null && package.FileName.EndsWith(".nupkg", StringComparison.CurrentCultureIgnoreCase);
            var hasSymbolsName = hasName && package.FileName.EndsWith(".symbols.nupkg", StringComparison.CurrentCultureIgnoreCase);

            var isSymbolPackage = hasSymbolsName || hasSymbols || hasSources;

            if (!hasName)
            {
                yield return(UnableToVerifyPackageName(package.FileName));
            }
            else
            {
                if (!hasSymbolsName && (hasSymbols || hasSources))
                {
                    yield return(IncorrectSymbolPackageName(package.FileName));
                }

                if (hasSymbolsName && !hasSymbols && !hasSources)
                {
                    yield return(IncorrectPackageName(package.FileName));
                }
            }

            foreach (var binaryFile in files.Where(PackageHelper.IsBinaryFile))
            {
                string binaryHash;

                using (var stream = binaryFile.GetStream())
                    binaryHash = binaryStore.ReadPdbHash(stream);

                if (binaryHash == null)
                {
                    yield return(NoSymbolSupportIssue(binaryFile.Path));
                }

                var symbolPath = Path.ChangeExtension(binaryFile.Path, ".pdb");
                var symbolFile = GetSingleFile(files, symbolPath);

                if (isSymbolPackage && symbolFile == null)
                {
                    yield return(MissingSymbolFileIssue(binaryFile.Path, symbolPath));
                }

                if (!isSymbolPackage && symbolFile != null)
                {
                    yield return(UnnecessarySymbolFileIssue(binaryFile.Path, symbolFile.Path));
                }

                if (symbolFile != null)
                {
                    string symbolHash;

                    using (var stream = symbolFile.GetStream())
                        symbolHash = symbolStore.ReadHash(stream);

                    if (binaryHash != symbolHash)
                    {
                        yield return(HashMismatchIssue(binaryFile.Path, binaryHash, symbolFile.Path, symbolHash));
                    }
                }
            }

            foreach (var symbolFile in files.Where(PackageHelper.IsSymbolFile))
            {
                var paths = new[] { ".dll", ".exe", ".winmd" }
                .Select(extension => Path.ChangeExtension(symbolFile.Path, extension))
                .ToArray();

                if (paths.All(path => GetSingleFile(files, path) == null))
                {
                    yield return(OrphanSymbolFileIssue(symbolFile.Path, paths));
                }
            }
        }