Compare commits

...

27 Commits

Author SHA1 Message Date
ChsBuffer
3efbad5e5e bump version to 1.6.1 2020-10-07 21:18:37 +08:00
ChsBuffer
020c2d7e67 refactor: merge ServerForm's parital declarations 2020-10-07 21:11:39 +08:00
ChsBuffer
adcc6a75c9 fix: MainForm Text reload got exception when increase profile count #389 2020-10-07 20:54:00 +08:00
ChsBuffer
7e907eef6f fix: ServerForm High DPI Scale #388 2020-10-07 20:37:23 +08:00
ChsBuffer
d213872bde refact: rename TUNTAPController Gateway to Outbound 2020-10-07 19:26:30 +08:00
ChsBuffer
71687c1da6 Revert "Use GetLocalEndPoint to replace GetBestRoute"
This reverts commit 801e8e3b8a.
2020-10-07 19:26:25 +08:00
ChsBuffer
2eb6b23ca7 fix: trojan form 2020-10-07 10:07:55 +08:00
ChsBuffer
5490364217 bump version to 1.6.0 2020-10-06 19:18:19 +08:00
ChsBuffer
e1d66970e2 refactor: move china_ip_list to rule 2020-10-06 01:40:02 +08:00
ChsBuffer
af05878cc5 refactor: load mode head 2020-10-06 01:32:04 +08:00
ChsBuffer
a59cfdf066 clean: modes 2020-10-06 01:04:17 +08:00
ChsBuffer
513667d983 fix: IsWindows10Upper not assigned caused NetTraffic won't be displayed at the first start
fix: SupportFakeDns flag lazyload
2020-10-06 00:57:54 +08:00
ChsBuffer
2e89011f56 clean: translation 2020-10-05 22:52:56 +08:00
ChsBuffer
d369858273 fix: searchOutbound logging,mode 2 remove outbound 0.0.0.0/0 2020-10-05 22:52:04 +08:00
ChsBuffer
78def0ae1d fix: lookup server hostname before start 2020-10-05 16:19:50 +08:00
ChsBuffer
2dc4bb771e refactor: TUNTAPController SearchTapAdapter
change: Reinstall TUN/TAP Adapter to Uninstall TUN/TAP Adapter
rename: ICS to Tap Network Sharing
2020-10-04 22:05:08 +08:00
ChsBuffer
4b4280c06b remove: ServerForm.CreateComboBox parse argument 2020-10-04 12:39:47 +08:00
ChsBuffer
23ac571ade refactor: ServerForm AddControl methods
test: Parse VMess Uri
2020-10-04 10:19:09 +08:00
ChsBuffer
6f9e364444 remove: Server.Country 2020-10-04 03:51:39 +08:00
ChsBuffer
9fbac446e3 refactor: Servers Forms 2020-10-04 03:47:38 +08:00
ChsBuffer
73c7a9fe32 fix aiodns rules 2020-10-03 23:39:38 +08:00
ChsBuffer
4617de3fda Refactroing Server.ToString, Remove country name in ServerComboBox Text 2020-10-03 21:14:42 +08:00
ChsBuffer
40db9adc0d fix mode 4 start failed 2020-10-03 21:14:42 +08:00
Connection Refused
ec4e98db62 Update submodules 2020-10-03 20:53:47 +08:00
ChsBuffer
4f3b0e5afb rename namespace and move some classes 2020-10-02 16:18:53 +08:00
ChsBuffer
36dc4a07f1 Reset items in ModeComboBox before start profile 2020-10-02 01:35:31 +08:00
Bruce Wayne
cc99d32232 Update CI 2020-09-30 20:08:14 +08:00
94 changed files with 1460 additions and 27112 deletions

View File

@@ -9,7 +9,7 @@ jobs:
uses: nuget/setup-nuget@v1 uses: nuget/setup-nuget@v1
- name: Setup MSBuild - name: Setup MSBuild
uses: microsoft/setup-msbuild@v1.0.0 uses: microsoft/setup-msbuild@v1.0.1
- name: Checkout - name: Checkout
uses: actions/checkout@v2 uses: actions/checkout@v2

View File

@@ -9,6 +9,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetchLib", "NetchLib\NetchL
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetchUpdater", "NetchUpdater\NetchUpdater.csproj", "{828318A8-9B90-4A5F-BD6B-E632CC9D8933}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetchUpdater", "NetchUpdater\NetchUpdater.csproj", "{828318A8-9B90-4A5F-BD6B-E632CC9D8933}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test", "Test\Test.csproj", "{53397641-35CA-4336-8E22-2CE12EF476AC}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64 Debug|x64 = Debug|x64
@@ -27,6 +29,10 @@ Global
{828318A8-9B90-4A5F-BD6B-E632CC9D8933}.Debug|x64.Build.0 = Debug|x64 {828318A8-9B90-4A5F-BD6B-E632CC9D8933}.Debug|x64.Build.0 = Debug|x64
{828318A8-9B90-4A5F-BD6B-E632CC9D8933}.Release|x64.ActiveCfg = Release|x64 {828318A8-9B90-4A5F-BD6B-E632CC9D8933}.Release|x64.ActiveCfg = Release|x64
{828318A8-9B90-4A5F-BD6B-E632CC9D8933}.Release|x64.Build.0 = Release|x64 {828318A8-9B90-4A5F-BD6B-E632CC9D8933}.Release|x64.Build.0 = Release|x64
{53397641-35CA-4336-8E22-2CE12EF476AC}.Debug|x64.ActiveCfg = Debug|Any CPU
{53397641-35CA-4336-8E22-2CE12EF476AC}.Debug|x64.Build.0 = Debug|Any CPU
{53397641-35CA-4336-8E22-2CE12EF476AC}.Release|x64.ActiveCfg = Release|Any CPU
{53397641-35CA-4336-8E22-2CE12EF476AC}.Release|x64.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View File

@@ -4,13 +4,10 @@ using System.Text;
namespace Netch.Controllers namespace Netch.Controllers
{ {
public class DNSController : Controller public class DNSController : IController
{ {
public DNSController()
{ public string Name { get; } = "DNS Service";
Name = "DNS Service";
RedirectStd = false;
}
/// <summary> /// <summary>
/// 启动DNS服务 /// 启动DNS服务
@@ -27,7 +24,7 @@ namespace Netch.Controllers
aiodns_init(); aiodns_init();
} }
public override void Stop() public void Stop()
{ {
aiodns_free(); aiodns_free();
} }

View File

@@ -12,12 +12,18 @@ using Timer = System.Timers.Timer;
namespace Netch.Controllers namespace Netch.Controllers
{ {
abstract partial class Controller public abstract class Guard
{ {
public abstract string Name { get; protected set; }
/// <summary> /// <summary>
/// 主程序名 /// 主程序名
/// </summary> /// </summary>
public string MainFile { get; protected set; } public abstract string MainFile { get; protected set; }
protected State State { get; set; } = State.Waiting;
public abstract void Stop();
/// <summary> /// <summary>
/// 成功启动关键词 /// 成功启动关键词

View File

@@ -4,29 +4,23 @@ using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
using Microsoft.Win32; using Microsoft.Win32;
using Netch.Models; using Netch.Models;
using Netch.ServerEx.Socks5; using Netch.Servers.Socks5;
using Netch.Utils; using Netch.Utils;
namespace Netch.Controllers namespace Netch.Controllers
{ {
public class HTTPController : ModeController public class HTTPController : IModeController
{ {
public override bool TestNatRequired { get; } = false; public bool TestNatRequired { get; } = false;
public const string IEProxyExceptions = "localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;192.168.*"; public const string IEProxyExceptions = "localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;192.168.*";
/// <summary>
/// 实例
/// </summary>
public PrivoxyController pPrivoxyController = new PrivoxyController(); public PrivoxyController pPrivoxyController = new PrivoxyController();
private string prevBypass, prevHTTP, prevPAC; private string prevBypass, prevHTTP, prevPAC;
private bool prevEnabled; private bool prevEnabled;
public HTTPController() public string Name { get; } = "HTTP";
{
Name = "HTTP";
}
/// <summary> /// <summary>
/// 启动 /// 启动
@@ -34,7 +28,7 @@ namespace Netch.Controllers
/// <param name="s">服务器</param> /// <param name="s">服务器</param>
/// <param name="mode">模式</param> /// <param name="mode">模式</param>
/// <returns>是否启动成功</returns> /// <returns>是否启动成功</returns>
public override bool Start(Server s, Mode mode) public bool Start(Server s, Mode mode)
{ {
RecordPrevious(); RecordPrevious();
@@ -97,7 +91,7 @@ namespace Netch.Controllers
/// <summary> /// <summary>
/// 停止 /// 停止
/// </summary> /// </summary>
public override void Stop() public void Stop()
{ {
var tasks = new[] var tasks = new[]
{ {

View File

@@ -0,0 +1,15 @@
namespace Netch.Controllers
{
public interface IController
{
/// <summary>
/// 控制器名
/// </summary>
public string Name { get; }
/// <summary>
/// 停止
/// </summary>
public abstract void Stop();
}
}

View File

@@ -2,7 +2,7 @@ using Netch.Models;
namespace Netch.Controllers namespace Netch.Controllers
{ {
public abstract class ModeController : Controller public interface IModeController : IController
{ {
/// <summary> /// <summary>
/// 启动 /// 启动

View File

@@ -0,0 +1,19 @@
using Netch.Models;
namespace Netch.Controllers
{
public interface IServerController : IController
{
public int? Socks5LocalPort { get; set; }
public string LocalAddress { get; set; }
/// <summary>
/// 启动
/// </summary>
/// <param name="server">服务器</param>
/// <param name="mode">模式</param>
/// <returns>是否启动成功</returns>
public abstract bool Start(Server server, Mode mode);
}
}

View File

@@ -1,22 +0,0 @@
using Netch.Models;
namespace Netch.Controllers
{
public abstract partial class Controller
{
/// <summary>
/// 控制器名
/// </summary>
public string Name { get; protected set; }
/// <summary>
/// 当前状态
/// </summary>
public State State { get; protected set; } = State.Waiting;
/// <summary>
/// 停止
/// </summary>
public abstract void Stop();
}
}

View File

@@ -1,5 +1,6 @@
using System; using System;
using System.IO; using System.IO;
using System.Net;
using System.Threading.Tasks; using System.Threading.Tasks;
using Netch.Models; using Netch.Models;
using Netch.Utils; using Netch.Utils;
@@ -10,8 +11,8 @@ namespace Netch.Controllers
{ {
public static class MainController public static class MainController
{ {
public static ServerController ServerController { get; private set; } public static IServerController ServerController { get; private set; }
public static ModeController ModeController { get; private set; } public static IModeController ModeController { get; private set; }
public static bool NttTested; public static bool NttTested;
@@ -34,12 +35,22 @@ namespace Netch.Controllers
NativeMethods.FlushDNSResolverCache(); NativeMethods.FlushDNSResolverCache();
if (!Utils.Utils.SearchOutboundAdapter(false)) try
{
WebUtil.BestLocalEndPoint(new IPEndPoint(0x72727272, 53));
}
catch (Exception)
{ {
MessageBoxX.Show("No internet connection"); MessageBoxX.Show("No internet connection");
return false; return false;
} }
if (DNS.Lookup(server.Hostname) == null)
{
MessageBoxX.Show("Lookup Server hostname failed");
return false;
}
_ = Task.Run(Firewall.AddNetchFwRules); _ = Task.Run(Firewall.AddNetchFwRules);
try try
@@ -54,7 +65,7 @@ namespace Netch.Controllers
throw new StartFailedException(); throw new StartFailedException();
} }
if (ModeController.TestNatRequired) if (ModeController?.TestNatRequired ?? false)
NatTest(); NatTest();
return true; return true;
@@ -95,12 +106,16 @@ namespace Netch.Controllers
return true; return true;
} }
ServerController = Servers.GetUtilByTypeName(server.Type).GetController(); ServerController = ServerHelper.GetUtilByTypeName(server.Type).GetController();
if (ServerController is Guard instanceController)
{
Utils.Utils.KillProcessByName(instanceController.MainFile);
}
Utils.Utils.KillProcessByName(ServerController.MainFile);
PortCheckAndShowMessageBox(Global.Settings.Socks5LocalPort, "Socks5"); PortCheckAndShowMessageBox(Global.Settings.Socks5LocalPort, "Socks5");
Global.MainForm.StatusText(i18N.Translate("Starting ", ServerController.Name)); Global.MainForm.StatusText(i18N.TranslateFormat("Starting {0}", ServerController.Name));
if (await Task.Run(() => ServerController.Start(server, mode))) if (await Task.Run(() => ServerController.Start(server, mode)))
{ {
UsingPorts.Add(StatusPortInfoText.Socks5Port = Global.Settings.Socks5LocalPort); UsingPorts.Add(StatusPortInfoText.Socks5Port = Global.Settings.Socks5LocalPort);
@@ -136,7 +151,7 @@ namespace Netch.Controllers
return false; return false;
} }
Global.MainForm.StatusText(i18N.Translate("Starting ", ModeController.Name)); Global.MainForm.StatusText(i18N.TranslateFormat("Starting {0}", ModeController.Name));
if (await Task.Run(() => ModeController.Start(server, mode))) if (await Task.Run(() => ModeController.Start(server, mode)))
{ {
switch (mode.Type) switch (mode.Type)

View File

@@ -9,9 +9,9 @@ using nfapinet;
namespace Netch.Controllers namespace Netch.Controllers
{ {
public class NFController : ModeController public class NFController : IModeController
{ {
public override bool TestNatRequired { get; } = true; public bool TestNatRequired { get; } = true;
private static readonly ServiceController NFService = new ServiceController("netfilter2"); private static readonly ServiceController NFService = new ServiceController("netfilter2");
@@ -19,42 +19,40 @@ namespace Netch.Controllers
private static readonly string SystemDriver = $"{Environment.SystemDirectory}\\drivers\\netfilter2.sys"; private static readonly string SystemDriver = $"{Environment.SystemDirectory}\\drivers\\netfilter2.sys";
private static string _sysDns; private static string _sysDns;
public string Name { get; } = "Redirector";
static NFController() static NFController()
{ {
string fileName;
switch ($"{Environment.OSVersion.Version.Major}.{Environment.OSVersion.Version.Minor}") switch ($"{Environment.OSVersion.Version.Major}.{Environment.OSVersion.Version.Minor}")
{ {
case "10.0": case "10.0":
BinDriver = "Win-10.sys"; fileName = "Win-10.sys";
break; break;
case "6.3": case "6.3":
case "6.2": case "6.2":
BinDriver = "Win-8.sys"; fileName = "Win-8.sys";
break; break;
case "6.1": case "6.1":
case "6.0": case "6.0":
BinDriver = "Win-7.sys"; fileName = "Win-7.sys";
break; break;
default: default:
Logging.Error($"不支持的系统版本:{Environment.OSVersion.Version}"); Logging.Error($"不支持的系统版本:{Environment.OSVersion.Version}");
return; return;
} }
BinDriver = "bin\\" + BinDriver; BinDriver = "bin\\" + fileName;
} }
public NFController() public bool Start(Server s, Mode mode)
{ {
Name = "Redirector"; Logging.Info("内置驱动版本: " + Utils.Utils.GetFileVersion(BinDriver));
} if (Utils.Utils.GetFileVersion(SystemDriver) != Utils.Utils.GetFileVersion(BinDriver))
public override bool Start(Server s, Mode mode)
{
Logging.Info("内置驱动版本: " + Utils.Utils.FileVersion(BinDriver));
if (Utils.Utils.FileVersion(SystemDriver) != Utils.Utils.FileVersion(BinDriver))
{ {
if (File.Exists(SystemDriver)) if (File.Exists(SystemDriver))
{ {
Logging.Info("系统驱动版本: " + Utils.Utils.FileVersion(SystemDriver)); Logging.Info("系统驱动版本: " + Utils.Utils.GetFileVersion(SystemDriver));
Logging.Info("更新驱动"); Logging.Info("更新驱动");
UninstallDriver(); UninstallDriver();
} }
@@ -99,7 +97,7 @@ namespace Netch.Controllers
return aio_init(); return aio_init();
} }
public override void Stop() public void Stop()
{ {
Task.Run(() => Task.Run(() =>
{ {
@@ -171,7 +169,7 @@ namespace Netch.Controllers
/// <returns>是否成功卸载</returns> /// <returns>是否成功卸载</returns>
public static bool UninstallDriver() public static bool UninstallDriver()
{ {
Global.MainForm.StatusText(i18N.Translate("Uninstalling NF Service")); Global.MainForm.StatusText(i18N.TranslateFormat("Uninstalling {0}", "NF Service"));
Logging.Info("卸载 NF 驱动"); Logging.Info("卸载 NF 驱动");
try try
{ {

View File

@@ -5,18 +5,14 @@ using Netch.Utils;
namespace Netch.Controllers namespace Netch.Controllers
{ {
public class NTTController : Controller public class NTTController : Guard, IController
{ {
private string _localEnd; private string _localEnd;
private string _publicEnd; private string _publicEnd;
private string _result; private string _result;
private string _bindingTest; private string _bindingTest;
public override string Name { get; protected set; } = "NTT";
public NTTController() public override string MainFile { get; protected set; } = "NTT.exe";
{
Name = "NTT";
MainFile = "NTT.exe";
}
/// <summary> /// <summary>
/// 启动 NatTypeTester /// 启动 NatTypeTester
@@ -55,6 +51,7 @@ namespace Netch.Controllers
} }
} }
private new void OnOutputDataReceived(object sender, DataReceivedEventArgs e) private new void OnOutputDataReceived(object sender, DataReceivedEventArgs e)
{ {
if (string.IsNullOrEmpty(e.Data)) return; if (string.IsNullOrEmpty(e.Data)) return;

View File

@@ -3,15 +3,17 @@ using Netch.Models;
namespace Netch.Controllers namespace Netch.Controllers
{ {
public class PrivoxyController : Controller public class PrivoxyController : Guard, IController
{ {
public PrivoxyController() public PrivoxyController()
{ {
Name = "Privoxy";
MainFile = "Privoxy.exe";
RedirectStd = false; RedirectStd = false;
} }
public override string Name { get; protected set; } = "Privoxy";
public override string MainFile { get; protected set; } = "Privoxy.exe";
public bool Start(Server server, Mode mode) public bool Start(Server server, Mode mode)
{ {
var text = File.ReadAllText("bin\\default.conf") var text = File.ReadAllText("bin\\default.conf")

View File

@@ -14,9 +14,9 @@ using Netch.Utils;
namespace Netch.Controllers namespace Netch.Controllers
{ {
public class TUNTAPController : ModeController public class TUNTAPController : Guard, IModeController
{ {
public override bool TestNatRequired { get; } = true; public bool TestNatRequired { get; } = true;
// ByPassLan IP // ByPassLan IP
private readonly List<string> _bypassLanIPs = new List<string> private readonly List<string> _bypassLanIPs = new List<string>
@@ -28,57 +28,111 @@ namespace Netch.Controllers
/// <summary> /// <summary>
/// 服务器 IP 地址 /// 服务器 IP 地址
/// </summary> /// </summary>
private IPAddress[] _serverAddresses = new IPAddress[0]; private IPAddress _serverAddresses;
/// <summary> /// <summary>
/// 本地 DNS 服务控制器 /// 本地 DNS 服务控制器
/// </summary> /// </summary>
public DNSController pDNSController = new DNSController(); public DNSController DNSController = new DNSController();
public TUNTAPController() public TUNTAPController()
{ {
Name = "tun2socks";
MainFile = "tun2socks.exe";
StartedKeywords.Add("Running"); StartedKeywords.Add("Running");
StoppedKeywords.AddRange(new[] {"failed", "invalid vconfig file"}); StoppedKeywords.AddRange(new[] {"failed", "invalid vconfig file"});
} }
/// <summary> public override string Name { get; protected set; } = "tun2socks";
/// 配置 TUNTAP 适配器 public override string MainFile { get; protected set; } = "tun2socks.exe";
/// </summary>
private bool Configure()
{
// 查询服务器 IP 地址
var destination = Dns.GetHostAddressesAsync(_savedServer.Hostname);
if (destination.Wait(1000))
{
if (destination.Result.Length == 0) return false;
_serverAddresses = destination.Result; public bool Start(Server s, Mode mode)
{
_savedMode = mode;
_savedServer = s;
// 查询服务器 IP 地址
_serverAddresses = DNS.Lookup(_savedServer.Hostname);
// 查找出口适配器
if (!Utils.Utils.SearchOutboundAdapter())
{
return false;
} }
// 搜索出口 // 查找并安装 TAP 适配器
return SearchTapAdapter(); if (!SearchTapAdapter() && !AddTap())
{
Logging.Error("Tap 适配器安装失败");
return false;
}
SetupRouteTable();
string dns;
if (Global.Settings.TUNTAP.UseCustomDNS)
{
if (Global.Settings.TUNTAP.DNS.Any())
{
dns = Global.Settings.TUNTAP.DNS.Aggregate((current, ip) => $"{current},{ip}");
}
else
{
Global.Settings.TUNTAP.DNS.Add("1.1.1.1");
dns = "1.1.1.1";
}
}
else
{
var _ = DNSController.Start();
dns = "127.0.0.1";
}
var argument = new StringBuilder();
if (s.IsSocks5())
argument.Append($"-proxyServer {_serverAddresses}:{s.Port} ");
else
argument.Append($"-proxyServer 127.0.0.1:{Global.Settings.Socks5LocalPort} ");
argument.Append(
$"-tunAddr {Global.Settings.TUNTAP.Address} -tunMask {Global.Settings.TUNTAP.Netmask} -tunGw {Global.Settings.TUNTAP.Gateway} -tunDns {dns} -tunName \"{TUNTAP.GetName(Global.TUNTAP.ComponentID)}\" ");
if (Global.Settings.TUNTAP.UseFakeDNS && Global.Flags.SupportFakeDns)
argument.Append("-fakeDns ");
return StartInstanceAuto(argument.ToString(), ProcessPriorityClass.RealTime);
}
/// <summary>
/// TUN/TAP停止
/// </summary>
public override void Stop()
{
var tasks = new[]
{
Task.Factory.StartNew(StopInstance),
Task.Factory.StartNew(ClearRouteTable),
Task.Factory.StartNew(DNSController.Stop)
};
Task.WaitAll(tasks);
} }
private readonly List<IPNetwork> _directIPs = new List<IPNetwork>(); private readonly List<IPNetwork> _directIPs = new List<IPNetwork>();
private readonly List<IPNetwork> _proxyIPs = new List<IPNetwork>(); private readonly List<IPNetwork> _proxyIPs = new List<IPNetwork>();
/// <summary> /// <summary>
/// 设置绕行规则 /// 设置绕行规则
/// </summary> /// </summary>
/// <returns>是否设置成功</returns> /// <returns>是否设置成功</returns>
private bool SetupRouteTable() private void SetupRouteTable()
{ {
Logging.Info("收集路由表规则");
Global.MainForm.StatusText(i18N.Translate("SetupBypass")); Global.MainForm.StatusText(i18N.Translate("SetupBypass"));
Logging.Info("绕行 → 全局绕过 IP"); Logging.Info("绕行 → 全局绕过 IP");
_directIPs.AddRange(Global.Settings.BypassIPs.Select(IPNetwork.Parse)); _directIPs.AddRange(Global.Settings.BypassIPs.Select(IPNetwork.Parse));
Logging.Info("绕行 → 服务器 IP"); Logging.Info("绕行 → 服务器 IP");
_directIPs.AddRange(_serverAddresses.Where(address => !IPAddress.IsLoopback(address)) if (!IPAddress.IsLoopback(_serverAddresses))
.Select(address => IPNetwork.Parse(address.ToString(), 32))); _directIPs.Add(IPNetwork.Parse(_serverAddresses.ToString(), 32));
Logging.Info("绕行 → 局域网 IP"); Logging.Info("绕行 → 局域网 IP");
_directIPs.AddRange(_bypassLanIPs.Select(IPNetwork.Parse)); _directIPs.AddRange(_bypassLanIPs.Select(IPNetwork.Parse));
@@ -111,22 +165,11 @@ namespace Netch.Controllers
Logging.Info("代理 → 自定义 DNS"); Logging.Info("代理 → 自定义 DNS");
if (Global.Settings.TUNTAP.UseCustomDNS) if (Global.Settings.TUNTAP.UseCustomDNS)
{ {
var dns = string.Empty; _proxyIPs.AddRange(Global.Settings.TUNTAP.DNS.Select(ip => IPNetwork.Parse(ip, 32)));
foreach (var value in Global.Settings.TUNTAP.DNS)
{
dns += value;
dns += ',';
}
dns = dns.Trim();
dns = dns.Substring(0, dns.Length - 1);
RouteAction(Action.Create, dns, 32, RouteType.TUNTAP);
} }
else else
{ {
_proxyIPs.AddRange( _proxyIPs.AddRange(new[] {"1.1.1.1", "8.8.8.8", "9.9.9.9", "185.222.222.222"}.Select(ip => IPNetwork.Parse(ip, 32)));
new[] {"1.1.1.1", "8.8.8.8", "9.9.9.9", "185.222.222.222"}.Select(ip =>
IPNetwork.Parse(ip, 32)));
} }
} }
@@ -145,37 +188,21 @@ namespace Netch.Controllers
} }
); );
if (_savedMode.BypassChina)
{
Logging.Info("绕行 → 中国 IP");
foreach (var str in File.ReadAllLines("bin\\china_ip_list", Encoding.UTF8))
{
if (IPNetwork.TryParse(str, out var entry))
{
_directIPs.Add(entry);
}
}
}
Logging.Info("绕行 → 规则 IP"); Logging.Info("绕行 → 规则 IP");
_directIPs.AddRange(_savedMode.Rule.Select(IPNetwork.Parse)); _directIPs.AddRange(_savedMode.Rule.Select(IPNetwork.Parse));
Logging.Info("代理 → 全局"); Logging.Info("代理 → 全局");
if (!RouteAction(Action.Create, IPNetwork.Parse("0.0.0.0", 0), RouteType.TUNTAP)) RouteAction(Action.Create, IPNetwork.Parse("0.0.0.0", 0), RouteType.TUNTAP);
{
State = State.Stopped; Logging.Info("移除 → 出口网卡路由");
return false; RouteAction(Action.Delete, IPNetwork.Parse("0.0.0.0", 0), RouteType.Outbound);
}
break; break;
} }
Logging.Info("设置路由规则"); Logging.Info("设置路由规则");
RouteAction(Action.Create, _directIPs, RouteType.Gateway); RouteAction(Action.Create, _directIPs, RouteType.Outbound);
RouteAction(Action.Create, _proxyIPs, RouteType.TUNTAP); RouteAction(Action.Create, _proxyIPs, RouteType.TUNTAP);
return true;
} }
@@ -189,75 +216,18 @@ namespace Netch.Controllers
case 1: case 1:
break; break;
case 2: case 2:
RouteAction(Action.Delete, "0.0.0.0", 0, RouteType.TUNTAP, 10); RouteAction(Action.Delete, IPNetwork.Parse("0.0.0.0", 0), RouteType.TUNTAP);
RouteAction(Action.Create, IPNetwork.Parse("0.0.0.0", 0), RouteType.Outbound);
break; break;
} }
RouteAction(Action.Delete, _directIPs, RouteType.Gateway); RouteAction(Action.Delete, _directIPs, RouteType.Outbound);
RouteAction(Action.Delete, _proxyIPs, RouteType.TUNTAP); RouteAction(Action.Delete, _proxyIPs, RouteType.TUNTAP);
_directIPs.Clear(); _directIPs.Clear();
_proxyIPs.Clear(); _proxyIPs.Clear();
return true; return true;
} }
public override bool Start(Server s, Mode mode)
{
_savedMode = mode;
_savedServer = s;
if (!Configure()) return false;
SetupRouteTable();
var adapterName = TUNTAP.GetName(Global.TUNTAP.ComponentID);
string dns;
if (Global.Settings.TUNTAP.UseCustomDNS)
{
if (Global.Settings.TUNTAP.DNS.Any())
{
dns = Global.Settings.TUNTAP.DNS.Aggregate((current, ip) => $"{current},{ip}");
}
else
{
Global.Settings.TUNTAP.DNS.Add("1.1.1.1");
dns = "1.1.1.1";
}
}
else
{
var _ = pDNSController.Start();
dns = "127.0.0.1";
}
var argument = new StringBuilder();
if (s.IsSocks5())
argument.Append($"-proxyServer {s.Hostname}:{s.Port} ");
else
argument.Append($"-proxyServer 127.0.0.1:{Global.Settings.Socks5LocalPort} ");
argument.Append(
$"-tunAddr {Global.Settings.TUNTAP.Address} -tunMask {Global.Settings.TUNTAP.Netmask} -tunGw {Global.Settings.TUNTAP.Gateway} -tunDns {dns} -tunName \"{adapterName}\" ");
if (Global.Settings.TUNTAP.UseFakeDNS && Global.Flags.SupportFakeDns)
argument.Append("-fakeDns ");
return StartInstanceAuto(argument.ToString(), ProcessPriorityClass.RealTime);
}
/// <summary>
/// TUN/TAP停止
/// </summary>
public override void Stop()
{
var tasks = new[]
{
Task.Factory.StartNew(StopInstance),
Task.Factory.StartNew(ClearRouteTable),
Task.Factory.StartNew(pDNSController.Stop)
};
Task.WaitAll(tasks);
}
public bool TestFakeDNS() public bool TestFakeDNS()
{ {
@@ -265,15 +235,17 @@ namespace Netch.Controllers
var helpStr = new StringBuilder(); var helpStr = new StringBuilder();
try try
{ {
void OnOutputDataReceived(object sender,DataReceivedEventArgs e) void OnOutputDataReceived(object sender, DataReceivedEventArgs e)
{ {
if (e.Data == null) if (e.Data == null)
{ {
exited = true; exited = true;
return; return;
} }
helpStr.Append(e.Data); helpStr.Append(e.Data);
} }
InitInstance("-h"); InitInstance("-h");
// Instance.OutputDataReceived += OnOutputDataReceived; // Instance.OutputDataReceived += OnOutputDataReceived;
Instance.ErrorDataReceived += OnOutputDataReceived; Instance.ErrorDataReceived += OnOutputDataReceived;
@@ -298,27 +270,15 @@ namespace Netch.Controllers
/// </summary> /// </summary>
public static bool SearchTapAdapter() public static bool SearchTapAdapter()
{ {
Global.TUNTAP.Adapter = null;
Global.TUNTAP.Index = -1;
Global.TUNTAP.ComponentID = TUNTAP.GetComponentID();
// 搜索 TUN/TAP 适配器的索引 // 搜索 TUN/TAP 适配器的索引
if (string.IsNullOrEmpty(Global.TUNTAP.ComponentID = TUNTAP.GetComponentID())) if (string.IsNullOrEmpty(Global.TUNTAP.ComponentID))
{ {
Logging.Info("找不到 TAP 适配器"); Logging.Info("TAP 适配器未安装");
if (MessageBoxX.Show(i18N.Translate("TUN/TAP driver is not detected. Is it installed now?"), return false;
confirm: true) == DialogResult.OK)
{
TUNTAP.addtap();
// 给点时间不然立马安装完毕就查找适配器可能会导致找不到适配器ID
Thread.Sleep(1000);
if (string.IsNullOrEmpty(Global.TUNTAP.ComponentID = TUNTAP.GetComponentID()))
{
Logging.Error("找不到 TAP 适配器,驱动可能安装失败");
return false;
}
}
else
{
Logging.Info("取消安装 TAP 驱动 ");
return false;
}
} }
// 根据 ComponentID 寻找 Tap适配器 // 根据 ComponentID 寻找 Tap适配器
@@ -329,6 +289,7 @@ namespace Netch.Controllers
Global.TUNTAP.Index = adapter.GetIPProperties().GetIPv4Properties().Index; Global.TUNTAP.Index = adapter.GetIPProperties().GetIPv4Properties().Index;
Logging.Info( Logging.Info(
$"TAP 适配器:{adapter.Name} {adapter.Id} {adapter.Description}, index: {Global.TUNTAP.Index}"); $"TAP 适配器:{adapter.Name} {adapter.Id} {adapter.Description}, index: {Global.TUNTAP.Index}");
return true;
} }
catch (Exception e) catch (Exception e)
{ {
@@ -341,6 +302,18 @@ namespace Netch.Controllers
Logging.Error(msg); Logging.Error(msg);
return false; return false;
} }
}
private static bool AddTap()
{
TUNTAP.addtap();
// 给点时间不然立马安装完毕就查找适配器可能会导致找不到适配器ID
Thread.Sleep(1000);
if (string.IsNullOrEmpty(Global.TUNTAP.ComponentID = TUNTAP.GetComponentID()))
{
Logging.Error("找不到 TAP 适配器,驱动可能安装失败");
return false;
}
return true; return true;
} }
@@ -348,7 +321,7 @@ namespace Netch.Controllers
private enum RouteType private enum RouteType
{ {
Gateway, Outbound,
TUNTAP TUNTAP
} }
@@ -367,18 +340,13 @@ namespace Netch.Controllers
} }
} }
private static bool RouteAction(Action action, string address, byte cidr, RouteType routeType, int metric = 0)
{
return RouteAction(action, IPNetwork.Parse(address, cidr), routeType, metric);
}
private static bool RouteAction(Action action, IPNetwork ipNetwork, RouteType routeType, int metric = 0) private static bool RouteAction(Action action, IPNetwork ipNetwork, RouteType routeType, int metric = 0)
{ {
string gateway; string gateway;
int index; int index;
switch (routeType) switch (routeType)
{ {
case RouteType.Gateway: case RouteType.Outbound:
gateway = Global.Outbound.Gateway.ToString(); gateway = Global.Outbound.Gateway.ToString();
index = Global.Outbound.Index; index = Global.Outbound.Index;
break; break;
@@ -401,7 +369,7 @@ namespace Netch.Controllers
if (!result) if (!result)
{ {
Logging.Warning($"{action} Route on {routeType} Adapter failed: {ipNetwork} metric {metric}"); Logging.Warning($"Failed to {action} Route on {routeType} Adapter: {ipNetwork} metric {metric}");
} }
return result; return result;

View File

@@ -15,8 +15,8 @@ namespace Netch.Controllers
public const string Name = @"Netch"; public const string Name = @"Netch";
public const string Copyright = @"Copyright © 2019 - 2020"; public const string Copyright = @"Copyright © 2019 - 2020";
public const string AssemblyVersion = @"1.6.0"; public const string AssemblyVersion = @"1.6.1";
private const string Suffix = @"Beta1"; private const string Suffix = @"";
public static readonly string Version = $"{AssemblyVersion}{(string.IsNullOrEmpty(Suffix) ? "" : $"-{Suffix}")}"; public static readonly string Version = $"{AssemblyVersion}{(string.IsNullOrEmpty(Suffix) ? "" : $"-{Suffix}")}";

View File

@@ -45,7 +45,7 @@
this.UpdateACLToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.UpdateACLToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.updateACLWithProxyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.updateACLWithProxyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.UninstallServiceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.UninstallServiceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.reinstallTapDriverToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.UninstallTapDriverToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.HelpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.HelpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.CheckForUpdatesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.CheckForUpdatesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.fAQToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.fAQToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@@ -193,7 +193,7 @@
this.UpdateACLToolStripMenuItem, this.UpdateACLToolStripMenuItem,
this.updateACLWithProxyToolStripMenuItem, this.updateACLWithProxyToolStripMenuItem,
this.UninstallServiceToolStripMenuItem, this.UninstallServiceToolStripMenuItem,
this.reinstallTapDriverToolStripMenuItem}); this.UninstallTapDriverToolStripMenuItem});
this.OptionsToolStripMenuItem.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1); this.OptionsToolStripMenuItem.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1);
this.OptionsToolStripMenuItem.Name = "OptionsToolStripMenuItem"; this.OptionsToolStripMenuItem.Name = "OptionsToolStripMenuItem";
this.OptionsToolStripMenuItem.Size = new System.Drawing.Size(66, 21); this.OptionsToolStripMenuItem.Size = new System.Drawing.Size(66, 21);
@@ -234,12 +234,12 @@
this.UninstallServiceToolStripMenuItem.Text = "Uninstall NF Service"; this.UninstallServiceToolStripMenuItem.Text = "Uninstall NF Service";
this.UninstallServiceToolStripMenuItem.Click += new System.EventHandler(this.UninstallServiceToolStripMenuItem_Click); this.UninstallServiceToolStripMenuItem.Click += new System.EventHandler(this.UninstallServiceToolStripMenuItem_Click);
// //
// reinstallTapDriverToolStripMenuItem // UninstallTapDriverToolStripMenuItem
// //
this.reinstallTapDriverToolStripMenuItem.Name = "reinstallTapDriverToolStripMenuItem"; this.UninstallTapDriverToolStripMenuItem.Name = "UninstallTapDriverToolStripMenuItem";
this.reinstallTapDriverToolStripMenuItem.Size = new System.Drawing.Size(219, 22); this.UninstallTapDriverToolStripMenuItem.Size = new System.Drawing.Size(219, 22);
this.reinstallTapDriverToolStripMenuItem.Text = "Reinstall TUN/TAP driver"; this.UninstallTapDriverToolStripMenuItem.Text = "Uninstall TUN/TAP driver";
this.reinstallTapDriverToolStripMenuItem.Click += new System.EventHandler(this.reinstallTapDriverToolStripMenuItem_Click); this.UninstallTapDriverToolStripMenuItem.Click += new System.EventHandler(this.reinstallTapDriverToolStripMenuItem_Click);
// //
// HelpToolStripMenuItem // HelpToolStripMenuItem
// //
@@ -735,7 +735,7 @@
private System.Windows.Forms.Label ProfileLabel; private System.Windows.Forms.Label ProfileLabel;
private System.Windows.Forms.TextBox ProfileNameText; private System.Windows.Forms.TextBox ProfileNameText;
private System.Windows.Forms.TableLayoutPanel ProfileTable; private System.Windows.Forms.TableLayoutPanel ProfileTable;
private System.Windows.Forms.ToolStripMenuItem reinstallTapDriverToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem UninstallTapDriverToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem CheckForUpdatesToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem CheckForUpdatesToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem ReloadModesToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem ReloadModesToolStripMenuItem;
private System.Windows.Forms.ComboBox ServerComboBox; private System.Windows.Forms.ComboBox ServerComboBox;

View File

@@ -54,7 +54,7 @@ namespace Netch.Forms
var result = s.Substring(start, end - start); var result = s.Substring(start, end - start);
Hide(); Hide();
Servers.GetUtilByFullName(result).Create(); ServerHelper.GetUtilByFullName(result).Create();
InitServer(); InitServer();
Configuration.Save(); Configuration.Save();
@@ -77,7 +77,7 @@ namespace Netch.Forms
Enabled = false; Enabled = false;
try try
{ {
Modes.Load(); ModeHelper.Load();
InitMode(); InitMode();
NotifyTip(i18N.Translate("Modes have been reload")); NotifyTip(i18N.Translate("Modes have been reload"));
} }
@@ -315,14 +315,14 @@ namespace Netch.Forms
private async void UninstallServiceToolStripMenuItem_Click(object sender, EventArgs e) private async void UninstallServiceToolStripMenuItem_Click(object sender, EventArgs e)
{ {
Enabled = false; Enabled = false;
StatusText(i18N.Translate("Uninstalling NF Service")); StatusText(i18N.TranslateFormat("Uninstalling {0}", "NF Service"));
try try
{ {
await Task.Run(() => await Task.Run(() =>
{ {
if (NFController.UninstallDriver()) if (NFController.UninstallDriver())
{ {
StatusText(i18N.Translate("Service has been uninstalled")); StatusText(i18N.TranslateFormat("{0} has been uninstalled", "NF Service"));
} }
}); });
} }
@@ -334,20 +334,16 @@ namespace Netch.Forms
private async void reinstallTapDriverToolStripMenuItem_Click(object sender, EventArgs e) private async void reinstallTapDriverToolStripMenuItem_Click(object sender, EventArgs e)
{ {
StatusText(i18N.Translate("Reinstalling TUN/TAP driver")); StatusText(i18N.TranslateFormat("Uninstalling {0}", "TUN/TAP driver"));
Enabled = false; Enabled = false;
try try
{ {
await Task.Run(() => await Task.Run(TUNTAP.deltapall);
{ StatusText(i18N.TranslateFormat("{0} has been uninstalled", "TUN/TAP driver"));
TUNTAP.deltapall();
TUNTAP.addtap();
});
StatusText(i18N.Translate("Reinstall TUN/TAP driver successfully"));
} }
catch catch (Exception exception)
{ {
NotifyTip(i18N.Translate("Reinstall TUN/TAP driver failed"), info: false); Logging.Error($"卸载 TUN/TAP 适配器失败: {exception}");
} }
finally finally
{ {

View File

@@ -167,6 +167,9 @@ namespace Netch.Forms
return; return;
} }
// Reset Mode ComboBox Items
ModeComboBox.Text = string.Empty;
try try
{ {
LoadProfile(index); LoadProfile(index);

View File

@@ -157,7 +157,7 @@ namespace Netch.Forms
private void AddAddServerToolStripMenuItems() private void AddAddServerToolStripMenuItems()
{ {
foreach (var serversUtil in Servers.ServerUtils.Where(i => !string.IsNullOrEmpty(i.FullName))) foreach (var serversUtil in ServerHelper.ServerUtils.Where(i => !string.IsNullOrEmpty(i.FullName)))
{ {
var fullName = serversUtil.FullName; var fullName = serversUtil.FullName;
var control = new ToolStripMenuItem var control = new ToolStripMenuItem

View File

@@ -37,7 +37,7 @@ namespace Netch.Forms
UninstallServiceToolStripMenuItem.Enabled = UninstallServiceToolStripMenuItem.Enabled =
updateACLWithProxyToolStripMenuItem.Enabled = updateACLWithProxyToolStripMenuItem.Enabled =
UpdateServersFromSubscribeLinksToolStripMenuItem.Enabled = UpdateServersFromSubscribeLinksToolStripMenuItem.Enabled =
reinstallTapDriverToolStripMenuItem.Enabled = UninstallTapDriverToolStripMenuItem.Enabled =
ReloadModesToolStripMenuItem.Enabled = enabled; ReloadModesToolStripMenuItem.Enabled = enabled;
} }

View File

@@ -41,11 +41,18 @@ namespace Netch.Forms
{ {
AddAddServerToolStripMenuItems(); AddAddServerToolStripMenuItems();
#region i18N Translations
_mainFormText.Add(UninstallServiceToolStripMenuItem.Name, new[] {"Uninstall {0}", "NF Service"});
_mainFormText.Add(UninstallTapDriverToolStripMenuItem.Name, new[] {"Uninstall {0}", "TUN/TAP driver"});
#endregion
OnlyInstance.Called += OnCalled; OnlyInstance.Called += OnCalled;
// 计算 ComboBox绘制 目标宽度 // 计算 ComboBox绘制 目标宽度
_eWidth = ServerComboBox.Width / 10; _eWidth = ServerComboBox.Width / 10;
Modes.Load(); ModeHelper.Load();
InitMode(); InitMode();
InitServer(); InitServer();
_comboBoxInitialized = true; _comboBoxInitialized = true;
@@ -168,6 +175,7 @@ namespace Netch.Forms
{ {
i18N.Load(Global.Settings.Language); i18N.Load(Global.Settings.Language);
InitText(); InitText();
InitMode();
InitProfile(); InitProfile();
} }
@@ -226,11 +234,12 @@ namespace Netch.Forms
case ListControl _: case ListControl _:
break; break;
case Control c: case Control c:
if (_mainFormText.ContainsKey(c.Name))
c.Text = ControlText(c.Name); c.Text = ControlText(c.Name);
break; break;
case ToolStripItem c: case ToolStripItem c:
c.Text = ControlText(c.Name); if (_mainFormText.ContainsKey(c.Name))
c.Text = ControlText(c.Name);
break; break;
} }
@@ -314,7 +323,7 @@ namespace Netch.Forms
Hide(); Hide();
var server = Global.Settings.Server[ServerComboBox.SelectedIndex]; var server = Global.Settings.Server[ServerComboBox.SelectedIndex];
Servers.GetUtilByTypeName(server.Type).Edit(server); ServerHelper.GetUtilByTypeName(server.Type).Edit(server);
InitServer(); InitServer();
Configuration.Save(); Configuration.Save();
Show(); Show();
@@ -372,7 +381,7 @@ namespace Netch.Forms
return; return;
} }
Modes.Delete((Models.Mode) ModeComboBox.SelectedItem); ModeHelper.Delete((Models.Mode) ModeComboBox.SelectedItem);
SelectLastMode(); SelectLastMode();
} }

View File

@@ -207,14 +207,14 @@ namespace Netch.Forms.Mode
_mode.Rule.Clear(); _mode.Rule.Clear();
_mode.Rule.AddRange(RuleListBox.Items.Cast<string>()); _mode.Rule.AddRange(RuleListBox.Items.Cast<string>());
Modes.WriteFile(_mode); ModeHelper.WriteFile(_mode);
Global.MainForm.InitMode(); Global.MainForm.InitMode();
Edited = false; Edited = false;
MessageBoxX.Show(i18N.Translate("Mode updated successfully")); MessageBoxX.Show(i18N.Translate("Mode updated successfully"));
} }
else else
{ {
var fullName = Modes.GetFullPath(FilenameTextBox.Text + ".txt"); var fullName = ModeHelper.GetFullPath(FilenameTextBox.Text + ".txt");
if (File.Exists(fullName)) if (File.Exists(fullName))
{ {
MessageBoxX.Show(i18N.Translate("File already exists.\n Please Change the filename")); MessageBoxX.Show(i18N.Translate("File already exists.\n Please Change the filename"));
@@ -230,8 +230,8 @@ namespace Netch.Forms.Mode
}; };
mode.Rule.AddRange(RuleListBox.Items.Cast<string>()); mode.Rule.AddRange(RuleListBox.Items.Cast<string>());
Modes.WriteFile(mode); ModeHelper.WriteFile(mode);
Modes.Add(mode); ModeHelper.Add(mode);
MessageBoxX.Show(i18N.Translate("Mode added successfully")); MessageBoxX.Show(i18N.Translate("Mode added successfully"));
} }

316
Netch/Forms/ServerForm.cs Normal file
View File

@@ -0,0 +1,316 @@
using System.ComponentModel;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using Netch.Models;
using Netch.Properties;
using Netch.Utils;
namespace Netch.Forms
{
public abstract class ServerForm : Form
{
protected abstract string TypeName { get; }
protected Server Server { get; set; }
private int _controlLines = 2;
private const int ControlLineHeight = 28;
private const int InputBoxWidth = 294;
protected ServerForm()
{
InitializeComponent();
_checkActions.Add(RemarkTextBox, s => true);
_saveActions.Add(RemarkTextBox, s => Server.Remark = (string) s);
_checkActions.Add(AddressTextBox, s => s != string.Empty);
_saveActions.Add(AddressTextBox, s => Server.Hostname = (string) s);
_checkActions.Add(PortTextBox, s => ushort.TryParse(s, out var port) && port != 0);
_saveActions.Add(PortTextBox, s => Server.Port = ushort.Parse((string) s));
}
public new void ShowDialog()
{
AfterFactor();
base.ShowDialog();
}
public new void Show()
{
AfterFactor();
base.Show();
}
private void AfterFactor()
{
Text = TypeName ?? string.Empty;
RemarkTextBox.Text = Server.Remark;
AddressTextBox.Text = Server.Hostname;
PortTextBox.Text = Server.Port.ToString();
AddSaveButton();
i18N.TranslateForm(this);
ConfigurationGroupBox.ResumeLayout(false);
ConfigurationGroupBox.PerformLayout();
ResumeLayout(false);
PerformLayout();
}
protected void CreateTextBox(string name, string remark, Func<string, bool> check, Action<string> save, string value, int width = InputBoxWidth)
{
_controlLines++;
var textBox = new TextBox
{
Location = new Point(120, ControlLineHeight * _controlLines),
Name = $"{name}TextBox",
Size = new Size(width, 23),
TextAlign = HorizontalAlignment.Center,
Text = value
};
_checkActions.Add(textBox, check);
_saveActions.Add(textBox, o => save.Invoke((string) o));
ConfigurationGroupBox.Controls.AddRange(
new Control[]
{
textBox,
new Label
{
AutoSize = true,
Location = new Point(10, ControlLineHeight * _controlLines),
Name = $"{name}Label",
Size = new Size(56, 17),
Text = remark
}
}
);
}
protected void CreateComboBox(string name, string remark, List<string> values, Action<string> save, string value, int width = InputBoxWidth)
{
_controlLines++;
var comboBox = new ComboBox
{
Location = new Point(120, ControlLineHeight * _controlLines),
Name = $"{name}ComboBox",
Size = new Size(width, 23),
DrawMode = DrawMode.OwnerDrawFixed,
DropDownStyle = ComboBoxStyle.DropDownList,
FormattingEnabled = true
};
comboBox.Items.AddRange(values.ToArray());
comboBox.SelectedIndex = values.IndexOf(value);
comboBox.DrawItem += Utils.Utils.DrawCenterComboBox;
_saveActions.Add(comboBox, o => save.Invoke((string) o));
ConfigurationGroupBox.Controls.AddRange(
new Control[]
{
comboBox,
new Label
{
AutoSize = true,
Location = new Point(10, ControlLineHeight * _controlLines),
Name = $"{name}Label",
Size = new Size(56, 17),
Text = remark
}
}
);
}
protected void CreateCheckBox(string name, string remark, Action<bool> save, bool value)
{
_controlLines++;
var checkBox = new CheckBox
{
AutoSize = true,
Location = new Point(120, ControlLineHeight * _controlLines),
Name = $"{name}CheckBox",
Checked = value,
Text = remark
};
_saveActions.Add(checkBox, o => save.Invoke((bool) o));
ConfigurationGroupBox.Controls.AddRange(
new Control[]
{
checkBox
}
);
}
private readonly Dictionary<Control, Func<string, bool>> _checkActions = new Dictionary<Control, Func<string, bool>>();
private readonly Dictionary<Control, Action<object>> _saveActions = new Dictionary<Control, Action<object>>();
private void AddSaveButton()
{
_controlLines++;
var control = new Button
{
Location = new Point(340, _controlLines * ControlLineHeight + 10),
Name = "ControlButton",
Size = new Size(75, 23),
Text = "Save",
UseVisualStyleBackColor = true
};
control.Click += ControlButton_Click;
ConfigurationGroupBox.Controls.Add(control);
}
private void ControlButton_Click(object sender, EventArgs e)
{
if (_checkActions.All(pair => pair.Value.Invoke(pair.Key.Text)))
{
foreach (var pair in _saveActions)
{
switch (pair.Key)
{
case CheckBox c:
pair.Value.Invoke(c.Checked);
break;
default:
pair.Value.Invoke(pair.Key.Text);
break;
}
}
if (Global.Settings.Server.IndexOf(Server) == -1)
Global.Settings.Server.Add(Server);
MessageBoxX.Show(i18N.Translate("Saved"));
}
else
return;
Close();
}
private IContainer components = null;
protected override void Dispose(bool disposing)
{
if (disposing)
{
components?.Dispose();
}
base.Dispose(disposing);
}
private void InitializeComponent()
{
ConfigurationGroupBox = new GroupBox();
AddressLabel = new Label();
PortTextBox = new TextBox();
AddressTextBox = new TextBox();
RemarkTextBox = new TextBox();
RemarkLabel = new Label();
PortLabel = new Label();
ConfigurationGroupBox.SuspendLayout();
SuspendLayout();
//
// ConfigurationGroupBox
//
ConfigurationGroupBox.AutoSize = true;
ConfigurationGroupBox.AutoSizeMode = AutoSizeMode.GrowAndShrink;
ConfigurationGroupBox.Controls.Add(AddressLabel);
ConfigurationGroupBox.Controls.Add(PortTextBox);
ConfigurationGroupBox.Controls.Add(AddressTextBox);
ConfigurationGroupBox.Controls.Add(RemarkTextBox);
ConfigurationGroupBox.Controls.Add(RemarkLabel);
ConfigurationGroupBox.Controls.Add(PortLabel);
ConfigurationGroupBox.Dock = DockStyle.Fill;
ConfigurationGroupBox.Location = new Point(5, 5);
ConfigurationGroupBox.Name = "ConfigurationGroupBox";
ConfigurationGroupBox.Size = new Size(434, 127);
ConfigurationGroupBox.TabIndex = 0;
ConfigurationGroupBox.TabStop = false;
ConfigurationGroupBox.Text = "Configuration";
//
// AddressLabel
//
AddressLabel.AutoSize = true;
AddressLabel.Location = new Point(10, ControlLineHeight * 2);
AddressLabel.Name = "AddressLabel";
AddressLabel.Size = new Size(56, 17);
AddressLabel.TabIndex = 2;
AddressLabel.Text = "Address";
//
// PortTextBox
//
PortTextBox.Location = new Point(358, ControlLineHeight * 2);
PortTextBox.Name = "PortTextBox";
PortTextBox.Size = new Size(56, 23);
PortTextBox.TabIndex = 5;
PortTextBox.TextAlign = HorizontalAlignment.Center;
//
// AddressTextBox
//
AddressTextBox.Location = new Point(120, ControlLineHeight * 2);
AddressTextBox.Name = "AddressTextBox";
AddressTextBox.Size = new Size(232, 23);
AddressTextBox.TabIndex = 3;
AddressTextBox.TextAlign = HorizontalAlignment.Center;
//
// RemarkTextBox
//
RemarkTextBox.Location = new Point(120, ControlLineHeight);
RemarkTextBox.Name = "RemarkTextBox";
RemarkTextBox.Size = new Size(294, 23);
RemarkTextBox.TabIndex = 1;
RemarkTextBox.TextAlign = HorizontalAlignment.Center;
//
// RemarkLabel
//
RemarkLabel.AutoSize = true;
RemarkLabel.Location = new Point(10, ControlLineHeight);
RemarkLabel.Name = "RemarkLabel";
RemarkLabel.Size = new Size(53, 17);
RemarkLabel.TabIndex = 0;
RemarkLabel.Text = "Remark";
//
// PortLabel
//
PortLabel.AutoSize = true;
PortLabel.Location = new Point(351, ControlLineHeight * 2);
PortLabel.Name = "PortLabel";
PortLabel.Size = new Size(11, 17);
PortLabel.TabIndex = 4;
PortLabel.Text = ":";
//
// ServerForm
//
AutoScaleDimensions = new SizeF(96F, 96F);
AutoScaleMode = AutoScaleMode.Dpi;
AutoSize = true;
AutoSizeMode = AutoSizeMode.GrowAndShrink;
ClientSize = new Size(444, 137);
Controls.Add(ConfigurationGroupBox);
Font = new Font("微软雅黑", 9F, FontStyle.Regular, GraphicsUnit.Point, (byte) 134);
FormBorderStyle = FormBorderStyle.FixedSingle;
Icon = Icon.FromHandle(Resources.Netch.GetHicon());
Margin = new Padding(3, 4, 3, 4);
MaximizeBox = false;
Name = "ServerForm";
Padding = new Padding(11, 5, 11, 4);
StartPosition = FormStartPosition.CenterScreen;
}
private GroupBox ConfigurationGroupBox;
private Label RemarkLabel;
protected TextBox RemarkTextBox;
private Label PortLabel;
protected TextBox AddressTextBox;
private TextBox PortTextBox;
private Label AddressLabel;
}
}

View File

@@ -206,7 +206,8 @@
this.ICSCheckBox.Name = "ICSCheckBox"; this.ICSCheckBox.Name = "ICSCheckBox";
this.ICSCheckBox.Size = new System.Drawing.Size(46, 21); this.ICSCheckBox.Size = new System.Drawing.Size(46, 21);
this.ICSCheckBox.TabIndex = 5; this.ICSCheckBox.TabIndex = 5;
this.ICSCheckBox.Text = "ICS"; this.ICSCheckBox.Text = "Tap Network Sharing";
this.ICSCheckBox.Enabled = false;
this.ICSCheckBox.TextAlign = System.Drawing.ContentAlignment.MiddleRight; this.ICSCheckBox.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
this.ICSCheckBox.UseVisualStyleBackColor = true; this.ICSCheckBox.UseVisualStyleBackColor = true;
this.ICSCheckBox.CheckedChanged += new System.EventHandler(this.ICSCheckBox_CheckedChanged); this.ICSCheckBox.CheckedChanged += new System.EventHandler(this.ICSCheckBox_CheckedChanged);

View File

@@ -38,7 +38,12 @@ namespace Netch.Forms
TUNTAPUseCustomDNSCheckBox_CheckedChanged(null, null); TUNTAPUseCustomDNSCheckBox_CheckedChanged(null, null);
ProxyDNSCheckBox.Checked = Global.Settings.TUNTAP.ProxyDNS; ProxyDNSCheckBox.Checked = Global.Settings.TUNTAP.ProxyDNS;
UseFakeDNSCheckBox.Checked = Global.Settings.TUNTAP.UseFakeDNS; UseFakeDNSCheckBox.Checked = Global.Settings.TUNTAP.UseFakeDNS;
ICSCheckBox.Checked = ICSController.Enabled;
if (TUNTAPController.SearchTapAdapter())
{
ICSCheckBox.Enabled = true;
ICSCheckBox.Checked = ICSHelper.Enabled;
}
// Behavior // Behavior
ExitWhenClosedCheckBox.Checked = Global.Settings.ExitWhenClosed; ExitWhenClosedCheckBox.Checked = Global.Settings.ExitWhenClosed;
@@ -387,12 +392,12 @@ namespace Netch.Forms
{ {
if (ICSCheckBox.Checked) if (ICSCheckBox.Checked)
{ {
if (!ICSController.Enabled) if (!ICSHelper.Enabled)
ICSCheckBox.Checked = ICSController.Enable(); ICSCheckBox.Checked = ICSHelper.Enable();
} }
else else
{ {
ICSController.Disable(); ICSHelper.Disable();
} }
}); });
ICSCheckBox.Enabled = true; ICSCheckBox.Enabled = true;

View File

@@ -105,7 +105,7 @@ namespace Netch.Forms
if (!LinkTextBox.Text.StartsWith("HTTP://", StringComparison.OrdinalIgnoreCase) && !LinkTextBox.Text.StartsWith("HTTPS://", StringComparison.OrdinalIgnoreCase)) if (!LinkTextBox.Text.StartsWith("HTTP://", StringComparison.OrdinalIgnoreCase) && !LinkTextBox.Text.StartsWith("HTTPS://", StringComparison.OrdinalIgnoreCase))
{ {
MessageBoxX.Show(i18N.Translate("Links must start with http:// or https://")); MessageBoxX.Show(i18N.Translate("Link must start with http:// or https://"));
return; return;
} }

View File

@@ -28,17 +28,10 @@ namespace Netch
public static class Flags public static class Flags
{ {
static Flags() public static bool SupportFakeDns => _supportFakeDns ??= new TUNTAPController().TestFakeDNS();
{ public static readonly bool IsWindows10Upper = Environment.OSVersion.Version.Major >= 10;
Task.Run(() =>
{
SupportFakeDns = new TUNTAPController().TestFakeDNS();
IsWindows10Upper = Environment.OSVersion.Version.Major >= 10;
});
}
public static bool SupportFakeDns; private static bool? _supportFakeDns;
public static bool IsWindows10Upper;
} }
/// <summary> /// <summary>

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using Netch.Controllers;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
namespace Netch.Models namespace Netch.Models
@@ -20,6 +21,8 @@ namespace Netch.Models
/// </summary> /// </summary>
string FullName { get; } string FullName { get; }
string ShortName { get; }
/// <summary> /// <summary>
/// Support URI /// Support URI
/// </summary> /// </summary>
@@ -33,7 +36,7 @@ namespace Netch.Models
string GetShareLink(Server server); string GetShareLink(Server server);
public abstract ServerController GetController(); public abstract IServerController GetController();
public abstract IEnumerable<Server> ParseUri(string text); public abstract IEnumerable<Server> ParseUri(string text);

View File

@@ -1,5 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Netch.Utils;
namespace Netch.Models namespace Netch.Models
{ {
@@ -47,7 +48,7 @@ namespace Netch.Models
/// <returns>备注</returns> /// <returns>备注</returns>
public override string ToString() public override string ToString()
{ {
return $"[{Type + 1}] {Remark}"; return $"[{Type + 1}] {i18N.Translate(Remark)}";
} }
/// <summary> /// <summary>

View File

@@ -41,11 +41,6 @@ namespace Netch.Models
/// </summary> /// </summary>
public int Delay = -1; public int Delay = -1;
/// <summary>
/// 地区
/// </summary>
public string Country;
public bool IsSocks5() => Type == "Socks5"; public bool IsSocks5() => Type == "Socks5";
/// <summary> /// <summary>
@@ -59,28 +54,9 @@ namespace Netch.Models
Remark = $"{Hostname}:{Port}"; Remark = $"{Hostname}:{Port}";
} }
if (Country == null)
{
Country = Utils.Utils.GetCityCode(Hostname);
}
Group = Group.Equals("None") || Group.Equals("") ? "NONE" : Group; Group = Group.Equals("None") || Group.Equals("") ? "NONE" : Group;
switch (Type) return $"[{ServerHelper.GetUtilByTypeName(Type)?.ShortName ?? "WTF"}][{Group}] {Remark}";
{
case "Socks5":
return $"[S5][{Country}][{Group}] {Remark}";
case "SS":
return $"[SS][{Country}][{Group}] {Remark}";
case "SSR":
return $"[SR][{Country}][{Group}] {Remark}";
case "VMess":
return $"[V2][{Country}][{Group}] {Remark}";
case "Trojan":
return $"[TR][{Country}][{Group}] {Remark}";
default:
return "WTF";
}
} }
/// <summary> /// <summary>

View File

@@ -1,32 +0,0 @@
using Netch.Controllers;
namespace Netch.Models
{
public abstract class ServerController : Controller
{
private int? _socks5Port;
public int Socks5LocalPort
{
get => _socks5Port ?? Global.Settings.Socks5LocalPort;
set => _socks5Port = value;
}
private string _localAddress;
public string LocalAddress
{
get => _localAddress ?? Global.Settings.LocalAddress;
set => _localAddress = value;
}
/// <summary>
/// 启动
/// </summary>
/// <param name="server">服务器</param>
/// <param name="mode">模式</param>
/// <returns>是否启动成功</returns>
public abstract bool Start(Server server, Mode mode);
}
}

View File

@@ -1,7 +1,7 @@
using System; using System;
using NETCONLib; using NETCONLib;
namespace WinFW namespace Netch.Models.WinFW
{ {
public class NetworkConnection : INetConnection, INetConnectionProps, INetSharingConfiguration public class NetworkConnection : INetConnection, INetConnectionProps, INetSharingConfiguration
{ {

View File

@@ -1,8 +1,8 @@
using System.Collections; using System.Collections;
using System.Linq; using System.Linq;
using NETCONLib; using NETCONLib;
namespace WinFW namespace Netch.Models.WinFW
{ {
/// <summary> /// <summary>
/// A collection that stores 'NetworkConnection' objects. /// A collection that stores 'NetworkConnection' objects.

View File

@@ -11,18 +11,12 @@
"Stop": "停止", "Stop": "停止",
"Waiting for command": "等待命令中", "Waiting for command": "等待命令中",
"Starting": "正在启动中", "Starting": "正在启动中",
"Start failed": "启动失败请打开软件目录logging文件夹查看日志", "Start failed": "启动失败",
"Started": "已启动", "Started": "已启动",
"Stopping": "正在停止中", "Stopping": "正在停止中",
"Stopped": "已停止", "Stopped": "已停止",
"Starting ": "正在启动 ", "Starting {0}": "正在启动 {0}",
"Starting Tap": "正在启动 TUN/TAP",
"Starting NatTester": "正在启动 NAT 测试", "Starting NatTester": "正在启动 NAT 测试",
"Starting LocalDns service": "正在启动本地 DNS 服务",
"Starting Redirector": "正在启动 Redirector",
"Restarting Redirector": "正常启动失败,正在尝试重新启动 Redirector",
"Starting netfilter2 Service": "正在启动 netfilter2 服务",
"Starting dns Service": "正在启动 DNS 服务",
"SetupBypass": "设置绕行规则", "SetupBypass": "设置绕行规则",
"Test failed": "测试失败", "Test failed": "测试失败",
"Starting update subscription": "正在更新订阅", "Starting update subscription": "正在更新订阅",
@@ -78,9 +72,11 @@
"Update servers error from {0}": "从 {0} 更新服务器失败", "Update servers error from {0}": "从 {0} 更新服务器失败",
"Options": "选项", "Options": "选项",
"Uninstall NF Service": "卸载 NF 服务", "NF Service": "NF 服务",
"Uninstalling NF Service": "正在卸载 NF 服务中", "TUN/TAP driver": "TUN/TAP 驱动",
"Service has been uninstalled": "服务已卸载", "Uninstall {0}": "卸载 {0}",
"Uninstalling {0}": "正在卸载 {0} 中",
"{0} has been uninstalled": "{0} 已卸载",
"Reload Modes": "重载模式", "Reload Modes": "重载模式",
"Modes have been reload": "模式已重载", "Modes have been reload": "模式已重载",
"Clean DNS Cache": "清理 DNS 缓存", "Clean DNS Cache": "清理 DNS 缓存",
@@ -89,10 +85,6 @@
"Update ACL with proxy": "使用代理更新 ACL 规则", "Update ACL with proxy": "使用代理更新 ACL 规则",
"ACL updated successfully": "ACL 更新成功", "ACL updated successfully": "ACL 更新成功",
"ACL update failed": "ACL 更新失败", "ACL update failed": "ACL 更新失败",
"Reinstall TUN/TAP driver": "重新安装 TUN/TAP 驱动",
"Reinstall TUN/TAP driver successfully": "重装 TUN/TAP 驱动成功",
"Reinstall TUN/TAP driver failed": "重装 TUN/TAP 驱动失败",
"Reinstalling TUN/TAP driver": "正在重装 TUN/TAP 驱动",
"Open Directory": "打开目录", "Open Directory": "打开目录",
"About": "关于", "About": "关于",
@@ -118,8 +110,6 @@
"Remark": "备注", "Remark": "备注",
"Filename": "文件名", "Filename": "文件名",
"Use Custom Filename": "使用自定义文件名", "Use Custom Filename": "使用自定义文件名",
"Stay the same": "保持一致",
"Time data": "时间数据",
"Add": "添加", "Add": "添加",
"Scan": "扫描", "Scan": "扫描",
"Save": "保存", "Save": "保存",
@@ -178,6 +168,7 @@
"STUN Server Port": "STUN 服务器端口", "STUN Server Port": "STUN 服务器端口",
"Custom ACL": "自定义 ACL 规则", "Custom ACL": "自定义 ACL 规则",
"Language": "语言", "Language": "语言",
"Tap Network Sharing": "Tap 网络共享",
"Profile": "配置名", "Profile": "配置名",
"Profiles": "配置", "Profiles": "配置",
@@ -189,10 +180,10 @@
"The {0} port is in use.": "{0} 端口已被占用", "The {0} port is in use.": "{0} 端口已被占用",
"Bypass LAN": "[网页代理] 绕过局域网", "[Web Proxy] Bypass LAN": "[网页代理] 绕过局域网",
"Bypass LAN (Non System Proxy)": "[网页代理] 绕过局域网(不设置系统代理)", "[Non Web Proxy] Bypass LAN": "[不设置代理] 绕过局域网",
"Bypass LAN (TUN/TAP)": "[TUN/TAP] 绕过局域网", "[TUN/TAP] Bypass LAN": "[TUN/TAP] 绕过局域网",
"Bypass LAN and China": "[网页代理] 绕过局域网和中国大陆", "[Web Proxy] Bypass LAN and China": "[网页代理] 绕过局域网和中国大陆",
"Bypass LAN and China (Non System Proxy)": "[网页代理] 绕过局域网和中国大陆 (不设置系统代理)", "[Non Web Proxy] Bypass LAN and China": "[不设置代理] 绕过局域网和中国大陆",
"Bypass LAN and China (TUN/TAP)": "[TUN/TAP] 绕过局域网和中国大陆" "[TUN/TAP] Bypass LAN and China": "[TUN/TAP] 绕过局域网和中国大陆"
} }

View File

@@ -1,247 +0,0 @@
namespace Netch.ServerEx.Shadowsocks.Form
{
partial class ShadowsocksForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ShadowsocksForm));
this.ConfigurationGroupBox = new System.Windows.Forms.GroupBox();
this.PluginOptionsTextBox = new System.Windows.Forms.TextBox();
this.PluginOptionsLabel = new System.Windows.Forms.Label();
this.PluginTextBox = new System.Windows.Forms.TextBox();
this.PluginLabel = new System.Windows.Forms.Label();
this.EncryptMethodLabel = new System.Windows.Forms.Label();
this.EncryptMethodComboBox = new System.Windows.Forms.ComboBox();
this.PasswordTextBox = new System.Windows.Forms.TextBox();
this.PasswordLabel = new System.Windows.Forms.Label();
this.AddressLabel = new System.Windows.Forms.Label();
this.PortTextBox = new System.Windows.Forms.TextBox();
this.AddressTextBox = new System.Windows.Forms.TextBox();
this.RemarkTextBox = new System.Windows.Forms.TextBox();
this.RemarkLabel = new System.Windows.Forms.Label();
this.PortLabel = new System.Windows.Forms.Label();
this.ControlButton = new System.Windows.Forms.Button();
this.ConfigurationGroupBox.SuspendLayout();
this.SuspendLayout();
//
// ConfigurationGroupBox
//
this.ConfigurationGroupBox.Controls.Add(this.PluginOptionsTextBox);
this.ConfigurationGroupBox.Controls.Add(this.PluginOptionsLabel);
this.ConfigurationGroupBox.Controls.Add(this.PluginTextBox);
this.ConfigurationGroupBox.Controls.Add(this.PluginLabel);
this.ConfigurationGroupBox.Controls.Add(this.EncryptMethodLabel);
this.ConfigurationGroupBox.Controls.Add(this.EncryptMethodComboBox);
this.ConfigurationGroupBox.Controls.Add(this.PasswordTextBox);
this.ConfigurationGroupBox.Controls.Add(this.PasswordLabel);
this.ConfigurationGroupBox.Controls.Add(this.AddressLabel);
this.ConfigurationGroupBox.Controls.Add(this.PortTextBox);
this.ConfigurationGroupBox.Controls.Add(this.AddressTextBox);
this.ConfigurationGroupBox.Controls.Add(this.RemarkTextBox);
this.ConfigurationGroupBox.Controls.Add(this.RemarkLabel);
this.ConfigurationGroupBox.Controls.Add(this.PortLabel);
this.ConfigurationGroupBox.Location = new System.Drawing.Point(12, 12);
this.ConfigurationGroupBox.Name = "ConfigurationGroupBox";
this.ConfigurationGroupBox.Size = new System.Drawing.Size(420, 197);
this.ConfigurationGroupBox.TabIndex = 0;
this.ConfigurationGroupBox.TabStop = false;
this.ConfigurationGroupBox.Text = "Configuration";
//
// PluginOptionsTextBox
//
this.PluginOptionsTextBox.Location = new System.Drawing.Point(120, 166);
this.PluginOptionsTextBox.Name = "PluginOptionsTextBox";
this.PluginOptionsTextBox.Size = new System.Drawing.Size(294, 23);
this.PluginOptionsTextBox.TabIndex = 13;
this.PluginOptionsTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// PluginOptionsLabel
//
this.PluginOptionsLabel.AutoSize = true;
this.PluginOptionsLabel.Location = new System.Drawing.Point(10, 169);
this.PluginOptionsLabel.Name = "PluginOptionsLabel";
this.PluginOptionsLabel.Size = new System.Drawing.Size(93, 17);
this.PluginOptionsLabel.TabIndex = 12;
this.PluginOptionsLabel.Text = "Plugin Options";
//
// PluginTextBox
//
this.PluginTextBox.Location = new System.Drawing.Point(120, 137);
this.PluginTextBox.Name = "PluginTextBox";
this.PluginTextBox.Size = new System.Drawing.Size(294, 23);
this.PluginTextBox.TabIndex = 11;
this.PluginTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// PluginLabel
//
this.PluginLabel.AutoSize = true;
this.PluginLabel.Location = new System.Drawing.Point(10, 140);
this.PluginLabel.Name = "PluginLabel";
this.PluginLabel.Size = new System.Drawing.Size(43, 17);
this.PluginLabel.TabIndex = 10;
this.PluginLabel.Text = "Plugin";
//
// EncryptMethodLabel
//
this.EncryptMethodLabel.AutoSize = true;
this.EncryptMethodLabel.Location = new System.Drawing.Point(10, 110);
this.EncryptMethodLabel.Name = "EncryptMethodLabel";
this.EncryptMethodLabel.Size = new System.Drawing.Size(101, 17);
this.EncryptMethodLabel.TabIndex = 8;
this.EncryptMethodLabel.Text = "Encrypt Method";
//
// EncryptMethodComboBox
//
this.EncryptMethodComboBox.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
this.EncryptMethodComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.EncryptMethodComboBox.FormattingEnabled = true;
this.EncryptMethodComboBox.Location = new System.Drawing.Point(120, 106);
this.EncryptMethodComboBox.Name = "EncryptMethodComboBox";
this.EncryptMethodComboBox.Size = new System.Drawing.Size(294, 24);
this.EncryptMethodComboBox.TabIndex = 9;
this.EncryptMethodComboBox.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.ComboBox_DrawItem);
//
// PasswordTextBox
//
this.PasswordTextBox.Location = new System.Drawing.Point(120, 77);
this.PasswordTextBox.Name = "PasswordTextBox";
this.PasswordTextBox.Size = new System.Drawing.Size(294, 23);
this.PasswordTextBox.TabIndex = 7;
this.PasswordTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// PasswordLabel
//
this.PasswordLabel.AutoSize = true;
this.PasswordLabel.Location = new System.Drawing.Point(10, 80);
this.PasswordLabel.Name = "PasswordLabel";
this.PasswordLabel.Size = new System.Drawing.Size(64, 17);
this.PasswordLabel.TabIndex = 6;
this.PasswordLabel.Text = "Password";
//
// AddressLabel
//
this.AddressLabel.AutoSize = true;
this.AddressLabel.Location = new System.Drawing.Point(10, 51);
this.AddressLabel.Name = "AddressLabel";
this.AddressLabel.Size = new System.Drawing.Size(56, 17);
this.AddressLabel.TabIndex = 2;
this.AddressLabel.Text = "Address";
//
// PortTextBox
//
this.PortTextBox.Location = new System.Drawing.Point(358, 48);
this.PortTextBox.Name = "PortTextBox";
this.PortTextBox.Size = new System.Drawing.Size(56, 23);
this.PortTextBox.TabIndex = 5;
this.PortTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// AddressTextBox
//
this.AddressTextBox.Location = new System.Drawing.Point(120, 48);
this.AddressTextBox.Name = "AddressTextBox";
this.AddressTextBox.Size = new System.Drawing.Size(232, 23);
this.AddressTextBox.TabIndex = 3;
this.AddressTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// RemarkTextBox
//
this.RemarkTextBox.Location = new System.Drawing.Point(120, 19);
this.RemarkTextBox.Name = "RemarkTextBox";
this.RemarkTextBox.Size = new System.Drawing.Size(294, 23);
this.RemarkTextBox.TabIndex = 1;
this.RemarkTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// RemarkLabel
//
this.RemarkLabel.AutoSize = true;
this.RemarkLabel.Location = new System.Drawing.Point(10, 22);
this.RemarkLabel.Name = "RemarkLabel";
this.RemarkLabel.Size = new System.Drawing.Size(53, 17);
this.RemarkLabel.TabIndex = 0;
this.RemarkLabel.Text = "Remark";
//
// PortLabel
//
this.PortLabel.AutoSize = true;
this.PortLabel.Location = new System.Drawing.Point(351, 51);
this.PortLabel.Name = "PortLabel";
this.PortLabel.Size = new System.Drawing.Size(11, 17);
this.PortLabel.TabIndex = 4;
this.PortLabel.Text = ":";
//
// ControlButton
//
this.ControlButton.Location = new System.Drawing.Point(357, 215);
this.ControlButton.Name = "ControlButton";
this.ControlButton.Size = new System.Drawing.Size(75, 23);
this.ControlButton.TabIndex = 1;
this.ControlButton.Text = "Save";
this.ControlButton.UseVisualStyleBackColor = true;
this.ControlButton.Click += new System.EventHandler(this.ControlButton_Click);
//
// Shadowsocks
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.ClientSize = new System.Drawing.Size(444, 248);
this.Controls.Add(this.ControlButton);
this.Controls.Add(this.ConfigurationGroupBox);
this.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.MaximizeBox = false;
this.Name = "ShadowsocksForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Shadowsocks";
this.Load += new System.EventHandler(this.Shadowsocks_Load);
this.ConfigurationGroupBox.ResumeLayout(false);
this.ConfigurationGroupBox.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.GroupBox ConfigurationGroupBox;
private System.Windows.Forms.Button ControlButton;
private System.Windows.Forms.Label RemarkLabel;
private System.Windows.Forms.TextBox RemarkTextBox;
private System.Windows.Forms.Label PortLabel;
private System.Windows.Forms.TextBox AddressTextBox;
private System.Windows.Forms.TextBox PortTextBox;
private System.Windows.Forms.Label AddressLabel;
private System.Windows.Forms.Label EncryptMethodLabel;
private System.Windows.Forms.ComboBox EncryptMethodComboBox;
private System.Windows.Forms.TextBox PasswordTextBox;
private System.Windows.Forms.Label PasswordLabel;
private System.Windows.Forms.TextBox PluginOptionsTextBox;
private System.Windows.Forms.Label PluginOptionsLabel;
private System.Windows.Forms.TextBox PluginTextBox;
private System.Windows.Forms.Label PluginLabel;
}
}

View File

@@ -1,59 +0,0 @@
using System;
using System.Windows.Forms;
using Netch.Utils;
namespace Netch.ServerEx.Shadowsocks.Form
{
public partial class ShadowsocksForm : System.Windows.Forms.Form
{
private readonly Shadowsocks _server;
public ShadowsocksForm(Shadowsocks server = default)
{
InitializeComponent();
_server = server ?? new Shadowsocks();
}
private void Shadowsocks_Load(object sender, EventArgs e)
{
i18N.TranslateForm(this);
EncryptMethodComboBox.Items.AddRange(SSGlobal.EncryptMethods.ToArray());
RemarkTextBox.Text = _server.Remark;
AddressTextBox.Text = _server.Hostname;
PortTextBox.Text = _server.Port.ToString();
PasswordTextBox.Text = _server.Password;
EncryptMethodComboBox.SelectedIndex = SSGlobal.EncryptMethods.IndexOf(_server.EncryptMethod);
PluginTextBox.Text = _server.Plugin;
PluginOptionsTextBox.Text = _server.PluginOption;
}
private void ComboBox_DrawItem(object sender, DrawItemEventArgs e)
{
Utils.Utils.DrawCenterComboBox(sender, e);
}
private void ControlButton_Click(object sender, EventArgs e)
{
if (!ushort.TryParse(PortTextBox.Text, out var port)) return;
_server.Remark = RemarkTextBox.Text;
_server.Type = "SS";
_server.Hostname = AddressTextBox.Text;
_server.Port = port;
_server.Password = PasswordTextBox.Text;
_server.EncryptMethod = EncryptMethodComboBox.Text;
_server.Plugin = PluginTextBox.Text;
_server.PluginOption = PluginOptionsTextBox.Text;
_server.Country = null;
if (Global.Settings.Server.IndexOf(_server) == -1)
Global.Settings.Server.Add(_server);
MessageBoxX.Show(i18N.Translate("Saved"));
Close();
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,299 +0,0 @@
namespace Netch.ServerEx.ShadowsocksR.Form
{
partial class ShadowsocksRForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ShadowsocksRForm));
this.ConfigurationGroupBox = new System.Windows.Forms.GroupBox();
this.OBFSParamLabel = new System.Windows.Forms.Label();
this.OBFSOptionParamTextBox = new System.Windows.Forms.TextBox();
this.OBFSLabel = new System.Windows.Forms.Label();
this.OBFSComboBox = new System.Windows.Forms.ComboBox();
this.ProtocolParamLabel = new System.Windows.Forms.Label();
this.ProtocolParamTextBox = new System.Windows.Forms.TextBox();
this.ProtocolLabel = new System.Windows.Forms.Label();
this.ProtocolComboBox = new System.Windows.Forms.ComboBox();
this.EncryptMethodLabel = new System.Windows.Forms.Label();
this.EncryptMethodComboBox = new System.Windows.Forms.ComboBox();
this.PasswordTextBox = new System.Windows.Forms.TextBox();
this.PasswordLabel = new System.Windows.Forms.Label();
this.AddressLabel = new System.Windows.Forms.Label();
this.PortTextBox = new System.Windows.Forms.TextBox();
this.AddressTextBox = new System.Windows.Forms.TextBox();
this.RemarkTextBox = new System.Windows.Forms.TextBox();
this.RemarkLabel = new System.Windows.Forms.Label();
this.PortLabel = new System.Windows.Forms.Label();
this.ControlButton = new System.Windows.Forms.Button();
this.ConfigurationGroupBox.SuspendLayout();
this.SuspendLayout();
//
// ConfigurationGroupBox
//
this.ConfigurationGroupBox.Controls.Add(this.OBFSParamLabel);
this.ConfigurationGroupBox.Controls.Add(this.OBFSOptionParamTextBox);
this.ConfigurationGroupBox.Controls.Add(this.OBFSLabel);
this.ConfigurationGroupBox.Controls.Add(this.OBFSComboBox);
this.ConfigurationGroupBox.Controls.Add(this.ProtocolParamLabel);
this.ConfigurationGroupBox.Controls.Add(this.ProtocolParamTextBox);
this.ConfigurationGroupBox.Controls.Add(this.ProtocolLabel);
this.ConfigurationGroupBox.Controls.Add(this.ProtocolComboBox);
this.ConfigurationGroupBox.Controls.Add(this.EncryptMethodLabel);
this.ConfigurationGroupBox.Controls.Add(this.EncryptMethodComboBox);
this.ConfigurationGroupBox.Controls.Add(this.PasswordTextBox);
this.ConfigurationGroupBox.Controls.Add(this.PasswordLabel);
this.ConfigurationGroupBox.Controls.Add(this.AddressLabel);
this.ConfigurationGroupBox.Controls.Add(this.PortTextBox);
this.ConfigurationGroupBox.Controls.Add(this.AddressTextBox);
this.ConfigurationGroupBox.Controls.Add(this.RemarkTextBox);
this.ConfigurationGroupBox.Controls.Add(this.RemarkLabel);
this.ConfigurationGroupBox.Controls.Add(this.PortLabel);
this.ConfigurationGroupBox.Location = new System.Drawing.Point(12, 12);
this.ConfigurationGroupBox.Name = "ConfigurationGroupBox";
this.ConfigurationGroupBox.Size = new System.Drawing.Size(420, 258);
this.ConfigurationGroupBox.TabIndex = 0;
this.ConfigurationGroupBox.TabStop = false;
this.ConfigurationGroupBox.Text = "Configuration";
//
// OBFSParamLabel
//
this.OBFSParamLabel.AutoSize = true;
this.OBFSParamLabel.Location = new System.Drawing.Point(10, 230);
this.OBFSParamLabel.Name = "OBFSParamLabel";
this.OBFSParamLabel.Size = new System.Drawing.Size(80, 17);
this.OBFSParamLabel.TabIndex = 16;
this.OBFSParamLabel.Text = "OBFS Param";
//
// OBFSParamTextBox
//
this.OBFSOptionParamTextBox.Location = new System.Drawing.Point(120, 227);
this.OBFSOptionParamTextBox.Name = "OBFSParamTextBox";
this.OBFSOptionParamTextBox.Size = new System.Drawing.Size(294, 23);
this.OBFSOptionParamTextBox.TabIndex = 17;
this.OBFSOptionParamTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// OBFSLabel
//
this.OBFSLabel.AutoSize = true;
this.OBFSLabel.Location = new System.Drawing.Point(10, 200);
this.OBFSLabel.Name = "OBFSLabel";
this.OBFSLabel.Size = new System.Drawing.Size(39, 17);
this.OBFSLabel.TabIndex = 14;
this.OBFSLabel.Text = "OBFS";
//
// OBFSComboBox
//
this.OBFSComboBox.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
this.OBFSComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.OBFSComboBox.FormattingEnabled = true;
this.OBFSComboBox.Location = new System.Drawing.Point(120, 196);
this.OBFSComboBox.Name = "OBFSComboBox";
this.OBFSComboBox.Size = new System.Drawing.Size(294, 24);
this.OBFSComboBox.TabIndex = 15;
this.OBFSComboBox.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.ComboBox_DrawItem);
//
// ProtocolParamLabel
//
this.ProtocolParamLabel.AutoSize = true;
this.ProtocolParamLabel.Location = new System.Drawing.Point(10, 170);
this.ProtocolParamLabel.Name = "ProtocolParamLabel";
this.ProtocolParamLabel.Size = new System.Drawing.Size(98, 17);
this.ProtocolParamLabel.TabIndex = 12;
this.ProtocolParamLabel.Text = "Protocol Param";
//
// ProtocolParamTextBox
//
this.ProtocolParamTextBox.Location = new System.Drawing.Point(120, 167);
this.ProtocolParamTextBox.Name = "ProtocolParamTextBox";
this.ProtocolParamTextBox.Size = new System.Drawing.Size(294, 23);
this.ProtocolParamTextBox.TabIndex = 13;
this.ProtocolParamTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// ProtocolLabel
//
this.ProtocolLabel.AutoSize = true;
this.ProtocolLabel.Location = new System.Drawing.Point(10, 140);
this.ProtocolLabel.Name = "ProtocolLabel";
this.ProtocolLabel.Size = new System.Drawing.Size(57, 17);
this.ProtocolLabel.TabIndex = 10;
this.ProtocolLabel.Text = "Protocol";
//
// ProtocolComboBox
//
this.ProtocolComboBox.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
this.ProtocolComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.ProtocolComboBox.FormattingEnabled = true;
this.ProtocolComboBox.Location = new System.Drawing.Point(120, 136);
this.ProtocolComboBox.Name = "ProtocolComboBox";
this.ProtocolComboBox.Size = new System.Drawing.Size(294, 24);
this.ProtocolComboBox.TabIndex = 11;
this.ProtocolComboBox.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.ComboBox_DrawItem);
//
// EncryptMethodLabel
//
this.EncryptMethodLabel.AutoSize = true;
this.EncryptMethodLabel.Location = new System.Drawing.Point(10, 110);
this.EncryptMethodLabel.Name = "EncryptMethodLabel";
this.EncryptMethodLabel.Size = new System.Drawing.Size(101, 17);
this.EncryptMethodLabel.TabIndex = 8;
this.EncryptMethodLabel.Text = "Encrypt Method";
//
// EncryptMethodComboBox
//
this.EncryptMethodComboBox.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
this.EncryptMethodComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.EncryptMethodComboBox.FormattingEnabled = true;
this.EncryptMethodComboBox.Location = new System.Drawing.Point(120, 106);
this.EncryptMethodComboBox.Name = "EncryptMethodComboBox";
this.EncryptMethodComboBox.Size = new System.Drawing.Size(294, 24);
this.EncryptMethodComboBox.TabIndex = 9;
this.EncryptMethodComboBox.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.ComboBox_DrawItem);
//
// PasswordTextBox
//
this.PasswordTextBox.Location = new System.Drawing.Point(120, 77);
this.PasswordTextBox.Name = "PasswordTextBox";
this.PasswordTextBox.Size = new System.Drawing.Size(294, 23);
this.PasswordTextBox.TabIndex = 7;
this.PasswordTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// PasswordLabel
//
this.PasswordLabel.AutoSize = true;
this.PasswordLabel.Location = new System.Drawing.Point(10, 80);
this.PasswordLabel.Name = "PasswordLabel";
this.PasswordLabel.Size = new System.Drawing.Size(64, 17);
this.PasswordLabel.TabIndex = 6;
this.PasswordLabel.Text = "Password";
//
// AddressLabel
//
this.AddressLabel.AutoSize = true;
this.AddressLabel.Location = new System.Drawing.Point(10, 51);
this.AddressLabel.Name = "AddressLabel";
this.AddressLabel.Size = new System.Drawing.Size(56, 17);
this.AddressLabel.TabIndex = 2;
this.AddressLabel.Text = "Address";
//
// PortTextBox
//
this.PortTextBox.Location = new System.Drawing.Point(358, 48);
this.PortTextBox.Name = "PortTextBox";
this.PortTextBox.Size = new System.Drawing.Size(56, 23);
this.PortTextBox.TabIndex = 5;
this.PortTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// AddressTextBox
//
this.AddressTextBox.Location = new System.Drawing.Point(120, 48);
this.AddressTextBox.Name = "AddressTextBox";
this.AddressTextBox.Size = new System.Drawing.Size(232, 23);
this.AddressTextBox.TabIndex = 3;
this.AddressTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// RemarkTextBox
//
this.RemarkTextBox.Location = new System.Drawing.Point(120, 19);
this.RemarkTextBox.Name = "RemarkTextBox";
this.RemarkTextBox.Size = new System.Drawing.Size(294, 23);
this.RemarkTextBox.TabIndex = 1;
this.RemarkTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// RemarkLabel
//
this.RemarkLabel.AutoSize = true;
this.RemarkLabel.Location = new System.Drawing.Point(10, 22);
this.RemarkLabel.Name = "RemarkLabel";
this.RemarkLabel.Size = new System.Drawing.Size(53, 17);
this.RemarkLabel.TabIndex = 0;
this.RemarkLabel.Text = "Remark";
//
// PortLabel
//
this.PortLabel.AutoSize = true;
this.PortLabel.Location = new System.Drawing.Point(351, 51);
this.PortLabel.Name = "PortLabel";
this.PortLabel.Size = new System.Drawing.Size(11, 17);
this.PortLabel.TabIndex = 4;
this.PortLabel.Text = ":";
//
// ControlButton
//
this.ControlButton.Location = new System.Drawing.Point(357, 276);
this.ControlButton.Name = "ControlButton";
this.ControlButton.Size = new System.Drawing.Size(75, 23);
this.ControlButton.TabIndex = 1;
this.ControlButton.Text = "Save";
this.ControlButton.UseVisualStyleBackColor = true;
this.ControlButton.Click += new System.EventHandler(this.ControlButton_Click);
//
// ShadowsocksR
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.ClientSize = new System.Drawing.Size(444, 310);
this.Controls.Add(this.ControlButton);
this.Controls.Add(this.ConfigurationGroupBox);
this.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.MaximizeBox = false;
this.Name = "ShadowsocksRForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "ShadowsocksR";
this.Load += new System.EventHandler(this.ShadowsocksR_Load);
this.ConfigurationGroupBox.ResumeLayout(false);
this.ConfigurationGroupBox.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.GroupBox ConfigurationGroupBox;
private System.Windows.Forms.Button ControlButton;
private System.Windows.Forms.Label RemarkLabel;
private System.Windows.Forms.TextBox RemarkTextBox;
private System.Windows.Forms.Label PortLabel;
private System.Windows.Forms.TextBox AddressTextBox;
private System.Windows.Forms.TextBox PortTextBox;
private System.Windows.Forms.Label AddressLabel;
private System.Windows.Forms.Label EncryptMethodLabel;
private System.Windows.Forms.ComboBox EncryptMethodComboBox;
private System.Windows.Forms.TextBox PasswordTextBox;
private System.Windows.Forms.Label PasswordLabel;
private System.Windows.Forms.Label ProtocolLabel;
private System.Windows.Forms.ComboBox ProtocolComboBox;
private System.Windows.Forms.TextBox ProtocolParamTextBox;
private System.Windows.Forms.Label ProtocolParamLabel;
private System.Windows.Forms.Label OBFSLabel;
private System.Windows.Forms.ComboBox OBFSComboBox;
private System.Windows.Forms.TextBox OBFSOptionParamTextBox;
private System.Windows.Forms.Label OBFSParamLabel;
}
}

View File

@@ -1,65 +0,0 @@
using System;
using System.Windows.Forms;
using Netch.Utils;
namespace Netch.ServerEx.ShadowsocksR.Form
{
public partial class ShadowsocksRForm : System.Windows.Forms.Form
{
private readonly ShadowsocksR _server;
public ShadowsocksRForm(Models.Server server = default)
{
InitializeComponent();
_server = (ShadowsocksR) (server ?? new ShadowsocksR());
}
private void ShadowsocksR_Load(object sender, EventArgs e)
{
i18N.TranslateForm(this);
EncryptMethodComboBox.Items.AddRange(SSRGlobal.EncryptMethods.ToArray());
ProtocolComboBox.Items.AddRange(SSRGlobal.Protocols.ToArray());
OBFSComboBox.Items.AddRange(SSRGlobal.OBFSs.ToArray());
RemarkTextBox.Text = _server.Remark;
AddressTextBox.Text = _server.Hostname;
PortTextBox.Text = _server.Port.ToString();
PasswordTextBox.Text = _server.Password;
EncryptMethodComboBox.SelectedIndex = SSRGlobal.EncryptMethods.IndexOf(_server.EncryptMethod);
ProtocolComboBox.SelectedIndex = SSRGlobal.Protocols.IndexOf(_server.Protocol);
ProtocolParamTextBox.Text = _server.ProtocolParam;
OBFSComboBox.SelectedIndex = SSRGlobal.OBFSs.IndexOf(_server.OBFS);
OBFSOptionParamTextBox.Text = _server.OBFSParam;
}
private void ComboBox_DrawItem(object sender, DrawItemEventArgs e)
{
Utils.Utils.DrawCenterComboBox(sender, e);
}
private void ControlButton_Click(object sender, EventArgs e)
{
if (!ushort.TryParse(PortTextBox.Text, out var port)) return;
_server.Remark = RemarkTextBox.Text;
_server.Type = "SSR";
_server.Hostname = AddressTextBox.Text;
_server.Port = port;
_server.Password = PasswordTextBox.Text;
_server.EncryptMethod = EncryptMethodComboBox.Text;
_server.Protocol = ProtocolComboBox.Text;
_server.ProtocolParam = ProtocolParamTextBox.Text;
_server.OBFS = OBFSComboBox.Text;
_server.OBFSParam = OBFSOptionParamTextBox.Text;
_server.Country = null;
if (Global.Settings.Server.IndexOf(_server) == -1)
Global.Settings.Server.Add(_server);
MessageBoxX.Show(i18N.Translate("Saved"));
Close();
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,198 +0,0 @@
namespace Netch.ServerEx.Socks5.Form
{
partial class Socks5Form
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Socks5Form));
this.ConfigurationGroupBox = new System.Windows.Forms.GroupBox();
this.PasswordLabel = new System.Windows.Forms.Label();
this.UsernameTextBox = new System.Windows.Forms.TextBox();
this.PasswordTextBox = new System.Windows.Forms.TextBox();
this.UsernameLabel = new System.Windows.Forms.Label();
this.AddressLabel = new System.Windows.Forms.Label();
this.PortTextBox = new System.Windows.Forms.TextBox();
this.AddressTextBox = new System.Windows.Forms.TextBox();
this.RemarkTextBox = new System.Windows.Forms.TextBox();
this.RemarkLabel = new System.Windows.Forms.Label();
this.PortLabel = new System.Windows.Forms.Label();
this.ControlButton = new System.Windows.Forms.Button();
this.ConfigurationGroupBox.SuspendLayout();
this.SuspendLayout();
//
// ConfigurationGroupBox
//
this.ConfigurationGroupBox.Controls.Add(this.PasswordLabel);
this.ConfigurationGroupBox.Controls.Add(this.UsernameTextBox);
this.ConfigurationGroupBox.Controls.Add(this.PasswordTextBox);
this.ConfigurationGroupBox.Controls.Add(this.UsernameLabel);
this.ConfigurationGroupBox.Controls.Add(this.AddressLabel);
this.ConfigurationGroupBox.Controls.Add(this.PortTextBox);
this.ConfigurationGroupBox.Controls.Add(this.AddressTextBox);
this.ConfigurationGroupBox.Controls.Add(this.RemarkTextBox);
this.ConfigurationGroupBox.Controls.Add(this.RemarkLabel);
this.ConfigurationGroupBox.Controls.Add(this.PortLabel);
this.ConfigurationGroupBox.Location = new System.Drawing.Point(12, 12);
this.ConfigurationGroupBox.Name = "ConfigurationGroupBox";
this.ConfigurationGroupBox.Size = new System.Drawing.Size(420, 139);
this.ConfigurationGroupBox.TabIndex = 0;
this.ConfigurationGroupBox.TabStop = false;
this.ConfigurationGroupBox.Text = "Configuration";
//
// PasswordLabel
//
this.PasswordLabel.AutoSize = true;
this.PasswordLabel.Location = new System.Drawing.Point(10, 109);
this.PasswordLabel.Name = "PasswordLabel";
this.PasswordLabel.Size = new System.Drawing.Size(64, 17);
this.PasswordLabel.TabIndex = 8;
this.PasswordLabel.Text = "Password";
//
// UsernameTextBox
//
this.UsernameTextBox.Location = new System.Drawing.Point(120, 77);
this.UsernameTextBox.Name = "UsernameTextBox";
this.UsernameTextBox.Size = new System.Drawing.Size(294, 23);
this.UsernameTextBox.TabIndex = 7;
this.UsernameTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// PasswordTextBox
//
this.PasswordTextBox.Location = new System.Drawing.Point(120, 106);
this.PasswordTextBox.Name = "PasswordTextBox";
this.PasswordTextBox.Size = new System.Drawing.Size(294, 23);
this.PasswordTextBox.TabIndex = 9;
this.PasswordTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// UsernameLabel
//
this.UsernameLabel.AutoSize = true;
this.UsernameLabel.Location = new System.Drawing.Point(10, 80);
this.UsernameLabel.Name = "UsernameLabel";
this.UsernameLabel.Size = new System.Drawing.Size(67, 17);
this.UsernameLabel.TabIndex = 6;
this.UsernameLabel.Text = "Username";
//
// AddressLabel
//
this.AddressLabel.AutoSize = true;
this.AddressLabel.Location = new System.Drawing.Point(10, 51);
this.AddressLabel.Name = "AddressLabel";
this.AddressLabel.Size = new System.Drawing.Size(56, 17);
this.AddressLabel.TabIndex = 2;
this.AddressLabel.Text = "Address";
//
// PortTextBox
//
this.PortTextBox.Location = new System.Drawing.Point(358, 48);
this.PortTextBox.Name = "PortTextBox";
this.PortTextBox.Size = new System.Drawing.Size(56, 23);
this.PortTextBox.TabIndex = 5;
this.PortTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// AddressTextBox
//
this.AddressTextBox.Location = new System.Drawing.Point(120, 48);
this.AddressTextBox.Name = "AddressTextBox";
this.AddressTextBox.Size = new System.Drawing.Size(232, 23);
this.AddressTextBox.TabIndex = 3;
this.AddressTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// RemarkTextBox
//
this.RemarkTextBox.Location = new System.Drawing.Point(120, 19);
this.RemarkTextBox.Name = "RemarkTextBox";
this.RemarkTextBox.Size = new System.Drawing.Size(294, 23);
this.RemarkTextBox.TabIndex = 1;
this.RemarkTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// RemarkLabel
//
this.RemarkLabel.AutoSize = true;
this.RemarkLabel.Location = new System.Drawing.Point(10, 22);
this.RemarkLabel.Name = "RemarkLabel";
this.RemarkLabel.Size = new System.Drawing.Size(53, 17);
this.RemarkLabel.TabIndex = 0;
this.RemarkLabel.Text = "Remark";
//
// PortLabel
//
this.PortLabel.AutoSize = true;
this.PortLabel.Location = new System.Drawing.Point(351, 51);
this.PortLabel.Name = "PortLabel";
this.PortLabel.Size = new System.Drawing.Size(11, 17);
this.PortLabel.TabIndex = 4;
this.PortLabel.Text = ":";
//
// ControlButton
//
this.ControlButton.Location = new System.Drawing.Point(357, 157);
this.ControlButton.Name = "ControlButton";
this.ControlButton.Size = new System.Drawing.Size(75, 23);
this.ControlButton.TabIndex = 1;
this.ControlButton.Text = "Save";
this.ControlButton.UseVisualStyleBackColor = true;
this.ControlButton.Click += new System.EventHandler(this.ControlButton_Click);
//
// Socks5
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.ClientSize = new System.Drawing.Size(444, 192);
this.Controls.Add(this.ControlButton);
this.Controls.Add(this.ConfigurationGroupBox);
this.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.MaximizeBox = false;
this.Name = "Socks5Form";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Socks5";
this.Load += new System.EventHandler(this.Socks5_Load);
this.ConfigurationGroupBox.ResumeLayout(false);
this.ConfigurationGroupBox.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.GroupBox ConfigurationGroupBox;
private System.Windows.Forms.Button ControlButton;
private System.Windows.Forms.Label RemarkLabel;
private System.Windows.Forms.TextBox RemarkTextBox;
private System.Windows.Forms.Label PortLabel;
private System.Windows.Forms.TextBox AddressTextBox;
private System.Windows.Forms.TextBox PortTextBox;
private System.Windows.Forms.Label AddressLabel;
private System.Windows.Forms.TextBox PasswordTextBox;
private System.Windows.Forms.Label UsernameLabel;
private System.Windows.Forms.Label PasswordLabel;
private System.Windows.Forms.TextBox UsernameTextBox;
}
}

View File

@@ -1,47 +0,0 @@
using System;
using Netch.Utils;
namespace Netch.ServerEx.Socks5.Form
{
public partial class Socks5Form : System.Windows.Forms.Form
{
private readonly Socks5 _server;
public Socks5Form(Models.Server server = default)
{
InitializeComponent();
_server = (Socks5) (server ?? new Socks5());
}
private void Socks5_Load(object sender, EventArgs e)
{
i18N.TranslateForm(this);
RemarkTextBox.Text = _server.Remark;
AddressTextBox.Text = _server.Hostname;
PortTextBox.Text = _server.Port.ToString();
UsernameTextBox.Text = _server.Username;
PasswordTextBox.Text = _server.Password;
}
private void ControlButton_Click(object sender, EventArgs e)
{
if (!ushort.TryParse(PortTextBox.Text, out var port)) return;
_server.Remark = RemarkTextBox.Text;
_server.Type = "Socks5";
_server.Hostname = AddressTextBox.Text;
_server.Port = port;
_server.Username = UsernameTextBox.Text;
_server.Password = PasswordTextBox.Text;
_server.Country = null;
if (Global.Settings.Server.IndexOf(_server) == -1)
Global.Settings.Server.Add(_server);
MessageBoxX.Show(i18N.Translate("Saved"));
Close();
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,175 +0,0 @@
namespace Netch.ServerEx.Trojan.Form
{
partial class TrojanForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TrojanForm));
this.ConfigurationGroupBox = new System.Windows.Forms.GroupBox();
this.PasswordTextBox = new System.Windows.Forms.TextBox();
this.PasswordLabel = new System.Windows.Forms.Label();
this.AddressLabel = new System.Windows.Forms.Label();
this.PortTextBox = new System.Windows.Forms.TextBox();
this.AddressTextBox = new System.Windows.Forms.TextBox();
this.RemarkTextBox = new System.Windows.Forms.TextBox();
this.RemarkLabel = new System.Windows.Forms.Label();
this.PortLabel = new System.Windows.Forms.Label();
this.ControlButton = new System.Windows.Forms.Button();
this.ConfigurationGroupBox.SuspendLayout();
this.SuspendLayout();
//
// ConfigurationGroupBox
//
this.ConfigurationGroupBox.Controls.Add(this.PasswordTextBox);
this.ConfigurationGroupBox.Controls.Add(this.PasswordLabel);
this.ConfigurationGroupBox.Controls.Add(this.AddressLabel);
this.ConfigurationGroupBox.Controls.Add(this.PortTextBox);
this.ConfigurationGroupBox.Controls.Add(this.AddressTextBox);
this.ConfigurationGroupBox.Controls.Add(this.RemarkTextBox);
this.ConfigurationGroupBox.Controls.Add(this.RemarkLabel);
this.ConfigurationGroupBox.Controls.Add(this.PortLabel);
this.ConfigurationGroupBox.Location = new System.Drawing.Point(12, 12);
this.ConfigurationGroupBox.Name = "ConfigurationGroupBox";
this.ConfigurationGroupBox.Size = new System.Drawing.Size(420, 109);
this.ConfigurationGroupBox.TabIndex = 0;
this.ConfigurationGroupBox.TabStop = false;
this.ConfigurationGroupBox.Text = "Configuration";
//
// PasswordTextBox
//
this.PasswordTextBox.Location = new System.Drawing.Point(120, 77);
this.PasswordTextBox.Name = "PasswordTextBox";
this.PasswordTextBox.Size = new System.Drawing.Size(294, 23);
this.PasswordTextBox.TabIndex = 7;
this.PasswordTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// PasswordLabel
//
this.PasswordLabel.AutoSize = true;
this.PasswordLabel.Location = new System.Drawing.Point(10, 80);
this.PasswordLabel.Name = "PasswordLabel";
this.PasswordLabel.Size = new System.Drawing.Size(64, 17);
this.PasswordLabel.TabIndex = 6;
this.PasswordLabel.Text = "Password";
//
// AddressLabel
//
this.AddressLabel.AutoSize = true;
this.AddressLabel.Location = new System.Drawing.Point(10, 51);
this.AddressLabel.Name = "AddressLabel";
this.AddressLabel.Size = new System.Drawing.Size(56, 17);
this.AddressLabel.TabIndex = 2;
this.AddressLabel.Text = "Address";
//
// PortTextBox
//
this.PortTextBox.Location = new System.Drawing.Point(358, 48);
this.PortTextBox.Name = "PortTextBox";
this.PortTextBox.Size = new System.Drawing.Size(56, 23);
this.PortTextBox.TabIndex = 5;
this.PortTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// AddressTextBox
//
this.AddressTextBox.Location = new System.Drawing.Point(120, 48);
this.AddressTextBox.Name = "AddressTextBox";
this.AddressTextBox.Size = new System.Drawing.Size(232, 23);
this.AddressTextBox.TabIndex = 3;
this.AddressTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// RemarkTextBox
//
this.RemarkTextBox.Location = new System.Drawing.Point(120, 19);
this.RemarkTextBox.Name = "RemarkTextBox";
this.RemarkTextBox.Size = new System.Drawing.Size(294, 23);
this.RemarkTextBox.TabIndex = 1;
this.RemarkTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// RemarkLabel
//
this.RemarkLabel.AutoSize = true;
this.RemarkLabel.Location = new System.Drawing.Point(10, 22);
this.RemarkLabel.Name = "RemarkLabel";
this.RemarkLabel.Size = new System.Drawing.Size(53, 17);
this.RemarkLabel.TabIndex = 0;
this.RemarkLabel.Text = "Remark";
//
// PortLabel
//
this.PortLabel.AutoSize = true;
this.PortLabel.Location = new System.Drawing.Point(351, 51);
this.PortLabel.Name = "PortLabel";
this.PortLabel.Size = new System.Drawing.Size(11, 17);
this.PortLabel.TabIndex = 4;
this.PortLabel.Text = ":";
//
// ControlButton
//
this.ControlButton.Location = new System.Drawing.Point(357, 127);
this.ControlButton.Name = "ControlButton";
this.ControlButton.Size = new System.Drawing.Size(75, 23);
this.ControlButton.TabIndex = 1;
this.ControlButton.Text = "Save";
this.ControlButton.UseVisualStyleBackColor = true;
this.ControlButton.Click += new System.EventHandler(this.ControlButton_Click);
//
// Trojan
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.ClientSize = new System.Drawing.Size(444, 161);
this.Controls.Add(this.ControlButton);
this.Controls.Add(this.ConfigurationGroupBox);
this.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.MaximizeBox = false;
this.Name = "TrojanForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Trojan";
this.Load += new System.EventHandler(this.TrojanForm_Load);
this.ConfigurationGroupBox.ResumeLayout(false);
this.ConfigurationGroupBox.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.GroupBox ConfigurationGroupBox;
private System.Windows.Forms.Button ControlButton;
private System.Windows.Forms.Label RemarkLabel;
private System.Windows.Forms.TextBox RemarkTextBox;
private System.Windows.Forms.Label PortLabel;
private System.Windows.Forms.TextBox AddressTextBox;
private System.Windows.Forms.TextBox PortTextBox;
private System.Windows.Forms.Label AddressLabel;
private System.Windows.Forms.TextBox PasswordTextBox;
private System.Windows.Forms.Label PasswordLabel;
}
}

View File

@@ -1,52 +0,0 @@
using System;
using System.Windows.Forms;
using Netch.Models;
using Netch.Utils;
namespace Netch.ServerEx.Trojan.Form
{
public partial class TrojanForm : System.Windows.Forms.Form
{
private readonly Trojan _server;
public TrojanForm(Server server = default)
{
InitializeComponent();
_server = (Trojan) (server ?? new Trojan());
}
private void TrojanForm_Load(object sender, EventArgs e)
{
i18N.TranslateForm(this);
RemarkTextBox.Text = _server.Remark;
AddressTextBox.Text = _server.Hostname;
PortTextBox.Text = _server.Port.ToString();
PasswordTextBox.Text = _server.Password;
}
private void ComboBox_DrawItem(object sender, DrawItemEventArgs e)
{
Utils.Utils.DrawCenterComboBox(sender, e);
}
private void ControlButton_Click(object sender, EventArgs e)
{
if (!ushort.TryParse(PortTextBox.Text, out var port)) return;
_server.Remark = RemarkTextBox.Text;
_server.Type = "Trojan";
_server.Hostname = AddressTextBox.Text;
_server.Port = port;
_server.Password = PasswordTextBox.Text;
_server.Country = null;
if (Global.Settings.Server.IndexOf(_server) == -1)
Global.Settings.Server.Add(_server);
MessageBoxX.Show(i18N.Translate("Saved"));
Close();
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,426 +0,0 @@
namespace Netch.ServerEx.VMess.Form
{
partial class VMessForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(VMessForm));
this.ConfigurationGroupBox = new System.Windows.Forms.GroupBox();
this.UseMuxCheckBox = new System.Windows.Forms.CheckBox();
this.TLSSecureCheckBox = new System.Windows.Forms.CheckBox();
this.QUICSecretLabel = new System.Windows.Forms.Label();
this.QUICSecurityLabel = new System.Windows.Forms.Label();
this.QUICSecretTextBox = new System.Windows.Forms.TextBox();
this.QUICSecurityComboBox = new System.Windows.Forms.ComboBox();
this.PathLabel = new System.Windows.Forms.Label();
this.PathTextBox = new System.Windows.Forms.TextBox();
this.HostLabel = new System.Windows.Forms.Label();
this.HostTextBox = new System.Windows.Forms.TextBox();
this.FakeTypeLabel = new System.Windows.Forms.Label();
this.FakeTypeComboBox = new System.Windows.Forms.ComboBox();
this.TransferProtocolLabel = new System.Windows.Forms.Label();
this.TransferProtocolComboBox = new System.Windows.Forms.ComboBox();
this.EncryptMethodLabel = new System.Windows.Forms.Label();
this.EncryptMethodComboBox = new System.Windows.Forms.ComboBox();
this.AlterIDLabel = new System.Windows.Forms.Label();
this.AlterIDTextBox = new System.Windows.Forms.TextBox();
this.UserIDLabel = new System.Windows.Forms.Label();
this.UserIDTextBox = new System.Windows.Forms.TextBox();
this.PortTextBox = new System.Windows.Forms.TextBox();
this.AddressTextBox = new System.Windows.Forms.TextBox();
this.AddressLabel = new System.Windows.Forms.Label();
this.RemarkTextBox = new System.Windows.Forms.TextBox();
this.RemarkLabel = new System.Windows.Forms.Label();
this.PortLabel = new System.Windows.Forms.Label();
this.ControlButton = new System.Windows.Forms.Button();
this.ConfigurationGroupBox.SuspendLayout();
this.SuspendLayout();
//
// ConfigurationGroupBox
//
this.ConfigurationGroupBox.Controls.Add(this.UseMuxCheckBox);
this.ConfigurationGroupBox.Controls.Add(this.TLSSecureCheckBox);
this.ConfigurationGroupBox.Controls.Add(this.QUICSecretLabel);
this.ConfigurationGroupBox.Controls.Add(this.QUICSecurityLabel);
this.ConfigurationGroupBox.Controls.Add(this.QUICSecretTextBox);
this.ConfigurationGroupBox.Controls.Add(this.QUICSecurityComboBox);
this.ConfigurationGroupBox.Controls.Add(this.PathLabel);
this.ConfigurationGroupBox.Controls.Add(this.PathTextBox);
this.ConfigurationGroupBox.Controls.Add(this.HostLabel);
this.ConfigurationGroupBox.Controls.Add(this.HostTextBox);
this.ConfigurationGroupBox.Controls.Add(this.FakeTypeLabel);
this.ConfigurationGroupBox.Controls.Add(this.FakeTypeComboBox);
this.ConfigurationGroupBox.Controls.Add(this.TransferProtocolLabel);
this.ConfigurationGroupBox.Controls.Add(this.TransferProtocolComboBox);
this.ConfigurationGroupBox.Controls.Add(this.EncryptMethodLabel);
this.ConfigurationGroupBox.Controls.Add(this.EncryptMethodComboBox);
this.ConfigurationGroupBox.Controls.Add(this.AlterIDLabel);
this.ConfigurationGroupBox.Controls.Add(this.AlterIDTextBox);
this.ConfigurationGroupBox.Controls.Add(this.UserIDLabel);
this.ConfigurationGroupBox.Controls.Add(this.UserIDTextBox);
this.ConfigurationGroupBox.Controls.Add(this.PortTextBox);
this.ConfigurationGroupBox.Controls.Add(this.AddressTextBox);
this.ConfigurationGroupBox.Controls.Add(this.AddressLabel);
this.ConfigurationGroupBox.Controls.Add(this.RemarkTextBox);
this.ConfigurationGroupBox.Controls.Add(this.RemarkLabel);
this.ConfigurationGroupBox.Controls.Add(this.PortLabel);
this.ConfigurationGroupBox.Location = new System.Drawing.Point(18, 18);
this.ConfigurationGroupBox.Margin = new System.Windows.Forms.Padding(4);
this.ConfigurationGroupBox.Name = "ConfigurationGroupBox";
this.ConfigurationGroupBox.Padding = new System.Windows.Forms.Padding(4);
this.ConfigurationGroupBox.Size = new System.Drawing.Size(630, 560);
this.ConfigurationGroupBox.TabIndex = 1;
this.ConfigurationGroupBox.TabStop = false;
this.ConfigurationGroupBox.Text = "Configuration";
//
// UseMuxCheckBox
//
this.UseMuxCheckBox.AutoSize = true;
this.UseMuxCheckBox.Location = new System.Drawing.Point(292, 519);
this.UseMuxCheckBox.Margin = new System.Windows.Forms.Padding(4);
this.UseMuxCheckBox.Name = "UseMuxCheckBox";
this.UseMuxCheckBox.Size = new System.Drawing.Size(110, 28);
this.UseMuxCheckBox.TabIndex = 25;
this.UseMuxCheckBox.Text = "Use Mux";
this.UseMuxCheckBox.UseVisualStyleBackColor = true;
//
// TLSSecureCheckBox
//
this.TLSSecureCheckBox.AutoSize = true;
this.TLSSecureCheckBox.Location = new System.Drawing.Point(453, 519);
this.TLSSecureCheckBox.Margin = new System.Windows.Forms.Padding(4);
this.TLSSecureCheckBox.Name = "TLSSecureCheckBox";
this.TLSSecureCheckBox.Size = new System.Drawing.Size(127, 28);
this.TLSSecureCheckBox.TabIndex = 24;
this.TLSSecureCheckBox.Text = "TLS Secure";
this.TLSSecureCheckBox.UseVisualStyleBackColor = true;
//
// QUICSecretLabel
//
this.QUICSecretLabel.AutoSize = true;
this.QUICSecretLabel.Location = new System.Drawing.Point(15, 480);
this.QUICSecretLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.QUICSecretLabel.Name = "QUICSecretLabel";
this.QUICSecretLabel.Size = new System.Drawing.Size(113, 24);
this.QUICSecretLabel.TabIndex = 22;
this.QUICSecretLabel.Text = "QUIC Secret";
//
// QUICSecurityLabel
//
this.QUICSecurityLabel.AutoSize = true;
this.QUICSecurityLabel.Location = new System.Drawing.Point(15, 435);
this.QUICSecurityLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.QUICSecurityLabel.Name = "QUICSecurityLabel";
this.QUICSecurityLabel.Size = new System.Drawing.Size(129, 24);
this.QUICSecurityLabel.TabIndex = 20;
this.QUICSecurityLabel.Text = "QUIC Security";
//
// QUICSecretTextBox
//
this.QUICSecretTextBox.Location = new System.Drawing.Point(180, 476);
this.QUICSecretTextBox.Margin = new System.Windows.Forms.Padding(4);
this.QUICSecretTextBox.Name = "QUICSecretTextBox";
this.QUICSecretTextBox.Size = new System.Drawing.Size(439, 31);
this.QUICSecretTextBox.TabIndex = 23;
this.QUICSecretTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// QUICSecurityComboBox
//
this.QUICSecurityComboBox.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
this.QUICSecurityComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.QUICSecurityComboBox.FormattingEnabled = true;
this.QUICSecurityComboBox.Location = new System.Drawing.Point(180, 429);
this.QUICSecurityComboBox.Margin = new System.Windows.Forms.Padding(4);
this.QUICSecurityComboBox.Name = "QUICSecurityComboBox";
this.QUICSecurityComboBox.Size = new System.Drawing.Size(439, 32);
this.QUICSecurityComboBox.TabIndex = 21;
this.QUICSecurityComboBox.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.ComboBox_DrawItem);
//
// PathLabel
//
this.PathLabel.AutoSize = true;
this.PathLabel.Location = new System.Drawing.Point(15, 390);
this.PathLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.PathLabel.Name = "PathLabel";
this.PathLabel.Size = new System.Drawing.Size(49, 24);
this.PathLabel.TabIndex = 18;
this.PathLabel.Text = "Path";
//
// PathTextBox
//
this.PathTextBox.Location = new System.Drawing.Point(180, 386);
this.PathTextBox.Margin = new System.Windows.Forms.Padding(4);
this.PathTextBox.Name = "PathTextBox";
this.PathTextBox.Size = new System.Drawing.Size(439, 31);
this.PathTextBox.TabIndex = 19;
this.PathTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// HostLabel
//
this.HostLabel.AutoSize = true;
this.HostLabel.Location = new System.Drawing.Point(15, 346);
this.HostLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.HostLabel.Name = "HostLabel";
this.HostLabel.Size = new System.Drawing.Size(50, 24);
this.HostLabel.TabIndex = 16;
this.HostLabel.Text = "Host";
//
// HostTextBox
//
this.HostTextBox.Location = new System.Drawing.Point(180, 342);
this.HostTextBox.Margin = new System.Windows.Forms.Padding(4);
this.HostTextBox.Name = "HostTextBox";
this.HostTextBox.Size = new System.Drawing.Size(439, 31);
this.HostTextBox.TabIndex = 17;
this.HostTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// FakeTypeLabel
//
this.FakeTypeLabel.AutoSize = true;
this.FakeTypeLabel.Location = new System.Drawing.Point(15, 302);
this.FakeTypeLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.FakeTypeLabel.Name = "FakeTypeLabel";
this.FakeTypeLabel.Size = new System.Drawing.Size(97, 24);
this.FakeTypeLabel.TabIndex = 14;
this.FakeTypeLabel.Text = "Fake Type";
//
// FakeTypeComboBox
//
this.FakeTypeComboBox.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
this.FakeTypeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.FakeTypeComboBox.FormattingEnabled = true;
this.FakeTypeComboBox.Location = new System.Drawing.Point(180, 296);
this.FakeTypeComboBox.Margin = new System.Windows.Forms.Padding(4);
this.FakeTypeComboBox.Name = "FakeTypeComboBox";
this.FakeTypeComboBox.Size = new System.Drawing.Size(439, 32);
this.FakeTypeComboBox.TabIndex = 15;
this.FakeTypeComboBox.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.ComboBox_DrawItem);
//
// TransferProtocolLabel
//
this.TransferProtocolLabel.AutoSize = true;
this.TransferProtocolLabel.Location = new System.Drawing.Point(15, 255);
this.TransferProtocolLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.TransferProtocolLabel.Name = "TransferProtocolLabel";
this.TransferProtocolLabel.Size = new System.Drawing.Size(156, 24);
this.TransferProtocolLabel.TabIndex = 12;
this.TransferProtocolLabel.Text = "Transfer Protocol";
//
// TransferProtocolComboBox
//
this.TransferProtocolComboBox.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
this.TransferProtocolComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.TransferProtocolComboBox.FormattingEnabled = true;
this.TransferProtocolComboBox.Location = new System.Drawing.Point(180, 249);
this.TransferProtocolComboBox.Margin = new System.Windows.Forms.Padding(4);
this.TransferProtocolComboBox.Name = "TransferProtocolComboBox";
this.TransferProtocolComboBox.Size = new System.Drawing.Size(439, 32);
this.TransferProtocolComboBox.TabIndex = 13;
this.TransferProtocolComboBox.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.ComboBox_DrawItem);
//
// EncryptMethodLabel
//
this.EncryptMethodLabel.AutoSize = true;
this.EncryptMethodLabel.Location = new System.Drawing.Point(15, 208);
this.EncryptMethodLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.EncryptMethodLabel.Name = "EncryptMethodLabel";
this.EncryptMethodLabel.Size = new System.Drawing.Size(150, 24);
this.EncryptMethodLabel.TabIndex = 10;
this.EncryptMethodLabel.Text = "Encrypt Method";
//
// EncryptMethodComboBox
//
this.EncryptMethodComboBox.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
this.EncryptMethodComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.EncryptMethodComboBox.FormattingEnabled = true;
this.EncryptMethodComboBox.Location = new System.Drawing.Point(180, 202);
this.EncryptMethodComboBox.Margin = new System.Windows.Forms.Padding(4);
this.EncryptMethodComboBox.Name = "EncryptMethodComboBox";
this.EncryptMethodComboBox.Size = new System.Drawing.Size(439, 32);
this.EncryptMethodComboBox.TabIndex = 11;
this.EncryptMethodComboBox.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.ComboBox_DrawItem);
//
// AlterIDLabel
//
this.AlterIDLabel.AutoSize = true;
this.AlterIDLabel.Location = new System.Drawing.Point(15, 164);
this.AlterIDLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.AlterIDLabel.Name = "AlterIDLabel";
this.AlterIDLabel.Size = new System.Drawing.Size(76, 24);
this.AlterIDLabel.TabIndex = 8;
this.AlterIDLabel.Text = "Alter ID";
//
// AlterIDTextBox
//
this.AlterIDTextBox.Location = new System.Drawing.Point(180, 159);
this.AlterIDTextBox.Margin = new System.Windows.Forms.Padding(4);
this.AlterIDTextBox.Name = "AlterIDTextBox";
this.AlterIDTextBox.Size = new System.Drawing.Size(79, 31);
this.AlterIDTextBox.TabIndex = 9;
this.AlterIDTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// UserIDLabel
//
this.UserIDLabel.AutoSize = true;
this.UserIDLabel.Location = new System.Drawing.Point(15, 120);
this.UserIDLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.UserIDLabel.Name = "UserIDLabel";
this.UserIDLabel.Size = new System.Drawing.Size(72, 24);
this.UserIDLabel.TabIndex = 6;
this.UserIDLabel.Text = "User ID";
//
// UserIDTextBox
//
this.UserIDTextBox.Location = new System.Drawing.Point(180, 116);
this.UserIDTextBox.Margin = new System.Windows.Forms.Padding(4);
this.UserIDTextBox.Name = "UserIDTextBox";
this.UserIDTextBox.Size = new System.Drawing.Size(439, 31);
this.UserIDTextBox.TabIndex = 7;
this.UserIDTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// PortTextBox
//
this.PortTextBox.Location = new System.Drawing.Point(540, 72);
this.PortTextBox.Margin = new System.Windows.Forms.Padding(4);
this.PortTextBox.Name = "PortTextBox";
this.PortTextBox.Size = new System.Drawing.Size(79, 31);
this.PortTextBox.TabIndex = 5;
this.PortTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// AddressTextBox
//
this.AddressTextBox.Location = new System.Drawing.Point(180, 72);
this.AddressTextBox.Margin = new System.Windows.Forms.Padding(4);
this.AddressTextBox.Name = "AddressTextBox";
this.AddressTextBox.Size = new System.Drawing.Size(349, 31);
this.AddressTextBox.TabIndex = 3;
this.AddressTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// AddressLabel
//
this.AddressLabel.AutoSize = true;
this.AddressLabel.Location = new System.Drawing.Point(15, 76);
this.AddressLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.AddressLabel.Name = "AddressLabel";
this.AddressLabel.Size = new System.Drawing.Size(80, 24);
this.AddressLabel.TabIndex = 2;
this.AddressLabel.Text = "Address";
//
// RemarkTextBox
//
this.RemarkTextBox.Location = new System.Drawing.Point(180, 28);
this.RemarkTextBox.Margin = new System.Windows.Forms.Padding(4);
this.RemarkTextBox.Name = "RemarkTextBox";
this.RemarkTextBox.Size = new System.Drawing.Size(439, 31);
this.RemarkTextBox.TabIndex = 1;
this.RemarkTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// RemarkLabel
//
this.RemarkLabel.AutoSize = true;
this.RemarkLabel.Location = new System.Drawing.Point(15, 33);
this.RemarkLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.RemarkLabel.Name = "RemarkLabel";
this.RemarkLabel.Size = new System.Drawing.Size(76, 24);
this.RemarkLabel.TabIndex = 0;
this.RemarkLabel.Text = "Remark";
//
// PortLabel
//
this.PortLabel.AutoSize = true;
this.PortLabel.Location = new System.Drawing.Point(530, 76);
this.PortLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.PortLabel.Name = "PortLabel";
this.PortLabel.Size = new System.Drawing.Size(14, 24);
this.PortLabel.TabIndex = 4;
this.PortLabel.Text = ":";
//
// ControlButton
//
this.ControlButton.Location = new System.Drawing.Point(536, 586);
this.ControlButton.Margin = new System.Windows.Forms.Padding(4);
this.ControlButton.Name = "ControlButton";
this.ControlButton.Size = new System.Drawing.Size(112, 34);
this.ControlButton.TabIndex = 2;
this.ControlButton.Text = "Save";
this.ControlButton.UseVisualStyleBackColor = true;
this.ControlButton.Click += new System.EventHandler(this.ControlButton_Click);
//
// VMess
//
this.AutoScaleDimensions = new System.Drawing.SizeF(144F, 144F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.ClientSize = new System.Drawing.Size(666, 639);
this.Controls.Add(this.ControlButton);
this.Controls.Add(this.ConfigurationGroupBox);
this.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Margin = new System.Windows.Forms.Padding(4, 6, 4, 6);
this.MaximizeBox = false;
this.Name = "VMessForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "VMess";
this.Load += new System.EventHandler(this.VMess_Load);
this.ConfigurationGroupBox.ResumeLayout(false);
this.ConfigurationGroupBox.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.GroupBox ConfigurationGroupBox;
private System.Windows.Forms.TextBox PortTextBox;
private System.Windows.Forms.TextBox AddressTextBox;
private System.Windows.Forms.Label AddressLabel;
private System.Windows.Forms.TextBox RemarkTextBox;
private System.Windows.Forms.Label RemarkLabel;
private System.Windows.Forms.Label PortLabel;
private System.Windows.Forms.Label UserIDLabel;
private System.Windows.Forms.TextBox UserIDTextBox;
private System.Windows.Forms.Label AlterIDLabel;
private System.Windows.Forms.TextBox AlterIDTextBox;
private System.Windows.Forms.Label EncryptMethodLabel;
private System.Windows.Forms.ComboBox EncryptMethodComboBox;
private System.Windows.Forms.Label TransferProtocolLabel;
private System.Windows.Forms.ComboBox TransferProtocolComboBox;
private System.Windows.Forms.Label FakeTypeLabel;
private System.Windows.Forms.ComboBox FakeTypeComboBox;
private System.Windows.Forms.Label HostLabel;
private System.Windows.Forms.TextBox HostTextBox;
private System.Windows.Forms.Label PathLabel;
private System.Windows.Forms.TextBox PathTextBox;
private System.Windows.Forms.Label QUICSecurityLabel;
private System.Windows.Forms.TextBox QUICSecretTextBox;
private System.Windows.Forms.ComboBox QUICSecurityComboBox;
private System.Windows.Forms.Label QUICSecretLabel;
private System.Windows.Forms.CheckBox TLSSecureCheckBox;
private System.Windows.Forms.Button ControlButton;
private System.Windows.Forms.CheckBox UseMuxCheckBox;
}
}

View File

@@ -1,80 +0,0 @@
using System;
using System.Windows.Forms;
using Netch.Models;
using Netch.Utils;
namespace Netch.ServerEx.VMess.Form
{
public partial class VMessForm : System.Windows.Forms.Form
{
private static VMess _server;
public VMessForm(Server server = default)
{
InitializeComponent();
_server = (VMess) server ?? new VMess();
}
private void ComboBox_DrawItem(object sender, DrawItemEventArgs e)
{
Utils.Utils.DrawCenterComboBox(sender, e);
}
private void VMess_Load(object sender, EventArgs e)
{
i18N.TranslateForm(this);
EncryptMethodComboBox.Items.AddRange(VMessGlobal.EncryptMethods.ToArray());
TransferProtocolComboBox.Items.AddRange(VMessGlobal.TransferProtocols.ToArray());
FakeTypeComboBox.Items.AddRange(VMessGlobal.FakeTypes.ToArray());
QUICSecurityComboBox.Items.AddRange(VMessGlobal.QUIC.ToArray());
RemarkTextBox.Text = _server.Remark;
AddressTextBox.Text = _server.Hostname;
PortTextBox.Text = _server.Port.ToString();
UserIDTextBox.Text = _server.UserID;
AlterIDTextBox.Text = _server.AlterID.ToString();
EncryptMethodComboBox.SelectedIndex = VMessGlobal.EncryptMethods.IndexOf(_server.EncryptMethod);
TransferProtocolComboBox.SelectedIndex = VMessGlobal.TransferProtocols.IndexOf(_server.TransferProtocol);
FakeTypeComboBox.SelectedIndex = VMessGlobal.FakeTypes.IndexOf(_server.FakeType);
HostTextBox.Text = _server.Host;
PathTextBox.Text = _server.Path;
QUICSecurityComboBox.SelectedIndex = VMessGlobal.QUIC.IndexOf(_server.QUICSecure);
QUICSecretTextBox.Text = _server.QUICSecret;
TLSSecureCheckBox.Checked = _server.TLSSecure;
UseMuxCheckBox.Checked = _server.UseMux;
}
private void ControlButton_Click(object sender, EventArgs e)
{
if (!ushort.TryParse(PortTextBox.Text, out var port)) return;
if (!int.TryParse(AlterIDTextBox.Text, out var alterId)) return;
_server.Remark = RemarkTextBox.Text;
_server.Type = "VMess";
_server.Hostname = AddressTextBox.Text;
_server.Port = port;
_server.UserID = UserIDTextBox.Text;
_server.AlterID = alterId;
_server.EncryptMethod = EncryptMethodComboBox.Text;
_server.TransferProtocol = TransferProtocolComboBox.Text;
_server.FakeType = FakeTypeComboBox.Text;
_server.Host = HostTextBox.Text;
_server.Path = PathTextBox.Text;
_server.QUICSecure = QUICSecurityComboBox.Text;
_server.QUICSecret = QUICSecretTextBox.Text;
_server.TLSSecure = TLSSecureCheckBox.Checked;
_server.UseMux = UseMuxCheckBox.Checked;
_server.Country = null;
if (Global.Settings.Server.IndexOf(_server) == -1)
Global.Settings.Server.Add(_server);
MessageBoxX.Show(i18N.Translate("Saved"));
Close();
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,31 @@
using Netch.Forms;
namespace Netch.Servers.Shadowsocks.Form
{
public class ShadowsocksForm : ServerForm
{
protected override string TypeName { get; } = "Shadowsocks";
public ShadowsocksForm(Shadowsocks server = default)
{
server ??= new Shadowsocks();
Server = server;
CreateTextBox("Password", "Password",
s => true,
s => server.Password = s,
server.Password);
CreateComboBox("EncryptMethod", "Encrypt Method",
SSGlobal.EncryptMethods,
s => server.EncryptMethod = s,
server.EncryptMethod);
CreateTextBox("Plugin", "Plugin",
s => true,
s => server.Plugin = s,
server.Plugin);
CreateTextBox("PluginsOption", "Plugin Options",
s => true,
s => server.PluginOption = s,
server.PluginOption);
}
}
}

View File

@@ -1,6 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
namespace Netch.ServerEx.Shadowsocks.Models.SSD namespace Netch.Servers.Shadowsocks.Models.SSD
{ {
public class Main public class Main
{ {

View File

@@ -1,4 +1,4 @@
namespace Netch.ServerEx.Shadowsocks.Models.SSD namespace Netch.Servers.Shadowsocks.Models.SSD
{ {
public class SSDServer public class SSDServer
{ {

View File

@@ -1,4 +1,4 @@
namespace Netch.ServerEx.Shadowsocks.Models namespace Netch.Servers.Shadowsocks.Models
{ {
public class ShadowsocksConfig public class ShadowsocksConfig
{ {

View File

@@ -1,19 +1,20 @@
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Text; using System.Text;
using Netch.Controllers;
using Netch.Models; using Netch.Models;
using Netch.Utils; using Netch.Utils;
namespace Netch.ServerEx.Shadowsocks namespace Netch.Servers.Shadowsocks
{ {
public class SSController : ServerController public class SSController : Guard, IServerController
{ {
public SSController() public override string Name { get; protected set; } = "Shadowsocks";
{ public override string MainFile { get; protected set; } = "Shadowsocks.exe";
Name = "Shadowsocks";
MainFile = "Shadowsocks.exe";
}
public override bool Start(Server s, Mode mode) public int? Socks5LocalPort { get; set; }
public string LocalAddress { get; set; }
public bool Start(Server s, Mode mode)
{ {
bool DllFlag() bool DllFlag()
{ {
@@ -26,7 +27,7 @@ namespace Netch.ServerEx.Shadowsocks
{ {
State = State.Starting; State = State.Starting;
var client = Encoding.UTF8.GetBytes($"{LocalAddress}:{Socks5LocalPort}"); var client = Encoding.UTF8.GetBytes($"{LocalAddress}:{Socks5LocalPort}");
var remote = Encoding.UTF8.GetBytes($"{server.Hostname}:{server.Port}"); var remote = Encoding.UTF8.GetBytes($"{DNS.Lookup(server.Hostname)}:{server.Port}");
var passwd = Encoding.UTF8.GetBytes($"{server.Password}"); var passwd = Encoding.UTF8.GetBytes($"{server.Password}");
var method = Encoding.UTF8.GetBytes($"{server.EncryptMethod}"); var method = Encoding.UTF8.GetBytes($"{server.EncryptMethod}");
if (!ShadowsocksDLL.Info(client, remote, passwd, method)) if (!ShadowsocksDLL.Info(client, remote, passwd, method))
@@ -54,10 +55,10 @@ namespace Netch.ServerEx.Shadowsocks
var argument = new StringBuilder(); var argument = new StringBuilder();
argument.Append( argument.Append(
$"-s {server.Hostname} " + $"-s {DNS.Lookup(server.Hostname)} " +
$"-p {server.Port} " + $"-p {server.Port} " +
$"-b {LocalAddress} " + $"-b {LocalAddress ?? Global.Settings.LocalAddress} " +
$"-l {Socks5LocalPort} " + $"-l {Socks5LocalPort ?? Global.Settings.Socks5LocalPort} " +
$"-m {server.EncryptMethod} " + $"-m {server.EncryptMethod} " +
$"-k \"{server.Password}\" " + $"-k \"{server.Password}\" " +
"-u "); "-u ");

View File

@@ -3,22 +3,23 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Web; using System.Web;
using Netch.Controllers;
using Netch.Models; using Netch.Models;
using Netch.ServerEx.Shadowsocks.Form; using Netch.Servers.Shadowsocks.Form;
using Netch.ServerEx.Shadowsocks.Models.SSD; using Netch.Servers.Shadowsocks.Models.SSD;
using Netch.Utils; using Netch.Utils;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
namespace Netch.ServerEx.Shadowsocks namespace Netch.Servers.Shadowsocks
{ {
public class SSUtil : IServerUtil public class SSUtil : IServerUtil
{ {
public ushort Priority { get; } = 1; public ushort Priority { get; } = 1;
public string TypeName { get; } = "SS"; public string TypeName { get; } = "SS";
public string FullName { get; } = "Shadowsocks"; public string FullName { get; } = "Shadowsocks";
public string ShortName { get; } = "SS";
public string[] UriScheme { get; } = {"ss","ssd"}; public string[] UriScheme { get; } = {"ss", "ssd"};
public Server ParseJObject(JObject j) public Server ParseJObject(JObject j)
{ {
@@ -42,7 +43,7 @@ namespace Netch.ServerEx.Shadowsocks
return "ss://" + ShareLink.URLSafeBase64Encode($"{server.EncryptMethod}:{server.Password}@{server.Hostname}:{server.Port}") + "#" + HttpUtility.UrlEncode(server.Remark); return "ss://" + ShareLink.URLSafeBase64Encode($"{server.EncryptMethod}:{server.Password}@{server.Hostname}:{server.Port}") + "#" + HttpUtility.UrlEncode(server.Remark);
} }
public ServerController GetController() public IServerController GetController()
{ {
return new SSController(); return new SSController();
} }

View File

@@ -1,7 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using Netch.Models; using Netch.Models;
namespace Netch.ServerEx.Shadowsocks namespace Netch.Servers.Shadowsocks
{ {
public class Shadowsocks : Server public class Shadowsocks : Server
{ {

View File

@@ -0,0 +1,39 @@
using Netch.Forms;
namespace Netch.Servers.ShadowsocksR.Form
{
public class ShadowsocksRForm : ServerForm
{
protected override string TypeName { get; } = "ShadowsocksR";
public ShadowsocksRForm(ShadowsocksR server = default)
{
server ??= new ShadowsocksR();
Server = server;
CreateTextBox("Password", "Password",
s => true,
s => server.Password = s,
server.Password);
CreateComboBox("EncryptMethod", "Encrypt Method",
SSRGlobal.EncryptMethods,
s => server.EncryptMethod = s,
server.EncryptMethod);
CreateComboBox("Protocol", "Protocol",
SSRGlobal.Protocols,
s => server.Protocol = s,
server.Protocol);
CreateTextBox("ProtocolParam", "Protocol Param",
s => true,
s => server.ProtocolParam = s,
server.ProtocolParam);
CreateComboBox("OBFS", "OBFS",
SSRGlobal.OBFSs,
s => server.OBFS = s,
server.OBFS);
CreateTextBox("OBFSParam", "OBFS Param",
s => true,
s => server.OBFSParam = s,
server.OBFSParam);
}
}
}

View File

@@ -1,25 +1,27 @@
using System.Text; using System.Text;
using Netch.Controllers;
using Netch.Models; using Netch.Models;
using Netch.Utils;
namespace Netch.ServerEx.ShadowsocksR namespace Netch.Servers.ShadowsocksR
{ {
public class SSRController : ServerController public class SSRController : Guard, IServerController
{ {
public SSRController() public override string MainFile { get; protected set; } = "ShadowsocksR.exe";
{
Name = "ShadowsocksR";
MainFile = "ShadowsocksR.exe";
}
public override string Name { get; protected set; } = "ShadowsocksR";
public override bool Start(Server s, Mode mode) public int? Socks5LocalPort { get; set; }
public string LocalAddress { get; set; }
public bool Start(Server s, Mode mode)
{ {
var server = (ShadowsocksR) s; var server = (ShadowsocksR) s;
#region Argument #region Argument
var argument = new StringBuilder(); var argument = new StringBuilder();
argument.Append($"-s {server.Hostname} -p {server.Port} -k \"{server.Password}\" -m {server.EncryptMethod} -t 120"); argument.Append($"-s {DNS.Lookup(server.Hostname)} -p {server.Port} -k \"{server.Password}\" -m {server.EncryptMethod} -t 120");
if (!string.IsNullOrEmpty(server.Protocol)) if (!string.IsNullOrEmpty(server.Protocol))
{ {
argument.Append($" -O {server.Protocol}"); argument.Append($" -O {server.Protocol}");
@@ -32,7 +34,7 @@ namespace Netch.ServerEx.ShadowsocksR
if (!string.IsNullOrEmpty(server.OBFSParam)) argument.Append($" -g \"{server.OBFSParam}\""); if (!string.IsNullOrEmpty(server.OBFSParam)) argument.Append($" -g \"{server.OBFSParam}\"");
} }
argument.Append($" -b {LocalAddress} -l {Socks5LocalPort} -u"); argument.Append($" -b {LocalAddress ?? Global.Settings.LocalAddress} -l {Socks5LocalPort ?? Global.Settings.Socks5LocalPort} -u");
if (mode.BypassChina) argument.Append(" --acl default.acl"); if (mode.BypassChina) argument.Append(" --acl default.acl");
#endregion #endregion

View File

@@ -1,19 +1,20 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Netch.Controllers;
using Netch.Models; using Netch.Models;
using Netch.ServerEx.ShadowsocksR.Form; using Netch.Servers.ShadowsocksR.Form;
using Netch.Utils; using Netch.Utils;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
namespace Netch.ServerEx.ShadowsocksR namespace Netch.Servers.ShadowsocksR
{ {
public class SSRUtil : IServerUtil public class SSRUtil : IServerUtil
{ {
public ushort Priority { get; } = 1; public ushort Priority { get; } = 1;
public string TypeName { get; } = "SSR"; public string TypeName { get; } = "SSR";
public string FullName { get; } = "ShadowsocksR"; public string FullName { get; } = "ShadowsocksR";
public string ShortName { get; } = "SR";
public string[] UriScheme { get; } = {"ssr"}; public string[] UriScheme { get; } = {"ssr"};
public Server ParseJObject(JObject j) public Server ParseJObject(JObject j)
@@ -24,7 +25,7 @@ namespace Netch.ServerEx.ShadowsocksR
public void Edit(Server s) public void Edit(Server s)
{ {
new ShadowsocksRForm(s).ShowDialog(); new ShadowsocksRForm((ShadowsocksR) s).ShowDialog();
} }
public void Create() public void Create()
@@ -42,7 +43,7 @@ namespace Netch.ServerEx.ShadowsocksR
return "ssr://" + ShareLink.URLSafeBase64Encode($"{server.Hostname}:{server.Port}:{server.Protocol}:{server.EncryptMethod}:{server.OBFS}:{ShareLink.URLSafeBase64Encode(server.Password)}{paraStr}"); return "ssr://" + ShareLink.URLSafeBase64Encode($"{server.Hostname}:{server.Port}:{server.Protocol}:{server.EncryptMethod}:{server.OBFS}:{ShareLink.URLSafeBase64Encode(server.Password)}{paraStr}");
} }
public ServerController GetController() public IServerController GetController()
{ {
return new SSRController(); return new SSRController();
} }

View File

@@ -1,7 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using Netch.Models; using Netch.Models;
namespace Netch.ServerEx.ShadowsocksR namespace Netch.Servers.ShadowsocksR
{ {
public class ShadowsocksR : Server public class ShadowsocksR : Server
{ {

View File

@@ -0,0 +1,15 @@
using Netch.Forms;
namespace Netch.Servers.Socks5.Form
{
public class Socks5Form : ServerForm
{
protected override string TypeName { get; } = "Socks5";
public Socks5Form(Socks5 server = default)
{
server ??= new Socks5();
Server = server;
}
}
}

View File

@@ -1,17 +1,18 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Netch.Controllers;
using Netch.Models; using Netch.Models;
using Netch.ServerEx.Socks5.Form; using Netch.Servers.Socks5.Form;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
namespace Netch.ServerEx.Socks5 namespace Netch.Servers.Socks5
{ {
public class S5Util : IServerUtil public class S5Util : IServerUtil
{ {
public ushort Priority { get; } = 0; public ushort Priority { get; } = 0;
public string TypeName { get; } = "Socks5"; public string TypeName { get; } = "Socks5";
public string FullName { get; } = "Socks5"; public string FullName { get; } = "Socks5";
public string ShortName { get; } = "S5";
public string[] UriScheme { get; } = { }; public string[] UriScheme { get; } = { };
public Server ParseJObject(JObject j) public Server ParseJObject(JObject j)
@@ -21,7 +22,7 @@ namespace Netch.ServerEx.Socks5
public void Edit(Server s) public void Edit(Server s)
{ {
new Socks5Form(s).ShowDialog(); new Socks5Form((Socks5) s).ShowDialog();
} }
public void Create() public void Create()
@@ -35,7 +36,7 @@ namespace Netch.ServerEx.Socks5
return $"https://t.me/socks?server={server.Hostname}&port={server.Port}"; return $"https://t.me/socks?server={server.Hostname}&port={server.Port}";
} }
public ServerController GetController() public IServerController GetController()
{ {
return null; return null;
} }

View File

@@ -1,6 +1,6 @@
using Netch.Models; using Netch.Models;
namespace Netch.ServerEx.Socks5 namespace Netch.Servers.Socks5
{ {
public class Socks5 : Server public class Socks5 : Server
{ {

View File

@@ -0,0 +1,23 @@
using Netch.Forms;
namespace Netch.Servers.Trojan.Form
{
public class TrojanForm : ServerForm
{
protected override string TypeName { get; } = "Trojan";
public TrojanForm(Trojan server = default)
{
server ??= new Trojan();
Server = server;
CreateTextBox("Password", "Password",
s => true,
s => server.Password = s,
server.Password);
CreateTextBox("Host", "Host",
s => true,
s => server.Host = s,
server.Host);
}
}
}

View File

@@ -1,6 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
namespace Netch.ServerEx.Trojan.Models namespace Netch.Servers.Trojan.Models
{ {
public class TrojanConfig public class TrojanConfig
{ {

View File

@@ -1,6 +1,6 @@
using Netch.Models; using Netch.Models;
namespace Netch.ServerEx.Trojan namespace Netch.Servers.Trojan
{ {
public class Trojan : Server public class Trojan : Server
{ {

View File

@@ -1,29 +1,35 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using Netch.Controllers;
using Netch.Models; using Netch.Models;
using Netch.ServerEx.Trojan.Models; using Netch.Servers.Trojan.Models;
using Netch.Utils;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace Netch.ServerEx.Trojan namespace Netch.Servers.Trojan
{ {
public class TrojanController : ServerController public class TrojanController : Guard, IServerController
{ {
public TrojanController() public TrojanController()
{ {
Name = "Trojan";
MainFile = "Trojan.exe";
StartedKeywords.Add("started"); StartedKeywords.Add("started");
StoppedKeywords.Add("exiting"); StoppedKeywords.Add("exiting");
} }
public override bool Start(Server s, Mode mode) public override string MainFile { get; protected set; } = "Trojan.exe";
public override string Name { get; protected set; } = "Trojan";
public int? Socks5LocalPort { get; set; }
public string LocalAddress { get; set; }
public bool Start(Server s, Mode mode)
{ {
var server = (Trojan) s; var server = (Trojan) s;
File.WriteAllText("data\\last.json", JsonConvert.SerializeObject(new TrojanConfig File.WriteAllText("data\\last.json", JsonConvert.SerializeObject(new TrojanConfig
{ {
local_addr = LocalAddress, local_addr = LocalAddress ?? Global.Settings.LocalAddress,
local_port = Socks5LocalPort, local_port = Socks5LocalPort ?? Global.Settings.Socks5LocalPort,
remote_addr = server.Hostname, remote_addr = DNS.Lookup(server.Hostname).ToString(),
remote_port = server.Port, remote_port = server.Port,
password = new List<string> password = new List<string>
{ {

View File

@@ -2,18 +2,19 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Web; using System.Web;
using Netch.Controllers;
using Netch.Models; using Netch.Models;
using Netch.ServerEx.Trojan.Form; using Netch.Servers.Trojan.Form;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
namespace Netch.ServerEx.Trojan namespace Netch.Servers.Trojan
{ {
public class TrojanUtil : IServerUtil public class TrojanUtil : IServerUtil
{ {
public ushort Priority { get; } = 2; public ushort Priority { get; } = 3;
public string TypeName { get; } = "Trojan"; public string TypeName { get; } = "Trojan";
public string FullName { get; } = "Trojan"; public string FullName { get; } = "Trojan";
public string ShortName { get; } = "TR";
public string[] UriScheme { get; } = {"trojan"}; public string[] UriScheme { get; } = {"trojan"};
public Server ParseJObject(JObject j) public Server ParseJObject(JObject j)
@@ -23,7 +24,7 @@ namespace Netch.ServerEx.Trojan
public void Edit(Server s) public void Edit(Server s)
{ {
new TrojanForm(s).ShowDialog(); new TrojanForm((Trojan) s).ShowDialog();
} }
public void Create() public void Create()
@@ -37,7 +38,7 @@ namespace Netch.ServerEx.Trojan
return ""; return "";
} }
public ServerController GetController() public IServerController GetController()
{ {
return new TrojanController(); return new TrojanController();
} }

View File

@@ -0,0 +1,58 @@
using Netch.Forms;
namespace Netch.Servers.VMess.Form
{
public class VMessForm : ServerForm
{
protected override string TypeName { get; } = "VMess";
public VMessForm(VMess server = default)
{
server ??= new VMess();
Server = server;
CreateTextBox("UserId", "User ID",
s => true,
s => server.UserID = s,
server.UserID);
CreateTextBox("AlterId", "Alter ID",
s => int.TryParse(s, out _),
s => server.AlterID = int.Parse(s),
server.AlterID.ToString(),
76);
CreateComboBox("EncryptMethod", "Encrypt Method",
VMessGlobal.EncryptMethods,
s => server.EncryptMethod = s,
server.EncryptMethod);
CreateComboBox("TransferProtocol", "Transfer Protocol",
VMessGlobal.TransferProtocols,
s => server.TransferProtocol = s,
server.TransferProtocol);
CreateComboBox("FakeType", "Fake Type",
VMessGlobal.FakeTypes,
s => server.FakeType = s,
server.FakeType);
CreateTextBox("Host", "Host",
s => true,
s => server.Host = s,
server.Host);
CreateTextBox("Path", "Path",
s => true,
s => server.Path = s,
server.Path);
CreateComboBox("QUICSecurity", "QUIC Security",
VMessGlobal.QUIC,
s => server.QUIC = s,
server.QUIC);
CreateTextBox("QUICSecret", "QUIC Secret",
s => true,
s => server.QUICSecret = s,
server.QUICSecret);
CreateCheckBox("UseMux", "Use Mux",
s => server.UseMux = s,
server.UseMux);
CreateCheckBox("TLSSecure", "TLS Secure",
s => server.TLSSecure = s,
server.TLSSecure);
}
}
}

View File

@@ -1,6 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
namespace Netch.ServerEx.VMess.Models namespace Netch.Servers.VMess.Models
{ {
public class VMessConfig public class VMessConfig
{ {

View File

@@ -1,4 +1,4 @@
namespace Netch.ServerEx.VMess.Models namespace Netch.Servers.VMess.Models
{ {
/// <summary> /// <summary>
/// 使用 v2rayN 定义的 VMess 链接格式 /// 使用 v2rayN 定义的 VMess 链接格式

View File

@@ -1,7 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using Netch.Models; using Netch.Models;
namespace Netch.ServerEx.VMess namespace Netch.Servers.VMess
{ {
public class VMess : Server public class VMess : Server
{ {

View File

@@ -1,22 +1,29 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using Netch.Controllers;
using Netch.Models; using Netch.Models;
using Netch.ServerEx.VMess.Models; using Netch.Servers.VMess.Models;
using Netch.Utils;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace Netch.ServerEx.VMess namespace Netch.Servers.VMess
{ {
public class VMessController : ServerController public class VMessController : Guard, IServerController
{ {
public VMessController() public VMessController()
{ {
Name = "V2Ray";
MainFile = "v2ray.exe";
StartedKeywords.Add("started"); StartedKeywords.Add("started");
StoppedKeywords.AddRange(new[] {"config file not readable", "failed to"}); StoppedKeywords.AddRange(new[] {"config file not readable", "failed to"});
} }
public override bool Start(Server s, Mode mode)
public override string Name { get; protected set; } = "V2Ray";
public override string MainFile { get; protected set; } = "v2ray.exe";
public int? Socks5LocalPort { get; set; }
public string LocalAddress { get; set; }
public bool Start(Server s, Mode mode)
{ {
var server = (VMess) s; var server = (VMess) s;
File.WriteAllText("data\\last.json", JsonConvert.SerializeObject(new VMessConfig.Config() File.WriteAllText("data\\last.json", JsonConvert.SerializeObject(new VMessConfig.Config()
@@ -26,8 +33,8 @@ namespace Netch.ServerEx.VMess
new VMessConfig.Inbounds new VMessConfig.Inbounds
{ {
settings = new VMessConfig.InboundSettings(), settings = new VMessConfig.InboundSettings(),
port = Socks5LocalPort, port = Socks5LocalPort ?? Global.Settings.Socks5LocalPort,
listen = LocalAddress listen = LocalAddress ?? Global.Settings.LocalAddress
} }
}, },
outbounds = new List<VMessConfig.Outbounds> outbounds = new List<VMessConfig.Outbounds>
@@ -40,7 +47,7 @@ namespace Netch.ServerEx.VMess
{ {
new VMessConfig.VNext new VMessConfig.VNext
{ {
address = server.Hostname, address = DNS.Lookup(server.Hostname).ToString(),
port = server.Port, port = server.Port,
users = new List<VMessConfig.User> users = new List<VMessConfig.User>
{ {

View File

@@ -1,18 +1,20 @@
using System.Collections.Generic; using System.Collections.Generic;
using Netch.Controllers;
using Netch.Models; using Netch.Models;
using Netch.ServerEx.VMess.Form; using Netch.Servers.VMess.Form;
using Netch.ServerEx.VMess.Models; using Netch.Servers.VMess.Models;
using Netch.Utils; using Netch.Utils;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
namespace Netch.ServerEx.VMess namespace Netch.Servers.VMess
{ {
public class VMessUtil : IServerUtil public class VMessUtil : IServerUtil
{ {
public ushort Priority { get; } = 2; public ushort Priority { get; } = 3;
public string TypeName { get; } = "VMess"; public string TypeName { get; } = "VMess";
public string FullName { get; } = "VMess"; public string FullName { get; } = "VMess";
public string ShortName { get; } = "V2";
public string[] UriScheme { get; } = {"vmess"}; public string[] UriScheme { get; } = {"vmess"};
public Server ParseJObject(JObject j) public Server ParseJObject(JObject j)
@@ -22,7 +24,7 @@ namespace Netch.ServerEx.VMess
public void Edit(Server s) public void Edit(Server s)
{ {
new VMessForm(s).ShowDialog(); new VMessForm((VMess) s).ShowDialog();
} }
public void Create() public void Create()
@@ -51,7 +53,7 @@ namespace Netch.ServerEx.VMess
return "vmess://" + ShareLink.URLSafeBase64Encode(vmessJson); return "vmess://" + ShareLink.URLSafeBase64Encode(vmessJson);
} }
public ServerController GetController() public IServerController GetController()
{ {
return new VMessController(); return new VMessController();
} }

View File

@@ -73,11 +73,13 @@ namespace Netch.Utils
} }
else if (MainController.ServerController != null) else if (MainController.ServerController != null)
{ {
instances.Add(MainController.ServerController.Instance); if (MainController.ServerController is Guard instanceController)
instances.Add(instanceController.Instance);
} }
else if (MainController.ModeController != null) else if (MainController.ModeController != null)
{ {
instances.Add(MainController.ModeController.Instance); if (MainController.ModeController is Guard instanceController)
instances.Add(instanceController.Instance);
} }
var processList = instances.Select(instance => instance.Id).ToList(); var processList = instances.Select(instance => instance.Id).ToList();

View File

@@ -32,7 +32,7 @@ namespace Netch.Utils
foreach (JObject server in settingJObject["Server"]) foreach (JObject server in settingJObject["Server"])
{ {
var serverResult = Servers.ParseJObject(server); var serverResult = ServerHelper.ParseJObject(server);
if (serverResult != null) if (serverResult != null)
Global.Settings.Server.Add(serverResult); Global.Settings.Server.Add(serverResult);
} }

View File

@@ -5,7 +5,7 @@ using NetFwTypeLib;
namespace Netch.Utils namespace Netch.Utils
{ {
public class Firewall public static class Firewall
{ {
private static readonly string[] ProgramPath = private static readonly string[] ProgramPath =
{ {

View File

@@ -1,33 +1,30 @@
using System; using System;
using System.Linq;
using System.Management; using System.Management;
using Netch.Utils; using Netch.Controllers;
using Netch.Models.WinFW;
using NETCONLib; using NETCONLib;
using WinFW;
namespace Netch.Controllers namespace Netch.Utils
{ {
public class ICSController public static class ICSHelper
{ {
public static bool Enabled public static bool Enabled
{ {
get get
{ {
TUNTAPController.SearchTapAdapter(); TUNTAPController.SearchTapAdapter();
foreach (NetworkConnection connection in new NetworkConnectionCollection()) return (
{ from NetworkConnection connection in new NetworkConnectionCollection()
if (connection.DeviceName == Global.TUNTAP.Adapter.Description) where connection.DeviceName == Global.TUNTAP.Adapter.Description
{ select connection.SharingEnabled
return connection.SharingEnabled; ).FirstOrDefault();
}
}
return false;
} }
} }
public static bool Enable() public static bool Enable()
{ {
Utils.Utils.SearchOutboundAdapter(); Utils.SearchOutboundAdapter(false);
TUNTAPController.SearchTapAdapter(); TUNTAPController.SearchTapAdapter();
if (Global.TUNTAP.Adapter == null || Global.Outbound.Adapter == null) if (Global.TUNTAP.Adapter == null || Global.Outbound.Adapter == null)
@@ -41,10 +38,7 @@ namespace Netch.Controllers
#region Save Outbound IP Config #region Save Outbound IP Config
var wmi = new ManagementClass("Win32_NetworkAdapterConfiguration"); bool dhcpEnabled;
var moc = wmi.GetInstances();
var dhcpEnabled = true;
string[] ipAddress = null; string[] ipAddress = null;
string[] subnetMask = null; string[] subnetMask = null;
string[] gateway = null; string[] gateway = null;
@@ -101,19 +95,19 @@ namespace Netch.Controllers
else else
{ {
//Set static IP and subnet mask //Set static IP and subnet mask
var newIP = outboundWmi.GetMethodParameters("EnableStatic"); var ip = outboundWmi.GetMethodParameters("EnableStatic");
newIP["IPAddress"] = ipAddress; ip["IPAddress"] = ipAddress;
newIP["SubnetMask"] = subnetMask; ip["SubnetMask"] = subnetMask;
outboundWmi.InvokeMethod("EnableStatic", newIP, null); outboundWmi.InvokeMethod("EnableStatic", ip, null);
//Set default gateway //Set default gateway
var newGateway = outboundWmi.GetMethodParameters("SetGateways"); var newGateway = outboundWmi.GetMethodParameters("SetGateways");
newGateway["DefaultIPGateway"] = gateway; newGateway["DefaultIPGateway"] = gateway;
newGateway["GatewayCostMetric"] = gatewayMetric; newGateway["GatewayCostMetric"] = gatewayMetric;
outboundWmi.InvokeMethod("SetGateways", newGateway, null); outboundWmi.InvokeMethod("SetGateways", newGateway, null);
//Set dns servers //Set dns servers
var newDNS = outboundWmi.GetMethodParameters("SetDNSServerSearchOrder"); var newDns = outboundWmi.GetMethodParameters("SetDNSServerSearchOrder");
newDNS["DNSServerSearchOrder"] = dns; newDns["DNSServerSearchOrder"] = dns;
outboundWmi.InvokeMethod("SetDNSServerSearchOrder", newDNS, null); outboundWmi.InvokeMethod("SetDNSServerSearchOrder", newDns, null);
} }
#endregion #endregion
@@ -139,10 +133,9 @@ namespace Netch.Controllers
public static void Disable() public static void Disable()
{ {
foreach (NetworkConnection connection in new NetworkConnectionCollection()) foreach (var connection in new NetworkConnectionCollection().Cast<NetworkConnection>().Where(connection => connection.SharingEnabled))
{ {
if (connection.SharingEnabled) connection.DisableSharing();
connection.DisableSharing();
} }
CleanupWMISharingEntries(); CleanupWMISharingEntries();
@@ -153,25 +146,27 @@ namespace Netch.Controllers
var scope = new ManagementScope("root\\Microsoft\\HomeNet"); var scope = new ManagementScope("root\\Microsoft\\HomeNet");
scope.Connect(); scope.Connect();
var options = new PutOptions(); var searchResults = new ManagementObjectSearcher(scope, new ObjectQuery("SELECT * FROM HNet_ConnectionProperties"));
options.Type = PutType.UpdateOnly; foreach (var o in searchResults.Get())
var query = new ObjectQuery("SELECT * FROM HNet_ConnectionProperties");
var srchr = new ManagementObjectSearcher(scope, query);
foreach (ManagementObject entry in srchr.Get())
{ {
var entry = (ManagementObject) o;
if ((bool) entry["IsIcsPrivate"]) if ((bool) entry["IsIcsPrivate"])
entry["IsIcsPrivate"] = false; entry["IsIcsPrivate"] = false;
if ((bool) entry["IsIcsPublic"]) if ((bool) entry["IsIcsPublic"])
entry["IsIcsPublic"] = false; entry["IsIcsPublic"] = false;
entry.Put(options);
entry.Put(new PutOptions
{
Type = PutType.UpdateOnly
});
} }
} }
public static ManagementObject GetManagementObjectByDeviceNameOrDefault(string deviceName) private static ManagementObject GetManagementObjectByDeviceNameOrDefault(string deviceName)
{ {
foreach (ManagementObject mo in new ManagementClass("Win32_NetworkAdapterConfiguration").GetInstances()) foreach (var o in new ManagementClass("Win32_NetworkAdapterConfiguration").GetInstances())
{ {
var mo = (ManagementObject) o;
if (((string) mo["Caption"]).EndsWith(deviceName)) if (((string) mo["Caption"]).EndsWith(deviceName))
{ {
return mo; return mo;

View File

@@ -6,7 +6,7 @@ using Netch.Models;
namespace Netch.Utils namespace Netch.Utils
{ {
public static class Modes public static class ModeHelper
{ {
private const string MODE_DIR = "mode"; private const string MODE_DIR = "mode";
@@ -64,18 +64,17 @@ namespace Netch.Utils
if (i == 0) if (i == 0)
{ {
var splited = text.Substring(text.IndexOf('#') + 1).Split(',').Select(s => s.Trim()).ToArray();
try try
{ {
string tmp; var splited = text.Substring(text.IndexOf('#') + 1).Split(',').Select(s => s.Trim()).ToArray();
if ((tmp = splited.ElementAtOrDefault(0)) != null)
mode.Remark = i18N.Translate(tmp);
tmp = splited.ElementAtOrDefault(1); mode.Remark = splited[0];
mode.Type = tmp != null ? int.Parse(tmp) : 0;
if ((tmp = splited.ElementAtOrDefault(2)) != null) var result = int.TryParse(splited.ElementAtOrDefault(1), out var type);
mode.BypassChina = int.Parse(tmp) == 1; mode.Type = result ? type : 0;
var result1 = int.TryParse(splited.ElementAtOrDefault(2), out var bypassChina);
mode.BypassChina = result1 && bypassChina == 1;
} }
catch catch
{ {

View File

@@ -5,7 +5,7 @@ using System.Text;
namespace Netch.Utils namespace Netch.Utils
{ {
public class OnlyInstance public static class OnlyInstance
{ {
public enum Commands public enum Commands
{ {

View File

@@ -7,11 +7,11 @@ using Newtonsoft.Json.Linq;
namespace Netch.Utils namespace Netch.Utils
{ {
public static class Servers public static class ServerHelper
{ {
public static readonly IEnumerable<IServerUtil> ServerUtils; public static readonly IEnumerable<IServerUtil> ServerUtils;
static Servers() static ServerHelper()
{ {
var serversUtilsTypes = Assembly.GetExecutingAssembly().GetExportedTypes().Where(type => type.GetInterfaces().Any(t => t == typeof(IServerUtil))); var serversUtilsTypes = Assembly.GetExecutingAssembly().GetExportedTypes().Where(type => type.GetInterfaces().Any(t => t == typeof(IServerUtil)));
ServerUtils = serversUtilsTypes.Select(t => (IServerUtil) Activator.CreateInstance(t)).OrderBy(util => util.Priority); ServerUtils = serversUtilsTypes.Select(t => (IServerUtil) Activator.CreateInstance(t)).OrderBy(util => util.Priority);

View File

@@ -3,8 +3,8 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using Netch.ServerEx.Shadowsocks; using Netch.Servers.Shadowsocks;
using Netch.ServerEx.Shadowsocks.Models; using Netch.Servers.Shadowsocks.Models;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using Server = Netch.Models.Server; using Server = Netch.Models.Server;
@@ -105,7 +105,7 @@ namespace Netch.Utils
public static string GetShareLink(Server server) public static string GetShareLink(Server server)
{ {
return Servers.GetUtilByTypeName(server.Type).GetShareLink(server); return ServerHelper.GetUtilByTypeName(server.Type).GetShareLink(server);
} }
public static List<Server> ParseText(string text) public static List<Server> ParseText(string text)
@@ -169,7 +169,7 @@ namespace Netch.Utils
{ {
if (text.StartsWith("tg://socks?") || text.StartsWith("https://t.me/socks?")) if (text.StartsWith("tg://socks?") || text.StartsWith("https://t.me/socks?"))
{ {
list.AddRange(Servers.GetUtilByTypeName("Socks5").ParseUri(text)); list.AddRange(ServerHelper.GetUtilByTypeName("Socks5").ParseUri(text));
} }
else if (text.StartsWith("Netch://")) else if (text.StartsWith("Netch://"))
{ {
@@ -178,7 +178,7 @@ namespace Netch.Utils
else else
{ {
var scheme = GetUriScheme(text); var scheme = GetUriScheme(text);
var util = Servers.GetUtilByUriScheme(scheme); var util = ServerHelper.GetUtilByUriScheme(scheme);
if (util == null) if (util == null)
{ {
Logging.Warning($"无法处理 {scheme} 协议订阅链接"); Logging.Warning($"无法处理 {scheme} 协议订阅链接");
@@ -230,8 +230,8 @@ namespace Netch.Utils
} }
var type = (string) NetchLink["Type"]; var type = (string) NetchLink["Type"];
var s = Servers.GetUtilByTypeName(type).ParseJObject(NetchLink); var s = ServerHelper.GetUtilByTypeName(type).ParseJObject(NetchLink);
return Servers.GetUtilByTypeName(s.Type).CheckServer(s) ? s : null; return ServerHelper.GetUtilByTypeName(s.Type).CheckServer(s) ? s : null;
} }
public static string GetNetchLink(Server s) public static string GetNetchLink(Server s)

View File

@@ -51,7 +51,7 @@ namespace Netch.Utils
/// <returns>适配器名称</returns> /// <returns>适配器名称</returns>
public static string GetName(string componentId) public static string GetName(string componentId)
{ {
var registry = Registry.LocalMachine.OpenSubKey(string.Format("{0}\\{1}\\Connection", NETWORK_KEY, componentId)); var registry = Registry.LocalMachine.OpenSubKey($"{NETWORK_KEY}\\{componentId}\\Connection");
return registry.GetValue("Name", "").ToString(); return registry.GetValue("Name", "").ToString();
} }
@@ -70,7 +70,7 @@ namespace Netch.Utils
/// </summary> /// </summary>
public static void deltapall() public static void deltapall()
{ {
Logging.Info("正在卸载 TUN/TAP 适配器"); Logging.Info("卸载 TUN/TAP 适配器");
var installProcess = new Process {StartInfo = {WindowStyle = ProcessWindowStyle.Hidden, FileName = Path.Combine("bin/tap-driver", "deltapall.bat")}}; var installProcess = new Process {StartInfo = {WindowStyle = ProcessWindowStyle.Hidden, FileName = Path.Combine("bin/tap-driver", "deltapall.bat")}};
installProcess.Start(); installProcess.Start();
installProcess.WaitForExit(); installProcess.WaitForExit();
@@ -82,7 +82,7 @@ namespace Netch.Utils
/// </summary> /// </summary>
public static void addtap() public static void addtap()
{ {
Logging.Info("正在安装 TUN/TAP 适配器"); Logging.Info("安装 TUN/TAP 适配器");
//安装Tap Driver //安装Tap Driver
var installProcess = new Process {StartInfo = {WindowStyle = ProcessWindowStyle.Hidden, FileName = Path.Combine("bin/tap-driver", "addtap.bat")}}; var installProcess = new Process {StartInfo = {WindowStyle = ProcessWindowStyle.Hidden, FileName = Path.Combine("bin/tap-driver", "addtap.bat")}};
installProcess.Start(); installProcess.Start();

View File

@@ -96,9 +96,9 @@ namespace Netch.Utils
{ {
try try
{ {
var SHA256 = System.Security.Cryptography.SHA256.Create(); var sha256 = System.Security.Cryptography.SHA256.Create();
var fileStream = File.OpenRead(filePath); var fileStream = File.OpenRead(filePath);
return SHA256.ComputeHash(fileStream).Aggregate(string.Empty, (current, b) => current + b.ToString("x2")); return sha256.ComputeHash(fileStream).Aggregate(string.Empty, (current, b) => current + b.ToString("x2"));
} }
catch catch
{ {
@@ -124,49 +124,40 @@ namespace Netch.Utils
} }
} }
public static string FileVersion(string file) => File.Exists(file) ? FileVersionInfo.GetVersionInfo(file).FileVersion : string.Empty; public static string GetFileVersion(string file) => File.Exists(file) ? FileVersionInfo.GetVersionInfo(file).FileVersion : string.Empty;
public static bool SearchOutboundAdapter(bool log = true) public static bool SearchOutboundAdapter(bool logging = true)
{ {
IPAddress localEnd; // 寻找出口适配器
try if (Win32Native.GetBestRoute(BitConverter.ToUInt32(IPAddress.Parse("114.114.114.114").GetAddressBytes(), 0),
{ 0, out var pRoute) != 0)
localEnd = WebUtil.BestLocalEndPoint(new IPEndPoint(0x72727272, 53)).Address;
}
catch
{ {
Logging.Error("GetBestRoute 搜索失败");
return false; return false;
} }
Global.Outbound.Index = pRoute.dwForwardIfIndex;
// 根据 IP Index 寻找 出口适配器
try try
{ {
// 根据 IP 寻找 出口适配器 var adapter = NetworkInterface.GetAllNetworkInterfaces().First(_ =>
Global.Outbound.Adapter = NetworkInterface.GetAllNetworkInterfaces().First(_ =>
{ {
try try
{ {
return _.GetIPProperties().UnicastAddresses.Any(ip => return _.GetIPProperties().GetIPv4Properties().Index == Global.Outbound.Index;
{
if (ip.Address.AddressFamily == AddressFamily.InterNetwork && ip.Address.ToString().Equals(localEnd.ToString()))
{
Global.Outbound.Index = _.GetIPProperties().GetIPv4Properties().Index;
return true;
}
return false;
});
} }
catch catch
{ {
return false; return false;
} }
}); });
Global.Outbound.Gateway = Global.Outbound.Adapter.GetIPProperties().GatewayAddresses[0].Address; Global.Outbound.Adapter = adapter;
if (log) Global.Outbound.Gateway = new IPAddress(pRoute.dwForwardNextHop);
if (logging)
{ {
Logging.Info($"出口 IPv4 地址:{Global.Outbound.Address}"); Logging.Info($"出口 IPv4 地址:{Global.Outbound.Address}");
Logging.Info($"出口 网关 地址:{Global.Outbound.Gateway}"); Logging.Info($"出口 网关 地址:{Global.Outbound.Gateway}");
Logging.Info($"出口适配器:{Global.Outbound.Adapter.Name} {Global.Outbound.Adapter.Id} {Global.Outbound.Adapter.Description}, index: {Global.Outbound.Index}"); Logging.Info($"出口适配器:{adapter.Name} {adapter.Id} {adapter.Description}, index: {Global.Outbound.Index}");
} }
return true; return true;

View File

@@ -6,7 +6,7 @@ using System.Threading.Tasks;
namespace Netch.Utils namespace Netch.Utils
{ {
public class WebUtil public static class WebUtil
{ {
public const string DefaultUserAgent = public const string DefaultUserAgent =
@"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"; @"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36";

View File

@@ -1,11 +1,347 @@
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Text;
namespace Netch namespace Netch
{ {
public static class Win32Native public static class Win32Native
{ {
public enum ForwardType
{
Other = 1,
Invalid = 2,
Direct = 3,
Indirect = 4
}
public enum ForwardProtocol
{
Other = 1,
Local = 2,
NetMGMT = 3,
ICMP = 4,
EGP = 5,
GGP = 6,
Hello = 7,
RIP = 8,
IS_IS = 9,
ES_IS = 10, // 0x0000000A
CISCO = 11, // 0x0000000B
BBN = 12, // 0x0000000C
OSPF = 13, // 0x0000000D
BGP = 14, // 0x0000000E
NT_AUTOSTATIC = 10002, // 0x00002712
NT_STATIC = 10006, // 0x00002716
NT_STATIC_NON_DOD = 10007 // 0x00002717
}
public class RouteEntry
{
internal MIB_IPFORWARDROW _ipFwdNative;
private int _metric1;
private int _metric2;
private int _metric3;
private int _metric4;
private int _metric5;
private IPAddress _destination;
private IPAddress _mask;
private int _policy;
private IPAddress _nextHop;
private NetworkInterface _interface;
private ForwardProtocol _protocol;
private ForwardType _type;
private int _nextHopAS;
private int _age;
private int _index;
public int Index
{
get => _index;
set => _index = value;
}
public IPAddress Destination
{
get => _destination;
set => _destination = value;
}
public IPAddress Mask
{
get => _mask;
set => _mask = value;
}
public int Policy
{
get => _policy;
set => _policy = value;
}
public IPAddress NextHop
{
get => _nextHop;
set => _nextHop = value;
}
public NetworkInterface RelatedInterface => _interface;
public string InterfaceName
{
get
{
if (RelatedInterface == null)
return string.Empty;
return RelatedInterface.Name;
}
}
public ForwardType ForwardType
{
get => _type;
set => _type = value;
}
public ForwardProtocol Protocol
{
get => _protocol;
set => _protocol = value;
}
public int Age
{
get => _age;
set => _age = value;
}
public int NextHopAS
{
get => _nextHopAS;
set => _nextHopAS = value;
}
public int Metric1
{
get => _metric1;
set => _metric1 = value;
}
public int Metric2
{
get => _metric2;
set => _metric2 = value;
}
public int Metric3
{
get => _metric3;
set => _metric3 = value;
}
public int Metric4
{
get => _metric4;
set => _metric4 = value;
}
public int Metric5
{
get => _metric5;
set => _metric5 = value;
}
public RouteEntry(
uint destination,
uint mask,
int policy,
uint nextHop,
NetworkInterface intf,
ForwardType type,
ForwardProtocol proto,
int age,
int nextHopAS,
int metric1,
int metric2,
int metric3,
int metric4,
int metric5,
int idx)
{
_age = age;
_policy = policy;
_protocol = proto;
_type = type;
_destination = new IPAddress(destination);
_mask = new IPAddress(mask);
_nextHop = new IPAddress(nextHop);
_nextHopAS = nextHopAS;
_interface = intf;
_metric1 = metric1;
_metric2 = metric2;
_metric3 = metric3;
_metric4 = metric4;
_metric5 = metric5;
_index = idx;
}
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct MIB_IFROW
{
private const int MAX_INTERFACE_NAME_LEN = 256;
private const int MAXLEN_IFDESCR = 256;
private const int MAXLEN_PHYSADDR = 8;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string wszName;
public int dwIndex;
public int dwType;
public int dwMtu;
public int dwSpeed;
public int dwPhysAddrLen;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] bPhysAddr;
public int dwAdminStatus;
public int dwOperStatus;
public int dwLastChange;
public int dwInOctets;
public int dwInUcastPkts;
public int dwInNUcastPkts;
public int dwInDiscards;
public int dwInErrors;
public int dwInUnknownProtos;
public int dwOutOctets;
public int dwOutUcastPkts;
public int dwOutNUcastPkts;
public int dwOutDiscards;
public int dwOutErrors;
public int dwOutQLen;
public int dwDescrLen;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
public byte[] bDescr;
}
public class AdaptersTable
{
private Dictionary<int, NetworkInterface> _adapters = new Dictionary<int, NetworkInterface>();
public IDictionary<int, NetworkInterface> GetAdapters()
{
return _adapters;
}
public NetworkInterface GetAdapter(int interfaceIndex)
{
NetworkInterface networkInterface = null;
_adapters.TryGetValue(interfaceIndex, out networkInterface);
return networkInterface;
}
public int GetAdapterIndex(NetworkInterface networkInterface)
{
return _adapters.First(a => a.Value == networkInterface).Key;
}
public AdaptersTable()
{
var num1 = IntPtr.Zero;
var pdwSize = 0;
var num2 = 0;
num2 = GetIfTable(IntPtr.Zero, ref pdwSize, true);
var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
try
{
num1 = Marshal.AllocHGlobal(pdwSize);
if (GetIfTable(num1, ref pdwSize, true) != 0)
return;
var num3 = Marshal.ReadInt32(num1);
var ptr = new IntPtr(num1.ToInt32() + 4);
for (var index = 0; index < num3; ++index)
{
var structure = (MIB_IFROW)Marshal.PtrToStructure(ptr, typeof(MIB_IFROW));
var pIfRow = new MIB_IFROW();
pIfRow.dwIndex = structure.dwIndex;
if (GetIfEntry(ref pIfRow) == 0)
{
var str = Encoding.ASCII.GetString(structure.bDescr, 0, pIfRow.dwDescrLen - 1);
foreach (var networkInterface in networkInterfaces)
{
if (networkInterface.Description == str)
{
_adapters.Add(structure.dwIndex, networkInterface);
break;
}
}
}
ptr = new IntPtr(ptr.ToInt32() + Marshal.SizeOf(typeof(MIB_IFROW)));
}
}
catch (Exception)
{
// ignored
}
finally
{
Marshal.FreeHGlobal(num1);
}
}
}
public struct MIB_IPFORWARDROW
{
public uint dwForwardDest;
public uint dwForwardMask;
public int dwForwardPolicy;
public uint dwForwardNextHop;
public int dwForwardIfIndex;
public ForwardType dwForwardType;
public ForwardProtocol dwForwardProto;
public int dwForwardAge;
public int dwForwardNextHopAS;
public int dwForwardMetric1;
public int dwForwardMetric2;
public int dwForwardMetric3;
public int dwForwardMetric4;
public int dwForwardMetric5;
public static implicit operator MIB_IPFORWARDROW(RouteEntry value)
{
var mibIpforwardrow = new MIB_IPFORWARDROW();
mibIpforwardrow.dwForwardAge = value.Age;
mibIpforwardrow.dwForwardDest = BitConverter.ToUInt32(value.Destination.GetAddressBytes(), 0);
mibIpforwardrow.dwForwardMask = BitConverter.ToUInt32(value.Mask.GetAddressBytes(), 0);
mibIpforwardrow.dwForwardMetric1 = value.Metric1;
mibIpforwardrow.dwForwardMetric2 = value.Metric2;
mibIpforwardrow.dwForwardMetric3 = value.Metric3;
mibIpforwardrow.dwForwardMetric4 = value.Metric4;
mibIpforwardrow.dwForwardMetric5 = value.Metric5;
mibIpforwardrow.dwForwardNextHop = BitConverter.ToUInt32(value.NextHop.GetAddressBytes(), 0);
mibIpforwardrow.dwForwardNextHopAS = value.NextHopAS;
mibIpforwardrow.dwForwardPolicy = value.Policy;
mibIpforwardrow.dwForwardProto = value.Protocol;
mibIpforwardrow.dwForwardType = value.ForwardType;
var adaptersTable = new AdaptersTable();
mibIpforwardrow.dwForwardIfIndex = adaptersTable.GetAdapterIndex(value.RelatedInterface);
return mibIpforwardrow;
}
}
[DllImport("iphlpapi", SetLastError = true)]
public static extern int GetIfTable(IntPtr pIfTable, ref int pdwSize, bool bOrder);
[DllImport("iphlpapi", SetLastError = true)]
public static extern int GetIfEntry(ref MIB_IFROW pIfRow);
[DllImport("iphlpapi", SetLastError = true)]
public static extern int GetBestRoute(uint dwDestAddr, int dwSourceAddr, out MIB_IPFORWARDROW pRoute);
[DllImport("User32", CharSet = CharSet.Auto, ExactSpelling = true)] [DllImport("User32", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetForegroundWindow(); public static extern IntPtr GetForegroundWindow();
[DllImport("WinINet")]
public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength);
} }
} }

3
Test/.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
/bin
/obj
/Netch.csproj.user

View File

@@ -0,0 +1,35 @@
using System.Reflection;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Test")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Test")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("53397641-35CA-4336-8E22-2CE12EF476AC")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

64
Test/Test.csproj Normal file
View File

@@ -0,0 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{53397641-35CA-4336-8E22-2CE12EF476AC}</ProjectGuid>
<ProjectTypeGuids>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Test</RootNamespace>
<AssemblyName>Test</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Data" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="nunit.framework, Version=3.5.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb">
<HintPath>..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Tests.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Netch\Netch.csproj">
<Project>{4b041b91-5790-4571-8c58-c63ffe4bc9f8}</Project>
<Name>Netch</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

52
Test/Tests.cs Normal file
View File

@@ -0,0 +1,52 @@
using System.Linq;
using System.Windows.Forms;
using Netch.Servers.ShadowsocksR.Form;
using Netch.Servers.ShadowsocksR;
using Netch.Servers.VMess;
using Netch.Servers.VMess.Form;
using Netch.Utils;
using NUnit.Framework;
namespace Test
{
[TestFixture]
public class Tests
{
[Test]
public void TestServerForm()
{
i18N.Load("zh-CN");
var server = ParseVMessUri();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new VMessForm(server));
}
private static ShadowsocksR ParseSSRUri()
{
return (ShadowsocksR) new SSRUtil().ParseUri(@"ssr://MTI3LjAuMC4xOjEyMzQ6YXV0aF9hZXMxMjhfbWQ1OmFlcy0xMjgtY2ZiOnRsczEuMl90aWNrZXRfYXV0aDpZV0ZoWW1KaS8_b2Jmc3BhcmFtPVluSmxZV3QzWVRFeExtMXZaUSZyZW1hcmtzPTVyV0w2Sy1WNUxpdDVwYUg").First();
}
private static VMess ParseVMessUri()
{
/*
{
"v": "2",
"ps": "备注别名",
"add": "111.111.111.111",
"port": "32000",
"id": "1386f85e-657b-4d6e-9d56-78badb75e1fd",
"aid": "100",
"net": "tcp",
"type": "none",
"host": "www.bbb.com",
"path": "/",
"tls": "tls"
}
*/
return (VMess) new VMessUtil().ParseUri(@"vmess://eyAidiI6ICIyIiwgInBzIjogIuWkh+azqOWIq+WQjSIsICJhZGQiOiAiMTExLjExMS4xMTEuMTExIiwgInBvcnQiOiAiMzIwMDAiLCAiaWQiOiAiMTM4NmY4NWUtNjU3Yi00ZDZlLTlkNTYtNzhiYWRiNzVlMWZkIiwgImFpZCI6ICIxMDAiLCAibmV0IjogInRjcCIsICJ0eXBlIjogIm5vbmUiLCAiaG9zdCI6ICJ3d3cuYmJiLmNvbSIsICJwYXRoIjogIi8iLCAidGxzIjogInRscyIgfQ==").First();
}
}
}

4
Test/packages.config Normal file
View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="NUnit" version="3.5.0" targetFramework="net45" />
</packages>

2
modes

Submodule modes updated: 309536b9b1...034c8583ad