mirror of
https://github.com/2dust/v2rayN.git
synced 2026-10-31 17:45:00 +03:00
Sync xray (#9708)
* Sync xray fragment * Sync xray freedom domainStrategy * Add Strategy4ProxyDial
This commit is contained in:
@@ -59,7 +59,7 @@ internal static class CoreConfigTestFactory
|
|||||||
},
|
},
|
||||||
WebDavItem = new WebDavItem(),
|
WebDavItem = new WebDavItem(),
|
||||||
CheckUpdateItem = new CheckUpdateItem(),
|
CheckUpdateItem = new CheckUpdateItem(),
|
||||||
Fragment4RayItem = new Fragment4RayItem { Packets = "tlshello", Length = "100-200", Interval = "10-20" },
|
Fragment4RayItem = new Fragment4RayItem { Packets = "tlshello", Lengths = ["100-200"], Delays = ["10-20"] },
|
||||||
Inbound =
|
Inbound =
|
||||||
[
|
[
|
||||||
new InItem
|
new InItem
|
||||||
@@ -84,6 +84,7 @@ internal static class CoreConfigTestFactory
|
|||||||
ParallelQuery = false,
|
ParallelQuery = false,
|
||||||
Strategy4Freedom = Global.AsIs,
|
Strategy4Freedom = Global.AsIs,
|
||||||
Strategy4Proxy = Global.AsIs,
|
Strategy4Proxy = Global.AsIs,
|
||||||
|
Strategy4ProxyDial = Global.AsIs,
|
||||||
},
|
},
|
||||||
IndexId = string.Empty,
|
IndexId = string.Empty,
|
||||||
SubIndexId = string.Empty,
|
SubIndexId = string.Empty,
|
||||||
|
|||||||
@@ -567,7 +567,7 @@ public class CoreConfigV2rayServiceTests
|
|||||||
|
|
||||||
var directOutbound = cfg.outbounds.FirstOrDefault(o => o.tag == Global.DirectTag && o.protocol == "freedom");
|
var directOutbound = cfg.outbounds.FirstOrDefault(o => o.tag == Global.DirectTag && o.protocol == "freedom");
|
||||||
directOutbound.Should().NotBeNull();
|
directOutbound.Should().NotBeNull();
|
||||||
directOutbound!.settings.domainStrategy.Should().Be("UseIPv4");
|
directOutbound!.streamSettings.sockopt!.domainStrategy.Should().Be("UseIPv4");
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|||||||
@@ -485,12 +485,17 @@ public class Utils
|
|||||||
|
|
||||||
public static string? DomainStrategy4Sbox(string? strategy)
|
public static string? DomainStrategy4Sbox(string? strategy)
|
||||||
{
|
{
|
||||||
|
if (strategy is null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
return strategy switch
|
return strategy switch
|
||||||
{
|
{
|
||||||
not null when strategy.StartsWith("UseIPv4") => "prefer_ipv4",
|
_ when strategy.StartsWith("UseIPv6") => "prefer_ipv6",
|
||||||
not null when strategy.StartsWith("UseIPv6") => "prefer_ipv6",
|
_ when strategy.StartsWith("UseIP") => "prefer_ipv4",
|
||||||
not null when strategy.StartsWith("ForceIPv4") => "ipv4_only",
|
_ when strategy.StartsWith("ForceIPv6") => "ipv6_only",
|
||||||
not null when strategy.StartsWith("ForceIPv6") => "ipv6_only",
|
_ when strategy.StartsWith("ForceIP") => "ipv4_only",
|
||||||
_ => null
|
_ => null
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -168,10 +168,16 @@ public static class ConfigHandler
|
|||||||
config.Fragment4RayItem ??= new()
|
config.Fragment4RayItem ??= new()
|
||||||
{
|
{
|
||||||
Packets = "tlshello",
|
Packets = "tlshello",
|
||||||
Length = "50-100",
|
|
||||||
Interval = "10-20",
|
|
||||||
MaxSplit = "0"
|
|
||||||
};
|
};
|
||||||
|
config.Fragment4RayItem.MaxSplit ??= "0";
|
||||||
|
if ((config.Fragment4RayItem.Lengths ?? []).Count == 0)
|
||||||
|
{
|
||||||
|
config.Fragment4RayItem.Lengths = [config.Fragment4RayItem.Length ?? "50-100"];
|
||||||
|
}
|
||||||
|
if ((config.Fragment4RayItem.Delays ?? []).Count == 0)
|
||||||
|
{
|
||||||
|
config.Fragment4RayItem.Delays = [config.Fragment4RayItem.Interval ?? "10-20"];
|
||||||
|
}
|
||||||
config.GlobalHotkeys ??= [];
|
config.GlobalHotkeys ??= [];
|
||||||
|
|
||||||
if (config.SystemProxyItem.SystemProxyExceptions.IsNullOrEmpty())
|
if (config.SystemProxyItem.SystemProxyExceptions.IsNullOrEmpty())
|
||||||
|
|||||||
@@ -249,9 +249,14 @@ public class CheckUpdateItem
|
|||||||
public class Fragment4RayItem
|
public class Fragment4RayItem
|
||||||
{
|
{
|
||||||
public string? Packets { get; set; }
|
public string? Packets { get; set; }
|
||||||
|
public List<string>? Lengths { get; set; }
|
||||||
|
public List<string>? Delays { get; set; }
|
||||||
|
public string? MaxSplit { get; set; }
|
||||||
|
|
||||||
|
// For migration from old version, remove those properties in the future
|
||||||
public string? Length { get; set; }
|
public string? Length { get; set; }
|
||||||
public string? Interval { get; set; }
|
public string? Interval { get; set; }
|
||||||
public string? MaxSplit { get; set; }
|
// migration end
|
||||||
}
|
}
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
@@ -275,6 +280,7 @@ public class SimpleDNSItem
|
|||||||
public string? BootstrapDNS { get; set; }
|
public string? BootstrapDNS { get; set; }
|
||||||
public string? Strategy4Freedom { get; set; }
|
public string? Strategy4Freedom { get; set; }
|
||||||
public string? Strategy4Proxy { get; set; }
|
public string? Strategy4Proxy { get; set; }
|
||||||
|
public string? Strategy4ProxyDial { get; set; }
|
||||||
public bool? ServeStale { get; set; }
|
public bool? ServeStale { get; set; }
|
||||||
public bool? ParallelQuery { get; set; }
|
public bool? ParallelQuery { get; set; }
|
||||||
public string? Hosts { get; set; }
|
public string? Hosts { get; set; }
|
||||||
|
|||||||
@@ -136,8 +136,6 @@ public class Outboundsettings4Ray
|
|||||||
|
|
||||||
public Response4Ray? response { get; set; }
|
public Response4Ray? response { get; set; }
|
||||||
|
|
||||||
public string? domainStrategy { get; set; }
|
|
||||||
|
|
||||||
public int? userLevel { get; set; }
|
public int? userLevel { get; set; }
|
||||||
|
|
||||||
public string? secretKey { get; set; }
|
public string? secretKey { get; set; }
|
||||||
@@ -516,6 +514,8 @@ public class MaskSettings4Ray
|
|||||||
|
|
||||||
public string? length { get; set; }
|
public string? length { get; set; }
|
||||||
public string? delay { get; set; }
|
public string? delay { get; set; }
|
||||||
|
public List<string>? lengths { get; set; }
|
||||||
|
public List<string>? delays { get; set; }
|
||||||
public int? maxSplit { get; set; }
|
public int? maxSplit { get; set; }
|
||||||
|
|
||||||
// noise
|
// noise
|
||||||
@@ -547,6 +547,8 @@ public class AccountsItem4Ray
|
|||||||
|
|
||||||
public class Sockopt4Ray
|
public class Sockopt4Ray
|
||||||
{
|
{
|
||||||
|
public string? domainStrategy { get; set; }
|
||||||
|
|
||||||
public string? dialerProxy { get; set; }
|
public string? dialerProxy { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("interface")]
|
[JsonPropertyName("interface")]
|
||||||
|
|||||||
Generated
+18
@@ -3528,6 +3528,24 @@ namespace ServiceLib.Resx {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 Proxy Dial Resolution Strategy 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbProxyDialResolveStrategy {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbProxyDialResolveStrategy", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 Not recommended; may cause routing loops. 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbProxyDialResolveStrategyTip {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbProxyDialResolveStrategyTip", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Public Key 的本地化字符串。
|
/// 查找类似 Public Key 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -1830,4 +1830,10 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if
|
|||||||
<data name="TbRootCertificateProviderTip" xml:space="preserve">
|
<data name="TbRootCertificateProviderTip" xml:space="preserve">
|
||||||
<value>Only applies to the v2rayN GUI's downloads and network requests. Does not affect the core's certificate validation.</value>
|
<value>Only applies to the v2rayN GUI's downloads and network requests. Does not affect the core's certificate validation.</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbProxyDialResolveStrategy" xml:space="preserve">
|
||||||
|
<value>Proxy Dial Resolution Strategy</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbProxyDialResolveStrategyTip" xml:space="preserve">
|
||||||
|
<value>Not recommended; may cause routing loops.</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -1827,4 +1827,10 @@
|
|||||||
<data name="TbRootCertificateProviderTip" xml:space="preserve">
|
<data name="TbRootCertificateProviderTip" xml:space="preserve">
|
||||||
<value>仅用于 v2rayN 界面程序的下载及网络请求,不影响核心的证书验证。</value>
|
<value>仅用于 v2rayN 界面程序的下载及网络请求,不影响核心的证书验证。</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbProxyDialResolveStrategy" xml:space="preserve">
|
||||||
|
<value>连接代理解析策略</value>
|
||||||
|
</data>
|
||||||
|
<data name="TbProxyDialResolveStrategyTip" xml:space="preserve">
|
||||||
|
<value>不建议开启,特殊情况可能回环。</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -171,7 +171,7 @@ public partial class CoreConfigSingboxService
|
|||||||
_coreConfig.dns.rules.Add(new()
|
_coreConfig.dns.rules.Add(new()
|
||||||
{
|
{
|
||||||
server = Global.SingboxDirectDNSTag,
|
server = Global.SingboxDirectDNSTag,
|
||||||
strategy = Utils.DomainStrategy4Sbox(simpleDnsItem.Strategy4Freedom),
|
strategy = Utils.DomainStrategy4Sbox(simpleDnsItem.Strategy4ProxyDial),
|
||||||
domain = context.ProtectDomainList.ToList(),
|
domain = context.ProtectDomainList.ToList(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -417,11 +417,15 @@ public partial class CoreConfigSingboxService
|
|||||||
var tls = new Tls4Sbox()
|
var tls = new Tls4Sbox()
|
||||||
{
|
{
|
||||||
enabled = true,
|
enabled = true,
|
||||||
record_fragment = _config.CoreBasicItem.EnableFragment ? true : null,
|
|
||||||
server_name = serverName,
|
server_name = serverName,
|
||||||
insecure = _node.GetAllowInsecure(),
|
insecure = _node.GetAllowInsecure(),
|
||||||
alpn = _node.GetAlpn(),
|
alpn = _node.GetAlpn(),
|
||||||
};
|
};
|
||||||
|
if (_config.CoreBasicItem.EnableFragment == true)
|
||||||
|
{
|
||||||
|
tls.fragment = true;
|
||||||
|
tls.record_fragment = true;
|
||||||
|
}
|
||||||
if (_node.Fingerprint.IsNotEmpty())
|
if (_node.Fingerprint.IsNotEmpty())
|
||||||
{
|
{
|
||||||
tls.utls = new Utls4Sbox()
|
tls.utls = new Utls4Sbox()
|
||||||
|
|||||||
@@ -10,18 +10,27 @@ public partial class CoreConfigSingboxService
|
|||||||
var simpleDnsItem = context.SimpleDnsItem;
|
var simpleDnsItem = context.SimpleDnsItem;
|
||||||
|
|
||||||
var defaultDomainResolverTag = Global.SingboxDirectDNSTag;
|
var defaultDomainResolverTag = Global.SingboxDirectDNSTag;
|
||||||
var directDnsStrategy = Utils.DomainStrategy4Sbox(simpleDnsItem.Strategy4Freedom);
|
var dialDnsStrategy = Utils.DomainStrategy4Sbox(simpleDnsItem.Strategy4ProxyDial);
|
||||||
|
|
||||||
var rawDNSItem = context.RawDnsItem;
|
var rawDNSItem = context.RawDnsItem;
|
||||||
if (rawDNSItem is { Enabled: true })
|
if (rawDNSItem is { Enabled: true })
|
||||||
{
|
{
|
||||||
defaultDomainResolverTag = Global.SingboxLocalDNSTag;
|
defaultDomainResolverTag = Global.SingboxLocalDNSTag;
|
||||||
directDnsStrategy = rawDNSItem.DomainStrategy4Freedom.IsNullOrEmpty() ? null : rawDNSItem.DomainStrategy4Freedom;
|
dialDnsStrategy = rawDNSItem.DomainStrategy4Freedom.IsNullOrEmpty() ? null : rawDNSItem.DomainStrategy4Freedom;
|
||||||
|
}
|
||||||
|
else if (!simpleDnsItem.Strategy4Freedom.IsNullOrEmpty())
|
||||||
|
{
|
||||||
|
var directOutbound = _coreConfig.outbounds.FirstOrDefault(o => o.tag == Global.DirectTag);
|
||||||
|
directOutbound?.domain_resolver = new()
|
||||||
|
{
|
||||||
|
server = defaultDomainResolverTag,
|
||||||
|
strategy = Utils.DomainStrategy4Sbox(simpleDnsItem.Strategy4Freedom),
|
||||||
|
};
|
||||||
}
|
}
|
||||||
_coreConfig.route.default_domain_resolver = new()
|
_coreConfig.route.default_domain_resolver = new()
|
||||||
{
|
{
|
||||||
server = defaultDomainResolverTag,
|
server = defaultDomainResolverTag,
|
||||||
strategy = directDnsStrategy
|
strategy = dialDnsStrategy
|
||||||
};
|
};
|
||||||
|
|
||||||
if (context.IsTunEnabled)
|
if (context.IsTunEnabled)
|
||||||
|
|||||||
@@ -43,11 +43,9 @@ public partial class CoreConfigV2rayService
|
|||||||
var outbound = _coreConfig.outbounds.FirstOrDefault(t => t is { protocol: "freedom", tag: Global.DirectTag });
|
var outbound = _coreConfig.outbounds.FirstOrDefault(t => t is { protocol: "freedom", tag: Global.DirectTag });
|
||||||
if (outbound != null)
|
if (outbound != null)
|
||||||
{
|
{
|
||||||
outbound.settings = new()
|
outbound.streamSettings ??= new();
|
||||||
{
|
outbound.streamSettings.sockopt ??= new();
|
||||||
domainStrategy = strategy4Freedom,
|
outbound.streamSettings.sockopt.domainStrategy = strategy4Freedom;
|
||||||
userLevel = 0
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,6 +62,24 @@ public partial class CoreConfigV2rayService
|
|||||||
.ForEach(outbound => outbound.targetStrategy = strategy4Proxy);
|
.ForEach(outbound => outbound.targetStrategy = strategy4Proxy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var strategy4DialProxy = simpleDnsItem?.Strategy4ProxyDial ?? Global.AsIs;
|
||||||
|
//Outbound DialProxy domainStrategy
|
||||||
|
if (strategy4DialProxy.IsNotEmpty() && strategy4DialProxy != Global.AsIs)
|
||||||
|
{
|
||||||
|
var xraySupportConfigTypeNames = Global.XraySupportConfigType
|
||||||
|
.Select(x => x == EConfigType.Hysteria2 ? "hysteria" : Global.ProtocolTypes[x])
|
||||||
|
.ToHashSet();
|
||||||
|
_coreConfig.outbounds
|
||||||
|
.Where(t => xraySupportConfigTypeNames.Contains(t.protocol))
|
||||||
|
.ToList()
|
||||||
|
.ForEach(outbound =>
|
||||||
|
{
|
||||||
|
outbound.streamSettings ??= new();
|
||||||
|
outbound.streamSettings.sockopt ??= new();
|
||||||
|
outbound.streamSettings.sockopt.domainStrategy = strategy4DialProxy;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
FillDnsServers(dnsItem);
|
FillDnsServers(dnsItem);
|
||||||
FillDnsHosts(dnsItem);
|
FillDnsHosts(dnsItem);
|
||||||
|
|
||||||
@@ -384,11 +400,9 @@ public partial class CoreConfigV2rayService
|
|||||||
var outbound = _coreConfig.outbounds.FirstOrDefault(t => t is { protocol: "freedom", tag: Global.DirectTag });
|
var outbound = _coreConfig.outbounds.FirstOrDefault(t => t is { protocol: "freedom", tag: Global.DirectTag });
|
||||||
if (outbound != null)
|
if (outbound != null)
|
||||||
{
|
{
|
||||||
outbound.settings = new()
|
outbound.streamSettings ??= new();
|
||||||
{
|
outbound.streamSettings.sockopt ??= new();
|
||||||
domainStrategy = domainStrategy4Freedom,
|
outbound.streamSettings.sockopt.domainStrategy = domainStrategy4Freedom;
|
||||||
userLevel = 0,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -865,21 +865,10 @@ public partial class CoreConfigV2rayService
|
|||||||
&& (n.streamSettings?.sockopt?.dialerProxy?.IsNullOrEmpty() ?? true))
|
&& (n.streamSettings?.sockopt?.dialerProxy?.IsNullOrEmpty() ?? true))
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
var (fragmentMask, noiseMask) = BuildFragmentsMasks();
|
var fragmentMask = BuildFragmentsMasks();
|
||||||
|
|
||||||
foreach (var outbound in actOutboundWithTlsList)
|
foreach (var outbound in actOutboundWithTlsList)
|
||||||
{
|
{
|
||||||
//var packets = configPackets;
|
|
||||||
//if (outbound.streamSettings.security == Global.StreamSecurityReality
|
|
||||||
// && packets == "tlshello")
|
|
||||||
//{
|
|
||||||
// packets = "1-3";
|
|
||||||
//}
|
|
||||||
//else if (outbound.streamSettings.security == Global.StreamSecurity
|
|
||||||
// && packets != "tlshello")
|
|
||||||
//{
|
|
||||||
// packets = "tlshello";
|
|
||||||
//}
|
|
||||||
var finalMaskJsonObj = JsonUtils.ParseJson(JsonUtils.Serialize(outbound.streamSettings?.finalmask)) as JsonObject ?? new JsonObject();
|
var finalMaskJsonObj = JsonUtils.ParseJson(JsonUtils.Serialize(outbound.streamSettings?.finalmask)) as JsonObject ?? new JsonObject();
|
||||||
// tcp fragment
|
// tcp fragment
|
||||||
var tcpFinalmaskList = finalMaskJsonObj["tcp"] as JsonArray ?? [];
|
var tcpFinalmaskList = finalMaskJsonObj["tcp"] as JsonArray ?? [];
|
||||||
@@ -888,13 +877,6 @@ public partial class CoreConfigV2rayService
|
|||||||
tcpFinalmaskList.Add(JsonUtils.SerializeToNode(fragmentMask));
|
tcpFinalmaskList.Add(JsonUtils.SerializeToNode(fragmentMask));
|
||||||
finalMaskJsonObj["tcp"] = tcpFinalmaskList;
|
finalMaskJsonObj["tcp"] = tcpFinalmaskList;
|
||||||
}
|
}
|
||||||
// udp noise
|
|
||||||
var udpFinalmaskList = finalMaskJsonObj["udp"] as JsonArray ?? [];
|
|
||||||
if (udpFinalmaskList.Count == 0)
|
|
||||||
{
|
|
||||||
udpFinalmaskList.Add(JsonUtils.SerializeToNode(noiseMask));
|
|
||||||
finalMaskJsonObj["udp"] = udpFinalmaskList;
|
|
||||||
}
|
|
||||||
// write back
|
// write back
|
||||||
outbound.streamSettings.finalmask = finalMaskJsonObj;
|
outbound.streamSettings.finalmask = finalMaskJsonObj;
|
||||||
}
|
}
|
||||||
@@ -902,7 +884,7 @@ public partial class CoreConfigV2rayService
|
|||||||
|
|
||||||
private void ApplyFinalFragment()
|
private void ApplyFinalFragment()
|
||||||
{
|
{
|
||||||
var (fragmentMask, noiseMask) = BuildFragmentsMasks();
|
var fragmentMask = BuildFragmentsMasks();
|
||||||
var actOutboundList = _coreConfig.outbounds.Where(n => n.tag.StartsWith(Global.ProxyTag)).ToList();
|
var actOutboundList = _coreConfig.outbounds.Where(n => n.tag.StartsWith(Global.ProxyTag)).ToList();
|
||||||
|
|
||||||
var fragmentFreedom = new Outbounds4Ray()
|
var fragmentFreedom = new Outbounds4Ray()
|
||||||
@@ -914,9 +896,8 @@ public partial class CoreConfigV2rayService
|
|||||||
finalmask = new Finalmask4Ray
|
finalmask = new Finalmask4Ray
|
||||||
{
|
{
|
||||||
tcp = [fragmentMask],
|
tcp = [fragmentMask],
|
||||||
udp = [noiseMask],
|
},
|
||||||
}
|
},
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
foreach (var outbound in actOutboundList)
|
foreach (var outbound in actOutboundList)
|
||||||
@@ -934,13 +915,22 @@ public partial class CoreConfigV2rayService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private (Mask4Ray tcpFragment, Mask4Ray udpNoise) BuildFragmentsMasks()
|
private Mask4Ray BuildFragmentsMasks()
|
||||||
{
|
{
|
||||||
var configPackets = _config.Fragment4RayItem?.Packets.NullIfEmpty() ?? "tlshello";
|
var configPackets = _config.Fragment4RayItem?.Packets.NullIfEmpty() ?? "tlshello";
|
||||||
var configLength = _config.Fragment4RayItem?.Length.NullIfEmpty() ?? "50-100";
|
var configLengths = _config.Fragment4RayItem?.Lengths ?? [];
|
||||||
var configDelay = _config.Fragment4RayItem?.Interval.NullIfEmpty() ?? "10-20";
|
var configDelays = _config.Fragment4RayItem?.Delays ?? [];
|
||||||
var configMaxSplit = _config.Fragment4RayItem?.MaxSplit.NullIfEmpty() ?? "0";
|
var configMaxSplit = _config.Fragment4RayItem?.MaxSplit.NullIfEmpty() ?? "0";
|
||||||
|
|
||||||
|
if (configLengths.Count == 0)
|
||||||
|
{
|
||||||
|
configLengths = ["50-100"];
|
||||||
|
}
|
||||||
|
if (configDelays.Count == 0)
|
||||||
|
{
|
||||||
|
configDelays = ["10-20"];
|
||||||
|
}
|
||||||
|
|
||||||
var maxSplit = 0;
|
var maxSplit = 0;
|
||||||
var parts = configMaxSplit.Split('-');
|
var parts = configMaxSplit.Split('-');
|
||||||
if (parts.Length > 0 && int.TryParse(parts[0], out var ms))
|
if (parts.Length > 0 && int.TryParse(parts[0], out var ms))
|
||||||
@@ -954,21 +944,15 @@ public partial class CoreConfigV2rayService
|
|||||||
settings = new MaskSettings4Ray
|
settings = new MaskSettings4Ray
|
||||||
{
|
{
|
||||||
packets = configPackets,
|
packets = configPackets,
|
||||||
length = configLength,
|
lengths = configLengths,
|
||||||
delay = configDelay,
|
delays = configDelays,
|
||||||
maxSplit = maxSplit,
|
maxSplit = maxSplit,
|
||||||
}
|
// For legacy xray compatibility, remove this in the future
|
||||||
};
|
length = configLengths.FirstOrDefault(),
|
||||||
var noiseMask = new Mask4Ray
|
delay = configDelays.FirstOrDefault(),
|
||||||
{
|
},
|
||||||
type = "noise",
|
|
||||||
settings = new MaskSettings4Ray
|
|
||||||
{
|
|
||||||
length = "10-20",
|
|
||||||
delay = "10-16",
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return (fragmentMask, noiseMask);
|
return fragmentMask;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ public class DNSSettingViewModel : MyReactiveObject, ICloseable
|
|||||||
[Reactive] public string? BootstrapDNS { get; set; }
|
[Reactive] public string? BootstrapDNS { get; set; }
|
||||||
[Reactive] public string? Strategy4Freedom { get; set; }
|
[Reactive] public string? Strategy4Freedom { get; set; }
|
||||||
[Reactive] public string? Strategy4Proxy { get; set; }
|
[Reactive] public string? Strategy4Proxy { get; set; }
|
||||||
|
[Reactive] public string? Strategy4ProxyDial { get; set; }
|
||||||
[Reactive] public string? Hosts { get; set; }
|
[Reactive] public string? Hosts { get; set; }
|
||||||
[Reactive] public string? DirectExpectedIPs { get; set; }
|
[Reactive] public string? DirectExpectedIPs { get; set; }
|
||||||
[Reactive] public bool? ParallelQuery { get; set; }
|
[Reactive] public bool? ParallelQuery { get; set; }
|
||||||
@@ -76,6 +77,7 @@ public class DNSSettingViewModel : MyReactiveObject, ICloseable
|
|||||||
BootstrapDNS = item.BootstrapDNS;
|
BootstrapDNS = item.BootstrapDNS;
|
||||||
Strategy4Freedom = item.Strategy4Freedom;
|
Strategy4Freedom = item.Strategy4Freedom;
|
||||||
Strategy4Proxy = item.Strategy4Proxy;
|
Strategy4Proxy = item.Strategy4Proxy;
|
||||||
|
Strategy4ProxyDial = item.Strategy4ProxyDial;
|
||||||
Hosts = item.Hosts;
|
Hosts = item.Hosts;
|
||||||
DirectExpectedIPs = item.DirectExpectedIPs;
|
DirectExpectedIPs = item.DirectExpectedIPs;
|
||||||
ParallelQuery = item.ParallelQuery;
|
ParallelQuery = item.ParallelQuery;
|
||||||
@@ -108,6 +110,7 @@ public class DNSSettingViewModel : MyReactiveObject, ICloseable
|
|||||||
_config.SimpleDNSItem.BootstrapDNS = BootstrapDNS;
|
_config.SimpleDNSItem.BootstrapDNS = BootstrapDNS;
|
||||||
_config.SimpleDNSItem.Strategy4Freedom = Strategy4Freedom;
|
_config.SimpleDNSItem.Strategy4Freedom = Strategy4Freedom;
|
||||||
_config.SimpleDNSItem.Strategy4Proxy = Strategy4Proxy;
|
_config.SimpleDNSItem.Strategy4Proxy = Strategy4Proxy;
|
||||||
|
_config.SimpleDNSItem.Strategy4ProxyDial = Strategy4ProxyDial;
|
||||||
_config.SimpleDNSItem.Hosts = Hosts;
|
_config.SimpleDNSItem.Hosts = Hosts;
|
||||||
_config.SimpleDNSItem.DirectExpectedIPs = DirectExpectedIPs;
|
_config.SimpleDNSItem.DirectExpectedIPs = DirectExpectedIPs;
|
||||||
_config.SimpleDNSItem.ParallelQuery = ParallelQuery;
|
_config.SimpleDNSItem.ParallelQuery = ParallelQuery;
|
||||||
|
|||||||
@@ -29,8 +29,8 @@ public class OptionSettingViewModel : MyReactiveObject, ICloseable
|
|||||||
[Reactive] public bool EnableFragment { get; set; }
|
[Reactive] public bool EnableFragment { get; set; }
|
||||||
[Reactive] public bool EnableFinalFragment { get; set; }
|
[Reactive] public bool EnableFinalFragment { get; set; }
|
||||||
[Reactive] public string FragmentPackets { get; set; }
|
[Reactive] public string FragmentPackets { get; set; }
|
||||||
[Reactive] public string FragmentLength { get; set; }
|
[Reactive] public string FragmentLengths { get; set; }
|
||||||
[Reactive] public string FragmentInterval { get; set; }
|
[Reactive] public string FragmentDelays { get; set; }
|
||||||
[Reactive] public string FragmentMaxSplit { get; set; }
|
[Reactive] public string FragmentMaxSplit { get; set; }
|
||||||
|
|
||||||
#endregion Core
|
#endregion Core
|
||||||
@@ -168,8 +168,8 @@ public class OptionSettingViewModel : MyReactiveObject, ICloseable
|
|||||||
EnableFragment = _config.CoreBasicItem.EnableFragment;
|
EnableFragment = _config.CoreBasicItem.EnableFragment;
|
||||||
EnableFinalFragment = _config.CoreBasicItem.EnableFinalFragment;
|
EnableFinalFragment = _config.CoreBasicItem.EnableFinalFragment;
|
||||||
FragmentPackets = _config.Fragment4RayItem?.Packets;
|
FragmentPackets = _config.Fragment4RayItem?.Packets;
|
||||||
FragmentLength = _config.Fragment4RayItem?.Length;
|
FragmentLengths = Utils.List2String(_config.Fragment4RayItem?.Lengths);
|
||||||
FragmentInterval = _config.Fragment4RayItem?.Interval;
|
FragmentDelays = Utils.List2String(_config.Fragment4RayItem?.Delays);
|
||||||
FragmentMaxSplit = _config.Fragment4RayItem?.MaxSplit;
|
FragmentMaxSplit = _config.Fragment4RayItem?.MaxSplit;
|
||||||
|
|
||||||
#endregion Core
|
#endregion Core
|
||||||
@@ -309,6 +309,15 @@ public class OptionSettingViewModel : MyReactiveObject, ICloseable
|
|||||||
NoticeManager.Instance.Enqueue(ResUI.FillLocalListeningPort);
|
NoticeManager.Instance.Enqueue(ResUI.FillLocalListeningPort);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
var fragmentLengths = Utils.String2List(FragmentLengths) ?? [];
|
||||||
|
var fragmentDelays = Utils.String2List(FragmentDelays) ?? [];
|
||||||
|
if (fragmentLengths.Any(item => !Utils.TryParseRange(item, 0, int.MaxValue, out _, out _))
|
||||||
|
|| fragmentDelays.Any(item => !Utils.TryParseRange(item, 0, int.MaxValue, out _, out _))
|
||||||
|
|| (FragmentMaxSplit.IsNotEmpty() && !Utils.TryParseMaxSplit(FragmentMaxSplit, 0, 10000, out _, out _)))
|
||||||
|
{
|
||||||
|
NoticeManager.Instance.Enqueue(ResUI.FillFragmentParameterError);
|
||||||
|
return;
|
||||||
|
}
|
||||||
var needReboot = EnableStatistics != _config.GuiItem.EnableStatistics
|
var needReboot = EnableStatistics != _config.GuiItem.EnableStatistics
|
||||||
|| DisplayRealTimeSpeed != _config.GuiItem.DisplayRealTimeSpeed
|
|| DisplayRealTimeSpeed != _config.GuiItem.DisplayRealTimeSpeed
|
||||||
|| EnableDragDropSort != _config.UiItem.EnableDragDropSort
|
|| EnableDragDropSort != _config.UiItem.EnableDragDropSort
|
||||||
@@ -351,30 +360,12 @@ public class OptionSettingViewModel : MyReactiveObject, ICloseable
|
|||||||
_config.CoreBasicItem.EnableCacheFile4Sbox = EnableCacheFile4Sbox;
|
_config.CoreBasicItem.EnableCacheFile4Sbox = EnableCacheFile4Sbox;
|
||||||
_config.HysteriaItem.UpMbps = HyUpMbps ?? 0;
|
_config.HysteriaItem.UpMbps = HyUpMbps ?? 0;
|
||||||
_config.HysteriaItem.DownMbps = HyDownMbps ?? 0;
|
_config.HysteriaItem.DownMbps = HyDownMbps ?? 0;
|
||||||
if (EnableFragment)
|
|
||||||
{
|
|
||||||
if (!Utils.TryParseRange(FragmentLength, 0, int.MaxValue, out _, out _))
|
|
||||||
{
|
|
||||||
NoticeManager.Instance.Enqueue(ResUI.FillFragmentParameterError);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!Utils.TryParseRange(FragmentInterval, 1, 100, out _, out _))
|
|
||||||
{
|
|
||||||
NoticeManager.Instance.Enqueue(ResUI.FillFragmentParameterError);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (FragmentMaxSplit.IsNotEmpty()
|
|
||||||
&& !Utils.TryParseMaxSplit(FragmentMaxSplit, 0, 10000, out _, out _))
|
|
||||||
{
|
|
||||||
NoticeManager.Instance.Enqueue(ResUI.FillFragmentParameterError);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_config.CoreBasicItem.EnableFragment = EnableFragment;
|
_config.CoreBasicItem.EnableFragment = EnableFragment;
|
||||||
_config.CoreBasicItem.EnableFinalFragment = EnableFinalFragment;
|
_config.CoreBasicItem.EnableFinalFragment = EnableFinalFragment;
|
||||||
|
_config.Fragment4RayItem ??= new();
|
||||||
_config.Fragment4RayItem.Packets = FragmentPackets;
|
_config.Fragment4RayItem.Packets = FragmentPackets;
|
||||||
_config.Fragment4RayItem.Length = FragmentLength;
|
_config.Fragment4RayItem.Lengths = fragmentLengths;
|
||||||
_config.Fragment4RayItem.Interval = FragmentInterval;
|
_config.Fragment4RayItem.Delays = fragmentDelays;
|
||||||
_config.Fragment4RayItem.MaxSplit = FragmentMaxSplit;
|
_config.Fragment4RayItem.MaxSplit = FragmentMaxSplit;
|
||||||
|
|
||||||
_config.GuiItem.AutoRun = AutoRun;
|
_config.GuiItem.AutoRun = AutoRun;
|
||||||
|
|||||||
@@ -42,7 +42,7 @@
|
|||||||
x:Name="gridBasicDNSSettings"
|
x:Name="gridBasicDNSSettings"
|
||||||
Margin="{StaticResource Margin8}"
|
Margin="{StaticResource Margin8}"
|
||||||
ColumnDefinitions="Auto,Auto,*"
|
ColumnDefinitions="Auto,Auto,*"
|
||||||
RowDefinitions="Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto">
|
RowDefinitions="Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto">
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
x:Name="txtBasicDNSSettingsInvalid"
|
x:Name="txtBasicDNSSettingsInvalid"
|
||||||
@@ -167,24 +167,46 @@
|
|||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource Margin4}"
|
Margin="{StaticResource Margin4}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Text="{x:Static resx:ResUI.TbParallelQuery}" />
|
Text="{x:Static resx:ResUI.TbProxyDialResolveStrategy}" />
|
||||||
<ToggleSwitch
|
<ComboBox
|
||||||
x:Name="togParallelQuery"
|
x:Name="cmbProxyDialDNSStrategy"
|
||||||
Grid.Row="7"
|
Grid.Row="7"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
|
Width="200"
|
||||||
Margin="{StaticResource Margin4}"
|
Margin="{StaticResource Margin4}"
|
||||||
HorizontalAlignment="Left"
|
VerticalAlignment="Center"
|
||||||
VerticalAlignment="Center" />
|
PlaceholderText="Default" />
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="7"
|
||||||
|
Grid.Column="2"
|
||||||
|
Margin="{StaticResource Margin4}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Text="{x:Static resx:ResUI.TbProxyDialResolveStrategyTip}"
|
||||||
|
TextWrapping="Wrap" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="8"
|
Grid.Row="8"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="{StaticResource Margin4}"
|
Margin="{StaticResource Margin4}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
|
Text="{x:Static resx:ResUI.TbParallelQuery}" />
|
||||||
|
<ToggleSwitch
|
||||||
|
x:Name="togParallelQuery"
|
||||||
|
Grid.Row="8"
|
||||||
|
Grid.Column="1"
|
||||||
|
Margin="{StaticResource Margin4}"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Center" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="9"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="{StaticResource Margin4}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
Text="{x:Static resx:ResUI.TbServeStale}" />
|
Text="{x:Static resx:ResUI.TbServeStale}" />
|
||||||
<ToggleSwitch
|
<ToggleSwitch
|
||||||
x:Name="togServeStale"
|
x:Name="togServeStale"
|
||||||
Grid.Row="8"
|
Grid.Row="9"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="{StaticResource Margin4}"
|
Margin="{StaticResource Margin4}"
|
||||||
HorizontalAlignment="Left"
|
HorizontalAlignment="Left"
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ public partial class DNSSettingWindow : WindowBase<DNSSettingViewModel>
|
|||||||
|
|
||||||
cmbDirectDNSStrategy.ItemsSource = Global.DomainStrategy;
|
cmbDirectDNSStrategy.ItemsSource = Global.DomainStrategy;
|
||||||
cmbRemoteDNSStrategy.ItemsSource = Global.DomainStrategy;
|
cmbRemoteDNSStrategy.ItemsSource = Global.DomainStrategy;
|
||||||
|
cmbProxyDialDNSStrategy.ItemsSource = Global.DomainStrategy;
|
||||||
cmbDirectDNS.ItemsSource = Global.DomainDirectDNSAddress;
|
cmbDirectDNS.ItemsSource = Global.DomainDirectDNSAddress;
|
||||||
cmbRemoteDNS.ItemsSource = Global.DomainRemoteDNSAddress;
|
cmbRemoteDNS.ItemsSource = Global.DomainRemoteDNSAddress;
|
||||||
cmbBootstrapDNS.ItemsSource = Global.DomainPureIPDNSAddress;
|
cmbBootstrapDNS.ItemsSource = Global.DomainPureIPDNSAddress;
|
||||||
@@ -37,6 +38,7 @@ public partial class DNSSettingWindow : WindowBase<DNSSettingViewModel>
|
|||||||
this.Bind(ViewModel, vm => vm.BootstrapDNS, v => v.cmbBootstrapDNS.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.BootstrapDNS, v => v.cmbBootstrapDNS.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.Strategy4Freedom, v => v.cmbDirectDNSStrategy.SelectedItem).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.Strategy4Freedom, v => v.cmbDirectDNSStrategy.SelectedItem).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.Strategy4Proxy, v => v.cmbRemoteDNSStrategy.SelectedItem).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.Strategy4Proxy, v => v.cmbRemoteDNSStrategy.SelectedItem).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.Strategy4ProxyDial, v => v.cmbProxyDialDNSStrategy.SelectedItem).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.Hosts, v => v.txtHosts.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.Hosts, v => v.txtHosts.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.DirectExpectedIPs, v => v.cmbDirectExpectedIPs.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.DirectExpectedIPs, v => v.cmbDirectExpectedIPs.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.ParallelQuery, v => v.togParallelQuery.IsChecked).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.ParallelQuery, v => v.togParallelQuery.IsChecked).DisposeWith(disposables);
|
||||||
|
|||||||
@@ -347,7 +347,7 @@
|
|||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsFragmentLength}" />
|
Text="{x:Static resx:ResUI.TbSettingsFragmentLength}" />
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txtFragmentLength"
|
x:Name="txtFragmentLengths"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="120"
|
Width="120"
|
||||||
@@ -369,7 +369,7 @@
|
|||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsFragmentInterval}" />
|
Text="{x:Static resx:ResUI.TbSettingsFragmentInterval}" />
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txtFragmentInterval"
|
x:Name="txtFragmentDelays"
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="120"
|
Width="120"
|
||||||
|
|||||||
@@ -86,8 +86,8 @@ public partial class OptionSettingWindow : WindowBase<OptionSettingViewModel>
|
|||||||
this.Bind(ViewModel, vm => vm.EnableFragment, v => v.togenableFragment.IsChecked).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.EnableFragment, v => v.togenableFragment.IsChecked).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.EnableFinalFragment, v => v.togenableFinalFragment.IsChecked).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.EnableFinalFragment, v => v.togenableFinalFragment.IsChecked).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.FragmentPackets, v => v.cmbFragmentPackets.SelectedItem).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.FragmentPackets, v => v.cmbFragmentPackets.SelectedItem).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.FragmentLength, v => v.txtFragmentLength.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.FragmentLengths, v => v.txtFragmentLengths.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.FragmentInterval, v => v.txtFragmentInterval.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.FragmentDelays, v => v.txtFragmentDelays.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.FragmentMaxSplit, v => v.txtFragmentMaxSplit.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.FragmentMaxSplit, v => v.txtFragmentMaxSplit.Text).DisposeWith(disposables);
|
||||||
|
|
||||||
this.Bind(ViewModel, vm => vm.AutoRun, v => v.togAutoRun.IsChecked).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.AutoRun, v => v.togAutoRun.IsChecked).DisposeWith(disposables);
|
||||||
|
|||||||
@@ -52,6 +52,7 @@
|
|||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
|
<RowDefinition Height="Auto" />
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="Auto" />
|
<ColumnDefinition Width="Auto" />
|
||||||
@@ -195,13 +196,23 @@
|
|||||||
Margin="{StaticResource Margin8}"
|
Margin="{StaticResource Margin8}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbParallelQuery}" />
|
Text="{x:Static resx:ResUI.TbProxyDialResolveStrategy}" />
|
||||||
<ToggleButton
|
<ComboBox
|
||||||
x:Name="togParallelQuery"
|
x:Name="cmbProxyDialDNSStrategy"
|
||||||
Grid.Row="7"
|
Grid.Row="7"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
|
Width="200"
|
||||||
Margin="{StaticResource Margin8}"
|
Margin="{StaticResource Margin8}"
|
||||||
HorizontalAlignment="Left" />
|
materialDesign:HintAssist.Hint="Default"
|
||||||
|
Style="{StaticResource DefComboBox}" />
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="7"
|
||||||
|
Grid.Column="2"
|
||||||
|
Margin="{StaticResource Margin8}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="{x:Static resx:ResUI.TbProxyDialResolveStrategyTip}"
|
||||||
|
TextWrapping="Wrap" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Grid.Row="8"
|
Grid.Row="8"
|
||||||
@@ -209,10 +220,24 @@
|
|||||||
Margin="{StaticResource Margin8}"
|
Margin="{StaticResource Margin8}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
|
Text="{x:Static resx:ResUI.TbParallelQuery}" />
|
||||||
|
<ToggleButton
|
||||||
|
x:Name="togParallelQuery"
|
||||||
|
Grid.Row="8"
|
||||||
|
Grid.Column="1"
|
||||||
|
Margin="{StaticResource Margin8}"
|
||||||
|
HorizontalAlignment="Left" />
|
||||||
|
|
||||||
|
<TextBlock
|
||||||
|
Grid.Row="9"
|
||||||
|
Grid.Column="0"
|
||||||
|
Margin="{StaticResource Margin8}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbServeStale}" />
|
Text="{x:Static resx:ResUI.TbServeStale}" />
|
||||||
<ToggleButton
|
<ToggleButton
|
||||||
x:Name="togServeStale"
|
x:Name="togServeStale"
|
||||||
Grid.Row="8"
|
Grid.Row="9"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Margin="{StaticResource Margin8}"
|
Margin="{StaticResource Margin8}"
|
||||||
HorizontalAlignment="Left" />
|
HorizontalAlignment="Left" />
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ public partial class DNSSettingWindow
|
|||||||
|
|
||||||
cmbDirectDNSStrategy.ItemsSource = Global.DomainStrategy;
|
cmbDirectDNSStrategy.ItemsSource = Global.DomainStrategy;
|
||||||
cmbRemoteDNSStrategy.ItemsSource = Global.DomainStrategy;
|
cmbRemoteDNSStrategy.ItemsSource = Global.DomainStrategy;
|
||||||
|
cmbProxyDialDNSStrategy.ItemsSource = Global.DomainStrategy;
|
||||||
cmbDirectDNS.ItemsSource = Global.DomainDirectDNSAddress;
|
cmbDirectDNS.ItemsSource = Global.DomainDirectDNSAddress;
|
||||||
cmbRemoteDNS.ItemsSource = Global.DomainRemoteDNSAddress;
|
cmbRemoteDNS.ItemsSource = Global.DomainRemoteDNSAddress;
|
||||||
cmbBootstrapDNS.ItemsSource = Global.DomainPureIPDNSAddress;
|
cmbBootstrapDNS.ItemsSource = Global.DomainPureIPDNSAddress;
|
||||||
@@ -33,6 +34,7 @@ public partial class DNSSettingWindow
|
|||||||
this.Bind(ViewModel, vm => vm.BootstrapDNS, v => v.cmbBootstrapDNS.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.BootstrapDNS, v => v.cmbBootstrapDNS.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.Strategy4Freedom, v => v.cmbDirectDNSStrategy.SelectedItem).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.Strategy4Freedom, v => v.cmbDirectDNSStrategy.SelectedItem).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.Strategy4Proxy, v => v.cmbRemoteDNSStrategy.SelectedItem).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.Strategy4Proxy, v => v.cmbRemoteDNSStrategy.SelectedItem).DisposeWith(disposables);
|
||||||
|
this.Bind(ViewModel, vm => vm.Strategy4ProxyDial, v => v.cmbProxyDialDNSStrategy.SelectedItem).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.Hosts, v => v.txtHosts.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.Hosts, v => v.txtHosts.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.DirectExpectedIPs, v => v.cmbDirectExpectedIPs.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.DirectExpectedIPs, v => v.cmbDirectExpectedIPs.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.ParallelQuery, v => v.togParallelQuery.IsChecked).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.ParallelQuery, v => v.togParallelQuery.IsChecked).DisposeWith(disposables);
|
||||||
|
|||||||
@@ -419,7 +419,7 @@
|
|||||||
Text="{x:Static resx:ResUI.TbSettingsFragmentLength}"
|
Text="{x:Static resx:ResUI.TbSettingsFragmentLength}"
|
||||||
TextWrapping="Wrap" />
|
TextWrapping="Wrap" />
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txtFragmentLength"
|
x:Name="txtFragmentLengths"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
@@ -437,7 +437,7 @@
|
|||||||
Text="{x:Static resx:ResUI.TbSettingsFragmentInterval}"
|
Text="{x:Static resx:ResUI.TbSettingsFragmentInterval}"
|
||||||
TextWrapping="Wrap" />
|
TextWrapping="Wrap" />
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txtFragmentInterval"
|
x:Name="txtFragmentDelays"
|
||||||
Grid.Row="2"
|
Grid.Row="2"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Width="200"
|
Width="200"
|
||||||
|
|||||||
@@ -82,8 +82,8 @@ public partial class OptionSettingWindow
|
|||||||
this.Bind(ViewModel, vm => vm.EnableFragment, v => v.togenableFragment.IsChecked).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.EnableFragment, v => v.togenableFragment.IsChecked).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.EnableFinalFragment, v => v.togenableFinalFragment.IsChecked).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.EnableFinalFragment, v => v.togenableFinalFragment.IsChecked).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.FragmentPackets, v => v.cmbFragmentPackets.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.FragmentPackets, v => v.cmbFragmentPackets.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.FragmentLength, v => v.txtFragmentLength.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.FragmentLengths, v => v.txtFragmentLengths.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.FragmentInterval, v => v.txtFragmentInterval.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.FragmentDelays, v => v.txtFragmentDelays.Text).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.FragmentMaxSplit, v => v.txtFragmentMaxSplit.Text).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.FragmentMaxSplit, v => v.txtFragmentMaxSplit.Text).DisposeWith(disposables);
|
||||||
|
|
||||||
//this.Bind(ViewModel, vm => vm.Kcpmtu, v => v.txtKcpmtu.Text).DisposeWith(disposables);
|
//this.Bind(ViewModel, vm => vm.Kcpmtu, v => v.txtKcpmtu.Text).DisposeWith(disposables);
|
||||||
|
|||||||
Reference in New Issue
Block a user