예제 #1
0
        public FileInfo GetFile(string bundleId, string dumpId, string filename)
        {
            // make sure filename is not some relative ".."
            if (filename.Contains(".."))
            {
                throw new UnauthorizedAccessException();
            }

            string dir  = pathHelper.GetDumpDirectory(bundleId, dumpId);
            var    file = new FileInfo(Path.Combine(dir, filename));

            // make sure file really is inside of the dumps-directory
            if (!file.FullName.ToLower().Contains(dir.ToLower()))
            {
                throw new UnauthorizedAccessException();
            }

            var         dumpInfo  = ReadMetainfoFile(bundleId, dumpId);
            SDFileEntry fileEntry = GetSDFileEntry(dumpInfo, file);

            if (fileEntry.Type == SDFileType.PrimaryDump && !settings.Value.DumpDownloadable)
            {
                throw new UnauthorizedAccessException();
            }

            if (file.Exists)
            {
                return(file);
            }
            else
            {
                return(null);
            }
        }
예제 #2
0
        private SDFileEntry GetSDFileEntry(DumpMetainfo dumpInfo, FileInfo fileInfo)
        {
            // the file should be registered in dumpInfo
            SDFileEntry fileEntry = dumpInfo.Files.Where(x => x.FileName == fileInfo.Name).SingleOrDefault();

            if (fileEntry != null)
            {
                return(fileEntry);
            }

            // but if it's not registered, do some heuristic to figure out which type of file it is.
            fileEntry = new SDFileEntry()
            {
                FileName = fileInfo.Name
            };
            if (Path.GetFileName(pathHelper.GetJsonPath(dumpInfo.BundleId, dumpInfo.DumpId)) == fileInfo.Name)
            {
                fileEntry.Type = SDFileType.SuperDumpData;
                return(fileEntry);
            }
            if (Path.GetFileName(pathHelper.GetDumpMetadataPath(dumpInfo.BundleId, dumpInfo.DumpId)) == fileInfo.Name)
            {
                fileEntry.Type = SDFileType.SuperDumpData;
                return(fileEntry);
            }
            if ("windbg.log" == fileInfo.Name)
            {
                fileEntry.Type = SDFileType.WinDbg;
                return(fileEntry);
            }
            if (fileInfo.Extension == ".log")
            {
                fileEntry.Type = SDFileType.SuperDumpLogfile;
                return(fileEntry);
            }
            if (fileInfo.Extension == ".json")
            {
                fileEntry.Type = SDFileType.SuperDumpData;
                return(fileEntry);
            }
            if (fileInfo.Extension == ".dmp")
            {
                fileEntry.Type = SDFileType.PrimaryDump;
                return(fileEntry);
            }
            if (fileInfo.Name.EndsWith(".core.gz", StringComparison.OrdinalIgnoreCase))
            {
                fileEntry.Type = SDFileType.PrimaryDump;
                return(fileEntry);
            }
            if (fileInfo.Name.EndsWith(".libs.tar.gz", StringComparison.OrdinalIgnoreCase))
            {
                fileEntry.Type = SDFileType.LinuxLibraries;
                return(fileEntry);
            }

            // can't figure out filetype
            fileEntry.Type = SDFileType.Other;
            return(fileEntry);
        }
예제 #3
0
        private async Task <string> ReadCustomTextResult(DumpMetainfo dumpInfo)
        {
            SDFileEntry customResultFile = dumpInfo.Files.FirstOrDefault(x => x.Type == SDFileType.CustomTextResult);

            if (customResultFile == null)
            {
                return(null);
            }
            FileInfo file = dumpStorage.GetFile(dumpInfo.BundleId, dumpInfo.DumpId, customResultFile.FileName);

            if (file == null || !file.Exists)
            {
                return(null);
            }
            return(await System.IO.File.ReadAllTextAsync(file.FullName));
        }
예제 #4
0
        private string ReadCustomTextResult(DumpMetainfo dumpInfo)
        {
            SDFileEntry customResultFile = dumpInfo.Files.SingleOrDefault(x => x.Type == SDFileType.CustomTextResult);

            if (customResultFile == null)
            {
                return(null);
            }
            FileInfo file = dumpStorage.GetFile(dumpInfo.BundleId, dumpInfo.DumpId, customResultFile.FileName);

            if (!file.Exists)
            {
                return(null);
            }
            return(System.IO.File.ReadAllText(file.FullName));
        }
예제 #5
0
        public IEnumerable <SDFileInfo> GetSDFileInfos(DumpMetainfo dumpInfo)
        {
            foreach (var filePath in Directory.EnumerateFiles(pathHelper.GetDumpDirectory(dumpInfo.Id)))
            {
                // in case the requested file has a "special" entry in FileEntry list, add that information
                FileInfo    fileInfo  = new FileInfo(filePath);
                SDFileEntry fileEntry = GetSDFileEntry(dumpInfo, fileInfo);

                yield return(new SDFileInfo()
                {
                    FileInfo = fileInfo,
                    FileEntry = fileEntry,
                    SizeInBytes = fileInfo.Length,
                    Downloadable = fileEntry.Type != SDFileType.PrimaryDump || settings.Value.DumpDownloadable
                });
            }
        }