예제 #1
0
파일: SHA1Tests.cs 프로젝트: Kuinox/CK-Core
        public void SHA1_ByteAmount()
        {
            var sha = SHA1Value.ComputeFileSHA1(ThisFile);

            sha.GetBytes().Count.Should().Be(20);
            sha.ToString().Length.Should().Be(40);
        }
        /// <summary>
        /// Initializes a new <see cref="StObjEngineConfiguration"/> from a <see cref="XElement"/>.
        /// </summary>
        /// <param name="e">The xml element.</param>
        public StObjEngineConfiguration(XElement e)
        {
            Throw.CheckNotNullArgument(e);

            // Global options.
            BasePath = (string?)e.Element(xBasePath);
            GeneratedAssemblyName       = (string?)e.Element(xGeneratedAssemblyName);
            TraceDependencySorterInput  = (bool?)e.Element(xTraceDependencySorterInput) ?? false;
            TraceDependencySorterOutput = (bool?)e.Element(xTraceDependencySorterOutput) ?? false;
            RevertOrderingNames         = (bool?)e.Element(xRevertOrderingNames) ?? false;
            InformationalVersion        = (string?)e.Element(xInformationalVersion);
            var sha1 = (string?)e.Element(xBaseSHA1);

            BaseSHA1 = sha1 != null?SHA1Value.Parse(sha1) : SHA1Value.Zero;

            ForceRun            = (bool?)e.Element(xForceRun) ?? false;
            GlobalExcludedTypes = new HashSet <string>(FromXml(e, xGlobalExcludedTypes, xType));

            // BinPaths.
            BinPaths = e.Elements(xBinPaths).Elements(xBinPath).Select(e => new BinPathConfiguration(e)).ToList();

            // Aspects.
            Aspects = new List <IStObjEngineAspectConfiguration>();
            foreach (var a in e.Elements(xAspect))
            {
                string type    = (string)a.AttributeRequired(xType);
                Type?  tAspect = SimpleTypeFinder.WeakResolver(type, true);
                Debug.Assert(tAspect != null);
                IStObjEngineAspectConfiguration aspect = (IStObjEngineAspectConfiguration)Activator.CreateInstance(tAspect, a) !;
                Aspects.Add(aspect);
            }
        }
예제 #3
0
        public void SHA1_ToString_and_Parse()
        {
            var sha    = SHA1Value.ComputeFileSHA1(GetFilePath());
            var s      = sha.ToString();
            var shaBis = SHA1Value.Parse(s);

            shaBis.Should().Be(sha);
        }
예제 #4
0
        public static (ulong d0, ulong d1, uint d2) ToStorage(SHA1Value value)
        {
            var d  = value.Data;
            var d0 = BitConverter.ToUInt64(d, 0);
            var d1 = BitConverter.ToUInt64(d, 8);
            var d2 = BitConverter.ToUInt32(d, 16);

            return(d0, d1, d2);
        }
예제 #5
0
        /// <summary>
        /// Tries to extract a SHA1 signature from an existing directory: the <see cref="SignatureFileName"/> is read if it exists.
        /// <para>
        /// This can be overridden to detect the signature differently.
        /// </para>
        /// </summary>
        /// <param name="monitor">The monitor to use.</param>
        /// <returns><see cref="SHA1Value.Zero"/> if not found.</returns>
        protected virtual SHA1Value DoGetSignature(IActivityMonitor monitor)
        {
            var f = Path.AppendPart(SignatureFileName);

            if (File.Exists(f) && SHA1Value.TryParse(File.ReadAllText(f), out var signature))
            {
                return(signature);
            }
            return(SHA1Value.Zero);
        }
예제 #6
0
        /// <summary>
        /// Overridden to read the signature file.
        /// </summary>
        /// <param name="monitor">The monitor to use.</param>
        /// <returns>The signature or <see cref="SHA1Value.Zero"/> if it can't be read.</returns>
        protected override SHA1Value DoGetSignature(IActivityMonitor monitor)
        {
            var firstLine = SafeReadFirstLine(monitor, _signatureFile);

            if (firstLine != null && SHA1Value.TryParse(firstLine, out var signature))
            {
                return(signature);
            }
            return(SHA1Value.Zero);
        }
예제 #7
0
        internal static IAsyncOperationWithProgress <FileSearchResult, HttpProgress> SearchAsync(string keyword, Category category, StorageFile file, bool searchSimilar, bool onlyCovers, bool searchExpunged)
        {
            if (file is null)
            {
                throw new ArgumentNullException(nameof(file));
            }

            if (searchSimilar)
            {
                return(AsyncInfo.Run <FileSearchResult, HttpProgress>(async(token, progress) =>
                {
                    var read = FileIO.ReadBufferAsync(file);
                    HttpStringContent contentOf(bool v) => new HttpStringContent(v ? "1" : "0");
                    var data = new HttpMultipartFormDataContent
                    {
                        { contentOf(true), "fs_similar" },
                        { contentOf(onlyCovers), "fs_covers" },
                        { contentOf(searchExpunged), "fs_exp" }
                    };
                    var buf = await read;
                    data.Add(new HttpBufferContent(buf), "sfile", file.Name);
                    await data.BufferAllAsync();
                    var post = Client.Current.HttpClient.PostAsync(Client.Current.Uris.FileSearchUri, data);
                    post.Progress = (s, p) => progress.Report(p);
                    var r = await post;
                    var uri = r.RequestMessage.RequestUri;
                    var query = uri.Query.Split("?&".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                    var hashstr = query.Single(s => s.StartsWith("f_shash=")).Substring(8).Split(';');
                    var info = hashstr.FirstOrDefault(value => value.Length != 40);
                    switch (info)
                    {
                    case "monotone":
                        throw new InvalidOperationException(LocalizedStrings.Resources.UnsupportedMonotone);

                    case "corrupt":
                        throw new InvalidOperationException(LocalizedStrings.Resources.UnsupportedFile);

                    case null:
                        break;

                    default:
                        throw new InvalidOperationException(info);
                    }
                    return new FileSearchResult(keyword, category, hashstr.Select(SHA1Value.Parse), file.Name, true, onlyCovers, searchExpunged);
                }));
            }
            else
            {
                return(AsyncInfo.Run <FileSearchResult, HttpProgress>(async(token, progress) =>
                {
                    var hash = await SHA1Value.ComputeAsync(file);
                    return new FileSearchResult(keyword, category, Enumerable.Repeat(hash, 1), file.Name, false, onlyCovers, searchExpunged);
                }));
            }
        }
예제 #8
0
 internal RunningBinPathGroup(string generatedAssemblyName, BinPathConfiguration head, BinPathConfiguration[] similars, SHA1Value sha)
 {
     Debug.Assert(generatedAssemblyName != null && generatedAssemblyName.StartsWith(StObjContextRoot.GeneratedAssemblyName));
     Debug.Assert(similars != null && similars.Length > 0 && similars[0] == head);
     _generatedDllName     = $"{generatedAssemblyName}-{head.Name}.dll";
     Configuration         = head;
     SimilarConfigurations = similars;
     RunSignature          = sha;
     GeneratedSource       = CreateG0(head);
     GeneratedAssembly     = CreateAssembly(head);
     _names = similars.Select(c => c.Name).Concatenate();
 }
예제 #9
0
 /// <summary>
 /// Tries to extract a SHA1 signature from a file: the first valid SHA value that appears in the <see cref="NormalizedPath.Parts"/> (split by dot '.')
 /// form the end to start of the <see cref="Path"/>.
 /// <para>
 /// This can be overridden to detect the signature differently.
 /// </para>
 /// </summary>
 /// <param name="monitor">The monitor to use.</param>
 /// <returns><see cref="SHA1Value.Zero"/> if not found.</returns>
 protected virtual SHA1Value DoGetSignature(IActivityMonitor monitor)
 {
     foreach (var part in Path.Parts.Reverse())
     {
         foreach (var p in part.Split('.').Reverse())
         {
             if (SHA1Value.TryParse(p, out var signature))
             {
                 return(signature);
             }
         }
     }
     return(SHA1Value.Zero);
 }
예제 #10
0
        public void SHA1_CompareTo(string v1, string v2, char cmp)
        {
            var s1 = SHA1Value.Parse(v1);
            var s2 = SHA1Value.Parse(v2);

            switch (cmp)
            {
            case '>': s1.CompareTo(s2).Should().BeGreaterThan(0); break;

            case '<': s1.CompareTo(s2).Should().BeLessThan(0); break;

            default:  s1.CompareTo(s2).Should().Be(0); break;
            }
        }
        /// <summary>
        /// Overridden to match [assembly: CK.StObj.Signature( "..." )] SHA1 attribute in the first line.
        /// </summary>
        /// <param name="monitor"></param>
        /// <returns></returns>
        protected override SHA1Value DoGetSignature(IActivityMonitor monitor)
        {
            var firstLine = SafeReadFirstLine(monitor, Path);

            if (firstLine != null)
            {
                var m = Regex.Match(firstLine, @"\s*\[\s*assembly\s*:\s*CK.StObj.Signature\s*\(\s*@?""(?<1>.*?)""");
                if (m.Success && SHA1Value.TryParse(m.Groups[1].Value, out var signature))
                {
                    return(signature);
                }
            }
            monitor.Warn($"Unable to read [assembly: CK.StObj.Signature( \"...\" )] attribute from '{Path}'.");
            return(SHA1Value.Zero);
        }
예제 #12
0
        private IAsyncAction loadImageUriAndHash()
        {
            return(Run(async token =>
            {
                var loadPageUri = default(Uri);
                if (this.failToken != null)
                {
                    loadPageUri = new Uri(this.PageUri, $"?{this.failToken}");
                }
                else
                {
                    loadPageUri = this.PageUri;
                }
                var doc = await Client.Current.HttpClient.GetDocumentAsync(loadPageUri);

                this.imageUri = new Uri(doc.GetElementbyId("img").GetAttributeValue("src", "").DeEntitize());
                var originalNode = doc.GetElementbyId("i7").Element("a");
                if (originalNode == null)
                {
                    this.originalImageUri = null;
                }
                else
                {
                    this.originalImageUri = new Uri(originalNode.GetAttributeValue("href", "").DeEntitize());
                }
                var hashNode = doc.GetElementbyId("i6").Element("a");
                this.ImageHash = SHA1Value.Parse(hashMatcher.Match(hashNode.GetAttributeValue("href", "").DeEntitize()).Groups[1].Value);
                var loadFail = doc.GetElementbyId("loadfail").GetAttributeValue("onclick", "").DeEntitize();
                var oft = this.failToken;
                var nft = failTokenMatcher.Match(loadFail).Groups[1].Value;
                if (oft == null)
                {
                    this.failToken = $"nl={nft}";
                }
                else
                {
                    this.failToken = $"{oft}&nl={nft}";
                }
            }));
        }
예제 #13
0
        public async Task SHA1_from_file_async()
        {
            var sha  = SHA1Value.ComputeFileSHA1(GetFilePath());
            var sha2 = await SHA1Value.ComputeFileSHA1Async(GetFilePath());

            sha2.Should().Be(sha);
            using (var compressedPath = new TemporaryFile())
            {
                using (var input = new FileStream(GetFilePath(), FileMode.Open, FileAccess.Read, FileShare.Read, 4096, FileOptions.SequentialScan | FileOptions.Asynchronous))
                    using (var compressed = new FileStream(compressedPath.Path, FileMode.Truncate, FileAccess.Write, FileShare.None, 4096, FileOptions.SequentialScan | FileOptions.Asynchronous))
                    {
                        var writer = GetCompressShellAsync(w => input.CopyToAsync(w));
                        await writer(compressed);
                    }
                var shaCompressed = await SHA1Value.ComputeFileSHA1Async(compressedPath.Path);

                shaCompressed.Should().NotBe(sha);
                var localSha = await SHA1Value.ComputeFileSHA1Async(compressedPath.Path, r => new GZipStream(r, CompressionMode.Decompress, true));

                localSha.Should().Be(sha);
            }
        }
예제 #14
0
 public static Expression <Func <GalleryImageModel, bool> > FKEquals(SHA1Value value)
 {
     var(d0, d1, d2) = ImageModel.ToStorage(value);
     return(m => m.Data0 == d0 && m.Data1 == d1 && m.Data2 == d2);
 }
예제 #15
0
        public void SHA1_invalid_parse(int offset, string s, bool success)
        {
            SHA1Value v;

            SHA1Value.TryParse(s, offset, out v).Should().Be(success);
        }
예제 #16
0
 internal RunningBinPathGroup(string generatedAssemblyName, BinPathConfiguration head, SHA1Value sha)
     : this(generatedAssemblyName, head, new[] { head }, sha)
 {
 }
예제 #17
0
 /// <summary>
 /// Writes a SHA1 signature for this directory.
 /// </summary>
 /// <param name="signature">The signature to write.</param>
 public void CreateOrUpdateSignatureFile(SHA1Value signature)
 {
     File.WriteAllText(Path.AppendPart(SignatureFileName), signature.ToString());
 }
예제 #18
0
 /// <summary>
 /// Writes the SHA1 file signature for this file.
 /// </summary>
 /// <param name="signature">The signature to write.</param>
 public void CreateOrUpdateSignatureFile(SHA1Value signature)
 {
     File.WriteAllText(_signatureFile, signature.ToString());
 }