From 14e27f3d23e608f7b8e8048104c543d9d8f5b744 Mon Sep 17 00:00:00 2001 From: dayepao <56154142+dayepao@users.noreply.github.com> Date: Thu, 20 Aug 2026 10:47:24 +0800 Subject: [PATCH] fix: preserve Mihomo Reality short-id as YAML string (#9964) --- .../CoreConfig/CoreConfigClashService.cs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigClashService.cs b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigClashService.cs index ce7e58e3..4c3b91aa 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigClashService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigClashService.cs @@ -1,3 +1,6 @@ +using YamlDotNet.Core; +using YamlDotNet.RepresentationModel; + namespace ServiceLib.Services.CoreConfig; /// @@ -127,7 +130,27 @@ public class CoreConfigClashService(Config config, bool isTunEnabled) Logging.SaveLog($"{_tag}-Mixin", ex); } + // Mihomo parses plain values such as 815458e4 as floats, so quote REALITY short IDs. + var originalRealityShortIds = new List<(Dictionary RealityOptions, string ShortId)>(); + if (fileContent.GetValueOrDefault("proxies") is List proxies) + { + foreach (var proxy in proxies.OfType>()) + { + if (proxy.GetValueOrDefault("reality-opts") is Dictionary realityOptions + && realityOptions.GetValueOrDefault("short-id") is string shortId + && !shortId.StartsWith(tagYamlStr2, StringComparison.Ordinal)) + { + originalRealityShortIds.Add((realityOptions, shortId)); + realityOptions["short-id"] = new YamlScalarNode(shortId) { Style = ScalarStyle.DoubleQuoted }; + } + } + } + var txtFileNew = YamlUtils.ToYaml(fileContent).Replace(tagYamlStr2, tagYamlStr3); + foreach (var (realityOptions, shortId) in originalRealityShortIds) + { + realityOptions["short-id"] = shortId; + } await File.WriteAllTextAsync(fileName, txtFileNew); //check again if (!File.Exists(fileName))