1
0
mirror of https://github.com/proxysu/ProxySU.git synced 2024-11-28 16:16:07 +03:00
This commit is contained in:
autumn 2021-08-20 11:52:45 +08:00
parent b0d0e761de
commit 995d9ff435
71 changed files with 3036 additions and 282 deletions

View File

@ -22,7 +22,7 @@ namespace ProxySuper.Core.Models.Projects
/// <summary>
/// 类型
/// </summary>
ProjectType Type { get; set; }
//ProjectType Type { get; set; }
/// <summary>
/// 邮箱

View File

@ -6,5 +6,6 @@
TrojanGo = 1,
NaiveProxy = 2,
Brook = 3,
V2ray = 4,
}
}

View File

@ -1,6 +1,6 @@
namespace ProxySuper.Core.Models.Projects
{
public enum XrayType
public enum RayType
{
// 入口
VLESS_TCP_XTLS = 100,
@ -25,4 +25,6 @@
// SS
ShadowsocksAEAD = 401
}
}

View File

@ -0,0 +1,160 @@
using Newtonsoft.Json;
using ProxySuper.Core.Services;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
namespace ProxySuper.Core.Models.Projects
{
public partial class V2raySettings : IProjectSettings
{
public V2raySettings()
{
WithTLS = true;
var guid = Guid.NewGuid().ToString();
Port = 443;
VLESS_KCP_Port = 2001;
VLESS_gRPC_Port = 2002;
VMESS_KCP_Port = 3001;
ShadowSocksPort = 4001;
UUID = guid;
Types = new List<RayType>();
VLESS_WS_Path = "/" + Utils.RandomString(6);
VLESS_KCP_Type = "none";
VLESS_KCP_Seed = guid;
VLESS_gRPC_ServiceName = "/" + Utils.RandomString(7);
VMESS_WS_Path = "/" + Utils.RandomString(8);
VMESS_TCP_Path = "/" + Utils.RandomString(9);
VMESS_KCP_Seed = guid;
VMESS_KCP_Type = "none";
TrojanPassword = guid;
ShadowSocksPassword = guid;
ShadowSocksMethod = "aes-128-gcm";
}
[JsonIgnore]
public bool IsIPAddress
{
get
{
return IPAddress.TryParse(Domain, out _);
}
}
[JsonIgnore]
public List<int> FreePorts
{
get
{
var list = new List<int>();
list.Add(80);
list.Add(Port);
if (Types.Contains(RayType.VLESS_KCP))
{
list.Add(VLESS_KCP_Port);
}
if (Types.Contains(RayType.VMESS_KCP))
{
list.Add(VMESS_KCP_Port);
}
if (Types.Contains(RayType.ShadowsocksAEAD))
{
list.Add(ShadowSocksPort);
}
if (Types.Contains(RayType.VLESS_gRPC))
{
list.Add(VLESS_gRPC_Port);
}
return list.Distinct().ToList();
}
}
//public ProjectType Type { get; set; } = ProjectType.Xray;
/// <summary>
/// 是否安装证书,
/// 上传自有证书时选False则不会自动安装证书。
/// </summary>
public bool WithTLS { get; set; }
/// <summary>
/// 端口
/// </summary>
public int Port { get; set; }
/// <summary>
/// 域名
/// </summary>
public string Domain { get; set; }
/// <summary>
/// UUID
/// </summary>
public string UUID { get; set; }
/// <summary>
/// 多用户
/// </summary>
public List<string> MulitUUID { get; set; } = new List<string>();
/// <summary>
/// 伪装域名
/// </summary>
public string MaskDomain { get; set; }
[JsonIgnore]
public string Email
{
get
{
if (!string.IsNullOrEmpty(Domain))
{
var arr = Domain.Split('.');
if (arr.Length == 3)
{
return $"{arr[0]}@{arr[1]}.{arr[2]}";
}
}
return $"{UUID.Substring(2, 6)}@gmail.com";
}
}
/// <summary>
/// 安装类型
/// </summary>
public List<RayType> Types { get; set; } = new List<RayType>();
/// <summary>
/// 根据xray类型获取路径
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
public string GetPath(RayType type)
{
switch (type)
{
case RayType.VLESS_WS:
return VLESS_WS_Path;
case RayType.VMESS_TCP:
return VMESS_TCP_Path;
case RayType.VMESS_WS:
return VMESS_WS_Path;
default:
return string.Empty;
}
}
}
}

View File

@ -2,7 +2,7 @@
namespace ProxySuper.Core.Models.Projects
{
public partial class XraySettings
public partial class V2raySettings
{
/// <summary>
/// ss password
@ -23,7 +23,7 @@ namespace ProxySuper.Core.Models.Projects
{
get
{
return ShareLink.Build(XrayType.ShadowsocksAEAD, this);
return ShareLink.Build(RayType.ShadowsocksAEAD, this);
}
}
}

View File

@ -2,7 +2,7 @@
namespace ProxySuper.Core.Models.Projects
{
public partial class XraySettings
public partial class V2raySettings
{
public string TrojanPassword { get; set; }
@ -10,7 +10,7 @@ namespace ProxySuper.Core.Models.Projects
{
get
{
return ShareLink.Build(XrayType.Trojan_TCP, this);
return ShareLink.Build(RayType.Trojan_TCP, this);
}
}
}

View File

@ -2,19 +2,8 @@
namespace ProxySuper.Core.Models.Projects
{
public partial class XraySettings
public partial class V2raySettings
{
/// <summary>
/// vless xtls shareLink
/// </summary>
public string VLESS_TCP_XTLS_ShareLink
{
get
{
return ShareLink.Build(XrayType.VLESS_TCP_XTLS, this);
}
}
/// <summary>
/// vless tcp shareLink
/// </summary>
@ -22,7 +11,7 @@ namespace ProxySuper.Core.Models.Projects
{
get
{
return ShareLink.Build(XrayType.VLESS_TCP, this);
return ShareLink.Build(RayType.VLESS_TCP, this);
}
}
@ -38,7 +27,7 @@ namespace ProxySuper.Core.Models.Projects
{
get
{
return ShareLink.Build(XrayType.VLESS_WS, this);
return ShareLink.Build(RayType.VLESS_WS, this);
}
}
@ -64,7 +53,7 @@ namespace ProxySuper.Core.Models.Projects
{
get
{
return ShareLink.Build(XrayType.VLESS_KCP, this);
return ShareLink.Build(RayType.VLESS_KCP, this);
}
}
@ -85,7 +74,7 @@ namespace ProxySuper.Core.Models.Projects
{
get
{
return ShareLink.Build(XrayType.VLESS_gRPC, this);
return ShareLink.Build(RayType.VLESS_gRPC, this);
}
}
}

View File

@ -2,7 +2,7 @@
namespace ProxySuper.Core.Models.Projects
{
public partial class XraySettings
public partial class V2raySettings
{
/// <summary>
/// vmess websocket path
@ -16,7 +16,7 @@ namespace ProxySuper.Core.Models.Projects
{
get
{
return ShareLink.Build(XrayType.VMESS_WS, this);
return ShareLink.Build(RayType.VMESS_WS, this);
}
}
@ -32,7 +32,7 @@ namespace ProxySuper.Core.Models.Projects
{
get
{
return ShareLink.Build(XrayType.VMESS_TCP, this);
return ShareLink.Build(RayType.VMESS_TCP, this);
}
}
@ -58,7 +58,7 @@ namespace ProxySuper.Core.Models.Projects
{
get
{
return ShareLink.Build(XrayType.VMESS_KCP, this);
return ShareLink.Build(RayType.VMESS_KCP, this);
}
}
}

View File

@ -1,159 +1,22 @@
using Newtonsoft.Json;
using ProxySuper.Core.Services;
using ProxySuper.Core.Services;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace ProxySuper.Core.Models.Projects
{
public partial class XraySettings : IProjectSettings
public class XraySettings : V2raySettings
{
public XraySettings()
{
WithTLS = true;
var guid = Guid.NewGuid().ToString();
Port = 443;
VLESS_KCP_Port = 2001;
VLESS_gRPC_Port = 2002;
VMESS_KCP_Port = 3001;
ShadowSocksPort = 4001;
UUID = guid;
Types = new List<XrayType>();
VLESS_WS_Path = "/" + Utils.RandomString(6);
VLESS_KCP_Type = "none";
VLESS_KCP_Seed = guid;
VLESS_gRPC_ServiceName = "/" + Utils.RandomString(7);
VMESS_WS_Path = "/" + Utils.RandomString(8);
VMESS_TCP_Path = "/" + Utils.RandomString(9);
VMESS_KCP_Seed = guid;
VMESS_KCP_Type = "none";
TrojanPassword = guid;
ShadowSocksPassword = guid;
ShadowSocksMethod = "aes-128-gcm";
}
[JsonIgnore]
public bool IsIPAddress
/// <summary>
/// vless xtls shareLink
/// </summary>
public string VLESS_TCP_XTLS_ShareLink
{
get
{
return IPAddress.TryParse(Domain, out _);
}
}
[JsonIgnore]
public List<int> FreePorts
{
get
{
var list = new List<int>();
list.Add(80);
list.Add(Port);
if (Types.Contains(XrayType.VLESS_KCP))
{
list.Add(VLESS_KCP_Port);
}
if (Types.Contains(XrayType.VMESS_KCP))
{
list.Add(VMESS_KCP_Port);
}
if (Types.Contains(XrayType.ShadowsocksAEAD))
{
list.Add(ShadowSocksPort);
}
if (Types.Contains(XrayType.VLESS_gRPC))
{
list.Add(VLESS_gRPC_Port);
}
return list.Distinct().ToList();
}
}
public ProjectType Type { get; set; } = ProjectType.Xray;
/// <summary>
/// 是否安装证书,
/// 上传自有证书时选False则不会自动安装证书。
/// </summary>
public bool WithTLS { get; set; }
/// <summary>
/// 端口
/// </summary>
public int Port { get; set; }
/// <summary>
/// 域名
/// </summary>
public string Domain { get; set; }
/// <summary>
/// UUID
/// </summary>
public string UUID { get; set; }
/// <summary>
/// 多用户
/// </summary>
public List<string> MulitUUID { get; set; } = new List<string>();
/// <summary>
/// 伪装域名
/// </summary>
public string MaskDomain { get; set; }
[JsonIgnore]
public string Email
{
get
{
if (!string.IsNullOrEmpty(Domain))
{
var arr = Domain.Split('.');
if (arr.Length == 3)
{
return $"{arr[0]}@{arr[1]}.{arr[2]}";
}
}
return $"{UUID.Substring(2, 6)}@gmail.com";
}
}
/// <summary>
/// 安装类型
/// </summary>
public List<XrayType> Types { get; set; } = new List<XrayType>();
/// <summary>
/// 根据xray类型获取路径
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
public string GetPath(XrayType type)
{
switch (type)
{
case XrayType.VLESS_WS:
return VLESS_WS_Path;
case XrayType.VMESS_TCP:
return VMESS_TCP_Path;
case XrayType.VMESS_WS:
return VMESS_WS_Path;
default:
return string.Empty;
return ShareLink.Build(RayType.VLESS_TCP_XTLS, this);
}
}
}

View File

@ -32,6 +32,9 @@ namespace ProxySuper.Core.Models
}
}
[JsonProperty("v2raySettings")]
public V2raySettings V2raySettings { get; set; }
[JsonProperty("settings")]
public XraySettings XraySettings { get; set; }
@ -52,6 +55,8 @@ namespace ProxySuper.Core.Models
{
if (XraySettings != null) return ProjectType.Xray;
if (V2raySettings != null) return ProjectType.V2ray;
if (TrojanGoSettings != null) return ProjectType.TrojanGo;
if (NaiveProxySettings != null) return ProjectType.NaiveProxy;
@ -76,6 +81,17 @@ namespace ProxySuper.Core.Models
public string GetShareLink()
{
if (Type == ProjectType.V2ray)
{
StringBuilder strBuilder = new StringBuilder();
XraySettings.Types.ForEach(type =>
{
var link = ShareLink.Build(type, V2raySettings);
strBuilder.AppendLine(link);
});
return strBuilder.ToString();
}
if (Type == ProjectType.Xray)
{
StringBuilder strBuilder = new StringBuilder();

View File

@ -78,12 +78,13 @@
<Compile Include="Models\Projects\NaiveProxySettings.cs" />
<Compile Include="Models\Projects\ProjectType.cs" />
<Compile Include="Models\Projects\TrojanGoSettings.cs" />
<Compile Include="Models\Projects\XraySettings_SS.cs" />
<Compile Include="Models\Projects\XraySettings_Trojan.cs" />
<Compile Include="Models\Projects\XraySettings_VLESS.cs" />
<Compile Include="Models\Projects\V2raySettings_SS.cs" />
<Compile Include="Models\Projects\V2raySettings_Trojan.cs" />
<Compile Include="Models\Projects\V2raySettings_VLESS.cs" />
<Compile Include="Models\Projects\V2raySettings.cs" />
<Compile Include="Models\Projects\V2raySettings_VMESS.cs" />
<Compile Include="Models\Projects\XraySettings.cs" />
<Compile Include="Models\Projects\XraySettings_VMESS.cs" />
<Compile Include="Models\Projects\XrayType.cs" />
<Compile Include="Models\Projects\RayType.cs" />
<Compile Include="Models\Record.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Helpers\Utils.cs" />
@ -93,6 +94,8 @@
<Compile Include="Services\ShareLink.cs" />
<Compile Include="Services\TrojanGoConfigBuilder.cs" />
<Compile Include="Services\TrojanGoService.cs" />
<Compile Include="Services\V2rayConfigBuilder.cs" />
<Compile Include="Services\V2rayService.cs" />
<Compile Include="Services\XrayConfigBuilder.cs" />
<Compile Include="Services\XrayService.cs" />
<Compile Include="ViewModels\BrookConfigViewModel.cs" />
@ -107,6 +110,9 @@
<Compile Include="ViewModels\TrojanGoConfigViewModel.cs" />
<Compile Include="ViewModels\TrojanGoEditorViewModel.cs" />
<Compile Include="ViewModels\TrojanGoInstallViewModel.cs" />
<Compile Include="ViewModels\V2rayConfigViewModel.cs" />
<Compile Include="ViewModels\V2rayEditorViewModel.cs" />
<Compile Include="ViewModels\V2rayInstallViewModel.cs" />
<Compile Include="ViewModels\XrayConfigViewModel.cs" />
<Compile Include="ViewModels\XrayEditorViewModel.cs" />
<Compile Include="ViewModels\XrayInstallViewModel.cs" />

View File

@ -69,30 +69,30 @@ namespace ProxySuper.Core.Services
return strBuilder.ToString();
}
public static string Build(XrayType xrayType, XraySettings settings)
public static string Build(RayType xrayType, V2raySettings settings)
{
switch (xrayType)
{
case XrayType.VLESS_TCP:
case XrayType.VLESS_TCP_XTLS:
case XrayType.VLESS_WS:
case XrayType.VLESS_KCP:
case XrayType.VLESS_gRPC:
case XrayType.Trojan_TCP:
case RayType.VLESS_TCP:
case RayType.VLESS_TCP_XTLS:
case RayType.VLESS_WS:
case RayType.VLESS_KCP:
case RayType.VLESS_gRPC:
case RayType.Trojan_TCP:
return BuildVlessShareLink(xrayType, settings);
case XrayType.VMESS_TCP:
case XrayType.VMESS_WS:
case XrayType.VMESS_KCP:
case RayType.VMESS_TCP:
case RayType.VMESS_WS:
case RayType.VMESS_KCP:
return BuildVmessShareLink(xrayType, settings);
case XrayType.ShadowsocksAEAD:
case RayType.ShadowsocksAEAD:
return BuildShadowSocksShareLink(settings);
default:
return string.Empty;
}
}
private static string BuildShadowSocksShareLink(XraySettings settings)
private static string BuildShadowSocksShareLink(V2raySettings settings)
{
var _method = settings.ShadowSocksMethod;
var _password = settings.ShadowSocksPassword;
@ -103,7 +103,7 @@ namespace ProxySuper.Core.Services
return "ss://" + base64URL + "#ShadowSocks";
}
private static string BuildVmessShareLink(XrayType xrayType, XraySettings settings)
private static string BuildVmessShareLink(RayType xrayType, V2raySettings settings)
{
var vmess = new Vmess
{
@ -122,19 +122,19 @@ namespace ProxySuper.Core.Services
switch (xrayType)
{
case XrayType.VMESS_TCP:
case RayType.VMESS_TCP:
vmess.ps = "vmess-tcp-tls";
vmess.net = "tcp";
vmess.type = "http";
vmess.path = settings.VMESS_TCP_Path;
break;
case XrayType.VMESS_WS:
case RayType.VMESS_WS:
vmess.ps = "vmess-ws-tls";
vmess.net = "ws";
vmess.type = "none";
vmess.path = settings.VMESS_WS_Path;
break;
case XrayType.VMESS_KCP:
case RayType.VMESS_KCP:
vmess.ps = "vmess-mKCP";
vmess.port = settings.VMESS_KCP_Port.ToString();
vmess.net = "kcp";
@ -150,7 +150,7 @@ namespace ProxySuper.Core.Services
return $"vmess://" + base64Url;
}
private static string BuildVlessShareLink(XrayType xrayType, XraySettings settings)
private static string BuildVlessShareLink(RayType xrayType, V2raySettings settings)
{
var _protocol = string.Empty;
var _uuid = settings.UUID;
@ -167,24 +167,24 @@ namespace ProxySuper.Core.Services
switch (xrayType)
{
case XrayType.VLESS_TCP:
case RayType.VLESS_TCP:
_protocol = "vless";
_type = "tcp";
_descriptiveText = "vless-tcp-tls";
break;
case XrayType.VLESS_TCP_XTLS:
case RayType.VLESS_TCP_XTLS:
_protocol = "vless";
_type = "tcp";
_security = "xtls";
_descriptiveText = "vless-tcp-xtls";
break;
case XrayType.VLESS_WS:
case RayType.VLESS_WS:
_protocol = "vless";
_type = "ws";
_path = settings.VLESS_WS_Path;
_descriptiveText = "vless-ws-tls";
break;
case XrayType.VLESS_KCP:
case RayType.VLESS_KCP:
_protocol = "vless";
_type = "kcp";
_headerType = settings.VLESS_KCP_Type;
@ -193,13 +193,13 @@ namespace ProxySuper.Core.Services
_security = "none";
_descriptiveText = "vless-mKCP";
break;
case XrayType.VLESS_gRPC:
case RayType.VLESS_gRPC:
_protocol = "vless";
_type = "grpc";
_port = settings.VLESS_gRPC_Port;
_descriptiveText = "vless-gRPC";
break;
case XrayType.Trojan_TCP:
case RayType.Trojan_TCP:
_protocol = "trojan";
_uuid = settings.TrojanPassword;
_descriptiveText = "trojan-tcp";
@ -210,25 +210,25 @@ namespace ProxySuper.Core.Services
string parametersURL = string.Empty;
if (xrayType != XrayType.Trojan_TCP)
if (xrayType != RayType.Trojan_TCP)
{
// 4.3 传输层相关段
parametersURL = $"?type={_type}&encryption={_encryption}&security={_security}&path={HttpUtility.UrlEncode(_path)}&headerType={_headerType}";
// kcp
if (xrayType == XrayType.VLESS_KCP)
if (xrayType == RayType.VLESS_KCP)
{
parametersURL += $"&seed={_seed}";
}
// 4.4 TLS 相关段
if (xrayType == XrayType.VLESS_TCP_XTLS)
if (xrayType == RayType.VLESS_TCP_XTLS)
{
parametersURL += "&flow=xtls-rprx-direct";
}
if (xrayType == XrayType.VLESS_gRPC)
if (xrayType == RayType.VLESS_gRPC)
{
parametersURL += $"&serviceName={settings.VLESS_gRPC_ServiceName}&mode=gun";
}

View File

@ -0,0 +1,252 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using ProxySuper.Core.Models.Projects;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProxySuper.Core.Services
{
public class V2rayConfigBuilder
{
private const string ServerLogDir = @"Templates\v2ray\server\00_log";
private const string ServerApiDir = @"Templates\v2ray\server\01_api";
private const string ServerDnsDir = @"Templates\v2ray\server\02_dns";
private const string ServerRoutingDir = @"Templates\v2ray\server\03_routing";
private const string ServerPolicyDir = @"Templates\v2ray\server\04_policy";
private const string ServerInboundsDir = @"Templates\v2ray\server\05_inbounds";
private const string ServerOutboundsDir = @"Templates\v2ray\server\06_outbounds";
private const string ServerTransportDir = @"Templates\v2ray\server\07_transport";
private const string ServerStatsDir = @"Templates\v2ray\server\08_stats";
private const string ServerReverseDir = @"Templates\v2ray\server\09_reverse";
private const string CaddyFileDir = @"Templates\v2ray\caddy";
public static int VLESS_TCP_Port = 1110;
public static int VLESS_WS_Port = 1111;
public static int VLESS_H2_Port = 1112;
public static int VMESS_TCP_Port = 1210;
public static int VMESS_WS_Port = 1211;
public static int VMESS_H2_Port = 1212;
public static int Trojan_TCP_Port = 1310;
public static int Trojan_WS_Port = 1311;
public static int FullbackPort = 8080;
public static dynamic LoadV2rayConfig()
{
dynamic logObj = LoadJsonObj(Path.Combine(ServerLogDir, "00_log.json"));
dynamic apiObj = LoadJsonObj(Path.Combine(ServerApiDir, "01_api.json"));
dynamic dnsObj = LoadJsonObj(Path.Combine(ServerDnsDir, "02_dns.json"));
dynamic routingObj = LoadJsonObj(Path.Combine(ServerRoutingDir, "03_routing.json"));
dynamic policyObj = LoadJsonObj(Path.Combine(ServerPolicyDir, "04_policy.json"));
dynamic inboundsObj = LoadJsonObj(Path.Combine(ServerInboundsDir, "05_inbounds.json"));
dynamic outboundsObj = LoadJsonObj(Path.Combine(ServerOutboundsDir, "06_outbounds.json"));
dynamic transportObj = LoadJsonObj(Path.Combine(ServerTransportDir, "07_transport.json"));
dynamic statsObj = LoadJsonObj(Path.Combine(ServerStatsDir, "08_stats.json"));
dynamic reverseObj = LoadJsonObj(Path.Combine(ServerReverseDir, "09_reverse.json"));
return new
{
log = logObj["log"],
//api = apiObj["api"], api不能为空
dns = dnsObj["dns"],
routing = routingObj["routing"],
policy = policyObj["policy"],
inbounds = inboundsObj["inbounds"],
outbounds = outboundsObj["outbounds"],
transport = transportObj["transport"],
stats = statsObj["stats"],
reverse = reverseObj["reverse"]
};
}
public static string BuildCaddyConfig(V2raySettings parameters, bool useCustomWeb = false)
{
var caddyStr = File.ReadAllText(Path.Combine(CaddyFileDir, "base.caddyfile"));
caddyStr = caddyStr.Replace("##domain##", parameters.IsIPAddress ? "" : parameters.Domain);
caddyStr = caddyStr.Replace("##port##", FullbackPort.ToString());
if (!useCustomWeb && !string.IsNullOrEmpty(parameters.MaskDomain))
{
var prefix = "http://";
if (parameters.MaskDomain.StartsWith("https://"))
{
prefix = "https://";
}
var domain = parameters.MaskDomain
.TrimStart("http://".ToCharArray())
.TrimStart("https://".ToCharArray());
caddyStr = caddyStr.Replace("##reverse_proxy##", $"reverse_proxy {prefix}{domain} {{ \n header_up Host {domain} \n }}");
}
else
{
caddyStr = caddyStr.Replace("##reverse_proxy##", "");
}
return caddyStr;
}
private static void SetClients(dynamic bound, List<string> uuidList)
{
bound.settings.clients.Clear();
uuidList.ForEach(id =>
{
object obj;
obj = new { id = id };
bound.settings.clients.Add(JToken.FromObject(obj));
});
}
public static string BuildV2rayConfig(V2raySettings parameters)
{
var uuidList = parameters.MulitUUID;
uuidList.Insert(0, parameters.UUID);
var xrayConfig = LoadV2rayConfig();
var baseBound = GetBound("VLESS_TCP_TLS.json");
baseBound.port = parameters.Port;
baseBound.settings.fallbacks.Add(JToken.FromObject(new
{
dest = FullbackPort
}));
xrayConfig.inbounds.Add(baseBound);
SetClients(baseBound, uuidList);
#region Fullbacks
if (parameters.Types.Contains(RayType.VLESS_WS))
{
var wsInbound = GetBound("VLESS_WS.json");
wsInbound.port = VLESS_WS_Port;
SetClients(wsInbound, uuidList);
wsInbound.streamSettings.wsSettings.path = parameters.VLESS_WS_Path;
baseBound.settings.fallbacks.Add(JToken.FromObject(new
{
dest = VLESS_WS_Port,
path = parameters.VLESS_WS_Path,
xver = 1,
}));
xrayConfig.inbounds.Add(JToken.FromObject(wsInbound));
}
if (parameters.Types.Contains(RayType.VMESS_TCP))
{
var mtcpBound = GetBound("VMESS_TCP.json");
mtcpBound.port = VMESS_TCP_Port;
SetClients(mtcpBound, uuidList);
mtcpBound.streamSettings.tcpSettings.header.request.path = parameters.VMESS_TCP_Path;
baseBound.settings.fallbacks.Add(JToken.FromObject(new
{
dest = VMESS_TCP_Port,
path = parameters.VMESS_TCP_Path,
xver = 1,
}));
xrayConfig.inbounds.Add(JToken.FromObject(mtcpBound));
}
if (parameters.Types.Contains(RayType.VMESS_WS))
{
var mwsBound = GetBound("VMESS_WS.json");
mwsBound.port = VMESS_WS_Port;
SetClients(mwsBound, uuidList);
mwsBound.streamSettings.wsSettings.path = parameters.VMESS_WS_Path;
baseBound.settings.fallbacks.Add(JToken.FromObject(new
{
dest = VMESS_WS_Port,
path = parameters.VMESS_WS_Path,
xver = 1,
}));
xrayConfig.inbounds.Add(JToken.FromObject(mwsBound));
}
if (parameters.Types.Contains(RayType.Trojan_TCP))
{
var trojanTcpBound = GetBound("Trojan_TCP.json");
trojanTcpBound.port = Trojan_TCP_Port;
trojanTcpBound.settings.clients[0].password = parameters.TrojanPassword;
trojanTcpBound.settings.fallbacks[0].dest = FullbackPort;
baseBound.settings.fallbacks[0] = JToken.FromObject(new
{
dest = Trojan_TCP_Port,
xver = 1,
});
xrayConfig.inbounds.Add(JToken.FromObject(trojanTcpBound));
}
#endregion
if (parameters.Types.Contains(RayType.VLESS_gRPC))
{
var gRPCInBound = GetBound("VLESS_gRPC.json");
gRPCInBound.port = parameters.VLESS_gRPC_Port;
SetClients(gRPCInBound, uuidList);
gRPCInBound.streamSettings.grpcSettings.serviceName = parameters.VLESS_gRPC_ServiceName;
gRPCInBound.streamSettings.tlsSettings.serverName = parameters.Domain;
xrayConfig.inbounds.Add(JToken.FromObject(gRPCInBound));
}
if (parameters.Types.Contains(RayType.VLESS_KCP))
{
var kcpBound = GetBound("VLESS_KCP.json");
kcpBound.port = parameters.VLESS_KCP_Port;
SetClients(kcpBound, uuidList);
kcpBound.streamSettings.kcpSettings.header.type = parameters.VLESS_KCP_Type;
kcpBound.streamSettings.kcpSettings.seed = parameters.VLESS_KCP_Seed;
xrayConfig.inbounds.Add(JToken.FromObject(kcpBound));
}
if (parameters.Types.Contains(RayType.VMESS_KCP))
{
var kcpBound = GetBound("VMESS_KCP.json");
kcpBound.port = parameters.VMESS_KCP_Port;
SetClients(kcpBound, uuidList);
kcpBound.streamSettings.kcpSettings.header.type = parameters.VMESS_KCP_Type;
kcpBound.streamSettings.kcpSettings.seed = parameters.VMESS_KCP_Seed;
xrayConfig.inbounds.Add(JToken.FromObject(kcpBound));
}
if (parameters.Types.Contains(RayType.ShadowsocksAEAD))
{
var ssBound = GetBound("Shadowsocks-AEAD.json");
ssBound.port = parameters.ShadowSocksPort;
ssBound.settings.clients[0].password = parameters.ShadowSocksPassword;
ssBound.settings.clients[0].method = parameters.ShadowSocksMethod;
xrayConfig.inbounds.Add(JToken.FromObject(ssBound));
}
return JsonConvert.SerializeObject(
xrayConfig,
Formatting.Indented,
new JsonSerializerSettings()
{
NullValueHandling = NullValueHandling.Ignore
});
}
private static dynamic GetBound(string name)
{
return LoadJsonObj(Path.Combine(ServerInboundsDir, name));
}
private static dynamic LoadJsonObj(string path)
{
if (File.Exists(path))
{
var jsonStr = File.ReadAllText(path, Encoding.UTF8);
return JToken.FromObject(JsonConvert.DeserializeObject(jsonStr));
}
return null;
}
}
}

View File

@ -0,0 +1,433 @@
using Microsoft.Win32;
using ProxySuper.Core.Models.Hosts;
using ProxySuper.Core.Models.Projects;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace ProxySuper.Core.Services
{
public class V2rayService : ServiceBase<V2raySettings>
{
public V2rayService(Host host, V2raySettings settings) : base(host, settings)
{
}
public void Install()
{
Task.Factory.StartNew(() =>
{
try
{
int index = 1;
EnsureRootUser();
if (FileExists("/usr/local/bin/v2ray"))
{
var btnResult = MessageBox.Show("已经安装v2ray是否需要重装", "提示", MessageBoxButton.YesNo);
if (btnResult == MessageBoxResult.No)
{
MessageBox.Show("安装终止", "提示");
return;
}
}
Progress.Step = $"{index++}. 检测系统环境";
EnsureSystemEnv();
Progress.Percentage = 5;
Progress.Step = $"{index++}. 安装必要的系统工具";
InstallSystemTools();
Progress.Percentage = 15;
Progress.Step = $"{index++}. 配置防火墙";
ConfigFirewalld();
Progress.Percentage = 20;
Progress.Step = $"{index++}. 检测网络环境";
EnsureNetwork();
if (Settings.IsIPAddress)
{
Progress.Desc = ("检查域名是否解析正确");
ValidateDomain();
}
Progress.Percentage = 25;
Progress.Step = $"{index}. 同步系统和本地时间";
SyncTimeDiff();
Progress.Percentage = 30;
Progress.Step = $"{index++}. 安装Caddy服务器";
InstallCaddy();
Progress.Percentage = 50;
Progress.Step = $"{index++}. 安装V2ray-Core";
InstallV2ray();
Progress.Percentage = 80;
Progress.Step = $"{index++}. 上传Web服务器配置";
UploadCaddyFile();
Progress.Percentage = 90;
Progress.Step = $"{index++}. 启动BBR";
EnableBBR();
Progress.Desc = "重启V2ray服务";
RunCmd("systemctl restart caddy");
RunCmd("systemctl restart V2ray");
Progress.Percentage = 100;
Progress.Step = "安装成功";
Progress.Desc = string.Empty;
if (!Settings.WithTLS)
{
Progress.Step = "安装成功,请上传您的 TLS 证书。";
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
});
}
public void UpdateSettings()
{
Task.Factory.StartNew(() =>
{
try
{
Progress.Step = "更新V2ray配置";
Progress.Percentage = 0;
EnsureRootUser();
var index = 0;
Progress.Desc = $"{index++}. 检测系统环境";
EnsureSystemEnv();
Progress.Percentage = 20;
Progress.Desc = $"{index++}. 配置防火墙";
RunCmd("systemctl stop v2ray");
RunCmd("systemctl stop caddy");
ConfigFirewalld();
Progress.Percentage = 40;
Progress.Desc = $"{index++}. 上传V2ray配置文件";
var configJson = V2rayConfigBuilder.BuildV2rayConfig(Settings);
WriteToFile(configJson, "/usr/local/etc/v2ray/config.json");
Progress.Percentage = 70;
Progress.Desc = $"{index++}. 上传Caddy配置文件";
UploadCaddyFile();
Progress.Percentage = 90;
Progress.Desc = $"{index++}. 重启v2ray服务";
RunCmd("systemctl restart caddy");
RunCmd("systemctl restart v2ray");
Progress.Percentage = 100;
Progress.Desc = ("更新配置成功");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
});
}
public void UpdateV2rayCore()
{
Task.Factory.StartNew(() =>
{
try
{
Progress.Step = "更新V2ray-Core";
Progress.Percentage = 0;
EnsureRootUser();
Progress.Percentage = 20;
Progress.Desc = "下载最新版本V2ray-Core";
EnsureSystemEnv();
Progress.Percentage = 40;
RunCmd("bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)");
RunCmd("systemctl restart v2ray");
Progress.Percentage = 100;
Progress.Desc = "更新V2ray-Core成功";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
});
}
public void Uninstall()
{
Task.Factory.StartNew(() =>
{
try
{
EnsureRootUser();
var index = 1;
Progress.Percentage = 0;
Progress.Step = $"{index++}. 检测系统环境";
Progress.Desc = "检测系统环境";
EnsureSystemEnv();
Progress.Percentage = 20;
Progress.Step = $"{index++}. 卸载Caddy服务";
UninstallCaddy();
Progress.Percentage = 40;
Progress.Step = $"{index++}. 卸载V2ray服务";
UninstallV2ray();
Progress.Percentage = 60;
Progress.Step = $"{index++}. 卸载Acme证书申请服务";
UninstallAcme();
Progress.Percentage = 80;
Progress.Step = $"{index++}. 重置防火墙端口";
ResetFirewalld();
Progress.Percentage = 100;
Progress.Step = "卸载完成";
Progress.Desc = "卸载完成";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
});
}
public void UploadCert()
{
var fileDialog = new OpenFileDialog();
fileDialog.Filter = "压缩文件|*.zip";
fileDialog.FileOk += DoUploadCert;
fileDialog.ShowDialog();
}
public void UploadWeb()
{
var fileDialog = new OpenFileDialog();
fileDialog.Filter = "压缩文件|*.zip";
fileDialog.FileOk += DoUploadWeb;
fileDialog.ShowDialog();
}
public void ApplyForCert()
{
Task.Factory.StartNew(() =>
{
try
{
Progress.Percentage = 0;
Progress.Step = "续签证书";
InstallCert(
dirPath: "/usr/local/etc/v2ray/ssl",
certName: "v2ray_ssl.crt",
keyName: "v2ray_ssl.key");
Progress.Percentage = 90;
Progress.Desc = "重启服务";
RunCmd("systemctl restart v2ray");
Progress.Percentage = 100;
Progress.Desc = "续签证书成功";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
});
}
#region
private void DoUploadCert(object sender, CancelEventArgs e)
{
Task.Factory.StartNew(() =>
{
try
{
EnsureRootUser();
Progress.Percentage = 0;
Progress.Step = "上传自有证书";
Progress.Desc = "检测系统环境";
EnsureSystemEnv();
Progress.Percentage = 20;
Progress.Desc = "正在上传文件";
var file = sender as OpenFileDialog;
using (var stream = file.OpenFile())
{
var oldFileName = $"ssl_{DateTime.Now.Ticks}";
RunCmd($"mv /usr/local/etc/v2ray/ssl /usr/local/etc/v2ray/{oldFileName}");
RunCmd("mkdir /usr/local/etc/v2ray/ssl");
UploadFile(stream, "/usr/local/etc/v2ray/ssl/ssl.zip");
RunCmd("unzip /usr/local/etc/v2ray/ssl/ssl.zip -d /usr/local/etc/v2ray/ssl");
}
var crtFiles = RunCmd("find /usr/local/etc/v2ray/ssl/*.crt").Split("\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var keyFiles = RunCmd("find /usr/local/etc/v2ray/ssl/*.key").Split("\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
if (crtFiles.Length > 0 && keyFiles.Length > 0)
{
RunCmd($"mv {crtFiles[0]} /usr/local/etc/v2ray/ssl/v2ray_ssl.crt");
RunCmd($"mv {keyFiles[0]} /usr/local/etc/v2ray/ssl/v2ray_ssl.key");
}
else
{
Progress.Step = "上传失败";
Progress.Desc = "上传证书失败,缺少 .crt 和 .key 文件";
return;
}
Progress.Desc = "重启V2ray服务";
RunCmd("systemctl restart v2ray");
Progress.Percentage = 100;
Progress.Desc = "上传证书完成";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
});
}
private void DoUploadWeb(object sender, CancelEventArgs e)
{
Task.Factory.StartNew(() =>
{
try
{
EnsureRootUser();
Progress.Step = "上传静态网站";
Progress.Desc = "上传静态网站";
Progress.Percentage = 0;
Progress.Desc = "检测系统环境";
EnsureSystemEnv();
Progress.Percentage = 20;
Progress.Desc = "创建网站目录";
if (!FileExists("/usr/share/caddy"))
{
RunCmd("mkdir /usr/share/caddy");
}
RunCmd("rm -rf /usr/share/caddy/*");
Progress.Percentage = 40;
Progress.Desc = "正在上传文件";
var file = sender as OpenFileDialog;
using (var stream = file.OpenFile())
{
UploadFile(stream, "/usr/share/caddy/caddy.zip");
RunCmd("unzip /usr/share/caddy/caddy.zip -d /usr/share/caddy");
}
RunCmd("chmod -R 777 /usr/share/caddy");
Progress.Percentage = 80;
Progress.Desc = "上传Web配置文件";
UploadCaddyFile(useCustomWeb: true);
Progress.Percentage = 100;
Progress.Desc = "上传静态网站成功";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
});
}
private void InstallV2ray()
{
Progress.Desc = ("开始安装V2ray-Core");
RunCmd("bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)");
if (!FileExists("/usr/local/bin/v2ray"))
{
Progress.Desc = ("V2ray-Core安装失败请联系开发者");
throw new Exception("V2ray-Core安装失败请联系开发者");
}
Progress.Desc = ("设置V2ray-Core权限");
RunCmd($"sed -i 's/User=nobody/User=root/g' /etc/systemd/system/v2ray.service");
RunCmd($"sed -i 's/CapabilityBoundingSet=/#CapabilityBoundingSet=/g' /etc/systemd/system/v2ray.service");
RunCmd($"sed -i 's/AmbientCapabilities=/#AmbientCapabilities=/g' /etc/systemd/system/v2ray.service");
RunCmd($"systemctl daemon-reload");
if (FileExists("/usr/local/etc/v2ray/config.json"))
{
RunCmd(@"mv /usr/local/etc/v2ray/config.json /usr/local/etc/v2ray/config.json.1");
}
Progress.Percentage = 60;
if (Settings.WithTLS && !Settings.IsIPAddress)
{
Progress.Desc = ("安装TLS证书");
InstallCert(
dirPath: "/usr/local/etc/v2ray/ssl",
certName: "v2ray_ssl.crt",
keyName: "v2ray_ssl.key");
Progress.Percentage = 75;
}
Progress.Desc = ("生成v2ray服务器配置文件");
var configJson = V2rayConfigBuilder.BuildV2rayConfig(Settings);
WriteToFile(configJson, "/usr/local/etc/v2ray/config.json");
}
private void UploadCaddyFile(bool useCustomWeb = false)
{
var configJson = V2rayConfigBuilder.BuildCaddyConfig(Settings, useCustomWeb);
if (FileExists("/etc/caddy/Caddyfile"))
{
RunCmd("mv /etc/caddy/Caddyfile /etc/caddy/Caddyfile.back");
}
WriteToFile(configJson, "/etc/caddy/Caddyfile");
}
private void UninstallV2ray()
{
Progress.Desc = "关闭V2ray服务";
RunCmd("systemctl stop v2ray");
RunCmd("systemctl disable v2ray");
Progress.Desc = "卸载V2ray";
RunCmd("bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh) --remove");
}
private void UninstallAcme()
{
Progress.Desc = "卸载 acme.sh";
RunCmd("acme.sh --uninstall");
Progress.Desc = "删除 acme.sh 相关文件";
RunCmd("rm -rf ~/.acme.sh");
}
#endregion
}
}

View File

@ -129,7 +129,7 @@ namespace ProxySuper.Core.Services
#region Fullbacks
if (parameters.Types.Contains(XrayType.VLESS_WS))
if (parameters.Types.Contains(RayType.VLESS_WS))
{
var wsInbound = GetBound("VLESS_WS.json");
wsInbound.port = VLESS_WS_Port;
@ -144,7 +144,7 @@ namespace ProxySuper.Core.Services
xrayConfig.inbounds.Add(JToken.FromObject(wsInbound));
}
if (parameters.Types.Contains(XrayType.VMESS_TCP))
if (parameters.Types.Contains(RayType.VMESS_TCP))
{
var mtcpBound = GetBound("VMESS_TCP.json");
mtcpBound.port = VMESS_TCP_Port;
@ -159,7 +159,7 @@ namespace ProxySuper.Core.Services
xrayConfig.inbounds.Add(JToken.FromObject(mtcpBound));
}
if (parameters.Types.Contains(XrayType.VMESS_WS))
if (parameters.Types.Contains(RayType.VMESS_WS))
{
var mwsBound = GetBound("VMESS_WS.json");
mwsBound.port = VMESS_WS_Port;
@ -174,7 +174,7 @@ namespace ProxySuper.Core.Services
xrayConfig.inbounds.Add(JToken.FromObject(mwsBound));
}
if (parameters.Types.Contains(XrayType.Trojan_TCP))
if (parameters.Types.Contains(RayType.Trojan_TCP))
{
var trojanTcpBound = GetBound("Trojan_TCP.json");
trojanTcpBound.port = Trojan_TCP_Port;
@ -189,7 +189,7 @@ namespace ProxySuper.Core.Services
}
#endregion
if (parameters.Types.Contains(XrayType.VLESS_gRPC))
if (parameters.Types.Contains(RayType.VLESS_gRPC))
{
var gRPCInBound = GetBound("VLESS_gRPC.json");
gRPCInBound.port = parameters.VLESS_gRPC_Port;
@ -199,7 +199,7 @@ namespace ProxySuper.Core.Services
xrayConfig.inbounds.Add(JToken.FromObject(gRPCInBound));
}
if (parameters.Types.Contains(XrayType.VLESS_KCP))
if (parameters.Types.Contains(RayType.VLESS_KCP))
{
var kcpBound = GetBound("VLESS_KCP.json");
kcpBound.port = parameters.VLESS_KCP_Port;
@ -209,7 +209,7 @@ namespace ProxySuper.Core.Services
xrayConfig.inbounds.Add(JToken.FromObject(kcpBound));
}
if (parameters.Types.Contains(XrayType.VMESS_KCP))
if (parameters.Types.Contains(RayType.VMESS_KCP))
{
var kcpBound = GetBound("VMESS_KCP.json");
kcpBound.port = parameters.VMESS_KCP_Port;
@ -219,7 +219,7 @@ namespace ProxySuper.Core.Services
xrayConfig.inbounds.Add(JToken.FromObject(kcpBound));
}
if (parameters.Types.Contains(XrayType.ShadowsocksAEAD))
if (parameters.Types.Contains(RayType.ShadowsocksAEAD))
{
var ssBound = GetBound("Shadowsocks-AEAD.json");
ssBound.port = parameters.ShadowSocksPort;

View File

@ -58,6 +58,8 @@ namespace ProxySuper.Core.ViewModels
public MvxObservableCollection<Record> Records { get; set; }
public IMvxCommand AddV2rayCommand => new MvxAsyncCommand(AddV2rayRecord);
public IMvxCommand AddXrayCommand => new MvxAsyncCommand(AddXrayRecord);
public IMvxCommand AddTrojanGoCommand => new MvxAsyncCommand(AddTrojanGoRecord);
@ -74,6 +76,20 @@ namespace ProxySuper.Core.ViewModels
public IMvxCommand InstallCommand => new MvxAsyncCommand<string>(GoToInstall);
public async Task AddV2rayRecord()
{
Record record = new Record();
record.Id = Utils.GetTickID();
record.Host = new Host();
record.V2raySettings = new V2raySettings();
var result = await _navigationService.Navigate<V2rayEditorViewModel, Record, Record>(record);
if (result == null) return;
Records.Add(result);
SaveToJson();
}
public async Task AddXrayRecord()
{
Record record = new Record();
@ -140,6 +156,14 @@ namespace ProxySuper.Core.ViewModels
if (record == null) return;
Record result = null;
if (record.Type == ProjectType.V2ray)
{
result = await _navigationService.Navigate<V2rayEditorViewModel, Record, Record>(record);
if (result == null) return;
record.Host = result.Host;
record.V2raySettings = result.V2raySettings;
}
if (record.Type == ProjectType.Xray)
{
result = await _navigationService.Navigate<XrayEditorViewModel, Record, Record>(record);
@ -196,6 +220,10 @@ namespace ProxySuper.Core.ViewModels
var record = Records.FirstOrDefault(x => x.Id == id);
if (record == null) return;
if (record.Type == ProjectType.V2ray)
{
await _navigationService.Navigate<V2rayConfigViewModel, V2raySettings>(record.V2raySettings);
}
if (record.Type == ProjectType.Xray)
{
await _navigationService.Navigate<XrayConfigViewModel, XraySettings>(record.XraySettings);
@ -219,6 +247,10 @@ namespace ProxySuper.Core.ViewModels
var record = Records.FirstOrDefault(x => x.Id == id);
if (record == null) return;
if (record.Type == ProjectType.V2ray)
{
await _navigationService.Navigate<V2rayInstallViewModel, Record>(record);
}
if (record.Type == ProjectType.Xray)
{
await _navigationService.Navigate<XrayInstallViewModel, Record>(record);

View File

@ -0,0 +1,93 @@
using MvvmCross.ViewModels;
using ProxySuper.Core.Models.Projects;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProxySuper.Core.ViewModels
{
public class V2rayConfigViewModel : MvxViewModel<V2raySettings>
{
public V2raySettings Settings { get; set; }
public override void Prepare(V2raySettings parameter)
{
Settings = parameter;
}
public bool Checked_VLESS_TCP
{
get
{
return Settings.Types.Contains(RayType.VLESS_TCP);
}
}
public bool Checked_VLESS_WS
{
get
{
return Settings.Types.Contains(RayType.VLESS_WS);
}
}
public bool Checked_VLESS_KCP
{
get
{
return Settings.Types.Contains(RayType.VLESS_KCP);
}
}
public bool Checked_VLESS_gRPC
{
get
{
return Settings.Types.Contains(RayType.VLESS_gRPC);
}
}
public bool Checked_VMESS_TCP
{
get
{
return Settings.Types.Contains(RayType.VMESS_TCP);
}
}
public bool Checked_VMESS_WS
{
get
{
return Settings.Types.Contains(RayType.VMESS_WS);
}
}
public bool Checked_VMESS_KCP
{
get
{
return Settings.Types.Contains(RayType.VMESS_KCP);
}
}
public bool Checked_Trojan_TCP
{
get
{
return Settings.Types.Contains(RayType.Trojan_TCP);
}
}
public bool CheckedShadowSocks
{
get
{
return Settings.Types.Contains(RayType.ShadowsocksAEAD);
}
}
}
}

View File

@ -0,0 +1,442 @@
using MvvmCross.Commands;
using MvvmCross.Navigation;
using MvvmCross.ViewModels;
using ProxySuper.Core.Models;
using ProxySuper.Core.Models.Hosts;
using ProxySuper.Core.Models.Projects;
using ProxySuper.Core.Services;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
namespace ProxySuper.Core.ViewModels
{
public partial class V2rayEditorViewModel : MvxViewModel<Record, Record>
{
public V2rayEditorViewModel(IMvxNavigationService navigationService)
{
NavigationService = navigationService;
}
public string Id { get; set; }
public Host Host { get; set; }
public V2raySettings Settings { get; set; }
public IMvxCommand SaveCommand => new MvxCommand(Save);
public IMvxCommand SaveAndInstallCommand => new MvxCommand(SaveAndInstall);
public IMvxNavigationService NavigationService { get; }
public override void Prepare(Record parameter)
{
var record = Utils.DeepClone(parameter);
Id = record.Id;
Host = record.Host;
Settings = record.V2raySettings;
}
public void Save()
{
NavigationService.Close(this, new Record()
{
Id = Id,
Host = Host,
V2raySettings = Settings,
});
}
public void SaveAndInstall()
{
var record = new Record()
{
Id = Id,
Host = Host,
V2raySettings = Settings,
};
NavigationService.Close(this, record);
NavigationService.Navigate<V2rayInstallViewModel, Record>(record);
}
}
public partial class V2rayEditorViewModel
{
public IMvxCommand RandomUuid => new MvxCommand(() => GetUuid());
public bool WithTLS
{
get => Settings.WithTLS;
set
{
Settings.WithTLS = value;
RaisePropertyChanged("Port");
}
}
public int Port
{
get => Settings.Port;
set
{
Settings.Port = value;
RaisePropertyChanged("Port");
}
}
public int VLESS_KCP_Port
{
get => Settings.VLESS_KCP_Port;
set
{
Settings.VLESS_KCP_Port = value;
RaisePropertyChanged("VLESS_KCP_Port");
}
}
public int VMESS_KCP_Port
{
get => Settings.VMESS_KCP_Port;
set
{
Settings.VMESS_KCP_Port = value;
RaisePropertyChanged("VMESS_KCP_Port");
}
}
public int ShadowSocksPort
{
get => Settings.ShadowSocksPort;
set
{
Settings.ShadowSocksPort = value;
RaisePropertyChanged("ShadowSocksPort");
}
}
public string UUID
{
get => Settings.UUID;
set
{
Settings.UUID = value;
RaisePropertyChanged("UUID");
}
}
public string MultiUUID
{
get => string.Join(",", Settings.MulitUUID);
set
{
var input = value.Replace('', ',');
var arr = input.Split(',').ToList();
Settings.MulitUUID = arr;
RaisePropertyChanged("MultiUUID");
}
}
public string Domain
{
get => Settings.Domain;
set
{
Settings.Domain = value;
RaisePropertyChanged("Domain");
}
}
public string MaskDomain
{
get => Settings.MaskDomain;
set
{
Settings.MaskDomain = value;
RaisePropertyChanged("MaskDomain");
}
}
public string TrojanPassword
{
get => Settings.TrojanPassword;
set => Settings.TrojanPassword = value;
}
public bool Checked_Trojan_TCP
{
get
{
return Settings.Types.Contains(RayType.Trojan_TCP);
}
set
{
if (value == true)
{
if (!Settings.Types.Contains(RayType.Trojan_TCP))
Settings.Types.Add(RayType.Trojan_TCP);
}
else
{
Settings.Types.Remove(RayType.Trojan_TCP);
}
RaisePropertyChanged("Checked_Trojan_TCP");
}
}
public string Trojan_TCP_ShareLink
{
get => ShareLink.Build(RayType.Trojan_TCP, Settings);
}
private List<string> _ssMethods = new List<string> { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305" };
public List<string> ShadowSocksMethods => _ssMethods;
public bool CheckedShadowSocks
{
get => Settings.Types.Contains(RayType.ShadowsocksAEAD);
set
{
CheckBoxChanged(value, RayType.ShadowsocksAEAD);
RaisePropertyChanged("CheckedShadowSocks");
}
}
public string ShadowSocksPassword
{
get => Settings.ShadowSocksPassword;
set => Settings.ShadowSocksPassword = value;
}
public string ShadowSocksMethod
{
get => Settings.ShadowSocksMethod;
set
{
var namespaceStr = typeof(ComboBoxItem).FullName + ":";
var trimValue = value.Replace(namespaceStr, "");
trimValue = trimValue.Trim();
Settings.ShadowSocksMethod = trimValue;
RaisePropertyChanged("ShadowSocksMethod");
}
}
public string ShadowSocksShareLink
{
get => ShareLink.Build(RayType.ShadowsocksAEAD, Settings);
}
private void CheckBoxChanged(bool value, RayType type)
{
if (value == true)
{
if (!Settings.Types.Contains(type))
{
Settings.Types.Add(type);
}
}
else
{
Settings.Types.RemoveAll(x => x == type);
}
}
private void GetUuid()
{
UUID = Guid.NewGuid().ToString();
RaisePropertyChanged("UUID");
}
}
/// <summary>
/// VMESS
/// </summary>
public partial class V2rayEditorViewModel
{
// vmess tcp
public bool Checked_VMESS_TCP
{
get => Settings.Types.Contains(RayType.VMESS_TCP);
set
{
CheckBoxChanged(value, RayType.VMESS_TCP);
RaisePropertyChanged("Checked_VMESS_TCP");
}
}
public string VMESS_TCP_Path
{
get => Settings.VMESS_TCP_Path;
set => Settings.VMESS_TCP_Path = value;
}
public string VMESS_TCP_ShareLink
{
get => ShareLink.Build(RayType.VMESS_TCP, Settings);
}
// vmess ws
public bool Checked_VMESS_WS
{
get => Settings.Types.Contains(RayType.VMESS_WS);
set
{
CheckBoxChanged(value, RayType.VMESS_WS);
RaisePropertyChanged("Checked_VMESS_WS");
}
}
public string VMESS_WS_Path
{
get => Settings.VMESS_WS_Path;
set => Settings.VMESS_WS_Path = value;
}
public string VMESS_WS_ShareLink
{
get => ShareLink.Build(RayType.VMESS_WS, Settings);
}
// vmess kcp
public string VMESS_KCP_Seed
{
get => Settings.VMESS_KCP_Seed;
set => Settings.VMESS_KCP_Seed = value;
}
public string VMESS_KCP_Type
{
get => Settings.VMESS_KCP_Type;
set
{
var namespaceStr = typeof(ComboBoxItem).FullName + ":";
var trimValue = value.Replace(namespaceStr, "");
trimValue = trimValue.Trim();
Settings.VMESS_KCP_Type = trimValue;
RaisePropertyChanged("VMESS_KCP_Type");
}
}
public bool Checked_VMESS_KCP
{
get => Settings.Types.Contains(RayType.VMESS_KCP);
set
{
CheckBoxChanged(value, RayType.VMESS_KCP);
RaisePropertyChanged("Checked_VMESS_KCP");
}
}
public string VMESS_KCP_ShareLink
{
get => ShareLink.Build(RayType.VMESS_KCP, Settings);
}
private List<string> _kcpTypes = new List<string> { "none", "srtp", "utp", "wechat-video", "dtls", "wireguard", };
public List<string> KcpTypes => _kcpTypes;
}
/// <summary>
/// VLESS
/// </summary>
public partial class V2rayEditorViewModel
{
// vless tcp
public bool Checked_VLESS_TCP
{
get => Settings.Types.Contains(RayType.VLESS_TCP);
set
{
CheckBoxChanged(value, RayType.VLESS_TCP);
RaisePropertyChanged("Checked_VLESS_TCP");
}
}
public string VLESS_TCP_ShareLink
{
get => ShareLink.Build(RayType.VLESS_TCP, Settings);
}
// vless ws
public string VLESS_WS_Path
{
get => Settings.VLESS_WS_Path;
set => Settings.VLESS_WS_Path = value;
}
public bool Checked_VLESS_WS
{
get
{
return Settings.Types.Contains(RayType.VLESS_WS);
}
set
{
CheckBoxChanged(value, RayType.VLESS_WS);
RaisePropertyChanged("Checked_VLESS_WS");
}
}
public string VLESS_WS_ShareLink
{
get => ShareLink.Build(RayType.VLESS_WS, Settings);
}
// vless kcp
public string VLESS_KCP_Seed
{
get => Settings.VLESS_KCP_Seed;
set => Settings.VLESS_KCP_Seed = value;
}
public string VLESS_KCP_Type
{
get => Settings.VLESS_KCP_Type;
set
{
var namespaceStr = typeof(ComboBoxItem).FullName + ":";
var trimValue = value.Replace(namespaceStr, "");
trimValue = trimValue.Trim();
Settings.VLESS_KCP_Type = trimValue;
RaisePropertyChanged("VLESS_KCP_Type");
}
}
public bool Checked_VLESS_KCP
{
get => Settings.Types.Contains(RayType.VLESS_KCP);
set
{
CheckBoxChanged(value, RayType.VLESS_KCP);
RaisePropertyChanged("Checked_VLESS_KCP");
}
}
public string VLESS_KCP_ShareLink
{
get => ShareLink.Build(RayType.VLESS_KCP, Settings);
}
// vless grpc
public string VLESS_gRPC_ServiceName
{
get => Settings.VLESS_gRPC_ServiceName;
set => Settings.VLESS_gRPC_ServiceName = value;
}
public int VLESS_gRPC_Port
{
get => Settings.VLESS_gRPC_Port;
set => Settings.VLESS_gRPC_Port = value;
}
public bool Checked_VLESS_gRPC
{
get => Settings.Types.Contains(RayType.VLESS_gRPC);
set
{
CheckBoxChanged(value, RayType.VLESS_gRPC);
RaisePropertyChanged("Checked_VLESS_gRPC");
}
}
public string VLESS_gRPC_ShareLink
{
get => ShareLink.Build(RayType.VLESS_gRPC, Settings);
}
}
}

View File

@ -0,0 +1,88 @@
using MvvmCross.Commands;
using MvvmCross.ViewModels;
using ProxySuper.Core.Models;
using ProxySuper.Core.Models.Hosts;
using ProxySuper.Core.Models.Projects;
using ProxySuper.Core.Services;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProxySuper.Core.ViewModels
{
public class V2rayInstallViewModel : MvxViewModel<Record>
{
Host _host;
V2raySettings _settings;
V2rayService _service;
public override void ViewDestroy(bool viewFinishing = true)
{
_service.Disconnect();
this.SaveInstallLog();
base.ViewDestroy(viewFinishing);
}
public override void Prepare(Record parameter)
{
this._host = parameter.Host;
this._settings = parameter.V2raySettings;
}
public override Task Initialize()
{
_service = new V2rayService(_host, _settings);
_service.Progress.StepUpdate = () => RaisePropertyChanged("Progress");
_service.Progress.LogsUpdate = () => RaisePropertyChanged("Logs");
_service.Connect();
return base.Initialize();
}
public ProjectProgress Progress
{
get => _service.Progress;
}
public string Logs
{
get => _service.Progress.Logs;
}
#region Command
public IMvxCommand InstallCommand => new MvxCommand(_service.Install);
public IMvxCommand UpdateSettingsCommand => new MvxCommand(_service.UpdateSettings);
public IMvxCommand UpdateV2rayCoreCommand => new MvxCommand(_service.UpdateV2rayCore);
public IMvxCommand UninstallCommand => new MvxCommand(_service.Uninstall);
public IMvxCommand UploadCertCommand => new MvxCommand(_service.UploadCert);
public IMvxCommand UploadWebCommand => new MvxCommand(_service.UploadWeb);
public IMvxCommand ApplyForCertCommand => new MvxCommand(_service.ApplyForCert);
#endregion
private void SaveInstallLog()
{
if (!Directory.Exists("Logs"))
{
Directory.CreateDirectory("Logs");
}
var fileName = Path.Combine("Logs", DateTime.Now.ToString("yyyy-MM-dd hh-mm") + ".xary.txt");
File.WriteAllText(fileName, Logs);
}
}
}

View File

@ -17,7 +17,7 @@ namespace ProxySuper.Core.ViewModels
{
get
{
return Settings.Types.Contains(XrayType.VLESS_TCP_XTLS);
return Settings.Types.Contains(RayType.VLESS_TCP_XTLS);
}
}
@ -25,7 +25,7 @@ namespace ProxySuper.Core.ViewModels
{
get
{
return Settings.Types.Contains(XrayType.VLESS_TCP);
return Settings.Types.Contains(RayType.VLESS_TCP);
}
}
@ -33,7 +33,7 @@ namespace ProxySuper.Core.ViewModels
{
get
{
return Settings.Types.Contains(XrayType.VLESS_WS);
return Settings.Types.Contains(RayType.VLESS_WS);
}
}
@ -41,7 +41,7 @@ namespace ProxySuper.Core.ViewModels
{
get
{
return Settings.Types.Contains(XrayType.VLESS_KCP);
return Settings.Types.Contains(RayType.VLESS_KCP);
}
}
@ -49,7 +49,7 @@ namespace ProxySuper.Core.ViewModels
{
get
{
return Settings.Types.Contains(XrayType.VLESS_gRPC);
return Settings.Types.Contains(RayType.VLESS_gRPC);
}
}
@ -57,7 +57,7 @@ namespace ProxySuper.Core.ViewModels
{
get
{
return Settings.Types.Contains(XrayType.VMESS_TCP);
return Settings.Types.Contains(RayType.VMESS_TCP);
}
}
@ -65,7 +65,7 @@ namespace ProxySuper.Core.ViewModels
{
get
{
return Settings.Types.Contains(XrayType.VMESS_WS);
return Settings.Types.Contains(RayType.VMESS_WS);
}
}
@ -73,7 +73,7 @@ namespace ProxySuper.Core.ViewModels
{
get
{
return Settings.Types.Contains(XrayType.VMESS_KCP);
return Settings.Types.Contains(RayType.VMESS_KCP);
}
}
@ -81,7 +81,7 @@ namespace ProxySuper.Core.ViewModels
{
get
{
return Settings.Types.Contains(XrayType.Trojan_TCP);
return Settings.Types.Contains(RayType.Trojan_TCP);
}
}
@ -89,7 +89,7 @@ namespace ProxySuper.Core.ViewModels
{
get
{
return Settings.Types.Contains(XrayType.ShadowsocksAEAD);
return Settings.Types.Contains(RayType.ShadowsocksAEAD);
}
}
}

View File

@ -170,25 +170,25 @@ namespace ProxySuper.Core.ViewModels
{
get
{
return Settings.Types.Contains(XrayType.Trojan_TCP);
return Settings.Types.Contains(RayType.Trojan_TCP);
}
set
{
if (value == true)
{
if (!Settings.Types.Contains(XrayType.Trojan_TCP))
Settings.Types.Add(XrayType.Trojan_TCP);
if (!Settings.Types.Contains(RayType.Trojan_TCP))
Settings.Types.Add(RayType.Trojan_TCP);
}
else
{
Settings.Types.Remove(XrayType.Trojan_TCP);
Settings.Types.Remove(RayType.Trojan_TCP);
}
RaisePropertyChanged("Checked_Trojan_TCP");
}
}
public string Trojan_TCP_ShareLink
{
get => ShareLink.Build(XrayType.Trojan_TCP, Settings);
get => ShareLink.Build(RayType.Trojan_TCP, Settings);
}
private List<string> _ssMethods = new List<string> { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305" };
@ -196,10 +196,10 @@ namespace ProxySuper.Core.ViewModels
public bool CheckedShadowSocks
{
get => Settings.Types.Contains(XrayType.ShadowsocksAEAD);
get => Settings.Types.Contains(RayType.ShadowsocksAEAD);
set
{
CheckBoxChanged(value, XrayType.ShadowsocksAEAD);
CheckBoxChanged(value, RayType.ShadowsocksAEAD);
RaisePropertyChanged("CheckedShadowSocks");
}
}
@ -222,11 +222,11 @@ namespace ProxySuper.Core.ViewModels
}
public string ShadowSocksShareLink
{
get => ShareLink.Build(XrayType.ShadowsocksAEAD, Settings);
get => ShareLink.Build(RayType.ShadowsocksAEAD, Settings);
}
private void CheckBoxChanged(bool value, XrayType type)
private void CheckBoxChanged(bool value, RayType type)
{
if (value == true)
{
@ -259,10 +259,10 @@ namespace ProxySuper.Core.ViewModels
// vmess tcp
public bool Checked_VMESS_TCP
{
get => Settings.Types.Contains(XrayType.VMESS_TCP);
get => Settings.Types.Contains(RayType.VMESS_TCP);
set
{
CheckBoxChanged(value, XrayType.VMESS_TCP);
CheckBoxChanged(value, RayType.VMESS_TCP);
RaisePropertyChanged("Checked_VMESS_TCP");
}
}
@ -273,16 +273,16 @@ namespace ProxySuper.Core.ViewModels
}
public string VMESS_TCP_ShareLink
{
get => ShareLink.Build(XrayType.VMESS_TCP, Settings);
get => ShareLink.Build(RayType.VMESS_TCP, Settings);
}
// vmess ws
public bool Checked_VMESS_WS
{
get => Settings.Types.Contains(XrayType.VMESS_WS);
get => Settings.Types.Contains(RayType.VMESS_WS);
set
{
CheckBoxChanged(value, XrayType.VMESS_WS);
CheckBoxChanged(value, RayType.VMESS_WS);
RaisePropertyChanged("Checked_VMESS_WS");
}
}
@ -293,7 +293,7 @@ namespace ProxySuper.Core.ViewModels
}
public string VMESS_WS_ShareLink
{
get => ShareLink.Build(XrayType.VMESS_WS, Settings);
get => ShareLink.Build(RayType.VMESS_WS, Settings);
}
// vmess kcp
@ -316,16 +316,16 @@ namespace ProxySuper.Core.ViewModels
}
public bool Checked_VMESS_KCP
{
get => Settings.Types.Contains(XrayType.VMESS_KCP);
get => Settings.Types.Contains(RayType.VMESS_KCP);
set
{
CheckBoxChanged(value, XrayType.VMESS_KCP);
CheckBoxChanged(value, RayType.VMESS_KCP);
RaisePropertyChanged("Checked_VMESS_KCP");
}
}
public string VMESS_KCP_ShareLink
{
get => ShareLink.Build(XrayType.VMESS_KCP, Settings);
get => ShareLink.Build(RayType.VMESS_KCP, Settings);
}
@ -342,31 +342,31 @@ namespace ProxySuper.Core.ViewModels
// vless xtls
public bool Checked_VLESS_TCP_XTLS
{
get => Settings.Types.Contains(XrayType.VLESS_TCP_XTLS);
get => Settings.Types.Contains(RayType.VLESS_TCP_XTLS);
set
{
CheckBoxChanged(value, XrayType.VLESS_TCP_XTLS);
CheckBoxChanged(value, RayType.VLESS_TCP_XTLS);
RaisePropertyChanged("Checked_VLESS_TCP_XTLS");
}
}
public string VLESS_TCP_XTLS_ShareLink
{
get => ShareLink.Build(XrayType.VLESS_TCP_XTLS, Settings);
get => ShareLink.Build(RayType.VLESS_TCP_XTLS, Settings);
}
// vless tcp
public bool Checked_VLESS_TCP
{
get => Settings.Types.Contains(XrayType.VLESS_TCP);
get => Settings.Types.Contains(RayType.VLESS_TCP);
set
{
CheckBoxChanged(value, XrayType.VLESS_TCP);
CheckBoxChanged(value, RayType.VLESS_TCP);
RaisePropertyChanged("Checked_VLESS_TCP");
}
}
public string VLESS_TCP_ShareLink
{
get => ShareLink.Build(XrayType.VLESS_TCP, Settings);
get => ShareLink.Build(RayType.VLESS_TCP, Settings);
}
@ -380,17 +380,17 @@ namespace ProxySuper.Core.ViewModels
{
get
{
return Settings.Types.Contains(XrayType.VLESS_WS);
return Settings.Types.Contains(RayType.VLESS_WS);
}
set
{
CheckBoxChanged(value, XrayType.VLESS_WS);
CheckBoxChanged(value, RayType.VLESS_WS);
RaisePropertyChanged("Checked_VLESS_WS");
}
}
public string VLESS_WS_ShareLink
{
get => ShareLink.Build(XrayType.VLESS_WS, Settings);
get => ShareLink.Build(RayType.VLESS_WS, Settings);
}
// vless kcp
@ -413,16 +413,16 @@ namespace ProxySuper.Core.ViewModels
}
public bool Checked_VLESS_KCP
{
get => Settings.Types.Contains(XrayType.VLESS_KCP);
get => Settings.Types.Contains(RayType.VLESS_KCP);
set
{
CheckBoxChanged(value, XrayType.VLESS_KCP);
CheckBoxChanged(value, RayType.VLESS_KCP);
RaisePropertyChanged("Checked_VLESS_KCP");
}
}
public string VLESS_KCP_ShareLink
{
get => ShareLink.Build(XrayType.VLESS_KCP, Settings);
get => ShareLink.Build(RayType.VLESS_KCP, Settings);
}
// vless grpc
@ -438,16 +438,16 @@ namespace ProxySuper.Core.ViewModels
}
public bool Checked_VLESS_gRPC
{
get => Settings.Types.Contains(XrayType.VLESS_gRPC);
get => Settings.Types.Contains(RayType.VLESS_gRPC);
set
{
CheckBoxChanged(value, XrayType.VLESS_gRPC);
CheckBoxChanged(value, RayType.VLESS_gRPC);
RaisePropertyChanged("Checked_VLESS_gRPC");
}
}
public string VLESS_gRPC_ShareLink
{
get => ShareLink.Build(XrayType.VLESS_gRPC, Settings);
get => ShareLink.Build(RayType.VLESS_gRPC, Settings);
}
}

View File

@ -0,0 +1,332 @@
<UserControl x:Class="ProxySuper.WPF.Controls.V2raySettingsControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:ProxySuper.WPF.Controls"
xmlns:convert="clr-namespace:ProxySuper.Core.Converters;assembly=ProxySuper.Core"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<UserControl.Resources>
<convert:VisibleConverter x:Key="VisibleConverter" />
</UserControl.Resources>
<StackPanel Orientation="Horizontal">
<StackPanel Width="220">
<!--TCP-->
<CheckBox Margin="0,15,0,0"
VerticalContentAlignment="Center"
IsChecked="{Binding Path=Checked_VLESS_TCP}">
<Label Content="{DynamicResource VlessTcpDesc}" FontSize="13" Foreground="LimeGreen" />
</CheckBox>
<!--WebSocket-->
<CheckBox Margin="0,15,0,0"
VerticalContentAlignment="Center"
IsChecked="{Binding Path=Checked_VLESS_WS}">
<Label Content="{DynamicResource VlessWsDesc}" FontSize="13" Foreground="LimeGreen" />
</CheckBox>
<!--mKCP-->
<CheckBox Margin="0,15,0,0"
VerticalContentAlignment="Center"
Foreground="LimeGreen"
IsChecked="{Binding Path=Checked_VLESS_KCP}">
<Label Content="{DynamicResource VlessKcpDesc}" FontSize="13" Foreground="LimeGreen" />
</CheckBox>
<!--gRPC-->
<CheckBox Margin="0,15,0,0"
VerticalContentAlignment="Center"
Foreground="LimeGreen"
IsChecked="{Binding Path=Checked_VLESS_gRPC}">
<Label Content="VLESS gRPC&#x0a;基于http2多路复用。" FontSize="13" Foreground="LimeGreen" />
</CheckBox>
<!--TCP-->
<!--<CheckBox Content="VMESS over TCP with TLS&#x0a;不推荐"
Margin="0,15,0,0"
FontSize="13"
Style="{StaticResource MahApps.Styles.CheckBox}"
IsChecked="{Binding Path=Checked_VMESS_TCP}" />-->
<!--WebSocket-->
<CheckBox Margin="0,15,0,0"
VerticalContentAlignment="Center"
IsChecked="{Binding Path=Checked_VMESS_WS}">
<Label Content="{DynamicResource VmessWsDesc}" FontSize="13" Foreground="Blue" />
</CheckBox>
<!--mKCP-->
<CheckBox Margin="0,15,0,0"
VerticalContentAlignment="Center"
IsChecked="{Binding Path=Checked_VMESS_KCP}">
<Label Foreground="Blue" FontSize="13" Content="{DynamicResource VmessKcpDesc}" />
</CheckBox>
<!--ss-->
<CheckBox Margin="0,15,0,0"
VerticalContentAlignment="Center"
IsChecked="{Binding Path=CheckedShadowSocks}">
<Label Content="{DynamicResource SSDesc}" FontSize="13" Foreground="Fuchsia" />
</CheckBox>
<!--Trojan-->
<CheckBox Margin="0,15,0,0"
Foreground="CadetBlue"
VerticalContentAlignment="Center"
IsChecked="{Binding Path=Checked_Trojan_TCP}">
<Label Content="{DynamicResource TrojanDesc}" FontSize="13" Foreground="CadetBlue" />
</CheckBox>
</StackPanel>
<!--************************** 参数 **************************-->
<StackPanel>
<!--Domain-->
<StackPanel Margin="30,15,0,0"
Orientation="Horizontal">
<Label Content="{DynamicResource XrayDomain}" Width="120" />
<TextBox Text="{Binding Path=Domain}" Width="200" />
</StackPanel>
<!--Mask Domain-->
<StackPanel Margin="30,15,0,0"
Orientation="Horizontal">
<Label Content="{DynamicResource XrayMarkDomain}" Width="120" />
<TextBox Text="{Binding Path=MaskDomain}" Width="200" />
</StackPanel>
<StackPanel Margin="30,15,0,0"
Orientation="Horizontal">
<Label Content="{DynamicResource XrayWithTLS}" Width="120" />
<CheckBox IsChecked="{Binding Path=WithTLS}"
Content="{DynamicResource XrayWithTLSDesc}"
VerticalContentAlignment="Center"
VerticalAlignment="Center" />
</StackPanel>
<!--UUID-->
<StackPanel Margin="30,10,0,0"
Orientation="Horizontal">
<Label Content="{DynamicResource XrayUUID}" Width="120" />
<TextBox Text="{Binding Path=UUID}"
Width="200" />
<Button Margin="5,0,0,0"
Padding="12,3"
Command="{Binding Path=RandomUuid}"
Content="{DynamicResource Random}" />
</StackPanel>
<!--WebSocket Path-->
<StackPanel Margin="30,15,0,0"
Orientation="Horizontal"
Visibility="{
Binding Path=Checked_VLESS_WS,
Converter={StaticResource VisibleConverter}
}">
<Label Content="{DynamicResource VlessWsPath}" Foreground="LimeGreen" Width="120" />
<TextBox Text="{Binding Path=VLESS_WS_Path}"
Width="200" />
</StackPanel>
<!--seed-->
<StackPanel Margin="30,15,0,0"
Orientation="Horizontal"
Visibility="{
Binding Path=Checked_VLESS_KCP,
Converter={StaticResource VisibleConverter}
}">
<Label Content="{DynamicResource VlessKcpSeed}" Foreground="LimeGreen" Width="120" />
<TextBox Text="{Binding Path=VLESS_KCP_Seed}" Width="200" />
</StackPanel>
<!--kcp type-->
<StackPanel Margin="30,15,0,0"
Visibility="{
Binding Path=Checked_VLESS_KCP,
Converter={StaticResource VisibleConverter}
}" Orientation="Horizontal">
<Label Content="{DynamicResource VlessKcpType}" Foreground="LimeGreen" Width="120" />
<ComboBox Width="200"
ItemsSource="{Binding Path=KcpTypes}"
SelectedValue="{Binding VLESS_KCP_Type,Mode=TwoWay}">
</ComboBox>
</StackPanel>
<!--kcp port-->
<StackPanel Margin="30,15,0,0"
Visibility="{
Binding Path=Checked_VLESS_KCP,
Converter={StaticResource VisibleConverter}
}"
Orientation="Horizontal">
<Label Content="{DynamicResource VlessKcpPort}" Width="120" Foreground="LimeGreen" />
<TextBox Text="{Binding Path=VLESS_KCP_Port}" Width="200" />
</StackPanel>
<!--gRPC Port-->
<StackPanel Margin="30,15,0,0"
Orientation="Horizontal"
Visibility="{
Binding Path=Checked_VLESS_gRPC,
Converter={StaticResource VisibleConverter}
}">
<Label Content="{DynamicResource VlessRPCPort}" Width="120" Foreground="LimeGreen" />
<TextBox Text="{Binding Path=VLESS_gRPC_Port}" Width="200" />
</StackPanel>
<StackPanel Margin="30,15,0,0"
Orientation="Horizontal"
Visibility="{
Binding Path=Checked_VLESS_gRPC,
Converter={StaticResource VisibleConverter}
}">
<Label Content="{DynamicResource VlessRPCName}" Width="120" Foreground="LimeGreen" />
<TextBox Text="{Binding Path=VLESS_gRPC_ServiceName}" Width="200" />
</StackPanel>
<!--Tcp Path
<StackPanel Margin="30,15,0,0"
Orientation="Horizontal"
Visibility="{
Binding Path=Checked_VMESS_TCP,
Converter={StaticResource VisibleConverter}
}">
<Label Content="VMESS WS路径" Foreground="Blue" Width="120" />
<TextBox Text="{Binding Path=VMESS_TCP_Path}"
VerticalAlignment="Bottom"
Width="200" />
</StackPanel>-->
<!--WebSocket Path-->
<StackPanel Margin="30,15,0,0"
Orientation="Horizontal"
Visibility="{
Binding Path=Checked_VMESS_WS,
Converter={StaticResource VisibleConverter}
}">
<Label Content="{DynamicResource VmessWsPath}" Foreground="Blue" Width="120" />
<TextBox Text="{Binding Path=VMESS_WS_Path}"
VerticalAlignment="Bottom"
Width="200" />
</StackPanel>
<!--seed-->
<StackPanel Margin="30,15,0,0"
Orientation="Horizontal"
Visibility="{
Binding Path=Checked_VMESS_KCP,
Converter={StaticResource VisibleConverter}
}">
<Label Content="{DynamicResource VmessKcpSeed}" Foreground="Blue" Width="120" />
<TextBox Text="{Binding Path=VMESS_KCP_Seed}" Width="200" />
</StackPanel>
<!--kcp type-->
<StackPanel Margin="30,15,0,0"
Orientation="Horizontal"
Visibility="{
Binding Path=Checked_VMESS_KCP,
Converter={StaticResource VisibleConverter}
}">
<Label Content="{DynamicResource VmessKcpType}" Foreground="Blue" Width="120" VerticalAlignment="Bottom"/>
<ComboBox Width="200"
VerticalAlignment="Bottom"
ItemsSource="{Binding Path=KcpTypes}"
SelectedValue="{Binding VMESS_KCP_Type,Mode=TwoWay}">
</ComboBox>
</StackPanel>
<!--kcp port-->
<StackPanel Margin="30,15,0,0"
Orientation="Horizontal"
Visibility="{
Binding Path=Checked_VMESS_KCP,
Converter={StaticResource VisibleConverter}
}">
<Label Content="{DynamicResource VmessKcpPort}" Foreground="Blue" Width="120" />
<TextBox Text="{Binding Path=VMESS_KCP_Port}" Width="200" />
</StackPanel>
<!--ss密码-->
<StackPanel Margin="30,15,0,0"
Orientation="Horizontal"
Visibility="{
Binding Path=CheckedShadowSocks,
Converter={StaticResource VisibleConverter}
}">
<Label Content="{DynamicResource SSPassword}" Foreground="Fuchsia" Width="120" />
<TextBox Text="{Binding Path=ShadowSocksPassword}"
Width="200"/>
</StackPanel>
<!--ss加密方式-->
<StackPanel Margin="30,15,0,0"
Orientation="Horizontal"
Visibility="{
Binding Path=CheckedShadowSocks,
Converter={StaticResource VisibleConverter}
}">
<Label Content="{DynamicResource SSMethods}" Foreground="Fuchsia" Width="120" />
<ComboBox Width="200"
ItemsSource="{Binding ShadowSocksMethods}"
SelectedValue="{Binding ShadowSocksMethod}">
</ComboBox>
</StackPanel>
<!--ss端口-->
<StackPanel Margin="30,15,0,0"
Orientation="Horizontal"
Visibility="{
Binding Path=CheckedShadowSocks,
Converter={StaticResource VisibleConverter}
}">
<Label Content="{DynamicResource SSPort}" Foreground="Fuchsia" Width="120" />
<TextBox Text="{Binding Path=ShadowSocksPort}" Width="200"/>
</StackPanel>
<!--Trojan密码-->
<StackPanel Margin="30,15,0,0"
Orientation="Horizontal"
Visibility="{
Binding Path=Checked_Trojan_TCP,
Converter={StaticResource VisibleConverter}
}">
<Label Content="{DynamicResource TrojanPassword}" Foreground="CadetBlue" Width="120" />
<TextBox Text="{Binding Path=TrojanPassword}"
Width="200" />
</StackPanel>
<!--xray prot-->
<StackPanel Margin="30,15,0,0"
Orientation="Horizontal">
<Label Content="{DynamicResource XrayPort}" Foreground="Gray" Width="120" />
<TextBox Text="{Binding Path=Port}" Width="120" />
<Label Content="{DynamicResource XrayPortDefault}" Foreground="Red" />
</StackPanel>
<!--多用户-->
<StackPanel Margin="30,10,0,0"
Orientation="Vertical">
<StackPanel Orientation="Horizontal">
<Label Content="{DynamicResource MultiUser}" Width="120" />
<TextBox Text="{Binding Path=MultiUUID}"
Height="60"
TextWrapping="Wrap"
Width="200" />
</StackPanel>
<StackPanel>
<TextBlock Margin="120,3,0,0" Text="{DynamicResource MultiUserHelp}" />
</StackPanel>
</StackPanel>
</StackPanel>
</StackPanel>
</UserControl>

View File

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace ProxySuper.WPF.Controls
{
/// <summary>
/// V2raySettingsControl.xaml 的交互逻辑
/// </summary>
public partial class V2raySettingsControl : UserControl
{
public V2raySettingsControl()
{
InitializeComponent();
}
}
}

View File

@ -87,6 +87,9 @@
<Compile Include="Controls\Trojan_TCP_Control.xaml.cs">
<DependentUpon>Trojan_TCP_Control.xaml</DependentUpon>
</Compile>
<Compile Include="Controls\V2raySettingsControl.xaml.cs">
<DependentUpon>V2raySettingsControl.xaml</DependentUpon>
</Compile>
<Compile Include="Controls\VLESS_gRPC_Control.xaml.cs">
<DependentUpon>VLESS_gRPC_Control.xaml</DependentUpon>
</Compile>
@ -153,6 +156,15 @@
<Compile Include="Views\TrojanGo\TrojanGoInstallView.xaml.cs">
<DependentUpon>TrojanGoInstallView.xaml</DependentUpon>
</Compile>
<Compile Include="Views\V2ray\V2rayConfigView.xaml.cs">
<DependentUpon>V2rayConfigView.xaml</DependentUpon>
</Compile>
<Compile Include="Views\V2ray\V2rayEditorView.xaml.cs">
<DependentUpon>V2rayEditorView.xaml</DependentUpon>
</Compile>
<Compile Include="Views\V2ray\V2rayInstallView.xaml.cs">
<DependentUpon>V2rayInstallView.xaml</DependentUpon>
</Compile>
<Compile Include="Views\Xray\XrayEditorView.xaml.cs">
<DependentUpon>XrayEditorView.xaml</DependentUpon>
</Compile>
@ -178,6 +190,10 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Controls\V2raySettingsControl.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Controls\VLESS_gRPC_Control.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
@ -290,6 +306,18 @@
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Views\V2ray\V2rayConfigView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Views\V2ray\V2rayEditorView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Views\V2ray\V2rayInstallView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Views\Xray\XrayEditorView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
@ -335,6 +363,114 @@
<None Include="Templates\trojan-go\trojan-go.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\base.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\caddy\base.caddyfile">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\client\00_log\00_log.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\client\01_api\01_api.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\client\02_dns\02_dns.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\client\03_routing\03_routing.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\client\04_policy\04_policy.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\client\05_inbounds\05_inbounds.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\client\06_outbounds\06_outbounds.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\client\06_outbounds\VLESS_HTTP2_TLS.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\client\06_outbounds\VLESS_TCP_TLS_WS.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\client\07_transport\07_transport.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\client\08_stats\08_stats.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\client\09_reverse\09_reverse.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\server\00_log\00_log.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\server\01_api\01_api.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\server\02_dns\02_dns.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\server\03_routing\03_routing.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\server\04_policy\04_policy.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\server\05_inbounds\05_inbounds.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\server\05_inbounds\Shadowsocks-AEAD.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\server\05_inbounds\Trojan_TCP.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\server\05_inbounds\Trojan_WS.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\server\05_inbounds\VLESS_gRPC.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\server\05_inbounds\VLESS_HTTP2.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\server\05_inbounds\VLESS_KCP.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\server\05_inbounds\VLESS_TCP_TLS.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\server\05_inbounds\VLESS_WS.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\server\05_inbounds\VMESS_HTTP2.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\server\05_inbounds\VMESS_KCP.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\server\05_inbounds\VMESS_TCP.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\server\05_inbounds\VMESS_WS.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\server\06_outbounds\06_outbounds.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\server\07_transport\07_transport.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\server\08_stats\08_stats.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\v2ray\server\09_reverse\09_reverse.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Templates\xray\base.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>

View File

@ -0,0 +1,12 @@
{
"log": {},
"api": {},
"dns": {},
"routing": {},
"policy": {},
"inbounds": [],
"outbounds": [],
"transport": {},
"stats": {},
"reverse": {}
}

View File

@ -0,0 +1,9 @@
:##port## {
root * /usr/share/caddy
file_server
##reverse_proxy##
}
##domain##:80 {
redir https://##domain##{uri}
}

View File

@ -0,0 +1,5 @@
{
"log": {
"loglevel": "warning"
}
}

View File

@ -0,0 +1,3 @@
{
"api": null
}

View File

@ -0,0 +1,3 @@
{
"dns": {}
}

View File

@ -0,0 +1,3 @@
{
"routing": {}
}

View File

@ -0,0 +1,3 @@
{
"policy": {}
}

View File

@ -0,0 +1,23 @@
{
"inbounds": [
{
"protocol": "http",
"port": 1081
},
{
"port": 1080,
"protocol": "socks",
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
]
},
"settings": {
"udp": true,
"auth": "noauth"
}
}
]
}

View File

@ -0,0 +1,3 @@
{
"outbounds": []
}

View File

@ -0,0 +1,31 @@
{
"outbounds": [
{
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "",
"port": 443,
"users": [
{
"id": "",
"encryption": "none"
}
]
}
]
},
"streamSettings": {
"network": "h2",
"security": "tls",
"httpSettings": {
"host": [
""
],
"path": null
}
}
}
]
}

View File

@ -0,0 +1,32 @@
{
"outbounds": [
{
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "",
"port": 443,
"users": [
{
"id": "",
"encryption": "none",
"level": 0
}
]
}
]
},
"streamSettings": {
"network": "ws",
"security": "tls",
"tlsSettings": {
"serverName": ""
},
"wsSettings": {
"path": ""
}
}
}
]
}

View File

@ -0,0 +1,3 @@
{
"transport": {}
}

View File

@ -0,0 +1,3 @@
{
"stats": null
}

View File

@ -0,0 +1,3 @@
{
"reverse": {}
}

View File

@ -0,0 +1,6 @@
{
"log": {
"access": "none",
"loglevel": "none"
}
}

View File

@ -0,0 +1,3 @@
{
"api": {}
}

View File

@ -0,0 +1,3 @@
{
"dns": {}
}

View File

@ -0,0 +1,14 @@
{
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"ip": [
"geoip:private"
],
"outboundTag": "block"
}
]
}
}

View File

@ -0,0 +1,3 @@
{
"policy": {}
}

View File

@ -0,0 +1,3 @@
{
"inbounds": []
}

View File

@ -0,0 +1,13 @@
{
"port": 12345,
"protocol": "shadowsocks",
"settings": {
"clients": [
{
"password": "",
"method": "aes-128-gcm"
}
],
"network": "tcp,udp"
}
}

View File

@ -0,0 +1,24 @@
{
"port": 1310,
"listen": "127.0.0.1",
"protocol": "trojan",
"settings": {
"clients": [
{
"password": ""
}
],
"fallbacks": [
{
"dest": 8080
}
]
},
"streamSettings": {
"network": "tcp",
"security": "none",
"tcpSettings": {
"acceptProxyProtocol": true
}
}
}

View File

@ -0,0 +1,26 @@
{
"port": 1320,
"listen": "127.0.0.1",
"protocol": "trojan",
"settings": {
"clients": [
{
"password": ""
}
],
"fallbacks": [
{
"dest": 80
}
]
},
"streamSettings": {
"network": "ws",
"security": "none",
"wsSettings": {
"acceptProxyProtocol": true,
"path": "/trojanws"
}
}
}

View File

@ -0,0 +1,19 @@
{
"port": 1234,
"listen": "127.0.0.1",
"protocol": "vmess",
"settings": {
"decryption": "none",
"clients": [
{
"id": ""
}
]
},
"streamSettings": {
"network": "h2",
"httpSettings": {
"path": ""
}
}
}

View File

@ -0,0 +1,24 @@
{
"port": 3456,
"protocol": "vless",
"settings": {
"clients": [
{
"id": ""
}
],
"decryption": "none"
},
"streamSettings": {
"network": "mkcp",
"kcpSettings": {
"uplinkCapacity": 100,
"downlinkCapacity": 100,
"congestion": true,
"header": {
"type": "none"
},
"seed": null
}
}
}

View File

@ -0,0 +1,30 @@
{
"port": 443,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "",
"level": 0
}
],
"decryption": "none",
"fallbacks": []
},
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"alpn": [
"h2",
"http/1.1"
],
"certificates": [
{
"certificateFile": "/usr/local/etc/v2ray/ssl/xray_ssl.crt",
"keyFile": "/usr/local/etc/v2ray/ssl/xray_ssl.key"
}
]
}
}
}

View File

@ -0,0 +1,21 @@
{
"port": 1234,
"listen": "127.0.0.1",
"protocol": "vless",
"settings": {
"clients": [
{
"id": ""
}
],
"decryption": "none"
},
"streamSettings": {
"network": "ws",
"security": "none",
"wsSettings": {
"acceptProxyProtocol": true,
"path": "/websocket"
}
}
}

View File

@ -0,0 +1,32 @@
{
"port": 2002,
"listen": "0.0.0.0",
"protocol": "vless",
"settings": {
"clients": [
{
"id": ""
}
],
"decryption": "none"
},
"streamSettings": {
"network": "gun",
"security": "tls",
"tlsSettings": {
"serverName": "domain",
"alpn": [
"h2"
],
"certificates": [
{
"certificateFile": "/usr/local/etc/xray/ssl/xray_ssl.crt",
"keyFile": "/usr/local/etc/xray/ssl/xray_ssl.key"
}
]
},
"grpcSettings": {
"serviceName": "service_name"
}
}
}

View File

@ -0,0 +1,18 @@
{
"port": 1234,
"listen": "127.0.0.1",
"protocol": "vmess",
"settings": {
"clients": [
{
"id": ""
}
]
},
"streamSettings": {
"network": "h2",
"httpSettings": {
"path": ""
}
}
}

View File

@ -0,0 +1,23 @@
{
"port": 3456,
"protocol": "vmess",
"settings": {
"clients": [
{
"id": ""
}
]
},
"streamSettings": {
"network": "mkcp",
"kcpSettings": {
"uplinkCapacity": 100,
"downlinkCapacity": 100,
"congestion": true,
"header": {
"type": "none"
},
"seed": null
}
}
}

View File

@ -0,0 +1,27 @@
{
"port": 443,
"listen": "127.0.0.1",
"protocol": "vmess",
"settings": {
"clients": [
{
"id": ""
}
]
},
"streamSettings": {
"network": "tcp",
"security": "none",
"tcpSettings": {
"acceptProxyProtocol": true,
"header": {
"type": "http",
"request": {
"path": [
"/vmesstcp"
]
}
}
}
}
}

View File

@ -0,0 +1,20 @@
{
"port": 3456,
"listen": "127.0.0.1",
"protocol": "vmess",
"settings": {
"clients": [
{
"id": ""
}
]
},
"streamSettings": {
"network": "ws",
"security": "none",
"wsSettings": {
"acceptProxyProtocol": true,
"path": "/vmessws"
}
}
}

View File

@ -0,0 +1,12 @@
{
"outbounds": [
{
"protocol": "freedom",
"tag": "direct"
},
{
"protocol": "blackhole",
"tag": "block"
}
]
}

View File

@ -0,0 +1,3 @@
{
"transport": {}
}

View File

@ -0,0 +1,3 @@
{
"stats": {}
}

View File

@ -0,0 +1,3 @@
{
"reverse": {}
}

View File

@ -16,6 +16,7 @@
<Menu Background="White" Grid.Row="0" BorderThickness="0,0,0,2" BorderBrush="#eee">
<MenuItem Header="{DynamicResource MainMenuAddHost}" Padding="10,3">
<MenuItem Padding="0,5" Header="Xray" Command="{Binding AddXrayCommand}"></MenuItem>
<MenuItem Padding="0,5" Header="V2ray" Command="{Binding AddV2rayCommand}"></MenuItem>
<MenuItem Padding="0,5" Header="Trojan-Go" Command="{Binding AddTrojanGoCommand}"></MenuItem>
<MenuItem Padding="0,5" Header="NaiveProxy" Command="{Binding AddNaiveProxyCommand}"></MenuItem>
<MenuItem Padding="0,5" Header="Brook" Command="{Binding AddBrookCommand}"></MenuItem>

View File

@ -0,0 +1,96 @@
<views:MvxWindow x:Class="ProxySuper.WPF.Views.V2ray.V2rayConfigView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ProxySuper.WPF.Views.V2ray"
xmlns:views="clr-namespace:MvvmCross.Platforms.Wpf.Views;assembly=MvvmCross.Platforms.Wpf"
xmlns:ctrl="clr-namespace:ProxySuper.WPF.Controls"
xmlns:models="clr-namespace:ProxySuper.Core.Models.Projects;assembly=ProxySuper.Core"
mc:Ignorable="d"
WindowStartupLocation="CenterScreen"
Title="V2ray节点配置" Height="600" Width="1000">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="220" />
</Grid.ColumnDefinitions>
<TabControl Grid.Column="0"
Padding="10"
BorderThickness="1,0,1,0"
BorderBrush="#DDD"
TabStripPlacement="Left"
SelectionChanged="BuildQrCode">
<TabItem Width="200" Height="40"
Tag="{x:Static models:RayType.VLESS_TCP}"
IsEnabled="{Binding Checked_VLESS_TCP}"
Header="VLESS-TCP-TLS">
<ctrl:VLESS_TCP_TLS_Control />
</TabItem>
<TabItem Width="200" Height="40"
Tag="{x:Static models:RayType.VLESS_WS}"
IsEnabled="{Binding Checked_VLESS_WS}"
Header="VLESS-WebSocket-TLS">
<ctrl:VLESS_WS_TLS_Control />
</TabItem>
<TabItem Width="200" Height="40"
Tag="{x:Static models:RayType.VLESS_KCP}"
IsEnabled="{Binding Checked_VLESS_KCP}"
Header="VLESS-mKCP">
<ctrl:VLESS_KCP_Control />
</TabItem>
<TabItem Width="200" Height="40"
Tag="{x:Static models:RayType.VLESS_gRPC}"
IsEnabled="{Binding Checked_VLESS_gRPC}"
Header="VLESS-gRPC">
<ctrl:VLESS_gRPC_Control />
</TabItem>
<!--<TabItem Width="200" Height="40"
Tag="{x:Static models:XrayType.VMESS_TCP}"
IsEnabled="{Binding Checked_VMESS_TCP}"
Header="VMESS-TCP-TLS">
<ctrl:VMESS_TCP_TLS_Control />
</TabItem>-->
<TabItem Width="200" Height="40"
Tag="{x:Static models:RayType.VMESS_WS}"
IsEnabled="{Binding Checked_VMESS_WS}"
Header="VMESS-WebSocket-TLS">
<ctrl:VMESS_WS_TLS_Control />
</TabItem>
<TabItem Width="200" Height="40"
Tag="{x:Static models:RayType.VMESS_KCP}"
IsEnabled="{Binding Checked_VMESS_KCP}"
Header="VMESS-mKCP">
<ctrl:VMESS_KCP_Control />
</TabItem>
<TabItem Width="200" Height="40"
Tag="{x:Static models:RayType.Trojan_TCP}"
IsEnabled="{Binding Checked_Trojan_TCP}"
Header="Trojan-TCP">
<ctrl:Trojan_TCP_Control />
</TabItem>
<TabItem Width="200" Height="40"
Tag="{x:Static models:RayType.ShadowsocksAEAD}"
IsEnabled="{Binding CheckedShadowSocks}"
Header="ShadowSocks">
<ctrl:ShadowSocksControl />
</TabItem>
</TabControl>
<StackPanel Grid.Column="1" >
<Image Width="200" Height="200" x:Name="QrImage" />
<Button Click="SaveImage" Width="100" Content="{DynamicResource SaveAs}" />
</StackPanel>
</Grid>
</views:MvxWindow>

View File

@ -0,0 +1,128 @@
using Microsoft.Win32;
using MvvmCross.Platforms.Wpf.Views;
using ProxySuper.Core.Models.Projects;
using ProxySuper.Core.ViewModels;
using QRCoder;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace ProxySuper.WPF.Views.V2ray
{
/// <summary>
/// V2rayConfigView.xaml 的交互逻辑
/// </summary>
public partial class V2rayConfigView : MvxWindow
{
public V2rayConfigView()
{
InitializeComponent();
}
public V2raySettings Settings
{
get
{
return ((V2rayConfigViewModel)ViewModel).Settings;
}
}
private void BuildQrCode(object sender, SelectionChangedEventArgs e)
{
var tabControl = e.Source as TabControl;
var item = (tabControl.SelectedItem as TabItem);
if (item == null) return;
var type = (RayType)item.Tag;
BuildQrCode(type);
}
private void SaveImage(object sender, RoutedEventArgs e)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.FileName += QrImage.Tag;
sfd.Filter = "Image Files (*.bmp, *.png, *.jpg)|*.bmp;*.png;*.jpg | All Files | *.*";
sfd.RestoreDirectory = true;//保存对话框是否记忆上次打开的目录
if (sfd.ShowDialog() == true)
{
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create((BitmapSource)QrImage.Source));
using (FileStream stream = new FileStream(sfd.FileName, FileMode.Create))
encoder.Save(stream);
}
}
private void BuildQrCode(RayType type)
{
string shareLink = string.Empty;
switch (type)
{
case RayType.VLESS_TCP:
shareLink = Settings.VLESS_TCP_ShareLink;
break;
case RayType.VLESS_WS:
shareLink = Settings.VLESS_WS_ShareLink;
break;
case RayType.VLESS_H2:
break;
case RayType.VLESS_KCP:
shareLink = Settings.VLESS_KCP_ShareLink;
break;
case RayType.VLESS_gRPC:
shareLink = Settings.VLESS_gRPC_ShareLink;
break;
case RayType.VMESS_TCP:
shareLink = Settings.VMESS_TCP_ShareLink;
break;
case RayType.VMESS_WS:
shareLink = Settings.VMESS_WS_ShareLink;
break;
case RayType.VMESS_H2:
break;
case RayType.VMESS_KCP:
shareLink = Settings.VMESS_KCP_ShareLink;
break;
case RayType.Trojan_TCP:
shareLink = Settings.Trojan_TCP_ShareLink;
break;
case RayType.Trojan_WS:
break;
case RayType.ShadowsocksAEAD:
shareLink = Settings.ShadowSocksShareLink;
break;
default:
break;
}
QRCodeGenerator qrGenerator = new QRCodeGenerator();
QRCodeData qrCodeData = qrGenerator.CreateQrCode(shareLink, QRCodeGenerator.ECCLevel.Q);
QRCode qrCode = new QRCode(qrCodeData);
Bitmap qrCodeImage = qrCode.GetGraphic(20);
MemoryStream ms = new MemoryStream();
qrCodeImage.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
byte[] bytes = ms.GetBuffer();
ms.Close();
BitmapImage image = new BitmapImage();
image.BeginInit();
image.StreamSource = new MemoryStream(bytes);
image.EndInit();
QrImage.Source = image;
QrImage.Tag = type.ToString();
}
}
}

View File

@ -0,0 +1,65 @@
<views:MvxWindow x:Class="ProxySuper.WPF.Views.V2ray.V2rayEditorView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ProxySuper.WPF.Views.V2ray"
xmlns:views="clr-namespace:MvvmCross.Platforms.Wpf.Views;assembly=MvvmCross.Platforms.Wpf"
xmlns:ctrl="clr-namespace:ProxySuper.WPF.Controls"
mc:Ignorable="d"
WindowStartupLocation="CenterScreen"
Icon="/Resources/ProxySU.ico"
BorderThickness="0,1,0,0"
BorderBrush="#EEE"
Title="V2ray编辑配置" Height="610" Width="1015">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="310" />
<ColumnDefinition Width="1" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Margin="10">
<ctrl:HostControl />
</StackPanel>
<StackPanel Grid.Column="1" Background="#EEE"></StackPanel>
<StackPanel Grid.Column="2">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="500" />
<RowDefinition Height="80" />
</Grid.RowDefinitions>
<ScrollViewer Name="scroll"
Padding="10"
Height="500"
Grid.Row="0"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto" >
<ctrl:V2raySettingsControl />
</ScrollViewer>
<Border Grid.Row="1"
BorderBrush="#eee"
BorderThickness="0,1,0,0">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
<Button Content="{DynamicResource Save}"
Command="{Binding SaveCommand}"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Padding="10,5" />
<Button Content="{DynamicResource SaveAndInstall}"
Command="{Binding SaveAndInstallCommand}"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Padding="10,5"
Margin="20,0,40,0" />
</StackPanel>
</Border>
</Grid>
</StackPanel>
</Grid>
</views:MvxWindow>

View File

@ -0,0 +1,28 @@
using MvvmCross.Platforms.Wpf.Views;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace ProxySuper.WPF.Views.V2ray
{
/// <summary>
/// V2rayEditorView.xaml 的交互逻辑
/// </summary>
public partial class V2rayEditorView : MvxWindow
{
public V2rayEditorView()
{
InitializeComponent();
}
}
}

View File

@ -0,0 +1,69 @@
<views:MvxWindow x:Class="ProxySuper.WPF.Views.V2ray.V2rayInstallView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ProxySuper.WPF.Views.V2ray"
xmlns:ctrl="clr-namespace:ProxySuper.WPF.Controls"
xmlns:views="clr-namespace:MvvmCross.Platforms.Wpf.Views;assembly=MvvmCross.Platforms.Wpf"
mc:Ignorable="d"
WindowStartupLocation="CenterScreen"
Title="V2ray安装" Height="600" Width="1000">
<StackPanel>
<ctrl:ProgressControl />
<StackPanel Orientation="Horizontal" Margin="20,0,0,0">
<Label Content="{DynamicResource Install}" FontWeight="Bold" FontSize="14" />
<Button Content="{DynamicResource XrayInstallerInstall}"
Command="{Binding Path=InstallCommand}"
Padding="10,3"
Margin="10,0,0,0" />
<Button Content="{DynamicResource XrayInstallerUpdateSettings}"
Command="{Binding Path=UpdateSettingsCommand}"
Padding="10,3"
Margin="10,0,0,0" />
<Button Content="{DynamicResource XrayInstallerUpdateCore}"
Command="{Binding Path=UpdateV2rayCoreCommand}"
Padding="10,3"
Margin="10,0,0,0" />
<Button Content="{DynamicResource XrayInstallerUninstall}"
Command="{Binding Path=UninstallCommand}"
Padding="10,3"
Margin="10,0,0,0" />
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="20,15,0,0">
<Label Content="{DynamicResource Settings}" FontWeight="Bold" FontSize="14" />
<Button Content="{DynamicResource XrayInstallerUploadCert}"
Command="{Binding Path=UploadCertCommand}"
Padding="10,3"
Margin="10,0,0,0" />
<Button Content="{DynamicResource XrayInstallerInstallCert}"
Command="{Binding Path=ApplyForCertCommand}"
Padding="10,3"
Margin="10,0,0,0" />
<Button Content="{DynamicResource XrayInstallerUploadWeb}"
Command="{Binding Path=UploadWebCommand}"
Padding="10,3"
Margin="10,0,0,0" />
</StackPanel>
<StackPanel Margin="20,10,0,0" Orientation="Horizontal">
<Label Content="说明" FontWeight="Bold" FontSize="14" VerticalAlignment="Top" />
<StackPanel Margin="10,0,0,0">
<Label Content="1.【更新配置】 修改V2ray参数后只需使用此功能即可不需要重新安装。" FontSize="14" />
<Label Content="2.【更新内核】 官方V2ray修补漏洞或新功能可用此更新V2ray内核。" FontSize="14" />
<Label Content="3.【上传自有证书】 将 (.crt和.key) 文件打包成.zip文件名称随意后缀名不能变。" FontSize="14" />
<Label Content="4.【手动续签证书】 ProxySU会在证书到期时间自动续期此功能可手动提前续期。" FontSize="14" />
<Label Content="5.【上传伪装网站】 将根目录包含 (index.html) 的文件夹,打包为.zip文件。" FontSize="14" />
</StackPanel>
</StackPanel>
</StackPanel>
</views:MvxWindow>

View File

@ -0,0 +1,28 @@
using MvvmCross.Platforms.Wpf.Views;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace ProxySuper.WPF.Views.V2ray
{
/// <summary>
/// V2rayInstallView.xaml 的交互逻辑
/// </summary>
public partial class V2rayInstallView : MvxWindow
{
public V2rayInstallView()
{
InitializeComponent();
}
}
}

View File

@ -9,7 +9,7 @@
xmlns:models="clr-namespace:ProxySuper.Core.Models.Projects;assembly=ProxySuper.Core"
mc:Ignorable="d"
WindowStartupLocation="CenterScreen"
Title="XrayInfoView" Height="600" Width="1000">
Title="Xray节点配置" Height="600" Width="1000">
<Grid>
<Grid.ColumnDefinitions>
@ -24,35 +24,35 @@
TabStripPlacement="Left"
SelectionChanged="BuildQrCode">
<TabItem Width="200" Height="40"
Tag="{x:Static models:XrayType.VLESS_TCP_XTLS}"
Tag="{x:Static models:RayType.VLESS_TCP_XTLS}"
IsEnabled="{Binding Checked_VLESS_TCP_XTLS}"
Header="VLESS-TCP-XTLS">
<ctrl:VLESS_XTLS_Control />
</TabItem>
<TabItem Width="200" Height="40"
Tag="{x:Static models:XrayType.VLESS_TCP}"
Tag="{x:Static models:RayType.VLESS_TCP}"
IsEnabled="{Binding Checked_VLESS_TCP}"
Header="VLESS-TCP-TLS">
<ctrl:VLESS_TCP_TLS_Control />
</TabItem>
<TabItem Width="200" Height="40"
Tag="{x:Static models:XrayType.VLESS_WS}"
Tag="{x:Static models:RayType.VLESS_WS}"
IsEnabled="{Binding Checked_VLESS_WS}"
Header="VLESS-WebSocket-TLS">
<ctrl:VLESS_WS_TLS_Control />
</TabItem>
<TabItem Width="200" Height="40"
Tag="{x:Static models:XrayType.VLESS_KCP}"
Tag="{x:Static models:RayType.VLESS_KCP}"
IsEnabled="{Binding Checked_VLESS_KCP}"
Header="VLESS-mKCP">
<ctrl:VLESS_KCP_Control />
</TabItem>
<TabItem Width="200" Height="40"
Tag="{x:Static models:XrayType.VLESS_gRPC}"
Tag="{x:Static models:RayType.VLESS_gRPC}"
IsEnabled="{Binding Checked_VLESS_gRPC}"
Header="VLESS-gRPC">
<ctrl:VLESS_gRPC_Control />
@ -66,28 +66,28 @@
</TabItem>-->
<TabItem Width="200" Height="40"
Tag="{x:Static models:XrayType.VMESS_WS}"
Tag="{x:Static models:RayType.VMESS_WS}"
IsEnabled="{Binding Checked_VMESS_WS}"
Header="VMESS-WebSocket-TLS">
<ctrl:VMESS_WS_TLS_Control />
</TabItem>
<TabItem Width="200" Height="40"
Tag="{x:Static models:XrayType.VMESS_KCP}"
Tag="{x:Static models:RayType.VMESS_KCP}"
IsEnabled="{Binding Checked_VMESS_KCP}"
Header="VMESS-mKCP">
<ctrl:VMESS_KCP_Control />
</TabItem>
<TabItem Width="200" Height="40"
Tag="{x:Static models:XrayType.Trojan_TCP}"
Tag="{x:Static models:RayType.Trojan_TCP}"
IsEnabled="{Binding Checked_Trojan_TCP}"
Header="Trojan-TCP">
<ctrl:Trojan_TCP_Control />
</TabItem>
<TabItem Width="200" Height="40"
Tag="{x:Static models:XrayType.ShadowsocksAEAD}"
Tag="{x:Static models:RayType.ShadowsocksAEAD}"
IsEnabled="{Binding CheckedShadowSocks}"
Header="ShadowSocks">
<ctrl:ShadowSocksControl />

View File

@ -36,7 +36,7 @@ namespace ProxySuper.WPF.Views
var tabControl = e.Source as TabControl;
var item = (tabControl.SelectedItem as TabItem);
if (item == null) return;
var type = (XrayType)item.Tag;
var type = (RayType)item.Tag;
BuildQrCode(type);
}
@ -55,45 +55,45 @@ namespace ProxySuper.WPF.Views
}
}
private void BuildQrCode(XrayType type)
private void BuildQrCode(RayType type)
{
string shareLink = string.Empty;
switch (type)
{
case XrayType.VLESS_TCP_XTLS:
case RayType.VLESS_TCP_XTLS:
shareLink = Settings.VLESS_TCP_XTLS_ShareLink;
break;
case XrayType.VLESS_TCP:
case RayType.VLESS_TCP:
shareLink = Settings.VLESS_TCP_ShareLink;
break;
case XrayType.VLESS_WS:
case RayType.VLESS_WS:
shareLink = Settings.VLESS_WS_ShareLink;
break;
case XrayType.VLESS_H2:
case RayType.VLESS_H2:
break;
case XrayType.VLESS_KCP:
case RayType.VLESS_KCP:
shareLink = Settings.VLESS_KCP_ShareLink;
break;
case XrayType.VLESS_gRPC:
case RayType.VLESS_gRPC:
shareLink = Settings.VLESS_gRPC_ShareLink;
break;
case XrayType.VMESS_TCP:
case RayType.VMESS_TCP:
shareLink = Settings.VMESS_TCP_ShareLink;
break;
case XrayType.VMESS_WS:
case RayType.VMESS_WS:
shareLink = Settings.VMESS_WS_ShareLink;
break;
case XrayType.VMESS_H2:
case RayType.VMESS_H2:
break;
case XrayType.VMESS_KCP:
case RayType.VMESS_KCP:
shareLink = Settings.VMESS_KCP_ShareLink;
break;
case XrayType.Trojan_TCP:
case RayType.Trojan_TCP:
shareLink = Settings.Trojan_TCP_ShareLink;
break;
case XrayType.Trojan_WS:
case RayType.Trojan_WS:
break;
case XrayType.ShadowsocksAEAD:
case RayType.ShadowsocksAEAD:
shareLink = Settings.ShadowSocksShareLink;
break;
default:

View File

@ -11,7 +11,7 @@
Icon="/Resources/ProxySU.ico"
BorderThickness="0,1,0,0"
BorderBrush="#EEE"
Title="Xray" Height="610" Width="1015">
Title="Xray编辑配置" Height="610" Width="1015">
<Grid>
<Grid.ColumnDefinitions>

View File

@ -8,7 +8,7 @@
xmlns:views="clr-namespace:MvvmCross.Platforms.Wpf.Views;assembly=MvvmCross.Platforms.Wpf"
mc:Ignorable="d"
WindowStartupLocation="CenterScreen"
Title="XrayInstallView" Height="600" Width="1000">
Title="Xray安装" Height="600" Width="1000">
<StackPanel>
<ctrl:ProgressControl />