mirror of
https://github.com/proxysu/ProxySU.git
synced 2025-02-16 14:43:14 +03:00
update ip.sb
This commit is contained in:
parent
880494a331
commit
7584f49871
28
ProxySU.sln
28
ProxySU.sln
@ -1,23 +1,15 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.31005.135
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.1.32210.238
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProxySU", "ProxySU\ProxySU.csproj", "{DD5505BC-E7F1-4D03-ABC7-B636E893FC09}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProxySU_Core", "ProxySU_Core\ProxySU_Core.csproj", "{B066015C-D347-4493-92F1-6556D3863996}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{18714411-764D-47E5-AFE6-A96200B7CE41}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
.editorconfig = .editorconfig
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libs", "Libs", "{CE908112-DB46-4B91-8236-9139A19D66E9}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProxySuper.WPF", "ProxySuper.WPF\ProxySuper.WPF.csproj", "{B083EBFD-2925-46C9-8B00-E2C1300CEBA1}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProxySuper.Core", "ProxySuper.Core\ProxySuper.Core.csproj", "{15779EE6-D8CA-44BF-BFE2-941E155EEF3F}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@ -28,26 +20,10 @@ Global
|
||||
{DD5505BC-E7F1-4D03-ABC7-B636E893FC09}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{DD5505BC-E7F1-4D03-ABC7-B636E893FC09}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{DD5505BC-E7F1-4D03-ABC7-B636E893FC09}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B066015C-D347-4493-92F1-6556D3863996}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B066015C-D347-4493-92F1-6556D3863996}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B066015C-D347-4493-92F1-6556D3863996}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B066015C-D347-4493-92F1-6556D3863996}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B083EBFD-2925-46C9-8B00-E2C1300CEBA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B083EBFD-2925-46C9-8B00-E2C1300CEBA1}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B083EBFD-2925-46C9-8B00-E2C1300CEBA1}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B083EBFD-2925-46C9-8B00-E2C1300CEBA1}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{15779EE6-D8CA-44BF-BFE2-941E155EEF3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{15779EE6-D8CA-44BF-BFE2-941E155EEF3F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{15779EE6-D8CA-44BF-BFE2-941E155EEF3F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{15779EE6-D8CA-44BF-BFE2-941E155EEF3F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(NestedProjects) = preSolution
|
||||
{B083EBFD-2925-46C9-8B00-E2C1300CEBA1} = {CE908112-DB46-4B91-8236-9139A19D66E9}
|
||||
{15779EE6-D8CA-44BF-BFE2-941E155EEF3F} = {CE908112-DB46-4B91-8236-9139A19D66E9}
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {A3F3B8D6-7FED-42D9-9994-E913BD32E025}
|
||||
EndGlobalSection
|
||||
|
@ -15,7 +15,6 @@ using System.Text.RegularExpressions;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.IO;
|
||||
using Renci.SshNet;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using Newtonsoft.Json.Serialization;
|
||||
@ -29,6 +28,7 @@ using System.Runtime;
|
||||
using System.Globalization;
|
||||
using Microsoft.Win32;
|
||||
using System.Security;
|
||||
using Renci.SshNet;
|
||||
|
||||
namespace ProxySU
|
||||
{
|
||||
@ -9114,11 +9114,11 @@ namespace ProxySU
|
||||
ipv6 = String.Empty;
|
||||
|
||||
//sshShellCommand = @"curl -4 ip.sb";
|
||||
sshShellCommand = @"curl -s https://api.ip.sb/ip --ipv4 --max-time 8";
|
||||
sshShellCommand = @"curl -4 ip.sb";
|
||||
currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand);
|
||||
ipv4 = currentShellCommandResult.TrimEnd('\r', '\n');
|
||||
|
||||
sshShellCommand = @"curl -s https://api.ip.sb/ip --ipv6 --max-time 8";
|
||||
sshShellCommand = @"curl -6 ip.sb";
|
||||
currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand);
|
||||
ipv6 = currentShellCommandResult.TrimEnd('\r', '\n');
|
||||
|
||||
|
60
ProxySU/Properties/Resources.Designer.cs
generated
60
ProxySU/Properties/Resources.Designer.cs
generated
@ -1,69 +1,61 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// 此代码由工具生成。
|
||||
// 运行时版本: 4.0.30319.42000
|
||||
// 运行时版本:4.0.30319.42000
|
||||
//
|
||||
// 对此文件的更改可能导致不正确的行为,如果
|
||||
// 重新生成代码,则所做更改将丢失。
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果
|
||||
// 重新生成代码,这些更改将会丢失。
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace ProxySU.Properties
|
||||
{
|
||||
|
||||
|
||||
namespace ProxySU.Properties {
|
||||
using System;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 强类型资源类,用于查找本地化字符串等。
|
||||
/// 一个强类型的资源类,用于查找本地化的字符串等。
|
||||
/// </summary>
|
||||
// 此类是由 StronglyTypedResourceBuilder
|
||||
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
|
||||
// 若要添加或删除成员,请编辑 .ResX 文件,然后重新运行 ResGen
|
||||
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
|
||||
// (以 /str 作为命令选项),或重新生成 VS 项目。
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resources
|
||||
{
|
||||
|
||||
internal class Resources {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Resources()
|
||||
{
|
||||
internal Resources() {
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 返回此类使用的缓存 ResourceManager 实例。
|
||||
/// 返回此类使用的缓存的 ResourceManager 实例。
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager
|
||||
{
|
||||
get
|
||||
{
|
||||
if ((resourceMan == null))
|
||||
{
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ProxySU.Properties.Resources", typeof(Resources).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 覆盖当前线程的 CurrentUICulture 属性
|
||||
/// 使用此强类型的资源类的资源查找。
|
||||
/// 重写当前线程的 CurrentUICulture 属性,对
|
||||
/// 使用此强类型资源类的所有资源查找执行重写。
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture
|
||||
{
|
||||
get
|
||||
{
|
||||
internal static global::System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
set
|
||||
{
|
||||
set {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
|
30
ProxySU/Properties/Settings.Designer.cs
generated
30
ProxySU/Properties/Settings.Designer.cs
generated
@ -1,28 +1,24 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
// 此代码由工具生成。
|
||||
// 运行时版本:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果
|
||||
// 重新生成代码,这些更改将会丢失。
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace ProxySU.Properties
|
||||
{
|
||||
|
||||
|
||||
namespace ProxySU.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
|
||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
|
||||
{
|
||||
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.1.0.0")]
|
||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||
|
||||
public static Settings Default
|
||||
{
|
||||
get
|
||||
{
|
||||
|
||||
public static Settings Default {
|
||||
get {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
|
@ -8,7 +8,7 @@
|
||||
<OutputType>WinExe</OutputType>
|
||||
<RootNamespace>ProxySU</RootNamespace>
|
||||
<AssemblyName>ProxySU</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
@ -29,6 +29,7 @@
|
||||
<UseApplicationTrust>false</UseApplicationTrust>
|
||||
<PublishWizardCompleted>true</PublishWizardCompleted>
|
||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
@ -39,6 +40,7 @@
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
@ -48,6 +50,7 @@
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ApplicationIcon>ProxySU.ico</ApplicationIcon>
|
||||
@ -62,7 +65,10 @@
|
||||
<GenerateManifests>true</GenerateManifests>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<SignManifests>true</SignManifests>
|
||||
<SignManifests>false</SignManifests>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<StartupObject>ProxySU.App</StartupObject>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Newtonsoft.Json">
|
||||
@ -184,6 +190,7 @@
|
||||
<None Include="..\.editorconfig">
|
||||
<Link>.editorconfig</Link>
|
||||
</None>
|
||||
<None Include="app.config" />
|
||||
<None Include="packages.config" />
|
||||
<None Include="Properties\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
|
3
ProxySU/app.config
Normal file
3
ProxySU/app.config
Normal file
@ -0,0 +1,3 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/></startup></configuration>
|
@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="SSH.NET" version="2020.0.1" targetFramework="net40" />
|
||||
<package id="SSH.NET" version="2020.0.1" targetFramework="net472" />
|
||||
</packages>
|
@ -1,14 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<startup>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
|
||||
</startup>
|
||||
<runtime>
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="ControlzEx" publicKeyToken="69f1c32f803d307e" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
</configuration>
|
@ -1,33 +0,0 @@
|
||||
<Application x:Class="ProxySU_Core.App"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:local="clr-namespace:ProxySU_Core"
|
||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||
StartupUri="Views/MainWindow.xaml">
|
||||
<Application.Resources>
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<!--Languages-->
|
||||
<ResourceDictionary Source="/Resources/Languages/zh_cn.xaml" />
|
||||
|
||||
<!-- MahApps -->
|
||||
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
|
||||
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
|
||||
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Themes/Light.Teal.xaml" />
|
||||
|
||||
<!-- Material Design -->
|
||||
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml" />
|
||||
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
|
||||
<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.Teal.xaml" />
|
||||
<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.Teal.xaml" />
|
||||
|
||||
<!-- Material Design: MahApps Compatibility -->
|
||||
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.MahApps;component/Themes/MaterialDesignTheme.MahApps.Fonts.xaml" />
|
||||
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.MahApps;component/Themes/MaterialDesignTheme.MahApps.Flyout.xaml" />
|
||||
|
||||
<!--Override Themes-->
|
||||
<ResourceDictionary Source="/Resources/Styles/MaterialDesignThemes.Overrides.xaml" />
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
</Application.Resources>
|
||||
</Application>
|
@ -1,17 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Configuration;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
|
||||
namespace ProxySU_Core
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for App.xaml
|
||||
/// </summary>
|
||||
public partial class App : Application
|
||||
{
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
using System.Windows;
|
||||
|
||||
[assembly: ThemeInfo(
|
||||
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
|
||||
//(used if a resource is not found in the page,
|
||||
// or application resource dictionaries)
|
||||
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
|
||||
//(used if a resource is not found in the page,
|
||||
// app, or any theme specific resource dictionaries)
|
||||
)]
|
@ -1,23 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySU_Core.Common
|
||||
{
|
||||
public class Base64
|
||||
{
|
||||
public static string Encode(string plainText)
|
||||
{
|
||||
var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
|
||||
return System.Convert.ToBase64String(plainTextBytes);
|
||||
}
|
||||
|
||||
public static string Decode(string base64EncodedData)
|
||||
{
|
||||
var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
|
||||
return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,32 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Text;
|
||||
using System.Windows.Data;
|
||||
|
||||
namespace ProxySU_Core.Converters
|
||||
{
|
||||
public class LoginSecretTypeConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
return value != null && value.Equals(parameter);
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
if (value == null)
|
||||
{
|
||||
return Binding.DoNothing;
|
||||
}
|
||||
|
||||
if (!value.Equals(true))
|
||||
{
|
||||
return Binding.DoNothing;
|
||||
}
|
||||
|
||||
return parameter;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -1,31 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Text;
|
||||
using System.Windows.Data;
|
||||
|
||||
namespace ProxySU_Core.Converters
|
||||
{
|
||||
public class ProxyTypeConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
return value != null && value.Equals(parameter);
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
if (value == null)
|
||||
{
|
||||
return Binding.DoNothing;
|
||||
}
|
||||
|
||||
if (!value.Equals(true))
|
||||
{
|
||||
return Binding.DoNothing;
|
||||
}
|
||||
|
||||
return parameter;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Data;
|
||||
|
||||
namespace ProxySU_Core.Converters
|
||||
{
|
||||
public class VisibleConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
return value.Equals(true) ? Visibility.Visible : Visibility.Collapsed;
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
if (value == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (value.Equals(Visibility.Visible))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySU_Core.Models
|
||||
{
|
||||
public class AppSettings
|
||||
{
|
||||
public string Language { get; set; }
|
||||
}
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace ProxySU_Core.Models.Developers
|
||||
{
|
||||
public interface IParameters
|
||||
{
|
||||
int Port { get; set; }
|
||||
|
||||
string Domain { get; set; }
|
||||
|
||||
List<int> FreePorts { get; }
|
||||
}
|
||||
}
|
@ -1,740 +0,0 @@
|
||||
using ProxySU_Core.Tools;
|
||||
using ProxySU_Core.ViewModels;
|
||||
using Renci.SshNet;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
|
||||
namespace ProxySU_Core.Models.Developers
|
||||
{
|
||||
public enum CmdType
|
||||
{
|
||||
None,
|
||||
Apt,
|
||||
Dnf,
|
||||
Yum
|
||||
}
|
||||
|
||||
public abstract class Project<TParameters> : BaseViewModel where TParameters : IParameters
|
||||
{
|
||||
private SshClient _sshClient;
|
||||
|
||||
protected Action<string> WriteOutput;
|
||||
|
||||
protected CmdType CmdType { get; set; }
|
||||
|
||||
protected bool IsSELinux { get; set; }
|
||||
|
||||
protected bool OnlyIpv6 { get; set; }
|
||||
|
||||
protected string IPv4 { get; set; }
|
||||
|
||||
protected string IPv6 { get; set; }
|
||||
|
||||
protected TParameters Parameters { get; set; }
|
||||
|
||||
public Project(SshClient sshClient, TParameters parameters, Action<string> writeOutput)
|
||||
{
|
||||
_sshClient = sshClient;
|
||||
WriteOutput = writeOutput;
|
||||
Parameters = parameters;
|
||||
}
|
||||
|
||||
protected string RunCmd(string cmdStr)
|
||||
{
|
||||
var cmd = _sshClient.CreateCommand(cmdStr);
|
||||
WriteOutput(cmdStr);
|
||||
|
||||
var result = cmd.Execute();
|
||||
WriteOutput(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 执行安装命令
|
||||
/// </summary>
|
||||
public abstract void Install();
|
||||
|
||||
/// <summary>
|
||||
/// 配置系统基础环境
|
||||
/// </summary>
|
||||
protected void EnsureSystemEnv()
|
||||
{
|
||||
string cmd;
|
||||
|
||||
// 确认安装命令
|
||||
if (CmdType == CmdType.None)
|
||||
{
|
||||
cmd = RunCmd("command -v apt-get");
|
||||
if (!string.IsNullOrEmpty(cmd))
|
||||
{
|
||||
CmdType = CmdType.Apt;
|
||||
}
|
||||
}
|
||||
|
||||
if (CmdType == CmdType.None)
|
||||
{
|
||||
cmd = RunCmd("command -v dnf");
|
||||
if (!string.IsNullOrEmpty(cmd))
|
||||
{
|
||||
CmdType = CmdType.Dnf;
|
||||
}
|
||||
}
|
||||
|
||||
if (CmdType == CmdType.None)
|
||||
{
|
||||
cmd = RunCmd("command -v yum");
|
||||
if (!string.IsNullOrEmpty(cmd))
|
||||
{
|
||||
CmdType = CmdType.Yum;
|
||||
}
|
||||
}
|
||||
|
||||
// systemctl
|
||||
cmd = RunCmd("command -v systemctl");
|
||||
var hasSystemCtl = !string.IsNullOrEmpty(cmd);
|
||||
|
||||
// SELinux
|
||||
cmd = RunCmd("command -v getenforce");
|
||||
IsSELinux = !string.IsNullOrEmpty(cmd);
|
||||
|
||||
if (CmdType == CmdType.None || !hasSystemCtl)
|
||||
{
|
||||
throw new Exception("系统缺乏必要的安装组件如:apt-get||dnf||yum||Syetemd,主机系统推荐使用:CentOS 7/8,Debian 8/9/10,Ubuntu 16.04及以上版本");
|
||||
}
|
||||
|
||||
|
||||
// 判断是否启用了SELinux,如果启用了,并且工作在Enforcing模式下,则改为Permissive模式
|
||||
if (IsSELinux)
|
||||
{
|
||||
cmd = RunCmd("getenforce");
|
||||
|
||||
// 检测到系统启用SELinux,且工作在严格模式下,需改为宽松模式
|
||||
if (cmd.Contains("Enforcing"))
|
||||
{
|
||||
RunCmd("setenforce 0");
|
||||
RunCmd(@"sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 确保Root账户登陆
|
||||
/// </summary>
|
||||
protected void EnsureRootAuth()
|
||||
{
|
||||
// 禁止一些可能产生的干扰信息
|
||||
RunCmd(@"sed -i 's/echo/#echo/g' ~/.bashrc");
|
||||
RunCmd(@"sed -i 's/echo/#echo/g' ~/.profile");
|
||||
|
||||
|
||||
// 检测是否运行在Root权限下
|
||||
var cmd = RunCmd("id -u");
|
||||
if (!cmd.Equals("0\n"))
|
||||
{
|
||||
throw new Exception("请使用Root账户登陆主机");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 配置IPV6环境
|
||||
/// </summary>
|
||||
protected void ConfigureIPv6()
|
||||
{
|
||||
if (IsOnlyIpv6())
|
||||
{
|
||||
SetNat64();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 配置必要的软件
|
||||
/// </summary>
|
||||
protected void ConfigureSoftware()
|
||||
{
|
||||
string cmd = RunCmd("command -v sudo");
|
||||
if (string.IsNullOrEmpty(cmd))
|
||||
{
|
||||
RunCmd(GetInstallCmd("sudo"));
|
||||
}
|
||||
|
||||
// 安装curl,wget,unzip
|
||||
cmd = RunCmd("command -v curl");
|
||||
if (string.IsNullOrEmpty(cmd))
|
||||
{
|
||||
RunCmd(GetInstallCmd("curl"));
|
||||
}
|
||||
|
||||
cmd = RunCmd("command -v wget");
|
||||
if (string.IsNullOrEmpty(cmd))
|
||||
{
|
||||
RunCmd(GetInstallCmd("wget"));
|
||||
}
|
||||
|
||||
cmd = RunCmd("command -v unzip");
|
||||
if (string.IsNullOrEmpty(cmd))
|
||||
{
|
||||
RunCmd(GetInstallCmd("unzip"));
|
||||
}
|
||||
|
||||
// 安装dig
|
||||
cmd = RunCmd("command -v dig");
|
||||
if (string.IsNullOrEmpty(cmd))
|
||||
{
|
||||
if (CmdType == CmdType.Apt)
|
||||
{
|
||||
RunCmd(GetUpdateCmd());
|
||||
RunCmd(GetInstallCmd("dnsutils"));
|
||||
}
|
||||
else if (CmdType == CmdType.Dnf)
|
||||
{
|
||||
RunCmd(GetUpdateCmd());
|
||||
RunCmd(GetInstallCmd("bind-utils"));
|
||||
}
|
||||
else if (CmdType == CmdType.Yum)
|
||||
{
|
||||
RunCmd(GetUpdateCmd());
|
||||
RunCmd(GetInstallCmd("bind-utils"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 处理极其少见的xz-utils未安装的情况
|
||||
if (CmdType == CmdType.Apt)
|
||||
{
|
||||
RunCmd(GetInstallCmd("xz-utils"));
|
||||
}
|
||||
else
|
||||
{
|
||||
RunCmd(GetInstallCmd("xz-devel"));
|
||||
}
|
||||
|
||||
// 检测是否安装lsof
|
||||
cmd = RunCmd("command -v lsof");
|
||||
if (string.IsNullOrEmpty(cmd))
|
||||
{
|
||||
RunCmd(GetInstallCmd("lsof"));
|
||||
}
|
||||
}
|
||||
|
||||
protected void ClosePort(params int[] portList)
|
||||
{
|
||||
string cmd;
|
||||
|
||||
cmd = RunCmd("command -v firewall-cmd");
|
||||
if (!string.IsNullOrEmpty(cmd))
|
||||
{
|
||||
//有很奇怪的vps主机,在firewalld未运行时,端口是关闭的,无法访问。所以要先启动firewalld
|
||||
//用于保证acme.sh申请证书成功
|
||||
cmd = RunCmd("firewall-cmd --state");
|
||||
if (cmd.Trim() != "running")
|
||||
{
|
||||
RunCmd("systemctl restart firewalld");
|
||||
}
|
||||
|
||||
foreach (var port in portList)
|
||||
{
|
||||
RunCmd($"firewall-cmd --zone=public --remove-port={port}/tcp --permanent");
|
||||
RunCmd($"firewall-cmd --zone=public --remove-port={port}/udp --permanent");
|
||||
}
|
||||
RunCmd("yes | firewall-cmd --reload");
|
||||
}
|
||||
else
|
||||
{
|
||||
cmd = RunCmd("command -v ufw");
|
||||
if (!string.IsNullOrEmpty(cmd))
|
||||
{
|
||||
foreach (var port in portList)
|
||||
{
|
||||
RunCmd($"ufw delete allow {port}/tcp");
|
||||
RunCmd($"ufw delete allow {port}/udp");
|
||||
}
|
||||
RunCmd("yes | ufw reload");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void OpenPort(params int[] portList)
|
||||
{
|
||||
|
||||
string cmd;
|
||||
|
||||
cmd = RunCmd("command -v firewall-cmd");
|
||||
if (!string.IsNullOrEmpty(cmd))
|
||||
{
|
||||
//有很奇怪的vps主机,在firewalld未运行时,端口是关闭的,无法访问。所以要先启动firewalld
|
||||
//用于保证acme.sh申请证书成功
|
||||
cmd = RunCmd("firewall-cmd --state");
|
||||
if (cmd.Trim() != "running")
|
||||
{
|
||||
RunCmd("systemctl restart firewalld");
|
||||
}
|
||||
|
||||
foreach (var port in portList)
|
||||
{
|
||||
RunCmd($"firewall-cmd --zone=public --add-port={port}/tcp --permanent");
|
||||
RunCmd($"firewall-cmd --zone=public --add-port={port}/udp --permanent");
|
||||
}
|
||||
RunCmd("yes | firewall-cmd --reload");
|
||||
}
|
||||
else
|
||||
{
|
||||
cmd = RunCmd("command -v ufw");
|
||||
if (!string.IsNullOrEmpty(cmd))
|
||||
{
|
||||
foreach (var port in portList)
|
||||
{
|
||||
RunCmd($"ufw allow {port}/tcp");
|
||||
RunCmd($"ufw allow {port}/udp");
|
||||
}
|
||||
RunCmd("yes | ufw reload");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 配置防火墙
|
||||
/// </summary>
|
||||
protected void ConfigureFirewall()
|
||||
{
|
||||
var portList = new List<int>();
|
||||
portList.Add(80);
|
||||
portList.Add(Parameters.Port);
|
||||
portList.AddRange(Parameters.FreePorts);
|
||||
|
||||
OpenPort(portList.ToArray());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 配置同步时间差
|
||||
/// </summary>
|
||||
protected void SyncTimeDiff()
|
||||
{
|
||||
RunCmd("rm -f /etc/localtime");
|
||||
RunCmd("ln -s /usr/share/zoneinfo/UTC /etc/localtime");
|
||||
|
||||
var result = RunCmd("date +%s");
|
||||
var vpsSeconds = Convert.ToInt64(result);
|
||||
var localSeconds = (int)(DateTime.Now.ToUniversalTime() - DateTime.Parse("1970-01-01")).TotalSeconds;
|
||||
|
||||
if (Math.Abs(vpsSeconds - localSeconds) >= 90)
|
||||
{
|
||||
// 同步本地时间
|
||||
var netUtcTime = DateTimeUtils.GetUTCTime();
|
||||
DateTimeUtils.SetDate(netUtcTime.ToLocalTime());
|
||||
|
||||
// 同步VPS时间
|
||||
var utcTS = DateTimeUtils.GetUTCTime() - new DateTime(1970, 1, 1, 0, 0, 0, 0);
|
||||
long timeStampVPS = Convert.ToInt64(utcTS.TotalSeconds);
|
||||
RunCmd($"date --set=\"$(date \"+%Y-%m-%d %H:%M:%S\" -d @{timeStampVPS.ToString()})\"");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 验证域名是否绑定了主机
|
||||
/// </summary>
|
||||
protected void ValidateDomain()
|
||||
{
|
||||
if (OnlyIpv6)
|
||||
{
|
||||
string cmdFilter = @"| grep -oE '(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))' | head -n 1";
|
||||
var cmd = $"dig @resolver1.opendns.com AAAA {Parameters.Domain} +short -6 {cmdFilter}";
|
||||
var result = RunCmd(cmd).TrimEnd('\r', '\n');
|
||||
|
||||
if (result == IPv6) return;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
string cmdFilter = @"| grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | head -n 1";
|
||||
var cmd = $"dig @resolver1.opendns.com A {Parameters.Domain} +short -4 {cmdFilter}";
|
||||
var result = RunCmd(cmd).TrimEnd('\r', '\n');
|
||||
|
||||
if (result == IPv4) return;
|
||||
|
||||
}
|
||||
|
||||
|
||||
var btnResult = MessageBox.Show(
|
||||
$"{Parameters.Domain}未能正常解析到服务器的IP,如果您使用了CDN请忽略,是否继续安装?", "提示", MessageBoxButton.YesNo);
|
||||
|
||||
if (btnResult == MessageBoxResult.No)
|
||||
{
|
||||
throw new Exception($"域名解析失败,安装停止!");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 判断是否安装某个软件
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
/// <returns></returns>
|
||||
protected bool FileExists(string path)
|
||||
{
|
||||
var cmdStr = $"if [[ -f {path} ]];then echo '1';else echo '0'; fi";
|
||||
var cmd = RunCmd(cmdStr);
|
||||
return cmd.Trim() == "1";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 安装 Caddy
|
||||
/// </summary>
|
||||
protected void InstallCaddy()
|
||||
{
|
||||
RunCmd("rm -rf caddy_install.sh");
|
||||
RunCmd("curl -o caddy_install.sh https://raw.githubusercontent.com/proxysu/shellscript/master/Caddy-Naive/caddy-naive-install.sh");
|
||||
RunCmd("yes | bash caddy_install.sh");
|
||||
RunCmd("rm -rf caddy_install.sh");
|
||||
RunCmd("systemctl enable caddy.service");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 卸载 Caddy
|
||||
/// </summary>
|
||||
protected void UninstallCaddy()
|
||||
{
|
||||
RunCmd("rm -rf caddy_install.sh");
|
||||
RunCmd("curl -o caddy_install.sh https://raw.githubusercontent.com/proxysu/shellscript/master/Caddy-Naive/caddy-naive-install.sh");
|
||||
RunCmd("yes | bash caddy_install.sh uninstall");
|
||||
RunCmd("rm -rf caddy_install.sh");
|
||||
RunCmd("rm -rf /usr/share/caddy");
|
||||
}
|
||||
|
||||
|
||||
#region 检测系统环境
|
||||
|
||||
private bool IsOnlyIpv6()
|
||||
{
|
||||
string cmd;
|
||||
|
||||
cmd = RunCmd(@"curl -s https://api.ip.sb/ip --ipv4 --max-time 8");
|
||||
IPv4 = cmd.TrimEnd('\r', '\n');
|
||||
|
||||
if (!string.IsNullOrEmpty(IPv4))
|
||||
{
|
||||
OnlyIpv6 = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
cmd = RunCmd(@"curl -s https://api.ip.sb/ip --ipv6 --max-time 8");
|
||||
IPv6 = cmd.TrimEnd('\r', '\n');
|
||||
|
||||
if (string.IsNullOrEmpty(IPv6))
|
||||
{
|
||||
throw new Exception("未检测可用的的IP地址");
|
||||
}
|
||||
|
||||
OnlyIpv6 = true;
|
||||
return OnlyIpv6;
|
||||
}
|
||||
|
||||
private bool SetPortFree(int port, bool force = true)
|
||||
{
|
||||
string result = RunCmd($"lsof -n -P -i :{port} | grep LISTEN");
|
||||
|
||||
if (!string.IsNullOrEmpty(result))
|
||||
{
|
||||
if (force)
|
||||
{
|
||||
var btnResult = MessageBox.Show($"{port}端口被占用,将强制停止占用{port}端口的程序?", "提示", MessageBoxButton.YesNo);
|
||||
if (btnResult == MessageBoxResult.No)
|
||||
{
|
||||
throw new Exception($"{port}端口被占用,安装停止!");
|
||||
}
|
||||
|
||||
string[] process = result.Split(' ');
|
||||
RunCmd($"systemctl stop {process[0]}");
|
||||
RunCmd($"systemctl disable {process[0]}");
|
||||
RunCmd($"pkill {process[0]}");
|
||||
return SetPortFree(port, force: false);
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void ConfigurePort()
|
||||
{
|
||||
if (Parameters.Port == 80 || Parameters.Port == 443)
|
||||
{
|
||||
SetPortFree(80);
|
||||
SetPortFree(443);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPortFree(80);
|
||||
SetPortFree(443);
|
||||
SetPortFree(Parameters.Port);
|
||||
|
||||
Parameters.FreePorts.ForEach(port =>
|
||||
{
|
||||
SetPortFree(port);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
protected void SetNat64()
|
||||
{
|
||||
var dns64List = FilterFastestIP();
|
||||
if (dns64List.Count == 0)
|
||||
{
|
||||
throw new Exception("未找到有效的Nat64网关");
|
||||
}
|
||||
|
||||
var exists = FileExists("/etc/resolv.conf.proxysu");
|
||||
if (!exists)
|
||||
{
|
||||
var cmdStr = @"mv /etc/resolv.conf /etc/resolv.conf.proxysu";
|
||||
RunCmd(cmdStr);
|
||||
}
|
||||
|
||||
foreach (var gateip in dns64List)
|
||||
{
|
||||
RunCmd($"echo \"nameserver {gateip}\" > /etc/resolv.conf");
|
||||
}
|
||||
}
|
||||
|
||||
protected void RemoveNat64()
|
||||
{
|
||||
RunCmd("rm /etc/resolv.conf");
|
||||
RunCmd("mv /etc/resolv.conf.proxysu /etc/resolv.conf");
|
||||
}
|
||||
|
||||
private List<string> FilterFastestIP()
|
||||
{
|
||||
string[] gateNat64 = {
|
||||
"2a01:4f9:c010:3f02::1",
|
||||
"2001:67c:2b0::4",
|
||||
"2001:67c:2b0::6",
|
||||
"2a09:11c0:f1:bbf0::70",
|
||||
"2a01:4f8:c2c:123f::1",
|
||||
"2001:67c:27e4:15::6411",
|
||||
"2001:67c:27e4::64",
|
||||
"2001:67c:27e4:15::64",
|
||||
"2001:67c:27e4::60",
|
||||
"2a00:1098:2b::1",
|
||||
"2a03:7900:2:0:31:3:104:161",
|
||||
"2a00:1098:2c::1",
|
||||
"2a09:11c0:100::53",
|
||||
};
|
||||
|
||||
Dictionary<string, float> dns64List = new Dictionary<string, float>();
|
||||
foreach (var gateip in gateNat64)
|
||||
{
|
||||
var cmdStr = $"ping6 -c4 {gateip} | grep avg | awk '{{print $4}}'|cut -d/ -f2";
|
||||
var cmd = RunCmd(cmdStr);
|
||||
if (!string.IsNullOrEmpty(cmd))
|
||||
{
|
||||
if (float.TryParse(cmd, out float delay))
|
||||
{
|
||||
dns64List.Add(gateip, delay);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return dns64List.Keys.ToList();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
#region BBR
|
||||
private bool CheckKernelVersionBBR(string kernelVer)
|
||||
{
|
||||
string[] linuxKernelCompared = kernelVer.Split('.');
|
||||
if (int.Parse(linuxKernelCompared[0]) > 4)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else if (int.Parse(linuxKernelCompared[0]) < 4)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else if (int.Parse(linuxKernelCompared[0]) == 4)
|
||||
{
|
||||
if (int.Parse(linuxKernelCompared[1]) >= 9)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else if (int.Parse(linuxKernelCompared[1]) < 9)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
protected void EnableBBR()
|
||||
{
|
||||
var osVersion = RunCmd("uname -r");
|
||||
var canInstallBBR = CheckKernelVersionBBR(osVersion.Split('-')[0]);
|
||||
|
||||
var bbrInfo = RunCmd("sysctl net.ipv4.tcp_congestion_control | grep bbr");
|
||||
var installed = bbrInfo.Contains("bbr");
|
||||
if (canInstallBBR && !installed)
|
||||
{
|
||||
RunCmd(@"bash -c 'echo ""net.core.default_qdisc=fq"" >> /etc/sysctl.conf'");
|
||||
RunCmd(@"bash -c 'echo ""net.ipv4.tcp_congestion_control=bbr"" >> /etc/sysctl.conf'");
|
||||
RunCmd(@"sysctl -p");
|
||||
|
||||
if (OnlyIpv6)
|
||||
{
|
||||
RemoveNat64();
|
||||
}
|
||||
WriteOutput("BBR启动成功");
|
||||
}
|
||||
|
||||
if (!canInstallBBR)
|
||||
{
|
||||
WriteOutput("****** 系统不满足启用BBR条件,启动失败。 ******");
|
||||
}
|
||||
|
||||
}
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// 安装证书
|
||||
/// </summary>
|
||||
/// <param name="certPath"></param>
|
||||
/// <param name="keyPath"></param>
|
||||
protected void InstallCert(string dirPath, string certName, string keyName)
|
||||
{
|
||||
string certPath = Path.Combine(dirPath, certName);
|
||||
string keyPath = Path.Combine(dirPath, keyName);
|
||||
|
||||
// 安装依赖
|
||||
RunCmd(GetInstallCmd("socat"));
|
||||
|
||||
// 解决搬瓦工CentOS缺少问题
|
||||
RunCmd(GetInstallCmd("automake autoconf libtool"));
|
||||
|
||||
// 安装Acme
|
||||
var result = RunCmd($"curl https://get.acme.sh yes | sh");
|
||||
if (result.Contains("Install success"))
|
||||
{
|
||||
WriteOutput("安装 acme.sh 成功");
|
||||
}
|
||||
else
|
||||
{
|
||||
WriteOutput("安装 acme.sh 失败,请联系开发者!");
|
||||
throw new Exception("安装 acme.sh 失败,请联系开发者!");
|
||||
}
|
||||
|
||||
RunCmd("cd ~/.acme.sh/");
|
||||
RunCmd("alias acme.sh=~/.acme.sh/acme.sh");
|
||||
|
||||
// 申请证书
|
||||
if (OnlyIpv6)
|
||||
{
|
||||
var cmd = $"/root/.acme.sh/acme.sh --force --debug --issue --standalone -d {Parameters.Domain} --listen-v6";
|
||||
result = RunCmd(cmd);
|
||||
}
|
||||
else
|
||||
{
|
||||
var cmd = $"/root/.acme.sh/acme.sh --force --debug --issue --standalone -d {Parameters.Domain}";
|
||||
result = RunCmd(cmd);
|
||||
}
|
||||
|
||||
if (result.Contains("success"))
|
||||
{
|
||||
WriteOutput("申请证书成功");
|
||||
}
|
||||
else
|
||||
{
|
||||
WriteOutput("申请证书失败,如果申请次数过多请更换二级域名,或联系开发者!");
|
||||
throw new Exception("申请证书失败,如果申请次数过多请更换二级域名,或联系开发者!");
|
||||
}
|
||||
|
||||
// 安装证书
|
||||
RunCmd($"mkdir -p {dirPath}");
|
||||
RunCmd($"/root/.acme.sh/acme.sh --installcert -d {Parameters.Domain} --certpath {certPath} --keypath {keyPath} --capath {certPath}");
|
||||
|
||||
result = RunCmd($@"if [ ! -f ""{keyPath}"" ]; then echo ""0""; else echo ""1""; fi | head -n 1");
|
||||
|
||||
if (result.Contains("1"))
|
||||
{
|
||||
WriteOutput("安装证书成功");
|
||||
}
|
||||
else
|
||||
{
|
||||
WriteOutput("安装证书失败,请联系开发者!");
|
||||
throw new Exception("安装证书失败,请联系开发者!");
|
||||
}
|
||||
|
||||
RunCmd($"chmod 755 {dirPath}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 上传文件
|
||||
/// </summary>
|
||||
/// <param name="stream"></param>
|
||||
/// <param name="path"></param>
|
||||
protected void UploadFile(Stream stream, string path)
|
||||
{
|
||||
using (var sftp = new SftpClient(_sshClient.ConnectionInfo))
|
||||
{
|
||||
sftp.Connect();
|
||||
sftp.UploadFile(stream, path, true);
|
||||
sftp.Disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据系统环境匹配更新命令
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
protected string GetUpdateCmd()
|
||||
{
|
||||
if (CmdType == CmdType.Apt)
|
||||
{
|
||||
return "apt-get update";
|
||||
}
|
||||
else if (CmdType == CmdType.Dnf)
|
||||
{
|
||||
return "dnf clean all;dnf makecache";
|
||||
}
|
||||
else if (CmdType == CmdType.Yum)
|
||||
{
|
||||
return "yum clean all;yum makecache";
|
||||
}
|
||||
|
||||
throw new Exception("未识别的系统");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据系统匹配安装命令
|
||||
/// </summary>
|
||||
/// <param name="soft"></param>
|
||||
/// <returns></returns>
|
||||
protected string GetInstallCmd(string soft)
|
||||
{
|
||||
if (CmdType == CmdType.Apt)
|
||||
{
|
||||
return "echo y | apt-get install " + soft;
|
||||
}
|
||||
else if (CmdType == CmdType.Dnf)
|
||||
{
|
||||
return "echo y | dnf -y install " + soft;
|
||||
}
|
||||
else if (CmdType == CmdType.Yum)
|
||||
{
|
||||
return "echo y | yum -y install " + soft;
|
||||
}
|
||||
|
||||
throw new Exception("未识别的系统");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,63 +0,0 @@
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySU_Core.Models.Developers
|
||||
{
|
||||
public class TrojanGoConfigBuilder
|
||||
{
|
||||
public static readonly int WebPort = 8088;
|
||||
|
||||
public static readonly string TrojanGoSettingPath = @"Templates\trojan-go\trojan-go.json";
|
||||
|
||||
public static readonly string CaddyFilePath = @"Templates\trojan-go\base.caddyfile";
|
||||
|
||||
public static string BuildTrojanGoConfig(TrojanGoSettings parameters)
|
||||
{
|
||||
var jsonStr = File.ReadAllText(TrojanGoSettingPath);
|
||||
var settings = JToken.FromObject(JsonConvert.DeserializeObject(jsonStr));
|
||||
|
||||
settings["remote_port"] = WebPort;
|
||||
settings["password"][0] = parameters.Password;
|
||||
settings["ssl"]["sni"] = parameters.Domain;
|
||||
|
||||
return JsonConvert.SerializeObject(settings, Formatting.Indented, new JsonSerializerSettings()
|
||||
{
|
||||
NullValueHandling = NullValueHandling.Ignore
|
||||
});
|
||||
}
|
||||
|
||||
public static string BuildCaddyConfig(TrojanGoSettings parameters, bool useCustomWeb = false)
|
||||
{
|
||||
var caddyStr = File.ReadAllText(CaddyFilePath);
|
||||
caddyStr.Replace("##domain##", parameters.Domain);
|
||||
caddyStr.Replace("##port##", WebPort.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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,135 +0,0 @@
|
||||
using Renci.SshNet;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
|
||||
namespace ProxySU_Core.Models.Developers
|
||||
{
|
||||
public class TrojanGoProject : Project<TrojanGoSettings>
|
||||
{
|
||||
public TrojanGoProject(SshClient sshClient, TrojanGoSettings parameters, Action<string> writeOutput) : base(sshClient, parameters, writeOutput)
|
||||
{
|
||||
}
|
||||
|
||||
public override void Install()
|
||||
{
|
||||
try
|
||||
{
|
||||
EnsureRootAuth();
|
||||
|
||||
if (FileExists("/usr/local/bin/xray"))
|
||||
{
|
||||
var btnResult = MessageBox.Show("已经安装Xray,是否需要重装?", "提示", MessageBoxButton.YesNo);
|
||||
if (btnResult == MessageBoxResult.No)
|
||||
{
|
||||
MessageBox.Show("安装终止", "提示");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
WriteOutput("检测安装系统环境...");
|
||||
EnsureSystemEnv();
|
||||
WriteOutput("检测安装系统环境完成");
|
||||
|
||||
WriteOutput("配置服务器端口...");
|
||||
ConfigurePort();
|
||||
WriteOutput("端口配置完成");
|
||||
|
||||
WriteOutput("安装必要的系统工具...");
|
||||
ConfigureSoftware();
|
||||
WriteOutput("系统工具安装完成");
|
||||
|
||||
WriteOutput("检测IP6...");
|
||||
ConfigureIPv6();
|
||||
WriteOutput("检测IP6完成");
|
||||
|
||||
WriteOutput("配置防火墙...");
|
||||
ConfigureFirewall();
|
||||
WriteOutput("防火墙配置完成");
|
||||
|
||||
WriteOutput("同步系统和本地时间...");
|
||||
SyncTimeDiff();
|
||||
WriteOutput("时间同步完成");
|
||||
|
||||
WriteOutput("检测域名是否绑定本机IP...");
|
||||
ValidateDomain();
|
||||
WriteOutput("域名检测完成");
|
||||
|
||||
WriteOutput("安装Trojan-Go...");
|
||||
InstallTrojanGo();
|
||||
WriteOutput("Trojan-Go安装完成");
|
||||
|
||||
WriteOutput("安装Caddy...");
|
||||
InstallCaddy();
|
||||
WriteOutput("Caddy安装完成");
|
||||
|
||||
WriteOutput("启动BBR");
|
||||
EnableBBR();
|
||||
|
||||
UploadCaddyFile();
|
||||
WriteOutput("************");
|
||||
WriteOutput("安装完成,尽情享用吧......");
|
||||
WriteOutput("************");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
var errorLog = "安装终止," + ex.Message;
|
||||
WriteOutput(errorLog);
|
||||
MessageBox.Show(errorLog);
|
||||
}
|
||||
}
|
||||
|
||||
private void InstallTrojanGo()
|
||||
{
|
||||
WriteOutput("安装Trojan-Go");
|
||||
RunCmd(@"curl https://raw.githubusercontent.com/proxysu/shellscript/master/trojan-go.sh yes | bash");
|
||||
var success = FileExists("/usr/local/etc/trojan-go");
|
||||
if (success == false)
|
||||
{
|
||||
throw new Exception("trojan-go 安装失败,请联系开发者!");
|
||||
}
|
||||
|
||||
RunCmd($"sed -i 's/User=nobody/User=root/g' /etc/systemd/system/xray.service");
|
||||
RunCmd($"sed -i 's/CapabilityBoundingSet=/#CapabilityBoundingSet=/g' /etc/systemd/system/xray.service");
|
||||
RunCmd($"sed -i 's/AmbientCapabilities=/#AmbientCapabilities=/g' /etc/systemd/system/xray.service");
|
||||
RunCmd($"systemctl daemon-reload");
|
||||
|
||||
RunCmd("systemctl enable trojan-go");
|
||||
RunCmd("systemctl start trojan-go");
|
||||
WriteOutput("Trojan-Go 安装完成");
|
||||
|
||||
InstallCert(
|
||||
dirPath: "/usr/local/etc/trojan-go",
|
||||
certName: "trojan-go.crt",
|
||||
keyName: "trojan-go.key");
|
||||
|
||||
if (FileExists("/usr/local/etc/trojan-go/config.json"))
|
||||
{
|
||||
RunCmd("mv /usr/local/etc/trojan-go/config.json config.json.old");
|
||||
}
|
||||
|
||||
// 上传配置
|
||||
var settings = TrojanGoConfigBuilder.BuildTrojanGoConfig(Parameters);
|
||||
var stream = new MemoryStream(Encoding.UTF8.GetBytes(settings));
|
||||
UploadFile(stream, "/usr/local/etc/trojan-go/config.json");
|
||||
RunCmd("systemctl restart trojan-go");
|
||||
}
|
||||
|
||||
private void UploadCaddyFile(bool useCustomWeb = false)
|
||||
{
|
||||
var config = TrojanGoConfigBuilder.BuildCaddyConfig(Parameters, useCustomWeb);
|
||||
var stream = new MemoryStream(Encoding.UTF8.GetBytes(config));
|
||||
if (FileExists("/etc/caddy/Caddyfile"))
|
||||
{
|
||||
RunCmd("mv /etc/caddy/Caddyfile /etc/caddy/Caddyfile.back");
|
||||
}
|
||||
UploadFile(stream, "/etc/caddy/Caddyfile");
|
||||
RunCmd("systemctl restart caddy");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySU_Core.Models.Developers
|
||||
{
|
||||
public class TrojanGoSettings : IParameters
|
||||
{
|
||||
public int Port { get; set; }
|
||||
|
||||
public List<int> FreePorts
|
||||
{
|
||||
get
|
||||
{
|
||||
return new List<int>();
|
||||
}
|
||||
}
|
||||
|
||||
public string Domain { get; set; }
|
||||
|
||||
public List<XrayType> Types { get; set; }
|
||||
|
||||
public string Password { get; set; }
|
||||
|
||||
public string MaskDomain { get; set; }
|
||||
}
|
||||
}
|
@ -1,232 +0,0 @@
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using ProxySU_Core.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
|
||||
namespace ProxySU_Core.Models.Developers
|
||||
{
|
||||
public class XrayConfigBuilder
|
||||
{
|
||||
private const string ServerLogDir = @"Templates\xray\server\00_log";
|
||||
private const string ServerApiDir = @"Templates\xray\server\01_api";
|
||||
private const string ServerDnsDir = @"Templates\xray\server\02_dns";
|
||||
private const string ServerRoutingDir = @"Templates\xray\server\03_routing";
|
||||
private const string ServerPolicyDir = @"Templates\xray\server\04_policy";
|
||||
private const string ServerInboundsDir = @"Templates\xray\server\05_inbounds";
|
||||
private const string ServerOutboundsDir = @"Templates\xray\server\06_outbounds";
|
||||
private const string ServerTransportDir = @"Templates\xray\server\07_transport";
|
||||
private const string ServerStatsDir = @"Templates\xray\server\08_stats";
|
||||
private const string ServerReverseDir = @"Templates\xray\server\09_reverse";
|
||||
private const string CaddyFileDir = @"Templates\xray\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 VLESS_mKCP_Port = 1113;
|
||||
|
||||
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 LoadXrayConfig()
|
||||
{
|
||||
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(XraySettings parameters, bool useCustomWeb = false)
|
||||
{
|
||||
var caddyStr = File.ReadAllText(Path.Combine(CaddyFileDir, "base.caddyfile"));
|
||||
caddyStr = caddyStr.Replace("##domain##", 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;
|
||||
}
|
||||
|
||||
public static string BuildXrayConfig(XraySettings parameters)
|
||||
{
|
||||
var xrayConfig = LoadXrayConfig();
|
||||
var baseBound = GetBound("VLESS_TCP_XTLS.json");
|
||||
baseBound.port = parameters.Port;
|
||||
baseBound.settings.fallbacks.Add(JToken.FromObject(new
|
||||
{
|
||||
dest = FullbackPort
|
||||
}));
|
||||
xrayConfig.inbounds.Add(baseBound);
|
||||
baseBound.settings.clients[0].id = parameters.UUID;
|
||||
|
||||
if (parameters.Types.Contains(XrayType.VLESS_WS))
|
||||
{
|
||||
var wsInbound = GetBound("VLESS_WS.json");
|
||||
wsInbound.port = VLESS_WS_Port;
|
||||
wsInbound.settings.clients[0].id = parameters.UUID;
|
||||
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(XrayType.VLESS_gRPC))
|
||||
{
|
||||
var gRPCInBound = GetBound("VLESS_gRPC.json");
|
||||
gRPCInBound.port = parameters.VLESS_gRPC_Port;
|
||||
gRPCInBound.settings.clients[0].id = parameters.UUID;
|
||||
gRPCInBound.streamSettings.grpcSettings.serviceName = parameters.VLESS_gRPC_ServiceName;
|
||||
xrayConfig.inbounds.Add(JToken.FromObject(gRPCInBound));
|
||||
}
|
||||
|
||||
if (parameters.Types.Contains(XrayType.VLESS_KCP))
|
||||
{
|
||||
var kcpBound = GetBound("VLESS_KCP.json");
|
||||
kcpBound.port = parameters.VLESS_KCP_Port;
|
||||
kcpBound.settings.clients[0].id = parameters.UUID;
|
||||
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(XrayType.VMESS_TCP))
|
||||
{
|
||||
var mtcpBound = GetBound("VMESS_TCP.json");
|
||||
mtcpBound.port = VMESS_TCP_Port;
|
||||
mtcpBound.settings.clients[0].id = parameters.UUID;
|
||||
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(XrayType.VMESS_WS))
|
||||
{
|
||||
var mwsBound = GetBound("VMESS_WS.json");
|
||||
mwsBound.port = VMESS_WS_Port;
|
||||
mwsBound.settings.clients[0].id = parameters.UUID;
|
||||
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(XrayType.VMESS_KCP))
|
||||
{
|
||||
var kcpBound = GetBound("VMESS_KCP.json");
|
||||
kcpBound.port = parameters.VMESS_KCP_Port;
|
||||
kcpBound.settings.clients[0].id = parameters.UUID;
|
||||
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(XrayType.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));
|
||||
}
|
||||
|
||||
|
||||
if (parameters.Types.Contains(XrayType.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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -1,321 +0,0 @@
|
||||
using Renci.SshNet;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using ProxySU_Core.Models;
|
||||
|
||||
namespace ProxySU_Core.Models.Developers
|
||||
{
|
||||
public class XrayProject : Project<XraySettings>
|
||||
{
|
||||
|
||||
private const string ServerLogDir = @"Templates\xray\server\00_log";
|
||||
private const string ServerApiDir = @"Templates\xray\server\01_api";
|
||||
private const string ServerDnsDir = @"Templates\xray\server\02_dns";
|
||||
private const string ServerRoutingDir = @"Templates\xray\server\03_routing";
|
||||
private const string ServerPolicyDir = @"Templates\xray\server\04_policy";
|
||||
private const string ServerInboundsDir = @"Templates\xray\server\05_inbounds";
|
||||
private const string ServerOutboundsDir = @"Templates\xray\server\06_outbounds";
|
||||
private const string ServerTransportDir = @"Templates\xray\server\07_transport";
|
||||
private const string ServerStatsDir = @"Templates\xray\server\08_stats";
|
||||
private const string ServerReverseDir = @"Templates\xray\server\09_reverse";
|
||||
private const string CaddyFileDir = @"Templates\xray\caddy";
|
||||
|
||||
public XrayProject(SshClient sshClient, XraySettings parameters, Action<string> writeOutput) : base(sshClient, parameters, writeOutput)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 安装Xray
|
||||
/// </summary>
|
||||
public override void Install()
|
||||
{
|
||||
try
|
||||
{
|
||||
EnsureRootAuth();
|
||||
|
||||
if (FileExists("/usr/local/bin/xray"))
|
||||
{
|
||||
var btnResult = MessageBox.Show("已经安装Xray,是否需要重装?", "提示", MessageBoxButton.YesNo);
|
||||
if (btnResult == MessageBoxResult.No)
|
||||
{
|
||||
MessageBox.Show("安装终止", "提示");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
WriteOutput("检测安装系统环境...");
|
||||
EnsureSystemEnv();
|
||||
WriteOutput("检测安装系统环境完成");
|
||||
|
||||
WriteOutput("配置服务器端口...");
|
||||
ConfigurePort();
|
||||
WriteOutput("端口配置完成");
|
||||
|
||||
WriteOutput("安装必要的系统工具...");
|
||||
ConfigureSoftware();
|
||||
WriteOutput("系统工具安装完成");
|
||||
|
||||
WriteOutput("检测IP6...");
|
||||
ConfigureIPv6();
|
||||
WriteOutput("检测IP6完成");
|
||||
|
||||
WriteOutput("配置防火墙...");
|
||||
ConfigureFirewall();
|
||||
WriteOutput("防火墙配置完成");
|
||||
|
||||
WriteOutput("同步系统和本地时间...");
|
||||
SyncTimeDiff();
|
||||
WriteOutput("时间同步完成");
|
||||
|
||||
WriteOutput("检测域名是否绑定本机IP...");
|
||||
ValidateDomain();
|
||||
WriteOutput("域名检测完成");
|
||||
|
||||
WriteOutput("安装Xray-Core...");
|
||||
InstallXrayWithCert();
|
||||
WriteOutput("Xray-Core安装完成");
|
||||
|
||||
WriteOutput("安装Caddy...");
|
||||
InstallCaddy();
|
||||
WriteOutput("Caddy安装完成");
|
||||
|
||||
WriteOutput("启动BBR");
|
||||
EnableBBR();
|
||||
|
||||
UploadCaddyFile();
|
||||
WriteOutput("************");
|
||||
WriteOutput("安装完成,尽情享用吧......");
|
||||
WriteOutput("************");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
var errorLog = "安装终止," + ex.Message;
|
||||
WriteOutput(errorLog);
|
||||
MessageBox.Show(errorLog);
|
||||
}
|
||||
}
|
||||
|
||||
public void UninstallProxy()
|
||||
{
|
||||
EnsureRootAuth();
|
||||
WriteOutput("卸载Caddy");
|
||||
UninstallCaddy();
|
||||
WriteOutput("卸载Xray");
|
||||
UninstallXray();
|
||||
WriteOutput("卸载证书");
|
||||
UninstallAcme();
|
||||
WriteOutput("关闭端口");
|
||||
ClosePort(Parameters.ShadowSocksPort, Parameters.VMESS_KCP_Port);
|
||||
|
||||
WriteOutput("************ 卸载完成 ************");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新xray内核
|
||||
/// </summary>
|
||||
public void UpdateXrayCore()
|
||||
{
|
||||
EnsureRootAuth();
|
||||
EnsureSystemEnv();
|
||||
RunCmd("bash -c \"$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)\" @ install");
|
||||
RunCmd("systemctl restart xray");
|
||||
WriteOutput("************ 更新xray内核完成 ************");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新xray配置
|
||||
/// </summary>
|
||||
public void UpdateXraySettings()
|
||||
{
|
||||
EnsureRootAuth();
|
||||
EnsureSystemEnv();
|
||||
ConfigureFirewall();
|
||||
var configJson = XrayConfigBuilder.BuildXrayConfig(Parameters);
|
||||
var stream = new MemoryStream(Encoding.UTF8.GetBytes(configJson));
|
||||
RunCmd("rm -rf /usr/local/etc/xray/config.json");
|
||||
UploadFile(stream, "/usr/local/etc/xray/config.json");
|
||||
ConfigurePort();
|
||||
UploadCaddyFile(string.IsNullOrEmpty(Parameters.MaskDomain));
|
||||
RunCmd("systemctl restart xray");
|
||||
WriteOutput("************ 更新Xray配置成功,更新配置不包含域名,如果域名更换请重新安装。 ************");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重装Caddy
|
||||
/// </summary>
|
||||
public void DoUninstallCaddy()
|
||||
{
|
||||
EnsureRootAuth();
|
||||
UninstallCaddy();
|
||||
WriteOutput("************ 卸载Caddy完成 ************");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 安装证书
|
||||
/// </summary>
|
||||
public void InstallCertToXray()
|
||||
{
|
||||
EnsureRootAuth();
|
||||
EnsureSystemEnv();
|
||||
InstallCert(
|
||||
dirPath: "/usr/local/etc/xray/ssl",
|
||||
certName: "xray_ssl.crt",
|
||||
keyName: "xray_ssl.key");
|
||||
|
||||
RunCmd("systemctl restart xray");
|
||||
WriteOutput("************ 安装证书完成 ************");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 上传证书
|
||||
/// </summary>
|
||||
/// <param name="keyStrem"></param>
|
||||
/// <param name="crtStream"></param>
|
||||
public void UploadCert(Stream stream)
|
||||
{
|
||||
EnsureRootAuth();
|
||||
EnsureSystemEnv();
|
||||
|
||||
// 转移旧文件
|
||||
var oldFileName = $"ssl_{DateTime.Now.Ticks}";
|
||||
RunCmd($"mv /usr/local/etc/xray/ssl /usr/local/etc/xray/{oldFileName}");
|
||||
|
||||
// 上传新文件
|
||||
RunCmd("mkdir /usr/local/etc/xray/ssl");
|
||||
UploadFile(stream, "/usr/local/etc/xray/ssl/ssl.zip");
|
||||
RunCmd("unzip /usr/local/etc/xray/ssl/ssl.zip -d /usr/local/etc/xray/ssl");
|
||||
|
||||
// 改名
|
||||
var crtFiles = RunCmd("find /usr/local/etc/xray/ssl/*.crt").Split("\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
|
||||
if (crtFiles.Length > 0)
|
||||
{
|
||||
RunCmd($"mv {crtFiles[0]} /usr/local/etc/xray/ssl/xray_ssl.crt");
|
||||
}
|
||||
else
|
||||
{
|
||||
WriteOutput("************ 上传证书失败,请联系开发者 ************");
|
||||
RunCmd("rm -rf /usr/local/etc/xray/ssl");
|
||||
RunCmd($"mv /usr/local/etc/xray/ssl{oldFileName} /usr/local/etc/xray/ssl");
|
||||
WriteOutput("操作已回滚");
|
||||
return;
|
||||
}
|
||||
|
||||
var keyFiles = RunCmd("find /usr/local/etc/xray/ssl/*.key").Split("\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
|
||||
if (keyFiles.Length > 0)
|
||||
{
|
||||
RunCmd($"mv {keyFiles[0]} /usr/local/etc/xray/ssl/xray_ssl.key");
|
||||
}
|
||||
else
|
||||
{
|
||||
WriteOutput("************ 上传证书失败,请联系开发者 ************");
|
||||
RunCmd("rm -rf /usr/local/etc/xray/ssl");
|
||||
RunCmd($"mv /usr/local/etc/xray/ssl{oldFileName} /usr/local/etc/xray/ssl");
|
||||
WriteOutput("操作已回滚");
|
||||
return;
|
||||
}
|
||||
|
||||
RunCmd("systemctl restart xray");
|
||||
WriteOutput("************ 上传证书完成 ************");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 上传静态网站
|
||||
/// </summary>
|
||||
/// <param name="stream"></param>
|
||||
public void UploadWeb(Stream stream)
|
||||
{
|
||||
EnsureRootAuth();
|
||||
EnsureSystemEnv();
|
||||
if (!FileExists("/usr/share/caddy"))
|
||||
{
|
||||
RunCmd("mkdir /usr/share/caddy");
|
||||
}
|
||||
RunCmd("rm -rf /usr/share/caddy/*");
|
||||
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");
|
||||
UploadCaddyFile(useCustomWeb: true);
|
||||
WriteOutput("************ 上传网站模板完成 ************");
|
||||
}
|
||||
|
||||
|
||||
private void UploadCaddyFile(bool useCustomWeb = false)
|
||||
{
|
||||
var configJson = XrayConfigBuilder.BuildCaddyConfig(Parameters, useCustomWeb);
|
||||
var stream = new MemoryStream(Encoding.UTF8.GetBytes(configJson));
|
||||
if (FileExists("/etc/caddy/Caddyfile"))
|
||||
{
|
||||
RunCmd("mv /etc/caddy/Caddyfile /etc/caddy/Caddyfile.back");
|
||||
}
|
||||
UploadFile(stream, "/etc/caddy/Caddyfile");
|
||||
RunCmd("systemctl restart caddy");
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void UninstallXray()
|
||||
{
|
||||
RunCmd("bash -c \"$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)\" @ remove");
|
||||
}
|
||||
|
||||
private void UninstallAcme()
|
||||
{
|
||||
RunCmd("acme.sh --uninstall");
|
||||
RunCmd("rm -r ~/.acme.sh");
|
||||
}
|
||||
|
||||
private void InstallXrayWithCert()
|
||||
{
|
||||
RunCmd("bash -c \"$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)\" @ install");
|
||||
|
||||
if (!FileExists("/usr/local/bin/xray"))
|
||||
{
|
||||
WriteOutput("Xray-Core安装失败,请联系开发者");
|
||||
throw new Exception("Xray-Core安装失败,请联系开发者");
|
||||
}
|
||||
|
||||
RunCmd($"sed -i 's/User=nobody/User=root/g' /etc/systemd/system/xray.service");
|
||||
RunCmd($"sed -i 's/CapabilityBoundingSet=/#CapabilityBoundingSet=/g' /etc/systemd/system/xray.service");
|
||||
RunCmd($"sed -i 's/AmbientCapabilities=/#AmbientCapabilities=/g' /etc/systemd/system/xray.service");
|
||||
RunCmd($"systemctl daemon-reload");
|
||||
|
||||
if (FileExists("/usr/local/etc/xray/config.json"))
|
||||
{
|
||||
RunCmd(@"mv /usr/local/etc/xray/config.json /usr/local/etc/xray/config.json.1");
|
||||
}
|
||||
|
||||
WriteOutput("安装TLS证书");
|
||||
InstallCertToXray();
|
||||
WriteOutput("TLS证书安装完成");
|
||||
|
||||
|
||||
var configJson = XrayConfigBuilder.BuildXrayConfig(Parameters);
|
||||
var stream = new MemoryStream(Encoding.UTF8.GetBytes(configJson));
|
||||
UploadFile(stream, "/usr/local/etc/xray/config.json");
|
||||
RunCmd("systemctl restart xray");
|
||||
}
|
||||
|
||||
private int GetRandomPort()
|
||||
{
|
||||
var random = new Random();
|
||||
return random.Next(10001, 60000);
|
||||
}
|
||||
|
||||
private dynamic LoadJsonObj(string path)
|
||||
{
|
||||
if (File.Exists(path))
|
||||
{
|
||||
var jsonStr = File.ReadAllText(path, Encoding.UTF8);
|
||||
return JsonConvert.DeserializeObject(jsonStr);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,220 +0,0 @@
|
||||
using Newtonsoft.Json;
|
||||
using ProxySU_Core.Common;
|
||||
using ProxySU_Core.Models.Developers;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Web;
|
||||
|
||||
namespace ProxySU_Core.Models
|
||||
{
|
||||
public class XraySettings : IParameters
|
||||
{
|
||||
|
||||
public XraySettings()
|
||||
{
|
||||
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 = "/vlessws";
|
||||
VLESS_H2_Path = "/vlessh2";
|
||||
VLESS_KCP_Type = "none";
|
||||
VLESS_KCP_Seed = guid;
|
||||
VLESS_gRPC_ServiceName = "xray_gRPC";
|
||||
|
||||
VMESS_WS_Path = "/vmessws";
|
||||
VMESS_TCP_Path = "/vmesstcp";
|
||||
VMESS_H2_Path = "/vmessh2";
|
||||
VMESS_KCP_Seed = guid;
|
||||
VMESS_KCP_Type = "none";
|
||||
|
||||
TrojanPassword = guid;
|
||||
Trojan_WS_Path = "/trojanws";
|
||||
|
||||
ShadowsocksPassword = guid;
|
||||
ShadowsocksMethod = "aes-128-gcm";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 访问端口
|
||||
/// </summary>
|
||||
public int Port { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// UUID
|
||||
/// </summary>
|
||||
public string UUID { get; set; }
|
||||
|
||||
#region vless
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// vless ws路径
|
||||
/// </summary>
|
||||
public string VLESS_WS_Path { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// vless http2 path
|
||||
/// </summary>
|
||||
public string VLESS_H2_Path { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// vless kcp seed
|
||||
/// </summary>
|
||||
public string VLESS_KCP_Seed { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// vless kcp type
|
||||
/// </summary>
|
||||
public string VLESS_KCP_Type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// vless kcp端口
|
||||
/// </summary>
|
||||
public int VLESS_KCP_Port { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// grpc service name
|
||||
/// </summary>
|
||||
public string VLESS_gRPC_ServiceName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// grpc port
|
||||
/// </summary>
|
||||
public int VLESS_gRPC_Port { get; set; }
|
||||
|
||||
#endregion
|
||||
|
||||
#region vmess
|
||||
/// <summary>
|
||||
/// vmess ws路径
|
||||
/// </summary>
|
||||
public string VMESS_WS_Path { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// vmess tcp路径
|
||||
/// </summary>
|
||||
public string VMESS_TCP_Path { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// vmess http2 path
|
||||
/// </summary>
|
||||
public string VMESS_H2_Path { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// vmess kcp seed
|
||||
/// </summary>
|
||||
public string VMESS_KCP_Seed { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// vmess kcp type
|
||||
/// </summary>
|
||||
public string VMESS_KCP_Type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// vmess kcp端口
|
||||
/// </summary>
|
||||
public int VMESS_KCP_Port { get; set; }
|
||||
#endregion
|
||||
|
||||
#region Trojan
|
||||
/// <summary>
|
||||
/// trojan密码
|
||||
/// </summary>
|
||||
public string TrojanPassword { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// trojan ws path
|
||||
/// </summary>
|
||||
public string Trojan_WS_Path { get; set; }
|
||||
#endregion
|
||||
|
||||
#region ShadowsocksAEAD
|
||||
/// <summary>
|
||||
/// ss password
|
||||
/// </summary>
|
||||
public string ShadowsocksPassword { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// ss method
|
||||
/// </summary>
|
||||
public string ShadowsocksMethod { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// ss端口
|
||||
/// </summary>
|
||||
public int ShadowSocksPort { get; set; }
|
||||
#endregion
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 域名
|
||||
/// </summary>
|
||||
public string Domain { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 伪装域名
|
||||
/// </summary>
|
||||
public string MaskDomain { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 安装类型
|
||||
/// </summary>
|
||||
public List<XrayType> Types { get; set; }
|
||||
|
||||
public List<int> FreePorts
|
||||
{
|
||||
get
|
||||
{
|
||||
return new List<int>
|
||||
{
|
||||
VLESS_gRPC_Port,
|
||||
VLESS_KCP_Port,
|
||||
VMESS_KCP_Port,
|
||||
ShadowSocksPort,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public string GetPath(XrayType type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case XrayType.VLESS_WS:
|
||||
return VLESS_WS_Path;
|
||||
case XrayType.VLESS_H2:
|
||||
return VLESS_H2_Path;
|
||||
|
||||
case XrayType.VMESS_TCP:
|
||||
return VMESS_TCP_Path;
|
||||
case XrayType.VMESS_WS:
|
||||
return VMESS_WS_Path;
|
||||
case XrayType.Trojan_WS:
|
||||
return Trojan_WS_Path;
|
||||
|
||||
// no path
|
||||
case XrayType.VLESS_TCP_XTLS:
|
||||
case XrayType.VLESS_TCP:
|
||||
case XrayType.VLESS_KCP:
|
||||
case XrayType.VMESS_KCP:
|
||||
case XrayType.Trojan_TCP:
|
||||
return string.Empty;
|
||||
default:
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -1,35 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySU_Core.Models
|
||||
{
|
||||
public class Host
|
||||
{
|
||||
|
||||
|
||||
public Host()
|
||||
{
|
||||
Proxy = new LocalProxy();
|
||||
}
|
||||
|
||||
|
||||
public string Tag { get; set; }
|
||||
|
||||
public string Address { get; set; }
|
||||
|
||||
public string UserName { get; set; }
|
||||
|
||||
public string Password { get; set; }
|
||||
|
||||
public int Port { get; set; } = 22;
|
||||
|
||||
public string PrivateKeyPath { get; set; }
|
||||
|
||||
public LocalProxy Proxy { get; set; }
|
||||
|
||||
public LoginSecretType SecretType { get; set; }
|
||||
}
|
||||
}
|
@ -1,20 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace ProxySU_Core.Models
|
||||
{
|
||||
public class LocalProxy
|
||||
{
|
||||
public string Address { get; set; } = "127.0.0.1";
|
||||
|
||||
public int Port { get; set; } = 1080;
|
||||
|
||||
public LocalProxyType Type { get; set; }
|
||||
|
||||
public string UserName { get; set; }
|
||||
|
||||
public string Password { get; set; }
|
||||
|
||||
}
|
||||
}
|
@ -1,23 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace ProxySU_Core.Models
|
||||
{
|
||||
public enum LocalProxyType
|
||||
{
|
||||
None = 0,
|
||||
//
|
||||
// 摘要:
|
||||
// A SOCKS4 proxy server.
|
||||
Socks4 = 1,
|
||||
//
|
||||
// 摘要:
|
||||
// A SOCKS5 proxy server.
|
||||
Socks5 = 2,
|
||||
//
|
||||
// 摘要:
|
||||
// A HTTP proxy server.
|
||||
Http = 3
|
||||
}
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace ProxySU_Core.Models
|
||||
{
|
||||
public enum LoginSecretType
|
||||
{
|
||||
Password = 0,
|
||||
PrivateKey = 1
|
||||
}
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
using ProxySU_Core.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace ProxySU_Core.Models
|
||||
{
|
||||
public class Record
|
||||
{
|
||||
public Record()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public Record(Host host)
|
||||
{
|
||||
this.Host = host;
|
||||
}
|
||||
|
||||
public Host Host { get; set; } = new Host();
|
||||
|
||||
public XraySettings Settings { get; set; } = new XraySettings();
|
||||
}
|
||||
}
|
@ -1,196 +0,0 @@
|
||||
using Newtonsoft.Json;
|
||||
using ProxySU_Core.Common;
|
||||
using ProxySU_Core.Models.Developers;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Web;
|
||||
|
||||
namespace ProxySU_Core.Models
|
||||
{
|
||||
public class ShareLink
|
||||
{
|
||||
public static string Build(XrayType xrayType, XraySettings 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:
|
||||
return BuildVlessShareLink(xrayType, settings);
|
||||
case XrayType.VMESS_TCP:
|
||||
case XrayType.VMESS_WS:
|
||||
case XrayType.VMESS_KCP:
|
||||
return BuildVmessShareLink(xrayType, settings);
|
||||
case XrayType.ShadowsocksAEAD:
|
||||
return BuildShadowSocksShareLink(settings);
|
||||
default:
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
private static string BuildShadowSocksShareLink(XraySettings settings)
|
||||
{
|
||||
var _method = settings.ShadowsocksMethod;
|
||||
var _password = settings.ShadowsocksPassword;
|
||||
var _server = settings.Domain;
|
||||
var _port = settings.ShadowSocksPort;
|
||||
|
||||
var base64URL = Base64.Encode($"{_method}:{_password}@{_server}:{_port}");
|
||||
return "ss://" + base64URL + "#ShadowSocks";
|
||||
}
|
||||
|
||||
private static string BuildVmessShareLink(XrayType xrayType, XraySettings settings)
|
||||
{
|
||||
var vmess = new Vmess
|
||||
{
|
||||
v = "2",
|
||||
add = settings.Domain,
|
||||
port = settings.Port.ToString(),
|
||||
id = settings.UUID,
|
||||
aid = "0",
|
||||
net = "",
|
||||
type = "none",
|
||||
host = settings.Domain,
|
||||
path = "",
|
||||
tls = "tls",
|
||||
ps = "",
|
||||
};
|
||||
|
||||
switch (xrayType)
|
||||
{
|
||||
case XrayType.VMESS_TCP:
|
||||
vmess.ps = "vmess-tcp-tls";
|
||||
vmess.net = "tcp";
|
||||
vmess.type = "http";
|
||||
vmess.path = settings.VMESS_TCP_Path;
|
||||
break;
|
||||
case XrayType.VMESS_WS:
|
||||
vmess.ps = "vmess-ws-tls";
|
||||
vmess.net = "ws";
|
||||
vmess.type = "none";
|
||||
vmess.path = settings.VMESS_WS_Path;
|
||||
break;
|
||||
case XrayType.VMESS_KCP:
|
||||
vmess.ps = "vmess-mKCP";
|
||||
vmess.port = settings.VMESS_KCP_Port.ToString();
|
||||
vmess.net = "kcp";
|
||||
vmess.type = settings.VMESS_KCP_Type;
|
||||
vmess.path = settings.VMESS_KCP_Seed;
|
||||
vmess.tls = "";
|
||||
break;
|
||||
default:
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
var base64Url = Base64.Encode(JsonConvert.SerializeObject(vmess));
|
||||
return $"vmess://" + base64Url;
|
||||
}
|
||||
|
||||
private static string BuildVlessShareLink(XrayType xrayType, XraySettings settings)
|
||||
{
|
||||
var _protocol = string.Empty;
|
||||
var _uuid = settings.UUID;
|
||||
var _domain = settings.Domain;
|
||||
var _port = settings.Port;
|
||||
var _type = string.Empty;
|
||||
var _encryption = "none";
|
||||
var _security = "tls";
|
||||
var _path = "/";
|
||||
var _host = settings.Domain;
|
||||
var _descriptiveText = string.Empty;
|
||||
var _headerType = "none";
|
||||
var _seed = string.Empty;
|
||||
|
||||
switch (xrayType)
|
||||
{
|
||||
case XrayType.VLESS_TCP:
|
||||
_protocol = "vless";
|
||||
_type = "tcp";
|
||||
_descriptiveText = "vless-tcp-tls";
|
||||
break;
|
||||
case XrayType.VLESS_TCP_XTLS:
|
||||
_protocol = "vless";
|
||||
_type = "tcp";
|
||||
_security = "xtls";
|
||||
_descriptiveText = "vless-tcp-xtls";
|
||||
break;
|
||||
case XrayType.VLESS_WS:
|
||||
_protocol = "vless";
|
||||
_type = "ws";
|
||||
_path = settings.VLESS_WS_Path;
|
||||
_descriptiveText = "vless-ws-tls";
|
||||
break;
|
||||
case XrayType.VLESS_KCP:
|
||||
_protocol = "vless";
|
||||
_type = "kcp";
|
||||
_headerType = settings.VLESS_KCP_Type;
|
||||
_seed = settings.VLESS_KCP_Seed;
|
||||
_port = settings.VLESS_KCP_Port;
|
||||
_security = "none";
|
||||
_descriptiveText = "vless-mKCP";
|
||||
break;
|
||||
case XrayType.VLESS_gRPC:
|
||||
_protocol = "vless";
|
||||
_type = "grpc";
|
||||
_path = settings.VLESS_gRPC_ServiceName;
|
||||
_descriptiveText = "vless-gRPC";
|
||||
break;
|
||||
case XrayType.Trojan_TCP:
|
||||
_protocol = "trojan";
|
||||
_uuid = settings.TrojanPassword;
|
||||
_descriptiveText = "trojan-tcp";
|
||||
break;
|
||||
default:
|
||||
throw new Exception("暂未实现的协议");
|
||||
}
|
||||
|
||||
|
||||
string parametersURL = string.Empty;
|
||||
if (xrayType != XrayType.Trojan_TCP)
|
||||
{
|
||||
// 4.3 传输层相关段
|
||||
parametersURL = $"?type={_type}&encryption={_encryption}&security={_security}&path={HttpUtility.UrlEncode(_path)}&headerType={_headerType}";
|
||||
|
||||
// kcp
|
||||
if (xrayType == XrayType.VLESS_KCP)
|
||||
{
|
||||
parametersURL += $"&seed={_seed}";
|
||||
}
|
||||
|
||||
// 4.4 TLS 相关段
|
||||
if (xrayType == XrayType.VLESS_TCP_XTLS)
|
||||
{
|
||||
parametersURL += "&flow=xtls-rprx-direct";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return $"{_protocol}://{HttpUtility.UrlEncode(_uuid)}@{_domain}:{_port}{parametersURL}#{HttpUtility.UrlEncode(_descriptiveText)}";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
class Vmess
|
||||
{
|
||||
public string v { get; set; }
|
||||
public string ps { get; set; }
|
||||
public string add { get; set; }
|
||||
public string port { get; set; }
|
||||
public string id { get; set; }
|
||||
public string aid { get; set; }
|
||||
public string net { get; set; }
|
||||
public string type { get; set; }
|
||||
public string host { get; set; }
|
||||
public string path { get; set; }
|
||||
public string tls { get; set; }
|
||||
}
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySU_Core.Models
|
||||
{
|
||||
public enum XrayType
|
||||
{
|
||||
// 入口
|
||||
VLESS_TCP_XTLS = 100,
|
||||
|
||||
// VLESS 101开头
|
||||
VLESS_TCP = 101,
|
||||
VLESS_WS = 102,
|
||||
VLESS_H2 = 103,
|
||||
VLESS_KCP = 104,
|
||||
VLESS_gRPC = 110,
|
||||
|
||||
// VMESS 201开头
|
||||
VMESS_TCP = 201,
|
||||
VMESS_WS = 202,
|
||||
VMESS_H2 = 203,
|
||||
VMESS_KCP = 204,
|
||||
|
||||
// Trojan 301开头
|
||||
Trojan_TCP = 301,
|
||||
Trojan_WS = 302,
|
||||
|
||||
// SS
|
||||
ShadowsocksAEAD = 401
|
||||
}
|
||||
}
|
@ -1,55 +0,0 @@
|
||||
using System.Reflection;
|
||||
using System.Resources;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Windows;
|
||||
|
||||
// 有关程序集的一般信息由以下
|
||||
// 控制。更改这些特性值可修改
|
||||
// 与程序集关联的信息。
|
||||
[assembly: AssemblyTitle("ProxySU_Core")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("ProxySU_Core")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2021")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// 将 ComVisible 设置为 false 会使此程序集中的类型
|
||||
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
|
||||
//请将此类型的 ComVisible 特性设置为 true。
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
//若要开始生成可本地化的应用程序,请设置
|
||||
//.csproj 文件中的 <UICulture>CultureYouAreCodingWith</UICulture>
|
||||
//例如,如果您在源文件中使用的是美国英语,
|
||||
//使用的是美国英语,请将 <UICulture> 设置为 en-US。 然后取消
|
||||
//对以下 NeutralResourceLanguage 特性的注释。 更新
|
||||
//以下行中的“en-US”以匹配项目文件中的 UICulture 设置。
|
||||
|
||||
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
|
||||
|
||||
|
||||
[assembly: ThemeInfo(
|
||||
ResourceDictionaryLocation.None, //主题特定资源词典所处位置
|
||||
//(未在页面中找到资源时使用,
|
||||
//或应用程序资源字典中找到时使用)
|
||||
ResourceDictionaryLocation.SourceAssembly //常规资源词典所处位置
|
||||
//(未在页面中找到资源时使用,
|
||||
//、应用程序或任何主题专用资源字典中找到时使用)
|
||||
)]
|
||||
|
||||
|
||||
// 程序集的版本信息由下列四个值组成:
|
||||
//
|
||||
// 主版本
|
||||
// 次版本
|
||||
// 生成号
|
||||
// 修订号
|
||||
//
|
||||
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
|
||||
//通过使用 "*",如下所示:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("3.1.3.0")]
|
||||
[assembly: AssemblyFileVersion("3.1.3.0")]
|
63
ProxySU_Core/Properties/Resources.Designer.cs
generated
63
ProxySU_Core/Properties/Resources.Designer.cs
generated
@ -1,63 +0,0 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// 此代码由工具生成。
|
||||
// 运行时版本:4.0.30319.42000
|
||||
//
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果
|
||||
// 重新生成代码,这些更改将会丢失。
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace ProxySU_Core.Properties {
|
||||
using System;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 一个强类型的资源类,用于查找本地化的字符串等。
|
||||
/// </summary>
|
||||
// 此类是由 StronglyTypedResourceBuilder
|
||||
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
|
||||
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
|
||||
// (以 /str 作为命令选项),或重新生成 VS 项目。
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resources {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Resources() {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 返回此类使用的缓存的 ResourceManager 实例。
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ProxySU_Core.Properties.Resources", typeof(Resources).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重写当前线程的 CurrentUICulture 属性,对
|
||||
/// 使用此强类型资源类的所有资源查找执行重写。
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
set {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,117 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
26
ProxySU_Core/Properties/Settings.Designer.cs
generated
26
ProxySU_Core/Properties/Settings.Designer.cs
generated
@ -1,26 +0,0 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// 此代码由工具生成。
|
||||
// 运行时版本:4.0.30319.42000
|
||||
//
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果
|
||||
// 重新生成代码,这些更改将会丢失。
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace ProxySU_Core.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.8.1.0")]
|
||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||
|
||||
public static Settings Default {
|
||||
get {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,7 +0,0 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
|
||||
<Profiles>
|
||||
<Profile Name="(Default)" />
|
||||
</Profiles>
|
||||
<Settings />
|
||||
</SettingsFile>
|
Binary file not shown.
Before Width: | Height: | Size: 17 KiB |
@ -1,463 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{B066015C-D347-4493-92F1-6556D3863996}</ProjectGuid>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<RootNamespace>ProxySU_Core</RootNamespace>
|
||||
<AssemblyName>ProxySU_Core</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||
<Deterministic>true</Deterministic>
|
||||
<NuGetPackageImportStamp>
|
||||
</NuGetPackageImportStamp>
|
||||
<IsWebBootstrapper>false</IsWebBootstrapper>
|
||||
<PublishUrl>C:\Users\huife\Desktop\publish_new\</PublishUrl>
|
||||
<Install>true</Install>
|
||||
<InstallFrom>Disk</InstallFrom>
|
||||
<UpdateEnabled>false</UpdateEnabled>
|
||||
<UpdateMode>Foreground</UpdateMode>
|
||||
<UpdateInterval>7</UpdateInterval>
|
||||
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
|
||||
<UpdatePeriodically>false</UpdatePeriodically>
|
||||
<UpdateRequired>false</UpdateRequired>
|
||||
<MapFileExtensions>true</MapFileExtensions>
|
||||
<ApplicationRevision>1</ApplicationRevision>
|
||||
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
|
||||
<UseApplicationTrust>false</UseApplicationTrust>
|
||||
<PublishWizardCompleted>true</PublishWizardCompleted>
|
||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ManifestCertificateThumbprint>D529B8E43BC86188988D830C545B400612900BB3</ManifestCertificateThumbprint>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ManifestKeyFile>ProxySU_Core_TemporaryKey.pfx</ManifestKeyFile>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<GenerateManifests>true</GenerateManifests>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<SignManifests>false</SignManifests>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ApplicationIcon>ProxySU.ico</ApplicationIcon>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="ControlzEx, Version=5.0.0.0, Culture=neutral, PublicKeyToken=69f1c32f803d307e, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\ControlzEx.5.0.0\lib\net452\ControlzEx.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="MahApps.Metro, Version=2.0.0.0, Culture=neutral, PublicKeyToken=51482d6f650b2b3f, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\MahApps.Metro.2.4.5\lib\net46\MahApps.Metro.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="MaterialDesignColors, Version=2.0.1.2556, Culture=neutral, PublicKeyToken=df2a72020bd7962a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\MaterialDesignColors.2.0.1\lib\net452\MaterialDesignColors.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="MaterialDesignThemes.MahApps, Version=0.1.7.2556, Culture=neutral, PublicKeyToken=df2a72020bd7962a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\MaterialDesignThemes.MahApps.0.1.7\lib\net452\MaterialDesignThemes.MahApps.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="MaterialDesignThemes.Wpf, Version=4.1.0.2556, Culture=neutral, PublicKeyToken=df2a72020bd7962a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\MaterialDesignThemes.4.1.0\lib\net452\MaterialDesignThemes.Wpf.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Xaml.Behaviors, Version=1.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Microsoft.Xaml.Behaviors.Wpf.1.1.31\lib\net45\Microsoft.Xaml.Behaviors.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="QRCoder, Version=1.4.1.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\QRCoder.1.4.1\lib\net40\QRCoder.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Renci.SshNet, Version=2020.0.1.0, Culture=neutral, PublicKeyToken=1cee9f8bde3db106, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\SSH.NET.2020.0.1\lib\net40\Renci.SshNet.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.ComponentModel.DataAnnotations" />
|
||||
<Reference Include="System.Configuration" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Web" />
|
||||
<Reference Include="System.Web.Extensions" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Xaml">
|
||||
<RequiredTargetFramework>4.0</RequiredTargetFramework>
|
||||
</Reference>
|
||||
<Reference Include="WindowsBase" />
|
||||
<Reference Include="PresentationCore" />
|
||||
<Reference Include="PresentationFramework" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ApplicationDefinition Include="App.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</ApplicationDefinition>
|
||||
<Compile Include="App.xaml.cs">
|
||||
<DependentUpon>App.xaml</DependentUpon>
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Common\Base64.cs" />
|
||||
<Compile Include="Converters\LoginSecretTypeConverter.cs" />
|
||||
<Compile Include="Converters\VisibleConverter.cs" />
|
||||
<Compile Include="Models\AppSettings.cs" />
|
||||
<Compile Include="Models\Developers\TrojanGoConfigBuilder.cs" />
|
||||
<Compile Include="Models\Developers\TrojanGoProject.cs" />
|
||||
<Compile Include="Models\Developers\TrojanGoSettings.cs" />
|
||||
<Compile Include="Models\Host.cs" />
|
||||
<Compile Include="Models\ShareLink.cs" />
|
||||
<Compile Include="Models\Developers\XraySettings.cs" />
|
||||
<Compile Include="Models\XrayType.cs" />
|
||||
<Compile Include="Tools\DateTimeUtils.cs" />
|
||||
<Compile Include="Tools\Extensions.cs" />
|
||||
<Compile Include="ViewModels\BaseCommand.cs" />
|
||||
<Compile Include="ViewModels\BaseModel.cs" />
|
||||
<Compile Include="ViewModels\BaseViewModel.cs" />
|
||||
<Compile Include="Models\Developers\XrayConfigBuilder.cs" />
|
||||
<Compile Include="Models\Developers\IParameters.cs" />
|
||||
<Compile Include="Models\Developers\Project.cs" />
|
||||
<Compile Include="Models\Developers\XrayProject.cs" />
|
||||
<Compile Include="ViewModels\HostViewModel.cs" />
|
||||
<Compile Include="Models\LocalProxy.cs" />
|
||||
<Compile Include="Models\LocalProxyType.cs" />
|
||||
<Compile Include="Models\LoginSecretType.cs" />
|
||||
<Compile Include="Models\Record.cs" />
|
||||
<Compile Include="ViewModels\IdValueViewModel.cs" />
|
||||
<Compile Include="ViewModels\RecordViewModel.cs" />
|
||||
<Compile Include="ViewModels\Terminal.cs" />
|
||||
<Compile Include="ViewModels\XraySettingsViewModel.cs" />
|
||||
<Compile Include="Views\ClientInfo\ClientInfoWindow.xaml.cs">
|
||||
<DependentUpon>ClientInfoWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\ClientInfo\ShadowSocksControl.xaml.cs">
|
||||
<DependentUpon>ShadowSocksControl.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\ClientInfo\Trojan_TCP_Control.xaml.cs">
|
||||
<DependentUpon>Trojan_TCP_Control.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\ClientInfo\VLESS_gRPC_Control.xaml.cs">
|
||||
<DependentUpon>VLESS_gRPC_Control.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\ClientInfo\VLESS_KCP_Control.xaml.cs">
|
||||
<DependentUpon>VLESS_KCP_Control.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\ClientInfo\VLESS_TCP_TLS_Control.xaml.cs">
|
||||
<DependentUpon>VLESS_TCP_TLS_Control.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\ClientInfo\VLESS_WS_TLS_Control.xaml.cs">
|
||||
<DependentUpon>VLESS_WS_TLS_Control.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\ClientInfo\VLESS_XTLS_Control.xaml.cs">
|
||||
<DependentUpon>VLESS_XTLS_Control.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\ClientInfo\VMESS_KCP_Control.xaml.cs">
|
||||
<DependentUpon>VMESS_KCP_Control.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\ClientInfo\VMESS_TCP_TLS_Control.xaml.cs">
|
||||
<DependentUpon>VMESS_TCP_TLS_Control.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\ClientInfo\VMESS_WS_TLS_Control.xaml.cs">
|
||||
<DependentUpon>VMESS_WS_TLS_Control.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\MainWindow.xaml.cs">
|
||||
<DependentUpon>MainWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\RecordEditor\RecordEditorWindow.xaml.cs">
|
||||
<DependentUpon>RecordEditorWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\RecordEditor\ServerInfoControl.xaml.cs">
|
||||
<DependentUpon>ServerInfoControl.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\RecordEditor\XrayEditorControl.xaml.cs">
|
||||
<DependentUpon>XrayEditorControl.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\TerminalWindow.xaml.cs">
|
||||
<DependentUpon>TerminalWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\TextBoxWindow.xaml.cs">
|
||||
<DependentUpon>TextBoxWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Converters\ProxyTypeConverter.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Properties\Resources.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Properties\Settings.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Settings.settings</DependentUpon>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
</Compile>
|
||||
<EmbeddedResource Include="Properties\Resources.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
</EmbeddedResource>
|
||||
<None Include="packages.config" />
|
||||
<None Include="Properties\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<None Include="Templates\trojan-go\base.caddyfile">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\trojan-go\trojan-go.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\base.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\caddy\base.caddyfile">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\client\00_log\00_log.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\client\01_api\01_api.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\client\02_dns\02_dns.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\client\03_routing\03_routing.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\client\04_policy\04_policy.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\client\05_inbounds\05_inbounds.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\client\06_outbounds\06_outbounds.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\client\06_outbounds\VLESS_HTTP2_TLS.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\client\06_outbounds\VLESS_TCP_TLS_WS.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\client\07_transport\07_transport.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\client\08_stats\08_stats.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\client\09_reverse\09_reverse.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\server\00_log\00_log.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\server\01_api\01_api.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\server\02_dns\02_dns.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\server\03_routing\03_routing.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\server\04_policy\04_policy.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\server\05_inbounds\05_inbounds.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\server\05_inbounds\Shadowsocks-AEAD.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\server\05_inbounds\Trojan_TCP.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\server\05_inbounds\Trojan_WS.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\server\05_inbounds\VLESS_gRPC.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\server\05_inbounds\VLESS_HTTP2.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\server\05_inbounds\VLESS_KCP.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\server\05_inbounds\VLESS_TCP_XTLS.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\server\05_inbounds\VLESS_WS.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\server\05_inbounds\VMESS_HTTP2.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\server\05_inbounds\VMESS_KCP.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\server\05_inbounds\VMESS_TCP.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\server\05_inbounds\VMESS_WS.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\server\06_outbounds\06_outbounds.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\server\07_transport\07_transport.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\server\08_stats\08_stats.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Templates\xray\server\09_reverse\09_reverse.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="App.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Page Include="Resources\Languages\en.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="Resources\Languages\zh_cn.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="Resources\Styles\MaterialDesignThemes.Overrides.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="Views\ClientInfo\ClientInfoWindow.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\ClientInfo\ShadowSocksControl.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\ClientInfo\Trojan_TCP_Control.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\ClientInfo\VLESS_gRPC_Control.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\ClientInfo\VLESS_KCP_Control.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\ClientInfo\VLESS_TCP_TLS_Control.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\ClientInfo\VLESS_WS_TLS_Control.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\ClientInfo\VLESS_XTLS_Control.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\ClientInfo\VMESS_KCP_Control.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\ClientInfo\VMESS_TCP_TLS_Control.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\ClientInfo\VMESS_WS_TLS_Control.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\MainWindow.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="Views\RecordEditor\RecordEditorWindow.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\RecordEditor\ServerInfoControl.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\RecordEditor\XrayEditorControl.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\TerminalWindow.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="Views\TextBoxWindow.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="Data\" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<BootstrapperPackage Include=".NETFramework,Version=v4.6.1">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>Microsoft .NET Framework 4.6.1 %28x86 和 x64%29</ProductName>
|
||||
<Install>true</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5 SP1</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Resource Include="Resources\ProxySU.ico" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Resource Include="ProxySU.ico" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<ProjectExtensions />
|
||||
<Import Project="..\packages\MaterialDesignThemes.4.1.0\build\MaterialDesignThemes.targets" Condition="Exists('..\packages\MaterialDesignThemes.4.1.0\build\MaterialDesignThemes.targets')" />
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
<PropertyGroup>
|
||||
<ErrorText>这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。</ErrorText>
|
||||
</PropertyGroup>
|
||||
<Error Condition="!Exists('..\packages\MaterialDesignThemes.4.1.0\build\MaterialDesignThemes.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MaterialDesignThemes.4.1.0\build\MaterialDesignThemes.targets'))" />
|
||||
</Target>
|
||||
</Project>
|
@ -1,122 +0,0 @@
|
||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:sys="clr-namespace:System;assembly=mscorlib">
|
||||
<sys:String x:Key="TabItemHeaderAppDeployment">Deployment</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderReadme">Readme</sys:String>
|
||||
|
||||
<sys:String x:Key="LanguageText">Language(语言)</sys:String>
|
||||
<sys:String x:Key="LanguageChinese">Chinese</sys:String>
|
||||
<sys:String x:Key="LanguageEnglish">English</sys:String>
|
||||
<sys:String x:Key="Hosts">Hosts</sys:String>
|
||||
<sys:String x:Key="AddHost">Add Host</sys:String>
|
||||
<sys:String x:Key="ViewConfig">Export Config</sys:String>
|
||||
<sys:String x:Key="ViewSub">Export Sub</sys:String>
|
||||
<sys:String x:Key="Random">Random</sys:String>
|
||||
|
||||
|
||||
<!--table-->
|
||||
<sys:String x:Key="MainTableSelection">Selection</sys:String>
|
||||
<sys:String x:Key="MainTableRemark">Remark</sys:String>
|
||||
<sys:String x:Key="MainTableHost">Host</sys:String>
|
||||
<sys:String x:Key="MainTablePort">Port</sys:String>
|
||||
<sys:String x:Key="MainTableProxy">Proxy</sys:String>
|
||||
<sys:String x:Key="MainTableActions">Actions</sys:String>
|
||||
<sys:String x:Key="MainTableControl">Cnsole</sys:String>
|
||||
<sys:String x:Key="MainTableViewConfig">Config</sys:String>
|
||||
<sys:String x:Key="MainTableEditor">Edit</sys:String>
|
||||
<sys:String x:Key="MainTableDelete">Delete</sys:String>
|
||||
|
||||
|
||||
<sys:String x:Key="Actions">Actions</sys:String>
|
||||
<sys:String x:Key="Connect">Connect</sys:String>
|
||||
<sys:String x:Key="Edit">Edit</sys:String>
|
||||
<sys:String x:Key="EditTemp">Edit Xray</sys:String>
|
||||
<sys:String x:Key="Delete">Delete</sys:String>
|
||||
<sys:String x:Key="Install">Install</sys:String>
|
||||
<sys:String x:Key="Save">Save</sys:String>
|
||||
<sys:String x:Key="SaveAs">Save as</sys:String>
|
||||
<sys:String x:Key="Info">Info</sys:String>
|
||||
<sys:String x:Key="Warning">Warning</sys:String>
|
||||
<sys:String x:Key="Error">Error</sys:String>
|
||||
|
||||
|
||||
<!--Host Window-->
|
||||
<sys:String x:Key="HostWindowTitle">Server Editor</sys:String>
|
||||
<sys:String x:Key="ConnectionGroupName">Connection</sys:String>
|
||||
<sys:String x:Key="HostUserName">User</sys:String>
|
||||
<sys:String x:Key="HostPassword">Password</sys:String>
|
||||
<sys:String x:Key="HostTag">Tag</sys:String>
|
||||
<sys:String x:Key="HostAddress">Host</sys:String>
|
||||
<sys:String x:Key="HostPort">Port</sys:String>
|
||||
<sys:String x:Key="HostLoginType">Method</sys:String>
|
||||
<sys:String x:Key="PasswordLogin">Password Login</sys:String>
|
||||
<sys:String x:Key="CertLogin">KeyLogin</sys:String>
|
||||
<sys:String x:Key="KeyLoginField">Key</sys:String>
|
||||
<sys:String x:Key="KeyUpload">Upload</sys:String>
|
||||
<sys:String x:Key="ProxyGroupName">Proxy</sys:String>
|
||||
<sys:String x:Key="ProxyType">Method</sys:String>
|
||||
<sys:String x:Key="ProxyTypeNone">None</sys:String>
|
||||
<sys:String x:Key="ProxyTypeHttp">Http</sys:String>
|
||||
<sys:String x:Key="ProxyTypeSocks5">Socks5</sys:String>
|
||||
<sys:String x:Key="ProxyHostName">Host</sys:String>
|
||||
<sys:String x:Key="ProxyHostPort">Port</sys:String>
|
||||
<sys:String x:Key="ProxyUserName">User</sys:String>
|
||||
<sys:String x:Key="ProxyPassword">Password</sys:String>
|
||||
<sys:String x:Key="HostAddressNotNull">Please enter host</sys:String>
|
||||
<sys:String x:Key="HostPortNotNull">Please enter port</sys:String>
|
||||
<sys:String x:Key="PorxyAddressNotNull">Please enter proxy host</sys:String>
|
||||
<sys:String x:Key="ProxyProtNotNull">Please enter proxy port</sys:String>
|
||||
|
||||
|
||||
<sys:String x:Key="VlessXtlsDesc" xml:space="preserve">VLESS over TCP With XTLS
Preferred</sys:String>
|
||||
<sys:String x:Key="VlessTcpDesc" xml:space="preserve">VLESS over TCP with TLS
XTLS is Preferred</sys:String>
|
||||
<sys:String x:Key="VlessWsDesc" xml:space="preserve">VLESS over WS with TLS
Support CDN</sys:String>
|
||||
<sys:String x:Key="VlessKcpDesc" xml:space="preserve">VLESS mKCP
low delay</sys:String>
|
||||
<sys:String x:Key="VmessWsDesc" xml:space="preserve">VMESS over WS with TLS
Support CDN</sys:String>
|
||||
<sys:String x:Key="VmessKcpDesc" xml:space="preserve">VMESS mKCP
low delay</sys:String>
|
||||
<sys:String x:Key="SSDesc" xml:space="preserve">ShadowSocks
Support CDN</sys:String>
|
||||
<sys:String x:Key="TrojanDesc" xml:space="preserve">Trojan over TCP with TLS
Trojan</sys:String>
|
||||
|
||||
<sys:String x:Key="XrayDomain">Address</sys:String>
|
||||
<sys:String x:Key="XrayMarkDomain">GuiseHost</sys:String>
|
||||
<sys:String x:Key="XrayUUID">UUID</sys:String>
|
||||
<sys:String x:Key="VlessWsPath">VLESS WS Path</sys:String>
|
||||
<sys:String x:Key="VlessKcpSeed">VLESS KCP Seed</sys:String>
|
||||
<sys:String x:Key="VlessKcpType">VLESS KCP Type</sys:String>
|
||||
<sys:String x:Key="VlessKcpPort">VLESS KCP Port</sys:String>
|
||||
<sys:String x:Key="VmessWsPath">VMESS WS Path</sys:String>
|
||||
<sys:String x:Key="VmessKcpSeed">VMESS KCP Seed</sys:String>
|
||||
<sys:String x:Key="VmessKcpType">VMESS KCP Type</sys:String>
|
||||
<sys:String x:Key="VmessKcpPort">VMESS KCP Port</sys:String>
|
||||
<sys:String x:Key="SSPassword">SS Pwd</sys:String>
|
||||
<sys:String x:Key="SSMethods">SS Method</sys:String>
|
||||
<sys:String x:Key="TrojanPassword">Trojan Pwd</sys:String>
|
||||
<sys:String x:Key="XrayPort">xray Port</sys:String>
|
||||
<sys:String x:Key="XrayPortDefault">default port is 443</sys:String>
|
||||
|
||||
<!--Terminal Window-->
|
||||
<sys:String x:Key="TerminalTitle">Console</sys:String>
|
||||
<sys:String x:Key="InstallActions">xray/settings</sys:String>
|
||||
<sys:String x:Key="InstallXray">Install</sys:String>
|
||||
<sys:String x:Key="UpdateSettings">UpdateSettings</sys:String>
|
||||
<sys:String x:Key="UpdateXrayCore">UpdateXray</sys:String>
|
||||
<sys:String x:Key="UninstallXray">UninstallXray</sys:String>
|
||||
|
||||
<sys:String x:Key="SettingActions">cert/web</sys:String>
|
||||
<sys:String x:Key="UpdateCert">UpdateCert</sys:String>
|
||||
<sys:String x:Key="UploadSelfCert">UploadSelfCert</sys:String>
|
||||
<sys:String x:Key="UploadWeb">UploadWebite</sys:String>
|
||||
<sys:String x:Key="UninstallCaddy">UninstallCaddy</sys:String>
|
||||
|
||||
<sys:String x:Key="ReadmeInstallXray">Install: Finally output "please enjoy" to indicate completion, go to [Configuration] or [Config] to view the node</sys:String>
|
||||
<sys:String x:Key="ReadmeUpdateSettings">Update Settings: After modifying the node configuration information, there is no need to reinstall, this function can update the configuration</sys:String>
|
||||
<sys:String x:Key="ReadmeUpdateCert">Update Cert: The certificate is automatically updated by default, but it is not guaranteed to be updated successfully. If it fails, please use [Update Cert] to update manually</sys:String>
|
||||
<sys:String x:Key="ReadmeUploadWeb">Upload website: Disguise the website, the correct static webpage must have an index.html file (please check), and then upload the website compressed package.</sys:String>
|
||||
<sys:String x:Key="ReadmeWebsiteDemo">The following is a static web page connection provided by netizens, please check whether there is an index.html file by yourself</sys:String>
|
||||
|
||||
|
||||
|
||||
<!--client info window-->
|
||||
<sys:String x:Key="ClientInfoTitle">View Settings</sys:String>
|
||||
|
||||
</ResourceDictionary>
|
@ -1,120 +0,0 @@
|
||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:sys="clr-namespace:System;assembly=mscorlib">
|
||||
<sys:String x:Key="TabItemHeaderAppDeployment">应用布署</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderReadme">说明文档</sys:String>
|
||||
|
||||
<sys:String x:Key="LanguageText">语言(Language)</sys:String>
|
||||
<sys:String x:Key="LanguageChinese">中文</sys:String>
|
||||
<sys:String x:Key="LanguageEnglish">英文</sys:String>
|
||||
<sys:String x:Key="Hosts">主机列表</sys:String>
|
||||
<sys:String x:Key="AddHost">添加主机</sys:String>
|
||||
<sys:String x:Key="ViewConfig">导出配置</sys:String>
|
||||
<sys:String x:Key="ViewSub">导出订阅</sys:String>
|
||||
<sys:String x:Key="Random">随机</sys:String>
|
||||
|
||||
<!--table-->
|
||||
<sys:String x:Key="MainTableSelection">选择</sys:String>
|
||||
<sys:String x:Key="MainTableRemark">别名</sys:String>
|
||||
<sys:String x:Key="MainTableHost">主机</sys:String>
|
||||
<sys:String x:Key="MainTablePort">端口</sys:String>
|
||||
<sys:String x:Key="MainTableProxy">代理</sys:String>
|
||||
<sys:String x:Key="MainTableActions">操作</sys:String>
|
||||
<sys:String x:Key="MainTableControl">控制台</sys:String>
|
||||
<sys:String x:Key="MainTableViewConfig">查看配置</sys:String>
|
||||
<sys:String x:Key="MainTableEditor">编辑</sys:String>
|
||||
<sys:String x:Key="MainTableDelete">删除</sys:String>
|
||||
|
||||
|
||||
<sys:String x:Key="Connect">连接</sys:String>
|
||||
<sys:String x:Key="Install">安装</sys:String>
|
||||
<sys:String x:Key="Edit">编辑</sys:String>
|
||||
<sys:String x:Key="EditTemp">编辑模板</sys:String>
|
||||
<sys:String x:Key="Delete">删除</sys:String>
|
||||
<sys:String x:Key="Save">保存</sys:String>
|
||||
<sys:String x:Key="SaveAs">另存为</sys:String>
|
||||
<sys:String x:Key="Info">消息</sys:String>
|
||||
<sys:String x:Key="Warning">提示</sys:String>
|
||||
<sys:String x:Key="Error">错误</sys:String>
|
||||
|
||||
<!--Host Window-->
|
||||
<sys:String x:Key="HostWindowTitle">服务器管理</sys:String>
|
||||
<sys:String x:Key="ConnectionGroupName">连接</sys:String>
|
||||
<sys:String x:Key="HostUserName">用户名</sys:String>
|
||||
<sys:String x:Key="HostPassword">密码</sys:String>
|
||||
<sys:String x:Key="HostTag">别名</sys:String>
|
||||
<sys:String x:Key="HostAddress">主机</sys:String>
|
||||
<sys:String x:Key="HostPort">端口</sys:String>
|
||||
<sys:String x:Key="HostLoginType">登陆方式</sys:String>
|
||||
<sys:String x:Key="PasswordLogin">密码登陆</sys:String>
|
||||
<sys:String x:Key="KeyLogin">密钥登陆</sys:String>
|
||||
<sys:String x:Key="KeyLoginField">密钥</sys:String>
|
||||
<sys:String x:Key="KeyUpload">上传</sys:String>
|
||||
<sys:String x:Key="ProxyGroupName">代理</sys:String>
|
||||
<sys:String x:Key="ProxyType">类型</sys:String>
|
||||
<sys:String x:Key="ProxyTypeNone">无</sys:String>
|
||||
<sys:String x:Key="ProxyTypeHttp">Http</sys:String>
|
||||
<sys:String x:Key="ProxyTypeSocks5">Socks5</sys:String>
|
||||
<sys:String x:Key="ProxyHostName">代理地址</sys:String>
|
||||
<sys:String x:Key="ProxyHostPort">代理端口</sys:String>
|
||||
<sys:String x:Key="ProxyUserName">用户名</sys:String>
|
||||
<sys:String x:Key="ProxyPassword">密码</sys:String>
|
||||
<sys:String x:Key="HostAddressNotNull">请输入主机</sys:String>
|
||||
<sys:String x:Key="HostPortNotNull">请输入端口号</sys:String>
|
||||
<sys:String x:Key="PorxyAddressNotNull">请输入代理地址</sys:String>
|
||||
<sys:String x:Key="ProxyProtNotNull">请输入代理端口号</sys:String>
|
||||
|
||||
<sys:String x:Key="VlessXtlsDesc" xml:space="preserve">VLESS Over TCP With XTLS
性能数倍,首选方式。</sys:String>
|
||||
<sys:String x:Key="VlessTcpDesc" xml:space="preserve">VLESS over TCP with TLS
仍推荐XTLS。</sys:String>
|
||||
<sys:String x:Key="VlessWsDesc" xml:space="preserve">VLESS over WS with TLS
推荐,支持CDN。</sys:String>
|
||||
<sys:String x:Key="VlessKcpDesc" xml:space="preserve">VLESS mKCP
游戏推荐,延迟低。</sys:String>
|
||||
<sys:String x:Key="VmessWsDesc" xml:space="preserve">VMESS over WS with TLS
推荐,支持CDN。</sys:String>
|
||||
<sys:String x:Key="VmessKcpDesc" xml:space="preserve">VMESS mKCP
游戏推荐,延迟低。</sys:String>
|
||||
<sys:String x:Key="SSDesc" xml:space="preserve">ShadowSocks
SS,支持udp。</sys:String>
|
||||
<sys:String x:Key="TrojanDesc" xml:space="preserve">Trojan over TCP with TLS
Trojan。</sys:String>
|
||||
|
||||
|
||||
<sys:String x:Key="XrayDomain">域名</sys:String>
|
||||
<sys:String x:Key="XrayMarkDomain">伪装域名</sys:String>
|
||||
<sys:String x:Key="XrayUUID">UUID</sys:String>
|
||||
<sys:String x:Key="VlessWsPath">VLESS WS路径</sys:String>
|
||||
<sys:String x:Key="VlessKcpSeed">VLESS KCP Seed</sys:String>
|
||||
<sys:String x:Key="VlessKcpType">VLESS KCP伪装</sys:String>
|
||||
<sys:String x:Key="VlessKcpPort">VLESS KCP端口</sys:String>
|
||||
<sys:String x:Key="VmessWsPath">VMESS WS路径</sys:String>
|
||||
<sys:String x:Key="VmessKcpSeed">VMESS KCP Seed</sys:String>
|
||||
<sys:String x:Key="VmessKcpType">VMESS KCP伪装</sys:String>
|
||||
<sys:String x:Key="VmessKcpPort">VMESS KCP端口</sys:String>
|
||||
<sys:String x:Key="SSPassword">SS密码</sys:String>
|
||||
<sys:String x:Key="SSMethods">SS加密方式</sys:String>
|
||||
<sys:String x:Key="TrojanPassword">Trojan密码</sys:String>
|
||||
<sys:String x:Key="XrayPort">xray端口</sys:String>
|
||||
<sys:String x:Key="XrayPortDefault">默认端口443,不建议修改</sys:String>
|
||||
|
||||
|
||||
|
||||
<!--Terminal Window-->
|
||||
<sys:String x:Key="TerminalTitle">控制台</sys:String>
|
||||
<sys:String x:Key="InstallActions">内核/配置</sys:String>
|
||||
<sys:String x:Key="InstallXray">一键安装</sys:String>
|
||||
<sys:String x:Key="UpdateSettings">更新配置</sys:String>
|
||||
<sys:String x:Key="UpdateXrayCore">更新xray内核</sys:String>
|
||||
<sys:String x:Key="UninstallXray">卸载代理</sys:String>
|
||||
|
||||
<sys:String x:Key="SettingActions">证书/网站</sys:String>
|
||||
<sys:String x:Key="UpdateCert">续签证书</sys:String>
|
||||
<sys:String x:Key="UploadSelfCert">上传自有证书</sys:String>
|
||||
<sys:String x:Key="UploadWeb">上传网站</sys:String>
|
||||
<sys:String x:Key="UninstallCaddy">卸载Caddy</sys:String>
|
||||
|
||||
<sys:String x:Key="ReadmeInstallXray">一键安装: 最后输出 “请尽情享用” 表示完成,到[查看配置]或[导出配置]查看节点</sys:String>
|
||||
<sys:String x:Key="ReadmeUpdateSettings">更新配置: 修改节点配置信息后,不需要重新安装,这个功能就可以更新配置了</sys:String>
|
||||
<sys:String x:Key="ReadmeUpdateCert">续签证书: 证书默认是自动续签,但不保证都能续签成功,如果失败请用[续签证书]手动续签</sys:String>
|
||||
<sys:String x:Key="ReadmeUploadWeb">上传网站: 伪装网站,正确的静态网页要有index.html文件(请检查),然后将网站压缩包上传。</sys:String>
|
||||
<sys:String x:Key="ReadmeWebsiteDemo">如下是网友提供的静态网页连接,请自行检查是否有index.html文件</sys:String>
|
||||
|
||||
|
||||
<!--client info window-->
|
||||
<sys:String x:Key="ClientInfoTitle">查看配置信息</sys:String>
|
||||
|
||||
</ResourceDictionary>
|
Binary file not shown.
Before Width: | Height: | Size: 17 KiB |
@ -1,48 +0,0 @@
|
||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:materialDesign="clr-namespace:MaterialDesignThemes.Wpf;assembly=MaterialDesignThemes.Wpf">
|
||||
<Style
|
||||
TargetType="{x:Type TabItem}"
|
||||
BasedOn="{StaticResource MaterialDesignNavigationRailTabItem}"
|
||||
x:Key="MaterialDesignNavigationRailTabItem">
|
||||
<Setter Property="Height" Value="52" />
|
||||
<Setter Property="Padding" Value="12,0" />
|
||||
</Style>
|
||||
|
||||
<Style
|
||||
TargetType="GroupBox"
|
||||
x:Key="MaterialDesignHeaderedContentControl">
|
||||
|
||||
</Style>
|
||||
|
||||
<Style
|
||||
TargetType="DataGridCell"
|
||||
BasedOn="{StaticResource MahApps.Styles.DataGridCell}"
|
||||
x:Key="DataGridCell">
|
||||
<Setter Property="BorderThickness" Value="0"/>
|
||||
<Setter Property="HorizontalAlignment" Value="Center"/>
|
||||
<Setter Property="Padding" Value="10,7"/>
|
||||
<Style.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter Property="Foreground" Value="{DynamicResource MahApps.Brushes.Accent}" />
|
||||
</Trigger>
|
||||
<Trigger Property="IsSelected" Value="True">
|
||||
<Setter Property="Foreground" Value="{DynamicResource MahApps.Brushes.Accent}" />
|
||||
<Setter Property="FontWeight" Value="Bold"/>
|
||||
</Trigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
|
||||
<Style TargetType="DataGridColumnHeader"
|
||||
BasedOn="{StaticResource MaterialDesignDataGridColumnHeader}"
|
||||
x:Key="DataGridColumnHeader">
|
||||
<Setter Property="HorizontalAlignment" Value="Center" />
|
||||
<Setter Property="BorderThickness" Value="0,0,0,1"/>
|
||||
</Style>
|
||||
|
||||
<Style
|
||||
TargetType="DataGrid"
|
||||
BasedOn="{StaticResource MahApps.Styles.DataGrid}"
|
||||
x:Key="DataGrid">
|
||||
</Style>
|
||||
</ResourceDictionary>
|
@ -1,9 +0,0 @@
|
||||
:##port## {
|
||||
root * /usr/share/caddy
|
||||
file_server
|
||||
##reverse_proxy##
|
||||
}
|
||||
|
||||
##domain##:80 {
|
||||
redir https://##domain##{uri}
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
{
|
||||
"run_type": "server",
|
||||
"local_addr": "0.0.0.0",
|
||||
"local_port": 443,
|
||||
"remote_addr": "127.0.0.1",
|
||||
"remote_port": 80,
|
||||
"password": [
|
||||
""
|
||||
],
|
||||
"ssl": {
|
||||
"cert": "/usr/local/etc/trojan-go/trojan-go.crt",
|
||||
"key": "/usr/local/etc/trojan-go/trojan-go.key",
|
||||
"sni": ""
|
||||
}
|
||||
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
{
|
||||
"log": {},
|
||||
"api": {},
|
||||
"dns": {},
|
||||
"routing": {},
|
||||
"policy": {},
|
||||
"inbounds": [],
|
||||
"outbounds": [],
|
||||
"transport": {},
|
||||
"stats": {},
|
||||
"reverse": {}
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
:##port## {
|
||||
root * /usr/share/caddy
|
||||
file_server
|
||||
##reverse_proxy##
|
||||
}
|
||||
|
||||
##domain##:80 {
|
||||
redir https://##domain##{uri}
|
||||
}
|
@ -1,5 +0,0 @@
|
||||
{
|
||||
"log": {
|
||||
"loglevel": "warning"
|
||||
}
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
{
|
||||
"api": null
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
{
|
||||
"dns": {}
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
{
|
||||
"routing": {}
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
{
|
||||
"policy": {}
|
||||
}
|
@ -1,23 +0,0 @@
|
||||
{
|
||||
"inbounds": [
|
||||
{
|
||||
"protocol": "http",
|
||||
"port": 1081
|
||||
},
|
||||
{
|
||||
"port": 1080,
|
||||
"protocol": "socks",
|
||||
"sniffing": {
|
||||
"enabled": true,
|
||||
"destOverride": [
|
||||
"http",
|
||||
"tls"
|
||||
]
|
||||
},
|
||||
"settings": {
|
||||
"udp": true,
|
||||
"auth": "noauth"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
{
|
||||
"outbounds": []
|
||||
}
|
@ -1,31 +0,0 @@
|
||||
{
|
||||
"outbounds": [
|
||||
{
|
||||
"protocol": "vless",
|
||||
"settings": {
|
||||
"vnext": [
|
||||
{
|
||||
"address": "",
|
||||
"port": 443,
|
||||
"users": [
|
||||
{
|
||||
"id": "",
|
||||
"encryption": "none"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "h2",
|
||||
"security": "tls",
|
||||
"httpSettings": {
|
||||
"host": [
|
||||
""
|
||||
],
|
||||
"path": null
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
@ -1,32 +0,0 @@
|
||||
{
|
||||
"outbounds": [
|
||||
{
|
||||
"protocol": "vless",
|
||||
"settings": {
|
||||
"vnext": [
|
||||
{
|
||||
"address": "",
|
||||
"port": 443,
|
||||
"users": [
|
||||
{
|
||||
"id": "",
|
||||
"encryption": "none",
|
||||
"level": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "ws",
|
||||
"security": "tls",
|
||||
"tlsSettings": {
|
||||
"serverName": ""
|
||||
},
|
||||
"wsSettings": {
|
||||
"path": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
{
|
||||
"transport": {}
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
{
|
||||
"stats": null
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
{
|
||||
"reverse": {}
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
{
|
||||
"log": {
|
||||
"access": "none",
|
||||
"loglevel": "none"
|
||||
}
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
{
|
||||
"api": {}
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
{
|
||||
"dns": {}
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
{
|
||||
"routing": {
|
||||
"domainStrategy": "AsIs",
|
||||
"rules": [
|
||||
{
|
||||
"type": "field",
|
||||
"ip": [
|
||||
"geoip:private"
|
||||
],
|
||||
"outboundTag": "block"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
{
|
||||
"policy": {}
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
{
|
||||
"inbounds": []
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
{
|
||||
"port": 12345,
|
||||
"protocol": "shadowsocks",
|
||||
"settings": {
|
||||
"clients": [
|
||||
{
|
||||
"password": "",
|
||||
"method": "aes-128-gcm"
|
||||
}
|
||||
],
|
||||
"network": "tcp,udp"
|
||||
}
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
{
|
||||
"port": 1310,
|
||||
"listen": "127.0.0.1",
|
||||
"protocol": "trojan",
|
||||
"settings": {
|
||||
"clients": [
|
||||
{
|
||||
"password": ""
|
||||
}
|
||||
],
|
||||
"fallbacks": [
|
||||
{
|
||||
"dest": 8080
|
||||
}
|
||||
]
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "tcp",
|
||||
"security": "none",
|
||||
"tcpSettings": {
|
||||
"acceptProxyProtocol": true
|
||||
}
|
||||
}
|
||||
}
|
@ -1,26 +0,0 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,19 +0,0 @@
|
||||
{
|
||||
"port": 1234,
|
||||
"listen": "127.0.0.1",
|
||||
"protocol": "vmess",
|
||||
"settings": {
|
||||
"decryption": "none",
|
||||
"clients": [
|
||||
{
|
||||
"id": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "h2",
|
||||
"httpSettings": {
|
||||
"path": ""
|
||||
}
|
||||
}
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
{
|
||||
"port": 3456,
|
||||
"protocol": "vless",
|
||||
"settings": {
|
||||
"clients": [
|
||||
{
|
||||
"id": ""
|
||||
}
|
||||
],
|
||||
"decryption": "none"
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "mkcp",
|
||||
"kcpSettings": {
|
||||
"uplinkCapacity": 100,
|
||||
"downlinkCapacity": 100,
|
||||
"congestion": true,
|
||||
"header": {
|
||||
"type": "none"
|
||||
},
|
||||
"seed": null
|
||||
}
|
||||
}
|
||||
}
|
@ -1,31 +0,0 @@
|
||||
{
|
||||
"port": 443,
|
||||
"protocol": "vless",
|
||||
"settings": {
|
||||
"clients": [
|
||||
{
|
||||
"id": "",
|
||||
"flow": "xtls-rprx-direct"
|
||||
}
|
||||
],
|
||||
"decryption": "none",
|
||||
"fallbacks": []
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "tcp",
|
||||
"security": "xtls",
|
||||
"xtlsSettings": {
|
||||
"allowInsecure": false,
|
||||
"minVersion": "1.2",
|
||||
"alpn": [
|
||||
"http/1.1"
|
||||
],
|
||||
"certificates": [
|
||||
{
|
||||
"certificateFile": "/usr/local/etc/xray/ssl/xray_ssl.crt",
|
||||
"keyFile": "/usr/local/etc/xray/ssl/xray_ssl.key"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
@ -1,21 +0,0 @@
|
||||
{
|
||||
"port": 1234,
|
||||
"listen": "127.0.0.1",
|
||||
"protocol": "vless",
|
||||
"settings": {
|
||||
"clients": [
|
||||
{
|
||||
"id": ""
|
||||
}
|
||||
],
|
||||
"decryption": "none"
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "ws",
|
||||
"security": "none",
|
||||
"wsSettings": {
|
||||
"acceptProxyProtocol": true,
|
||||
"path": "/websocket"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,25 +0,0 @@
|
||||
{
|
||||
"port": 2002,
|
||||
"listen": "127.0.0.1",
|
||||
"protocol": "vless",
|
||||
"settings": {
|
||||
"clients": [
|
||||
{
|
||||
"id": ""
|
||||
}
|
||||
],
|
||||
"decryption": "none"
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "grpc",
|
||||
"grpcSettings": {
|
||||
"serviceName": "",
|
||||
"certificates": [
|
||||
{
|
||||
"certificateFile": "/usr/local/etc/xray/ssl/xray_ssl.crt",
|
||||
"keyFile": "/usr/local/etc/xray/ssl/xray_ssl.key"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
{
|
||||
"port": 1234,
|
||||
"listen": "127.0.0.1",
|
||||
"protocol": "vmess",
|
||||
"settings": {
|
||||
"clients": [
|
||||
{
|
||||
"id": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "h2",
|
||||
"httpSettings": {
|
||||
"path": ""
|
||||
}
|
||||
}
|
||||
}
|
@ -1,23 +0,0 @@
|
||||
{
|
||||
"port": 3456,
|
||||
"protocol": "vmess",
|
||||
"settings": {
|
||||
"clients": [
|
||||
{
|
||||
"id": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "mkcp",
|
||||
"kcpSettings": {
|
||||
"uplinkCapacity": 100,
|
||||
"downlinkCapacity": 100,
|
||||
"congestion": true,
|
||||
"header": {
|
||||
"type": "none"
|
||||
},
|
||||
"seed": null
|
||||
}
|
||||
}
|
||||
}
|
@ -1,27 +0,0 @@
|
||||
{
|
||||
"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"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,20 +0,0 @@
|
||||
{
|
||||
"port": 3456,
|
||||
"listen": "127.0.0.1",
|
||||
"protocol": "vmess",
|
||||
"settings": {
|
||||
"clients": [
|
||||
{
|
||||
"id": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "ws",
|
||||
"security": "none",
|
||||
"wsSettings": {
|
||||
"acceptProxyProtocol": true,
|
||||
"path": "/vmessws"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
{
|
||||
"outbounds": [
|
||||
{
|
||||
"protocol": "freedom",
|
||||
"tag": "direct"
|
||||
},
|
||||
{
|
||||
"protocol": "blackhole",
|
||||
"tag": "block"
|
||||
}
|
||||
]
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
{
|
||||
"transport": {}
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
{
|
||||
"stats": {}
|
||||
}
|
@ -1,3 +0,0 @@
|
||||
{
|
||||
"reverse": {}
|
||||
}
|
@ -1,83 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Net;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
|
||||
namespace ProxySU_Core.Tools
|
||||
{
|
||||
public static class DateTimeUtils
|
||||
{
|
||||
/// <summary>
|
||||
/// 从国家授时中心获取标准GMT时间,读取https://www.tsa.cn
|
||||
/// GMT时间与UTC时间没有差别,可以UTC=GMT
|
||||
/// </summary>
|
||||
/// <returns>返回网络时间</returns>
|
||||
public static DateTime GetUTCTime()
|
||||
{
|
||||
DateTime time;
|
||||
try
|
||||
{
|
||||
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.tsa.cn");
|
||||
request.Method = "HEAD";
|
||||
request.AllowAutoRedirect = false;
|
||||
HttpWebResponse reponse = (HttpWebResponse)request.GetResponse();
|
||||
string cc = reponse.GetResponseHeader("date");
|
||||
reponse.Close();
|
||||
|
||||
bool s = GMTStrParse(cc, out time);
|
||||
return time;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return new DateTime(1970, 1, 1, 0, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
public static bool GMTStrParse(string gmtStr, out DateTime gmtTime) //抓取的date是GMT格式的字符串,这里转成datetime
|
||||
{
|
||||
CultureInfo enUS = new CultureInfo("en-US");
|
||||
bool s = DateTime.TryParseExact(gmtStr, "r", enUS, DateTimeStyles.None, out gmtTime);
|
||||
return s;
|
||||
}
|
||||
|
||||
//设置系统时间的API函数
|
||||
[DllImport("kernel32.dll")]
|
||||
private static extern bool SetLocalTime(ref SYSTEMTIME time);
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
private struct SYSTEMTIME
|
||||
{
|
||||
public short year;
|
||||
public short month;
|
||||
public short dayOfWeek;
|
||||
public short day;
|
||||
public short hour;
|
||||
public short minute;
|
||||
public short second;
|
||||
public short milliseconds;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置系统时间
|
||||
/// </summary>
|
||||
/// <param name="dt">需要设置的时间</param>
|
||||
/// <returns>返回系统时间设置状态,true为成功,false为失败</returns>
|
||||
public static bool SetDate(DateTime dt)
|
||||
{
|
||||
SYSTEMTIME st;
|
||||
|
||||
st.year = (short)dt.Year;
|
||||
st.month = (short)dt.Month;
|
||||
st.dayOfWeek = (short)dt.DayOfWeek;
|
||||
st.day = (short)dt.Day;
|
||||
st.hour = (short)dt.Hour;
|
||||
st.minute = (short)dt.Minute;
|
||||
st.second = (short)dt.Second;
|
||||
st.milliseconds = (short)dt.Millisecond;
|
||||
bool rt = SetLocalTime(ref st);
|
||||
return rt;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,62 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Runtime.Serialization.Formatters.Binary;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace System
|
||||
{
|
||||
public static class Extensions
|
||||
{
|
||||
// Deep clone
|
||||
public static T DeepClone<T>(this T obj)
|
||||
{
|
||||
if (obj == null)
|
||||
throw new ArgumentNullException("Object cannot be null");
|
||||
return (T)Process(obj);
|
||||
}
|
||||
|
||||
static object Process(object obj)
|
||||
{
|
||||
if (obj == null)
|
||||
return null;
|
||||
Type type = obj.GetType();
|
||||
if (type.IsValueType || type == typeof(string))
|
||||
{
|
||||
return obj;
|
||||
}
|
||||
else if (type.IsArray)
|
||||
{
|
||||
Type elementType = Type.GetType(
|
||||
type.FullName.Replace("[]", string.Empty));
|
||||
var array = obj as Array;
|
||||
Array copied = Array.CreateInstance(elementType, array.Length);
|
||||
for (int i = 0; i < array.Length; i++)
|
||||
{
|
||||
copied.SetValue(Process(array.GetValue(i)), i);
|
||||
}
|
||||
return Convert.ChangeType(copied, obj.GetType());
|
||||
}
|
||||
else if (type.IsClass)
|
||||
{
|
||||
object toret = Activator.CreateInstance(obj.GetType());
|
||||
FieldInfo[] fields = type.GetFields(BindingFlags.Public |
|
||||
BindingFlags.NonPublic | BindingFlags.Instance);
|
||||
foreach (FieldInfo field in fields)
|
||||
{
|
||||
object fieldValue = field.GetValue(obj);
|
||||
if (fieldValue == null)
|
||||
continue;
|
||||
field.SetValue(toret, Process(fieldValue));
|
||||
}
|
||||
return toret;
|
||||
}
|
||||
else
|
||||
throw new ArgumentException("Unknown type");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,41 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Windows.Input;
|
||||
|
||||
namespace ProxySU_Core.ViewModels
|
||||
{
|
||||
public class BaseCommand : ICommand
|
||||
{
|
||||
private readonly Action<object> _execution;
|
||||
private readonly Func<object, bool> _canExecute;
|
||||
|
||||
public BaseCommand(Action<object> execution, Func<object, bool> canExecute = null)
|
||||
{
|
||||
_execution = execution;
|
||||
_canExecute = canExecute;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public event EventHandler CanExecuteChanged;
|
||||
|
||||
public bool CanExecute(object parameter)
|
||||
{
|
||||
if (_canExecute == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return _canExecute(parameter);
|
||||
}
|
||||
|
||||
public void Execute(object parameter)
|
||||
{
|
||||
if (_execution != null && CanExecute(parameter))
|
||||
{
|
||||
_execution.Invoke(parameter);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,38 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySU_Core.ViewModels
|
||||
{
|
||||
public class BaseViewModel2 : INotifyPropertyChanged
|
||||
{
|
||||
|
||||
protected bool SetProperty<T>(ref T backingStore, T value,
|
||||
string propertyName = "",
|
||||
Action onChanged = null)
|
||||
{
|
||||
if (EqualityComparer<T>.Default.Equals(backingStore, value))
|
||||
return false;
|
||||
|
||||
backingStore = value;
|
||||
onChanged?.Invoke();
|
||||
OnPropertyChanged(propertyName);
|
||||
return true;
|
||||
}
|
||||
|
||||
#region INotifyPropertyChanged
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
protected void OnPropertyChanged(string propertyName = "")
|
||||
{
|
||||
var changed = PropertyChanged;
|
||||
if (changed == null)
|
||||
return;
|
||||
|
||||
changed.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
@ -1,20 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Text;
|
||||
|
||||
namespace ProxySU_Core.ViewModels
|
||||
{
|
||||
public abstract class BaseViewModel : INotifyPropertyChanged
|
||||
{
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
|
||||
public void Notify(string propertyName)
|
||||
{
|
||||
if (PropertyChanged != null)
|
||||
{
|
||||
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,144 +0,0 @@
|
||||
using Microsoft.Win32;
|
||||
using Newtonsoft.Json;
|
||||
using ProxySU_Core.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Windows;
|
||||
using System.Windows.Input;
|
||||
|
||||
namespace ProxySU_Core.ViewModels
|
||||
{
|
||||
public class HostViewModel : BaseViewModel
|
||||
{
|
||||
public Host host;
|
||||
|
||||
private readonly ICommand _selectKeyCommand;
|
||||
|
||||
|
||||
public HostViewModel(Host host)
|
||||
{
|
||||
_selectKeyCommand = new BaseCommand(obj => OpenFileDialog(obj));
|
||||
this.host = host;
|
||||
}
|
||||
|
||||
|
||||
public string Tag
|
||||
{
|
||||
get => host.Tag;
|
||||
set
|
||||
{
|
||||
host.Tag = value;
|
||||
Notify("Tag");
|
||||
}
|
||||
}
|
||||
|
||||
public string Address
|
||||
{
|
||||
get => host.Address;
|
||||
set
|
||||
{
|
||||
host.Address = value;
|
||||
Notify("Address");
|
||||
}
|
||||
}
|
||||
|
||||
public string UserName
|
||||
{
|
||||
get => host.UserName;
|
||||
set => host.UserName = value;
|
||||
}
|
||||
|
||||
public string Password
|
||||
{
|
||||
get => host.Password;
|
||||
set => host.Password = value;
|
||||
}
|
||||
|
||||
public int Port
|
||||
{
|
||||
get => host.Port;
|
||||
set => host.Port = value;
|
||||
}
|
||||
|
||||
public string PrivateKeyPath
|
||||
{
|
||||
get => host.PrivateKeyPath;
|
||||
set => host.PrivateKeyPath = value;
|
||||
}
|
||||
|
||||
public LocalProxy Proxy
|
||||
{
|
||||
get => host.Proxy;
|
||||
set
|
||||
{
|
||||
host.Proxy = value;
|
||||
Notify("Proxy");
|
||||
}
|
||||
}
|
||||
|
||||
public LoginSecretType SecretType
|
||||
{
|
||||
get => host.SecretType;
|
||||
set
|
||||
{
|
||||
host.SecretType = value;
|
||||
Notify("SecretType");
|
||||
Notify("KeyUploaderVisiblity");
|
||||
Notify("PasswordVisiblity");
|
||||
}
|
||||
}
|
||||
|
||||
[JsonIgnore]
|
||||
public Visibility PasswordVisiblity
|
||||
{
|
||||
get
|
||||
{
|
||||
if (SecretType == LoginSecretType.Password)
|
||||
{
|
||||
return Visibility.Visible;
|
||||
}
|
||||
return Visibility.Collapsed;
|
||||
}
|
||||
}
|
||||
|
||||
[JsonIgnore]
|
||||
public Visibility KeyUploaderVisiblity
|
||||
{
|
||||
get
|
||||
{
|
||||
if (SecretType == LoginSecretType.PrivateKey)
|
||||
{
|
||||
return Visibility.Visible;
|
||||
}
|
||||
return Visibility.Collapsed;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[JsonIgnore]
|
||||
public ICommand SelectKeyCommand
|
||||
{
|
||||
get
|
||||
{
|
||||
return _selectKeyCommand;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void OpenFileDialog(object obj)
|
||||
{
|
||||
var fileDialog = new OpenFileDialog();
|
||||
fileDialog.FileOk += OnFileOk;
|
||||
fileDialog.ShowDialog();
|
||||
}
|
||||
|
||||
private void OnFileOk(object sender, CancelEventArgs e)
|
||||
{
|
||||
var file = sender as OpenFileDialog;
|
||||
PrivateKeyPath = file.FileName;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -1,21 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySU_Core.ViewModels
|
||||
{
|
||||
public class IdValueViewModel
|
||||
{
|
||||
public IdValueViewModel(int id, string value)
|
||||
{
|
||||
Id = id;
|
||||
Value = value;
|
||||
}
|
||||
|
||||
public int Id { get; set; }
|
||||
|
||||
public string Value { get; set; }
|
||||
}
|
||||
}
|
@ -1,58 +0,0 @@
|
||||
using ProxySU_Core.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySU_Core.ViewModels
|
||||
{
|
||||
public class RecordViewModel : BaseViewModel
|
||||
{
|
||||
public Record record;
|
||||
private bool _isChecked;
|
||||
|
||||
public RecordViewModel(Record record)
|
||||
{
|
||||
this.record = record;
|
||||
this._isChecked = false;
|
||||
}
|
||||
|
||||
public bool IsChecked
|
||||
{
|
||||
get => _isChecked;
|
||||
set
|
||||
{
|
||||
_isChecked = value;
|
||||
Notify("IsChecked");
|
||||
}
|
||||
}
|
||||
|
||||
public Host Host
|
||||
{
|
||||
get => record.Host;
|
||||
set
|
||||
{
|
||||
record.Host = value;
|
||||
Notify("Host");
|
||||
}
|
||||
}
|
||||
|
||||
public XraySettings Settings
|
||||
{
|
||||
get => record.Settings;
|
||||
set
|
||||
{
|
||||
record.Settings = value;
|
||||
Notify("Settings");
|
||||
}
|
||||
}
|
||||
|
||||
public void Notify()
|
||||
{
|
||||
Notify("Host");
|
||||
Notify("Settings");
|
||||
}
|
||||
}
|
||||
}
|
@ -1,38 +0,0 @@
|
||||
using ProxySU_Core.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Text;
|
||||
|
||||
namespace ProxySU_Core.ViewModels
|
||||
{
|
||||
public class Terminal : BaseViewModel
|
||||
{
|
||||
private bool hasConnected;
|
||||
|
||||
public Terminal(Host host)
|
||||
{
|
||||
Host = host;
|
||||
HasConnected = false;
|
||||
}
|
||||
|
||||
public bool HasConnected
|
||||
{
|
||||
get
|
||||
{
|
||||
return hasConnected;
|
||||
}
|
||||
set
|
||||
{
|
||||
hasConnected = value;
|
||||
Notify("HasConnected");
|
||||
}
|
||||
}
|
||||
|
||||
public Host Host { get; set; }
|
||||
|
||||
public string CommandText { get; set; }
|
||||
|
||||
public string OutputText { get; set; }
|
||||
}
|
||||
}
|
@ -1,399 +0,0 @@
|
||||
using Newtonsoft.Json;
|
||||
using ProxySU_Core.Common;
|
||||
using ProxySU_Core.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Web;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Input;
|
||||
|
||||
namespace ProxySU_Core.ViewModels
|
||||
{
|
||||
public partial class XraySettingsViewModel : BaseViewModel
|
||||
{
|
||||
public XraySettings settings;
|
||||
private readonly ICommand _randomUuid;
|
||||
|
||||
public XraySettingsViewModel(XraySettings parameters)
|
||||
{
|
||||
_randomUuid = new BaseCommand((obj) => GetUuid());
|
||||
this.settings = parameters;
|
||||
Notify("VMESS_KCP_Type");
|
||||
}
|
||||
|
||||
public ICommand RandomUuid
|
||||
{
|
||||
get
|
||||
{
|
||||
return _randomUuid;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public int Port
|
||||
{
|
||||
get => settings.Port;
|
||||
set
|
||||
{
|
||||
settings.Port = value;
|
||||
Notify("Port");
|
||||
}
|
||||
}
|
||||
|
||||
public int VLESS_KCP_Port
|
||||
{
|
||||
get => settings.VLESS_KCP_Port;
|
||||
set
|
||||
{
|
||||
settings.VLESS_KCP_Port = value;
|
||||
Notify("VLESS_KCP_Port");
|
||||
}
|
||||
}
|
||||
|
||||
public int VMESS_KCP_Port
|
||||
{
|
||||
get => settings.VMESS_KCP_Port;
|
||||
set
|
||||
{
|
||||
settings.VMESS_KCP_Port = value;
|
||||
Notify("VMESS_KCP_Port");
|
||||
}
|
||||
}
|
||||
|
||||
public int ShadowSocksPort
|
||||
{
|
||||
get => settings.ShadowSocksPort;
|
||||
set
|
||||
{
|
||||
settings.VMESS_KCP_Port = value;
|
||||
Notify("ShadowSocksPort");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public string UUID
|
||||
{
|
||||
get => settings.UUID;
|
||||
set
|
||||
{
|
||||
settings.UUID = value;
|
||||
Notify("UUID");
|
||||
}
|
||||
}
|
||||
|
||||
public string Domain
|
||||
{
|
||||
get => settings.Domain;
|
||||
set
|
||||
{
|
||||
settings.Domain = value;
|
||||
Notify("Domain");
|
||||
}
|
||||
}
|
||||
|
||||
public string MaskDomain
|
||||
{
|
||||
get => settings.MaskDomain;
|
||||
set
|
||||
{
|
||||
settings.MaskDomain = value;
|
||||
Notify("MaskDomain");
|
||||
}
|
||||
}
|
||||
|
||||
public string TrojanPassword
|
||||
{
|
||||
get => settings.TrojanPassword;
|
||||
set => settings.TrojanPassword = value;
|
||||
}
|
||||
public bool Checked_Trojan_TCP
|
||||
{
|
||||
get
|
||||
{
|
||||
return settings.Types.Contains(XrayType.Trojan_TCP);
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value == true)
|
||||
{
|
||||
if (!settings.Types.Contains(XrayType.Trojan_TCP))
|
||||
settings.Types.Add(XrayType.Trojan_TCP);
|
||||
}
|
||||
else
|
||||
{
|
||||
settings.Types.Remove(XrayType.Trojan_TCP);
|
||||
}
|
||||
Notify("Checked_Trojan_TCP");
|
||||
}
|
||||
}
|
||||
public string Trojan_TCP_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(XrayType.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(XrayType.ShadowsocksAEAD);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, XrayType.ShadowsocksAEAD);
|
||||
Notify("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;
|
||||
Notify("ShadowSocksMethod");
|
||||
}
|
||||
}
|
||||
public string ShadowSocksShareLink
|
||||
{
|
||||
get => ShareLink.Build(XrayType.ShadowsocksAEAD, settings);
|
||||
}
|
||||
|
||||
|
||||
private void CheckBoxChanged(bool value, XrayType 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();
|
||||
Notify("UUID");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// VMESS
|
||||
/// </summary>
|
||||
public partial class XraySettingsViewModel
|
||||
{
|
||||
// vmess tcp
|
||||
public bool Checked_VMESS_TCP
|
||||
{
|
||||
get => settings.Types.Contains(XrayType.VMESS_TCP);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, XrayType.VMESS_TCP);
|
||||
Notify("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(XrayType.VMESS_TCP, settings);
|
||||
}
|
||||
|
||||
// vmess ws
|
||||
public bool Checked_VMESS_WS
|
||||
{
|
||||
get => settings.Types.Contains(XrayType.VMESS_WS);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, XrayType.VMESS_WS);
|
||||
Notify("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(XrayType.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;
|
||||
Notify("VMESS_KCP_Type");
|
||||
}
|
||||
}
|
||||
public bool Checked_VMESS_KCP
|
||||
{
|
||||
get => settings.Types.Contains(XrayType.VMESS_KCP);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, XrayType.VMESS_KCP);
|
||||
Notify("Checked_VMESS_KCP");
|
||||
}
|
||||
}
|
||||
public string VMESS_KCP_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(XrayType.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 XraySettingsViewModel
|
||||
{
|
||||
|
||||
// vless xtls
|
||||
public bool Checked_VLESS_TCP_XTLS
|
||||
{
|
||||
get => settings.Types.Contains(XrayType.VLESS_TCP_XTLS);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, XrayType.VLESS_TCP_XTLS);
|
||||
Notify("Checked_VLESS_TCP_XTLS");
|
||||
}
|
||||
}
|
||||
public string VLESS_TCP_XTLS_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(XrayType.VLESS_TCP_XTLS, settings);
|
||||
}
|
||||
|
||||
// vless tcp
|
||||
public bool Checked_VLESS_TCP
|
||||
{
|
||||
get => settings.Types.Contains(XrayType.VLESS_TCP);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, XrayType.VLESS_TCP);
|
||||
Notify("Checked_VLESS_TCP");
|
||||
}
|
||||
}
|
||||
public string VLESS_TCP_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(XrayType.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(XrayType.VLESS_WS);
|
||||
}
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, XrayType.VLESS_WS);
|
||||
Notify("Checked_VLESS_WS");
|
||||
}
|
||||
}
|
||||
public string VLESS_WS_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(XrayType.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;
|
||||
Notify("VLESS_KCP_Type");
|
||||
}
|
||||
}
|
||||
public bool Checked_VLESS_KCP
|
||||
{
|
||||
get => settings.Types.Contains(XrayType.VLESS_KCP);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, XrayType.VLESS_KCP);
|
||||
Notify("Checked_VLESS_KCP");
|
||||
}
|
||||
}
|
||||
public string VLESS_KCP_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(XrayType.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(XrayType.VLESS_gRPC);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, XrayType.VLESS_gRPC);
|
||||
Notify("Checked_VLESS_gRPC");
|
||||
}
|
||||
}
|
||||
public string VLESS_gRPC_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(XrayType.VLESS_gRPC, settings);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,114 +0,0 @@
|
||||
<metro:MetroWindow x:Class="ProxySuper.WPF.Controls.ClientInfoWindow"
|
||||
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:metro="http://metro.mahapps.com/winfx/xaml/controls"
|
||||
xmlns:local="clr-namespace:ProxySuper.WPF.Controls"
|
||||
xmlns:dev="clr-namespace:ProxySU_Core.Models.Developers"
|
||||
xmlns:models="clr-namespace:ProxySU_Core.Models"
|
||||
mc:Ignorable="d"
|
||||
Title="{DynamicResource ClientInfoTitle}" Height="500" Width="800">
|
||||
|
||||
|
||||
<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:XrayType.VLESS_TCP_XTLS}"
|
||||
IsEnabled="{Binding Settings.Checked_VLESS_TCP_XTLS}"
|
||||
Style="{StaticResource MaterialDesignNavigationRailTabItem}"
|
||||
Header="VLESS-TCP-XTLS">
|
||||
<local:VLESS_XTLS_Control />
|
||||
</TabItem>
|
||||
|
||||
<TabItem Width="200" Height="40"
|
||||
Tag="{x:Static models:XrayType.VLESS_TCP}"
|
||||
IsEnabled="{Binding Settings.Checked_VLESS_TCP}"
|
||||
metro:HeaderedControlHelper.HeaderMargin="0"
|
||||
Style="{StaticResource MaterialDesignNavigationRailTabItem}"
|
||||
Header="VLESS-TCP-TLS">
|
||||
<local:VLESS_TCP_TLS_Control />
|
||||
</TabItem>
|
||||
|
||||
<TabItem Width="200" Height="40"
|
||||
Tag="{x:Static models:XrayType.VLESS_WS}"
|
||||
IsEnabled="{Binding Settings.Checked_VLESS_WS}"
|
||||
Style="{StaticResource MaterialDesignNavigationRailTabItem}"
|
||||
Header="VLESS-WebSocket-TLS">
|
||||
<local:VLESS_WS_TLS_Control />
|
||||
</TabItem>
|
||||
|
||||
<TabItem Width="200" Height="40"
|
||||
Tag="{x:Static models:XrayType.VLESS_KCP}"
|
||||
IsEnabled="{Binding Settings.Checked_VLESS_KCP}"
|
||||
Style="{StaticResource MaterialDesignNavigationRailTabItem}"
|
||||
Header="VLESS-mKCP">
|
||||
<local:VLESS_KCP_Control />
|
||||
</TabItem>
|
||||
|
||||
<!--<TabItem Width="200"
|
||||
Tag="{x:Static models:XrayType.VLESS_gRPC}"
|
||||
IsEnabled="{Binding Settings.Checked_VLESS_gRPC}"
|
||||
Style="{StaticResource MaterialDesignNavigationRailTabItem}"
|
||||
Header="VLESS-gRPC">
|
||||
<local:VLESS_gRPC_Control />
|
||||
</TabItem>-->
|
||||
|
||||
<!--<TabItem Width="200" Height="40"
|
||||
Tag="{x:Static models:XrayType.VMESS_TCP}"
|
||||
IsEnabled="{Binding Settings.Checked_VMESS_TCP}"
|
||||
Style="{StaticResource MaterialDesignNavigationRailTabItem}"
|
||||
Header="VMESS-TCP-TLS">
|
||||
<local:VMESS_TCP_TLS_Control />
|
||||
</TabItem>-->
|
||||
|
||||
<TabItem Width="200" Height="40"
|
||||
Tag="{x:Static models:XrayType.VMESS_WS}"
|
||||
IsEnabled="{Binding Settings.Checked_VMESS_WS}"
|
||||
Style="{StaticResource MaterialDesignNavigationRailTabItem}"
|
||||
Header="VMESS-WebSocket-TLS">
|
||||
<local:VMESS_WS_TLS_Control />
|
||||
</TabItem>
|
||||
|
||||
<TabItem Width="200" Height="40"
|
||||
Tag="{x:Static models:XrayType.VMESS_KCP}"
|
||||
IsEnabled="{Binding Settings.Checked_VMESS_KCP}"
|
||||
Style="{StaticResource MaterialDesignNavigationRailTabItem}"
|
||||
Header="VMESS-mKCP">
|
||||
<local:VMESS_KCP_Control />
|
||||
</TabItem>
|
||||
|
||||
<TabItem Width="200" Height="40"
|
||||
Tag="{x:Static models:XrayType.Trojan_TCP}"
|
||||
IsEnabled="{Binding Settings.Checked_Trojan_TCP}"
|
||||
Style="{StaticResource MaterialDesignNavigationRailTabItem}"
|
||||
Header="Trojan-TCP">
|
||||
<local:Trojan_TCP_Control />
|
||||
</TabItem>
|
||||
|
||||
<TabItem Width="200" Height="40"
|
||||
Tag="{x:Static models:XrayType.ShadowsocksAEAD}"
|
||||
IsEnabled="{Binding Settings.CheckedShadowSocks}"
|
||||
Style="{StaticResource MaterialDesignNavigationRailTabItem}"
|
||||
Header="ShadowSocks">
|
||||
<local: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>
|
||||
</metro:MetroWindow>
|
@ -1,127 +0,0 @@
|
||||
using Microsoft.Win32;
|
||||
using ProxySU_Core.Models;
|
||||
using ProxySU_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.Controls
|
||||
{
|
||||
/// <summary>
|
||||
/// ClientInfoWindow.xaml 的交互逻辑
|
||||
/// </summary>
|
||||
public partial class ClientInfoWindow
|
||||
{
|
||||
public XraySettingsViewModel Settings { get; set; }
|
||||
|
||||
public ClientInfoWindow(Record record)
|
||||
{
|
||||
InitializeComponent();
|
||||
ResizeMode = ResizeMode.NoResize;
|
||||
WindowStartupLocation = WindowStartupLocation.CenterScreen;
|
||||
|
||||
Settings = new XraySettingsViewModel(record.Settings);
|
||||
DataContext = this;
|
||||
}
|
||||
|
||||
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 = (XrayType)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(XrayType type)
|
||||
{
|
||||
string shareLink = string.Empty;
|
||||
switch (type)
|
||||
{
|
||||
case XrayType.VLESS_TCP_XTLS:
|
||||
shareLink = Settings.VLESS_TCP_XTLS_ShareLink;
|
||||
break;
|
||||
case XrayType.VLESS_TCP:
|
||||
shareLink = Settings.VLESS_TCP_ShareLink;
|
||||
break;
|
||||
case XrayType.VLESS_WS:
|
||||
shareLink = Settings.VLESS_WS_ShareLink;
|
||||
break;
|
||||
case XrayType.VLESS_H2:
|
||||
break;
|
||||
case XrayType.VLESS_KCP:
|
||||
shareLink = Settings.VLESS_KCP_ShareLink;
|
||||
break;
|
||||
case XrayType.VLESS_gRPC:
|
||||
shareLink = Settings.VLESS_gRPC_ShareLink;
|
||||
break;
|
||||
case XrayType.VMESS_TCP:
|
||||
shareLink = Settings.VMESS_TCP_ShareLink;
|
||||
break;
|
||||
case XrayType.VMESS_WS:
|
||||
shareLink = Settings.VMESS_WS_ShareLink;
|
||||
break;
|
||||
case XrayType.VMESS_H2:
|
||||
break;
|
||||
case XrayType.VMESS_KCP:
|
||||
shareLink = Settings.VMESS_KCP_ShareLink;
|
||||
break;
|
||||
case XrayType.Trojan_TCP:
|
||||
shareLink = Settings.Trojan_TCP_ShareLink;
|
||||
break;
|
||||
case XrayType.Trojan_WS:
|
||||
break;
|
||||
case XrayType.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();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
<UserControl x:Class="ProxySuper.WPF.Controls.ShadowSocksControl"
|
||||
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"
|
||||
mc:Ignorable="d">
|
||||
<StackPanel Orientation="Vertical">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Label Content="地址(Address)" Width="120" />
|
||||
<TextBox Text="{Binding Settings.Domain}" IsReadOnly="True" Width="200" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="端口(Port)" Width="120" />
|
||||
<TextBox Text="{Binding Path=Settings.ShadowSocksPort,Mode=OneTime}" IsReadOnly="True" Width="200" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="密码(Password)" Width="120" />
|
||||
<TextBox Text="{Binding Settings.ShadowSocksPassword}" IsReadOnly="True" Width="300" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="加密方式(Method)" Width="120" />
|
||||
<TextBox Text="{Binding Settings.ShadowSocksMethod}" IsReadOnly="True" Width="300" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="分享链接(ShareLink)" Width="120" />
|
||||
<TextBox Text="{Binding Settings.ShadowSocksShareLink,Mode=OneTime}" Width="300" IsReadOnly="True" />
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</UserControl>
|
@ -1,28 +0,0 @@
|
||||
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>
|
||||
/// ShadowSocksClientInfoControl.xaml 的交互逻辑
|
||||
/// </summary>
|
||||
public partial class ShadowSocksControl : UserControl
|
||||
{
|
||||
public ShadowSocksControl()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
<UserControl x:Class="ProxySuper.WPF.Controls.Trojan_TCP_Control"
|
||||
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"
|
||||
mc:Ignorable="d">
|
||||
<StackPanel Orientation="Vertical">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Label Content="服务器地址(Address)" Width="120" />
|
||||
<TextBox Text="{Binding Settings.Domain}" IsReadOnly="True" Width="200" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="服务器端口(Port)" Width="120" />
|
||||
<TextBox Text="443" IsReadOnly="True" Width="200" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="密码(Pwd)" Width="120" />
|
||||
<TextBox Text="{Binding Settings.TrojanPassword}" IsReadOnly="True" Width="300" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="分享链接(ShareLink)" Width="120" />
|
||||
<TextBox Text="{Binding Settings.Trojan_TCP_ShareLink,Mode=OneTime}" Width="300" IsReadOnly="True" />
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</UserControl>
|
@ -1,28 +0,0 @@
|
||||
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>
|
||||
/// Trojan_TCP_Control.xaml 的交互逻辑
|
||||
/// </summary>
|
||||
public partial class Trojan_TCP_Control : UserControl
|
||||
{
|
||||
public Trojan_TCP_Control()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,59 +0,0 @@
|
||||
<UserControl x:Class="ProxySuper.WPF.Controls.VLESS_KCP_Control"
|
||||
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"
|
||||
mc:Ignorable="d">
|
||||
<StackPanel Orientation="Vertical">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Label Content="地址(address)" Width="120" />
|
||||
<TextBox Text="{Binding Settings.Domain}" IsReadOnly="True" Width="200" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="端口(port)" Width="120" />
|
||||
<TextBox Text="{Binding Path=Settings.VLESS_KCP_Port,Mode=OneTime}" IsReadOnly="True" Width="200" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="用户ID(id)" Width="120" />
|
||||
<TextBox Text="{Binding Settings.UUID}" IsReadOnly="True" Width="300" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="加密(security)" Width="120" />
|
||||
<TextBox Text="none" IsReadOnly="True" Width="200" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="传输协议(network)" Width="120" />
|
||||
<TextBox Text="kcp" IsReadOnly="True" Width="200" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="伪装类型(type)" Width="120" />
|
||||
<TextBox Text="{Binding Settings.VLESS_KCP_Type}" IsReadOnly="True" Width="200" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="伪装域名(host)" Width="120" />
|
||||
<TextBox Text="{Binding Settings.Domain}" IsReadOnly="True" Width="200" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="路径(path)" Width="120" />
|
||||
<TextBox Text="{Binding Settings.VLESS_KCP_Seed}" IsReadOnly="True" Width="200" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="传输安全(tls)" Width="120" />
|
||||
<TextBox Text="" IsReadOnly="True" Width="200" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="分享链接(ShareLink)" Width="120" />
|
||||
<TextBox Text="{Binding Settings.VLESS_KCP_ShareLink,Mode=OneTime}" Width="300" IsReadOnly="True" />
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</UserControl>
|
@ -1,28 +0,0 @@
|
||||
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>
|
||||
/// VLESS_KCP_Control.xaml 的交互逻辑
|
||||
/// </summary>
|
||||
public partial class VLESS_KCP_Control : UserControl
|
||||
{
|
||||
public VLESS_KCP_Control()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,64 +0,0 @@
|
||||
<UserControl x:Class="ProxySuper.WPF.Controls.VLESS_TCP_TLS_Control"
|
||||
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"
|
||||
mc:Ignorable="d">
|
||||
<StackPanel Orientation="Vertical">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Label Content="地址(address)" Width="120" />
|
||||
<TextBox Text="{Binding Settings.Domain}" IsReadOnly="True" Width="200" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="端口(port)" Width="120" />
|
||||
<TextBox Text="443" IsReadOnly="True" Width="200" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="用户ID(id)" Width="120" />
|
||||
<TextBox Text="{Binding Settings.UUID}" IsReadOnly="True" Width="300" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="流控(flow)" Width="120" />
|
||||
<TextBox Text="" IsReadOnly="True" Width="200" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="加密(encryption)" Width="120" />
|
||||
<TextBox Text="none" IsReadOnly="True" Width="200" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="传输协议(network)" Width="120" />
|
||||
<TextBox Text="tcp" IsReadOnly="True" Width="200" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="伪装类型(type)" Width="120" />
|
||||
<TextBox Text="none" IsReadOnly="True" Width="200" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="伪装域名(host)" Width="120" />
|
||||
<TextBox Text="{Binding Settings.Domain}" IsReadOnly="True" Width="200" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="路径(path)" Width="120" />
|
||||
<TextBox Text="" IsReadOnly="True" Width="200" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="传输安全(tls)" Width="120" />
|
||||
<TextBox Text="tls" IsReadOnly="True" Width="200" />
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||
<Label Content="分享链接(ShareLink)" Width="120" />
|
||||
<TextBox Text="{Binding Settings.VLESS_TCP_ShareLink,Mode=OneTime}" Width="300" IsReadOnly="True" />
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</UserControl>
|
@ -1,28 +0,0 @@
|
||||
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>
|
||||
/// VLESS_TCP_TLS_Control.xaml 的交互逻辑
|
||||
/// </summary>
|
||||
public partial class VLESS_TCP_TLS_Control : UserControl
|
||||
{
|
||||
public VLESS_TCP_TLS_Control()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user