From 377e3177e5de7842bdca177de5944c7c47117ca2 Mon Sep 17 00:00:00 2001 From: 13xforever Date: Thu, 28 Jan 2021 18:37:37 +0500 Subject: [PATCH] replace runtime builder with source generator for unicode confusables --- HomoglyphConverter/ConfusablesBuilder.cs | 60 ------- HomoglyphConverter/HomoglyphConverter.csproj | 5 +- HomoglyphConverter/Normalizer.cs | 3 +- HomoglyphConverter/confusables.txt.gz | Bin 117316 -> 0 bytes HomoglyphConverter/readme.md | 4 +- .../ConfusablesSourceGenerator.cs | 151 ++++++++++++++++++ SourceGenerators/SourceGenerators.csproj | 13 ++ discord-bot-net.sln | 6 + 8 files changed, 176 insertions(+), 66 deletions(-) delete mode 100644 HomoglyphConverter/ConfusablesBuilder.cs delete mode 100644 HomoglyphConverter/confusables.txt.gz create mode 100644 SourceGenerators/ConfusablesSourceGenerator.cs create mode 100644 SourceGenerators/SourceGenerators.csproj diff --git a/HomoglyphConverter/ConfusablesBuilder.cs b/HomoglyphConverter/ConfusablesBuilder.cs deleted file mode 100644 index 90be7800..00000000 --- a/HomoglyphConverter/ConfusablesBuilder.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.IO.Compression; -using System.Linq; -using System.Reflection; -using System.Text; - -namespace HomoglyphConverter -{ - public static class ConfusablesBuilder - { - private static readonly char[] CommentSplitter = {'#'}; - private static readonly char[] FieldSplitter = {';'}; - private static readonly char[] PairSplitter = {' '}; - - // requires a gzipped mapping from http://www.unicode.org/Public/security/latest/confusables.txt - public static Dictionary Build() - { - var result = new Dictionary(); - var assembly = Assembly.GetAssembly(typeof(ConfusablesBuilder)); - var resourceName = assembly?.GetManifestResourceNames().FirstOrDefault(n => n.EndsWith("confusables.txt.gz", StringComparison.InvariantCultureIgnoreCase)); - if (string.IsNullOrEmpty(resourceName)) - throw new InvalidOperationException("Confusables embedded resource was not found"); - - using var stream = assembly?.GetManifestResourceStream(resourceName); - if (stream is null) - throw new InvalidOperationException("Failed to get confusables resource stream"); - - using var gzip = new GZipStream(stream, CompressionMode.Decompress); - using var reader = new StreamReader(gzip, Encoding.UTF8, false); - while (reader.ReadLine() is string line) - { - if (string.IsNullOrEmpty(line) || line.StartsWith("#")) - continue; - - var lineParts = line.Split(CommentSplitter, 2); - var mapping = lineParts[0].Split(FieldSplitter, 3); - if (mapping.Length < 2) - throw new InvalidOperationException("Invalid confusable mapping line: " + line); - - try - { - var confusableChar = uint.Parse(mapping[0].Trim(), NumberStyles.HexNumber); - var skeletonChars = mapping[1].Split(PairSplitter, StringSplitOptions.RemoveEmptyEntries).Select(l => uint.Parse(l, NumberStyles.HexNumber)).ToArray(); - result.Add(confusableChar, skeletonChars); - } - catch (Exception e) - { - throw new InvalidOperationException("Invalid confusable mapping line:" + line, e); - } - } - if (result.Count == 0) - throw new InvalidOperationException("Empty confusable mapping source"); - - return result; - } - } -} diff --git a/HomoglyphConverter/HomoglyphConverter.csproj b/HomoglyphConverter/HomoglyphConverter.csproj index eaaa55d7..7cc0b375 100644 --- a/HomoglyphConverter/HomoglyphConverter.csproj +++ b/HomoglyphConverter/HomoglyphConverter.csproj @@ -7,11 +7,12 @@ - + + - + diff --git a/HomoglyphConverter/Normalizer.cs b/HomoglyphConverter/Normalizer.cs index 5d2406c5..6b8fb570 100644 --- a/HomoglyphConverter/Normalizer.cs +++ b/HomoglyphConverter/Normalizer.cs @@ -7,7 +7,6 @@ namespace HomoglyphConverter { public static class Normalizer { - private static readonly Dictionary Mapping = ConfusablesBuilder.Build(); private static readonly Encoding Utf32 = new UTF32Encoding(false, false, true); private static readonly Dictionary HomoglyphSequences = new() @@ -72,7 +71,7 @@ namespace HomoglyphConverter var result = new List(convertedLength); foreach (var ch in uintInput) { - if (Mapping.TryGetValue(ch, out var replacement)) + if (Confusables.Mapping.TryGetValue(ch, out var replacement)) result.AddRange(replacement); else result.Add(ch); diff --git a/HomoglyphConverter/confusables.txt.gz b/HomoglyphConverter/confusables.txt.gz deleted file mode 100644 index 3ee1491365b840b51edc3b3bef6ed2f9bd8845ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117316 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 OdFNkB+&6p5^$Gx1h>xED diff --git a/HomoglyphConverter/readme.md b/HomoglyphConverter/readme.md index a627d9eb..6cc0c67d 100644 --- a/HomoglyphConverter/readme.md +++ b/HomoglyphConverter/readme.md @@ -1,9 +1,9 @@ Homoglyph Converter =================== -This is a straight up implementation of the recommended [confusable detection algorithm](http://www.unicode.org/reports/tr39/#Confusable_Detection). It is mainly used to check for mod impersonation. +This is a straight up implementation of the recommended [confusable detection algorithm](https://www.unicode.org/reports/tr39/#Confusable_Detection). It is mainly used to check for mod impersonation. -You can get the latest version of the mappings from the [Unicode.org](http://www.unicode.org/Public/security/latest/confusables.txt). You'll need to manually gzip it for embedding in the resources. +You can get the latest version of the mappings from the [Unicode.org](https://www.unicode.org/Public/security/latest/confusables.txt). You'll need to manually gzip it for embedding in the resources. Code is split in two parts: * Builder will load the mapping file from the resources and will build the mapping dictionary that can be used to quickly substitute the character sequences. diff --git a/SourceGenerators/ConfusablesSourceGenerator.cs b/SourceGenerators/ConfusablesSourceGenerator.cs new file mode 100644 index 00000000..401c5cb5 --- /dev/null +++ b/SourceGenerators/ConfusablesSourceGenerator.cs @@ -0,0 +1,151 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Text; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Text; + +namespace SourceGenerators +{ + [Generator] + public class ConfusablesSourceGenerator : ISourceGenerator + { + private static readonly char[] CommentSplitter = {'#'}; + private static readonly char[] FieldSplitter = {';'}; + private static readonly char[] PairSplitter = {' '}; + + private static readonly DiagnosticDescriptor ConfusablesCheckWarning = new( + id: "CONFUSABLES001", + title: "Failed to check confusables version", + messageFormat: "Error while checking confusables version: '{0}'", + category: nameof(ConfusablesSourceGenerator), + DiagnosticSeverity.Warning, + isEnabledByDefault: true + ); + + private static readonly DiagnosticDescriptor ConfusablesVersionWarning = new( + id: "CONFUSABLES002", + title: "Outdated confusables version", + messageFormat: "Local confusables version: {0} ({1}), remote confusables version: {2} ({3})", + category: nameof(ConfusablesSourceGenerator), + DiagnosticSeverity.Warning, + isEnabledByDefault: true + ); + + public void Initialize(GeneratorInitializationContext context) + { + } + + public void Execute(GeneratorExecutionContext context) + { + var resourceName = context.AdditionalFiles.FirstOrDefault(f => Path.GetFileName(f.Path).Equals("confusables.txt")); + if (resourceName is null) + return; + + using var httpClient = new HttpClient(); + using var msg = new HttpRequestMessage(HttpMethod.Get, "https://www.unicode.org/Public/security/latest/confusables.txt"); + msg.Headers.Range = new(0, 512); + var requestTask = httpClient.SendAsync(msg); + + using var stream = File.Open(resourceName.Path, FileMode.Open, FileAccess.Read, FileShare.Read); + if (stream is null) + throw new InvalidOperationException("Failed to get confusables stream"); + + var mapping = new Dictionary(); + var date = ""; + var version = ""; + using var reader = new StreamReader(stream, Encoding.UTF8, false); + while (reader.ReadLine() is string line) + { + if (string.IsNullOrEmpty(line) || line.StartsWith("#")) + { + if (line is {Length: > 10}) + { + if (line.StartsWith("# Date: ")) + date = line.Substring(8).Trim(); + else if (line.StartsWith("# Version: ")) + version = line.Substring(11).Trim(); + } + continue; + } + + var lineParts = line.Split(CommentSplitter, 2); + var mappingParts = lineParts[0].Split(FieldSplitter, 3); + if (mappingParts.Length < 2) + throw new InvalidOperationException("Invalid confusable mapping line: " + line); + + try + { + var confusableChar = uint.Parse(mappingParts[0].Trim(), NumberStyles.HexNumber); + var skeletonChars = mappingParts[1].Split(PairSplitter, StringSplitOptions.RemoveEmptyEntries).Select(l => uint.Parse(l, NumberStyles.HexNumber)).ToArray(); + mapping.Add(confusableChar, skeletonChars); + } + catch (Exception e) + { + throw new InvalidOperationException("Invalid confusable mapping line:" + line, e); + } + } + if (mapping.Count == 0) + throw new InvalidOperationException("Empty confusable mapping source"); + + var ns = context.Compilation.AssemblyName; + var cn = Path.GetFileNameWithoutExtension(resourceName.Path); + if (cn.Length == 1) + cn = cn.ToUpper(); + else + cn = char.ToUpper(cn[0]) + cn.Substring(1); + if (!Version.TryParse(version, out _)) + version = ""; + + + var result = new StringBuilder() + .AppendLine("using System;") + .AppendLine("using System.Collections.Generic;") + .AppendLine() + .AppendLine($"namespace {ns}") + .AppendLine("{") + .AppendLine($" internal static class {cn}") + .AppendLine(" {") + .AppendLine($" public const string Version = \"{version}\";") + .AppendLine() + .AppendLine($" public const string Date = \"{date}\";") + .AppendLine() + .AppendLine(" public static readonly Dictionary Mapping = new()") + .AppendLine(" {"); + foreach (var kvp in mapping.OrderBy(i => i.Key)) + result.AppendLine($@" [0x{kvp.Key:X5}u] = new[] {{ {string.Join(", ", kvp.Value!.OrderBy(i => i).Select(n => $"0x{n:X5}u"))} }},"); + result.AppendLine(" };") + .AppendLine(" }") + .AppendLine("}"); + + context.AddSource($"{cn}.Generated.cs", SourceText.From(result.ToString(), Encoding.UTF8)); + + try + { + var requestResult = requestTask.ConfigureAwait(false).GetAwaiter().GetResult(); + var response = requestResult.Content.ReadAsStringAsync().ConfigureAwait(false).GetAwaiter().GetResult().Split('\n'); + var remoteVer = ""; + var remoteDate = ""; + foreach (var l in response) + { + if (l.StartsWith("# Date: ")) + remoteDate = l.Substring(8).Trim(); + else if (l.StartsWith("# Version: ")) + remoteVer = l.Substring(11).Trim(); + } + if (!string.IsNullOrEmpty(remoteDate) && remoteDate != date + || !string.IsNullOrEmpty(remoteVer) && remoteVer != version) + { + context.ReportDiagnostic(Diagnostic.Create(ConfusablesVersionWarning, Location.None, version, date, remoteVer, remoteDate)); + } + } + catch + { + context.ReportDiagnostic(Diagnostic.Create(ConfusablesCheckWarning, Location.None)); + } + } + } +} diff --git a/SourceGenerators/SourceGenerators.csproj b/SourceGenerators/SourceGenerators.csproj new file mode 100644 index 00000000..fdb65fa0 --- /dev/null +++ b/SourceGenerators/SourceGenerators.csproj @@ -0,0 +1,13 @@ + + + + netstandard2.0 + latest + + + + + + + + diff --git a/discord-bot-net.sln b/discord-bot-net.sln index faeab2c1..9d0c5366 100644 --- a/discord-bot-net.sln +++ b/discord-bot-net.sln @@ -38,6 +38,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediafireClient", "Clients\ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YandexDiskClient", "Clients\YandexDiskClient\YandexDiskClient.csproj", "{CABC3E5E-2153-443B-A5A8-DA3E389359EC}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SourceGenerators", "SourceGenerators\SourceGenerators.csproj", "{1A75FAF1-1DD1-43FF-A789-1AB216F4B94E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -83,6 +85,10 @@ Global {CABC3E5E-2153-443B-A5A8-DA3E389359EC}.Debug|Any CPU.Build.0 = Debug|Any CPU {CABC3E5E-2153-443B-A5A8-DA3E389359EC}.Release|Any CPU.ActiveCfg = Release|Any CPU {CABC3E5E-2153-443B-A5A8-DA3E389359EC}.Release|Any CPU.Build.0 = Release|Any CPU + {1A75FAF1-1DD1-43FF-A789-1AB216F4B94E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1A75FAF1-1DD1-43FF-A789-1AB216F4B94E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1A75FAF1-1DD1-43FF-A789-1AB216F4B94E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1A75FAF1-1DD1-43FF-A789-1AB216F4B94E}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE