Exemple #1
0
        public void SameEqual()
        {
            var a = new FileSignature(new HashValue(new byte[] { 0x99, 0xE9, 0xD8, 0x51, 0x37, 0xDB, 0x46, 0xEF }), 355);
            var b = new FileSignature(new HashValue(new byte[] { 0x99, 0xE9, 0xD8, 0x51, 0x37, 0xDB, 0x46, 0xEF }), 355);

            a.Equals(b).Should().BeTrue("FileSignature with same properties should be equal");
        }
        public async Task CheckLocationTest()
        {
            var uri           = new Uri(Path.Combine(Path.GetFullPath("."), "temp\\"));
            var lss           = new LocalStorageService(uri);
            var fileSignature =
                new FileSignature(new HashValue(new byte[] { 0x99, 0xE9, 0xD8, 0x51, 0x37, 0xDB, 0x46, 0xEF }), 1UL);

            if (await lss.IsFileAvailable(fileSignature))
            {
                await lss.Delete(fileSignature);
            }
            (await lss.IsFileAvailable(fileSignature)).Should().BeFalse();
            using (var stream = await lss.Write(fileSignature))
            {
                stream.WriteByte(0xff);
            }
            (await lss.IsFileAvailable(fileSignature)).Should().BeTrue();
            using (var stream = await lss.Read(fileSignature))
            {
                stream.ReadByte().Should().Be(0xff);
                stream.ReadByte().Should().Be(-1);
            }
            var filename = (await lss.GetFileInfo(fileSignature)).FullName;

            filename.Should().StartWith(Path.Combine(Path.GetFullPath("."), "temp\\"));
            filename.Should().ContainEquivalentOf(fileSignature.Hash.ToString());
            await lss.Delete(fileSignature);

            (await lss.IsFileAvailable(fileSignature)).Should().BeFalse();
            await Assert.ThrowsAsync <FileNotFoundException>(async() => await lss.Read(fileSignature));
        }
Exemple #3
0
        public static bool GuessFormatFromSignature(Stream stream, out SevenZipFormat format)
        {
            FileSignature longestSig          = FileSignatures.Values.OrderByDescending(v => v.Magic.Length + v.Offset).First();
            int           longestSignatureLen = longestSig.Magic.Length + longestSig.Offset;

            byte[] archiveFileSignature = new byte[longestSignatureLen];
            int    bytesRead            = stream.Read(archiveFileSignature, 0, longestSignatureLen);

            stream.Position -= bytesRead; // go back o beginning

            if (bytesRead != longestSignatureLen)
            {
                format = SevenZipFormat.Undefined;
                return(false);
            }

            foreach (KeyValuePair <SevenZipFormat, FileSignature> pair in FileSignatures)
            {
                if (archiveFileSignature.Skip(pair.Value.Offset).Take(pair.Value.Magic.Length).SequenceEqual(pair.Value.Magic))
                {
                    format = pair.Key;
                    return(true);
                }
            }

            format = SevenZipFormat.Undefined;
            return(false);
        }
Exemple #4
0
 public OnlineFile(FileSignature fileSignature, Uri uri)
 {
     FileSignature = fileSignature;
     Uri           = uri;
     if (!Uri.IsAbsoluteUri)
     {
         throw new UriNotAbsoluteException();
     }
 }
Exemple #5
0
        Stream IFileAccessService.Write(FileSignature fileSignature, bool temporary)
        {
            var file = GetFileInfo(fileSignature, temporary);

            return(Policy
                   .Handle <IOException>()
                   .WaitAndRetry(5, i => Math.Pow(2, i).Seconds(),
                                 (exception, duration) => LogTo.Warning(exception,
                                                                        "Opening file {file} for write failed after {duration}", file.FullName, duration))
                   .Execute(() => file.Open(FileMode.Create, FileAccess.Write, FileShare.None)));
        }
 public Uri GetDownloadUri(FileSignature fileSignature)
 {
     foreach (var repo in Repos.Items)
     {
         if (repo.Files.TryGetValue(fileSignature, out var relativeUri))
         {
             return(new Uri(repo.BaseUri, relativeUri));
         }
     }
     throw new KeyNotFoundException($"Key {fileSignature} was not found in a Files dictionary of any Repo");
 }
        /// <summary>
        /// 在指定的目录中搜寻完全一样的文件。
        /// </summary>
        /// <param name="fileUrl">需要进行匹配的样本文件的文件地址。</param>
        /// <param name="directory">需要进行搜寻的目录,即匹配的范围。</param>
        /// <param name="isSorted">是否将匹配结果进行排序之后并作为返回值提交给用户。</param>
        /// <returns>如果搜寻到完全一样的文件,则会返回这些文件地址所构成的List实例。</returns>
        /// <remarks>该方法的原理是基于哈希验证的,但为了提高函数的效率,因此采用了文件名称对比、文件大小对比和文件SHA1代码对比来实现更加高效的运行,因为在哈希代码上完全相同的文件,其文件名称(不包含目录)和文件大小是完全相同的,但是当需要进行匹配的文件大小过大(比如说一个Windows离线安装镜像),则该操作将会非常的消耗时间,因此为了避免这种情况导致的应用程序性能下降,建议使用异步操作模式保证其他诸如UI线程的正常工作。</remarks>
        public static List <string> SearchIdenticalFiles(string fileUrl, string directory, bool isSorted)
        {
            List <string> searchResult       = new List <string>();
            List <string> traversedFiles     = TraverseWith(directory, false);
            const int     CRITICAL_FILE_SIZE = 50000000;

            Parallel.For(0, traversedFiles.Count, (index, interrupt) =>
            {
                try
                {
                    if (GetFileName(traversedFiles[index]) == GetFileName(fileUrl))
                    {
                        long sourceSize = GetFileSize(fileUrl);
                        long targetSize = GetFileSize(traversedFiles[index]);
                        if (sourceSize == targetSize)
                        {
                            string srcHashCode     = string.Empty;
                            string tgtHashCode     = srcHashCode;
                            bool fileSizeCondition = sourceSize >= CRITICAL_FILE_SIZE || targetSize >= CRITICAL_FILE_SIZE;
                            Action getSrcHash      = () => srcHashCode = new FileSignature(fileUrl).GetSHA1String();
                            Action getTgtHash      = () => tgtHashCode = new FileSignature(traversedFiles[index]).GetSHA1String();
                            if (fileSizeCondition)
                            {
                                Parallel.Invoke(new Action[] { getSrcHash, getTgtHash });
                            }
                            else
                            {
                                getSrcHash.Invoke();
                                getTgtHash.Invoke();
                            }
                            if (srcHashCode.Equals(tgtHashCode))
                            {
                                searchResult.Add(traversedFiles[index]);
                            }
                        }
                    }
                }
                catch (Exception throwedException)
                {
                    if (throwedException != null)
                    {
                        throw throwedException.InnerException;
                    }
                    interrupt.Stop();
                }
            });
            if (isSorted)
            {
                searchResult.Sort();
            }
            return(searchResult);
        }
Exemple #8
0
        public async Task <(bool available, Lazy <Task <Stream> > stream)> WriteIfMissingOrInvalid(
            FileSignature fileSignature)
        {
            var fi = await GetFileInfo(fileSignature);

            var exists = await IsFileAvailable(fileSignature);

            if (exists == false || fileSignature.Length != Convert.ToUInt64(fi.Length))
            {
                return(false, new Lazy <Task <Stream> >(() => Write(fileSignature)));
            }
            return(true, null);
        }
        /// <summary>
        /// Check if specified file is trusted
        /// </summary>
        /// <param name="file"><see cref="File"/> to verify</param>
        /// <param name="signature"><see cref="FileSignature"/> of file we are verifying provided</param>
        /// <returns>true when file comes from trusted source</returns>
        public bool VerifyFile(File file, FileSignature signature)
        {
            IssuerInformation information = null;

            if (_issuers.TryGetValue(signature.IssuerName, out information))
            {
                return(information.IssuerAlgorithm.Verify(file.Data, signature.Signature) &&
                       file.FileName == signature.FileName);
            }
            else
            {
                return(false);
            }
        }
        // @pixelOffset: Offset from start of file to first pixel in image
        public static BmpHeader Create(uint fileSize, uint pixelOffset)
        {
            BmpHeader header = new BmpHeader();

            header.fileSignature = new byte[FileSignature.Count];
            FileSignature.CopyTo(header.fileSignature, 0);
            //System.Array.Copy(FileSignature, header.fileSignature, FileSignature.Count);

            header.size        = fileSize;
            header.reserved1   = DefaultReserved1;
            header.reserved2   = DefaultReserved2;
            header.pixelOffset = pixelOffset;

            return(header);
        }
Exemple #11
0
        public void verification_against_trusted_issuer_with_incorrect_file()
        {
            var signature = new FileSignature()
            {
                FileName   = "Nomad.dll",
                IssuerName = "Nomad",
                Signature  = new byte[] { 65, 64, 63, 62, 61 }
            };
            var file = new File()
            {
                FileName = "Nomad.dll", Data = new byte[] { 65, 64, 63, 62, 60, 60 }
            };

            Assert.IsFalse(_fileSignatureVerificator.VerifyFile(file, signature));
        }
Exemple #12
0
        public void TemporaryFinished(FileSignature fileSignature)
        {
            var temp  = GetFileInfo(fileSignature, true);
            var final = GetFileInfo(fileSignature, false);

            LogTo.Verbose("Renaming file {src} to {dst}", temp, final);
            if (final.Exists)
            {
                final.Delete();
            }
            Policy
            .Handle <IOException>()
            .WaitAndRetry(5, i => Math.Pow(2, i).Seconds(),
                          (exception, duration) => LogTo.Warning(exception,
                                                                 "Moving file from {src} to {dst} has failed after {duration}", temp.FullName, final.FullName,
                                                                 duration))
            .Execute(() => { temp.MoveTo(final.FullName); });
        }
        /// <summary>
        /// 移动占用空间比较大的文件。
        /// </summary>
        /// <param name="sourceFileUrl">需要被移动的文件的文件地址。</param>
        /// <param name="targetFileUrl">移动操作的目标地址。</param>
        /// <param name="transmissionSize">每一次传输的大小,通常这个值设定为1024即可。</param>
        /// <param name="isCheckFileIntegrity">移动文件之后是否执行完整性检验。</param>
        /// <exception cref="AbortedCheckOperationException">当文件完整性检查失败或者结果不符合要求时,则会抛出这个异常。</exception>
        public static void MoveBigFile(string sourceFileUrl, string targetFileUrl, int transmissionSize, bool isCheckFileIntegrity)
        {
            FileSignature sourceSignature = new FileSignature(sourceFileUrl);
            FileSignature targetSignature = new FileSignature(targetFileUrl);
            ExString      srcMd5Value     = string.Empty;
            ExString      targetMd5Value  = string.Empty;

            CopyBigFile(sourceFileUrl, targetFileUrl, transmissionSize);
            if (isCheckFileIntegrity)
            {
                srcMd5Value    = sourceSignature.GetMD5String();
                targetMd5Value = targetSignature.GetMD5String();
                if (!srcMd5Value.Equals(targetMd5Value))
                {
                    throw new AbortedCheckOperationException();
                }
            }
            DeleteFile(sourceFileUrl);
        }
Exemple #14
0
        public async Task <(bool Success, string ErrorMsg, byte[] FileSignature)> Validate(string fileName, Stream stream)
        {
            var extensionName = Path.GetExtension(fileName);

            if (!Configure.AllowFileExtension.Contains(extensionName))
            {
                return(false, "Illegal file format.", null);
            }
            if (!FileSignature.GetSignature(extensionName, out var signatures))
            {
                return(false, $"未找到{extensionName}文件的签名,通过FileSignature.AddSignature()方法添加签名。", null);
            }
            var maxLen      = signatures.Max(m => m.Signature.Length + m.Offset);
            var headerBytes = new byte[maxLen];

            stream.Read(headerBytes, 0, maxLen);
            var success = signatures.Any(signature => headerBytes.Skip(signature.Offset).Take(signature.Signature.Length).SequenceEqual(signature.Signature));

            return(await Task.FromResult((success, success ? "" : "Illegal file format.", headerBytes)));
        }
        private void SaveFile(FileSignature signature, string path)
        {
            const int bufsize = 0x100000;
            var       remains = signature.FileSize;

            _volume.SeekFileArea(signature.Offset);

            path = path + "/" + signature.FileName;
            var uniquePath = Utility.UniqueFileName(path);

            using (FileStream file = new FileStream(uniquePath, FileMode.Create))
            {
                while (remains > 0)
                {
                    var read = Math.Min(remains, bufsize);
                    remains -= read;
                    byte[] buf = new byte[read];
                    _volume.GetReader().Read(buf, (int)read);
                    file.Write(buf, 0, (int)read);
                }
            }
        }
Exemple #16
0
        private static async Task <Mod> CreateMod(DirectoryInfo modFolder, Action <FileSignature, Uri> fileAction)
        {
            Console.WriteLine($"Processing {modFolder.FullName}");
            var hashing = new HashingService(new XXHash64());
            var obs     = hashing.GetFileHashes(modFolder, CancellationToken.None);
            var mod     = new Mod
            {
                Files   = new Dictionary <Uri, FileSignature>(),
                Name    = modFolder.Name,
                Version = "1.0"
            };

            foreach (var lazy in obs)
            {
                var fileHash = await lazy.Value;
                Console.WriteLine($"Processing {fileHash.File.FullName}");
                var fileSig = new FileSignature(fileHash.Hash, fileHash.File.Length);
                mod.Files.Add(new Uri(modFolder.FullName).MakeRelativeUri(new Uri(fileHash.File.FullName)),
                              fileSig);
                fileAction(fileSig, new Uri(fileHash.File.FullName));
            }

            return(mod);
        }
Exemple #17
0
        public async Task Delete(FileSignature fileSignature)
        {
            var fi = await GetFileInfo(fileSignature);

            await Task.Run(() => fi.Delete());
        }
        bool NeedToScanAssembly(FileInfo fileInfo)
        {
            string fileName = fileInfo.FullName.ToLowerInvariant();
              if (!_Assemblies.ContainsKey(fileName))
            return true;

              if (!File.Exists(fileName))
            return false;

              TypeToAssemblyNamespaceMap assemblyMap = _Assemblies[fileName];
              FileSignature fileSignature = assemblyMap._AssemblySignature;

              FileSignature actualSignature = new FileSignature(fileName);
              if (!actualSignature.Match(fileSignature))
            return true;

              return false;
        }
Exemple #19
0
 private FileInfo GetFileInfo(FileSignature fileSignature, bool temporary)
 {
     return(new FileInfo(GetFileUri(fileSignature, temporary).FullName));
 }
Exemple #20
0
 private Stream GetTemporaryFileStream(FileSignature argFileSignature)
 {
     return(fileAccessService.Write(argFileSignature, true));
 }
Exemple #21
0
 private void AddNewFile(FileSignature fileSignature)
 {
     fileAccessService.TemporaryFinished(fileSignature);
     LogTo.Verbose("File {name} is now available", fileSignature.Hash);
     filesAvailable.AddOrUpdate(fileSignature);
 }
Exemple #22
0
 private string GetFileName(FileSignature fileSignature, bool temporary)
 {
     return(fileSignature.Hash + (temporary ? ".tmp" : string.Empty));
 }
Exemple #23
0
 public Stream StartDownload(FileSignature fileSignature)
 {
     return fileAccessService.Write(fileSignature, true);
 }
Exemple #24
0
 public void FinishDownload(FileSignature fileSignature)
 {
     fileAccessService.TemporaryFinished(fileSignature);
     availableFiles.AddOrUpdate(fileSignature);
 }
Exemple #25
0
 public QueuedDownload(FileSignature fileSignature, Uri source)
 {
     FileSignature = fileSignature;
     Source        = source;
 }
Exemple #26
0
        public async Task <Stream> Write(FileSignature fileSignature)
        {
            var file = await GetFileInfo(fileSignature);

            return(await Task.Run(() => file.Open(FileMode.Create, FileAccess.Write)));
        }
Exemple #27
0
        public async Task <Stream> Read(FileSignature fileSignature)
        {
            var file = await GetFileInfo(fileSignature);

            return(await Task.Run(() => file.Open(FileMode.Open, FileAccess.Read)));
        }
Exemple #28
0
        public async Task <bool> IsFileAvailable(FileSignature fileSignature)
        {
            var fi = await GetFileInfo(fileSignature);

            return(await Task.Run(() => fi.Exists));
        }
Exemple #29
0
 public Uri GetFileUri(FileSignature fileSignature)
 {
     return(new Uri(localPath, GetFileName(fileSignature)));
 }
Exemple #30
0
 public string GetFileName(FileSignature fileSignature)
 {
     return(fileSignature.Hash.ToString());
 }
Exemple #31
0
 public async Task <FileInfo> GetFileInfo(FileSignature fileSignature)
 {
     return(await Task.Run(() => new FileInfo(GetFileUri(fileSignature).LocalPath)));
 }