Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bc957fea71 | ||
|
|
566f056149 | ||
|
|
abe484b0df | ||
|
|
982c865245 | ||
|
|
07d2a27b5f | ||
|
|
e4c65deda8 | ||
|
|
4930646e05 | ||
|
|
01dd1ff56f | ||
|
|
9433213fe5 | ||
|
|
82dea829f1 | ||
|
|
dafc83aa53 | ||
|
|
7ab1cd6612 | ||
|
|
d0e3b3ffbd |
@@ -2,7 +2,6 @@
|
||||
using System.IO;
|
||||
using System.Net.Sockets;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace PacLib;
|
||||
@@ -50,7 +49,7 @@ public class PacHandler
|
||||
_tcpListener = TcpListener.Create(_pacPort);
|
||||
_isRunning = true;
|
||||
_tcpListener.Start();
|
||||
Task.Factory.StartNew(() =>
|
||||
Task.Factory.StartNew(async () =>
|
||||
{
|
||||
while (_isRunning)
|
||||
{
|
||||
@@ -58,25 +57,25 @@ public class PacHandler
|
||||
{
|
||||
if (!_tcpListener.Pending())
|
||||
{
|
||||
Thread.Sleep(10);
|
||||
await Task.Delay(10);
|
||||
continue;
|
||||
}
|
||||
|
||||
var client = _tcpListener.AcceptTcpClient();
|
||||
Task.Run(() =>
|
||||
{
|
||||
var stream = client.GetStream();
|
||||
var sb = new StringBuilder();
|
||||
sb.AppendLine("HTTP/1.0 200 OK");
|
||||
sb.AppendLine("Content-type:application/x-ns-proxy-autoconfig");
|
||||
sb.AppendLine("Connection:close");
|
||||
sb.AppendLine("Content-Length:" + Encoding.UTF8.GetByteCount(_pacText));
|
||||
sb.AppendLine();
|
||||
sb.Append(_pacText);
|
||||
var content = Encoding.UTF8.GetBytes(sb.ToString());
|
||||
stream.Write(content, 0, content.Length);
|
||||
stream.Flush();
|
||||
});
|
||||
await Task.Run(() =>
|
||||
{
|
||||
var stream = client.GetStream();
|
||||
var sb = new StringBuilder();
|
||||
sb.AppendLine("HTTP/1.0 200 OK");
|
||||
sb.AppendLine("Content-type:application/x-ns-proxy-autoconfig");
|
||||
sb.AppendLine("Connection:close");
|
||||
sb.AppendLine("Content-Length:" + Encoding.UTF8.GetByteCount(_pacText));
|
||||
sb.AppendLine();
|
||||
sb.Append(_pacText);
|
||||
var content = Encoding.UTF8.GetBytes(sb.ToString());
|
||||
stream.Write(content, 0, content.Length);
|
||||
stream.Flush();
|
||||
});
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
<Application
|
||||
x:Class="v2rayN.App"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:conv="clr-namespace:v2rayN.Converters"
|
||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||
ShutdownMode="OnExplicitShutdown"
|
||||
StartupUri="Views/MainWindow.xaml">
|
||||
<Application.Resources>
|
||||
@@ -21,7 +21,7 @@
|
||||
<system:Double x:Key="StdFontSize2">14</system:Double>
|
||||
<system:Double x:Key="StdFontSizeMsg">11</system:Double>
|
||||
|
||||
<conv:InverseBooleanConverter x:Key="InverseBooleanConverter"/>
|
||||
<conv:InverseBooleanConverter x:Key="InverseBooleanConverter" />
|
||||
<Thickness
|
||||
x:Key="ServerItemMargin"
|
||||
Bottom="4"
|
||||
|
||||
@@ -8,7 +8,7 @@ namespace v2rayN.Converters
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
if(targetType != typeof(bool))
|
||||
if (targetType != typeof(bool))
|
||||
{
|
||||
throw new InvalidOperationException("The target must be a boolean");
|
||||
}
|
||||
@@ -21,4 +21,4 @@ namespace v2rayN.Converters
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -858,10 +858,18 @@ namespace v2rayN.Handler
|
||||
profileItem.network = Global.DefaultNetwork;
|
||||
}
|
||||
|
||||
var maxSort = -1;
|
||||
if (Utils.IsNullOrEmpty(profileItem.indexId))
|
||||
{
|
||||
profileItem.indexId = Utils.GetGUID(false);
|
||||
var maxSort = ProfileExHandler.Instance.GetMaxSort();
|
||||
maxSort = ProfileExHandler.Instance.GetMaxSort();
|
||||
}
|
||||
if (!toFile && maxSort < 0)
|
||||
{
|
||||
maxSort = ProfileExHandler.Instance.GetMaxSort();
|
||||
}
|
||||
if (maxSort > 0)
|
||||
{
|
||||
ProfileExHandler.Instance.SetSort(profileItem.indexId, maxSort + 1);
|
||||
}
|
||||
|
||||
|
||||
@@ -288,19 +288,19 @@ namespace v2rayN.Handler
|
||||
{
|
||||
try
|
||||
{
|
||||
if (_config.coreBasicItem.muxEnabled)
|
||||
{
|
||||
var mux = new Multiplex4Sbox()
|
||||
{
|
||||
enabled = true,
|
||||
protocol = _config.mux4Sbox.protocol,
|
||||
max_connections = _config.mux4Sbox.max_connections,
|
||||
min_streams = _config.mux4Sbox.min_streams,
|
||||
max_streams = _config.mux4Sbox.max_streams,
|
||||
padding = _config.mux4Sbox.padding
|
||||
};
|
||||
outbound.multiplex = mux;
|
||||
}
|
||||
//if (_config.coreBasicItem.muxEnabled)
|
||||
//{
|
||||
// var mux = new Multiplex4Sbox()
|
||||
// {
|
||||
// enabled = true,
|
||||
// protocol = _config.mux4Sbox.protocol,
|
||||
// max_connections = _config.mux4Sbox.max_connections,
|
||||
// min_streams = _config.mux4Sbox.min_streams,
|
||||
// max_streams = _config.mux4Sbox.max_streams,
|
||||
// padding = _config.mux4Sbox.padding
|
||||
// };
|
||||
// outbound.multiplex = mux;
|
||||
//}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -315,10 +315,19 @@ namespace v2rayN.Handler
|
||||
{
|
||||
if (node.streamSecurity == Global.StreamSecurityReality || node.streamSecurity == Global.StreamSecurity)
|
||||
{
|
||||
var server_name = string.Empty;
|
||||
if (!string.IsNullOrWhiteSpace(node.sni))
|
||||
{
|
||||
server_name = node.sni;
|
||||
}
|
||||
else if (!string.IsNullOrWhiteSpace(node.requestHost))
|
||||
{
|
||||
server_name = Utils.String2List(node.requestHost)[0];
|
||||
}
|
||||
var tls = new Tls4Sbox()
|
||||
{
|
||||
enabled = true,
|
||||
server_name = node.sni,
|
||||
server_name = server_name,
|
||||
insecure = Utils.ToBool(node.allowInsecure.IsNullOrEmpty() ? _config.coreBasicItem.defAllowInsecure.ToString().ToLower() : node.allowInsecure),
|
||||
alpn = node.GetAlpn(),
|
||||
};
|
||||
@@ -666,24 +675,21 @@ namespace v2rayN.Handler
|
||||
return 0;
|
||||
}
|
||||
//Add the dns of the remote server domain
|
||||
if (Utils.IsDomain(node.address))
|
||||
if (dns4Sbox.rules is null)
|
||||
{
|
||||
if (dns4Sbox.rules is null)
|
||||
{
|
||||
dns4Sbox.rules = new();
|
||||
}
|
||||
dns4Sbox.servers.Add(new()
|
||||
{
|
||||
tag = "local_local",
|
||||
address = "223.5.5.5",
|
||||
detour = "direct"
|
||||
});
|
||||
dns4Sbox.rules.Add(new()
|
||||
{
|
||||
server = "local_local",
|
||||
domain = new List<string>() { node.address }
|
||||
});
|
||||
dns4Sbox.rules = new();
|
||||
}
|
||||
dns4Sbox.servers.Add(new()
|
||||
{
|
||||
tag = "local_local",
|
||||
address = "223.5.5.5",
|
||||
detour = "direct"
|
||||
});
|
||||
dns4Sbox.rules.Add(new()
|
||||
{
|
||||
server = "local_local",
|
||||
outbound = "any"
|
||||
});
|
||||
|
||||
singboxConfig.dns = dns4Sbox;
|
||||
}
|
||||
|
||||
@@ -160,9 +160,9 @@ namespace v2rayN.Handler
|
||||
Task.Run(() => UpdateTaskRunGeo(config, update));
|
||||
}
|
||||
|
||||
private void UpdateTaskRunSubscription(Config config, Action<bool, string> update)
|
||||
private async Task UpdateTaskRunSubscription(Config config, Action<bool, string> update)
|
||||
{
|
||||
Thread.Sleep(60000);
|
||||
await Task.Delay(60000);
|
||||
Utils.SaveLog("UpdateTaskRunSubscription");
|
||||
|
||||
var updateHandle = new UpdateHandle();
|
||||
@@ -185,17 +185,17 @@ namespace v2rayN.Handler
|
||||
item.updateTime = updateTime;
|
||||
ConfigHandler.AddSubItem(ref config, item);
|
||||
|
||||
Thread.Sleep(5000);
|
||||
await Task.Delay(5000);
|
||||
}
|
||||
Thread.Sleep(60000);
|
||||
await Task.Delay(60000);
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateTaskRunGeo(Config config, Action<bool, string> update)
|
||||
private async Task UpdateTaskRunGeo(Config config, Action<bool, string> update)
|
||||
{
|
||||
var autoUpdateGeoTime = DateTime.Now;
|
||||
|
||||
Thread.Sleep(1000 * 120);
|
||||
await Task.Delay(1000 * 120);
|
||||
Utils.SaveLog("UpdateTaskRunGeo");
|
||||
|
||||
var updateHandle = new UpdateHandle();
|
||||
@@ -214,7 +214,7 @@ namespace v2rayN.Handler
|
||||
}
|
||||
}
|
||||
|
||||
Thread.Sleep(1000 * 3600);
|
||||
await Task.Delay(1000 * 3600);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace v2rayN.Handler
|
||||
|
||||
_lstProfileEx = new(SqliteHelper.Instance.Table<ProfileExItem>());
|
||||
|
||||
Task.Run(() =>
|
||||
Task.Run(async () =>
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
@@ -38,7 +38,7 @@ namespace v2rayN.Handler
|
||||
SqliteHelper.Instance.Replace(item);
|
||||
}
|
||||
}
|
||||
Thread.Sleep(1000 * 60);
|
||||
await Task.Delay(1000 * 60);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -95,7 +95,7 @@ namespace v2rayN.Handler
|
||||
}
|
||||
}
|
||||
|
||||
private void RunPingSub(Action<ServerTestItem> updateFun)
|
||||
private async Task RunPingSubAsync(Action<ServerTestItem> updateFun)
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -111,7 +111,7 @@ namespace v2rayN.Handler
|
||||
}
|
||||
}
|
||||
|
||||
Thread.Sleep(10);
|
||||
await Task.Delay(10);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -119,21 +119,21 @@ namespace v2rayN.Handler
|
||||
}
|
||||
}
|
||||
|
||||
private void RunPing()
|
||||
private async void RunPing()
|
||||
{
|
||||
RunPingSub((ServerTestItem it) =>
|
||||
{
|
||||
long time = Ping(it.address);
|
||||
var output = FormatOut(time, Global.DelayUnit);
|
||||
await RunPingSubAsync((ServerTestItem it) =>
|
||||
{
|
||||
long time = Ping(it.address);
|
||||
var output = FormatOut(time, Global.DelayUnit);
|
||||
|
||||
ProfileExHandler.Instance.SetTestDelay(it.indexId, output);
|
||||
UpdateFunc(it.indexId, output);
|
||||
});
|
||||
ProfileExHandler.Instance.SetTestDelay(it.indexId, output);
|
||||
UpdateFunc(it.indexId, output);
|
||||
});
|
||||
}
|
||||
|
||||
private void RunTcping()
|
||||
private async void RunTcping()
|
||||
{
|
||||
RunPingSub((ServerTestItem it) =>
|
||||
await RunPingSubAsync((ServerTestItem it) =>
|
||||
{
|
||||
int time = GetTcpingTime(it.address, it.port);
|
||||
var output = FormatOut(time, Global.DelayUnit);
|
||||
@@ -158,7 +158,7 @@ namespace v2rayN.Handler
|
||||
}
|
||||
|
||||
DownloadHandle downloadHandle = new DownloadHandle();
|
||||
//Thread.Sleep(5000);
|
||||
|
||||
List<Task> tasks = new();
|
||||
foreach (var it in _selecteds)
|
||||
{
|
||||
@@ -187,7 +187,6 @@ namespace v2rayN.Handler
|
||||
Utils.SaveLog(ex.Message, ex);
|
||||
}
|
||||
}));
|
||||
//Thread.Sleep(100);
|
||||
}
|
||||
Task.WaitAll(tasks.ToArray());
|
||||
}
|
||||
@@ -312,10 +311,10 @@ namespace v2rayN.Handler
|
||||
}
|
||||
UpdateFunc(it.indexId, "", msg);
|
||||
});
|
||||
Thread.Sleep(2000);
|
||||
await Task.Delay(2000);
|
||||
}
|
||||
|
||||
Thread.Sleep((timeout + 2) * 1000);
|
||||
await Task.Delay((timeout + 2) * 1000);
|
||||
|
||||
if (pid > 0)
|
||||
{
|
||||
@@ -329,7 +328,7 @@ namespace v2rayN.Handler
|
||||
{
|
||||
await RunRealPing();
|
||||
|
||||
Thread.Sleep(1000);
|
||||
await Task.Delay(1000);
|
||||
|
||||
await RunSpeedTestMulti();
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace v2rayN.Handler
|
||||
|
||||
private async void Init()
|
||||
{
|
||||
Thread.Sleep(5000);
|
||||
await Task.Delay(5000);
|
||||
|
||||
try
|
||||
{
|
||||
@@ -102,7 +102,7 @@ namespace v2rayN.Handler
|
||||
}
|
||||
finally
|
||||
{
|
||||
Thread.Sleep(1000);
|
||||
await Task.Delay(1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,7 +62,7 @@ namespace v2rayN.Handler
|
||||
}
|
||||
}
|
||||
var sleep = _config.guiItem.statisticsFreshRate < 1 ? 1 : _config.guiItem.statisticsFreshRate;
|
||||
Thread.Sleep(1000 * sleep);
|
||||
await Task.Delay(1000 * sleep);
|
||||
await _channel.ConnectAsync();
|
||||
}
|
||||
catch
|
||||
|
||||
@@ -462,7 +462,7 @@ namespace v2rayN.Handler
|
||||
url = coreInfo.coreDownloadUrl64;
|
||||
break;
|
||||
}
|
||||
url = string.Format(url, version);
|
||||
url = string.Format(url, version.ToVersionString("v"));
|
||||
break;
|
||||
}
|
||||
case ECoreType.sing_box:
|
||||
@@ -609,6 +609,7 @@ namespace v2rayN.Handler
|
||||
try
|
||||
{
|
||||
if (needStop) coreHandler?.CoreStop();
|
||||
Task.Delay(1000);
|
||||
string fileName = Utils.GetTempPath(Utils.GetDownloadFileName(url));
|
||||
if (File.Exists(fileName))
|
||||
{
|
||||
|
||||
@@ -22,6 +22,13 @@
|
||||
{
|
||||
public List<Server4Sbox> servers { get; set; }
|
||||
public List<Rule4Sbox> rules { get; set; }
|
||||
public string? final { get; set; }
|
||||
public string? strategy { get; set; }
|
||||
public bool? disable_cache { get; set; }
|
||||
public bool? disable_expire { get; set; }
|
||||
public bool? independent_cache { get; set; }
|
||||
public bool? reverse_mapping { get; set; }
|
||||
public Fakeip4Sbox? fakeip { get; set; }
|
||||
}
|
||||
|
||||
public class Route4Sbox
|
||||
@@ -195,4 +202,11 @@
|
||||
public List<string>? outbounds { get; set; }
|
||||
public List<string>? users { get; set; }
|
||||
}
|
||||
|
||||
public class Fakeip4Sbox
|
||||
{
|
||||
public bool enabled { get; set; }
|
||||
public string inet4_range { get; set; }
|
||||
public string inet6_range { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -87,12 +87,20 @@ namespace v2rayN.Tool
|
||||
}
|
||||
}
|
||||
|
||||
public static bool operator ==(SemanticVersion v1, SemanticVersion v2) { return v1.Equals(v2); }
|
||||
public static bool operator !=(SemanticVersion v1, SemanticVersion v2) { return !v1.Equals(v2); }
|
||||
public static bool operator >=(SemanticVersion v1, SemanticVersion v2) { return v1.GreaterEquals(v2); }
|
||||
public static bool operator <=(SemanticVersion v1, SemanticVersion v2) { return v1.LessEquals(v2); }
|
||||
public static bool operator ==(SemanticVersion v1, SemanticVersion v2)
|
||||
{ return v1.Equals(v2); }
|
||||
|
||||
public static bool operator !=(SemanticVersion v1, SemanticVersion v2)
|
||||
{ return !v1.Equals(v2); }
|
||||
|
||||
public static bool operator >=(SemanticVersion v1, SemanticVersion v2)
|
||||
{ return v1.GreaterEquals(v2); }
|
||||
|
||||
public static bool operator <=(SemanticVersion v1, SemanticVersion v2)
|
||||
{ return v1.LessEquals(v2); }
|
||||
|
||||
#region Private
|
||||
|
||||
private bool GreaterEquals(SemanticVersion other)
|
||||
{
|
||||
if (this.major < other.major)
|
||||
@@ -168,6 +176,7 @@ namespace v2rayN.Tool
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Private
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1528,7 +1528,7 @@ namespace v2rayN.ViewModels
|
||||
|
||||
private void ChangeSystemProxyStatus(ESysProxyType type, bool blChange)
|
||||
{
|
||||
SysProxyHandle.UpdateSysProxy(_config, false);
|
||||
SysProxyHandle.UpdateSysProxy(_config, _config.tunModeItem.enableTun ? true : false);
|
||||
_noticeHandler?.SendMessage(ResUI.TipChangeSystemProxy, true);
|
||||
|
||||
Application.Current.Dispatcher.Invoke((Action)(() =>
|
||||
|
||||
@@ -87,18 +87,15 @@ namespace v2rayN.ViewModels
|
||||
SelectedSource.protocol = ProtocolItems?.ToList();
|
||||
SelectedSource.inboundTag = InboundTagItems?.ToList();
|
||||
|
||||
bool hasRule =
|
||||
SelectedSource.domain != null
|
||||
&& SelectedSource.domain.Count > 0
|
||||
|| SelectedSource.ip != null
|
||||
&& SelectedSource.ip.Count > 0
|
||||
|| SelectedSource.protocol != null
|
||||
&& SelectedSource.protocol.Count > 0
|
||||
bool hasRule = SelectedSource.domain?.Count > 0
|
||||
|| SelectedSource.ip?.Count > 0
|
||||
|| SelectedSource.protocol?.Count > 0
|
||||
|| SelectedSource.process?.Count > 0
|
||||
|| !Utils.IsNullOrEmpty(SelectedSource.port);
|
||||
|
||||
if (!hasRule)
|
||||
{
|
||||
UI.ShowWarning(string.Format(ResUI.RoutingRuleDetailRequiredTips, "Port/Protocol/Domain/IP"));
|
||||
UI.ShowWarning(string.Format(ResUI.RoutingRuleDetailRequiredTips, "Port/Protocol/Domain/IP/Process"));
|
||||
return;
|
||||
}
|
||||
//_noticeHandler?.Enqueue(ResUI.OperationSuccess);
|
||||
|
||||
@@ -321,8 +321,8 @@
|
||||
Grid.Row="0"
|
||||
Grid.Column="1"
|
||||
Margin="8"
|
||||
IsEnabled="{Binding ElementName=followSystemTheme, Path=IsChecked, Converter={StaticResource InverseBooleanConverter}}"/>
|
||||
|
||||
IsEnabled="{Binding ElementName=followSystemTheme, Path=IsChecked, Converter={StaticResource InverseBooleanConverter}}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="1"
|
||||
Grid.Column="0"
|
||||
@@ -574,7 +574,7 @@
|
||||
<MenuItem
|
||||
x:Name="menuSpeedServer"
|
||||
Height="{StaticResource MenuItemHeight}"
|
||||
Header="{x:Static resx:ResUI.menuSpeedServer}"/>
|
||||
Header="{x:Static resx:ResUI.menuSpeedServer}" />
|
||||
<MenuItem
|
||||
x:Name="menuSortServerResult"
|
||||
Height="{StaticResource MenuItemHeight}"
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<ApplicationIcon>v2rayN.ico</ApplicationIcon>
|
||||
<Copyright>Copyright © 2017-2023 (GPLv3)</Copyright>
|
||||
<FileVersion>6.24</FileVersion>
|
||||
<FileVersion>6.25</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
Reference in New Issue
Block a user