diff --git a/.gitignore b/.gitignore
index 2397d07..6ec5eb5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -198,3 +198,4 @@ FakesAssemblies/
# vs code
.vscode/*
+/ProxySU_Core/Data/Record.json
diff --git a/ProxySU.Core/App.xaml b/ProxySU.Core/App.xaml
deleted file mode 100644
index 6f169ad..0000000
--- a/ProxySU.Core/App.xaml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
diff --git a/ProxySU.Core/MainWindow.xaml b/ProxySU.Core/MainWindow.xaml
deleted file mode 100644
index 01c479c..0000000
--- a/ProxySU.Core/MainWindow.xaml
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/ProxySU.Core/MainWindow.xaml.cs b/ProxySU.Core/MainWindow.xaml.cs
deleted file mode 100644
index 920ed49..0000000
--- a/ProxySU.Core/MainWindow.xaml.cs
+++ /dev/null
@@ -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 ProxySU.Core
-{
- ///
- /// Interaction logic for MainWindow.xaml
- ///
- public partial class MainWindow : Window
- {
- public MainWindow()
- {
- InitializeComponent();
- }
- }
-}
diff --git a/ProxySU.Core/ProxySU.Core.csproj b/ProxySU.Core/ProxySU.Core.csproj
deleted file mode 100644
index 1480162..0000000
--- a/ProxySU.Core/ProxySU.Core.csproj
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
- WinExe
- netcoreapp3.1
- true
-
-
-
-
-
-
-
diff --git a/ProxySU.sln b/ProxySU.sln
index 89f5ff9..6b8b4af 100644
--- a/ProxySU.sln
+++ b/ProxySU.sln
@@ -1,10 +1,12 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.28307.1022
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.31005.135
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
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -15,6 +17,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
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/ProxySU_Core/App.config b/ProxySU_Core/App.config
new file mode 100644
index 0000000..731f6de
--- /dev/null
+++ b/ProxySU_Core/App.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ProxySU_Core/App.xaml b/ProxySU_Core/App.xaml
new file mode 100644
index 0000000..d59fcda
--- /dev/null
+++ b/ProxySU_Core/App.xaml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ProxySU.Core/App.xaml.cs b/ProxySU_Core/App.xaml.cs
similarity index 92%
rename from ProxySU.Core/App.xaml.cs
rename to ProxySU_Core/App.xaml.cs
index ba24f85..2ccb782 100644
--- a/ProxySU.Core/App.xaml.cs
+++ b/ProxySU_Core/App.xaml.cs
@@ -6,7 +6,7 @@ using System.Linq;
using System.Threading.Tasks;
using System.Windows;
-namespace ProxySU.Core
+namespace ProxySU_Core
{
///
/// Interaction logic for App.xaml
diff --git a/ProxySU.Core/AssemblyInfo.cs b/ProxySU_Core/AssemblyInfo.cs
similarity index 100%
rename from ProxySU.Core/AssemblyInfo.cs
rename to ProxySU_Core/AssemblyInfo.cs
diff --git a/ProxySU_Core/Converters/LoginSecretTypeConverter.cs b/ProxySU_Core/Converters/LoginSecretTypeConverter.cs
new file mode 100644
index 0000000..be26ed8
--- /dev/null
+++ b/ProxySU_Core/Converters/LoginSecretTypeConverter.cs
@@ -0,0 +1,32 @@
+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;
+
+ }
+ }
+}
diff --git a/ProxySU_Core/Converters/ProxyTypeConverter.cs b/ProxySU_Core/Converters/ProxyTypeConverter.cs
new file mode 100644
index 0000000..771cb62
--- /dev/null
+++ b/ProxySU_Core/Converters/ProxyTypeConverter.cs
@@ -0,0 +1,31 @@
+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;
+ }
+ }
+}
diff --git a/ProxySU_Core/Properties/AssemblyInfo.cs b/ProxySU_Core/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..82eaa44
--- /dev/null
+++ b/ProxySU_Core/Properties/AssemblyInfo.cs
@@ -0,0 +1,55 @@
+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 文件中的 CultureYouAreCodingWith
+//例如,如果您在源文件中使用的是美国英语,
+//使用的是美国英语,请将 设置为 en-US。 然后取消
+//对以下 NeutralResourceLanguage 特性的注释。 更新
+//以下行中的“en-US”以匹配项目文件中的 UICulture 设置。
+
+//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
+
+
+[assembly: ThemeInfo(
+ ResourceDictionaryLocation.None, //主题特定资源词典所处位置
+ //(未在页面中找到资源时使用,
+ //或应用程序资源字典中找到时使用)
+ ResourceDictionaryLocation.SourceAssembly //常规资源词典所处位置
+ //(未在页面中找到资源时使用,
+ //、应用程序或任何主题专用资源字典中找到时使用)
+)]
+
+
+// 程序集的版本信息由下列四个值组成:
+//
+// 主版本
+// 次版本
+// 生成号
+// 修订号
+//
+//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
+//通过使用 "*",如下所示:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/ProxySU_Core/Properties/Resources.Designer.cs b/ProxySU_Core/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..5d55848
--- /dev/null
+++ b/ProxySU_Core/Properties/Resources.Designer.cs
@@ -0,0 +1,70 @@
+//------------------------------------------------------------------------------
+//
+// 此代码由工具生成。
+// 运行时版本: 4.0.30319.42000
+//
+// 对此文件的更改可能导致不正确的行为,如果
+// 重新生成代码,则所做更改将丢失。
+//
+//------------------------------------------------------------------------------
+
+
+namespace ProxySU_Core.Properties
+{
+ ///
+ /// 强类型资源类,用于查找本地化字符串等。
+ ///
+ // 此类是由 StronglyTypedResourceBuilder
+ // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
+ // 若要添加或删除成员,请编辑 .ResX 文件,然后重新运行 ResGen
+ // (以 /str 作为命令选项),或重新生成 VS 项目。
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.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()
+ {
+ }
+
+ ///
+ /// 返回此类使用的缓存 ResourceManager 实例。
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager
+ {
+ get
+ {
+ if ((resourceMan == null))
+ {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ProxySU_Core.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// 重写当前线程的 CurrentUICulture 属性,对
+ /// 使用此强类型资源类的所有资源查找执行重写。
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture
+ {
+ get
+ {
+ return resourceCulture;
+ }
+ set
+ {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/ProxySU_Core/Properties/Resources.resx b/ProxySU_Core/Properties/Resources.resx
new file mode 100644
index 0000000..af7dbeb
--- /dev/null
+++ b/ProxySU_Core/Properties/Resources.resx
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/ProxySU_Core/Properties/Settings.Designer.cs b/ProxySU_Core/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..e09e8d5
--- /dev/null
+++ b/ProxySU_Core/Properties/Settings.Designer.cs
@@ -0,0 +1,29 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+
+namespace ProxySU_Core.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
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/ProxySU_Core/Properties/Settings.settings b/ProxySU_Core/Properties/Settings.settings
new file mode 100644
index 0000000..033d7a5
--- /dev/null
+++ b/ProxySU_Core/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ProxySU_Core/ProxySU_Core.csproj b/ProxySU_Core/ProxySU_Core.csproj
new file mode 100644
index 0000000..d88a0b8
--- /dev/null
+++ b/ProxySU_Core/ProxySU_Core.csproj
@@ -0,0 +1,304 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {B066015C-D347-4493-92F1-6556D3863996}
+ WinExe
+ ProxySU_Core
+ ProxySU_Core
+ v4.6.1
+ 512
+ {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ 4
+ true
+ true
+
+
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ ..\packages\ControlzEx.4.3.0\lib\net45\ControlzEx.dll
+
+
+ ..\packages\MahApps.Metro.2.0.0\lib\net46\MahApps.Metro.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.BootstrapIcons.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.BoxIcons.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.Codicons.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.Core.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.Entypo.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.EvaIcons.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.FeatherIcons.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.FileIcons.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.Fontaudio.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.FontAwesome.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.ForkAwesome.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.Ionicons.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.JamIcons.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.Material.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.MaterialDesign.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.MaterialLight.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.Microns.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.Modern.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.Octicons.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.PicolIcons.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.PixelartIcons.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.RadixIcons.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.RemixIcon.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.RPGAwesome.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.SimpleIcons.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.Typicons.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.Unicons.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.VaadinIcons.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.WeatherIcons.dll
+
+
+ ..\packages\MahApps.Metro.IconPacks.4.8.0\lib\net46\MahApps.Metro.IconPacks.Zondicons.dll
+
+
+ ..\packages\MaterialDesignColors.2.0.0\lib\net452\MaterialDesignColors.dll
+
+
+ ..\packages\MaterialDesignThemes.MahApps.0.1.6\lib\net452\MaterialDesignThemes.MahApps.dll
+
+
+ ..\packages\MaterialDesignThemes.4.0.0\lib\net452\MaterialDesignThemes.Wpf.dll
+
+
+ ..\packages\Microsoft.Xaml.Behaviors.Wpf.1.1.19\lib\net45\Microsoft.Xaml.Behaviors.dll
+
+
+ ..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll
+
+
+ ..\packages\SSH.NET.2020.0.1\lib\net40\Renci.SshNet.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.0
+
+
+
+
+
+
+
+ MSBuild:Compile
+ Designer
+
+
+ App.xaml
+ Code
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HostEditorWindow.xaml
+
+
+ MainWindow.xaml
+
+
+ TerminalWindow.xaml
+
+
+
+
+
+
+ Code
+
+
+ True
+ True
+ Resources.resx
+
+
+ True
+ Settings.settings
+ True
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+ PreserveNewest
+
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MSBuild:Compile
+ Designer
+
+
+ MSBuild:Compile
+ Designer
+
+
+ MSBuild:Compile
+ Designer
+
+
+ MSBuild:Compile
+ Designer
+
+
+ MSBuild:Compile
+ Designer
+
+
+ MSBuild:Compile
+ Designer
+
+
+
+
+
+
+ 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。
+
+
+
+
+
\ No newline at end of file
diff --git a/ProxySU_Core/Resources/Languages/en.xaml b/ProxySU_Core/Resources/Languages/en.xaml
new file mode 100644
index 0000000..47fb3c3
--- /dev/null
+++ b/ProxySU_Core/Resources/Languages/en.xaml
@@ -0,0 +1,48 @@
+
+ Deployment
+ Language
+ Chinese
+ English
+ Hosts
+ Add Host
+ Actions
+ Connect
+ Edit
+ Delete
+ Install
+ Save
+ Info
+ Warning
+ Error
+
+
+ Server Manager
+ Connection
+ User
+ Password
+ Tag
+ Host
+ Port
+ Method
+ Password Login
+ KeyLogin
+ Key
+ Upload
+ Proxy
+ Method
+ None
+ Http
+ Socks5
+ Host
+ Port
+ User
+ Password
+ Please enter host
+ Please enter port
+ Please enter proxy host
+ Please enter proxy port
+
+
+
\ No newline at end of file
diff --git a/ProxySU_Core/Resources/Languages/zh_cn.xaml b/ProxySU_Core/Resources/Languages/zh_cn.xaml
new file mode 100644
index 0000000..505c9aa
--- /dev/null
+++ b/ProxySU_Core/Resources/Languages/zh_cn.xaml
@@ -0,0 +1,48 @@
+
+ 应用布署
+ 语言
+ 中文
+ 英文
+ 主机列表
+ 添加主机
+ 操作
+ 连接
+ 安装
+ 编辑
+ 删除
+ 保存
+ 消息
+ 提示
+ 错误
+
+
+ 服务器管理
+ 连接
+ 用户名
+ 密码
+ 别名
+ 主机
+ 端口
+ 登陆方式
+ 密码登陆
+ 密钥登陆
+ 密钥
+ 上传
+ 代理
+ 类型
+ 无
+ Http
+ Socks5
+ 代理地址
+ 代理端口
+ 用户名
+ 密码
+ 请输入主机
+ 请输入端口号
+ 请输入代理地址
+ 请输入代理端口号
+
+
+
\ No newline at end of file
diff --git a/ProxySU_Core/Resources/Styles/MaterialDesignThemes.Overrides.xaml b/ProxySU_Core/Resources/Styles/MaterialDesignThemes.Overrides.xaml
new file mode 100644
index 0000000..5909ff8
--- /dev/null
+++ b/ProxySU_Core/Resources/Styles/MaterialDesignThemes.Overrides.xaml
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ProxySU_Core/Templates/xray/base.json b/ProxySU_Core/Templates/xray/base.json
new file mode 100644
index 0000000..84a9d1f
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/base.json
@@ -0,0 +1,12 @@
+{
+ "log": {},
+ "api": {},
+ "dns": {},
+ "routing": {},
+ "policy": {},
+ "inbounds": [],
+ "outbounds": [],
+ "transport": {},
+ "stats": {},
+ "reverse": {}
+}
\ No newline at end of file
diff --git a/ProxySU_Core/Templates/xray/caddy/Http2Web.caddyfile b/ProxySU_Core/Templates/xray/caddy/Http2Web.caddyfile
new file mode 100644
index 0000000..7e62dbc
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/caddy/Http2Web.caddyfile
@@ -0,0 +1,18 @@
+##domain## {
+ root * /usr/share/caddy
+ file_server
+ tls {
+ protocols tls1.2 tls1.3
+ ciphers TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
+ curves x25519
+ }
+
+ reverse_proxy ##path## http://localhost:10000 {
+ transport http {
+ versions h2c 2
+ }
+ }
+ ##reverse_Proxy1##
+ ##reverse_Proxy2##
+ ##reverse_Proxy3##
+}
\ No newline at end of file
diff --git a/ProxySU_Core/Templates/xray/caddy/WebSocketTLSWeb.caddyfile b/ProxySU_Core/Templates/xray/caddy/WebSocketTLSWeb.caddyfile
new file mode 100644
index 0000000..bddb8f6
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/caddy/WebSocketTLSWeb.caddyfile
@@ -0,0 +1,18 @@
+##domain## {
+ root * /usr/share/caddy
+ file_server
+ tls {
+ protocols tls1.2 tls1.3
+ ciphers TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
+ curves x25519
+ }
+ @xray_websocket {
+ path ##path##
+ header Connection *Upgrade*
+ header Upgrade websocket
+ }
+ reverse_proxy @xray_websocket localhost:10000
+ ##reverse_Proxy1##
+ ##reverse_Proxy2##
+ ##reverse_Proxy3##
+}
\ No newline at end of file
diff --git a/ProxySU_Core/Templates/xray/caddy/vlessTcpTlsWeb.caddyfile b/ProxySU_Core/Templates/xray/caddy/vlessTcpTlsWeb.caddyfile
new file mode 100644
index 0000000..0e9f3d2
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/caddy/vlessTcpTlsWeb.caddyfile
@@ -0,0 +1,10 @@
+:8800 {
+ root * /usr/share/caddy
+ file_server
+ ##reverse_Proxy1##
+ ##reverse_Proxy2##
+ ##reverse_Proxy3##
+}
+##domain##:80 {
+ redir https://##domain##{uri}
+}
\ No newline at end of file
diff --git a/ProxySU_Core/Templates/xray/client/00_log/00_log.json b/ProxySU_Core/Templates/xray/client/00_log/00_log.json
new file mode 100644
index 0000000..6a4cf00
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/client/00_log/00_log.json
@@ -0,0 +1,5 @@
+{
+ "log": {
+ "loglevel": "warning"
+ }
+}
\ No newline at end of file
diff --git a/ProxySU_Core/Templates/xray/client/01_api/01_api.json b/ProxySU_Core/Templates/xray/client/01_api/01_api.json
new file mode 100644
index 0000000..aa1982b
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/client/01_api/01_api.json
@@ -0,0 +1,3 @@
+{
+ "api": null
+}
\ No newline at end of file
diff --git a/ProxySU_Core/Templates/xray/client/02_dns/02_dns.json b/ProxySU_Core/Templates/xray/client/02_dns/02_dns.json
new file mode 100644
index 0000000..63472d2
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/client/02_dns/02_dns.json
@@ -0,0 +1,3 @@
+{
+ "dns": {}
+}
\ No newline at end of file
diff --git a/ProxySU_Core/Templates/xray/client/03_routing/03_routing.json b/ProxySU_Core/Templates/xray/client/03_routing/03_routing.json
new file mode 100644
index 0000000..a187d31
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/client/03_routing/03_routing.json
@@ -0,0 +1,3 @@
+{
+ "routing": {}
+}
\ No newline at end of file
diff --git a/ProxySU_Core/Templates/xray/client/04_policy/04_policy.json b/ProxySU_Core/Templates/xray/client/04_policy/04_policy.json
new file mode 100644
index 0000000..4beed61
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/client/04_policy/04_policy.json
@@ -0,0 +1,3 @@
+{
+ "policy": {}
+}
\ No newline at end of file
diff --git a/ProxySU_Core/Templates/xray/client/05_inbounds/05_inbounds.json b/ProxySU_Core/Templates/xray/client/05_inbounds/05_inbounds.json
new file mode 100644
index 0000000..c402972
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/client/05_inbounds/05_inbounds.json
@@ -0,0 +1,23 @@
+{
+ "inbounds": [
+ {
+ "protocol": "http",
+ "port": 1081
+ },
+ {
+ "port": 1080,
+ "protocol": "socks",
+ "sniffing": {
+ "enabled": true,
+ "destOverride": [
+ "http",
+ "tls"
+ ]
+ },
+ "settings": {
+ "udp": true,
+ "auth": "noauth"
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/ProxySU_Core/Templates/xray/client/06_outbounds/06_outbounds.json b/ProxySU_Core/Templates/xray/client/06_outbounds/06_outbounds.json
new file mode 100644
index 0000000..20e2beb
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/client/06_outbounds/06_outbounds.json
@@ -0,0 +1,3 @@
+{
+ "outbounds": []
+}
\ No newline at end of file
diff --git a/ProxySU_Core/Templates/xray/client/06_outbounds/VLESS_HTTP2_TLS.json b/ProxySU_Core/Templates/xray/client/06_outbounds/VLESS_HTTP2_TLS.json
new file mode 100644
index 0000000..8718383
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/client/06_outbounds/VLESS_HTTP2_TLS.json
@@ -0,0 +1,31 @@
+{
+ "outbounds": [
+ {
+ "protocol": "vless",
+ "settings": {
+ "vnext": [
+ {
+ "address": "",
+ "port": 443,
+ "users": [
+ {
+ "id": "",
+ "encryption": "none"
+ }
+ ]
+ }
+ ]
+ },
+ "streamSettings": {
+ "network": "h2",
+ "security": "tls",
+ "httpSettings": {
+ "host": [
+ ""
+ ],
+ "path": null
+ }
+ }
+ }
+ ]
+}
diff --git a/ProxySU_Core/Templates/xray/client/06_outbounds/VLESS_TCP_TLS_WS.json b/ProxySU_Core/Templates/xray/client/06_outbounds/VLESS_TCP_TLS_WS.json
new file mode 100644
index 0000000..7a3c871
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/client/06_outbounds/VLESS_TCP_TLS_WS.json
@@ -0,0 +1,32 @@
+{
+ "outbounds": [
+ {
+ "protocol": "vless",
+ "settings": {
+ "vnext": [
+ {
+ "address": "",
+ "port": 443,
+ "users": [
+ {
+ "id": "",
+ "encryption": "none",
+ "level": 0
+ }
+ ]
+ }
+ ]
+ },
+ "streamSettings": {
+ "network": "ws",
+ "security": "tls",
+ "tlsSettings": {
+ "serverName": ""
+ },
+ "wsSettings": {
+ "path": ""
+ }
+ }
+ }
+ ]
+}
diff --git a/ProxySU_Core/Templates/xray/client/07_transport/07_transport.json b/ProxySU_Core/Templates/xray/client/07_transport/07_transport.json
new file mode 100644
index 0000000..6269103
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/client/07_transport/07_transport.json
@@ -0,0 +1,3 @@
+{
+ "transport": {}
+}
\ No newline at end of file
diff --git a/ProxySU_Core/Templates/xray/client/08_stats/08_stats.json b/ProxySU_Core/Templates/xray/client/08_stats/08_stats.json
new file mode 100644
index 0000000..02c9ed0
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/client/08_stats/08_stats.json
@@ -0,0 +1,3 @@
+{
+ "stats": null
+}
\ No newline at end of file
diff --git a/ProxySU_Core/Templates/xray/client/09_reverse/09_reverse.json b/ProxySU_Core/Templates/xray/client/09_reverse/09_reverse.json
new file mode 100644
index 0000000..6fa38a4
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/client/09_reverse/09_reverse.json
@@ -0,0 +1,3 @@
+{
+ "reverse": {}
+}
\ No newline at end of file
diff --git a/ProxySU_Core/Templates/xray/server/00_log/00_log.json b/ProxySU_Core/Templates/xray/server/00_log/00_log.json
new file mode 100644
index 0000000..6a4cf00
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/server/00_log/00_log.json
@@ -0,0 +1,5 @@
+{
+ "log": {
+ "loglevel": "warning"
+ }
+}
\ No newline at end of file
diff --git a/ProxySU_Core/Templates/xray/server/01_api/01_api.json b/ProxySU_Core/Templates/xray/server/01_api/01_api.json
new file mode 100644
index 0000000..aa1982b
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/server/01_api/01_api.json
@@ -0,0 +1,3 @@
+{
+ "api": null
+}
\ No newline at end of file
diff --git a/ProxySU_Core/Templates/xray/server/02_dns/02_dns.json b/ProxySU_Core/Templates/xray/server/02_dns/02_dns.json
new file mode 100644
index 0000000..63472d2
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/server/02_dns/02_dns.json
@@ -0,0 +1,3 @@
+{
+ "dns": {}
+}
\ No newline at end of file
diff --git a/ProxySU_Core/Templates/xray/server/03_routing/03_routing.json b/ProxySU_Core/Templates/xray/server/03_routing/03_routing.json
new file mode 100644
index 0000000..0aa4964
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/server/03_routing/03_routing.json
@@ -0,0 +1,14 @@
+{
+ "routing": {
+ "domainStrategy": "AsIs",
+ "rules": [
+ {
+ "type": "field",
+ "ip": [
+ "geoip:private"
+ ],
+ "outboundTag": "block"
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/ProxySU_Core/Templates/xray/server/04_policy/04_policy.json b/ProxySU_Core/Templates/xray/server/04_policy/04_policy.json
new file mode 100644
index 0000000..4beed61
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/server/04_policy/04_policy.json
@@ -0,0 +1,3 @@
+{
+ "policy": {}
+}
\ No newline at end of file
diff --git a/ProxySU_Core/Templates/xray/server/05_inbounds/05_inbounds.json b/ProxySU_Core/Templates/xray/server/05_inbounds/05_inbounds.json
new file mode 100644
index 0000000..9a8d634
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/server/05_inbounds/05_inbounds.json
@@ -0,0 +1,3 @@
+{
+ "inbounds": []
+}
diff --git a/ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_HTTP2_TLS.json b/ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_HTTP2_TLS.json
new file mode 100644
index 0000000..a9e1b2f
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_HTTP2_TLS.json
@@ -0,0 +1,27 @@
+{
+ "inbounds": [
+ {
+ "port": 10000,
+ "listen": "127.0.0.1",
+ "protocol": "vless",
+ "settings": {
+ "clients": [
+ {
+ "id": ""
+ }
+ ],
+ "decryption": "none"
+ },
+ "streamSettings": {
+ "security": "none",
+ "network": "h2",
+ "httpSettings": {
+ "path": "",
+ "host": [
+ ""
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_TCP_TLS_WS.json b/ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_TCP_TLS_WS.json
new file mode 100644
index 0000000..fa16dbf
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_TCP_TLS_WS.json
@@ -0,0 +1,24 @@
+{
+ "inbounds": [
+ {
+ "port": 443,
+ "listen": "127.0.0.1",
+ "protocol": "vless",
+ "settings": {
+ "clients": [
+ {
+ "id": ""
+ }
+ ],
+ "decryption": "none"
+ },
+ "streamSettings": {
+ "network": "ws",
+ "security": "none",
+ "wsSettings": {
+ "path": ""
+ }
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/ProxySU_Core/Templates/xray/server/06_outbounds/06_outbounds.json b/ProxySU_Core/Templates/xray/server/06_outbounds/06_outbounds.json
new file mode 100644
index 0000000..467a4e1
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/server/06_outbounds/06_outbounds.json
@@ -0,0 +1,12 @@
+{
+ "outbounds": [
+ {
+ "protocol": "freedom",
+ "tag": "direct"
+ },
+ {
+ "protocol": "blackhole",
+ "tag": "block"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/ProxySU_Core/Templates/xray/server/07_transport/07_transport.json b/ProxySU_Core/Templates/xray/server/07_transport/07_transport.json
new file mode 100644
index 0000000..6269103
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/server/07_transport/07_transport.json
@@ -0,0 +1,3 @@
+{
+ "transport": {}
+}
\ No newline at end of file
diff --git a/ProxySU_Core/Templates/xray/server/08_stats/08_stats.json b/ProxySU_Core/Templates/xray/server/08_stats/08_stats.json
new file mode 100644
index 0000000..02c9ed0
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/server/08_stats/08_stats.json
@@ -0,0 +1,3 @@
+{
+ "stats": null
+}
\ No newline at end of file
diff --git a/ProxySU_Core/Templates/xray/server/09_reverse/09_reverse.json b/ProxySU_Core/Templates/xray/server/09_reverse/09_reverse.json
new file mode 100644
index 0000000..6fa38a4
--- /dev/null
+++ b/ProxySU_Core/Templates/xray/server/09_reverse/09_reverse.json
@@ -0,0 +1,3 @@
+{
+ "reverse": {}
+}
\ No newline at end of file
diff --git a/ProxySU_Core/Tools/DateTimeUtils.cs b/ProxySU_Core/Tools/DateTimeUtils.cs
new file mode 100644
index 0000000..32cb7b5
--- /dev/null
+++ b/ProxySU_Core/Tools/DateTimeUtils.cs
@@ -0,0 +1,83 @@
+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
+ {
+ ///
+ /// 从国家授时中心获取标准GMT时间,读取https://www.tsa.cn
+ /// GMT时间与UTC时间没有差别,可以UTC=GMT
+ ///
+ /// 返回网络时间
+ 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;
+ }
+
+ ///
+ /// 设置系统时间
+ ///
+ /// 需要设置的时间
+ /// 返回系统时间设置状态,true为成功,false为失败
+ 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;
+ }
+ }
+}
diff --git a/ProxySU_Core/ViewModels/BaseCommand.cs b/ProxySU_Core/ViewModels/BaseCommand.cs
new file mode 100644
index 0000000..21860cd
--- /dev/null
+++ b/ProxySU_Core/ViewModels/BaseCommand.cs
@@ -0,0 +1,41 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Input;
+
+namespace ProxySU_Core.ViewModels
+{
+ public class BaseCommand : ICommand
+ {
+ private readonly Action