Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
18ac76e683 | ||
|
|
3e1e23a524 | ||
|
|
534c7ab444 | ||
|
|
c2c13ad318 | ||
|
|
3a21596d95 | ||
|
|
ef30d389dc | ||
|
|
bf8783fed7 | ||
|
|
4e042295d2 | ||
|
|
33d9c5db6c | ||
|
|
cb182125f6 |
@@ -1,7 +1,7 @@
|
|||||||
<Project>
|
<Project>
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Version>7.14.10</Version>
|
<Version>7.14.12</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
|
|||||||
@@ -18,8 +18,8 @@
|
|||||||
<PackageVersion Include="ReactiveUI" Version="20.4.1" />
|
<PackageVersion Include="ReactiveUI" Version="20.4.1" />
|
||||||
<PackageVersion Include="ReactiveUI.Fody" Version="19.5.41" />
|
<PackageVersion Include="ReactiveUI.Fody" Version="19.5.41" />
|
||||||
<PackageVersion Include="ReactiveUI.WPF" Version="20.4.1" />
|
<PackageVersion Include="ReactiveUI.WPF" Version="20.4.1" />
|
||||||
<PackageVersion Include="Semi.Avalonia" Version="11.2.1.9" />
|
<PackageVersion Include="Semi.Avalonia" Version="11.2.1.10" />
|
||||||
<PackageVersion Include="Semi.Avalonia.DataGrid" Version="11.2.1.9" />
|
<PackageVersion Include="Semi.Avalonia.DataGrid" Version="11.2.1.10" />
|
||||||
<PackageVersion Include="Splat.NLog" Version="16.2.1" />
|
<PackageVersion Include="Splat.NLog" Version="16.2.1" />
|
||||||
<PackageVersion Include="sqlite-net-pcl" Version="1.9.172" />
|
<PackageVersion Include="sqlite-net-pcl" Version="1.9.172" />
|
||||||
<PackageVersion Include="TaskScheduler" Version="2.12.2" />
|
<PackageVersion Include="TaskScheduler" Version="2.12.2" />
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using QRCoder;
|
using QRCoder;
|
||||||
|
using QRCoder.Exceptions;
|
||||||
using SkiaSharp;
|
using SkiaSharp;
|
||||||
using ZXing.SkiaSharp;
|
using ZXing.SkiaSharp;
|
||||||
|
|
||||||
@@ -8,11 +9,46 @@ public class QRCodeUtils
|
|||||||
{
|
{
|
||||||
public static byte[]? GenQRCode(string? url)
|
public static byte[]? GenQRCode(string? url)
|
||||||
{
|
{
|
||||||
|
if (url.IsNullOrEmpty())
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
using QRCodeGenerator qrGenerator = new();
|
using QRCodeGenerator qrGenerator = new();
|
||||||
using var qrCodeData = qrGenerator.CreateQrCode(url ?? string.Empty, QRCodeGenerator.ECCLevel.Q);
|
DataTooLongException? lastDtle = null;
|
||||||
|
|
||||||
|
var levels = new[]
|
||||||
|
{
|
||||||
|
QRCodeGenerator.ECCLevel.H,
|
||||||
|
QRCodeGenerator.ECCLevel.Q,
|
||||||
|
QRCodeGenerator.ECCLevel.M,
|
||||||
|
QRCodeGenerator.ECCLevel.L
|
||||||
|
};
|
||||||
|
foreach (var level in levels)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using var qrCodeData = qrGenerator.CreateQrCode(url, level);
|
||||||
using PngByteQRCode qrCode = new(qrCodeData);
|
using PngByteQRCode qrCode = new(qrCodeData);
|
||||||
return qrCode.GetGraphic(20);
|
return qrCode.GetGraphic(20);
|
||||||
}
|
}
|
||||||
|
catch (DataTooLongException ex)
|
||||||
|
{
|
||||||
|
lastDtle = ex;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lastDtle != null)
|
||||||
|
{
|
||||||
|
throw lastDtle;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public static string? ParseBarcode(string? fileName)
|
public static string? ParseBarcode(string? fileName)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ public class Global
|
|||||||
public const string ProxySetLinuxShellFileName = NamespaceSample + "proxy_set_linux_sh";
|
public const string ProxySetLinuxShellFileName = NamespaceSample + "proxy_set_linux_sh";
|
||||||
public const string KillAsSudoOSXShellFileName = NamespaceSample + "kill_as_sudo_osx_sh";
|
public const string KillAsSudoOSXShellFileName = NamespaceSample + "kill_as_sudo_osx_sh";
|
||||||
public const string KillAsSudoLinuxShellFileName = NamespaceSample + "kill_as_sudo_linux_sh";
|
public const string KillAsSudoLinuxShellFileName = NamespaceSample + "kill_as_sudo_linux_sh";
|
||||||
|
public const string SingboxFakeIPFilterFileName = NamespaceSample + "singbox_fakeip_filter";
|
||||||
|
|
||||||
public const string DefaultSecurity = "auto";
|
public const string DefaultSecurity = "auto";
|
||||||
public const string DefaultNetwork = "tcp";
|
public const string DefaultNetwork = "tcp";
|
||||||
@@ -597,6 +598,7 @@ public class Global
|
|||||||
{ "cloudflare-dns.com", new List<string> { "104.16.249.249", "104.16.248.249", "2606:4700::6810:f8f9", "2606:4700::6810:f9f9" } },
|
{ "cloudflare-dns.com", new List<string> { "104.16.249.249", "104.16.248.249", "2606:4700::6810:f8f9", "2606:4700::6810:f9f9" } },
|
||||||
{ "dns.cloudflare.com", new List<string> { "104.16.132.229", "104.16.133.229", "2606:4700::6810:84e5", "2606:4700::6810:85e5" } },
|
{ "dns.cloudflare.com", new List<string> { "104.16.132.229", "104.16.133.229", "2606:4700::6810:84e5", "2606:4700::6810:85e5" } },
|
||||||
{ "dot.pub", new List<string> { "1.12.12.12", "120.53.53.53" } },
|
{ "dot.pub", new List<string> { "1.12.12.12", "120.53.53.53" } },
|
||||||
|
{ "doh.pub", new List<string> { "1.12.12.12", "120.53.53.53" } },
|
||||||
{ "dns.quad9.net", new List<string> { "9.9.9.9", "149.112.112.112", "2620:fe::fe", "2620:fe::9" } },
|
{ "dns.quad9.net", new List<string> { "9.9.9.9", "149.112.112.112", "2620:fe::fe", "2620:fe::9" } },
|
||||||
{ "dns.yandex.net", new List<string> { "77.88.8.8", "77.88.8.1", "2a02:6b8::feed:0ff", "2a02:6b8:0:1::feed:0ff" } },
|
{ "dns.yandex.net", new List<string> { "77.88.8.8", "77.88.8.1", "2a02:6b8::feed:0ff", "2a02:6b8:0:1::feed:0ff" } },
|
||||||
{ "dns.sb", new List<string> { "185.222.222.222", "2a09::" } },
|
{ "dns.sb", new List<string> { "185.222.222.222", "2a09::" } },
|
||||||
|
|||||||
@@ -113,6 +113,10 @@ public static class ConfigHandler
|
|||||||
config.ConstItem ??= new ConstItem();
|
config.ConstItem ??= new ConstItem();
|
||||||
|
|
||||||
config.SimpleDNSItem ??= InitBuiltinSimpleDNS();
|
config.SimpleDNSItem ??= InitBuiltinSimpleDNS();
|
||||||
|
if (config.SimpleDNSItem.GlobalFakeIp is null)
|
||||||
|
{
|
||||||
|
config.SimpleDNSItem.GlobalFakeIp = true;
|
||||||
|
}
|
||||||
|
|
||||||
config.SpeedTestItem ??= new();
|
config.SpeedTestItem ??= new();
|
||||||
if (config.SpeedTestItem.SpeedTestTimeout < 10)
|
if (config.SpeedTestItem.SpeedTestTimeout < 10)
|
||||||
@@ -1210,11 +1214,11 @@ public static class ConfigHandler
|
|||||||
CoreType = ECoreType.sing_box,
|
CoreType = ECoreType.sing_box,
|
||||||
ConfigType = EConfigType.SOCKS,
|
ConfigType = EConfigType.SOCKS,
|
||||||
Address = Global.Loopback,
|
Address = Global.Loopback,
|
||||||
Sni = node.Address, //Tun2SocksAddress
|
SpiderX = node.Address, // Tun2SocksAddress
|
||||||
Port = AppManager.Instance.GetLocalPort(EInboundProtocol.socks)
|
Port = AppManager.Instance.GetLocalPort(EInboundProtocol.socks)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
else if ((node.ConfigType == EConfigType.Custom && node.PreSocksPort > 0))
|
else if (node.ConfigType == EConfigType.Custom && node.PreSocksPort > 0)
|
||||||
{
|
{
|
||||||
var preCoreType = config.RunningCoreType = config.TunModeItem.EnableTun ? ECoreType.sing_box : ECoreType.Xray;
|
var preCoreType = config.RunningCoreType = config.TunModeItem.EnableTun ? ECoreType.sing_box : ECoreType.Xray;
|
||||||
itemSocks = new ProfileItem()
|
itemSocks = new ProfileItem()
|
||||||
@@ -2221,6 +2225,7 @@ public static class ConfigHandler
|
|||||||
UseSystemHosts = false,
|
UseSystemHosts = false,
|
||||||
AddCommonHosts = true,
|
AddCommonHosts = true,
|
||||||
FakeIP = false,
|
FakeIP = false,
|
||||||
|
GlobalFakeIp = true,
|
||||||
BlockBindingQuery = true,
|
BlockBindingQuery = true,
|
||||||
DirectDNS = Global.DomainDirectDNSAddress.FirstOrDefault(),
|
DirectDNS = Global.DomainDirectDNSAddress.FirstOrDefault(),
|
||||||
RemoteDNS = Global.DomainRemoteDNSAddress.FirstOrDefault(),
|
RemoteDNS = Global.DomainRemoteDNSAddress.FirstOrDefault(),
|
||||||
|
|||||||
@@ -260,6 +260,7 @@ public class SimpleDNSItem
|
|||||||
public bool? UseSystemHosts { get; set; }
|
public bool? UseSystemHosts { get; set; }
|
||||||
public bool? AddCommonHosts { get; set; }
|
public bool? AddCommonHosts { get; set; }
|
||||||
public bool? FakeIP { get; set; }
|
public bool? FakeIP { get; set; }
|
||||||
|
public bool? GlobalFakeIp { get; set; }
|
||||||
public bool? BlockBindingQuery { get; set; }
|
public bool? BlockBindingQuery { get; set; }
|
||||||
public string? DirectDNS { get; set; }
|
public string? DirectDNS { get; set; }
|
||||||
public string? RemoteDNS { get; set; }
|
public string? RemoteDNS { get; set; }
|
||||||
|
|||||||
18
v2rayN/ServiceLib/Resx/ResUI.Designer.cs
generated
18
v2rayN/ServiceLib/Resx/ResUI.Designer.cs
generated
@@ -2301,15 +2301,6 @@ namespace ServiceLib.Resx {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 查找类似 Apply to Proxy Domains Only 的本地化字符串。
|
|
||||||
/// </summary>
|
|
||||||
public static string TbApplyProxyDomainsOnly {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("TbApplyProxyDomainsOnly", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Auto refresh 的本地化字符串。
|
/// 查找类似 Auto refresh 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -2526,6 +2517,15 @@ namespace ServiceLib.Resx {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 Applies globally by default, with built-in FakeIP filtering (sing-box only). 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbFakeIPTips {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbFakeIPTips", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Fingerprint 的本地化字符串。
|
/// 查找类似 Fingerprint 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -1455,9 +1455,6 @@
|
|||||||
<data name="TbDNSHostsConfig" xml:space="preserve">
|
<data name="TbDNSHostsConfig" xml:space="preserve">
|
||||||
<value>DNS Hosts: ("domain1 ip1 ip2" per line)</value>
|
<value>DNS Hosts: ("domain1 ip1 ip2" per line)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbApplyProxyDomainsOnly" xml:space="preserve">
|
|
||||||
<value>Apply to Proxy Domains Only</value>
|
|
||||||
</data>
|
|
||||||
<data name="ThBasicDNSSettings" xml:space="preserve">
|
<data name="ThBasicDNSSettings" xml:space="preserve">
|
||||||
<value>Basic DNS Settings</value>
|
<value>Basic DNS Settings</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1515,4 +1512,7 @@
|
|||||||
<data name="TbSelectProfile" xml:space="preserve">
|
<data name="TbSelectProfile" xml:space="preserve">
|
||||||
<value>Select Profile</value>
|
<value>Select Profile</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbFakeIPTips" xml:space="preserve">
|
||||||
|
<value>Applies globally by default, with built-in FakeIP filtering (sing-box only).</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -1455,9 +1455,6 @@
|
|||||||
<data name="TbDNSHostsConfig" xml:space="preserve">
|
<data name="TbDNSHostsConfig" xml:space="preserve">
|
||||||
<value>DNS Hosts: ("domain1 ip1 ip2" per line)</value>
|
<value>DNS Hosts: ("domain1 ip1 ip2" per line)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbApplyProxyDomainsOnly" xml:space="preserve">
|
|
||||||
<value>Apply to Proxy Domains Only</value>
|
|
||||||
</data>
|
|
||||||
<data name="ThBasicDNSSettings" xml:space="preserve">
|
<data name="ThBasicDNSSettings" xml:space="preserve">
|
||||||
<value>Basic DNS Settings</value>
|
<value>Basic DNS Settings</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1515,4 +1512,7 @@
|
|||||||
<data name="TbSelectProfile" xml:space="preserve">
|
<data name="TbSelectProfile" xml:space="preserve">
|
||||||
<value>Select Profile</value>
|
<value>Select Profile</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbFakeIPTips" xml:space="preserve">
|
||||||
|
<value>Applies globally by default, with built-in FakeIP filtering (sing-box only).</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -1455,9 +1455,6 @@
|
|||||||
<data name="TbDNSHostsConfig" xml:space="preserve">
|
<data name="TbDNSHostsConfig" xml:space="preserve">
|
||||||
<value>DNS Hosts: ("domain1 ip1 ip2" per line)</value>
|
<value>DNS Hosts: ("domain1 ip1 ip2" per line)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbApplyProxyDomainsOnly" xml:space="preserve">
|
|
||||||
<value>Apply to Proxy Domains Only</value>
|
|
||||||
</data>
|
|
||||||
<data name="ThBasicDNSSettings" xml:space="preserve">
|
<data name="ThBasicDNSSettings" xml:space="preserve">
|
||||||
<value>Basic DNS Settings</value>
|
<value>Basic DNS Settings</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1515,4 +1512,7 @@
|
|||||||
<data name="TbSelectProfile" xml:space="preserve">
|
<data name="TbSelectProfile" xml:space="preserve">
|
||||||
<value>Select Profile</value>
|
<value>Select Profile</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbFakeIPTips" xml:space="preserve">
|
||||||
|
<value>Applies globally by default, with built-in FakeIP filtering (sing-box only).</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -1455,9 +1455,6 @@
|
|||||||
<data name="TbDNSHostsConfig" xml:space="preserve">
|
<data name="TbDNSHostsConfig" xml:space="preserve">
|
||||||
<value>DNS hosts: (каждая строка в формате "domain1 ip1 ip2")</value>
|
<value>DNS hosts: (каждая строка в формате "domain1 ip1 ip2")</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbApplyProxyDomainsOnly" xml:space="preserve">
|
|
||||||
<value>Применять только к доменам через прокси</value>
|
|
||||||
</data>
|
|
||||||
<data name="ThBasicDNSSettings" xml:space="preserve">
|
<data name="ThBasicDNSSettings" xml:space="preserve">
|
||||||
<value>Базовые настройки DNS</value>
|
<value>Базовые настройки DNS</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1515,4 +1512,7 @@
|
|||||||
<data name="TbSelectProfile" xml:space="preserve">
|
<data name="TbSelectProfile" xml:space="preserve">
|
||||||
<value>Select Profile</value>
|
<value>Select Profile</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbFakeIPTips" xml:space="preserve">
|
||||||
|
<value>Applies globally by default, with built-in FakeIP filtering (sing-box only).</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -1452,9 +1452,6 @@
|
|||||||
<data name="TbDNSHostsConfig" xml:space="preserve">
|
<data name="TbDNSHostsConfig" xml:space="preserve">
|
||||||
<value>DNS Hosts:(“域名1 ip1 ip2” 一行一个)</value>
|
<value>DNS Hosts:(“域名1 ip1 ip2” 一行一个)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbApplyProxyDomainsOnly" xml:space="preserve">
|
|
||||||
<value>仅对代理域名生效</value>
|
|
||||||
</data>
|
|
||||||
<data name="ThBasicDNSSettings" xml:space="preserve">
|
<data name="ThBasicDNSSettings" xml:space="preserve">
|
||||||
<value>DNS 基础设置</value>
|
<value>DNS 基础设置</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1512,4 +1509,7 @@
|
|||||||
<data name="TbSelectProfile" xml:space="preserve">
|
<data name="TbSelectProfile" xml:space="preserve">
|
||||||
<value>选择配置文件</value>
|
<value>选择配置文件</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbFakeIPTips" xml:space="preserve">
|
||||||
|
<value>默认全局生效,内置 FakeIP 过滤,仅在 sing-box 中生效</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -1452,9 +1452,6 @@
|
|||||||
<data name="TbDNSHostsConfig" xml:space="preserve">
|
<data name="TbDNSHostsConfig" xml:space="preserve">
|
||||||
<value>DNS Hosts: ("domain1 ip1 ip2" per line)</value>
|
<value>DNS Hosts: ("domain1 ip1 ip2" per line)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TbApplyProxyDomainsOnly" xml:space="preserve">
|
|
||||||
<value>Apply to Proxy Domains Only</value>
|
|
||||||
</data>
|
|
||||||
<data name="ThBasicDNSSettings" xml:space="preserve">
|
<data name="ThBasicDNSSettings" xml:space="preserve">
|
||||||
<value>Basic DNS Settings</value>
|
<value>Basic DNS Settings</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1512,4 +1509,7 @@
|
|||||||
<data name="TbSelectProfile" xml:space="preserve">
|
<data name="TbSelectProfile" xml:space="preserve">
|
||||||
<value>Select Profile</value>
|
<value>Select Profile</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbFakeIPTips" xml:space="preserve">
|
||||||
|
<value>Applies globally by default, with built-in FakeIP filtering (sing-box only).</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
92
v2rayN/ServiceLib/Sample/singbox_fakeip_filter
Normal file
92
v2rayN/ServiceLib/Sample/singbox_fakeip_filter
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
{
|
||||||
|
"domain": [
|
||||||
|
"amobile.music.tc.qq.com",
|
||||||
|
"api-jooxtt.sanook.com",
|
||||||
|
"api.joox.com",
|
||||||
|
"aqqmusic.tc.qq.com",
|
||||||
|
"dl.stream.qqmusic.qq.com",
|
||||||
|
"ff.dorado.sdo.com",
|
||||||
|
"heartbeat.belkin.com",
|
||||||
|
"isure.stream.qqmusic.qq.com",
|
||||||
|
"joox.com",
|
||||||
|
"lens.l.google.com",
|
||||||
|
"localhost.ptlogin2.qq.com",
|
||||||
|
"localhost.sec.qq.com",
|
||||||
|
"mesu.apple.com",
|
||||||
|
"mobileoc.music.tc.qq.com",
|
||||||
|
"music.taihe.com",
|
||||||
|
"musicapi.taihe.com",
|
||||||
|
"na.b.g-tun.com",
|
||||||
|
"proxy.golang.org",
|
||||||
|
"ps.res.netease.com",
|
||||||
|
"shark007.net",
|
||||||
|
"songsearch.kugou.com",
|
||||||
|
"static.adtidy.org",
|
||||||
|
"streamoc.music.tc.qq.com",
|
||||||
|
"swcdn.apple.com",
|
||||||
|
"swdist.apple.com",
|
||||||
|
"swdownload.apple.com",
|
||||||
|
"swquery.apple.com",
|
||||||
|
"swscan.apple.com",
|
||||||
|
"trackercdn.kugou.com",
|
||||||
|
"xnotify.xboxlive.com"
|
||||||
|
],
|
||||||
|
"domain_keyword": [
|
||||||
|
"ntp",
|
||||||
|
"stun",
|
||||||
|
"time"
|
||||||
|
],
|
||||||
|
"domain_regex": [
|
||||||
|
"^[^.]+$",
|
||||||
|
"^[^.]+\\.[^.]+\\.xboxlive\\.com$",
|
||||||
|
"^localhost\\.[^.]+\\.weixin\\.qq\\.com$",
|
||||||
|
"^mijia\\scloud$",
|
||||||
|
"^xbox\\.[^.]+\\.microsoft\\.com$",
|
||||||
|
"^xbox\\.[^.]+\\.[^.]+\\.microsoft\\.com$"
|
||||||
|
],
|
||||||
|
"domain_suffix": [
|
||||||
|
"126.net",
|
||||||
|
"3gppnetwork.org",
|
||||||
|
"battle.net",
|
||||||
|
"battlenet.com.cn",
|
||||||
|
"cdn.nintendo.net",
|
||||||
|
"cmbchina.com",
|
||||||
|
"cmbimg.com",
|
||||||
|
"ff14.sdo.com",
|
||||||
|
"ffxiv.com",
|
||||||
|
"finalfantasyxiv.com",
|
||||||
|
"gcloudcs.com",
|
||||||
|
"home.arpa",
|
||||||
|
"invalid",
|
||||||
|
"kuwo.cn",
|
||||||
|
"lan",
|
||||||
|
"linksys.com",
|
||||||
|
"linksyssmartwifi.com",
|
||||||
|
"local",
|
||||||
|
"localdomain",
|
||||||
|
"localhost",
|
||||||
|
"market.xiaomi.com",
|
||||||
|
"mcdn.bilivideo.cn",
|
||||||
|
"media.dssott.com",
|
||||||
|
"msftconnecttest.com",
|
||||||
|
"msftncsi.com",
|
||||||
|
"music.163.com",
|
||||||
|
"music.migu.cn",
|
||||||
|
"n0808.com",
|
||||||
|
"nflxvideo.net",
|
||||||
|
"oray.com",
|
||||||
|
"orayimg.com",
|
||||||
|
"router.asus.com",
|
||||||
|
"sandai.net",
|
||||||
|
"square-enix.com",
|
||||||
|
"srv.nintendo.net",
|
||||||
|
"steamcontent.com",
|
||||||
|
"uu.163.com",
|
||||||
|
"wargaming.net",
|
||||||
|
"wggames.cn",
|
||||||
|
"wotgame.cn",
|
||||||
|
"wowsgame.cn",
|
||||||
|
"xiami.com",
|
||||||
|
"y.qq.com"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -44,6 +44,7 @@
|
|||||||
<EmbeddedResource Include="Sample\tun_singbox_inbound" />
|
<EmbeddedResource Include="Sample\tun_singbox_inbound" />
|
||||||
<EmbeddedResource Include="Sample\tun_singbox_rules" />
|
<EmbeddedResource Include="Sample\tun_singbox_rules" />
|
||||||
<EmbeddedResource Include="Sample\linux_autostart_config" />
|
<EmbeddedResource Include="Sample\linux_autostart_config" />
|
||||||
|
<EmbeddedResource Include="Sample\singbox_fakeip_filter" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -33,17 +33,17 @@ public partial class CoreConfigSingboxService
|
|||||||
lastRule.Ip?.Contains("0.0.0.0/0") == true);
|
lastRule.Ip?.Contains("0.0.0.0/0") == true);
|
||||||
}
|
}
|
||||||
singboxConfig.dns.final = useDirectDns ? Global.SingboxDirectDNSTag : Global.SingboxRemoteDNSTag;
|
singboxConfig.dns.final = useDirectDns ? Global.SingboxDirectDNSTag : Global.SingboxRemoteDNSTag;
|
||||||
|
if ((!useDirectDns) && simpleDNSItem.FakeIP == true && simpleDNSItem.GlobalFakeIp == false)
|
||||||
// Tun2SocksAddress
|
|
||||||
if (node != null && Utils.IsDomain(node.Address))
|
|
||||||
{
|
{
|
||||||
singboxConfig.dns.rules ??= new List<Rule4Sbox>();
|
singboxConfig.dns.rules.Add(new()
|
||||||
singboxConfig.dns.rules.Insert(0, new Rule4Sbox
|
|
||||||
{
|
{
|
||||||
server = Global.SingboxOutboundResolverTag,
|
server = Global.SingboxFakeDNSTag,
|
||||||
domain = [node.Address],
|
query_type = new List<int> { 1, 28 }, // A and AAAA
|
||||||
|
rewrite_ttl = 1,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await GenOutboundDnsRule(node, singboxConfig, Global.SingboxOutboundResolverTag);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -187,6 +187,28 @@ public partial class CoreConfigSingboxService
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (simpleDNSItem.FakeIP == true && simpleDNSItem.GlobalFakeIp == true)
|
||||||
|
{
|
||||||
|
var fakeipFilterRule = JsonUtils.Deserialize<Rule4Sbox>(EmbedUtils.GetEmbedText(Global.SingboxFakeIPFilterFileName));
|
||||||
|
fakeipFilterRule.invert = true;
|
||||||
|
var rule4Fake = new Rule4Sbox
|
||||||
|
{
|
||||||
|
server = Global.SingboxFakeDNSTag,
|
||||||
|
type = "logical",
|
||||||
|
mode = "and",
|
||||||
|
rewrite_ttl = 1,
|
||||||
|
rules = new List<Rule4Sbox>
|
||||||
|
{
|
||||||
|
new() {
|
||||||
|
query_type = new List<int> { 1, 28 }, // A and AAAA
|
||||||
|
},
|
||||||
|
fakeipFilterRule,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
singboxConfig.dns.rules.Add(rule4Fake);
|
||||||
|
}
|
||||||
|
|
||||||
var routing = await ConfigHandler.GetDefaultRouting(_config);
|
var routing = await ConfigHandler.GetDefaultRouting(_config);
|
||||||
if (routing == null)
|
if (routing == null)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -266,10 +288,12 @@ public partial class CoreConfigSingboxService
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (simpleDNSItem.FakeIP == true)
|
if (simpleDNSItem.FakeIP == true && simpleDNSItem.GlobalFakeIp == false)
|
||||||
{
|
{
|
||||||
var rule4Fake = JsonUtils.DeepCopy(rule);
|
var rule4Fake = JsonUtils.DeepCopy(rule);
|
||||||
rule4Fake.server = Global.SingboxFakeDNSTag;
|
rule4Fake.server = Global.SingboxFakeDNSTag;
|
||||||
|
rule4Fake.query_type = new List<int> { 1, 28 }; // A and AAAA
|
||||||
|
rule4Fake.rewrite_ttl = 1;
|
||||||
singboxConfig.dns.rules.Add(rule4Fake);
|
singboxConfig.dns.rules.Add(rule4Fake);
|
||||||
}
|
}
|
||||||
rule.server = Global.SingboxRemoteDNSTag;
|
rule.server = Global.SingboxRemoteDNSTag;
|
||||||
@@ -313,16 +337,7 @@ public partial class CoreConfigSingboxService
|
|||||||
await GenDnsDomainsLegacyCompatible(singboxConfig, item);
|
await GenDnsDomainsLegacyCompatible(singboxConfig, item);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tun2SocksAddress
|
await GenOutboundDnsRule(node, singboxConfig, Global.SingboxFinalResolverTag);
|
||||||
if (node != null && Utils.IsDomain(node.Address))
|
|
||||||
{
|
|
||||||
singboxConfig.dns.rules ??= new List<Rule4Sbox>();
|
|
||||||
singboxConfig.dns.rules.Insert(0, new Rule4Sbox
|
|
||||||
{
|
|
||||||
server = Global.SingboxFinalResolverTag,
|
|
||||||
domain = [node.Address],
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -392,6 +407,37 @@ public partial class CoreConfigSingboxService
|
|||||||
return await Task.FromResult(0);
|
return await Task.FromResult(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task<int> GenOutboundDnsRule(ProfileItem? node, SingboxConfig singboxConfig, string? server)
|
||||||
|
{
|
||||||
|
if (node == null)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
var domain = string.Empty;
|
||||||
|
if (Utils.IsDomain(node.Address)) // normal outbound
|
||||||
|
{
|
||||||
|
domain = node.Address;
|
||||||
|
}
|
||||||
|
else if (node.Address == Global.Loopback && node.SpiderX.IsNotEmpty() && Utils.IsDomain(node.SpiderX)) // Tun2SocksAddress
|
||||||
|
{
|
||||||
|
domain = node.SpiderX;
|
||||||
|
}
|
||||||
|
if (domain.IsNullOrEmpty())
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
singboxConfig.dns.rules ??= new List<Rule4Sbox>();
|
||||||
|
singboxConfig.dns.rules.Insert(0, new Rule4Sbox
|
||||||
|
{
|
||||||
|
server = server,
|
||||||
|
domain = [domain],
|
||||||
|
});
|
||||||
|
|
||||||
|
return await Task.FromResult(0);
|
||||||
|
}
|
||||||
|
|
||||||
private static Server4Sbox? ParseDnsAddress(string address)
|
private static Server4Sbox? ParseDnsAddress(string address)
|
||||||
{
|
{
|
||||||
var addressFirst = address?.Split(address.Contains(',') ? ',' : ';').FirstOrDefault()?.Trim();
|
var addressFirst = address?.Split(address.Contains(',') ? ',' : ';').FirstOrDefault()?.Trim();
|
||||||
|
|||||||
@@ -72,11 +72,6 @@ public partial class CoreConfigSingboxService
|
|||||||
}
|
}
|
||||||
|
|
||||||
var hostsDomains = new List<string>();
|
var hostsDomains = new List<string>();
|
||||||
var systemHostsMap = Utils.GetSystemHosts();
|
|
||||||
foreach (var kvp in systemHostsMap)
|
|
||||||
{
|
|
||||||
hostsDomains.Add(kvp.Key);
|
|
||||||
}
|
|
||||||
var dnsItem = await AppManager.Instance.GetDNSItem(ECoreType.sing_box);
|
var dnsItem = await AppManager.Instance.GetDNSItem(ECoreType.sing_box);
|
||||||
if (dnsItem == null || dnsItem.Enabled == false)
|
if (dnsItem == null || dnsItem.Enabled == false)
|
||||||
{
|
{
|
||||||
@@ -89,12 +84,23 @@ public partial class CoreConfigSingboxService
|
|||||||
hostsDomains.Add(kvp.Key);
|
hostsDomains.Add(kvp.Key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (simpleDNSItem.UseSystemHosts == true)
|
||||||
|
{
|
||||||
|
var systemHostsMap = Utils.GetSystemHosts();
|
||||||
|
foreach (var kvp in systemHostsMap)
|
||||||
|
{
|
||||||
|
hostsDomains.Add(kvp.Key);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hostsDomains.Count > 0)
|
||||||
|
{
|
||||||
singboxConfig.route.rules.Add(new()
|
singboxConfig.route.rules.Add(new()
|
||||||
{
|
{
|
||||||
action = "resolve",
|
action = "resolve",
|
||||||
domain = hostsDomains,
|
domain = hostsDomains,
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
singboxConfig.route.rules.Add(new()
|
singboxConfig.route.rules.Add(new()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ public class CheckUpdateViewModel : MyReactiveObject
|
|||||||
this.WhenAnyValue(
|
this.WhenAnyValue(
|
||||||
x => x.EnableCheckPreReleaseUpdate,
|
x => x.EnableCheckPreReleaseUpdate,
|
||||||
y => y == true)
|
y => y == true)
|
||||||
.Subscribe(c => { _config.CheckUpdateItem.CheckPreReleaseUpdate = EnableCheckPreReleaseUpdate; });
|
.Subscribe(c => _config.CheckUpdateItem.CheckPreReleaseUpdate = EnableCheckPreReleaseUpdate);
|
||||||
|
|
||||||
RefreshCheckUpdateItems();
|
RefreshCheckUpdateItems();
|
||||||
}
|
}
|
||||||
@@ -158,11 +158,8 @@ public class CheckUpdateViewModel : MyReactiveObject
|
|||||||
UpdatedPlusPlus(_geo, "");
|
UpdatedPlusPlus(_geo, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
await (new UpdateService()).UpdateGeoFileAll(_config, _updateUI)
|
await new UpdateService().UpdateGeoFileAll(_config, _updateUI)
|
||||||
.ContinueWith(t =>
|
.ContinueWith(t => UpdatedPlusPlus(_geo, ""));
|
||||||
{
|
|
||||||
UpdatedPlusPlus(_geo, "");
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task CheckUpdateN(bool preRelease)
|
private async Task CheckUpdateN(bool preRelease)
|
||||||
@@ -176,11 +173,8 @@ public class CheckUpdateViewModel : MyReactiveObject
|
|||||||
UpdatedPlusPlus(_v2rayN, msg);
|
UpdatedPlusPlus(_v2rayN, msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
await (new UpdateService()).CheckUpdateGuiN(_config, _updateUI, preRelease)
|
await new UpdateService().CheckUpdateGuiN(_config, _updateUI, preRelease)
|
||||||
.ContinueWith(t =>
|
.ContinueWith(t => UpdatedPlusPlus(_v2rayN, ""));
|
||||||
{
|
|
||||||
UpdatedPlusPlus(_v2rayN, "");
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task CheckUpdateCore(CheckUpdateModel model, bool preRelease)
|
private async Task CheckUpdateCore(CheckUpdateModel model, bool preRelease)
|
||||||
@@ -196,11 +190,8 @@ public class CheckUpdateViewModel : MyReactiveObject
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
var type = (ECoreType)Enum.Parse(typeof(ECoreType), model.CoreType);
|
var type = (ECoreType)Enum.Parse(typeof(ECoreType), model.CoreType);
|
||||||
await (new UpdateService()).CheckUpdateCore(type, _config, _updateUI, preRelease)
|
await new UpdateService().CheckUpdateCore(type, _config, _updateUI, preRelease)
|
||||||
.ContinueWith(t =>
|
.ContinueWith(t => UpdatedPlusPlus(model.CoreType, ""));
|
||||||
{
|
|
||||||
UpdatedPlusPlus(model.CoreType, "");
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task UpdateFinished()
|
private async Task UpdateFinished()
|
||||||
@@ -311,7 +302,7 @@ public class CheckUpdateViewModel : MyReactiveObject
|
|||||||
|
|
||||||
if (Utils.IsNonWindows())
|
if (Utils.IsNonWindows())
|
||||||
{
|
{
|
||||||
var filesList = (new DirectoryInfo(toPath)).GetFiles().Select(u => u.FullName).ToList();
|
var filesList = new DirectoryInfo(toPath).GetFiles().Select(u => u.FullName).ToList();
|
||||||
foreach (var file in filesList)
|
foreach (var file in filesList)
|
||||||
{
|
{
|
||||||
await Utils.SetLinuxChmod(Path.Combine(toPath, item.CoreType.ToLower()));
|
await Utils.SetLinuxChmod(Path.Combine(toPath, item.CoreType.ToLower()));
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using Avalonia;
|
using Avalonia;
|
||||||
using Avalonia.Controls.ApplicationLifetimes;
|
using Avalonia.Controls.ApplicationLifetimes;
|
||||||
using Avalonia.Markup.Xaml;
|
using Avalonia.Markup.Xaml;
|
||||||
using ServiceLib.Manager;
|
|
||||||
using Splat;
|
using Splat;
|
||||||
using v2rayN.Desktop.Common;
|
using v2rayN.Desktop.Common;
|
||||||
using v2rayN.Desktop.Views;
|
using v2rayN.Desktop.Views;
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using Avalonia;
|
using Avalonia;
|
||||||
using Avalonia.Interactivity;
|
using Avalonia.Interactivity;
|
||||||
using Avalonia.ReactiveUI;
|
using Avalonia.ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
|
|
||||||
namespace v2rayN.Desktop.Base;
|
namespace v2rayN.Desktop.Base;
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
global using ServiceLib;
|
global using ServiceLib;
|
||||||
global using ServiceLib.Base;
|
global using ServiceLib.Base;
|
||||||
global using ServiceLib.Common;
|
global using ServiceLib.Common;
|
||||||
global using ServiceLib.Enums;
|
global using ServiceLib.Enums;
|
||||||
global using ServiceLib.Handler;
|
global using ServiceLib.Handler;
|
||||||
|
global using ServiceLib.Manager;
|
||||||
global using ServiceLib.Models;
|
global using ServiceLib.Models;
|
||||||
global using ServiceLib.Resx;
|
global using ServiceLib.Resx;
|
||||||
global using ServiceLib.ViewModels;
|
global using ServiceLib.ViewModels;
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
using Avalonia;
|
using Avalonia;
|
||||||
using Avalonia.ReactiveUI;
|
using Avalonia.ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
using v2rayN.Desktop.Common;
|
using v2rayN.Desktop.Common;
|
||||||
|
|
||||||
namespace v2rayN.Desktop;
|
namespace v2rayN.Desktop;
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ using Avalonia.Styling;
|
|||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ReactiveUI.Fody.Helpers;
|
using ReactiveUI.Fody.Helpers;
|
||||||
using Semi.Avalonia;
|
using Semi.Avalonia;
|
||||||
using ServiceLib.Manager;
|
|
||||||
|
|
||||||
namespace v2rayN.Desktop.ViewModels;
|
namespace v2rayN.Desktop.ViewModels;
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ using System.Reactive.Disposables;
|
|||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
using Avalonia.Interactivity;
|
using Avalonia.Interactivity;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
using v2rayN.Desktop.Base;
|
using v2rayN.Desktop.Base;
|
||||||
|
|
||||||
namespace v2rayN.Desktop.Views;
|
namespace v2rayN.Desktop.Views;
|
||||||
|
|||||||
@@ -229,7 +229,7 @@
|
|||||||
Grid.Column="2"
|
Grid.Column="2"
|
||||||
Margin="{StaticResource Margin4}"
|
Margin="{StaticResource Margin4}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Text="{x:Static resx:ResUI.TbApplyProxyDomainsOnly}"
|
Text="{x:Static resx:ResUI.TbFakeIPTips}"
|
||||||
TextWrapping="Wrap" />
|
TextWrapping="Wrap" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ using System.Reactive.Disposables;
|
|||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
using Avalonia.Interactivity;
|
using Avalonia.Interactivity;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
using v2rayN.Desktop.Base;
|
using v2rayN.Desktop.Base;
|
||||||
|
|
||||||
namespace v2rayN.Desktop.Views;
|
namespace v2rayN.Desktop.Views;
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using System.Reactive.Disposables;
|
using System.Reactive.Disposables;
|
||||||
using Avalonia.Interactivity;
|
using Avalonia.Interactivity;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
using v2rayN.Desktop.Base;
|
using v2rayN.Desktop.Base;
|
||||||
|
|
||||||
namespace v2rayN.Desktop.Views;
|
namespace v2rayN.Desktop.Views;
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ using Avalonia.Threading;
|
|||||||
using DialogHostAvalonia;
|
using DialogHostAvalonia;
|
||||||
using MsBox.Avalonia.Enums;
|
using MsBox.Avalonia.Enums;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
using Splat;
|
using Splat;
|
||||||
using v2rayN.Desktop.Base;
|
using v2rayN.Desktop.Base;
|
||||||
using v2rayN.Desktop.Common;
|
using v2rayN.Desktop.Common;
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ using System.Reactive.Disposables;
|
|||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
using Avalonia.Interactivity;
|
using Avalonia.Interactivity;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
using v2rayN.Desktop.Base;
|
using v2rayN.Desktop.Base;
|
||||||
|
|
||||||
namespace v2rayN.Desktop.Views;
|
namespace v2rayN.Desktop.Views;
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ using Avalonia.Interactivity;
|
|||||||
using Avalonia.ReactiveUI;
|
using Avalonia.ReactiveUI;
|
||||||
using Avalonia.VisualTree;
|
using Avalonia.VisualTree;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
|
|
||||||
namespace v2rayN.Desktop.Views;
|
namespace v2rayN.Desktop.Views;
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ using Avalonia.Threading;
|
|||||||
using DialogHostAvalonia;
|
using DialogHostAvalonia;
|
||||||
using MsBox.Avalonia.Enums;
|
using MsBox.Avalonia.Enums;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
using Splat;
|
using Splat;
|
||||||
using v2rayN.Desktop.Common;
|
using v2rayN.Desktop.Common;
|
||||||
|
|
||||||
|
|||||||
@@ -4,19 +4,25 @@
|
|||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
d:DesignHeight="480"
|
xmlns:sys="clr-namespace:System;assembly=netstandard"
|
||||||
d:DesignWidth="400"
|
d:DesignHeight="600"
|
||||||
|
d:DesignWidth="600"
|
||||||
mc:Ignorable="d">
|
mc:Ignorable="d">
|
||||||
|
|
||||||
|
<UserControl.Resources>
|
||||||
|
<sys:Double x:Key="QrcodeWidth">500</sys:Double>
|
||||||
|
</UserControl.Resources>
|
||||||
|
|
||||||
<Grid Margin="32" RowDefinitions="Auto,Auto">
|
<Grid Margin="32" RowDefinitions="Auto,Auto">
|
||||||
<Image
|
<Image
|
||||||
Name="imgQrcode"
|
Name="imgQrcode"
|
||||||
Width="300"
|
Width="{StaticResource QrcodeWidth}"
|
||||||
Height="300" />
|
Height="{StaticResource QrcodeWidth}" />
|
||||||
|
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txtContent"
|
x:Name="txtContent"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Width="300"
|
Width="{StaticResource QrcodeWidth}"
|
||||||
MaxHeight="100"
|
MaxHeight="100"
|
||||||
Margin="{StaticResource MarginTb8}"
|
Margin="{StaticResource MarginTb8}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
|
|||||||
@@ -22,10 +22,18 @@ public partial class QrcodeView : UserControl
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Bitmap? GetQRCode(string? url)
|
private Bitmap? GetQRCode(string? url)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
var bytes = QRCodeUtils.GenQRCode(url);
|
var bytes = QRCodeUtils.GenQRCode(url);
|
||||||
return ByteToBitmap(bytes);
|
return ByteToBitmap(bytes);
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logging.SaveLog("GetQRCode", ex);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private Bitmap? ByteToBitmap(byte[]? bytes)
|
private Bitmap? ByteToBitmap(byte[]? bytes)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ using Avalonia.ReactiveUI;
|
|||||||
using Avalonia.Threading;
|
using Avalonia.Threading;
|
||||||
using DialogHostAvalonia;
|
using DialogHostAvalonia;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
using Splat;
|
using Splat;
|
||||||
using v2rayN.Desktop.Common;
|
using v2rayN.Desktop.Common;
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ using Avalonia.Controls;
|
|||||||
using Avalonia.Threading;
|
using Avalonia.Threading;
|
||||||
using CliWrap.Buffered;
|
using CliWrap.Buffered;
|
||||||
using DialogHostAvalonia;
|
using DialogHostAvalonia;
|
||||||
using ServiceLib.Manager;
|
|
||||||
|
|
||||||
namespace v2rayN.Desktop.Views;
|
namespace v2rayN.Desktop.Views;
|
||||||
|
|
||||||
|
|||||||
24
v2rayN/v2rayN.slnx
Normal file
24
v2rayN/v2rayN.slnx
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<Solution>
|
||||||
|
<Folder Name="/GitHub Action/">
|
||||||
|
<File Path="../.github/workflows/build-all.yml" />
|
||||||
|
<File Path="../.github/workflows/build-linux.yml" />
|
||||||
|
<File Path="../.github/workflows/build-osx.yml" />
|
||||||
|
<File Path="../.github/workflows/build-windows-desktop.yml" />
|
||||||
|
<File Path="../.github/workflows/build-windows.yml" />
|
||||||
|
<File Path="../.github/workflows/winget-publish.yml" />
|
||||||
|
<File Path="../package-appimage.sh" />
|
||||||
|
<File Path="../package-debian.sh" />
|
||||||
|
<File Path="../package-osx.sh" />
|
||||||
|
<File Path="../package-release-zip.sh" />
|
||||||
|
<File Path="../pkg2appimage.yml" />
|
||||||
|
</Folder>
|
||||||
|
<Folder Name="/Solution Files/">
|
||||||
|
<File Path="Directory.Build.props" />
|
||||||
|
<File Path="Directory.Packages.props" />
|
||||||
|
</Folder>
|
||||||
|
<Project Path="AmazTool/AmazTool.csproj" />
|
||||||
|
<Project Path="GlobalHotKeys/src/GlobalHotKeys/GlobalHotKeys.csproj" />
|
||||||
|
<Project Path="ServiceLib/ServiceLib.csproj" />
|
||||||
|
<Project Path="v2rayN.Desktop/v2rayN.Desktop.csproj" />
|
||||||
|
<Project Path="v2rayN/v2rayN.csproj" />
|
||||||
|
</Solution>
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Threading;
|
using System.Windows.Threading;
|
||||||
using ServiceLib.Manager;
|
|
||||||
|
|
||||||
namespace v2rayN;
|
namespace v2rayN;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
using System.Windows;
|
using System.Windows;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
|
|
||||||
namespace v2rayN.Base;
|
namespace v2rayN.Base;
|
||||||
|
|
||||||
|
|||||||
@@ -20,8 +20,9 @@ public class QRCodeUtils
|
|||||||
var qrCodeImage = ServiceLib.Common.QRCodeUtils.GenQRCode(strContent);
|
var qrCodeImage = ServiceLib.Common.QRCodeUtils.GenQRCode(strContent);
|
||||||
return qrCodeImage is null ? null : ByteToImage(qrCodeImage);
|
return qrCodeImage is null ? null : ByteToImage(qrCodeImage);
|
||||||
}
|
}
|
||||||
catch
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
Logging.SaveLog("GetQRCode", ex);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -32,8 +33,8 @@ public class QRCodeUtils
|
|||||||
{
|
{
|
||||||
GetDpi(window, out var dpiX, out var dpiY);
|
GetDpi(window, out var dpiX, out var dpiY);
|
||||||
|
|
||||||
var left = (int)(SystemParameters.WorkArea.Left);
|
var left = (int)SystemParameters.WorkArea.Left;
|
||||||
var top = (int)(SystemParameters.WorkArea.Top);
|
var top = (int)SystemParameters.WorkArea.Top;
|
||||||
var width = (int)(SystemParameters.WorkArea.Width / dpiX);
|
var width = (int)(SystemParameters.WorkArea.Width / dpiX);
|
||||||
var height = (int)(SystemParameters.WorkArea.Height / dpiY);
|
var height = (int)(SystemParameters.WorkArea.Height / dpiY);
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using System.Windows.Media;
|
using System.Windows.Media;
|
||||||
using ServiceLib.Manager;
|
|
||||||
|
|
||||||
namespace v2rayN.Converters;
|
namespace v2rayN.Converters;
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
global using ServiceLib;
|
global using ServiceLib;
|
||||||
global using ServiceLib.Base;
|
global using ServiceLib.Base;
|
||||||
global using ServiceLib.Common;
|
global using ServiceLib.Common;
|
||||||
global using ServiceLib.Enums;
|
global using ServiceLib.Enums;
|
||||||
global using ServiceLib.Handler;
|
global using ServiceLib.Handler;
|
||||||
|
global using ServiceLib.Manager;
|
||||||
global using ServiceLib.Models;
|
global using ServiceLib.Models;
|
||||||
global using ServiceLib.Resx;
|
global using ServiceLib.Resx;
|
||||||
global using ServiceLib.ViewModels;
|
global using ServiceLib.ViewModels;
|
||||||
@@ -4,7 +4,6 @@ using System.Text;
|
|||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using System.Windows.Interop;
|
using System.Windows.Interop;
|
||||||
using ServiceLib.Manager;
|
|
||||||
|
|
||||||
namespace v2rayN.Manager;
|
namespace v2rayN.Manager;
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ using MaterialDesignColors.ColorManipulation;
|
|||||||
using MaterialDesignThemes.Wpf;
|
using MaterialDesignThemes.Wpf;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ReactiveUI.Fody.Helpers;
|
using ReactiveUI.Fody.Helpers;
|
||||||
using ServiceLib.Manager;
|
|
||||||
|
|
||||||
namespace v2rayN.ViewModels;
|
namespace v2rayN.ViewModels;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using System.Reactive.Disposables;
|
using System.Reactive.Disposables;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
|
|
||||||
namespace v2rayN.Views;
|
namespace v2rayN.Views;
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ using System.Reactive.Disposables;
|
|||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
|
|
||||||
namespace v2rayN.Views;
|
namespace v2rayN.Views;
|
||||||
|
|
||||||
|
|||||||
@@ -281,7 +281,7 @@
|
|||||||
Margin="{StaticResource Margin8}"
|
Margin="{StaticResource Margin8}"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Style="{StaticResource ToolbarTextBlock}"
|
Style="{StaticResource ToolbarTextBlock}"
|
||||||
Text="{x:Static resx:ResUI.TbApplyProxyDomainsOnly}"
|
Text="{x:Static resx:ResUI.TbFakeIPTips}"
|
||||||
TextWrapping="Wrap" />
|
TextWrapping="Wrap" />
|
||||||
|
|
||||||
<TextBlock
|
<TextBlock
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using System.Reactive.Disposables;
|
using System.Reactive.Disposables;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
|
|
||||||
namespace v2rayN.Views;
|
namespace v2rayN.Views;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using System.Reactive.Disposables;
|
using System.Reactive.Disposables;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
|
|
||||||
namespace v2rayN.Views;
|
namespace v2rayN.Views;
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ using System.Windows;
|
|||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
using v2rayN.Manager;
|
using v2rayN.Manager;
|
||||||
|
|
||||||
namespace v2rayN.Views;
|
namespace v2rayN.Views;
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ using System.Windows.Media;
|
|||||||
using System.Windows.Threading;
|
using System.Windows.Threading;
|
||||||
using MaterialDesignThemes.Wpf;
|
using MaterialDesignThemes.Wpf;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
using Splat;
|
using Splat;
|
||||||
using v2rayN.Manager;
|
using v2rayN.Manager;
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ using System.Reactive.Disposables;
|
|||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Media;
|
using System.Windows.Media;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
|
|
||||||
namespace v2rayN.Views;
|
namespace v2rayN.Views;
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ using System.Windows.Controls;
|
|||||||
using System.Windows.Controls.Primitives;
|
using System.Windows.Controls.Primitives;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
using v2rayN.Base;
|
using v2rayN.Base;
|
||||||
|
|
||||||
namespace v2rayN.Views;
|
namespace v2rayN.Views;
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ using System.Windows.Media;
|
|||||||
using System.Windows.Threading;
|
using System.Windows.Threading;
|
||||||
using MaterialDesignThemes.Wpf;
|
using MaterialDesignThemes.Wpf;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
using Splat;
|
using Splat;
|
||||||
using v2rayN.Base;
|
using v2rayN.Base;
|
||||||
using Point = System.Windows.Point;
|
using Point = System.Windows.Point;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<UserControl
|
<UserControl
|
||||||
x:Class="v2rayN.Views.QrcodeView"
|
x:Class="v2rayN.Views.QrcodeView"
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
@@ -6,28 +6,33 @@
|
|||||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:resx="clr-namespace:ServiceLib.Resx;assembly=ServiceLib"
|
xmlns:resx="clr-namespace:ServiceLib.Resx;assembly=ServiceLib"
|
||||||
d:DesignHeight="300"
|
xmlns:sys="clr-namespace:System;assembly=mscorlib"
|
||||||
d:DesignWidth="300"
|
d:DesignHeight="600"
|
||||||
|
d:DesignWidth="600"
|
||||||
Style="{StaticResource ViewGlobal}"
|
Style="{StaticResource ViewGlobal}"
|
||||||
mc:Ignorable="d">
|
mc:Ignorable="d">
|
||||||
|
<UserControl.Resources>
|
||||||
|
<sys:Double x:Key="QrcodeWidth">500</sys:Double>
|
||||||
|
</UserControl.Resources>
|
||||||
|
|
||||||
<Grid Margin="32">
|
<Grid Margin="32">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="60" />
|
<RowDefinition Height="80" />
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
<Image
|
<Image
|
||||||
x:Name="imgQrcode"
|
x:Name="imgQrcode"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
Width="300"
|
Width="{StaticResource QrcodeWidth}"
|
||||||
Height="300"
|
Height="{StaticResource QrcodeWidth}"
|
||||||
Stretch="UniformToFill" />
|
Stretch="UniformToFill" />
|
||||||
|
|
||||||
<TextBox
|
<TextBox
|
||||||
x:Name="txtContent"
|
x:Name="txtContent"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Width="300"
|
Width="{StaticResource QrcodeWidth}"
|
||||||
Margin="0,8"
|
Margin="0,8"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
IsReadOnly="True"
|
IsReadOnly="True"
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using System.Reactive.Disposables;
|
using System.Reactive.Disposables;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
|
|
||||||
namespace v2rayN.Views;
|
namespace v2rayN.Views;
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ using System.Reactive.Disposables;
|
|||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
|
|
||||||
namespace v2rayN.Views;
|
namespace v2rayN.Views;
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ using System.Reactive.Disposables;
|
|||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
|
|
||||||
namespace v2rayN.Views;
|
namespace v2rayN.Views;
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ using System.Windows;
|
|||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using System.Windows.Threading;
|
using System.Windows.Threading;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
using Splat;
|
using Splat;
|
||||||
using v2rayN.Manager;
|
using v2rayN.Manager;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using System.Reactive.Disposables;
|
using System.Reactive.Disposables;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
|
|
||||||
namespace v2rayN.Views;
|
namespace v2rayN.Views;
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ using System.Windows;
|
|||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using MaterialDesignThemes.Wpf;
|
using MaterialDesignThemes.Wpf;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ServiceLib.Manager;
|
|
||||||
|
|
||||||
namespace v2rayN.Views;
|
namespace v2rayN.Views;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user