mirror of
https://github.com/proxysu/ProxySU.git
synced 2025-04-06 07:13:36 +03:00
Compare commits
367 commits
Author | SHA1 | Date | |
---|---|---|---|
|
201d3da3a5 | ||
|
03f015f8d4 | ||
|
2047f3d480 | ||
|
ba5629bd49 | ||
|
97a1f45abc | ||
|
5cfe086d50 | ||
|
2d5a589bcb | ||
|
332f54224f | ||
|
be74f42f19 | ||
|
d9d9393c5f | ||
|
6e4b3f7c01 | ||
|
703183274b | ||
|
1907061064 | ||
|
6177ea99d1 | ||
|
ef3542f338 | ||
|
5cc6229437 | ||
|
705b0df116 | ||
|
8d1863729a | ||
|
8ea6af4018 | ||
|
280dacabac | ||
|
62403f68ca | ||
|
eabd976de8 | ||
|
6a67a3e685 | ||
|
1e1cad2ad7 | ||
|
f371277362 | ||
|
b9ebd8700c | ||
|
07c8d9bb2b | ||
|
1a5a7219e3 | ||
|
5db61a02b5 | ||
|
ac003d476b | ||
|
91827f47ee | ||
|
433883c3bf | ||
|
e86db631c5 | ||
|
4c0d3a0cf4 | ||
|
db6a399ca9 | ||
|
1110f8291e | ||
|
89649d136f | ||
|
89af852433 | ||
|
13e5edf50d | ||
|
5a79ceccba | ||
|
10c8c0f74e | ||
|
2567635002 | ||
|
1e96735db6 | ||
|
4d9890c797 | ||
|
d815152d2d | ||
|
ef5bb6d977 | ||
|
9f7a4b8626 | ||
|
dade426ff7 | ||
|
eaca464f9c | ||
|
bd32650fa9 | ||
|
9f4edca5d4 | ||
|
3fc01e8f2f | ||
|
c2b764a7c9 | ||
|
84674d15ac | ||
|
460b9a9abc | ||
|
6b10682060 | ||
|
1b8240b460 | ||
|
4f23cd735c | ||
|
b185e4f64e | ||
|
0937e8083d | ||
|
aaf899ea73 | ||
|
14c622b272 | ||
|
d87e4ddb96 | ||
|
62c2ad7be8 | ||
|
9cec097baa | ||
|
fcaa50b248 | ||
|
d628147bdb | ||
|
983e15f98f | ||
|
361bdb4e2d | ||
|
e7da4962e8 | ||
|
ba48b34c9a | ||
|
38784d1e4e | ||
|
682ceadd5e | ||
|
751b0d19ca | ||
|
10a62f55eb | ||
|
535998f233 | ||
|
d30ead12af | ||
|
9a552edbeb | ||
|
f0905945f6 | ||
|
bc903cbf4a | ||
|
8bc507ef43 | ||
|
dbadab1499 | ||
|
96ed54702b | ||
|
a637e6fc54 | ||
|
d3619fadd7 | ||
|
725d202b38 | ||
|
fb8a0de49d | ||
|
e1b92a499e | ||
|
9ae318c01f | ||
|
ca01190672 | ||
|
57b222bc5b | ||
|
87f01d180d | ||
|
34fb030b95 | ||
|
1792c6912a | ||
|
3e71d14424 | ||
|
e4bd5a9167 | ||
|
fc131ededd | ||
|
2cffa483aa | ||
|
524c341e9a | ||
|
d5e1125c36 | ||
|
819b8dd440 | ||
|
81ae945e4f | ||
|
553cb7b431 | ||
|
2b1e65adb4 | ||
|
7869e77126 | ||
|
6e61ef1ff6 | ||
|
be9ae4a8de | ||
|
7b7251279f | ||
|
eab70cc48c | ||
|
6c79b07d3c | ||
|
995d9ff435 | ||
|
b0d0e761de | ||
|
e85a0b93bf | ||
|
69b29fce21 | ||
|
389f80f655 | ||
|
bbf6cf64fe | ||
|
4fe8b03daa | ||
|
bbc508557b | ||
|
f39c1e70ae | ||
|
2ca98258b8 | ||
|
0296c2be89 | ||
|
db3d4491bb | ||
|
860dfb6520 | ||
|
b9b41b6554 | ||
|
2378f0c416 | ||
|
6be1fdb84a | ||
|
c33de96563 | ||
|
0859efb2dd | ||
|
399c852857 | ||
|
d5878079f1 | ||
|
5bd7529bec | ||
|
a2b27076b1 | ||
|
fe94157c7b | ||
|
b82e857edd | ||
|
9923437691 | ||
|
2f0f9fb09d | ||
|
395d01aea8 | ||
|
63c7f8b7a7 | ||
|
95dccb1c6c | ||
|
11021fac1a | ||
|
e05e9cff3d | ||
|
316453c89b | ||
|
424e0945db | ||
|
7f7c92d22b | ||
|
3f397dbbf7 | ||
|
3395876380 | ||
|
7263459a74 | ||
|
ca2bc405f5 | ||
|
b7e44dbdca | ||
|
2c9e2777bd | ||
|
05f96fc790 | ||
|
dc7abb66b2 | ||
|
b614bc676c | ||
|
880494a331 | ||
|
b20be2ac75 | ||
|
433bcf34ee | ||
|
97ae49c60c | ||
|
888e981d41 | ||
|
3f75fbf003 | ||
|
b71d1f2bc2 | ||
|
970843f561 | ||
|
cb7d7e5f21 | ||
|
5f209b7c1d | ||
|
4cd4509cb9 | ||
|
5093082fc4 | ||
|
eeada87602 | ||
|
3b79a7ca44 | ||
|
5e1e9e90cf | ||
|
405d8377da | ||
|
8d531a2930 | ||
|
a6221c330a | ||
|
22e060e14a | ||
|
c35d2d5434 | ||
|
5b547b87f9 | ||
|
7c6820f0f7 | ||
|
5a21895442 | ||
|
66d9f3b81a | ||
|
7ea78170d1 | ||
|
83962fe0f0 | ||
|
b4ad1bde74 | ||
|
95380c5e47 | ||
|
5957f49537 | ||
|
6962ed4bb8 | ||
|
b08251a0bc | ||
|
41e3c85d01 | ||
|
379edc265f | ||
|
5948ca6efd | ||
|
b1bc74104d | ||
|
dc38de67d5 | ||
|
f27ae4d70c | ||
|
ce239978c8 | ||
|
83d6d04578 | ||
|
aadd003fbc | ||
|
f4f9eceb6a | ||
|
f84dc13ec7 | ||
|
f81f79367f | ||
|
6d1d45e945 | ||
|
754aff18a4 | ||
|
0c146f176d | ||
|
34f4addd91 | ||
|
6427f8de3d | ||
|
628d11bd5a | ||
|
66b7191394 | ||
|
d6242fb49b | ||
|
737deb7ca5 | ||
|
4d5e15afb3 | ||
|
3dfee31081 | ||
|
0072c9c99c | ||
|
f6d28efac9 | ||
|
14401058dc | ||
|
ae1c06f6af | ||
|
4d3ad778a6 | ||
|
25f322d35c | ||
|
b5978e738d | ||
|
c5ac770d27 | ||
|
816c304249 | ||
|
177c09896c | ||
|
77cf7737f7 | ||
|
b6e77b88b4 | ||
|
8199b3d9d2 | ||
|
e548affd70 | ||
|
2fd76baf2f | ||
|
d04553034a | ||
|
bdac51e8ea | ||
|
7034a1dc22 | ||
|
e4971f286f | ||
|
67976be62b | ||
|
6f8e68e121 | ||
|
8220544c09 | ||
|
52ac035195 | ||
|
c2d7792f8e | ||
|
386fc0d484 | ||
|
55c7abf01c | ||
|
e79607be2e | ||
|
4a119f9823 | ||
|
6ebd3750d3 | ||
|
46680de002 | ||
|
de18dcb063 | ||
|
1c0290c57d | ||
|
471e919161 | ||
|
250f90e9cf | ||
|
1425ce28a1 | ||
|
ab9021e8a6 | ||
|
21c9bf5176 | ||
|
bb222c41b6 | ||
|
b8dce714c1 | ||
|
f445395fda | ||
|
90adece940 | ||
|
1dad199084 | ||
|
06a08004e8 | ||
|
19bf6a0fb0 | ||
|
72f71983bc | ||
|
1823d8b4da | ||
|
05c58d33f6 | ||
|
a898314bb6 | ||
|
17d40011c9 | ||
|
c641daa969 | ||
|
0180a8cbb4 | ||
|
775fd7209d | ||
|
6c2fd95f6e | ||
|
256e31dbed | ||
|
b3c455c753 | ||
|
23fcbe49f8 | ||
|
eb682bc04c | ||
|
2f2978cad8 | ||
|
b2b652385f | ||
|
28e1056cb4 | ||
|
3cdba7f7bc | ||
|
4b89568ddd | ||
|
7736d9f4b5 | ||
|
2dcbcd1b16 | ||
|
5b2cf29e6f | ||
|
b571c469c3 | ||
|
9ca6b918a1 | ||
|
9ba74dc2f1 | ||
|
b3a081c6c3 | ||
|
c006967c9a | ||
|
ca451b391b | ||
|
01af863260 | ||
|
7b3a8627c0 | ||
|
1682e7d268 | ||
|
4a9cf2b104 | ||
|
350060f276 | ||
|
d3bee1a52d | ||
|
10423c92d0 | ||
|
685675c731 | ||
|
5c8a9b181b | ||
|
ae0f3e4208 | ||
|
c646ff7e07 | ||
|
6f09444581 | ||
|
ebf9feb651 | ||
|
78d299f5c7 | ||
|
cb55c6f92d | ||
|
c37ec2598d | ||
|
cc7374e3fd | ||
|
0f701a3b34 | ||
|
c6be38f1e6 | ||
|
84578e16cd | ||
|
df98787e6c | ||
|
b404c3e6c9 | ||
|
93bed9f261 | ||
|
61baafa7af | ||
|
f226b13b0a | ||
|
687ee342db | ||
|
91e981062a | ||
|
81f39e6db3 | ||
|
e93abb5a1d | ||
|
8f83b57dd4 | ||
|
15bdfc5a87 | ||
|
b69acc5094 | ||
|
abac17d512 | ||
|
a0b241a608 | ||
|
e2c105b148 | ||
|
927a468222 | ||
|
d5c6b8c616 | ||
|
56dff5ed4f | ||
|
cdc1a2b7e9 | ||
|
b491fe19df | ||
|
35b6a741ff | ||
|
7bf01377cb | ||
|
4815a71ce9 | ||
|
73a1d2c7ed | ||
|
d3acd25ab9 | ||
|
a40776d5a9 | ||
|
3166814acf | ||
|
56f6f6f976 | ||
|
d34ecbd81f | ||
|
bebfe4dfb6 | ||
|
62a4eb9c66 | ||
|
cf529a2a4d | ||
|
2cac6c63ed | ||
|
066103adf4 | ||
|
0734887044 | ||
|
944929d162 | ||
|
f54da666ca | ||
|
dc6ff2e7c3 | ||
|
ef29ab812e | ||
|
048a8df6de | ||
|
189d37d22f | ||
|
935de5f846 | ||
|
4cd49ab0fb | ||
|
34e055e25a | ||
|
f6779d2c36 | ||
|
d8e2580db8 | ||
|
83020b9df7 | ||
|
6aadbf65d2 | ||
|
20db996f1f | ||
|
eefa37c099 | ||
|
a9bd37bd27 | ||
|
a1b0b3a697 | ||
|
f56b54132d | ||
|
a1a47c98b1 | ||
|
ebfdcf0fec | ||
|
f34ac43341 | ||
|
45c1f9cc20 | ||
|
80323e4c6f | ||
|
9e25c10b18 | ||
|
b5263c3a80 | ||
|
769df6f2dc | ||
|
fd646363f5 | ||
|
bf39e88ace | ||
|
249282012d | ||
|
238eaf13c8 | ||
|
36972317d0 | ||
|
2e9a49db5c | ||
|
36dfea5e9a | ||
|
cb224d03f5 |
344 changed files with 16099 additions and 52030 deletions
4
.editorconfig
Normal file
4
.editorconfig
Normal file
|
@ -0,0 +1,4 @@
|
|||
[*.cs]
|
||||
|
||||
# Default severity for all analyzer diagnostics
|
||||
dotnet_analyzer_diagnostic.severity = none
|
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -198,3 +198,5 @@ FakesAssemblies/
|
|||
|
||||
# vs code
|
||||
.vscode/*
|
||||
/ProxySU_Core/Data/Record.json
|
||||
/ProxySuper.WPF/bin
|
||||
|
|
5
.idea/.idea.ProxySU/.idea/codeStyles/codeStyleConfig.xml
generated
Normal file
5
.idea/.idea.ProxySU/.idea/codeStyles/codeStyleConfig.xml
generated
Normal file
|
@ -0,0 +1,5 @@
|
|||
<component name="ProjectCodeStyleConfiguration">
|
||||
<state>
|
||||
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
|
||||
</state>
|
||||
</component>
|
32
.idea/.idea.ProxySU/.idea/contentModel.xml
generated
Normal file
32
.idea/.idea.ProxySU/.idea/contentModel.xml
generated
Normal file
|
@ -0,0 +1,32 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ContentModelStore">
|
||||
<e p="C:\Users\huife\AppData\Local\JetBrains\Rider2020.2\extResources" t="IncludeRecursive" />
|
||||
<e p="C:\Users\huife\AppData\Local\JetBrains\Rider2020.2\resharper-host\Local\Transient\Rider\v202\SolutionCaches\_ProxySU.1010492592.00" t="ExcludeRecursive" />
|
||||
<e p="E:\dev\ProxySU" t="IncludeFlat">
|
||||
<e p="packages" t="ExcludeRecursive" />
|
||||
<e p="ProxySU" t="IncludeRecursive">
|
||||
<e p="ProxySU.csproj" t="IncludeRecursive" />
|
||||
</e>
|
||||
<e p="ProxySU.sln" t="IncludeFlat" />
|
||||
<e p="WpfApp1" t="IncludeRecursive">
|
||||
<e p="App.xaml" t="Include" />
|
||||
<e p="App.xaml.cs" t="Include" />
|
||||
<e p="AssemblyInfo.cs" t="Include" />
|
||||
<e p="bin" t="ExcludeRecursive" />
|
||||
<e p="MainWindow.xaml" t="Include" />
|
||||
<e p="MainWindow.xaml.cs" t="Include" />
|
||||
<e p="obj" t="ExcludeRecursive">
|
||||
<e p="Debug" t="Include">
|
||||
<e p="netcoreapp3.1-windows" t="Include">
|
||||
<e p="App.g.cs" t="Include" />
|
||||
<e p="MainWindow.g.cs" t="Include" />
|
||||
<e p="WpfApp1.AssemblyInfo.cs" t="Include" />
|
||||
</e>
|
||||
</e>
|
||||
</e>
|
||||
<e p="WpfApp1.csproj" t="IncludeRecursive" />
|
||||
</e>
|
||||
</e>
|
||||
</component>
|
||||
</project>
|
4
.idea/.idea.ProxySU/.idea/encodings.xml
generated
Normal file
4
.idea/.idea.ProxySU/.idea/encodings.xml
generated
Normal file
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" />
|
||||
</project>
|
8
.idea/.idea.ProxySU/.idea/indexLayout.xml
generated
Normal file
8
.idea/.idea.ProxySU/.idea/indexLayout.xml
generated
Normal file
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ContentModelUserStore">
|
||||
<attachedFolders />
|
||||
<explicitIncludes />
|
||||
<explicitExcludes />
|
||||
</component>
|
||||
</project>
|
8
.idea/.idea.ProxySU/.idea/modules.xml
generated
Normal file
8
.idea/.idea.ProxySU/.idea/modules.xml
generated
Normal file
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/.idea.ProxySU/riderModule.iml" filepath="$PROJECT_DIR$/.idea/.idea.ProxySU/riderModule.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
6
.idea/.idea.ProxySU/.idea/projectSettingsUpdater.xml
generated
Normal file
6
.idea/.idea.ProxySU/.idea/projectSettingsUpdater.xml
generated
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="RiderProjectSettingsUpdater">
|
||||
<option name="vcsConfiguration" value="2" />
|
||||
</component>
|
||||
</project>
|
6
.idea/.idea.ProxySU/.idea/vcs.xml
generated
Normal file
6
.idea/.idea.ProxySU/.idea/vcs.xml
generated
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
121
.idea/.idea.ProxySU/.idea/workspace.xml
generated
Normal file
121
.idea/.idea.ProxySU/.idea/workspace.xml
generated
Normal file
|
@ -0,0 +1,121 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="AutoGeneratedRunConfigurationManager">
|
||||
<projectFile>ProxySU/ProxySU.csproj</projectFile>
|
||||
<projectFile>WpfApp1/WpfApp1.csproj</projectFile>
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="669dc0ab-dc83-4456-b675-b70a2f5f75b2" name="Default Changelist" comment="">
|
||||
<change beforePath="$PROJECT_DIR$/ProxySU.sln" beforeDir="false" afterPath="$PROJECT_DIR$/ProxySU.sln" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ProxySU/bin/Beta/Beta.zip" beforeDir="false" />
|
||||
</list>
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||
</component>
|
||||
<component name="Git.Settings">
|
||||
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||
</component>
|
||||
<component name="HighlightingSettingsPerFile">
|
||||
<setting file="file://$PROJECT_DIR$/ProxySU/MainWindow.xaml" root0="SKIP_HIGHLIGHTING" />
|
||||
</component>
|
||||
<component name="IdeDocumentHistory">
|
||||
<option name="CHANGED_PATHS">
|
||||
<list>
|
||||
<option value="$PROJECT_DIR$/WpfApp1/MainWindow.xaml" />
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectId" id="1lRuJq6UGgT2UlI6dsaBIqwjatG" />
|
||||
<component name="ProjectViewState">
|
||||
<option name="hideEmptyMiddlePackages" value="true" />
|
||||
<option name="showLibraryContents" value="true" />
|
||||
</component>
|
||||
<component name="PropertiesComponent">
|
||||
<property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
|
||||
<property name="WebServerToolWindowFactoryState" value="false" />
|
||||
<property name="dart.analysis.tool.window.visible" value="false" />
|
||||
<property name="vue.rearranger.settings.migration" value="true" />
|
||||
</component>
|
||||
<component name="RunManager" selected=".NET Project.WpfApp1">
|
||||
<configuration name="ProxySU" type="DotNetProject" factoryName=".NET Project">
|
||||
<option name="EXE_PATH" value="" />
|
||||
<option name="PROGRAM_PARAMETERS" value="" />
|
||||
<option name="WORKING_DIRECTORY" value="" />
|
||||
<option name="PASS_PARENT_ENVS" value="1" />
|
||||
<option name="USE_EXTERNAL_CONSOLE" value="0" />
|
||||
<option name="USE_MONO" value="0" />
|
||||
<option name="RUNTIME_ARGUMENTS" value="" />
|
||||
<option name="PROJECT_PATH" value="$PROJECT_DIR$/ProxySU/ProxySU.csproj" />
|
||||
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
|
||||
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
|
||||
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
|
||||
<option name="PROJECT_KIND" value="Console" />
|
||||
<option name="PROJECT_TFM" value="" />
|
||||
<method v="2">
|
||||
<option name="Build" />
|
||||
</method>
|
||||
</configuration>
|
||||
<configuration name="WpfApp1" type="DotNetProject" factoryName=".NET Project">
|
||||
<option name="EXE_PATH" value="" />
|
||||
<option name="PROGRAM_PARAMETERS" value="" />
|
||||
<option name="WORKING_DIRECTORY" value="" />
|
||||
<option name="PASS_PARENT_ENVS" value="1" />
|
||||
<option name="USE_EXTERNAL_CONSOLE" value="0" />
|
||||
<option name="USE_MONO" value="0" />
|
||||
<option name="RUNTIME_ARGUMENTS" value="" />
|
||||
<option name="PROJECT_PATH" value="$PROJECT_DIR$/WpfApp1/WpfApp1.csproj" />
|
||||
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
|
||||
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
|
||||
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
|
||||
<option name="PROJECT_KIND" value="DotNetCore" />
|
||||
<option name="PROJECT_TFM" value="" />
|
||||
<method v="2">
|
||||
<option name="Build" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
||||
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
|
||||
<component name="TaskManager">
|
||||
<task active="true" id="Default" summary="Default task">
|
||||
<changelist id="669dc0ab-dc83-4456-b675-b70a2f5f75b2" name="Default Changelist" comment="" />
|
||||
<created>1607572158648</created>
|
||||
<option name="number" value="Default" />
|
||||
<option name="presentableId" value="Default" />
|
||||
<updated>1607572158648</updated>
|
||||
<workItem from="1607572166623" duration="517000" />
|
||||
</task>
|
||||
<servers />
|
||||
</component>
|
||||
<component name="TypeScriptGeneratedFilesManager">
|
||||
<option name="version" value="3" />
|
||||
</component>
|
||||
<component name="UnityProjectConfiguration" hasMinimizedUI="null" />
|
||||
<component name="UnityUnitTestConfiguration" currentTestLauncher="NUnit" />
|
||||
<component name="VcsManagerConfiguration">
|
||||
<option name="CLEAR_INITIAL_COMMIT_MESSAGE" value="true" />
|
||||
</component>
|
||||
<component name="WindowStateProjectService">
|
||||
<state width="1877" height="275" key="GridCell.Tab.0.bottom" timestamp="1607572691215">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="275" key="GridCell.Tab.0.bottom/0.0.1920.1040@0.0.1920.1040" timestamp="1607572691215" />
|
||||
<state width="1877" height="275" key="GridCell.Tab.0.center" timestamp="1607572691215">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="275" key="GridCell.Tab.0.center/0.0.1920.1040@0.0.1920.1040" timestamp="1607572691215" />
|
||||
<state width="1877" height="275" key="GridCell.Tab.0.left" timestamp="1607572691215">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="275" key="GridCell.Tab.0.left/0.0.1920.1040@0.0.1920.1040" timestamp="1607572691215" />
|
||||
<state width="1877" height="275" key="GridCell.Tab.0.right" timestamp="1607572691215">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state width="1877" height="275" key="GridCell.Tab.0.right/0.0.1920.1040@0.0.1920.1040" timestamp="1607572691215" />
|
||||
<state x="552" y="252" key="Rider.ProjectTemplateDialog.Size" timestamp="1607572543584">
|
||||
<screen x="0" y="0" width="1920" height="1040" />
|
||||
</state>
|
||||
<state x="552" y="252" key="Rider.ProjectTemplateDialog.Size/0.0.1920.1040@0.0.1920.1040" timestamp="1607572543584" />
|
||||
</component>
|
||||
</project>
|
7
.idea/.idea.ProxySU/riderModule.iml
generated
Normal file
7
.idea/.idea.ProxySU/riderModule.iml
generated
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="RIDER_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$/../.." />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
BIN
7z/7z.exe
BIN
7z/7z.exe
Binary file not shown.
|
@ -1 +0,0 @@
|
|||
这个7z.exe文件,只是为了生成Release.zip方便。可有可无。ProxySU并不调用。
|
26
ProxySU.sln
26
ProxySU.sln
|
@ -1,9 +1,13 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 15
|
||||
VisualStudioVersion = 15.0.28307.1022
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.0.31606.5
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProxySU", "ProxySU\ProxySU.csproj", "{DD5505BC-E7F1-4D03-ABC7-B636E893FC09}"
|
||||
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
|
||||
|
@ -11,14 +15,22 @@ Global
|
|||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{DD5505BC-E7F1-4D03-ABC7-B636E893FC09}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{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
|
||||
{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
|
||||
|
|
|
@ -1,15 +0,0 @@
|
|||
<Application x:Class="ProxySU.App"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:local="clr-namespace:ProxySU"
|
||||
StartupUri="MainWindow.xaml">
|
||||
<Application.Resources>
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="Translations\ProxySU.zh-CN.xaml" />
|
||||
<ResourceDictionary Source="Translations\ProxySU.en-US.xaml" />
|
||||
<ResourceDictionary Source="Translations\ProxySU.zh-TW.xaml" />
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
</Application.Resources>
|
||||
</Application>
|
|
@ -1,16 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Configuration;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Windows;
|
||||
|
||||
namespace ProxySU
|
||||
{
|
||||
/// <summary>
|
||||
/// App.xaml 的交互逻辑
|
||||
/// </summary>
|
||||
public partial class App : Application
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,755 +0,0 @@
|
|||
<Window x:Class="ProxySU.MainWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:local="clr-namespace:ProxySU"
|
||||
mc:Ignorable="d"
|
||||
Title="ProxySU - v2.4.3" Height="675" Width="650">
|
||||
<!--以下样式参考自:https://yq.aliyun.com/articles/331878
|
||||
https://docs.microsoft.com/en-us/dotnet/desktop-wpf/fundamentals/styles-templates-overview-->
|
||||
<Window.Resources>
|
||||
<Style BasedOn="{StaticResource {x:Type TextBox}}"
|
||||
TargetType="TextBox"
|
||||
x:Key="TitleText">
|
||||
<Style.Triggers>
|
||||
<MultiTrigger>
|
||||
<MultiTrigger.Conditions>
|
||||
<Condition Property="Text" Value=""/>
|
||||
<Condition Property="TextBox.IsFocused" Value="false"/>
|
||||
</MultiTrigger.Conditions>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate>
|
||||
<Border BorderThickness="1" BorderBrush="Gray" Margin="0">
|
||||
<TextBlock x:Name="MainTextBlock" Text="{TemplateBinding TextBox.Tag}" Width="{TemplateBinding TextBox.ActualWidth}" Foreground="Gray" VerticalAlignment="Center" HorizontalAlignment="Left"/>
|
||||
</Border>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</MultiTrigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</Window.Resources>
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="25"></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<Grid Grid.Row="0">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.5*"></ColumnDefinition>
|
||||
<ColumnDefinition Width="1.6*"></ColumnDefinition>
|
||||
<ColumnDefinition Width="0.5*"></ColumnDefinition>
|
||||
<ColumnDefinition Width="0.6*"></ColumnDefinition>
|
||||
<ColumnDefinition Width="0.7*"></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock x:Name="TextBlockLastVersionProxySU" Foreground="Red" Grid.Column="0" Margin="3" Visibility="Hidden" HorizontalAlignment="Right" ></TextBlock>
|
||||
<TextBlock x:Name="TextBlockNewVersionReminder" Text="{DynamicResource TextBlockNewVersionReminder}" Grid.Column="1" Grid.ColumnSpan="1" Margin="3" Visibility="Hidden"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockNewVersionDown" Text="{DynamicResource TextBlockNewVersionDown}" Grid.Column="1" Grid.ColumnSpan="1" Margin="3" Visibility="Hidden"></TextBlock>
|
||||
<Button x:Name="ButtonUpgradeProxySU" Content="{DynamicResource ButtonUpgradeProxySU}" Grid.Column="2" Margin="3" Visibility="Hidden" Click="ButtonUpgradeProxySU_Click"></Button>
|
||||
<TextBlock Grid.Column="3" Text="{DynamicResource MainWindowsLanguage}" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="5"></TextBlock>
|
||||
<ComboBox x:Name="ComboBoxLanguage" Grid.Column="4" Height="20" Width="80" SelectionChanged="ComboBoxLanguage_SelectionChanged"></ComboBox>
|
||||
</Grid>
|
||||
<Grid Grid.Row="1">
|
||||
<TabControl>
|
||||
<TabItem Header="{DynamicResource TabItemHeaderAppDeployment}" Width="110" Height="30">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="1.3*"></RowDefinition>
|
||||
<RowDefinition Height="1.8*"></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<Grid Grid.Row="0">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="2*"></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<Grid Grid.Row="0">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="50"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition Width="70"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition Width="50"></ColumnDefinition>
|
||||
<ColumnDefinition Width="110"></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Text="{DynamicResource TextBlockHostName}" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="5" Grid.Column="0" ></TextBlock>
|
||||
<TextBox x:Name="TextBoxHost" Text="" Style="{StaticResource TitleText}" Tag="{DynamicResource TextBoxHostNamePrompt}" Margin="3" Grid.Column="1"/>
|
||||
|
||||
<TextBlock Text="{DynamicResource TextBlockHostPart}" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="5" Grid.Column="2"></TextBlock>
|
||||
<TextBox x:Name="TextBoxPort" CommandManager.PreviewExecuted="TextBoxPort_PreviewExecuted" Text="22" Margin="3" Grid.Column="3" PreviewTextInput="TextBoxPort_PreviewTextInput"/>
|
||||
|
||||
<RadioButton x:Name="RadioButtonPasswordLogin" GroupName="CertIsYesNo" Content="{DynamicResource RadioButtonPasswordLogin}" Grid.Column="5" Checked="RadioButtonPasswordLogin_Checked" VerticalAlignment="Center"></RadioButton>
|
||||
</Grid>
|
||||
<Grid Grid.Row="1">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="50"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition Width="70"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition Width="50"></ColumnDefinition>
|
||||
<ColumnDefinition Width="110"></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Text="{DynamicResource TextBlockHostUser}" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="3" Grid.Column="0" Grid.Row="1"></TextBlock>
|
||||
<TextBox x:Name="TextBoxUserName" Text="root" Margin="3" Grid.Column="1" Grid.Row="1"/>
|
||||
|
||||
<TextBlock x:Name="TextBlockPassword" Text="{DynamicResource TextBlockHostPassword}" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="3" Grid.Column="2" Grid.Row="1"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockCert" Text="{DynamicResource TextBlockHostCert}" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="3" Grid.Column="2" Grid.Row="1"></TextBlock>
|
||||
<PasswordBox x:Name="PasswordBoxHostPassword" Password="" Margin="3" Grid.Column="3" Grid.Row="1"/>
|
||||
<TextBox x:Name="TextBoxCertFilePath" Text="" Style="{StaticResource TitleText}" Tag="{DynamicResource TextBoxKeyNotEmptyPrompt}" Margin="3" Grid.Column="3"/>
|
||||
<Button x:Name="ButtonOpenFileDialog" Content="{DynamicResource ButtonOpenFileDialog}" Margin="3" Grid.Column="4" Grid.Row="2" Click="ButtonOpenFileDialog_Click"></Button>
|
||||
<RadioButton x:Name="RadioButtonCertLogin" GroupName="CertIsYesNo" Content="{DynamicResource RadioButtonCertLogin}" Grid.Column="5" Checked="RadioButtonCertLogin_Checked" VerticalAlignment="Center"></RadioButton>
|
||||
|
||||
</Grid>
|
||||
|
||||
<Grid Grid.Row="2">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="75"></ColumnDefinition>
|
||||
<ColumnDefinition Width="70"></ColumnDefinition>
|
||||
<ColumnDefinition Width="70"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition Width="1.2*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<RadioButton x:Name="RadioButtonNoProxy" GroupName="ProxyIsYesNo" Content="{DynamicResource RadioButtonNoProxy}" Grid.Column="0" Grid.Row="0" Checked="RadioButtonNoProxy_Checked" Unchecked="RadioButtonNoProxy_Unchecked" VerticalAlignment="Center" HorizontalAlignment="Center"/>
|
||||
<RadioButton x:Name="RadioButtonHttp" GroupName="ProxyIsYesNo" Content="Http" Grid.Column="1" Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Center"/>
|
||||
|
||||
<RadioButton x:Name="RadioButtonSocks5" GroupName="ProxyIsYesNo" Content="Socks5" Grid.Column="2" Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Center"/>
|
||||
<RadioButton x:Name="RadioButtonSocks4" GroupName="ProxyIsYesNo" Content="Socks4" Visibility="Collapsed" Grid.Column="3" Grid.Row="0" VerticalAlignment="Center" />
|
||||
<RadioButton x:Name="RadioButtonProxyNoLogin" Content="{DynamicResource RadioButtonProxyNoLogin}" GroupName="proxyYesNOLogin" Grid.Column="4" Checked="RadioButtonProxyNoLogin_Checked" VerticalAlignment="Center" ></RadioButton>
|
||||
<RadioButton x:Name="RadiobuttonProxyYesLogin" Content="{DynamicResource RadiobuttonProxyYesLogin}" GroupName="proxyYesNOLogin" Grid.Column="5" Checked="RadiobuttonProxyYesLogin_Checked" VerticalAlignment="Center" ></RadioButton>
|
||||
|
||||
</Grid>
|
||||
<Grid Grid.Row="3">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="80"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition Width="70"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition Width="70"></ColumnDefinition>
|
||||
<ColumnDefinition Width="80"></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<!--代理设置-->
|
||||
<TextBlock x:Name="TextBlockProxyHost" IsEnabled="False" Text="{DynamicResource TextBlockProxyHost}" HorizontalAlignment="Right" Margin="5,10,0,5" Grid.Column="0" Grid.Row="0" VerticalAlignment="Center" />
|
||||
<TextBox x:Name="TextBoxProxyHost" IsEnabled="False" Text="127.0.0.1" Margin="3" Grid.Column="1" Grid.Row="0" />
|
||||
<TextBlock x:Name="TextBlockProxyPort" IsEnabled="False" Text="{DynamicResource TextBlockHostPart}" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="5" Grid.Column="2" Grid.Row="0"></TextBlock>
|
||||
<TextBox x:Name="TextBoxProxyPort" IsEnabled="False" CommandManager.PreviewExecuted="TextBoxPort_PreviewExecuted" Text="1080" Margin="3" Grid.Column="3" Grid.Row="0" PreviewTextInput="TextBoxPort_PreviewTextInput" />
|
||||
<!--代理用户名密码设置-->
|
||||
<TextBlock x:Name="TextBlockProxyUser" IsEnabled="False" Text="{DynamicResource TextBlockHostUser}" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="5" Grid.Column="0" Grid.Row="1" ></TextBlock>
|
||||
<TextBlock x:Name="TextBlockProxyPassword" IsEnabled="False" Text="{DynamicResource TextBlockHostPassword}" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="5" Grid.Column="2" Grid.Row="1" ></TextBlock>
|
||||
<TextBox x:Name="TextBoxProxyUserName" IsEnabled="False" Text="" Margin="3" Grid.Column="1" Grid.Row="1" />
|
||||
<PasswordBox x:Name="PasswordBoxProxyPassword" IsEnabled="False" Password="" Margin="3" Grid.Column="3" Grid.Row="1"></PasswordBox>
|
||||
|
||||
</Grid>
|
||||
</Grid>
|
||||
<Grid Grid.Row="1">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="20"></RowDefinition>
|
||||
<RowDefinition Height="20"></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<TextBlock x:Name="TextBlockSetUpProcessing" Text="{DynamicResource TextBlockSetUpProcessing}" Foreground="Blue" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Row="0"></TextBlock>
|
||||
<ProgressBar x:Name="ProgressBarSetUpProcessing" Minimum="0" Maximum="100" Value="{Binding InsertBindingHere}" Margin="10,0,10,3" Grid.Row="1"></ProgressBar>
|
||||
<TextBlock Text="{Binding ElementName=ProgressBarSetUpProcessing, Path=Value, StringFormat={}{0:0}%}" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Row="1"/>
|
||||
<TextBox x:Name="TextBoxMonitorCommandResults" IsReadOnly="True" TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" Grid.Row="2" Margin="10,0,10,3"></TextBox>
|
||||
|
||||
</Grid>
|
||||
<Grid Grid.Row="2">
|
||||
<TabControl Grid.Column="0" Grid.Row="9" Grid.ColumnSpan="4" Grid.RowSpan="3">
|
||||
<TabItem Header="V2Ray" Width="80" Height="30">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="50"></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="60"></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!--<Button x:Name="ButtonGuideConfiguration" Visibility="Visible" Content="启用向导" Grid.Column="0" Grid.Row="0" Click="ButtonGuideConfiguration_Click"></Button>
|
||||
<TextBlock Text="通过向导生成配置文件" Visibility="Visible" Grid.Column="0" Grid.Row="1" Grid.RowSpan="2" HorizontalAlignment="Center"></TextBlock>-->
|
||||
<Button x:Name="ButtonTemplateConfiguration" Content="{DynamicResource ButtonV2RayTemplateConfiguration}" Grid.Column="1" Grid.Row="0" Margin="5" Click="ButtonTemplateConfiguration_Click"></Button>
|
||||
<!--<TextBlock Text="模板库" Grid.Column="1" Grid.Row="1" Grid.RowSpan="2" HorizontalAlignment="Center"></TextBlock>-->
|
||||
<!--<Button x:Name="ButtonAdvancedConfiguration" Visibility="Visible" Content="配置编辑器" Grid.Column="2" Grid.Row="0" Click="ButtonAdvancedConfiguration_Click"></Button>
|
||||
<TextBlock Text="配置文件高级生成器
(有经验用户可以使用)" Visibility="Visible" Grid.Column="2" Grid.Row="1" Grid.RowSpan="2" HorizontalAlignment="Center"></TextBlock>-->
|
||||
<!--<RadioButton x:Name="RadioButtonGuideConfiguration" Content="向导生成配置" Grid.Column="0" Grid.Row="0"></RadioButton>
|
||||
<RadioButton x:Name="RadioButtonTemplateConfiguration" Content="模板配置" Grid.Column="0" Grid.Row="1"></RadioButton>
|
||||
<RadioButton x:Name="RadioButtonAdvancedConfiguration" Content="高级配置" Grid.Column="0" Grid.Row="2"></RadioButton>
|
||||
<TextBox x:Name="TextBoxJsonPath" Margin="10" Grid.Column="1" Grid.Row="1"></TextBox>
|
||||
<Button x:Name="ButtonSetConfiguration" Margin="6" Content="配置" Grid.Column="2" Grid.Row="2" Click="ButtonSetConfiguration_Click"></Button>-->
|
||||
|
||||
<Grid Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="3">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.5*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Text="{DynamicResource TextBlockCurrentlySelectedPlan}" Grid.Column="0" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center" ></TextBlock>
|
||||
<TextBlock x:Name="TextBlockCurrentlySelectedPlan" Text="{DynamicResource TextBlockCurrentlySelectedPlanNo}" Grid.Column="1" Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<Grid x:Name="GridV2rayCurrentlyPlan" Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="2" Grid.RowSpan="5">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.5*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock x:Name="TextBlockV2RayShowPort" Text="{DynamicResource TextBlockV2RayServerPort}" Grid.Column="0" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockCurrentlySelectedPlanPort" Grid.Column="1" Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
|
||||
<TextBlock x:Name="TextBlockV2RayShowUUID" Text="UUID:" Grid.Column="0" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockCurrentlySelectedPlanUUID" Grid.Column="1" Grid.Row="1" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
|
||||
<TextBlock x:Name="TextBlockV2RayShowPathSeedKey" Text="Path/mKCP Seed/Quic Key" Visibility="Collapsed" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockCurrentlySelectedPlanPathSeedKey" Visibility="Collapsed" Grid.Column="1" Grid.Row="2" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
|
||||
<Grid x:Name="GridVlessVmessXtlsTcpWs" Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock x:Name="TextBlockPathVlessWs" Text="{DynamicResource TextBlockV2RayVlessWsPath}" Grid.Column="0" Grid.Row="3" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockBoxPathVlessWS" Grid.Column="1" Grid.Row="3" Margin="0"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockPathVmessTcp" Text="{DynamicResource TextBlockV2RayVmessTcpPath}" Grid.Column="2" Grid.Row="3" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockBoxPathVmessTcp" Grid.Column="3" Grid.Row="3" Margin="0"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockPathVmessWs" Text="{DynamicResource TextBlockV2RayVmessWsPath}" Grid.Column="4" Grid.Row="3" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockBoxPathVmessWS" Grid.Column="5" Grid.Row="3" Margin="0"></TextBlock>
|
||||
|
||||
</Grid>
|
||||
|
||||
<TextBlock x:Name="TextBlockV2RayShowCurrentlySelectedPlanDomain" Text="Domain/Quic Encrypt" Grid.Column="0" Grid.Row="3" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockCurrentlySelectedPlanDomain" Grid.Column="1" Grid.Row="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
|
||||
<TextBlock x:Name="TextBlockV2RayShowCurrentlySelectedPlanFakeWebsite" Text="{DynamicResource TextBlockV2RayMaskSites}" Grid.Column="0" Grid.Row="4" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockCurrentlySelectedPlanFakeWebsite" Grid.Column="1" Grid.Row="4" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
</Grid>
|
||||
</Grid>
|
||||
|
||||
<Button x:Name="Button_Login" Content="{DynamicResource ButtonV2RayOneKeyInstall}" Margin="10" Grid.Column="0" Grid.Row="2" Click="Button_Login_Click"></Button>
|
||||
<Button x:Name="ButtonUpdateV2ray" Content="{DynamicResource ButtonUpdateV2ray}" Margin="10" Grid.Column="1" Grid.Row="2" Click="ButtonUpdateV2ray_Click"></Button>
|
||||
<Button x:Name="Button_canel" Content="{DynamicResource Button_canel}" Margin="10" Grid.Column="2" Grid.Row="2" Click="Button_canel_Click"></Button>
|
||||
</Grid>
|
||||
</TabItem>
|
||||
<TabItem Header="Trojan-Go" Width="80" Height="30">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="50"></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="60"></RowDefinition>
|
||||
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!--<Button x:Name="ButtonTrojanTemplate" Content="Trojan参数设置" Grid.Column="1" Grid.Row="0" Margin="5" Click="ButtonTrojanTemplate_Click"/>-->
|
||||
<!--<TextBlock Text="Trojan参数设置" Grid.Column="1" Grid.Row="1" Grid.RowSpan="2" HorizontalAlignment="Center"></TextBlock>-->
|
||||
<Button x:Name="ButtonTrojanGoTemplate" Content="{DynamicResource ButtonTrojanGoTemplate}" Grid.Column="1" Grid.Row="0" Margin="5" Click="ButtonTrojanGoTemplate_Click"/>
|
||||
|
||||
<Grid Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="3">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.5*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Text="{DynamicResource TextBlockCurrentlySelectedPlan}" Grid.Column="0" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center" ></TextBlock>
|
||||
<TextBlock x:Name="TextBlockTrojanGoShowPort" Text="{DynamicResource TextBlockV2RayServerPort}" Grid.Column="0" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Hidden"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockTrojanGoShowPassword" Text="UUID:" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Hidden"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockTrojanGoShowPath" Grid.Column="0" Grid.Row="3" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Hidden"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockTrojanGoShowCurrentlySelectedPlanDomain" Text="{DynamicResource TextBlockV2RayDomain}" Grid.Column="0" Grid.Row="4" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Hidden"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockTrojanGoShowCurrentlySelectedPlanFakeWebsite" Text="{DynamicResource TextBlockV2RayMaskSites}" Grid.Column="0" Grid.Row="5" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Hidden"></TextBlock>
|
||||
|
||||
<TextBlock x:Name="TextBlockTrojanGoCurrentlySelectedPlan" Text="{DynamicResource TextBlockCurrentlySelectedPlanNo}" Grid.Column="1" Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockTrojanGoCurrentlySelectedPlanPort" Grid.Column="1" Grid.Row="1" HorizontalAlignment="Left" VerticalAlignment="Center" Visibility="Hidden"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockTrojanGoCurrentlySelectedPlanPassword" Grid.Column="1" Grid.Row="2" HorizontalAlignment="Left" VerticalAlignment="Center" Visibility="Hidden"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockTrojanGoCurrentlySelectedPlanPathSeedKey" Grid.Column="1" Grid.Row="3" HorizontalAlignment="Left" VerticalAlignment="Center" Visibility="Hidden"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockTrojanGoCurrentlySelectedPlanDomain" Grid.Column="1" Grid.Row="4" HorizontalAlignment="Left" VerticalAlignment="Center" Visibility="Hidden"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockTrojanGoCurrentlySelectedPlanFakeWebsite" Grid.Column="1" Grid.Row="5" HorizontalAlignment="Left" VerticalAlignment="Center" Visibility="Hidden"></TextBlock>
|
||||
|
||||
</Grid>
|
||||
|
||||
<Button x:Name="ButtonTrojanGoSetUp" Content="{DynamicResource ButtonTrojanGoSetUp}" Margin="10" Grid.Column="0" Grid.Row="2" Click="ButtonTrojanGoSetUp_Click"/>
|
||||
<Button x:Name="ButtonUpdateTrojanGo" Content="{DynamicResource ButtonUpdateTrojanGo}" Margin="10" Grid.Column="1" Grid.Row="2" Click="ButtonUpdateTrojanGo_Click"></Button>
|
||||
<Button x:Name="ButtonTrojanGoCancel" Content="{DynamicResource ButtonTrojanGoCancel}" Margin="10" Grid.Column="2" Grid.Row="2" Click="Button_canel_Click"></Button>
|
||||
</Grid>
|
||||
</TabItem>
|
||||
<TabItem Header="Trojan" Width="80" Height="30">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="60"></RowDefinition>
|
||||
|
||||
</Grid.RowDefinitions>
|
||||
<GroupBox Header="{DynamicResource GroupBoxHeaderParameterTrojan}" Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="3" Grid.RowSpan="2">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.5*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition Width="0.4*"></ColumnDefinition>
|
||||
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Text="{DynamicResource TextBlockTrojanTemplateExplanation}" Grid.Column="1" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBlock Text="{DynamicResource TextBlockTrojanServerDomain}" Grid.Column="0" Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="5"></TextBlock>
|
||||
<TextBox x:Name="TextBoxTrojanHostDomain" Style="{StaticResource TitleText}" Tag="{DynamicResource TextBoxDomainPrompt}" Grid.Column="1" Grid.Row="1" Margin="3"></TextBox>
|
||||
<TextBlock Text="{DynamicResource TextBlockTrojanPort}" Grid.Column="2" Grid.Row="1" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<!--<TextBlock Text="用户名:" Grid.Column="0" Grid.Row="2"></TextBlock>
|
||||
<TextBox x:Name="TextBoxUser" Grid.Column="1" Grid.Row="2" Margin="3"></TextBox>
|
||||
<Button x:Name="ButtonNaiveUser" Content="随机" Grid.Column="2" Grid.Row="2" Margin="2" Click="ButtonNaiveUser_Click"></Button>-->
|
||||
<TextBlock Text="{DynamicResource TextBlockTrojanHostPassword}" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="5"></TextBlock>
|
||||
<TextBox x:Name="TextBoxTrojanPassword" Grid.Column="1" Grid.Row="2" Margin="3"></TextBox>
|
||||
<Button x:Name="ButtonTrojanPassword" Content="{DynamicResource ButtonTrojanChangePassword}" Grid.Column="2" Grid.Row="2" Margin="2" Click="ButtonTrojanPassword_Click" ></Button>
|
||||
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayMaskSites}" Grid.Column="0" Grid.Row="3" Visibility="Collapsed"></TextBlock>
|
||||
<TextBox x:Name="TextBoxTrojanSites" Style="{StaticResource TitleText}" Tag="{DynamicResource TextBoxV2RayMaskSitesTag}" Grid.Column="1" Grid.Row="3" Margin="3" Visibility="Collapsed"></TextBox>
|
||||
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
|
||||
<!--<Button x:Name="ButtonTrojanTemplate" Content="Trojan参数设置" Grid.Column="1" Grid.Row="0" Margin="5" Click="ButtonTrojanTemplate_Click"/>-->
|
||||
<!--<TextBlock Text="Trojan参数设置" Grid.Column="1" Grid.Row="1" Grid.RowSpan="2" HorizontalAlignment="Center"></TextBlock>-->
|
||||
<!--<Button x:Name="ButtonTrojanGoTemplate" Content="Trojan-Go参数设置" Grid.Column="2" Grid.Row="0" Margin="5" Click="ButtonTrojanGoTemplate_Click"/>-->
|
||||
|
||||
|
||||
<Button x:Name="ButtonTrojanSetUp" Content="{DynamicResource ButtonTrojanSetUp}" Grid.Column="0" Grid.Row="2" Margin="10" Click="ButtonTrojanSetUp_Click"/>
|
||||
<Button x:Name="ButtonUpdateTrojan" Content="{DynamicResource ButtonUpdateTrojan}" Grid.Column="1" Grid.Row="2" Margin="10" Click="ButtonUpdateTrojan_Click"></Button>
|
||||
<Button x:Name="ButtonTrojanCancel" Content="{DynamicResource ButtonTrojanCancel}" Grid.Column="2" Grid.Row="2" Margin="10" Click="Button_canel_Click"></Button>
|
||||
</Grid>
|
||||
</TabItem>
|
||||
<TabItem x:Name="TabItemNaiveProxy" Header="NaiveProxy" Width="80" Height="30">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="60"></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<GroupBox Header="{DynamicResource GroupBoxHeaderParameterTrojan}" Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="3" Grid.RowSpan="2">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.4*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition Width="0.4*"></ColumnDefinition>
|
||||
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Text="{DynamicResource TextBlockNaiveProxyTemplateExplanation}" Grid.Column="1" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBlock Text="{DynamicResource TextBlockTrojanServerDomain}" Grid.Column="0" Grid.Row="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxNaiveHostDomain" Style="{StaticResource TitleText}" Tag="{DynamicResource TextBoxDomainPrompt}" Grid.Column="1" Grid.Row="1" Margin="3"></TextBox>
|
||||
<TextBlock Text="{DynamicResource TextBlockTrojanPort}" Grid.Column="2" Grid.Row="1" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBlock Text="{DynamicResource TextBlockHostUser}" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxNaiveUser" Grid.Column="1" Grid.Row="2" Margin="3"></TextBox>
|
||||
<Button x:Name="ButtonNaiveUser" Content="{DynamicResource ButtonNaiveProxyChangeUser}" Grid.Column="2" Grid.Row="2" Margin="2" Click="ButtonNaiveUser_Click"></Button>
|
||||
<TextBlock Text="{DynamicResource TextBlockTrojanHostPassword}" Grid.Column="0" Grid.Row="3" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxNaivePassword" Grid.Column="1" Grid.Row="3" Margin="3"></TextBox>
|
||||
<Button x:Name="ButtonNaivePassword" Content="{DynamicResource ButtonTrojanChangePassword}" Grid.Column="2" Grid.Row="3" Margin="2" Click="ButtonNaivePassword_Click"></Button>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayMaskSites}" Grid.Column="0" Grid.Row="4" Visibility="Collapsed"></TextBlock>
|
||||
<TextBox x:Name="TextBoxNaiveSites" Style="{StaticResource TitleText}" Tag="{DynamicResource TextBoxV2RayMaskSitesTag}" Grid.Column="1" Grid.Row="4" Margin="3" Visibility="Collapsed"></TextBox>
|
||||
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
<!--<Button x:Name="ButtonNaiveTemplate" Content="Naive设置" Grid.Column="1" Grid.Row="0" Margin="5" Click="ButtonTrojanTemplate_Click"/>
|
||||
<TextBlock Text="Naive参数设置" Grid.Column="1" Grid.Row="1" Grid.RowSpan="2" HorizontalAlignment="Center"></TextBlock>-->
|
||||
|
||||
<Button x:Name="ButtonNavieSetUp" Content="{DynamicResource ButtonNavieSetUp}" Grid.ColumnSpan="1" Margin="10" Grid.Column="0" Grid.Row="2" Click="ButtonNavieSetUp_Click"/>
|
||||
<Button x:Name="ButtonNaiveCancel" Content="{DynamicResource ButtonNaiveCancel}" Grid.ColumnSpan="1" Margin="10" Grid.Column="2" Grid.Row="2" Click="Button_canel_Click"></Button>
|
||||
</Grid>
|
||||
</TabItem>
|
||||
|
||||
<TabItem Header="SSR" Width="60" Height="30">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="60"></RowDefinition>
|
||||
|
||||
</Grid.RowDefinitions>
|
||||
<GroupBox Header="{DynamicResource GroupBoxHeaderParameterTrojan}" Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="3" Grid.RowSpan="2">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.5*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition Width="0.4*"></ColumnDefinition>
|
||||
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Text="{DynamicResource TextBlockSSRTemplateExplanation}" Grid.Column="1" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBlock Text="{DynamicResource TextBlockTrojanServerDomain}" Grid.Column="0" Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="5"></TextBlock>
|
||||
<TextBox x:Name="TextBoxSSRHostDomain" Style="{StaticResource TitleText}" Tag="{DynamicResource TextBoxDomainPrompt}" Grid.Column="1" Grid.Row="1" Margin="3"></TextBox>
|
||||
<TextBlock Text="{DynamicResource TextBlockTrojanPort}" Grid.Column="2" Grid.Row="1" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<!--<TextBlock Text="用户名:" Grid.Column="0" Grid.Row="2"></TextBlock>
|
||||
<TextBox x:Name="TextBoxUser" Grid.Column="1" Grid.Row="2" Margin="3"></TextBox>
|
||||
<Button x:Name="ButtonNaiveUser" Content="随机" Grid.Column="2" Grid.Row="2" Margin="2" Click="ButtonNaiveUser_Click"></Button>-->
|
||||
<TextBlock Text="{DynamicResource TextBlockTrojanHostPassword}" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="5"></TextBlock>
|
||||
<TextBox x:Name="TextBoxSSRPassword" Grid.Column="1" Grid.Row="2" Margin="3"></TextBox>
|
||||
<Button x:Name="ButtonSSRPassword" Content="{DynamicResource ButtonTrojanChangePassword}" Grid.Column="2" Grid.Row="2" Margin="2" Click="ButtonSSRPassword_Click" ></Button>
|
||||
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayMaskSites}" Grid.Column="0" Grid.Row="3" Visibility="Collapsed"></TextBlock>
|
||||
<TextBox x:Name="TextBoxSSRSites" Style="{StaticResource TitleText}" Tag="{DynamicResource TextBoxV2RayMaskSitesTag}" Grid.Column="1" Grid.Row="3" Margin="3" Visibility="Collapsed"></TextBox>
|
||||
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
|
||||
<Button x:Name="ButtonSSRSetUp" Content="{DynamicResource ButtonSSRSetUp}" Grid.Column="0" Grid.Row="2" Margin="10" Click="ButtonSSRSetUp_Click"/>
|
||||
<!--<Button x:Name="ButtonUpdateTrojan" Content="{DynamicResource ButtonUpdateTrojan}" Grid.Column="1" Grid.Row="2" Margin="10" Click="ButtonUpdateTrojan_Click"></Button>-->
|
||||
<Button x:Name="ButtonSSRCancel" Content="{DynamicResource ButtonTrojanCancel}" Grid.Column="2" Grid.Row="2" Margin="10" Click="Button_canel_Click"></Button>
|
||||
</Grid>
|
||||
</TabItem>
|
||||
|
||||
<TabItem Header="SS" Width="60" Height="30">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="50"></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="60"></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<Button x:Name="ButtonTemplateConfigurationSS" Content="{DynamicResource ButtonTemplateConfigurationSS}" Grid.Column="1" Grid.Row="0" Margin="5" Click="ButtonTemplateConfigurationSS_Click"></Button>
|
||||
|
||||
<Grid Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="3">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.5*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Text="{DynamicResource TextBlockCurrentlySelectedPlan}" Grid.Column="0" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center" ></TextBlock>
|
||||
<TextBlock x:Name="TextBlockShowPortSS" Text="{DynamicResource TextBlockV2RayServerPort}" Grid.Column="0" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Collapsed"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockShowUUIDSS" Text="{DynamicResource TextBlockTrojanHostPassword}" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Collapsed"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockShowMethodSS" Text="{DynamicResource TextBlockEncryption}" Grid.Column="0" Grid.Row="3" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Collapsed"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockShowDomainSS" Text="{DynamicResource TextBlockV2RayDomain}" Grid.Column="0" Grid.Row="4" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Collapsed"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockShowPathSS" Text="{DynamicResource TextBlockTrojanGoWebSocketPath}" Grid.Column="0" Grid.Row="5" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Collapsed"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockShowFakeWebsiteSS" Text="{DynamicResource TextBlockV2RayMaskSites}" Grid.Column="0" Grid.Row="5" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Hidden"></TextBlock>
|
||||
|
||||
<TextBlock x:Name="TextBlockCurrentlySelectedPlanSS" Text="{DynamicResource TextBlockCurrentlySelectedPlanNo}" Grid.Column="1" Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
|
||||
<TextBlock x:Name="TextBlockCurrentlySelectedPlanPortSS" Grid.Column="1" Grid.Row="1" HorizontalAlignment="Left" VerticalAlignment="Center" Visibility="Visible"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockCurrentlySelectedPlanUUIDSS" Grid.Column="1" Grid.Row="2" HorizontalAlignment="Left" VerticalAlignment="Center" Visibility="Visible"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockCurrentlySelectedPlanMethodSS" Grid.Column="1" Grid.Row="3" HorizontalAlignment="Left" VerticalAlignment="Center" Visibility="Visible"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockCurrentlySelectedPlanDomainSS" Grid.Column="1" Grid.Row="4" HorizontalAlignment="Left" VerticalAlignment="Center" Visibility="Visible"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockCurrentlySelectedPlanPathSS" Grid.Column="1" Grid.Row="5" HorizontalAlignment="Left" VerticalAlignment="Center" Visibility="Visible"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockCurrentlySelectedPlanFakeWebsiteSS" Grid.Column="1" Grid.Row="5" HorizontalAlignment="Left" VerticalAlignment="Center" Visibility="Hidden"></TextBlock>
|
||||
|
||||
</Grid>
|
||||
|
||||
<Button x:Name="Button_LoginSS" Content="{DynamicResource ButtonSetUpSS}" Margin="10" Grid.Column="0" Grid.Row="2" Click="Button_LoginSS_Click"></Button>
|
||||
<!--<Button x:Name="ButtonUpdateSS" Content="{DynamicResource ButtonUpdateV2ray}" Margin="10" Grid.Column="1" Grid.Row="2" Click="ButtonUpdateV2ray_Click"></Button>-->
|
||||
<Button x:Name="Button_canelSS" Content="{DynamicResource Button_canel}" Margin="10" Grid.Column="2" Grid.Row="2" Click="Button_canel_Click"></Button>
|
||||
</Grid>
|
||||
</TabItem>
|
||||
|
||||
<TabItem Header="MTProto" Width="70" Height="30">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="60"></RowDefinition>
|
||||
|
||||
</Grid.RowDefinitions>
|
||||
<GroupBox Header="{DynamicResource GroupBoxHeaderParameterTrojan}" Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="3" Grid.RowSpan="2">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.2*"></ColumnDefinition>
|
||||
<ColumnDefinition Width="0.5*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Text="{DynamicResource TextBlockMtgTemplateExplanation}" Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="3" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBlock Text="{DynamicResource TextBlockHostPart}" Grid.Column="0" Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="5"></TextBlock>
|
||||
<TextBox x:Name="TextBoxMtgHostDomain" Text="443" Grid.Column="1" Grid.Row="1" Margin="3"></TextBox>
|
||||
<TextBlock Text="{DynamicResource TextBlockMtgPortExplanation}" Grid.Column="2" Grid.Row="1" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBlock Text="{DynamicResource TextBlockHostCert}" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="5"></TextBlock>
|
||||
<TextBlock Grid.Column="1" Grid.Row="2" Grid.ColumnSpan="2" Text="{DynamicResource TextBlockMtgSecretExplanation}" VerticalAlignment="Center"></TextBlock>
|
||||
<!--<TextBox x:Name="TextBoxMtgPassword" Grid.Column="1" Grid.Row="2" Margin="3"></TextBox>
|
||||
<Button x:Name="ButtonMtgPassword" Content="{DynamicResource ButtonTrojanChangePassword}" Grid.Column="2" Grid.Row="2" Margin="2" Click="ButtonSSRPassword_Click" ></Button>-->
|
||||
|
||||
<TextBlock Text="{DynamicResource TextBlockMtgFakeDomainExplanation}" Grid.Column="0" Grid.Row="3" VerticalAlignment="Center" HorizontalAlignment="Right"></TextBlock>
|
||||
<TextBox x:Name="TextBoxMtgSites" Style="{StaticResource TitleText}" Tag="azure.microsoft.com" Grid.Column="1" Grid.Row="3" Margin="3" ></TextBox>
|
||||
<TextBlock Text="{DynamicResource TextBoxV2RayMaskSitesTag}" Grid.Column="2" Grid.Row="3" VerticalAlignment="Center" HorizontalAlignment="Left"></TextBlock>
|
||||
|
||||
<TextBlock Text="TAG" Grid.Column="0" Grid.Row="4" VerticalAlignment="Center" HorizontalAlignment="Right" Visibility="Collapsed"></TextBlock>
|
||||
<TextBox x:Name="TextBoxMtgTag" Style="{StaticResource TitleText}" Tag="{DynamicResource TextBoxV2RayMaskSitesTag}" Grid.Column="1" Grid.Row="4" Margin="3" Visibility="Collapsed"></TextBox>
|
||||
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
|
||||
<Button x:Name="ButtonMtgSetUp" Content="{DynamicResource ButtonMtgSetUp}" Grid.Column="0" Grid.Row="2" Margin="10" Click="ButtonMtgSetUp_Click" />
|
||||
<!--<Button x:Name="ButtonUpdateTrojan" Content="{DynamicResource ButtonUpdateTrojan}" Grid.Column="1" Grid.Row="2" Margin="10" Click="ButtonUpdateTrojan_Click"></Button>-->
|
||||
<Button x:Name="ButtonMtgCancel" Content="{DynamicResource ButtonTrojanCancel}" Grid.Column="2" Grid.Row="2" Margin="10" Click="Button_canel_Click"></Button>
|
||||
</Grid>
|
||||
</TabItem>
|
||||
|
||||
<!--<TabItem Header="三合一" Width="100" Height="30" Visibility="Collapsed">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<Grid Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="4" Grid.RowSpan="2">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.55*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition Width="0.5*"></ColumnDefinition>
|
||||
<ColumnDefinition Width="0.55*"></ColumnDefinition>
|
||||
<ColumnDefinition ></ColumnDefinition>
|
||||
<ColumnDefinition Width="0.5*"></ColumnDefinition>
|
||||
<ColumnDefinition Width="0.55*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition Width="0.5*"></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Text="安装V2ray,Trojan,NaiveProxy在一台VPS中,此处方案仅为实验性的,偏重娱乐性,相比单一代理,并不具优势,可依自己喜好来是否选用。" Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="8" Margin="0"></TextBlock>
|
||||
<TextBlock Text="*共用设置*" Grid.Column="0" Grid.Row="1" Margin="3"></TextBlock>
|
||||
<TextBlock Text="地址(域名):" Grid.Column="0" Grid.Row="2" Margin="3"></TextBlock>
|
||||
<TextBox x:Name="TextBoxDomain3in1" Text="" Style="{StaticResource TitleText}" Tag="IP或域名(不可为空)" Grid.Column="1" Grid.Row="2" Margin="3"></TextBox>
|
||||
<TextBlock Text="端口:443" Grid.Column="2" Grid.Row="2" Margin="3"></TextBlock>
|
||||
-->
|
||||
<!--<TextBox x:Name="TextBoxPort3in1" Text="443" IsReadOnly="True" Grid.Column="3" Grid.Row="2" Margin="3"></TextBox>
|
||||
|
||||
<TextBlock Text="伪装网站:" Grid.Column="3" Grid.Row="2" Margin="3"></TextBlock>
|
||||
<TextBox x:Name="TextBoxSites3in1" Text="" Style="{StaticResource TitleText}" Tag="伪装网站域名(可为空)" Grid.Column="4" Grid.Row="2" Margin="3"></TextBox>
|
||||
|
||||
<TextBlock Text="*V2ray设置*" Grid.Column="0" Grid.Row="3" Margin="3"></TextBlock>
|
||||
<TextBlock Text="UUID:" Grid.Column="0" Grid.Row="4" Margin="3"></TextBlock>
|
||||
<TextBox x:Name="TextBoxV2rayUUID3in1" Grid.Column="1" Grid.Row="4" Margin="3"></TextBox>
|
||||
<Button x:Name="ButtonV2rayUUID3in1" Content="更新" Grid.Column="2" Grid.Row="4" Margin="3" Click="ButtonV2rayUUID3in1_Click"></Button>
|
||||
<TextBlock Text="路径(Path):" Grid.Column="0" Grid.Row="5" Margin="3"></TextBlock>
|
||||
<TextBox x:Name="TextBoxV2rayPath3in1" Grid.Column="1" Grid.Row="5" Margin="3"></TextBox>
|
||||
<Button x:Name="ButtonV2rayPath3in1" Content="随机" Grid.Column="2" Grid.Row="5" Margin="3" Click="ButtonV2rayPath3in1_Click"></Button>
|
||||
|
||||
<TextBlock Text="*Trojan设置*" Grid.Column="3" Grid.Row="3" Margin="3"></TextBlock>
|
||||
<TextBlock Text="密码:" Grid.Column="3" Grid.Row="4" Margin="3"></TextBlock>
|
||||
<TextBox x:Name="TextBoxTrojanPassword3in1" Grid.Column="4" Grid.Row="4" Margin="3"></TextBox>
|
||||
<Button x:Name="ButtonTrojanPassword3in1" Content="更新" Grid.Column="5" Grid.Row="4" Margin="3" Click="ButtonTrojanPassword3in1_Click"></Button>
|
||||
|
||||
<TextBlock Text="*Naive设置*" Grid.Column="6" Grid.Row="3" Margin="3"></TextBlock>
|
||||
<TextBlock Text="用户名:" Grid.Column="6" Grid.Row="4" Margin="3"></TextBlock>
|
||||
<TextBox x:Name="TextBoxNaiveUser3in1" Grid.Column="7" Grid.Row="4" Margin="3"></TextBox>
|
||||
<Button x:Name="ButtonNaiveUser3in1" Content="随机" Grid.Column="8" Grid.Row="4" Margin="3" Click="ButtonNaiveUser3in1_Click"></Button>
|
||||
<TextBlock Text="密码:" Grid.Column="6" Grid.Row="5" Margin="3"></TextBlock>
|
||||
<TextBox x:Name="TextBoxNaivePassword3in1" Grid.Column="7" Grid.Row="5" Margin="3"></TextBox>
|
||||
<Button x:Name="ButtonNaivePassword3in1" Content="随机" Grid.Column="8" Grid.Row="5" Margin="3" Click="ButtonNaivePassword3in1_Click"></Button>
|
||||
</Grid>
|
||||
</Grid>
|
||||
<Button x:Name="Button_Login3in1" Content="一键安装" Grid.ColumnSpan="1" Margin="10" Grid.Column="0" Grid.Row="2" Click="Button_Login3in1_Click"/>
|
||||
<Button x:Name="Button_canel3in1" Content="取消" Grid.ColumnSpan="1" Margin="10" Grid.Column="2" Grid.Row="2" Click="Button_canel_Click"></Button>
|
||||
</Grid>
|
||||
</TabItem>-->
|
||||
|
||||
<TabItem Header="{DynamicResource TabItemHeaderSysTools}" Width="90" Height="30">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<Button x:Name="ButtonProofreadTime" Content="{DynamicResource ButtonProofreadTime}" Grid.Column="0" Grid.Row="0" Margin="5" Click="ButtonProofreadTime_Click"/>
|
||||
<Button x:Name="ButtonClearOccupiedPorts" Content="{DynamicResource ButtonClearOccupiedPorts}" Grid.Column="1" Grid.Row="0" Margin="5" Click="ButtonClearOccupiedPorts_Click"></Button>
|
||||
<Button x:Name="ButtonTestAndEnableBBR" Content="{DynamicResource ButtonTestAndEnableBBR}" Grid.Column="2" Grid.Row="0" Margin="5" Click="ButtonTestAndEnableBBR_Click"></Button>
|
||||
<Button x:Name="ButtonRemoveAllSoft" Content="{DynamicResource ButtonRemoveAllSoft}" Grid.Column="3" Grid.Row="0" Margin="5" Click="ButtonRemoveAllSoft_Click"></Button>
|
||||
<Button Content="test" Grid.Column="0" Grid.Row="1" Margin="10" Click="Button_Click" Visibility="Collapsed"></Button>
|
||||
</Grid>
|
||||
</TabItem>
|
||||
|
||||
|
||||
</TabControl>
|
||||
|
||||
</Grid>
|
||||
</Grid>
|
||||
</TabItem>
|
||||
<TabItem Header="{DynamicResource TabItemHeaderResourceTools}" Width="110" Height="30">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<Button x:Name="ButtonWebBrowserHomePage" Content="{DynamicResource ButtonWebBrowserHomePage}" Grid.Column="0" Grid.Row="0" Margin="5" Click="ButtonWebBrowserHomePage_Click"></Button>
|
||||
<Button x:Name="ButtonWebBrowserForward" Content="{DynamicResource ButtonWebBrowserForward}" Grid.Column="2" Grid.Row="0" Margin="5" Click="ButtonWebBrowserForward_Click"></Button>
|
||||
<Button x:Name="ButtonWebBrowserBack" Content="{DynamicResource ButtonWebBrowserBack}" Grid.Column="1" Grid.Row="0" Margin="5" Click="ButtonWebBrowserBack_Click"/>
|
||||
<TextBlock Text="{DynamicResource TextBlockWebExplain}" TextWrapping="Wrap" Grid.Column="4" Grid.Row="0" Grid.ColumnSpan="4"></TextBlock>
|
||||
<!--<TextBox x:Name="TextBoxWebBrowserProxyUrl" Style="{StaticResource TitleText}" Tag="粘贴被墙的网址到这里点击 GO(下面被墙网址右击==复制快捷方式)" Grid.Column="3" Grid.Row="0" Grid.ColumnSpan="5" Margin="5"></TextBox>
|
||||
<Button x:Name="ButtonWebBrowserProxyGo" Content="Go" Grid.Column="8" Grid.Row="0" Margin="5" Click="ButtonWebBrowserProxyGo_Click"></Button>-->
|
||||
<WebBrowser x:Name="WebBrowserResourcesAndTools" Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="9" Grid.RowSpan="13" Source="https://github.com/proxysu/windows/wiki/ResourcesAndTools" />
|
||||
</Grid>
|
||||
</TabItem>
|
||||
<TabItem Header="关于" Width="110" Height="30" Visibility="Collapsed">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.3*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="0.3*"></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<Grid Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="2">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Text="程序版本:1.8.3" Grid.Column="0" Grid.Row="0"></TextBlock>
|
||||
|
||||
</Grid>
|
||||
|
||||
</Grid>
|
||||
</TabItem>
|
||||
|
||||
</TabControl>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Window>
|
File diff suppressed because it is too large
Load diff
|
@ -1,58 +0,0 @@
|
|||
<Window x:Class="ProxySU.ProofreadTimeWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:local="clr-namespace:ProxySU"
|
||||
mc:Ignorable="d"
|
||||
Title="ProofreadTimeWindow" Height="450" Width="600">
|
||||
<Grid>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<Grid Grid.Column="0" Grid.Row="0">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.4*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<RadioButton x:Name="RadioButtonNetworkTime" IsChecked="True" Content="" Grid.Column="0" Grid.Row="0" HorizontalAlignment="Right" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource RadioButtonNetworkTime}" Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
</Grid>
|
||||
<TextBlock Text="{DynamicResource TextBlockNetworkTime}" TextWrapping="Wrap" Grid.Column="0" Grid.Row="1" Grid.RowSpan="2" Margin="20"></TextBlock>
|
||||
|
||||
<Grid Grid.Column="1" Grid.Row="0">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.4*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<RadioButton x:Name="RadioButtonLocalTime" Content="" Grid.Column="0" Grid.Row="0" HorizontalAlignment="Right" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource RadioButtonLocalTime}" Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
</Grid>
|
||||
<TextBlock Text="{DynamicResource TextBlockLocalTime}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="1" Grid.RowSpan="2" Margin="20"></TextBlock>
|
||||
|
||||
<Grid Grid.Column="2" Grid.Row="0">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.4*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<RadioButton x:Name="RadioButtonUpDateLocalTime" Content="" Grid.Column="0" Grid.Row="0" HorizontalAlignment="Right" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource RadioButtonUpDateLocalTime}" Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
</Grid>
|
||||
|
||||
<TextBlock Text="{DynamicResource TextBlockUpDateLocalTime}" TextWrapping="Wrap" Grid.Column="2" Grid.Row="1" Grid.RowSpan="2" Margin="20"></TextBlock>
|
||||
|
||||
<Button x:Name="ButtonTestTime" Content="{DynamicResource ButtonTestTime}" Grid.Column="0" Grid.Row="3" Margin="30" Click="ButtonTestTime_Click"/>
|
||||
<Button x:Name="ButtonProofreading" Content="{DynamicResource ButtonProofreading}" Grid.Column="2" Grid.Row="3" Margin="30" Click="ButtonProofreading_Click"></Button>
|
||||
<!--<Button x:Name="ButtonTEST" Content="测试命令" Grid.Column="1" Grid.Row="3" Margin="30" Click="ButtonTEST_Click"></Button>-->
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Window>
|
|
@ -1,243 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
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;
|
||||
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;
|
||||
using System.Drawing;
|
||||
using QRCoder;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Runtime;
|
||||
using System.Globalization;
|
||||
|
||||
namespace ProxySU
|
||||
{
|
||||
/// <summary>
|
||||
/// ProofreadTimeWindow.xaml 的交互逻辑
|
||||
/// </summary>
|
||||
public partial class ProofreadTimeWindow : Window
|
||||
{
|
||||
public static ConnectionInfo ProfreadTimeReceiveConnectionInfo { get; set; }
|
||||
//ProfreadTimeReceiveParameters
|
||||
|
||||
public ProofreadTimeWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
}
|
||||
|
||||
private void ButtonTestTime_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
using (var client = new SshClient(ProfreadTimeReceiveConnectionInfo))
|
||||
{
|
||||
client.Connect();
|
||||
client.RunCommand("rm -f /etc/localtime");
|
||||
client.RunCommand("ln -s /usr/share/zoneinfo/UTC /etc/localtime");
|
||||
//获取远程主机的时间戳
|
||||
long timeStampVPS = Convert.ToInt64(client.RunCommand("date +%s").Result.ToString());
|
||||
|
||||
//获取本地时间戳
|
||||
TimeSpan ts = DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, 0);
|
||||
long timeStampLocal = Convert.ToInt64(ts.TotalSeconds);
|
||||
client.Disconnect();
|
||||
if (Math.Abs(timeStampLocal - timeStampVPS) >= 90)
|
||||
{
|
||||
|
||||
MessageBox.Show("本地时间与远程主机时间相差超过限制(90秒),V2ray无法建立连接");
|
||||
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox.Show("误差为:" + Math.Abs(timeStampLocal - timeStampVPS).ToString()+" 可以连接");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ButtonProofreading_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (RadioButtonUpDateLocalTime.IsChecked == true)
|
||||
{
|
||||
//将本机电脑与网络时间同步
|
||||
DateTime netUTCtime = NetTime.GetUTCTime();
|
||||
if (!DateTime.Equals(netUTCtime, new DateTime(1970, 1, 1, 0, 0, 0, 0)))
|
||||
{
|
||||
DateTime localTime = netUTCtime.ToLocalTime();
|
||||
bool setD = UpdateTime.SetDate(localTime);
|
||||
if (setD == true)
|
||||
{
|
||||
MessageBox.Show("本机时间已经更新为网络时间(国家授时中心获取)");
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox.Show("更新失败,请重试。");
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
using (var client = new SshClient(ProfreadTimeReceiveConnectionInfo))
|
||||
{
|
||||
client.Connect();
|
||||
//设置vps为UTC时区
|
||||
client.RunCommand("rm -f /etc/localtime");
|
||||
client.RunCommand("ln -s /usr/share/zoneinfo/UTC /etc/localtime");
|
||||
|
||||
if (RadioButtonLocalTime.IsChecked == true)
|
||||
{
|
||||
//以本地时间为准,校正远程主机时间
|
||||
//获取本地时间戳
|
||||
TimeSpan ts = DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, 0);
|
||||
long timeStampLocal = Convert.ToInt64(ts.TotalSeconds);
|
||||
|
||||
string sshCmd = $"date --set=\"$(date \"+%Y-%m-%d %H:%M:%S\" -d @{timeStampLocal.ToString()})\"";
|
||||
|
||||
client.RunCommand(sshCmd);
|
||||
MessageBox.Show("同步本地时间校时完毕");
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
//以网络时间为准,校正远程主机时间
|
||||
TimeSpan utcTS = NetTime.GetUTCTime() - new DateTime(1970, 1, 1, 0, 0, 0, 0);
|
||||
long timeStampVPS = Convert.ToInt64(utcTS.TotalSeconds);
|
||||
if (timeStampVPS!=0)
|
||||
{
|
||||
|
||||
string sshCmd = $"date --set=\"$(date \"+%Y-%m-%d %H:%M:%S\" -d @{timeStampVPS.ToString()})\"";
|
||||
|
||||
client.RunCommand(sshCmd);
|
||||
MessageBox.Show("同步网络时间校时完毕");
|
||||
}
|
||||
|
||||
}
|
||||
client.Disconnect();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//private void ButtonTEST_Click(object sender, RoutedEventArgs e)
|
||||
//{
|
||||
// //NetTime netTime = new NetTime();
|
||||
// string netDatetime = NetTime.GetUTCTime().ToString();
|
||||
// MessageBox.Show(netDatetime);
|
||||
// //NetTime netTime = new NetTime();
|
||||
// //UpdateTime updateTime = new UpdateTime();
|
||||
// //DateTime netDateTime = netTime.GetBeijingTime();
|
||||
// //MessageBox.Show(netDateTime.ToString());
|
||||
//}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 网络时间 代码从网上复制,原网址:https://www.codeleading.com/article/23791981303/
|
||||
/// </summary>
|
||||
public class NetTime
|
||||
{
|
||||
/// <summary>
|
||||
/// 从国家授时中心获取标准GMT时间,读取https://www.tsa.cn
|
||||
/// GMT时间与UTC时间没有差别,可以UTC=GMT
|
||||
/// </summary>
|
||||
/// <returns>返回网络时间</returns>
|
||||
public static DateTime GetUTCTime()
|
||||
{
|
||||
DateTime time;
|
||||
////Thread.Sleep(5000);
|
||||
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 (Exception ex1)
|
||||
{
|
||||
if (ex1.ToString().Contains("403"))
|
||||
{
|
||||
MessageBox.Show("校时操作太频繁,请稍等片刻再操作!");
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox.Show(ex1.Message);
|
||||
}
|
||||
return time = new DateTime(1970, 1, 1, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
//return time.AddHours(8); //GMT要加8个小时才是北京时间
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新系统时间,代码从网上复制,原网址:https://www.open-open.com/code/view/1430552965599
|
||||
/// </summary>
|
||||
public class UpdateTime
|
||||
{
|
||||
//设置系统时间的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,194 +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>{DD5505BC-E7F1-4D03-ABC7-B636E893FC09}</ProjectGuid>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<RootNamespace>ProxySU</RootNamespace>
|
||||
<AssemblyName>ProxySU</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<Deterministic>true</Deterministic>
|
||||
<PublishUrl>publish\</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>0</ApplicationRevision>
|
||||
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
|
||||
<IsWebBootstrapper>false</IsWebBootstrapper>
|
||||
<UseApplicationTrust>false</UseApplicationTrust>
|
||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||
</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>
|
||||
<ApplicationIcon>ProxySU.ico</ApplicationIcon>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Newtonsoft.Json">
|
||||
<HintPath>..\json.net\net40\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="QRCoder">
|
||||
<HintPath>..\qrcoder\net40\QRCoder.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Renci.SshNet">
|
||||
<HintPath>..\ssh.net\net40\Renci.SshNet.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Web" />
|
||||
<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.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="ProofreadTimeWindow.xaml.cs">
|
||||
<DependentUpon>ProofreadTimeWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="ResultClientInformation.xaml.cs">
|
||||
<DependentUpon>ResultClientInformation.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="SSpluginWindow.xaml.cs">
|
||||
<DependentUpon>SSpluginWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="V2RayTemplateWindow.xaml.cs">
|
||||
<DependentUpon>V2RayTemplateWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="TrojanGoTemplateWindow.xaml.cs">
|
||||
<DependentUpon>TrojanGoTemplateWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Page Include="MainWindow.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Compile Include="App.xaml.cs">
|
||||
<DependentUpon>App.xaml</DependentUpon>
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="MainWindow.xaml.cs">
|
||||
<DependentUpon>MainWindow.xaml</DependentUpon>
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Page Include="ProofreadTimeWindow.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="ResultClientInformation.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="SSpluginWindow.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Translations\ProxySU.zh-CN.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Translations\ProxySU.en-US.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Translations\ProxySU.zh-TW.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="V2RayTemplateWindow.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="TrojanGoTemplateWindow.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<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="Properties\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<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="ProxySU.ico" />
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>del "$(TargetDir)*.xml"
|
||||
del "$(TargetDir)*.pdb"
|
||||
del "$(TargetDir)*.zip"
|
||||
mkdir "$(TargetDir)TemplateConfg"
|
||||
xcopy /Y /E /R "$(TargetDir)..\..\..\TemplateConfg\*.*" "$(TargetDir)TemplateConfg\"
|
||||
"$(TargetDir)..\..\..\7z\7z.exe" a $(TargetDir)Release.zip $(TargetDir) -xr!*config
|
||||
rmdir /S /Q "$(TargetDir)..\Beta"
|
||||
mkdir "$(TargetDir)..\Beta"
|
||||
copy /Y "$(TargetDir)Release.zip" "$(TargetDir)..\Beta\Beta.zip"</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<PreBuildEvent>rmdir /S /Q "$(TargetDir)</PreBuildEvent>
|
||||
</PropertyGroup>
|
||||
</Project>
|
|
@ -1,13 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<PublishUrlHistory>publish\</PublishUrlHistory>
|
||||
<InstallUrlHistory />
|
||||
<SupportUrlHistory />
|
||||
<UpdateUrlHistory />
|
||||
<BootstrapperUrlHistory />
|
||||
<ErrorReportUrlHistory />
|
||||
<FallbackCulture>zh-CN</FallbackCulture>
|
||||
<VerifyUploadedFiles>false</VerifyUploadedFiles>
|
||||
</PropertyGroup>
|
||||
</Project>
|
|
@ -1,435 +0,0 @@
|
|||
<Window x:Class="ProxySU.ResultClientInformation"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:local="clr-namespace:ProxySU"
|
||||
mc:Ignorable="d"
|
||||
Title="ResultClientInformation" Height="650" Width="600">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition ></RowDefinition>
|
||||
<RowDefinition Height="0.8*"></RowDefinition>
|
||||
<RowDefinition Height="0.12*"></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<!-- V2Ray客户端配置参数 -->
|
||||
<GroupBox Header="{DynamicResource GroupBoxHeaderClientParameter}" x:Name="GroupBoxV2rayClient" Visibility="Collapsed" Grid.Row="0">
|
||||
<Grid >
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.5*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition Width="0.8*"></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Text="{DynamicResource TextBlockServerAddress}" Grid.Column="0" Grid.Row="0" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxHostAddress" IsReadOnly="True" Grid.Column="1" Grid.Row="0" Margin="2" MouseDoubleClick="TextBoxHostAddress_MouseDoubleClick"></TextBox>
|
||||
<TextBlock x:Name="TextBlockVmessOrVless" Text="" Grid.Column="2" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
|
||||
|
||||
<TextBlock Text="{DynamicResource TextBlockServerPort}" Grid.Column="0" Grid.Row="1" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxPort" IsReadOnly="True" Grid.Column="1" Grid.Row="1" Margin="2" MouseDoubleClick="TextBoxPort_MouseDoubleClick"></TextBox>
|
||||
|
||||
<TextBlock Text="{DynamicResource TextBlockUserUUID}" Grid.Column="0" Grid.Row="2" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxUUID" IsReadOnly="True" Grid.Column="1" Grid.Row="2" Margin="2" MouseDoubleClick="TextBoxUUID_MouseDoubleClick"></TextBox>
|
||||
|
||||
<TextBlock x:Name="TextBlockUUIDextra" Text="{DynamicResource TextBlockV2RayAlterId}" Grid.Column="0" Grid.Row="3" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxUUIDextra" IsReadOnly="False" Grid.Column="1" Grid.Row="3" Margin="2" MouseDoubleClick="TextBoxUUIDextra_MouseDoubleClick"></TextBox>
|
||||
<TextBlock x:Name="TextBlockUUIDextraExplanation" Text="{DynamicResource TextBlockV2RayAlterIdExplain}" TextWrapping="Wrap" Grid.Column="2" Grid.Row="3" VerticalAlignment="Center"></TextBlock>
|
||||
|
||||
<TextBlock Text="{DynamicResource TextBlockEncryption}" Grid.Column="0" Grid.Row="4" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxEncryption" IsReadOnly="True" Grid.Column="1" Grid.Row="4" Margin="2" MouseDoubleClick="TextBoxEncryption_MouseDoubleClick"></TextBox>
|
||||
<TextBlock Text="{DynamicResource TextBlockEncryptionIsAuto}" Grid.Column="2" Grid.Row="4" Visibility="Collapsed" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBlock Text="{DynamicResource TextBlockTransferProtocol}" Grid.Column="0" Grid.Row="5" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxTransmission" IsReadOnly="True" Grid.Column="1" Grid.Row="5" Margin="2" MouseDoubleClick="TextBoxTransmission_MouseDoubleClick"></TextBox>
|
||||
|
||||
<TextBlock Text="{DynamicResource TextBlockCamouflageType}" Grid.Column="0" Grid.Row="6" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxCamouflageType" IsReadOnly="True" Grid.Column="1" Grid.Row="6" Margin="2" MouseDoubleClick="TextBoxCamouflageType_MouseDoubleClick"></TextBox>
|
||||
|
||||
<TextBlock x:Name="TextBlockQuicEncryption" Text="{DynamicResource TextBlockQuicEncryption}" Visibility="Collapsed" Grid.Column="0" Grid.Row="7" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockHost" Text="Host:" Grid.Column="0" Grid.Row="7" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxHostQuicEncryption" IsReadOnly="True" Grid.Column="1" Grid.Row="7" Margin="2" MouseDoubleClick="TextBoxHostQuicEncryption_MouseDoubleClick"></TextBox>
|
||||
|
||||
<TextBlock x:Name="TextBlockPath" Text="{DynamicResource TextBlockClientPath}" Visibility="Visible" Grid.Column="0" Grid.Row="8" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockMkcpSeed" Text="{DynamicResource TextBlockClientMkcpSeed}" Visibility="Collapsed" Grid.Column="0" Grid.Row="8" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockQuicKey" Text="{DynamicResource TextBlockClientQuicKey}" Visibility="Collapsed" Grid.Column="0" Grid.Row="8" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxQuicKeyMkcpSeedPath" IsReadOnly="True" Grid.Column="1" Grid.Row="8" Margin="2" MouseDoubleClick="TextBoxQuicKeyMkcpSeedPath_MouseDoubleClick"></TextBox>
|
||||
|
||||
<TextBlock x:Name="TextBlocTLSonOrNo" Text="{DynamicResource TextBlockIsOrNotTLS}" Grid.Column="0" Grid.Row="9" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxTLS" IsReadOnly="True" Grid.Column="1" Grid.Row="9" Margin="2" MouseDoubleClick="TextBoxTLS_MouseDoubleClick"></TextBox>
|
||||
|
||||
<TextBlock Text="{DynamicResource TextBlockCopyToClipExplain}" Grid.Column="0" Grid.Row="10" Grid.ColumnSpan="2" Margin="5"></TextBlock>
|
||||
<GroupBox x:Name="GroupBoxSelectVlessVmessXtlsTcpWs" Grid.Column="2" Grid.Row="5" Grid.RowSpan="6" Margin="10,0,2,0">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="5"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<RadioButton x:Name="RadioButtonVlessTcpXtls" Content="VLESS over TCP with XTLS" Grid.Column="1" Grid.Row="0" VerticalAlignment="Center" Checked="RadioButtonVlessTcpXtls_Checked"></RadioButton>
|
||||
<RadioButton x:Name="RadioButtonVlessTcpTls" Content="VLESS over TCP with TLS" Grid.Column="1" Grid.Row="1" VerticalAlignment="Center" Checked="RadioButtonVlessTcpTls_Checked"></RadioButton>
|
||||
<RadioButton x:Name="RadioButtonVlessWsTls" Content="VLESS over WS with TLS" Grid.Column="1" Grid.Row="2" VerticalAlignment="Center" Checked="RadioButtonVlessWsTls_Checked"></RadioButton>
|
||||
<RadioButton x:Name="RadioButtonVmessTcpTls" Content="VMess over TCP with TLS" Grid.Column="1" Grid.Row="3" VerticalAlignment="Center" Checked="RadioButtonVmessTcpTls_Checked"></RadioButton>
|
||||
<RadioButton x:Name="RadioButtonVmessWsTls" Content="VMess over WS with TLS" Grid.Column="1" Grid.Row="4" VerticalAlignment="Center" Checked="RadioButtonVmessWsTls_Checked"></RadioButton>
|
||||
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
<!-- Trojan-Go客户端配置参数 -->
|
||||
<GroupBox Header="{DynamicResource GroupBoxHeaderClientParameter}" x:Name="GroupBoxTrojanGoClient" Visibility="Visible" Grid.Row="0">
|
||||
<Grid >
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.5*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="30"></RowDefinition>
|
||||
<RowDefinition Height="30"></RowDefinition>
|
||||
<RowDefinition Height="30"></RowDefinition>
|
||||
<RowDefinition Height="30"></RowDefinition>
|
||||
<RowDefinition Height="30"></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Text="{DynamicResource TextBlockServerAddress}" Grid.Column="0" Grid.Row="1" HorizontalAlignment="Right" VerticalAlignment="Center" ></TextBlock>
|
||||
<TextBox x:Name="TextBoxTrojanGoServerHost" IsReadOnly="True" Grid.Column="1" Grid.Row="1" Margin="4" MouseDoubleClick="TextBoxTrojanGoServerHost_MouseDoubleClick"></TextBox>
|
||||
<TextBlock Grid.Column="2" Grid.Row="1"></TextBlock>
|
||||
<TextBlock Text="{DynamicResource TextBlockServerPort}" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxTrojanGoServerPort" IsReadOnly="True" Grid.Column="1" Grid.Row="2" Margin="4" MouseDoubleClick="TextBoxTrojanGoServerPort_MouseDoubleClick"></TextBox>
|
||||
<TextBlock Grid.Column="2" Grid.Row="2"></TextBlock>
|
||||
<TextBlock Text="{DynamicResource TextBlockHostPassword}" Grid.Column="0" Grid.Row="3" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxTrojanGoServerPassword" IsReadOnly="True" Grid.Column="1" Grid.Row="3" Margin="4" MouseDoubleClick="TextBoxTrojanGoServerPassword_MouseDoubleClick"></TextBox>
|
||||
|
||||
<TextBlock Text="Type:" Grid.Column="0" Grid.Row="4" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxTrojanGoType" IsReadOnly="True" Grid.Column="1" Grid.Row="4" Margin="4" MouseDoubleClick="TextBoxTrojanGoType_MouseDoubleClick"></TextBox>
|
||||
|
||||
<TextBlock x:Name="TextBlockTrojanGoWebSocketPath" Text="{DynamicResource TextBlockTrojanGoWebSocketPath}" Grid.Column="0" Grid.Row="5" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxTrojanGoWSPath" IsReadOnly="True" Grid.Column="1" Grid.Row="5" Margin="4" MouseDoubleClick="TextBoxTrojanGoWSPath_MouseDoubleClick"></TextBox>
|
||||
<TextBlock x:Name="TextBlockTrojanGoCaption" Grid.Column="2" Grid.Row="4"></TextBlock>
|
||||
|
||||
<TextBlock Text="{DynamicResource TextBlockCopyToClipExplain}" Grid.Column="0" Grid.Row="6" Grid.ColumnSpan="2" Margin="5" VerticalAlignment="Center"></TextBlock>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
<!-- Trojan客户端配置参数 -->
|
||||
<GroupBox Header="{DynamicResource GroupBoxHeaderClientParameter}" x:Name="GroupBoxTrojanClient" Visibility="Collapsed" Grid.Row="0">
|
||||
<Grid >
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.5*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="30"></RowDefinition>
|
||||
<RowDefinition Height="30"></RowDefinition>
|
||||
<RowDefinition Height="30"></RowDefinition>
|
||||
<RowDefinition Height="30"></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Text="{DynamicResource TextBlockServerAddress}" Grid.Column="0" Grid.Row="1" HorizontalAlignment="Right" VerticalAlignment="Center" ></TextBlock>
|
||||
<TextBox x:Name="TextBoxTrojanServerHost" IsReadOnly="True" Grid.Column="1" Grid.Row="1" Margin="4" MouseDoubleClick="TextBoxTrojanServerHost_MouseDoubleClick"></TextBox>
|
||||
<TextBlock Grid.Column="2" Grid.Row="1"></TextBlock>
|
||||
<TextBlock Text="{DynamicResource TextBlockServerPort}" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxTrojanServerPort" IsReadOnly="True" Grid.Column="1" Grid.Row="2" Margin="4" MouseDoubleClick="TextBoxTrojanServerPort_MouseDoubleClick"></TextBox>
|
||||
<TextBlock Grid.Column="2" Grid.Row="2"></TextBlock>
|
||||
<TextBlock Text="{DynamicResource TextBlockHostPassword}" Grid.Column="0" Grid.Row="3" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxTrojanServerPassword" IsReadOnly="True" Grid.Column="1" Grid.Row="3" Margin="4" MouseDoubleClick="TextBoxTrojanServerPassword_MouseDoubleClick"></TextBox>
|
||||
<TextBlock Grid.Column="2" Grid.Row="3"></TextBlock>
|
||||
<TextBlock Text="{DynamicResource TextBlockCopyToClipExplain}" Grid.Column="0" Grid.Row="10" Grid.ColumnSpan="2" Margin="5"></TextBlock>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
<!-- NaiveProxy客户端配置参数 -->
|
||||
<GroupBox Header="{DynamicResource GroupBoxHeaderClientParameter}" x:Name="GroupBoxNaiveProxyClient" Visibility="Collapsed" Grid.Row="0">
|
||||
<Grid >
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.5*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition Width="0.5*"></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="30"></RowDefinition>
|
||||
<RowDefinition Height="30"></RowDefinition>
|
||||
<RowDefinition Height="30"></RowDefinition>
|
||||
<RowDefinition Height="30"></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Text="{DynamicResource TextBlockServerAddress}" Grid.Column="0" Grid.Row="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxNaiveServerHost" IsReadOnly="True" Grid.Column="1" Grid.Row="1" Margin="4" MouseDoubleClick="TextBoxNaiveServerHost_MouseDoubleClick"></TextBox>
|
||||
<TextBlock Text="{DynamicResource TextBlockHostPart}" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxNaivePort" Text="443" IsReadOnly="True" Grid.Column="1" Grid.Row="2" Margin="4" MouseDoubleClick="TextBoxNaivePort_MouseDoubleClick"></TextBox>
|
||||
<TextBlock Text="{DynamicResource TextBlockHostUser}" Grid.Column="0" Grid.Row="3" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxNaiveUser" IsReadOnly="True" Grid.Column="1" Grid.Row="3" Margin="4" MouseDoubleClick="TextBoxNaiveUser_MouseDoubleClick"></TextBox>
|
||||
|
||||
<TextBlock Text="{DynamicResource TextBlockHostPassword}" Grid.Column="0" Grid.Row="4" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxNaivePassword" IsReadOnly="True" Grid.Column="1" Grid.Row="4" Margin="4" MouseDoubleClick="TextBoxNaivePassword_MouseDoubleClick"></TextBox>
|
||||
<TextBlock Text="{DynamicResource TextBlockCopyToClipExplain}" Grid.Column="0" Grid.Row="6" Grid.ColumnSpan="2" Margin="5"></TextBlock>
|
||||
<!--<Button x:Name="ButtonOpenDir" Content="确定" Grid.Column="1" Grid.Row="4" Margin="40,3,40,3" Click="ButtonOpenDir_Click"></Button>-->
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
<!-- SSR+TLS+Caddy客户端配置参数 -->
|
||||
<GroupBox Header="{DynamicResource GroupBoxHeaderClientParameter}" x:Name="GroupBoxSSRClient" Visibility="Collapsed" Grid.Row="0">
|
||||
<Grid >
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.6*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="30"></RowDefinition>
|
||||
<RowDefinition Height="30"></RowDefinition>
|
||||
<RowDefinition Height="30"></RowDefinition>
|
||||
<RowDefinition Height="30"></RowDefinition>
|
||||
<RowDefinition Height="30"></RowDefinition>
|
||||
<RowDefinition Height="30"></RowDefinition>
|
||||
<RowDefinition Height="30"></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Text="{DynamicResource TextBlockServerAddress}" Grid.Column="0" Grid.Row="1" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxSSRHostAddress" IsReadOnly="True" Grid.Column="1" Grid.Row="1" Margin="4" MouseDoubleClick="TextBoxSSRHostAddress_MouseDoubleClick"></TextBox>
|
||||
|
||||
<TextBlock Text="{DynamicResource TextBlockServerPort}" Grid.Column="0" Grid.Row="2" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxSSRPort" IsReadOnly="True" Grid.Column="1" Grid.Row="2" Margin="4" MouseDoubleClick="TextBoxSSRPort_MouseDoubleClick"></TextBox>
|
||||
|
||||
<TextBlock Text="{DynamicResource TextBlockTrojanGoPassword}" Grid.Column="0" Grid.Row="3" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxSSRUUID" IsReadOnly="True" Grid.Column="1" Grid.Row="3" Margin="4" MouseDoubleClick="TextBoxSSRUUID_MouseDoubleClick"></TextBox>
|
||||
|
||||
<TextBlock Text="{DynamicResource TextBlockEncryption}" Grid.Column="0" Grid.Row="4" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxSSREncryption" IsReadOnly="True" Grid.Column="1" Grid.Row="4" Margin="4" MouseDoubleClick="TextBoxSSREncryption_MouseDoubleClick"></TextBox>
|
||||
|
||||
<TextBlock Text="{DynamicResource TextBlockTransferProtocol}" Grid.Column="0" Grid.Row="5" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxSSRTransmission" IsReadOnly="True" Grid.Column="1" Grid.Row="5" Margin="4" MouseDoubleClick="TextBoxSSRTransmission_MouseDoubleClick"></TextBox>
|
||||
|
||||
<TextBlock Text="{DynamicResource TextBlockCamouflageType}" Grid.Column="0" Grid.Row="6" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxSSRCamouflageType" IsReadOnly="True" Grid.Column="1" Grid.Row="6" Margin="4" MouseDoubleClick="TextBoxSSRCamouflageType_MouseDoubleClick"></TextBox>
|
||||
|
||||
<TextBlock Text="{DynamicResource TextBlockCopyToClipExplain}" Grid.Column="0" Grid.Row="7" Grid.ColumnSpan="2" Margin="5" VerticalAlignment="Bottom"></TextBlock>
|
||||
<!--<TextBlock x:Name="TextBlocSSRTLSonOrNo" Text="{DynamicResource TextBlockIsOrNotTLS}" Grid.Column="0" Grid.Row="7" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxSSRTLS" IsReadOnly="True" Grid.Column="1" Grid.Row="7" Margin="2"></TextBox>
|
||||
<TextBlock x:Name="TextBlocSSRTLSonOrNoExplain" Text="" Grid.Column="2" Grid.Row="7"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockSSRHost" Text="Host:" Grid.Column="0" Grid.Row="8" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxSSRHost" IsReadOnly="True" Grid.Column="1" Grid.Row="8" Margin="2"></TextBox>
|
||||
<TextBlock x:Name="TextBlockSSRHostExplain" Text="" Grid.Column="2" Grid.Row="8"></TextBlock>-->
|
||||
|
||||
<!--<TextBlock x:Name="TextBlockSSRPath" Text="{DynamicResource TextBlockClientPath}" Grid.Column="0" Grid.Row="9" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxSSRPath" IsReadOnly="True" Grid.Column="1" Grid.Row="9" Margin="2"></TextBox>
|
||||
<TextBlock x:Name="TextBlockSSRPathExplain" Text="" Grid.Column="2" Grid.Row="9"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockSSRQuicKey" Text="{DynamicResource TextBlockClientMkcpQuicKey}" Grid.Column="0" Grid.Row="10" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxSSRQuicKey" IsReadOnly="True" Grid.Column="1" Grid.Row="10" Margin="2"></TextBox>
|
||||
<TextBlock x:Name="TextBlockSSRQuicKeyExplain" Text="" Grid.Column="2" Grid.Row="10"></TextBlock>-->
|
||||
|
||||
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
<!-- SS客户端配置参数 -->
|
||||
<GroupBox Header="{DynamicResource GroupBoxHeaderClientParameter}" x:Name="GroupBoxClientSS" Visibility="Collapsed" Grid.Row="0">
|
||||
<Grid >
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.6*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Text="{DynamicResource TextBlockServerAddress}" Grid.Column="0" Grid.Row="0" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxHostAddressSS" IsReadOnly="True" Grid.Column="1" Grid.Row="0" Margin="2" VerticalAlignment="Center" MouseDoubleClick="TextBoxHostAddressSS_MouseDoubleClick"/>
|
||||
<TextBlock Text="" Grid.Column="2" Grid.Row="0"></TextBlock>
|
||||
<TextBlock Text="{DynamicResource TextBlockServerPort}" Grid.Column="0" Grid.Row="1" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxPortSS" IsReadOnly="True" Grid.Column="1" Grid.Row="1" Margin="2" VerticalAlignment="Center" MouseDoubleClick="TextBoxPortSS_MouseDoubleClick"/>
|
||||
<TextBlock Text="" Grid.Column="2" Grid.Row="1"></TextBlock>
|
||||
<TextBlock Text="{DynamicResource TextBlockTrojanGoPassword}" Grid.Column="0" Grid.Row="2" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxPasswordSS" IsReadOnly="True" Grid.Column="1" Grid.Row="2" Margin="2" VerticalAlignment="Center" MouseDoubleClick="TextBoxPasswordSS_MouseDoubleClick"/>
|
||||
<TextBlock Text="" Grid.Column="2" Grid.Row="2"></TextBlock>
|
||||
<!--<TextBlock x:Name="TextBlockSSRUUIDextra" Text="{DynamicResource TextBlockV2RayAlterId}" Grid.Column="0" Grid.Row="3" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxSSRUUIDextra" IsReadOnly="False" Grid.Column="1" Grid.Row="3" Margin="2"></TextBox>
|
||||
<TextBlock x:Name="TextBlockSSRUUIDextraExplanation" Text="{DynamicResource TextBlockV2RayAlterIdExplain}" TextWrapping="Wrap" Grid.Column="2" Grid.Row="3"></TextBlock>-->
|
||||
<TextBlock Text="{DynamicResource TextBlockEncryption}" Grid.Column="0" Grid.Row="3" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxEncryptionSS" IsReadOnly="True" Grid.Column="1" Grid.Row="3" Margin="2" VerticalAlignment="Center" MouseDoubleClick="TextBoxEncryptionSS_MouseDoubleClick"/>
|
||||
<!--<TextBlock Text="{DynamicResource TextBlockEncryptionIsAuto}" Grid.Column="2" Grid.Row="3"></TextBlock>-->
|
||||
<TextBlock x:Name="TextBlockPluginNameExplainSS" Text="{DynamicResource TextBlockPluginNameExplainSS}" Grid.Column="0" Grid.Row="4" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxPluginNameExplainSS" IsReadOnly="True" Grid.Column="1" Grid.Row="4" Margin="2" VerticalAlignment="Center" MouseDoubleClick="TextBoxPluginNameExplainSS_MouseDoubleClick"/>
|
||||
<TextBox x:Name="TextBoxPluginNameExplainSSpc" IsReadOnly="True" Grid.Column="1" Grid.Row="4" Margin="2" Visibility="Collapsed" VerticalAlignment="Center" MouseDoubleClick="TextBoxPluginNameExplainSSpc_MouseDoubleClick"/>
|
||||
<TextBlock Text="" Grid.Column="2" Grid.Row="4"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockPluginOptionExplainSS" Text="{DynamicResource TextBlockPluginOptionExplainSS}" Grid.Column="0" Grid.Row="5" Margin="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxPluginOptionExplainSS" IsReadOnly="True" Grid.Column="1" Grid.Row="5" Margin="2" VerticalAlignment="Center" MouseDoubleClick="TextBoxPluginOptionExplainSS_MouseDoubleClick"/>
|
||||
<TextBlock Text="" Grid.Column="2" Grid.Row="5"></TextBlock>
|
||||
<TextBlock Text="{DynamicResource TextBlockCopyToClipExplain}" Grid.Column="0" Grid.Row="6" Grid.ColumnSpan="2" Margin="5"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockClientPromptSS" Text="{DynamicResource TextBlockClientPromptSS}" Foreground="Red" TextWrapping="Wrap" Grid.Column="0" Grid.Row="7" Grid.ColumnSpan="3" Margin="10,0,0,0"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonMobile" Content="{DynamicResource RadioButtonMobileSS}" Grid.Column="1" Grid.Row="8" HorizontalAlignment="Left" VerticalAlignment="Center" Checked="RadioButtonMobile_Checked"></RadioButton>
|
||||
<RadioButton x:Name="RadioButtonPC" Content="{DynamicResource RadioButtonPCSS}" Grid.Column="2" Grid.Row="8" HorizontalAlignment="Left" VerticalAlignment="Center" Checked="RadioButtonPC_Checked"></RadioButton>
|
||||
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
|
||||
<GroupBox Header="{DynamicResource GroupBoxHeaderClientParameter}" x:Name="GroupBoxClientMTProto" Visibility="Collapsed" Grid.Row="0" Grid.RowSpan="2">
|
||||
<Grid >
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="30"></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<RadioButton x:Name="RadioButtonMtgIpv4" Content="IPV4" Grid.Column="0" Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Center" Checked="RadioButtonMtgIpv4_Checked"></RadioButton>
|
||||
<RadioButton x:Name="RadioButtonMtgIpv6" Content="IPV6" Grid.Column="1" Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Center" Checked="RadioButtonMtgIpv6_Checked"></RadioButton>
|
||||
<Grid x:Name="GridMtgIpv4" Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.2*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="0.3*"></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="0.3*"></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Text="{DynamicResource TextBlockShareQRcodeMtgTgIpv4}" Grid.Column="0" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
|
||||
<Image x:Name="ImageShareQRcodeMtgTgIpv4" Grid.Column="1" Grid.Row="0"></Image>
|
||||
|
||||
<TextBlock Text="{DynamicResource TextBlockURLMtgTgIpv4}" TextWrapping="Wrap" Grid.Column="0" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxURLMtgTgIpv4" TextWrapping="Wrap" Grid.Column="1" Grid.Row="1" MouseDoubleClick="TextBoxURLMtgTgIpv4_MouseDoubleClick"></TextBox>
|
||||
|
||||
<TextBlock Text="{DynamicResource TextBlockShareQRcodeMtgTmeIpv4}" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
|
||||
<Image x:Name="ImageShareQRcodeMtgTmeIpv4" Grid.Column="1" Grid.Row="2"></Image>
|
||||
|
||||
<TextBlock Text="{DynamicResource TextBlockURLMtgTmeIpv4}" TextWrapping="Wrap" Grid.Column="0" Grid.Row="3" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxURLMtgTmeIpv4" TextWrapping="Wrap" Grid.Column="1" Grid.Row="3" MouseDoubleClick="TextBoxURLMtgTmeIpv4_MouseDoubleClick"></TextBox>
|
||||
</Grid>
|
||||
|
||||
<Grid x:Name="GridMtgIpv6" Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" Visibility="Collapsed">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.2*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="0.3*"></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="0.3*"></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Text="{DynamicResource TextBlockShareQRcodeMtgTgIpv4}" Grid.Column="0" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
|
||||
<Image x:Name="ImageShareQRcodeMtgTgIpv6" Grid.Column="1" Grid.Row="0"></Image>
|
||||
|
||||
<TextBlock Text="{DynamicResource TextBlockURLMtgTgIpv4}" TextWrapping="Wrap" Grid.Column="0" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxURLMtgTgIpv6" TextWrapping="Wrap" Grid.Column="1" Grid.Row="1" MouseDoubleClick="TextBoxURLMtgTgIpv6_MouseDoubleClick"></TextBox>
|
||||
|
||||
<TextBlock Text="{DynamicResource TextBlockShareQRcodeMtgTmeIpv4}" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
|
||||
<Image x:Name="ImageShareQRcodeMtgTmeIpv6" Grid.Column="1" Grid.Row="2"></Image>
|
||||
|
||||
<TextBlock Text="{DynamicResource TextBlockURLMtgTmeIpv4}" TextWrapping="Wrap" Grid.Column="0" Grid.Row="3" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxURLMtgTmeIpv6" TextWrapping="Wrap" Grid.Column="1" Grid.Row="3" MouseDoubleClick="TextBoxURLMtgTmeIpv6_MouseDoubleClick"></TextBox>
|
||||
|
||||
</Grid>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
|
||||
<!--<GroupBox Header="{DynamicResource GroupBoxHeaderClientParameter}" x:Name="GroupBoxClient" Visibility="Collapsed" Grid.Row="0">
|
||||
<Grid >
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
|
||||
</Grid>
|
||||
</GroupBox>-->
|
||||
|
||||
<GroupBox x:Name="GroupBoxClientQRandURL" Header="{DynamicResource GrouBoxHeaderUrlOrQR}" Grid.Row="1" Visibility="Visible">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.5*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition Width="0.6*"></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock x:Name="TextBlockQrURLexplain" Text="{DynamicResource TextBlockQrURLexplainV2Ray}" TextWrapping="Wrap" Grid.Column="0"></TextBlock>
|
||||
<Image x:Name="ImageShareQRcode" Grid.Column="1"></Image>
|
||||
<Grid x:Name="GridShareURL" Grid.Column="2">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="0.15*"></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBox x:Name="TextBoxURL" TextWrapping="Wrap" Grid.Row="0" MouseDoubleClick="TextBoxURL_MouseDoubleClick"></TextBox>
|
||||
<TextBlock Text="{DynamicResource TextBlockCopyToClipExplain}" TextWrapping="Wrap" Grid.Row="1"></TextBlock>
|
||||
</Grid>
|
||||
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
|
||||
<GroupBox x:Name="GroupBoxClientSSpc" Header="{DynamicResource GrouBoxHeaderUrlOrQR}" Grid.Row="1" Visibility="Collapsed">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.5*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition Width="0.6*"></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock x:Name="TextBlockQrURLexplainSSpc" TextWrapping="Wrap" Grid.Column="0"></TextBlock>
|
||||
<Image x:Name="ImageShareQRcodeSSpc" Grid.Column="1"></Image>
|
||||
<Grid x:Name="GridShareURLpc" Grid.Column="2">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="0.15*"></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBox x:Name="TextBoxURLpcSS" TextWrapping="Wrap" Grid.Column="2" MouseDoubleClick="TextBoxURLpcSS_MouseDoubleClick"></TextBox>
|
||||
<TextBlock Text="{DynamicResource TextBlockCopyToClipExplain}" TextWrapping="Wrap" Grid.Row="1"></TextBlock>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
|
||||
<Grid Grid.Row="2">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition Width="0.3*"></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Text="{DynamicResource TextBlockUsedParameter}" Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="1" Margin="5" TextWrapping="Wrap"></TextBlock>
|
||||
<Button x:Name="ButtonOpenSaveDir" Content="{DynamicResource ButtonTrojanGoTemplateOK}" Grid.Column="1" Grid.Row="0" Grid.RowSpan="1" Margin="5" Click="ButtonOpenSaveDir_Click"></Button>
|
||||
|
||||
</Grid>
|
||||
|
||||
</Grid>
|
||||
|
||||
</Window>
|
File diff suppressed because it is too large
Load diff
|
@ -1,279 +0,0 @@
|
|||
<Window x:Class="ProxySU.SSpluginWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:local="clr-namespace:ProxySU"
|
||||
mc:Ignorable="d"
|
||||
Title="SSpluginWindow" Height="600" Width="850">
|
||||
<Window.Resources>
|
||||
<Style BasedOn="{StaticResource {x:Type TextBox}}"
|
||||
TargetType="TextBox"
|
||||
x:Key="TitleText">
|
||||
<Style.Triggers>
|
||||
<MultiTrigger>
|
||||
<MultiTrigger.Conditions>
|
||||
<Condition Property="Text" Value=""/>
|
||||
<Condition Property="TextBox.IsFocused" Value="false"/>
|
||||
</MultiTrigger.Conditions>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate>
|
||||
<Border BorderThickness="1" BorderBrush="Gray" Margin="0">
|
||||
<TextBlock x:Name="MainTextBlock" Text="{TemplateBinding TextBox.Tag}" Width="{TemplateBinding TextBox.ActualWidth}" Foreground="Gray" VerticalAlignment="Center" HorizontalAlignment="Left"/>
|
||||
</Border>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</MultiTrigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
|
||||
</Window.Resources>
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<GroupBox Header="{DynamicResource GroupBoxHeaderV2RayTemplates}" Grid.Row="0" Grid.RowSpan="3">
|
||||
<Grid>
|
||||
<TabControl x:Name="TabControlTemplate">
|
||||
<TabItem Header="{DynamicResource TabItemHeaderV2RayHotPlan}" Width="110" Height="30">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="1.5*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition Width="0.3*"></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="1.2*"></RowDefinition>
|
||||
<RowDefinition Height="1.2*"></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<RadioButton x:Name="RadioButtonWebSocketTLSWebFrontSSHot" Content="{DynamicResource RadioButtonWebSocketTLSWebFrontSS}" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="1" HorizontalAlignment="Left" VerticalAlignment="Center" Checked="RadioButtonUseDomainWebsocketTls_Checked"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayWebSocketTlsWebExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="3" VerticalAlignment="Center" HorizontalAlignment="Left"></TextBlock>
|
||||
<!--<RadioButton x:Name="RadioButtonHTTP2WebHot" Content="HTTP2+TLS+Web" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayHttp2TlsWebExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="2" Grid.ColumnSpan="3" VerticalAlignment="Center" HorizontalAlignment="Left"></TextBlock>-->
|
||||
|
||||
</Grid>
|
||||
</TabItem>
|
||||
|
||||
<!--<TabItem Header="{DynamicResource TabItemHeaderV2RayTcpProtocol}" Width="110" Height="30">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="1.3*"></RowDefinition>
|
||||
<RowDefinition Height="1.7*"></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<RadioButton x:Name="RadioButtonTCP" Content="TCP" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="1" Checked="RadioButtonTCP_Checked" VerticalAlignment="Center" HorizontalAlignment="Left"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayTcpExplain}" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonTCPhttp" Content="{DynamicResource RadioButtonV2RayTcpHttp}" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="2" Checked="RadioButtonTCPhttp_Checked" VerticalAlignment="Center" HorizontalAlignment="Left" ></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayTcpHttpExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="2" Grid.ColumnSpan="3" VerticalAlignment="Center" HorizontalAlignment="Left"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonTCP2TLS" Content="TCP+TLS" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="3" Checked="RadioButtonTCP2TLS_Checked" VerticalAlignment="Center" HorizontalAlignment="Left" />
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayTcpTlsExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="3" Grid.ColumnSpan="3" VerticalAlignment="Center" HorizontalAlignment="Left"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonTcpTLS2SelfSigned" Content="{DynamicResource RadioButtonV2RayTcpTlsSelfSigned}" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="4" Checked="RadioButtonTCP2TLSnoDomain_Checked" VerticalAlignment="Center" HorizontalAlignment="Left" />
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayTcpTlsSelfSignedExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="4" Grid.ColumnSpan="3" VerticalAlignment="Center" HorizontalAlignment="Left"></TextBlock>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RaySelfSignedShadowrocketExplain}" TextWrapping="Wrap" Grid.Column="4" Grid.Row="4" HorizontalAlignment="Left" VerticalAlignment="Center" ></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonVlessTcpTlsWeb" Content="VLESS+TCP+TLS+Web" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="5" Checked="RadioButtonTCP2TLS_Checked" VerticalAlignment="Center" HorizontalAlignment="Left" ></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayVlessTcpTlsWebExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="5" Grid.ColumnSpan="3" VerticalAlignment="Center" HorizontalAlignment="Left"></TextBlock>
|
||||
|
||||
</Grid>
|
||||
</TabItem>-->
|
||||
|
||||
<TabItem Header="{DynamicResource TabItemHeaderV2RayPluginSS}" Width="110" Height="30">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="1.5*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="1.3*"></RowDefinition>
|
||||
<RowDefinition Height="1.3*"></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2rayPluginPointSS}" Foreground="Red" TextWrapping="Wrap" Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="5" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonWebSocketSS" Content="SS+WebSocket" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="1" Checked="RadioButtonNonePluginSS_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"/>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayWebSocketExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<!--<RadioButton x:Name="RadioButtonWebSocketTLSWebSS" Content="{DynamicResource RadioButtonWebSocketTLSWebSS}" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="2" Checked="RadioButtonHTTP2_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"/>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayWebSocketTlsExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="2" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>-->
|
||||
<RadioButton x:Name="RadioButtonWebSocketTLSWebFrontSS" Content="{DynamicResource RadioButtonWebSocketTLSWebFrontSS}" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="3" Checked="RadioButtonUseDomainWebsocketTls_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayWebSocketTlsWebExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="3" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonQuicSS" Content="{DynamicResource RadioButtonQuicSS}" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="4" Checked="RadioButtonUseDomainTls_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockQuicExplainSS}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="4" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<!--<TextBlock Text="{DynamicResource TextBlockV2RaySelfSignedShadowrocketExplain}" TextWrapping="Wrap" Grid.Column="4" Grid.Row="4" HorizontalAlignment="Left" VerticalAlignment="Center" ></TextBlock>-->
|
||||
<!--<TextBlock Text="{DynamicResource TextBlockV2RayPluginPointSS}" TextWrapping="Wrap" Margin="10,0,10,0" Grid.Column="0" Grid.Row="5" Grid.ColumnSpan="5" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>-->
|
||||
|
||||
</Grid>
|
||||
</TabItem>
|
||||
<TabItem Header="{DynamicResource TabItemHeaderOtherPluginsSS}" Width="100" Height="30">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.5*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="1.5*"></RowDefinition>
|
||||
<RowDefinition Height="1.2*"></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="0*"></RowDefinition>
|
||||
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Text="{DynamicResource TextBlockGoQuietPluginPointSS}" Foreground="Red" TextWrapping="Wrap" Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="5" HorizontalAlignment="Left" VerticalAlignment="Center" Visibility="Collapsed"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonKcptunPluginSS" Content="kcptun-plugin" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="1" Checked="RadioButtonNonePluginSS_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockKcptunPluginExplainSS}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
|
||||
<RadioButton x:Name="RadioButtonGoQuietPluginSS" Content="GoQuiet-plugin" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="2" Checked="RadioButtonUseDomainTls_Checked" HorizontalAlignment="Left" VerticalAlignment="Center" Visibility="Collapsed"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockGoQuietPluginExplainSS}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="2" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center" Visibility="Collapsed"></TextBlock>
|
||||
|
||||
<RadioButton x:Name="RadioButtonCloakPluginSS" Content="Cloak-plugin" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="3" Checked="RadioButtonUseDomainTls_Checked" HorizontalAlignment="Left" VerticalAlignment="Center" Visibility="Collapsed"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockCloakPluginExplainSS}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="3" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center" Visibility="Collapsed"></TextBlock>
|
||||
<!--<TextBlock Text="{DynamicResource TextBlockV2RaySelfSignedShadowrocketExplain}" TextWrapping="Wrap" Grid.Column="4" Grid.Row="3" ></TextBlock>-->
|
||||
|
||||
</Grid>
|
||||
</TabItem>
|
||||
|
||||
<TabItem Header="{DynamicResource TabItemHeaderObfsPluginSS}" Width="110" Height="30">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
|
||||
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Text="{DynamicResource TextBlockObfsPluginPointSS}" Foreground="Red" TextWrapping="Wrap" Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="5" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonObfsPluginHttpWebSS" Content="{DynamicResource RadioButtonObfsPluginHttpWebSS}" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="1" Checked="RadioButtonNonePluginSS_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockObfsPluginHttpWebExplainSS}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonObfsPluginHttpsWebSS" Content="{DynamicResource RadioButtonObfsPluginHttpsWebSS}" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="2" Checked="RadioButtonUseDomainTls_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockObfsPluginTLShttpsWebExplainSS}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="2" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
|
||||
</Grid>
|
||||
</TabItem>
|
||||
<TabItem Header="{DynamicResource TabItemHeaderNonePluginSS}" Width="110" Height="30">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Text="{DynamicResource TextBlockNonePluginPointSS}" Foreground="Red" Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="5" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonNonePluginSS" Content="{DynamicResource RadioButtonNonePluginSS}" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="1" Checked="RadioButtonNonePluginSS_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockNonePluginExplainSS}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<!--<RadioButton x:Name="RadioButtonQuicSRTP" Content="QUIC+SRTP" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="2" Checked="RadioButtonQuicNone_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayQuicSRTPExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="2" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonQuic2uTP" Content="QUIC+uTP" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="3" Checked="RadioButtonQuicNone_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayQuicuTPExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="3" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonQuicWechatVideo" Content="QUIC+WechatVideo" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="4" Checked="RadioButtonQuicNone_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayQuicWeChatExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="4" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonQuicDTLS" Content="QUIC+DTLS 1.2" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="5" Checked="RadioButtonQuicNone_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayQuicDTLSExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="5" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonQuicWireGuard" Content="QUIC+WireGuard" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="6" Checked="RadioButtonQuicNone_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayQuicWireGuardExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="6" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>-->
|
||||
|
||||
</Grid>
|
||||
</TabItem>
|
||||
</TabControl>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
<GroupBox Header="{DynamicResource GroupBoxHeaderParameterV2Ray}" Grid.Row="3" Grid.RowSpan="2">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock x:Name="TextBlockServerListenPortSS" Text="{DynamicResource TextBlockV2RayServerPort}" Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxServerListenPortSS" Grid.Column="1" Grid.Row="0" Grid.ColumnSpan="3" Margin="3"></TextBox>
|
||||
<Button x:Name="ButtonServerListenPortSS" Content="{DynamicResource ButtonV2RayServerPortChange}" Grid.Column="4" Grid.Row="0" Margin="2" Click="ButtonServerListenPort_Click"></Button>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayServerPortExplain}" Grid.Column="5" Grid.ColumnSpan="2" Grid.Row="0" Margin="3"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockNewUUIDSS" Text="{DynamicResource TextBlockTrojanHostPassword}" Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxNewUUIDSS" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="3" Margin="3"></TextBox>
|
||||
<Button x:Name="ButtonNewUUIDSS" Content="{DynamicResource ButtonTrojanChangePassword}" Grid.Column="4" Grid.Row="1" Margin="2" Click="ButtonNewUUID_Click"></Button>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayUUIDExplain}" TextWrapping="Wrap" Grid.Column="5" Grid.Row="1" Grid.ColumnSpan="2" Margin="0"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockMethodSS" Text="{DynamicResource TextBlockEncryption}" Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<ComboBox x:Name="ComboBoxEncryptionMethodInfo" Grid.Column="1" Grid.Row="2" Grid.ColumnSpan="2" Height="25" Margin="3,0,0,0" SelectionChanged="ComboBoxEncryptionMethodInfo_SelectionChanged"></ComboBox>
|
||||
<!--<TextBox x:Name="TextBoxMethodSS" Grid.Column="1" Grid.Row="2" Grid.ColumnSpan="3" Margin="3"></TextBox>-->
|
||||
<!--<Button x:Name="ButtonMethodSS" Content="{DynamicResource ButtonTrojanChangePassword}" Grid.Column="4" Grid.Row="2" Margin="2" Click="ButtonQuicUUID_Click"></Button>-->
|
||||
<!--<TextBlock x:Name="TextBlockMkcpUUID" Text="{DynamicResource TextBlockV2RayMkcpExplain}" TextWrapping="Wrap" Grid.Column="5" Grid.Row="2" Grid.ColumnSpan="2"></TextBlock>-->
|
||||
|
||||
<TextBlock x:Name="TextBlockWebSocketPathSS" Text="{DynamicResource TextBlockTrojanGoWebSocketPath}" Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxWebSocketPathSS" Grid.Column="1" Grid.Row="3" Grid.ColumnSpan="3" Margin="3"></TextBox>
|
||||
<Button x:Name="ButtonWebSocketPathSS" Content="{DynamicResource ButtonNaiveProxyChangeUser}" Grid.Column="4" Grid.Row="3" Margin="2" Click="ButtonPath_Click"></Button>
|
||||
<TextBlock x:Name="TextBlockDomainSS" Text="{DynamicResource TextBlockV2RayDomain}" Grid.Column="0" Grid.Row="4" Grid.ColumnSpan="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxDomainSS" Style="{StaticResource TitleText}" Tag="{DynamicResource TextBoxDomainPrompt}" Grid.Column="1" Grid.Row="4" Grid.ColumnSpan="3" Margin="3"></TextBox>
|
||||
|
||||
<Button x:Name="ButtonDomain" Content="检测" Visibility="Collapsed" Grid.Column="4" Grid.Row="4" Margin="2" ></Button>
|
||||
<TextBlock x:Name="TextBlockMaskSites" Text="{DynamicResource TextBlockV2RayMaskSites}" Grid.Column="0" Grid.Row="5" Grid.ColumnSpan="1" Visibility="Hidden"></TextBlock>
|
||||
<TextBox x:Name="TextBoxMaskSites" Style="{StaticResource TitleText}" Tag="{DynamicResource TextBoxV2RayMaskSitesTag}" Grid.Column="1" Grid.Row="5" Grid.ColumnSpan="3" Margin="3" Visibility="Hidden"></TextBox>
|
||||
|
||||
|
||||
<Button x:Name="ButtondDecide" Content="{DynamicResource ButtonTrojanGoTemplateOK}" Grid.Column="1" Grid.Row="6" Margin="0" Click="ButtondDecide_Click"></Button>
|
||||
<Button x:Name="ButtondCancel" Content="{DynamicResource ButtonTrojanGoTemplateCancel}" Grid.Column="3" Grid.Row="6" Margin="0" Click="ButtondCancel_Click"></Button>
|
||||
<!--<Button x:Name="ButtonTestChecked" Content="测试选中状态" Grid.Column="5" Grid.Row="6" Click="ButtonTestChecked_Click"></Button>-->
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
|
||||
</Grid>
|
||||
</Window>
|
|
@ -1,404 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
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 ProxySU
|
||||
{
|
||||
/// <summary>
|
||||
/// SSpluginWindow.xaml 的交互逻辑
|
||||
/// </summary>
|
||||
public partial class SSpluginWindow : Window
|
||||
{
|
||||
//SS加密方法设定
|
||||
public class EncryptionMethodInfo
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string Value { get; set; }
|
||||
}
|
||||
public SSpluginWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
#region 加密方法选择 初始设置为chacha20-ietf-poly1305
|
||||
List<EncryptionMethodInfo> methodList = new List<EncryptionMethodInfo>();
|
||||
|
||||
methodList.Add(new EncryptionMethodInfo { Name = "chacha20-ietf-poly1305", Value = "chacha20-ietf-poly1305" });
|
||||
methodList.Add(new EncryptionMethodInfo { Name = "xchacha20-ietf-poly1305", Value = "xchacha20-ietf-poly1305" });
|
||||
methodList.Add(new EncryptionMethodInfo { Name = "aes-256-gcm", Value = "aes-256-gcm" });
|
||||
methodList.Add(new EncryptionMethodInfo { Name = "aes-192-gcm", Value = "aes-192-gcm" });
|
||||
methodList.Add(new EncryptionMethodInfo { Name = "aes-128-gcm", Value = "aes-128-gcm" });
|
||||
|
||||
ComboBoxEncryptionMethodInfo.ItemsSource = methodList;
|
||||
|
||||
ComboBoxEncryptionMethodInfo.DisplayMemberPath = "Name";//显示出来的值
|
||||
ComboBoxEncryptionMethodInfo.SelectedValuePath = "Value";//实际选中后获取的结果的值
|
||||
ComboBoxEncryptionMethodInfo.SelectedIndex = 0;
|
||||
|
||||
DataContext = this;
|
||||
#endregion
|
||||
}
|
||||
|
||||
|
||||
|
||||
//取消不在当前活动选项卡中的其他所有选项卡中的所有RadioBuuton的选中状态
|
||||
//代码参考网址:https://blog.csdn.net/weixin_42583999/article/details/103468857
|
||||
//调用:UncheckLayouts((TabItem)TabControlTemplate.SelectedItem);
|
||||
private void UncheckLayouts(TabItem activePage)
|
||||
{
|
||||
foreach (TabItem tabPage in TabControlTemplate.Items)
|
||||
{
|
||||
if (tabPage == activePage) continue;
|
||||
Grid grid = (Grid)tabPage.Content;
|
||||
foreach (UIElement element in grid.Children)
|
||||
{
|
||||
if (element is RadioButton)
|
||||
{
|
||||
RadioButton radiobutton = (element as RadioButton);
|
||||
radiobutton.IsChecked = false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//伪装网站处理
|
||||
private void DisguiseURLprocessing()
|
||||
{
|
||||
//处理伪装网站域名中的前缀
|
||||
if (TextBoxMaskSites.Text.ToString().Length >= 7)
|
||||
{
|
||||
string testDomain = TextBoxMaskSites.Text.Substring(0, 7);
|
||||
if (String.Equals(testDomain, "https:/") || String.Equals(testDomain, "http://"))
|
||||
{
|
||||
MainWindow.ReceiveConfigurationParameters[7] = TextBoxMaskSites.Text.Replace("/", "\\/");
|
||||
}
|
||||
else
|
||||
{
|
||||
MainWindow.ReceiveConfigurationParameters[7] = "http:\\/\\/" + TextBoxMaskSites.Text;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ButtondDecide_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
bool testDomain = true;
|
||||
//UncheckLayouts(TabControlTemplate);
|
||||
//SS 经典模式被选中
|
||||
if (RadioButtonNonePluginSS.IsChecked == true)
|
||||
{
|
||||
//传递模板类型
|
||||
MainWindow.ReceiveConfigurationParameters[0] = "NonePluginSS";
|
||||
//传递方案名称
|
||||
MainWindow.ReceiveConfigurationParameters[8] = RadioButtonNonePluginSS.Content.ToString();
|
||||
|
||||
}
|
||||
//SS+obfs+http+web伪装模式被选中
|
||||
else if (RadioButtonObfsPluginHttpWebSS.IsChecked == true)
|
||||
{
|
||||
//传递模板类型
|
||||
MainWindow.ReceiveConfigurationParameters[0] = "ObfsPluginHttpWebSS";
|
||||
//传递方案名称
|
||||
MainWindow.ReceiveConfigurationParameters[8] = RadioButtonObfsPluginHttpWebSS.Content.ToString();
|
||||
|
||||
}
|
||||
//SS+obfs+TLS+web模式被选中
|
||||
else if (RadioButtonObfsPluginHttpsWebSS.IsChecked == true)
|
||||
{
|
||||
//if (string.IsNullOrEmpty(TextBoxDomainSS.Text.ToString()) == true)
|
||||
//{
|
||||
// //****** "域名不能为空,请检查相关参数设置!" ******
|
||||
// MessageBox.Show(Application.Current.FindResource("MessageBoxShow_DomainNotEmpty").ToString());
|
||||
// return;
|
||||
//}
|
||||
testDomain = TestDomainIsEmpty();
|
||||
//传递模板类型
|
||||
MainWindow.ReceiveConfigurationParameters[0] = "ObfsPluginHttpsWebSS";
|
||||
//传递方案名称
|
||||
MainWindow.ReceiveConfigurationParameters[8] = RadioButtonObfsPluginHttpsWebSS.Content.ToString();
|
||||
//传递域名
|
||||
MainWindow.ReceiveConfigurationParameters[4] = TextBoxDomainSS.Text.ToString();
|
||||
|
||||
}
|
||||
|
||||
//V2Ray-Plugin SS+WebSocket 无TLS模式被选中
|
||||
else if (RadioButtonWebSocketSS.IsChecked == true)
|
||||
{
|
||||
//传递模板类型
|
||||
MainWindow.ReceiveConfigurationParameters[0] = "WebSocketSS";
|
||||
//传递方案名称
|
||||
MainWindow.ReceiveConfigurationParameters[8] = RadioButtonWebSocketSS.Content.ToString();
|
||||
//传递路径
|
||||
MainWindow.ReceiveConfigurationParameters[6] = TextBoxWebSocketPathSS.Text.ToString();
|
||||
}
|
||||
|
||||
//V2Ray-Plugin SS+WebSocket+TLS+Web模式被选中
|
||||
else if (RadioButtonWebSocketTLSWebFrontSS.IsChecked == true || RadioButtonWebSocketTLSWebFrontSSHot.IsChecked == true)
|
||||
{
|
||||
testDomain = TestDomainIsEmpty();
|
||||
//传递模板类型
|
||||
MainWindow.ReceiveConfigurationParameters[0] = "WebSocketTLSWebFrontSS";
|
||||
//传递方案名称
|
||||
MainWindow.ReceiveConfigurationParameters[8] = RadioButtonWebSocketTLSWebFrontSS.Content.ToString();
|
||||
|
||||
//传递路径
|
||||
MainWindow.ReceiveConfigurationParameters[6] = TextBoxWebSocketPathSS.Text.ToString();
|
||||
//传递域名
|
||||
MainWindow.ReceiveConfigurationParameters[4] = TextBoxDomainSS.Text.ToString();
|
||||
//传递伪装网站
|
||||
//MainWindow.ReceiveConfigurationParameters[7] = TextBoxMaskSites.Text.ToString();
|
||||
//处理伪装网站域名中的前缀
|
||||
//DisguiseURLprocessing();
|
||||
//if (TextBoxMaskSites.Text.ToString().Length >= 7)
|
||||
//{
|
||||
// string testDomain = TextBoxMaskSites.Text.Substring(0, 7);
|
||||
// if (String.Equals(testDomain, "https:/") || String.Equals(testDomain, "http://"))
|
||||
// {
|
||||
// //MessageBox.Show(testDomain);
|
||||
// MainWindow.ReceiveConfigurationParameters[7] = TextBoxMaskSites.Text.Replace("/", "\\/");
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// MainWindow.ReceiveConfigurationParameters[7] = "http:\\/\\/" + TextBoxMaskSites.Text;
|
||||
// }
|
||||
//}
|
||||
}
|
||||
//V2Ray-Plugin SS+QUIC模式被选中
|
||||
else if (RadioButtonQuicSS.IsChecked == true)
|
||||
{
|
||||
testDomain = TestDomainIsEmpty();
|
||||
//传递模板类型
|
||||
MainWindow.ReceiveConfigurationParameters[0] = "QuicSS";
|
||||
//传递方案名称
|
||||
MainWindow.ReceiveConfigurationParameters[8] = RadioButtonQuicSS.Content.ToString();
|
||||
|
||||
//传递域名
|
||||
MainWindow.ReceiveConfigurationParameters[4] = TextBoxDomainSS.Text.ToString();
|
||||
|
||||
}
|
||||
//SS+kcptun-plugin模式被选中
|
||||
else if (RadioButtonKcptunPluginSS.IsChecked == true)
|
||||
{
|
||||
//传递模板类型
|
||||
MainWindow.ReceiveConfigurationParameters[0] = "KcptunPluginSS";
|
||||
//传递方案名称
|
||||
MainWindow.ReceiveConfigurationParameters[8] = RadioButtonKcptunPluginSS.Content.ToString();
|
||||
|
||||
}
|
||||
//SS+GoQuiet-Plugin模式被选中
|
||||
else if (RadioButtonGoQuietPluginSS.IsChecked == true)
|
||||
{
|
||||
testDomain = TestDomainIsEmpty();
|
||||
//传递模板类型
|
||||
MainWindow.ReceiveConfigurationParameters[0] = "GoQuietPluginSS";
|
||||
//传递方案名称
|
||||
MainWindow.ReceiveConfigurationParameters[8] = RadioButtonGoQuietPluginSS.Content.ToString();
|
||||
//传递域名
|
||||
MainWindow.ReceiveConfigurationParameters[4] = TextBoxDomainSS.Text.ToString();
|
||||
|
||||
}
|
||||
//SS+Cloak-Plugin模式被选中
|
||||
else if (RadioButtonCloakPluginSS.IsChecked == true)
|
||||
{
|
||||
testDomain = TestDomainIsEmpty();
|
||||
//传递模板类型
|
||||
MainWindow.ReceiveConfigurationParameters[0] = "CloakPluginSS";
|
||||
//传递方案名称
|
||||
MainWindow.ReceiveConfigurationParameters[8] = RadioButtonCloakPluginSS.Content.ToString();
|
||||
//传递域名
|
||||
MainWindow.ReceiveConfigurationParameters[4] = TextBoxDomainSS.Text.ToString();
|
||||
|
||||
}
|
||||
|
||||
//传递服务端口
|
||||
MainWindow.ReceiveConfigurationParameters[1] = TextBoxServerListenPortSS.Text.ToString();
|
||||
//传递uuid密码
|
||||
MainWindow.ReceiveConfigurationParameters[2] = TextBoxNewUUIDSS.Text.ToString();
|
||||
//传递加密方式
|
||||
MainWindow.ReceiveConfigurationParameters[3] = GetEncryptionMethodSS();
|
||||
|
||||
if (testDomain)
|
||||
{
|
||||
this.Close();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void ButtondCancel_Click(object sender, RoutedEventArgs e) => Close();
|
||||
|
||||
|
||||
#region 其他设置中的界面控制
|
||||
|
||||
//无插件的界面
|
||||
private void RadioButtonNonePluginSS_Checked(object sender, RoutedEventArgs e)
|
||||
{
|
||||
//隐藏Websocket Path
|
||||
TextBlockWebSocketPathSS.Visibility = Visibility.Collapsed;
|
||||
TextBoxWebSocketPathSS.Visibility = Visibility.Collapsed;
|
||||
ButtonWebSocketPathSS.Visibility = Visibility.Collapsed;
|
||||
|
||||
//隐藏域名
|
||||
TextBlockDomainSS.Visibility = Visibility.Collapsed;
|
||||
TextBoxDomainSS.Visibility = Visibility.Collapsed;
|
||||
//检测域名按钮
|
||||
ButtonDomain.Visibility = Visibility.Collapsed;
|
||||
//隐藏伪装网站
|
||||
TextBlockMaskSites.Visibility = Visibility.Collapsed;
|
||||
TextBoxMaskSites.Visibility = Visibility.Collapsed;
|
||||
|
||||
//初始化密码
|
||||
TextBoxNewUUIDSS.Text = GenerateRandomUUID();
|
||||
//初始化端口
|
||||
|
||||
TextBoxServerListenPortSS.Text = GenerateRandomPort().ToString();
|
||||
//清除其他选项卡中的选项
|
||||
UncheckLayouts((TabItem)TabControlTemplate.SelectedItem);
|
||||
}
|
||||
//使用域名,启用TLS 无Websocket的界面
|
||||
private void RadioButtonUseDomainTls_Checked(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
TextBoxServerListenPortSS.Text = "443";
|
||||
//隐藏Websocket Path
|
||||
TextBlockWebSocketPathSS.Visibility = Visibility.Collapsed;
|
||||
TextBoxWebSocketPathSS.Visibility = Visibility.Collapsed;
|
||||
ButtonWebSocketPathSS.Visibility = Visibility.Collapsed;
|
||||
|
||||
//显示域名
|
||||
TextBlockDomainSS.Visibility = Visibility.Visible;
|
||||
TextBoxDomainSS.Visibility = Visibility.Visible;
|
||||
//检测域名按钮
|
||||
ButtonDomain.Visibility = Visibility.Collapsed;
|
||||
//隐藏伪装网站
|
||||
TextBlockMaskSites.Visibility = Visibility.Collapsed;
|
||||
TextBoxMaskSites.Visibility = Visibility.Collapsed;
|
||||
|
||||
//初始化密码
|
||||
TextBoxNewUUIDSS.Text = GenerateRandomUUID();
|
||||
//初始化端口
|
||||
//TextBoxServerListenPortSS.Text = GenerateRandomPort().ToString();
|
||||
//清除其他选项卡中的选项
|
||||
UncheckLayouts((TabItem)TabControlTemplate.SelectedItem);
|
||||
}
|
||||
|
||||
|
||||
//使用V2ray-plugin 的Websocket over https (TLS)
|
||||
private void RadioButtonUseDomainWebsocketTls_Checked(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
TextBoxServerListenPortSS.Text = "443";
|
||||
//显示Websocket Path
|
||||
TextBlockWebSocketPathSS.Visibility = Visibility.Visible;
|
||||
TextBoxWebSocketPathSS.Visibility = Visibility.Visible;
|
||||
ButtonWebSocketPathSS.Visibility = Visibility.Visible;
|
||||
|
||||
//显示域名
|
||||
TextBlockDomainSS.Visibility = Visibility.Visible;
|
||||
TextBoxDomainSS.Visibility = Visibility.Visible;
|
||||
//检测域名按钮
|
||||
ButtonDomain.Visibility = Visibility.Collapsed;
|
||||
//隐藏伪装网站
|
||||
TextBlockMaskSites.Visibility = Visibility.Collapsed;
|
||||
TextBoxMaskSites.Visibility = Visibility.Collapsed;
|
||||
|
||||
//初始化密码
|
||||
TextBoxNewUUIDSS.Text = GenerateRandomUUID();
|
||||
|
||||
//初始化端口
|
||||
|
||||
//TextBoxServerListenPortSS.Text = GenerateRandomPort().ToString();
|
||||
|
||||
//初始化Websocket Path
|
||||
TextBoxWebSocketPathSS.Text = GenerateRandomPath();
|
||||
//清除其他选项卡中的选项
|
||||
UncheckLayouts((TabItem)TabControlTemplate.SelectedItem);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
//加密方法更改后的动作
|
||||
private void ComboBoxEncryptionMethodInfo_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||
{
|
||||
//传递加密方式
|
||||
MainWindow.ReceiveConfigurationParameters[3] = GetEncryptionMethodSS();
|
||||
|
||||
}
|
||||
|
||||
//产生随机的uuid
|
||||
private void ButtonNewUUID_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
TextBoxNewUUIDSS.Text = GenerateRandomUUID();
|
||||
}
|
||||
|
||||
//产生随机服务端口
|
||||
private void ButtonServerListenPort_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
TextBoxServerListenPortSS.Text = GenerateRandomPort().ToString();
|
||||
}
|
||||
//产生随机的Path
|
||||
private void ButtonPath_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
TextBoxWebSocketPathSS.Text = GenerateRandomPath();
|
||||
}
|
||||
|
||||
#region 相关参数生成函数
|
||||
//产生随机的UUID
|
||||
private string GenerateRandomUUID()
|
||||
{
|
||||
Guid uuid = Guid.NewGuid();
|
||||
return uuid.ToString();
|
||||
}
|
||||
//产生随机端口
|
||||
private int GenerateRandomPort()
|
||||
{
|
||||
Random random = new Random();
|
||||
return random.Next(30001, 50000);
|
||||
}
|
||||
//读取加密方式
|
||||
private string GetEncryptionMethodSS()
|
||||
{
|
||||
//string methodName;
|
||||
//object methodSelected;
|
||||
//methodSelected = ComboBoxEncryptionMethodInfo.SelectedValue;
|
||||
//methodName = methodSelected.ToString();
|
||||
//return methodName;
|
||||
return ComboBoxEncryptionMethodInfo.SelectedValue.ToString();
|
||||
}
|
||||
//产生随机的Path
|
||||
private string GenerateRandomPath()
|
||||
{
|
||||
Random random = new Random();
|
||||
int randomSerialNum = random.Next(0, 4);
|
||||
Guid uuid = Guid.NewGuid();
|
||||
string[] pathArray = uuid.ToString().Split('-');
|
||||
string path = pathArray[randomSerialNum];
|
||||
return $"/{path}";
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
//域名检测是否为空
|
||||
private bool TestDomainIsEmpty()
|
||||
{
|
||||
if (string.IsNullOrEmpty(TextBoxDomainSS.Text.ToString()) == true)
|
||||
{
|
||||
//****** "域名不能为空,请检查相关参数设置!" ******
|
||||
MessageBox.Show(Application.Current.FindResource("MessageBoxShow_DomainNotEmpty").ToString());
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,561 +0,0 @@
|
|||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:local="clr-namespace:ProxySU.Translations"
|
||||
xmlns:sys="clr-namespace:System;assembly=mscorlib">
|
||||
<!-- Main program interface -->
|
||||
<sys:String x:Key="TextBlockNewVersionReminder">The new version has been released!</sys:String>
|
||||
<sys:String x:Key="TextBlockNewVersionDown">Downloading...Wait Prompt...</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorDownProxyFail">The download of the latest version failed, please try again later!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorDownProxySuccess">Download the latest version successfully, the file has been saved in the same directory of the current ProxySU.exe</sys:String>
|
||||
<sys:String x:Key="ButtonUpgradeProxySU">Update</sys:String>
|
||||
<sys:String x:Key="MainWindowsLanguage">界面語言:</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderAppDeployment">Deployment</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderResourceTools">Resources</sys:String>
|
||||
<sys:String x:Key="TextBlockHostName">Host:</sys:String>
|
||||
<sys:String x:Key="TextBoxHostNamePrompt">IP or Domain (Not empty)</sys:String>
|
||||
<sys:String x:Key="TextBlockHostPart">Port:</sys:String>
|
||||
<sys:String x:Key="TextBlockHostUser">User:</sys:String>
|
||||
<sys:String x:Key="TextBlockHostPassword">Password:</sys:String>
|
||||
<sys:String x:Key="TextBlockHostCert">Key:</sys:String>
|
||||
<sys:String x:Key="TextBoxKeyNotEmptyPrompt">Key file Path (Not Empty)</sys:String>
|
||||
<sys:String x:Key="ButtonOpenFileDialog">Open...</sys:String>
|
||||
<sys:String x:Key="RadioButtonPasswordLogin">Password Login</sys:String>
|
||||
<sys:String x:Key="RadioButtonCertLogin">Key Login</sys:String>
|
||||
<sys:String x:Key="RadioButtonNoProxy">No Proxy</sys:String>
|
||||
<sys:String x:Key="RadioButtonProxyNoLogin">Not Login</sys:String>
|
||||
<sys:String x:Key="RadiobuttonProxyYesLogin">Requires Login</sys:String>
|
||||
<sys:String x:Key="TextBlockProxyHost">Proxy Addr:</sys:String>
|
||||
<sys:String x:Key="TextBlockSetUpProcessing">Waiting for installation and deployment</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderSysTools">System Tools</sys:String>
|
||||
<sys:String x:Key="ButtonV2RayTemplateConfiguration">V2Ray Templates</sys:String>
|
||||
<sys:String x:Key="ButtonV2RayOneKeyInstall">V2ray install</sys:String>
|
||||
<sys:String x:Key="ButtonUpdateV2ray">Upgrade V2Ray</sys:String>
|
||||
<sys:String x:Key="Button_canel">Cancel</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanGoTemplate">Trojan-Go Templates</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanGoSetUp">Trojan-Go install</sys:String>
|
||||
<sys:String x:Key="ButtonUpdateTrojanGo">Upgrade Trojan-Go</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanGoCancel">Cancel</sys:String>
|
||||
<sys:String x:Key="TextBlockCurrentlySelectedPlan">Currently selected plan:</sys:String>
|
||||
<sys:String x:Key="TextBlockCurrentlySelectedPlanNo">No plan selected</sys:String>
|
||||
<!-- The following Trojan settings parameter tab interface -->
|
||||
<sys:String x:Key="GroupBoxHeaderParameterTrojan">Parameter settings</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanTemplateExplanation">Mode: Trojan+TLS+Caddy</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanServerDomain">Domain:</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanPort">Port: 443</sys:String>
|
||||
<sys:String x:Key="TextBoxDomainPrompt">Domain Not Empty</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanHostPassword">Password:</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanChangePassword">Change</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanSetUp">Trojan install</sys:String>
|
||||
<sys:String x:Key="ButtonUpdateTrojan">Upgrade Trojan</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanCancel">Cancel</sys:String>
|
||||
<!-- The following NaiveProxy settings parameter tab interface -->
|
||||
<sys:String x:Key="TextBlockNaiveProxyTemplateExplanation">Mode: NaiveProxy+TLS+Caddy</sys:String>
|
||||
<sys:String x:Key="ButtonNaiveProxyChangeUser">Random</sys:String>
|
||||
<sys:String x:Key="ButtonNavieSetUp">NaiveProxy install</sys:String>
|
||||
<sys:String x:Key="ButtonNaiveCancel">Cancel</sys:String>
|
||||
<!-- 以下SSR设置参数标签页界面 -->
|
||||
<sys:String x:Key="TextBlockSSRTemplateExplanation">Mode: SSR+TLS+Caddy</sys:String>
|
||||
<sys:String x:Key="ButtonSSRSetUp">SSR install</sys:String>
|
||||
|
||||
<!-- 以下MTProto设置参数标签页界面 -->
|
||||
<sys:String x:Key="TextBlockMtgTemplateExplanation">Mode: MTProto+TLS</sys:String>
|
||||
<sys:String x:Key="ButtonMtgSetUp">MTProto install</sys:String>
|
||||
<sys:String x:Key="TextBlockMtgFakeDomainExplanation">Making domain name:</sys:String>
|
||||
<sys:String x:Key="TextBlockMtgPortExplanation">Recommended https ports 443, 2053, 2083, 2087, 2096, 8443</sys:String>
|
||||
<sys:String x:Key="TextBlockMtgSecretExplanation">The secret key will be randomly generated by the server.</sys:String>
|
||||
<!-- 以下SS设置参数标签页界面 -->
|
||||
<sys:String x:Key="ButtonSetUpSS">SS install</sys:String>
|
||||
<sys:String x:Key="ButtonTemplateConfigurationSS">SS plug-in library</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderNonePluginSS">Classic mode</sys:String>
|
||||
<sys:String x:Key="TextBlockNonePluginPointSS">Tip: This mode, long time, large traffic use, easy to be blocked and interfered, is not recommended!</sys:String>
|
||||
<sys:String x:Key="RadioButtonNonePluginSS">SS Classic</sys:String>
|
||||
<sys:String x:Key="TextBlockNonePluginExplainSS">SS classic use mode, no domain name is required, data is encrypted with high strength, and the data is recognized as unknown data. At present, the traffic is easy to be identified, and it is easy to be interfered and blocked. Use it with caution! Putting here is just a feeling and tribute!</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderObfsPluginSS">Simple-obfs plug-in</sys:String>
|
||||
<sys:String x:Key="TextBlockObfsPluginPointSS">Tip: This is a traffic obfuscation scheme used in the early days of SS. The plug-in has not been updated for a long time and is not recommended!</sys:String>
|
||||
<sys:String x:Key="RadioButtonObfsPluginHttpWebSS">SS+obfs+http+Web</sys:String>
|
||||
<sys:String x:Key="TextBlockObfsPluginHttpWebExplainSS">Does not require a domain name, the data is highly encrypted, the traffic is confused as http (not the real http), and the use of Web site camouflage can enhance the anti-recognition to a certain extent! CDN is not supported.</sys:String>
|
||||
<sys:String x:Key="RadioButtonObfsPluginHttpsWebSS">SS+obfs+TLS(https)+Web</sys:String>
|
||||
<sys:String x:Key="TextBlockObfsPluginTLShttpsWebExplainSS">requires a domain name, the use of a domain name will greatly enhance the anti-identification, high-strength data encryption, traffic confusion as https (not real https), the use of Web site camouflage, further enhance the anti-identification! CDN is not supported.</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayPluginSS">V2Ray plug-in</sys:String>
|
||||
<sys:String x:Key="TextBlockV2rayPluginPointSS">Reminder: ShadowRocket(ios) does not support SS+Quic mode</sys:String>
|
||||
<sys:String x:Key="RadioButtonWebSocketTLSWebSS">SS+WebSocket+TLS+Caddy (Web post)</sys:String>
|
||||
<sys:String x:Key="RadioButtonWebSocketTLSWebFrontSS">SS+WebSocket+TLS+Caddy (Web front)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayPluginPointSS">Tip: In the above scheme, there is no difference in the use effect between Web front and Web post. In the Web post scheme, the TLS certificate is applied for by acme.sh. After the certificate expires, acme.sh will automatically renew, but you need to manually restart SS to load the new certificate. The certificate in the web front-end solution is automatically applied for and loaded by Caddy without restarting SS.</sys:String>
|
||||
<sys:String x:Key="RadioButtonQuicSS">SS+QUIC</sys:String>
|
||||
<sys:String x:Key="TextBlockQuicExplainSS">V2Ray-Plugin uses QUIC protocol for transmission, and TLS encryption is mandatory. Encrypted data transmission, identified as udp traffic, was originally initiated by Google, advantages: reduced delay, multiplexing, connection migration, domain name is required,</sys:String>
|
||||
<!--<sys:String x:Key="TabItemHeaderOtherPluginsSS">kcptun/GoQuiet/Cloak plugin</sys:String>-->
|
||||
<sys:String x:Key="TabItemHeaderOtherPluginsSS">kcptun Plugin</sys:String>
|
||||
<sys:String x:Key="TextBlockGoQuietPluginPointSS">Reminder: Shadowrocket(ios) does not support GoQuiet-plugin. shadowsocks (Android) does not support GoQuiet-plugin and Cloak-plugin plug-ins</sys:String>
|
||||
<sys:String x:Key="TextBlockKcptunPluginExplainSS">KCP is a fast and reliable protocol. It can waste 10%-20% of bandwidth than TCP in exchange for a 30%-40% reduction in average latency and a three-fold reduction in maximum latency The transmission effect. Use UDP protocol for transmission, high-strength data encryption, transmission of the same content, kcp generally consumes more traffic than TCP, and will greatly increase the network speed under lines with high packet loss rates, and may be restricted by QOS at individual operators .</sys:String>
|
||||
<sys:String x:Key="TextBlockGoQuietPluginExplainSS">The basic principle is to simulate TLS traffic while disguising the server as a normal web server. This confusion is not the first: simple-obfs and ShadowsocksR’s tls1.2_ticket_auth mode proves this. It works. This plug-in improves the existing methods, and its goal is to make large-scale blockade of HTTPS servers (even IP segments) the only effective way to block SS</sys:String>
|
||||
<sys:String x:Key="TextBlockCloakPluginExplainSS">Use encryption to confuse proxy traffic into legitimate HTTPS traffic, and disguise the proxy server as a normal Web server to avoid Internet censorship. It can be seen as an upgraded version of GoQuiet above, optimizing the network connection speed, and not confusing https but real https traffic.</sys:String>
|
||||
<sys:String x:Key="TextBlockPluginNameExplainSS">Plugin program:</sys:String>
|
||||
<sys:String x:Key="TextBlockPluginOptionExplainSS">Plugin options:</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ExplainBuildSS">Use the compilation method, it will take a little longer, please be patient...</sys:String>
|
||||
<!-- The following system tool tab interface -->
|
||||
<sys:String x:Key="ButtonProofreadTime">Proofreading Time</sys:String>
|
||||
<sys:String x:Key="ButtonClearOccupiedPorts">Release 80/443</sys:String>
|
||||
<sys:String x:Key="ButtonTestAndEnableBBR">Enable BBR</sys:String>
|
||||
<sys:String x:Key="ButtonRemoveAllSoft">Uninstall Proxy</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_RemoveAllSoft">Only the proxy software installed by ProxySU and related configurations are supported. Please make sure that important configurations have been backed up. Uninstalling agents installed using other methods or scripts is not supported. Are you sure you want to uninstall the agent software on the remote host?</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartRemoveProxy">Start uninstall......</sys:String>
|
||||
|
||||
<!-- The following resource tool tab interface -->
|
||||
<sys:String x:Key="ButtonWebBrowserHomePage">Home</sys:String>
|
||||
<sys:String x:Key="ButtonWebBrowserForward">Forward</sys:String>
|
||||
<sys:String x:Key="ButtonWebBrowserBack">Back</sys:String>
|
||||
<sys:String x:Key="TextBlockWebExplain">Due to well-known reasons, loading is slow at certain times, please be patient</sys:String>
|
||||
<!-- The following Trojan-go template library interface -->
|
||||
<sys:String x:Key="GroupBoxHeaderTrojanGoTemplates">Trojan-go template library</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoTLSwebPlan">http/2 transmission, Caddy2 camouflage website, anti-recognition, CDN of CloudFlare is not currently supported</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoWebSocketTLSwebPlan">Use WebSocket transmission, Caddy2 camouflage website, anti-identification, support CloudFlare CDN</sys:String>
|
||||
<sys:String x:Key="GroupBoxHeaderParameterTrojanGo">Parameter settings</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoDomain">Domain name:</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoPort">Port: 443</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoPassword">Password:</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoPasswordExplain">Use the existing password and paste it directly into the box</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoWebSocketPath">WebSocket Path:</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanGoTemplateOK">OK</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanGoTemplateCancel">Cancel</sys:String>
|
||||
<!-- The following V2Ray template library interface -->
|
||||
<sys:String x:Key="GroupBoxHeaderV2RayTemplates">V2Ray Templates</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayHotPlan">Recommend</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayEarlyPlan">EarlyPlan</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayVlessProtocol">VLESS</sys:String>
|
||||
<sys:String x:Key="TextBlockVlessExplain">VLESS is a lightweight transmission protocol. Unlike VMess, VLESS don't depend on the system time. The authentication method is also UUID, but alterId is not required. Currently VLESS does not have its own encryption, please use it for reliable channels, such as TLS. Advantages: It can effectively reduce host resource consumption. Currently VLESS does not support sharing. Please ensure that both the client and server v2ray-core are the latest version.</sys:String>
|
||||
<sys:String x:Key="TextBlockVlessXtlsTcpExplain">XTLS works well on devices with low performance or without AES hard-decoding. For example, XTLS is used on hard routers, and the network speed can be doubled when the CPU is full, or the same The CPU occupancy rate is halved at Internet speed, and for mobile devices, the reduction in the amount of calculation means power saving.Version requires 4.29+ (Domain required) Not support CDN.</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayVlessTcpTlsWebExplain">Lightweight protocol VLESS, occupies less host resources, data TLS encrypted transmission, and Caddy2 is used as a disguised website on the node. Suitable for VPS with low configuration, or shared nodes by multiple people, the server client version requires 4.27+ (Domain required) Notsupport CDN.</sys:String>
|
||||
<sys:String x:Key="TextBlockVlessWebSocketTlsWebExplain">VLESS protocol, this type of solution with VMESS is more lightweight. Stability is strong, Caddy2 is front-facing, hidden proxy features, it is recognized as https traffic visiting the website, the strongest anti-blocking recognition, (Domain required) CDN is supported</sys:String>
|
||||
<sys:String x:Key="TextBlockVlessHttp2WebExplain">VLESS protocol, this type of solution with VMESS is more lightweight. Based on HTTP/2 transmission. Completely implemented in accordance with the HTTP/2 standard, with Caddy2 as the front, hidden proxy features, H2C protocol forwarding to V2Ray, (Domain required) CloudFlare CDN is not supported</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayTcpProtocol">TCP</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayWebSocketProtocol">WebSocket</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayHttp2Protocol">Http/2</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayMkcpProtocol">mKCP</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayQuicProtocol">QUIC</sys:String>
|
||||
<sys:String x:Key="GroupBoxHeaderParameterV2Ray">Parameter settings</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayServerPort">Server port:</sys:String>
|
||||
<sys:String x:Key="ButtonV2RayServerPortChange">Random</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayServerPortExplain">If TLS encryption is used, please keep the default port 443</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayUUIDExplain">Use the existing UUID and paste it directly into the box</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicUUID">QUIC Key:</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpSeedUUID">mKCP Seed:</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpExplain">Enable the mKCP Seed key to enhance anti-recognition, leave it blank to disable it. Version 4.24.2+</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayPath">Path:</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayVlessWsPath">VLESS ws path:</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayVmessTcpPath">VMESS tcp path:</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayVmessWsPath">VMESS ws path:</sys:String>
|
||||
<sys:String x:Key="TextBlockQuicEncryption">QUIC Encryption:</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayDomain">Domain name:</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMaskSites">Mask a website:</sys:String>
|
||||
<sys:String x:Key="TextBoxV2RayMaskSitesTag">Set this option to increase proxy concealment (can be empty)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayWebSocketTlsWebExplain">Strong stability, Caddy2 as the front, hidden proxy feature, recognized as https traffic to the website, the strongest anti-blocking recognition, domain name is required, CDN support</sys:String >
|
||||
<sys:String x:Key="TextBlockV2RayHttp2TlsWebExplain">based on HTTP/2 transmission. Completely implemented in accordance with the HTTP/2 standard, with Caddy2 as the front, hidden proxy features, H2C protocol forwarding to V2Ray, domain name is required, and CloudFlare CDN is not currently supported</sys:String>
|
||||
<sys:String x:Key="TextBlockVlessVmessXtlsTcpWebSocketExplainHot">VLESS over TCP with XTLS + fallback and shunt to WHATEVER (ultimate configuration), configured and recommended by rprx boss (author of xtls), configure the following five solutions at the same time on the server side, sharing the same domain name and port 443, WS can pass through CDN.</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayTcpExplain">Encrypted data transmission will be recognized as unknown tcp traffic</sys:String>
|
||||
<sys:String x:Key="RadioButtonV2RayTcpHttp">TCP+Http camouflage</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayTcpHttpExplain">Encrypted data transmission and HTTP disguise will be recognized as http traffic, but not real http access</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayTcpTlsExplain">Data encrypted transmission, the transmission protocol uses TLS, it will be recognized as TLS traffic, not equivalent to https traffic characteristics (domain name required)</sys:String>
|
||||
<sys:String x:Key="RadioButtonV2RayTcpTlsSelfSigned">TCP+TLS (self-signed certificate)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayTcpTlsSelfSignedExplain">Data encrypted transmission, the transmission protocol uses TLS, it will be recognized as TLS traffic, not equivalent to https traffic characteristics (no domain name required)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RaySelfSignedShadowrocketExplain">Shadowrocket (ios) needs to manually open the "Allow Unsafe" option</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayWebSocketExplain">Data encrypted transmission, the transmission protocol uses WebSocket, if TLS is not enabled, it will be recognized as WebSocket traffic.</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayWebSocketTlsExplain">Data encrypted transmission, the transmission protocol uses WebSocket, and TLS is enabled, it will be recognized as TLS traffic. (Domain name required),Support CDN.</sys:String>
|
||||
<sys:String x:Key="RadioButtonV2RayWebSocketTlsSelfSigned">WebSocket+TLS (self-signed certificate)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayWebSocketTlsSelfSignedExplain">Data encrypted transmission, the transmission protocol uses WebSocket, and TLS is enabled, and it will be recognized as TLS traffic. (No domain name required)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayHttp2Explain">The transmission method based on HTTP/2. It is fully implemented in accordance with the HTTP/2 standard and requires a domain name</sys:String>
|
||||
<sys:String x:Key="RadioButtonV2RayHttp2SelfSigned">HTTP2 (self-signed certificate)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayHttp2SelfSignedExplain">The transmission method based on HTTP/2. It is fully implemented in accordance with the HTTP/2 standard, uses a self-signed certificate, and does not require a domain name</sys:String>
|
||||
<sys:String x:Key="RadioButtonV2RayMkcpNone">mKCP (no camouflage)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpNoneExplain">Encrypted data transmission to increase bandwidth usage and reduce delay, udp protocol, no camouflage, will be recognized as udp traffic</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpSRTPExplain">Same as mKCP (without camouflage), add disguised as SRTP packet, it will be recognized as video call data (such as FaceTime)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpuTPExplain">Same as mKCP (without camouflage), adding a uTP packet disguised as a uTP data packet will be recognized as BT download data</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpWeChatExplain">Same as mKCP (no camouflage), adding data packets disguised as WeChat video calls</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpDTLSExplain">Same as mKCP (without camouflage), add disguised as DTLS 1.2 data packet</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpWireGuardExplain">Same as mKCP (without camouflage), with the addition of disguised as WireGuard packets. (Not the real WireGuard protocol)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicShadowrocketExplain">Reminder: Shadowrocket currently does not support QUIC transmission mode.</sys:String>
|
||||
<sys:String x:Key="RadioButtonV2RayQuicNone">QUIC (no camouflage)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicNoneExplain">Encrypted data transmission, no pretense will be recognized as udp traffic, originally created by Google, advantages: reduced delay, multiplexing, connection migration</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicSRTPExplain">Same as QUIC (no camouflage), adding a packet disguised as SRTP, it will be recognized as video call data (such as FaceTime)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicuTPExplain">Same as QUIC (without camouflage), add disguised as uTP data packet, it will be recognized as BT download data</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicWeChatExplain">Same as QUIC (no camouflage), adding data packets disguised as WeChat video calls</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicDTLSExplain">Same as QUIC (without camouflage), add disguised as DTLS 1.2 packet</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicWireGuardExplain">Same as QUIC (without camouflage), adding a pretend to be a WireGuard packet. (Not the real WireGuard protocol)</sys:String>
|
||||
<!--The following is the time proofreading window-->
|
||||
<sys:String x:Key="RadioButtonNetworkTime">Sync Network Time</sys:String>
|
||||
<sys:String x:Key="TextBlockNetworkTime">Correct the remote host time to the network time. Note: The time of the local computer must also be synchronized with the network time, otherwise the local computer V2ray may have a connection error

Recommendation: First use this method to proofread time</sys:String>
|
||||
<sys:String x:Key="RadioButtonLocalTime">Sync local time</sys:String>
|
||||
<sys:String x:Key="TextBlockLocalTime">Synchronize the remote host’s time to the local time. Note: The local computer’s time must be accurate and synchronized with the network time, otherwise there may be connection errors in other clients

Use this method when you can’t check the time when using the network</sys:String>
|
||||
<sys:String x:Key="RadioButtonUpDateLocalTime">Update the local time</sys:String>
|
||||
<sys:String x:Key="TextBlockUpDateLocalTime">Synchronize the local computer time with the network time.

Note: To use this function, you must run this program as an administrator</sys:String>
|
||||
<sys:String x:Key="ButtonTestTime">Detection Time</sys:String>
|
||||
<sys:String x:Key="ButtonProofreading">Proofread</sys:String>
|
||||
<!--The following is the client parameter display window-->
|
||||
<sys:String x:Key="GroupBoxHeaderClientParameter">Client configuration parameters</sys:String>
|
||||
<sys:String x:Key="TextBlockServerAddress">Server address:</sys:String>
|
||||
<sys:String x:Key="TextBlockServerPort">Port:</sys:String>
|
||||
<sys:String x:Key="TextBlockUserUUID">User ID(uuid):</sys:String>
|
||||
<sys:String x:Key="ButtonCopyV2RayUUIDtoClip">Copy</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_V2RayUUIDcopyedToClip">Copied to the clipboard!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_V2RayEmptyToClip">Empty content!</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayAlterId">alterId:</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayAlterIdExplain">The default is 16, and you can fill in a value not exceeding 64. If the client does not have this option, leave it blank</sys:String>
|
||||
<sys:String x:Key="TextBlockEncryption">Encryption method:</sys:String>
|
||||
<sys:String x:Key="TextBlockTransferProtocol">Transfer Protocol:</sys:String>
|
||||
<sys:String x:Key="TextBlockCamouflageType">Camouflage type(Confuse):</sys:String>
|
||||
<sys:String x:Key="TextBlockIsOrNotTLS">TLS Set:</sys:String>
|
||||
<sys:String x:Key="TextBlockCopyToClipExplain">Tip: Double-click the above content window to copy it to the clipboard.</sys:String>
|
||||
<sys:String x:Key="TextBlockClientPath">Path:</sys:String>
|
||||
<sys:String x:Key="TextBlockClientMkcpQuicKey">mKCP Seed/QUIC key:</sys:String>
|
||||
<sys:String x:Key="TextBlockEncryptionIsAuto">default auto</sys:String>
|
||||
<sys:String x:Key="GrouBoxHeaderUrlOrQR">QR/URL</sys:String>
|
||||
<sys:String x:Key="TextBlockUsedParameter">The above parameters can be entered into the client manually or by scanning. The configuration and related files used for the official client have been stored in the directory. Click the OK button to open</sys:String>
|
||||
<sys:String x:Key="TextBlockQrURLexplainV2Ray">QR code and URL link can be used
v2rayN(windows)
Trojan-QT5(windows)
Qv2ray(windows)
Shadowrocket(ios)
v2rayNG(Android)
Import v2ray node

Note: The Vless protocol requires manual input of configuration parameters, and the QR code and URL are invalid</sys:String>
|
||||
<sys:String x:Key="TextBlockQrURLexplainTrojan-go">" can be used for ShadowRocket (ios), ignore (Android), Trojan-QT5 (windows) to scan codes and import URLs. Note: some clients may not support WebSocket mode ."</sys:String>
|
||||
<sys:String x:Key="TextBlockQrURLexplainTrojan">"Can be used for ShadowRocket (ios), ignore (Android), Trojan-QT5 (windows) to scan codes and import URLs. Note: Some clients may not support WebSocket mode."</sys:String>
|
||||
<sys:String x:Key="TextBlockQrURLexplainNaiveProxy">URL import link for NaiveGUI (windows)</sys:String>
|
||||
<sys:String x:Key="TextBlockQrURLexplainSSR">Used to scan codes and import URL import links for ShadowsocksR (windows), SSRR (android), Shadowrocket (ios)</sys:String>
|
||||
<sys:String x:Key="TextBlockQrURLexplainSSmobile">For mobile phone client shadowsocks(android), Shadowrocket(ios) scan code and URL import link</sys:String>
|
||||
<sys:String x:Key="TextBlockQrURLexplainSSpc">For the computer client Shadowsocks (windows) scan code and URL import link</sys:String>
|
||||
<sys:String x:Key="TextBlockQrURLexplainSS">Scan code and URL import link for Shadowsocks (windows), shadowsocks(android), Shadowrocket(ios)</sys:String>
|
||||
<sys:String x:Key="TextBlockClientPromptSS">Reminder: The import format of the computer client Shadowsocks (windows) and the mobile client shadowsocks (android) and Shadowrocket (ios) are not compatible. Please select the corresponding format.</sys:String>
|
||||
<sys:String x:Key="RadioButtonMobileSS">Mobile phone</sys:String>
|
||||
<sys:String x:Key="RadioButtonPCSS">Computer side</sys:String>
|
||||
<sys:String x:Key="TextBlockShareQRcodeMtgTgIpv4">TG format QR</sys:String>
|
||||
<sys:String x:Key="TextBlockURLMtgTgIpv4">TG format URL (double-click to copy to the clipboard)</sys:String>
|
||||
<sys:String x:Key="TextBlockShareQRcodeMtgTmeIpv4">T.ME format QR</sys:String>
|
||||
<sys:String x:Key="TextBlockURLMtgTmeIpv4">T.ME format URL (double-click to copy to the clipboard)</sys:String>
|
||||
<!--The following is in the program-->
|
||||
<sys:String x:Key="MessageBoxShow_ErrorHostPortUserNotEmpty">Host address, host port, and user name are required and cannot be empty!!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorHostPortErr">The connection port contains non-numeric characters!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorHostPasswordNotEmpty">The login password is required and cannot be empty!!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorHostKeyNotEmpty">The key file is required and cannot be empty!!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorProxyAddressPortNotEmpty">If a proxy is selected, the proxy address and port cannot be empty!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorProxyUserPasswordNotEmpty">If the proxy needs to log in, the user name and password for proxy login cannot be empty!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorHostConnection">The remote host connection information is wrong, please check!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ChooseTemplate">Please select a configuration template first!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_FunctionResultErr">An error occurred, the installation was interrupted...</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_Login">Logging in to the remote host...</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_LoginSuccessful">The host login is successful!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_DetectionRootPermission">Detect whether it is running under root permissions...</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorRootPermission">Please use an account with root permissions to log in to the host! !</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_DetectionRootOK">Detection result: OK!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_TestExistSoft">Check whether the system has been installed</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ExistedSoft">The remote host has been installed</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ForceInstallSoft">, is it mandatory to reinstall?</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_InstallationCanceledExit">installation canceled, exit</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ForceInstallSoft">Selected mandatory installation</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_NoInstalledSoft">Test result: not installed</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_CheckSystemRequirements">Check whether the system meets the installation requirements...</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_CurrentKernelVersion">The current system kernel version is</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_RequiredKernelVersionExplain">, V2ray requires the kernel to be 2.6.23 and above. Please upgrade the kernel and install again!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_KernelVersionNotMatch">The system kernel version does not meet the requirements, and the installation failed! !</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_MissingSystemComponents">The system lacks necessary installation components such as: apt||dnf||yum||zypper||Syetemd, the host system is recommended to use: CentOS 7/8, Debian 8/9/10 ,Ubuntu 16.04 and above</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_MissingSystemComponents">The system environment does not meet the requirements, and the installation fails! !</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_SystemRequirementsOK">Test result: OK!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_EnableSELinux">It is detected that the system has SELinux enabled and it is working in strict mode. It needs to be changed to relaxed mode! Modifying...</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_SELinuxModifyOK">The modification is complete!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ProofreadingTime">Proofreading time...</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_TimeError">The difference between the local time and the remote host’s time exceeds the limit (90 seconds), please use'System Tools-->Time Correction' to verify the time before setting</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_TimeError">Time comparison failed...</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_TimeOK">The time difference meets the requirements, OK!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_TestDomainResolve">is checking whether the domain name is resolved to the IP of the current VPS...</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_DomainResolveOK">The resolution is correct! OK!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ErrorDomainResolve">The domain name could not be correctly resolved to the IP of the current VPS! Installation failed!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorDomainResolve">The domain name cannot be correctly resolved to the IP of the current VPS, please check! If the resolution setting is correct, please wait for it to take effect before retrying the installation. If the domain name uses CDN, please close it first!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_TestPortUsed">Detect port occupancy...</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorPortUsed">If one or all of the 80/443 ports are occupied, will the program occupying 80/443 ports be forcibly stopped?</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ErrorPortUsedFail">The port is occupied and the installation failed...</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ReleasePort">is releasing port 80/443...</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ReleasePortOK">The release of port 80/443 is complete!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorPortUsedOther">The port is occupied, will the program occupying this port be forcibly stopped?</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ReleasePortOther">Release the port...</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ReleasePortOKOther">The port is released!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_PortNotUsed">Test result: Not occupied!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartInstalling">The system environment has been tested and the installation requirements are met, and the deployment begins...</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_OpenFireWallPort">Open the corresponding port of the firewall...</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartInstallSoft">Installing</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_CompilingSS">Compiling, please wait patiently.............</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorInstallSoftFail">The installation failed, the script runs incorrectly!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_SoftInstallSuccess">The installation is successful!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UploadSoftConfig">After installation, upload the configuration file......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartInstallAcmeSh">Installing acme.sh......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_AcmeShInstallSuccess">acme.sh is installed successfully!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ErrorAcmeShInstallFail">acme.sh installation failed! The reason is unknown, please ask the developer!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartApplyCert">Apply for domain name certificate...</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ApplyCertSuccess">The certificate application is successful!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ApplyCertFail">Certificate application failed! The reason is unknown, please ask the developer!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_IntallCertToSoft">Install the certificate to</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_IntallCertToSoftOK">The certificate is successfully installed to</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_IntallCertToSoftFail">The certificate is installed to</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_InstallCertFailAsk">failed, the reason is unknown, you can ask the developer!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartInstallCaddy">Install Caddy...</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_NotInstalledCaddy">Test result: Caddy is not installed!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ErrorInstallCaddyFail">The installation of Caddy failed!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_InstalledCaddyOK">Caddy installed successfully!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UpgradeCaddy">is upgrading the Caddy v2.2.0 beta version for Http2Web mode!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UploadCaddyConfig">Upload Caddy configuration file...</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UploadCaddyConfigOK">The Caddy configuration file is uploaded successfully, OK!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartCaddyService">Starting Caddy...</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartCaddyServiceOK">Caddy started successfully!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartCaddyServiceFail">Caddy failed to start!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartCaddyServiceSecond">Starting Caddy (second attempt)!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartCaddyServiceSecondFail">Caddy failed to start (second time)! Exit the installation!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_CaddyServiceFailedExit">Caddy failed to start, the reason is unknown! Please ask the developer!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartSoft">Starting</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartSoftOK">Startup is successful!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartSoftFail">Startup failed!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartSoftSecond">is trying to start the second time</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartSoftSecondFail">failed to start (second time)! Exit the installation!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartSoftFailedExit">Startup failed, the reason is as above! Please troubleshoot the reason!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_TestBBR">BBR test...</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_EnableBBR">Enable BBR...</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_BBRisEnabled">BBR has been enabled!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_BBRFailed">The system does not meet the conditions for enabling BBR, and the enabling failed!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_BBREnabledSuccess">BBR is successfully activated!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_GenerateClientConfig">Generate client configuration...</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ProxyInstalledOK">The installation is successful, Enjoy it!!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_LoginFailed">Installation Failed!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorLoginOccurred">An error occurred!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorLoginUserOrPassword">Wrong password or wrong username!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorLoginHostOrPort">Please check whether the host address and port are correct, if it passes the proxy, please check whether the proxy is working properly</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorLoginKey">The selected key file is wrong or the format is wrong!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorLoginKeyOrUser">Login using the key, the key file is wrong or the user name is wrong!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorLoginHostOrProxyPort">The host address is wrong. If a proxy is used, it may also be the wrong port to connect to the proxy!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorUpgradeSoftNotInstall">Exit! Reason: The remote host is not installed</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_OldScriptInstalledV2Ray">V2Ray using the old installation script is detected...</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_OldScriptInstalledV2Ray">The V2Ray using the old installation script is detected. Do you want to uninstall the old version and reinstall it with the new installation script?</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_RemoveOldScriptInstalledV2Ray">Uninstalling the old version...</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_RemoveOldVersionOK">Uninstall the old version, OK!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_InstallNewVersion">Install the new version...</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_MoveOriginalConfig">Migrate the original configuration file.</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UpgradedNewVersion">has been updated to the latest version.</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_CurrentVersion">The current version of the remote host is: v</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_NewVersion">The latest version is:</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_IsOrNoUpgradeNewVersion">Is it upgraded to the latest version?</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartUpgradeNewVersion">Upgrading to the latest version</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UpgradeNewVersionOK">The upgrade is successful! It is currently the latest version!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UpgradeNewVersionFail">The upgrade failed. The reason is unknown. Please ask the developer!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UpgradeVersionCancel">Upgrade is cancelled, exit!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_IsNewVersion">The remote host is currently the latest version:</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_NotUpgradeVersion">No need to upgrade! drop out!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_DomainNotEmpty">The domain name cannot be empty, please check the relevant parameter settings!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_PleaseInstallSoftAtX64">Please install in x86_64 system</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_BackTrojanConfig">Back up the Trojan configuration file...</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_RestoreTrojanConfig">Restore the Trojan configuration file...</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ExistedCaddy">"Caddy has been installed on the remote host, but I’m not sure whether it supports forward proxy. Do I force a reinstallation?"</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_RemoveCaddyOrRebuiled">Please uninstall Caddy or reinstall the VPS system first!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_InstallRelySoft">Installing dependent software......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_SoftInstalledOK">The installation is complete! OK!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartCaddy">Installing Caddy.....</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UpgradeNaiveProxy">The server is being upgraded for NaiveProxy</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UpgradeNaiveProxyOK">The upgrade is complete, OK!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_OptimizeNetwork">Optimizing network parameters...</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_OptimizeNetworkOK">Optimize network parameters, OK!</sys:String>
|
||||
<!--The following is the V2Ray client description file-->
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine01">This file is the client configuration file used by the official V2Ray program. It is configured in global mode, socks5 address: 127.0.0.1:1080, http proxy address: 127.0.0.1:1081</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine02">v2ray official website: https://www.v2ray.com/</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine03">v2ray official program download address: https://github.com/v2ray/v2ray-core/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine04">download the corresponding version, Windows select v2ray-windows-64.zip or v2ray-windows-32.zip, extract v2ctl.exe and v2ray.exe after decompression. Put it in the same directory as config.json, just run v2ray.exe.</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine05">This file is v2rayN, Trojan-QT5, v2rayNG(Android), Shadowrocket(ios) scan code import node</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine06">v2rayN download URL: https://github.com/2dust/v2rayN/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine07">Trojan-QT5: https://github.com/Trojan-Qt5/Trojan-Qt5</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine08">v2rayNG(Android) download URL: https://github.com/2dust/v2rayNG/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine09">v2rayNG (Android) download URL on Google Play: https://play.google.com/store/apps/details?id=com.v2ray.ang</sys:String >
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine10">Shadowrocket(ios) download, you need to use the AppleID of the foreign region. Please Google method yourself.</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine11">This file is v2rayN, Trojan-QT5, v2rayNG(Android), Shadowrocket(ios) copy and paste the vmess URL of the imported node</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine12">Server general connection configuration parameters</sys:String>
|
||||
<!--The following is the Trojan-go client description file-->
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine01">This file is the client configuration file used by the official Trojan-go program, configured in global mode, http and socks5 address: 127.0.0.1:1080</sys:String >
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine02">Trojan-go official website: https://github.com/p4gefau1t/trojan-go</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine03">Trojan-go official program download address: https://github.com/p4gefau1t/trojan-go/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine04">Download the corresponding version, select Trojan-go-x.xx-win.zip for Windows, extract trojan-go.exe after decompression. Put it in the same directory as config.json, just run trojan-go.exe.</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine05">This file is for Qv2ray (windows), ignore (Android) scan code import node</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine06">Qv2ray (windows) download URL: https://github.com/Qv2ray/Qv2ray/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine07">igniter (Android) download URL: https://github.com/trojan-gfw/igniter/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine08">Shadowrocket(ios) download, you need to use the AppleID of the foreign region. Please Google method yourself.</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine09">This file is Qv2ray (windows), ignore (Android)copy and paste the URL of the imported node</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine10">Server general connection configuration parameters</sys:String>
|
||||
<!--The following is the documentation for the Trojan client-->
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine01">This file is the client configuration file used by the official Trojan program. It is configured in global mode, http and socks5 address: 127.0.0.1:1080</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine02">Trojan official website: https://trojan-gfw.github.io/trojan/</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine03">Trojan official program download address: https://github.com/trojan-gfw/trojan/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine04">Download the corresponding version, select Trojan-x.xx-win.zip for Windows, extract trojan.exe after decompression. Put it in the same directory as config.json, just run trojan.exe.</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine05">This file is Trojan-QT5 (windows), ignore (Android), Shadowrocket (ios) scan code import node</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine06">Trojan-QT5 (windows) download URL: https://github.com/TheWanderingCoel/Trojan-Qt5/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine07">igniter (Android) download URL: https://github.com/trojan-gfw/igniter/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine08">Shadowrocket(ios) download, you need to use the AppleID of the foreign region. Please Google method yourself.</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine09">This file is Trojan-QT5 (windows), ignore (Android), Shadowrocket (ios) copy and paste the URL of the imported node</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine10">Server general connection configuration parameters</sys:String>
|
||||
<!--The following is the NaiveProxy client documentation-->
|
||||
<sys:String x:Key="readmeTxtNaiveProxyExplainLine01">This file is the client configuration file used by the official NaiveProxy program, configured in global mode, socks5 address: 127.0.0.1:1080</sys:String>
|
||||
<sys:String x:Key="readmeTxtNaiveProxyExplainLine02">NaiveProxy official website: https://github.com/klzgrad/naiveproxy</sys:String>
|
||||
<sys:String x:Key="readmeTxtNaiveProxyExplainLine03">NaiveProxy official program download address: https://github.com/klzgrad/naiveproxy/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtNaiveProxyExplainLine04">download the corresponding version, select naiveproxy-x.xx-win.zip for Windows, extract naive.exe after decompression. Put it in the same directory as config.json, just run naive.exe.</sys:String>
|
||||
<sys:String x:Key="readmeTxtNaiveProxyExplainLine05">This file is NaiveGUI (windows) copy and paste the URL of the imported node</sys:String>
|
||||
<sys:String x:Key="readmeTxtNaiveProxyExplainLine06">NaiveGUI(windows) download URL: https://github.com/ExcitedCodes/NaiveGUI/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtNaiveProxyExplainLine07">Server general connection configuration parameters</sys:String>
|
||||
<!--The following is the SSR+TLS+Caddy client documentation-->
|
||||
<sys:String x:Key="readmeTxtSSRExplainLine05">This file is for ShadowsocksR (windows), SSRR (Android), Shadowrocket (ios) scan code import node</sys:String>
|
||||
<sys:String x:Key="readmeTxtSSRExplainLine06">ShadowsocksR (windows) download URL: https://github.com/shadowsocksrr/shadowsocksr-csharp/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtSSRExplainLine07">SSRR (Android) download URL: https://github.com/shadowsocksrr/shadowsocksr-android/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtSSRExplainLine08">Shadowrocket(ios) download, you need to use the AppleID of the foreign region. Please Google method yourself.</sys:String>
|
||||
<sys:String x:Key="readmeTxtSSRExplainLine09">This file is ShadowsocksR (windows), SSRR (Android), Shadowrocket (ios) copy and paste the URL of the imported node</sys:String>
|
||||
<sys:String x:Key="readmeTxtSSRExplainLine10">Server general connection configuration parameters</sys:String>
|
||||
<!--The following is the SS client description file-->
|
||||
<sys:String x:Key="readmeTxtExplainLineSS01">This file is a Shadowsocks (windows) scan code import node</sys:String>
|
||||
<sys:String x:Key="readmeTxtExplainLineSS02">This file is Shadowsocks (windows) copy and paste the URL of the imported node</sys:String>
|
||||
<sys:String x:Key="readmeTxtExplainLineSS05">This file is for shadowsocks (Android), Shadowrocket (ios) scan code to import nodes</sys:String>
|
||||
<sys:String x:Key="readmeTxtExplainLineSS06">Shadowsocks (windows) download URL: https://github.com/shadowsocks/shadowsocks-windows/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtExplainLineSS07">shadowsocks (Android) download URL: https://github.com/shadowsocks/shadowsocks-android/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtExplainLineSS08">Shadowrocket(ios) download, you need to use the AppleID of the foreign region. Please Google method yourself.</sys:String>
|
||||
<sys:String x:Key="readmeTxtExplainLineSS09">This file is shadowsocks (Android), Shadowrocket (ios) copy and paste the URL of the imported node</sys:String>
|
||||
<sys:String x:Key="readmeTxtExplainLineSS10">Server general connection configuration parameters</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS">plug-in instructions</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS01">ProxySU defaults all plug-ins, under the subfolder plugins of the folder where the Shadowsocks (windows) run file is located.</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS02">Instructions for manually installing the plug-in on the computer</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS03">First download the plug-in, the download address of each plug-in Windows client is:</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS04">Simple-obfs: https://github.com/shadowsocks/simple-obfs/releases only download obfs-local.zip</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS05">V2ray-plugin: https://github.com/shadowsocks/v2ray-plugin/releases 64-bit system selection: v2ray-plugin-windows-amd64-vx.xxtar.gz , 32-bit system selection: v2ray-plugin-windows-386-vx.xxtar.gz (x is a number, is the version number)</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS06">Kcptun-plugin: https://github.com/shadowsocks/kcptun/releases 64-bit system selection: kcptun-windows-amd64-xxxxxx.tar.gz, 32-bit system selection :Kcptun-plugin-windows-386-xxxxxx.tar.gz (x is a number, is the version number)</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS07">GoQuiet-plugin: https://github.com/cbeuw/GoQuiet/releases 64-bit system selection: gq-client-windows-amd64-xxxexe, 32-bit system selection: gq-client-windows-386-xxxexe (x is a number, is the version number)</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS08">Cloak-plugin: https://github.com/cbeuw/Cloak/releases 64-bit system selection: ck-client-windows-amd64-xxxexe, 32-bit system selection: ck-client-windows-386-xxxexe (x is a number, is the version number)</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS09">In the folder where the Shadowsocks (windows) run file is located, create a new folder plugins, and copy all the files (two) extracted from obfs-local.zip to plugins, v2ray -plugin download the file, unzip the file, copy it to plugins, and rename it to: v2ray-plugin.exe. Kcptun-plugin downloads the file, unzip the two files, copy the file starting with client_windows into the plugins, and rename it to: kcptun-client.exe. The file downloaded by GoQuiet-plugin is directly copied to the plugin and renamed to: goquiet-client.exe. The file downloaded by Cloak-plugin is directly copied to the plugin and renamed to: cloak-client.exe</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS10">installation completed</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSSandroid02">Mobile Android client plug-in installation instructions</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSSandroid03">first download the plug-in, the download address of each plug-in Android client is:</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSSandroid04">Simple-obfs: https://github.com/shadowsocks/simple-obfs-android/releases only download obfs-local-nightly-xxxapk (x is a number, is the version Number)</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSSandroid05">V2ray-plugin: https://github.com/shadowsocks/v2ray-plugin-android/releases Generally choose v2ray--universal-xxxapk (x is a number, is the version number )</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSSandroid06">Kcptun-plugin: https://github.com/shadowsocks/kcptun-android/releases Generally choose kcptun--universal-xxxapk (x is a number, is the version number)</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSSandroid07">Transfer the above apk file to the phone and install it!</sys:String>
|
||||
<!--<sys:String x:Key="TabItemHeaderAppDeployment">Deployment</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderResourceTools">Resource Tools</sys:String>
|
||||
<sys:String x:Key="TextBlockHostName">Host:</sys:String>
|
||||
<sys:String x:Key="TextBoxHostNamePrompt">IP or Domain (Not empty)</sys:String>
|
||||
<sys:String x:Key="TextBlockHostPart">Port:</sys:String>
|
||||
<sys:String x:Key="TextBlockHostUser">User:</sys:String>
|
||||
<sys:String x:Key="TextBlockHostPassword">Password:</sys:String>
|
||||
<sys:String x:Key="TextBlockSetUpProcessing">Waiting for Deployment</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderSysTools">Tools</sys:String>
|
||||
<sys:String x:Key="ButtonV2RayTemplateConfiguration">V2Ray Templates</sys:String>
|
||||
<sys:String x:Key="ButtonV2RayOneKeyInstall">Install V2ray</sys:String>
|
||||
<sys:String x:Key="ButtonUpdateV2ray">Upgrade V2Ray</sys:String>
|
||||
<sys:String x:Key="Button_canel">Canel</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanGoTemplate">Trojan-Go Templates</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanGoSetUp">Install Trojan-Go</sys:String>
|
||||
<sys:String x:Key="ButtonUpdateTrojanGo">Upgrade Trojan-Go</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanGoCancel">Canel</sys:String>
|
||||
<sys:String x:Key="GroupBoxHeaderParameterTrojan">Parameter</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanTemplateExplanation">Plan: Trojan+TLS+Caddy</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanServerDomain">Server Domain:</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanPort">Port: 443</sys:String>
|
||||
<sys:String x:Key="TextBoxDomainPrompt">Domain name cannot be empty</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanHostPassword">Password:</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanChangePassword">Change</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanSetUp">Install Trojan</sys:String>
|
||||
<sys:String x:Key="ButtonUpdateTrojan">Upgrade Trojan</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanCancel">Cancel</sys:String>
|
||||
<sys:String x:Key="TextBlockNaiveProxyTemplateExplanation">Plan: NaiveProxy+TLS+Caddy</sys:String>
|
||||
<sys:String x:Key="ButtonNaiveProxyChangeUser">Change</sys:String>
|
||||
<sys:String x:Key="ButtonNavieSetUp">Install NaiveProxy</sys:String>
|
||||
<sys:String x:Key="ButtonNaiveCancel">Cancel</sys:String>
|
||||
<sys:String x:Key="ButtonProofreadTime">Proofread Time</sys:String>
|
||||
<sys:String x:Key="ButtonClearOccupiedPorts">Release Port 80/443</sys:String>
|
||||
<sys:String x:Key="ButtonTestAndEnableBBR">Turn on BBR</sys:String>
|
||||
<sys:String x:Key="ButtonWebBrowserHomePage">Home</sys:String>
|
||||
<sys:String x:Key="ButtonWebBrowserForward">Forward</sys:String>
|
||||
<sys:String x:Key="ButtonWebBrowserBack">Back</sys:String>
|
||||
<sys:String x:Key="TextBlockWebExplain">Due to well-known reasons, loading is slow at certain times, please be patient</sys:String>
|
||||
<sys:String x:Key="GroupBoxHeaderTrojanGoTemplates">Trojan-go Templates</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoTLSwebPlan">HTTP/2 transmission, Caddy2 camouflage website, anti-identification, does not support CloudFlare CDN temporarily</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoWebSocketTLSwebPlan">Use WebSocket transmission, Caddy2 camouflage website, anti-identification, support CloudFlare CDN</sys:String>
|
||||
<sys:String x:Key="GroupBoxHeaderParameterTrojanGo">Parameter</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoDomain">Domain:</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoPort">Port: 443</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoPassword">Password: </sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoPasswordExplain">Use the existing password and paste it directly into the box</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoWebSocketPath">WebSocket Path: </sys:String>
|
||||
<sys:String x:Key="ButtonTrojanGoTemplateOK">OK</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanGoTemplateCancel">Cancel</sys:String>
|
||||
<sys:String x:Key="GroupBoxHeaderV2RayTemplates">V2Ray Templates</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayHotPlan">Recommend</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayTcpProtocol">TCP</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayWebSocketProtocol">WebSocket</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayHttp2Protocol">Http/2</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayMkcpProtocol">mKCP</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayQuicProtocol">QUIC</sys:String>
|
||||
<sys:String x:Key="GroupBoxHeaderParameterV2Ray">Parameter</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayServerPort">Port: </sys:String>
|
||||
<sys:String x:Key="ButtonV2RayServerPortChange">Change</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayServerPortExplain">TLS encryption, keep port 443</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayUUIDExplain">Use the existing UUID and paste it directly into the box</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicUUID">mKCP/QUIC Key</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpExplain">Enable mKCP key to enhance anti-recognition, Blank to disabled, 4.24.2+ required, V2rayN not support</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayPath">Path: </sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayDomain">Domain: </sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMaskSites">Shield Websites: </sys:String>
|
||||
<sys:String x:Key="TextBoxV2RayMaskSitesTag">Increase the concealment of the agent (can be empty)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayWebSocketTlsWebExplain">Strong stability, Caddy2 is front-facing, hidden proxy features, it is recognized as https traffic visiting the website, the strongest anti-blocking recognition, domain name is required, CDN support</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayHttp2TlsWebExplain">Based on HTTP/2 transmission. Completely implemented in accordance with the HTTP/2 standard, with Caddy2 as the front end, hidden proxy features, H2C protocol forwarding to V2Ray, domain name is required, and CloudFlare CDN is not supported temporarily</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayTcpExplain">Encrypted data transmission will be recognized as unknown tcp traffic</sys:String>
|
||||
<sys:String x:Key="RadioButtonV2RayTcpHttp">TCP+Http(Disguise)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayTcpHttpExplain">Encrypted transmission of data and http disguise will be recognized as http traffic, but not real http access</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayTcpTlsExplain">Encrypted data transmission, the transmission protocol uses TLS, it will be recognized as TLS traffic, not equivalent to https traffic characteristics (domain name required)</sys:String>
|
||||
<sys:String x:Key="RadioButtonV2RayTcpTlsSelfSigned">TCP+TLS(Self-signed)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayTcpTlsSelfSignedExplain">Encrypted data transmission, the transmission protocol uses TLS, it will be recognized as TLS traffic, not equivalent to https traffic characteristics (no domain name required)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RaySelfSignedShadowrocketExplain">Shadowrocket (ios) needs to manually turn on the "Allow Insecure" option</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayVlessTcpTlsWebExplain">Lightweight protocol VLESS, occupies less host resources, data TLS encrypted transmission, and Caddy2 is used as a disguised website on the node. Suitable for low-configuration VPS, or multiple people sharing nodes, the server client version requires 4.27+ (domain name required)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayWebSocketExplain">Data is encrypted for transmission. The transmission protocol uses WebSocket. If TLS is not enabled, it will be recognized as WebSocket traffic.</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayWebSocketTlsExplain">Data is encrypted for transmission, the transmission protocol uses WebSocket, and TLS is enabled, it will be recognized as TLS traffic. (Domain name required)</sys:String>
|
||||
<sys:String x:Key="RadioButtonV2RayWebSocketTlsSelfSigned">WebSocket+TLS (Self-signed)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayWebSocketTlsSelfSignedExplain">Data is encrypted for transmission, the transmission protocol uses WebSocket, and TLS is enabled, it will be recognized as TLS traffic. (No domain name required)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayHttp2Explain">Transmission method based on HTTP/2. It is fully implemented in accordance with the HTTP/2 standard and requires a domain name</sys:String>
|
||||
<sys:String x:Key="RadioButtonV2RayHttp2SelfSigned">HTTP2 (Self-signed)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayHttp2SelfSignedExplain">Transmission method based on HTTP/2. It is fully implemented in accordance with the HTTP/2 standard, uses a self-signed certificate, and does not require a domain name</sys:String>
|
||||
<sys:String x:Key="RadioButtonV2RayMkcpNone">mKCP(No disguise)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpNoneExplain">Data encrypted transmission to increase bandwidth usage and reduce delay, udp protocol, no camouflage, will be recognized as udp traffic</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpSRTPExplain">Same as mKCP (no camouflage), adding a packet disguised as SRTP will be recognized as video call data (such as FaceTime)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpuTPExplain">Same as mKCP (without camouflage), add disguised as uTP data packet, it will be recognized as BT download data</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpWeChatExplain">Same as mKCP (no camouflage), adding data packets disguised as WeChat video calls</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpDTLSExplain">Same as mKCP (no masquerading), adding masquerading as DTLS 1.2 packets</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpWireGuardExplain">Same as mKCP (without camouflage), adding a pretend to be a WireGuard packet. (Not a real WireGuard protocol)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicShadowrocketExplain">Reminder: Shadowrocket currently does not support QUIC transmission mode.</sys:String>
|
||||
<sys:String x:Key="RadioButtonV2RayQuicNone">QUIC(No disguise)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicNoneExplain">Encrypted data transmission, no pretense will be recognized as udp traffic, produced by Google, advantages: reduced delay, multiplexing, connection migration</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicSRTPExplain">Same as QUIC (no camouflage), adding a packet disguised as SRTP will be recognized as video call data (such as FaceTime)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicuTPExplain">Same as QUIC (no camouflage), adding a packet disguised as uTP, it will be recognized as BT download data</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicWeChatExplain">Same as QUIC (no camouflage), adding data packets disguised as WeChat video calls</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicDTLSExplain">Same as QUIC (no masquerading), adding masquerading as DTLS 1.2 packets</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicWireGuardExplain">Same as QUIC (without camouflage), adding a packet disguised as WireGuard. (Not a real WireGuard protocol)</sys:String>
|
||||
--><!--以下为程序内的--><!--
|
||||
<sys:String x:Key="MessageBoxShow_ErrorHostConnection">The remote host connection information is wrong, please check</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ChooseTemplate">Please select a configuration template first!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_Login">Logging in to the remote host......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_LoginSuccessful">Host login is successful!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_DetectionRootPermission">Check whether it is running under root privileges...</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorRootPermission">Please log in to the host with an account with root privileges!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_DetectionRootOK">Test result: OK!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_TestExistV2Ray">Check whether the system has installed V2ray....</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ExistedV2Ray">V2ray has been installed on the remote host, do you force it to reinstall?</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_InstallationCanceledExit">Installation canceled, exit</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ForceInstallV2Ray">You have chosen to install V2Ray forcefully!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_NoInstalledV2Ray">Test result: V2Ray is not installed!</sys:String>-->
|
||||
|
||||
|
||||
<!--<sys:String x:Key="BtnOK">OK</sys:String>
|
||||
<sys:String x:Key="HdNo">No.</sys:String>
|
||||
<sys:String x:Key="HdName">Name</sys:String>
|
||||
<sys:String x:Key="HdGender">Gender</sys:String>
|
||||
<sys:String x:Key="HdDept">Dept</sys:String>
|
||||
<sys:String x:Key="HdEmail">Email</sys:String>
|
||||
<sys:String x:Key="HdTel">Tel</sys:String>
|
||||
<sys:String x:Key="MsgShowTime">Now</sys:String>
|
||||
<sys:String x:Key="BtnOK1">OK</sys:String>
|
||||
<sys:String x:Key="HdNo1">No.</sys:String>
|
||||
<sys:String x:Key="HdName1">Name</sys:String>
|
||||
<sys:String x:Key="HdGender1">Gender</sys:String>
|
||||
<sys:String x:Key="HdDept1">Dept</sys:String>
|
||||
<sys:String x:Key="HdEmail1">Email</sys:String>
|
||||
<sys:String x:Key="HdTel1">Tel</sys:String>
|
||||
<sys:String x:Key="MsgShowTime1">Now</sys:String>-->
|
||||
|
||||
</ResourceDictionary>
|
|
@ -1,450 +0,0 @@
|
|||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:local="clr-namespace:ProxySU.Translations"
|
||||
xmlns:sys="clr-namespace:System;assembly=mscorlib">
|
||||
<!-- 主程序界面 -->
|
||||
<sys:String x:Key="TextBlockNewVersionReminder">最新版本已发布了,快去更新一下吧!</sys:String>
|
||||
<sys:String x:Key="TextBlockNewVersionDown">正在下载最新版,请等待完成提示....</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorDownProxyFail">最新版下载失败,请稍后重试!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorDownProxySuccess">下载最新版成功,文件已存入当前ProxySU.exe同一目录</sys:String>
|
||||
<sys:String x:Key="ButtonUpgradeProxySU">下载更新</sys:String>
|
||||
<sys:String x:Key="MainWindowsLanguage">Languages:</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderAppDeployment">应用布署</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderResourceTools">资源工具</sys:String>
|
||||
<sys:String x:Key="TextBlockHostName">主机:</sys:String>
|
||||
<sys:String x:Key="TextBoxHostNamePrompt">IP或域名(不可为空)</sys:String>
|
||||
<sys:String x:Key="TextBlockHostPart">端口:</sys:String>
|
||||
<sys:String x:Key="TextBlockHostUser">用户:</sys:String>
|
||||
<sys:String x:Key="TextBlockHostPassword">密码:</sys:String>
|
||||
<sys:String x:Key="TextBlockHostCert">密钥:</sys:String>
|
||||
<sys:String x:Key="TextBoxKeyNotEmptyPrompt">密钥文件存放路径(不可为空)</sys:String>
|
||||
<sys:String x:Key="ButtonOpenFileDialog">浏览...</sys:String>
|
||||
<sys:String x:Key="RadioButtonPasswordLogin">密码登录</sys:String>
|
||||
<sys:String x:Key="RadioButtonCertLogin">密钥登录</sys:String>
|
||||
<sys:String x:Key="RadioButtonNoProxy">无代理</sys:String>
|
||||
<sys:String x:Key="RadioButtonProxyNoLogin">不需登录</sys:String>
|
||||
<sys:String x:Key="RadiobuttonProxyYesLogin">需要登录</sys:String>
|
||||
<sys:String x:Key="TextBlockProxyHost">代理地址:</sys:String>
|
||||
<sys:String x:Key="TextBlockSetUpProcessing">等待安装布署</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderSysTools">系统工具</sys:String>
|
||||
<sys:String x:Key="ButtonV2RayTemplateConfiguration">V2Ray模板库</sys:String>
|
||||
<sys:String x:Key="ButtonV2RayOneKeyInstall">V2ray一键安装</sys:String>
|
||||
<sys:String x:Key="ButtonUpdateV2ray">升级V2Ray</sys:String>
|
||||
<sys:String x:Key="Button_canel">取消</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanGoTemplate">Trojan-Go参数设置</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanGoSetUp">Trojan-Go一键安装</sys:String>
|
||||
<sys:String x:Key="ButtonUpdateTrojanGo">升级Trojan-Go</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanGoCancel">取消</sys:String>
|
||||
<sys:String x:Key="TextBlockCurrentlySelectedPlan">当前所选方案:</sys:String>
|
||||
<sys:String x:Key="TextBlockCurrentlySelectedPlanNo">未选择方案</sys:String>
|
||||
<!-- 以下Trojan设置参数标签页界面 -->
|
||||
<sys:String x:Key="GroupBoxHeaderParameterTrojan">参数设置</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanTemplateExplanation">模式:Trojan+TLS+Caddy</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanServerDomain">服务器地址(域名):</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanPort">端口:443</sys:String>
|
||||
<sys:String x:Key="TextBoxDomainPrompt">域名不可为空</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanHostPassword">密码:</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanChangePassword">更新</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanSetUp">Trojan一键安装</sys:String>
|
||||
<sys:String x:Key="ButtonUpdateTrojan">升级Trojan</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanCancel">取消</sys:String>
|
||||
<!-- 以下NaiveProxy设置参数标签页界面 -->
|
||||
<sys:String x:Key="TextBlockNaiveProxyTemplateExplanation">模式:NaiveProxy+TLS+Caddy</sys:String>
|
||||
<sys:String x:Key="ButtonNaiveProxyChangeUser">随机</sys:String>
|
||||
<sys:String x:Key="ButtonNavieSetUp">NaiveProxy一键安装</sys:String>
|
||||
<sys:String x:Key="ButtonNaiveCancel">取消</sys:String>
|
||||
<!-- 以下SSR设置参数标签页界面 -->
|
||||
<sys:String x:Key="TextBlockSSRTemplateExplanation">模式:SSR+TLS+Caddy</sys:String>
|
||||
<sys:String x:Key="ButtonSSRSetUp">SSR一键安装</sys:String>
|
||||
|
||||
<!-- 以下MTProto设置参数标签页界面 -->
|
||||
<sys:String x:Key="TextBlockMtgTemplateExplanation">模式:MTProto+TLS</sys:String>
|
||||
<sys:String x:Key="ButtonMtgSetUp">MTProto一键安装</sys:String>
|
||||
<sys:String x:Key="TextBlockMtgFakeDomainExplanation">伪装域名:</sys:String>
|
||||
<sys:String x:Key="TextBlockMtgPortExplanation">推荐用常见https端口443、2053、2083、2087、2096、8443</sys:String>
|
||||
<sys:String x:Key="TextBlockMtgSecretExplanation">密钥将由服务端随机生成,这里无需设置。</sys:String>
|
||||
|
||||
<!-- 以下SS设置参数标签页界面 -->
|
||||
<sys:String x:Key="ButtonSetUpSS">SS 一键安装</sys:String>
|
||||
<sys:String x:Key="ButtonTemplateConfigurationSS">SS 插件库</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderNonePluginSS">经典模式</sys:String>
|
||||
<sys:String x:Key="TextBlockNonePluginPointSS">提示:这种模式,长时间,大流量使用,容易被阻断和干扰,不推荐使用!</sys:String>
|
||||
<sys:String x:Key="RadioButtonNonePluginSS">SS 经典</sys:String>
|
||||
<sys:String x:Key="TextBlockNonePluginExplainSS">SS经典使用模式,无需域名,数据高强度加密,数据被识别为未知数据。目前流量容易被识别,极易被干扰与阻断,慎重使用!放在这里仅仅只是一种情怀与致敬!</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderObfsPluginSS">Simple-obfs 插件</sys:String>
|
||||
<sys:String x:Key="TextBlockObfsPluginPointSS">提示:这是SS早期使用的流量混淆方案,插件已经长时间不再更新,不推荐使用!</sys:String>
|
||||
<sys:String x:Key="RadioButtonObfsPluginHttpWebSS">SS+obfs+http+Web</sys:String>
|
||||
<sys:String x:Key="TextBlockObfsPluginHttpWebExplainSS">无需域名,数据高强度加密,流量混淆为http(并非真正的http),使用Web网站伪装,可在一定程度上增强抗识别!不支持CDN。</sys:String>
|
||||
<sys:String x:Key="RadioButtonObfsPluginHttpsWebSS">SS+obfs+TLS(https)+Web</sys:String>
|
||||
<sys:String x:Key="TextBlockObfsPluginTLShttpsWebExplainSS">需要域名,使用域名将很大增强抗识别,数据高强度加密,流量混淆为https(并非真正的https),使用Web网站伪装,进一步增强抗识别!不支持CDN。</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayPluginSS">V2Ray 插件</sys:String>
|
||||
<sys:String x:Key="TextBlockV2rayPluginPointSS">提醒:ShadowRocket(ios)不支持SS+Quic模式</sys:String>
|
||||
<sys:String x:Key="RadioButtonWebSocketTLSWebSS">SS+WebSocket+TLS+Caddy(Web后置)</sys:String>
|
||||
<sys:String x:Key="RadioButtonWebSocketTLSWebFrontSS">SS+WebSocket+TLS+Caddy(Web前置)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayPluginPointSS">提示:上面方案中的Web前置与Web后置,使用效果上没有差别,Web后置方案,TLS证书由acme.sh申请,证书到期后,acme.sh会自动续期,但是需要手动重启SS加载新证书。而Web前置方案中的证书由Caddy自动申请并加载,不需要重启SS。</sys:String>
|
||||
<sys:String x:Key="RadioButtonQuicSS">SS+QUIC</sys:String>
|
||||
<sys:String x:Key="TextBlockQuicExplainSS">通过V2Ray-Plugin使用QUIC协议传输,强制使用TLS加密。数据加密传输,被识别为udp流量,最初由谷歌创始,优点:减少延迟、多路复用、连接迁移,需要域名,</sys:String>
|
||||
<!--<sys:String x:Key="TabItemHeaderOtherPluginsSS">kcptun/GoQuiet/Cloak 插件</sys:String>-->
|
||||
<sys:String x:Key="TabItemHeaderOtherPluginsSS">kcptun 插件</sys:String>
|
||||
<sys:String x:Key="TextBlockGoQuietPluginPointSS">提醒:Shadowrocket(ios)不支持GoQuiet-plugin插件。shadowsocks(Android)不支持GoQuiet-plugin与Cloak-plugin插件</sys:String>
|
||||
<sys:String x:Key="TextBlockKcptunPluginExplainSS">KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。使用UDP协议传输,数据高强度加密,传输同样的内容,kcp 一般比 TCP 消耗更多的流量,在丢包率高的线路下将极大提高网速,在个别运营商处可能会被QOS限制。</sys:String>
|
||||
<sys:String x:Key="TextBlockGoQuietPluginExplainSS">基本原理为模拟TLS的流量同时将服务器伪装成一个正常的网站服务器,这个混淆思路并非首创:simple-obfs和ShadowsocksR的tls1.2_ticket_auth模式证明这条道是行得通的。此插件对现有的方法进行了改善,其目标为让大规模封锁HTTPS服务器(甚至IP段)成为封锁SS的唯一有效手段</sys:String>
|
||||
<sys:String x:Key="TextBlockCloakPluginExplainSS">通过加密方式将代理流量混淆为合法的HTTPS流量,并将代理服务器伪装成普通的Web服务器以规避互联网审查。可以看成是上面GoQuiet升级版,优化网络连接速度,并且不是混淆https而是真正的https流量。</sys:String>
|
||||
<sys:String x:Key="TextBlockPluginNameExplainSS">插件程序:</sys:String>
|
||||
<sys:String x:Key="TextBlockPluginOptionExplainSS">插件选项:</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ExplainBuildSS">使用编译方式,时间稍长,请耐心等待......</sys:String>
|
||||
|
||||
<!-- 以下系统工具标签页界面 -->
|
||||
<sys:String x:Key="ButtonProofreadTime">校对时间</sys:String>
|
||||
<sys:String x:Key="ButtonClearOccupiedPorts">释放80/443端口</sys:String>
|
||||
<sys:String x:Key="ButtonTestAndEnableBBR">启用BBR</sys:String>
|
||||
<sys:String x:Key="ButtonRemoveAllSoft">卸载代理</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_RemoveAllSoft">仅支持卸载由ProxySU安装的代理软件及相关配置,请确保重要配置已备份。不支持卸载使用其他方法或脚本安装的代理。确定要卸载远程主机上的代理软件吗?</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartRemoveProxy">开始卸载</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_DiscoverProxySoft">检测到已安装</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_RemoveProxySoftFailed">卸载失败!请向开发者问询!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_RemoveProxySoftSuccess">卸载成功!</sys:String>
|
||||
|
||||
<!-- 以下资源工具标签页界面 -->
|
||||
<sys:String x:Key="ButtonWebBrowserHomePage">主页</sys:String>
|
||||
<sys:String x:Key="ButtonWebBrowserForward">前进</sys:String>
|
||||
<sys:String x:Key="ButtonWebBrowserBack">后退</sys:String>
|
||||
<sys:String x:Key="TextBlockWebExplain">由于众所周知的原因,在某些时候,加载缓慢,请耐心等待一下</sys:String>
|
||||
<!-- 以下Trojan-go模板库界面 -->
|
||||
<sys:String x:Key="GroupBoxHeaderTrojanGoTemplates">Trojan-go 模板库</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoTLSwebPlan">http/2传输,Caddy2伪装网站,抗识别,暂不支持CloudFlare的CDN</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoWebSocketTLSwebPlan">使用WebSocket传输,Caddy2伪装网站,抗识别,支持CloudFlare的CDN</sys:String>
|
||||
<sys:String x:Key="GroupBoxHeaderParameterTrojanGo">参数设置</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoDomain">域名:</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoPort">端口: 443</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoPassword">密码:</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoPasswordExplain">使用已有密码,直接粘贴到框中</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoWebSocketPath">WebSocket路径:</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanGoTemplateOK">确定</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanGoTemplateCancel">取消</sys:String>
|
||||
<!-- 以下V2Ray模板库界面 -->
|
||||
<sys:String x:Key="GroupBoxHeaderV2RayTemplates">V2Ray 模板库</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayHotPlan">推荐方案</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayEarlyPlan">尝鲜方案</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayVlessProtocol">VLESS协议</sys:String>
|
||||
<sys:String x:Key="TextBlockVlessExplain">VLESS 是一个无状态的轻量传输协议,与 VMess 不同,VLESS 不依赖于系统时间,认证方式同样为 UUID,但不需要 alterId。目前 VLESS 没有自带加密,请用于可靠信道,如 TLS。优点:可以有效的降低主机资源消耗。目前 VLESS 不支持分享。VLESS 处于公测阶段,测试期间请确保客户端与服务端的 v2ray-core 均为最新版本。</sys:String>
|
||||
<sys:String x:Key="TextBlockVlessXtlsTcpExplain">XTLS 在低性能或没有 AES 硬解的设备上效果出众,如在硬路由上换用 XTLS,同样跑满 CPU 时实现网速 翻倍,或是相同网速时 CPU 占用率减半,而对于移动设备,计算量减少意味着省电。服务端客户端版本要求4.29+ (需域名)不支持CDN。</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayVlessTcpTlsWebExplain">轻量协议VLESS,占用更少主机资源,数据TLS加密传输,用Caddy2在节点上做伪装网站。适合配置低的VPS,或多人共用节点,服务端客户端版本要求4.27+ (需域名)不支持CDN。</sys:String>
|
||||
<sys:String x:Key="TextBlockVlessWebSocketTlsWebExplain">使用VLESS协议,与VMESS的此类型方案,更轻量。稳定性强,Caddy2做前置,隐藏代理特征,被识别为访问网站的https流量,抗封锁识别最强,需要域名,支持CDN</sys:String>
|
||||
<sys:String x:Key="TextBlockVlessHttp2WebExplain">使用VLESS协议,与VMESS的此类型方案,更轻量。基于 HTTP/2 传输。完整按 HTTP/2 标准实现,Caddy2做前置,隐藏代理特征,H2C协议转发到V2Ray,需要域名,暂不支持CloudFlare的CDN</sys:String>
|
||||
|
||||
<sys:String x:Key="TabItemHeaderV2RayTcpProtocol">TCP传输协议</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayWebSocketProtocol">WebSocket传输协议</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayHttp2Protocol">Http/2传输协议</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayMkcpProtocol">mKCP传输协议</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayQuicProtocol">QUIC传输协议</sys:String>
|
||||
<sys:String x:Key="GroupBoxHeaderParameterV2Ray">参数设置</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayServerPort">服务器端口:</sys:String>
|
||||
<sys:String x:Key="ButtonV2RayServerPortChange">随机选择</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayServerPortExplain">若使用TLS加密,请保持默认的443端口</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayUUIDExplain">使用已有UUID,直接粘贴到框中</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicUUID">QUIC密钥:</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpSeedUUID">mKCP Seed:</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpExplain">启用mKCP Seed密钥,可增强抗识别,留空则禁用,要求版本4.24.2+</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayPath">路径:</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayVlessWsPath">VLESS ws路径:</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayVmessTcpPath">VMESS tcp路径:</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayVmessWsPath">VMESS ws路径:</sys:String>
|
||||
|
||||
<sys:String x:Key="TextBlockQuicEncryption">QUIC加密方式:</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayDomain">域名:</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMaskSites">伪装网站:</sys:String>
|
||||
<sys:String x:Key="TextBoxV2RayMaskSitesTag">设置此项可增加代理的隐蔽(可为空)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayWebSocketTlsWebExplain">稳定性强,Caddy2做前置,隐藏代理特征,被识别为访问网站的https流量,抗封锁识别最强,需要域名,支持CDN</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayHttp2TlsWebExplain">基于 HTTP/2 传输。完整按 HTTP/2 标准实现,Caddy2做前置,隐藏代理特征,H2C协议转发到V2Ray,需要域名,暂不支持CloudFlare的CDN</sys:String>
|
||||
<sys:String x:Key="TextBlockVlessVmessXtlsTcpWebSocketExplainHot">VLESS over TCP with XTLS + 回落 and 分流 to WHATEVER(终极配置),由rprx大佬 (xtls作者) 配置并推荐,在服务端同时配置以下五种方案,共用同一域名与443端口,其中 WS 都可以通过 CDN。</sys:String>
|
||||
<sys:String x:Key="RadioButtonV2RayTcpHttp">TCP+Http伪装</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayTcpExplain">数据加密传输,会被识别为未知的tcp流量</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayTcpHttpExplain">数据加密传输,并做http伪装,会被识别为http流量,但并不是真正的http访问</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayTcpTlsExplain">数据加密传输,传输协议使用TLS,会被识别为TLS流量,不等同于https流量特征 (需域名)</sys:String>
|
||||
<sys:String x:Key="RadioButtonV2RayTcpTlsSelfSigned">TCP+TLS(自签证书)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayTcpTlsSelfSignedExplain">数据加密传输,传输协议使用TLS,会被识别为TLS流量,不等同于https流量特征 (无需域名)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RaySelfSignedShadowrocketExplain">Shadowrocket (ios)需要手动打开“允许不安全”选项</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayWebSocketExplain">数据加密传输,传输协议使用WebSocket,未启用TLS,将被识别为WebSocket流量。</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayWebSocketTlsExplain">数据加密传输,传输协议使用WebSocket,启用TLS,将被识别为TLS流量。(需要域名)支持CDN。</sys:String>
|
||||
<sys:String x:Key="RadioButtonV2RayWebSocketTlsSelfSigned">WebSocket+TLS(自签证书)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayWebSocketTlsSelfSignedExplain">数据加密传输,传输协议使用WebSocket,启用TLS,将被识别为TLS流量。(无需域名)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayHttp2Explain">基于 HTTP/2 的传输方式。它完整按照 HTTP/2 标准实现,需要域名</sys:String>
|
||||
<sys:String x:Key="RadioButtonV2RayHttp2SelfSigned">HTTP2(自签证书)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayHttp2SelfSignedExplain">基于 HTTP/2 的传输方式。它完整按照 HTTP/2 标准实现,使用自签名证书,不需要域名</sys:String>
|
||||
<sys:String x:Key="RadioButtonV2RayMkcpNone">mKCP(无伪装)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpNoneExplain">数据加密传输,以增加带宽占用,减少延迟,udp协议,无伪装,会被识别为udp流量</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpSRTPExplain">同mKCP(无伪装),增加伪装成 SRTP 数据包,会被识别为视频通话数据(如 FaceTime)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpuTPExplain">同mKCP(无伪装),增加伪装成 uTP 数据包,会被识别为 BT 下载数据</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpWeChatExplain">同mKCP(无伪装),增加伪装成微信视频通话的数据包</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpDTLSExplain">同mKCP(无伪装),增加伪装成 DTLS 1.2 数据包</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpWireGuardExplain">同mKCP(无伪装),增加伪装成 WireGuard 数据包。(并不是真正的 WireGuard 协议)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicShadowrocketExplain">提醒:Shadowrocket目前暂不支持QUIC的传输模式。</sys:String>
|
||||
<sys:String x:Key="RadioButtonV2RayQuicNone">QUIC(无伪装)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicNoneExplain">数据加密传输,无伪装会被识别为udp流量,最初由谷歌创始,优点:减少延迟、多路复用、连接迁移</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicSRTPExplain">同QUIC(无伪装),增加伪装成 SRTP 数据包,会被识别为视频通话数据(如 FaceTime)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicuTPExplain">同QUIC(无伪装),增加伪装成 uTP 数据包,会被识别为 BT 下载数据</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicWeChatExplain">同QUIC(无伪装),增加伪装成微信视频通话的数据包</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicDTLSExplain">同QUIC(无伪装),增加伪装成 DTLS 1.2 数据包</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicWireGuardExplain">同QUIC(无伪装),增加伪装成 WireGuard 数据包。(并不是真正的 WireGuard 协议)</sys:String>
|
||||
<!--以下为时间校对窗口-->
|
||||
<sys:String x:Key="RadioButtonNetworkTime">同步网络时间</sys:String>
|
||||
<sys:String x:Key="TextBlockNetworkTime">将远程主机时间校正为网络时间,注意:本机电脑的时间必须也是与网络时间同步的,否则本机电脑V2ray有可能连接出错

推荐:优先使用此方法校对时间</sys:String>
|
||||
<sys:String x:Key="RadioButtonLocalTime">同步本机时间</sys:String>
|
||||
<sys:String x:Key="TextBlockLocalTime">将远程主机时间同步为本地时间,注意:本机电脑的时间必须是准确的,与网络时间同步的,否则其他客户端中,有可能连接出错

使用网络校时无法校对时间时,使用此种方法</sys:String>
|
||||
<sys:String x:Key="RadioButtonUpDateLocalTime">更新本机时间</sys:String>
|
||||
<sys:String x:Key="TextBlockUpDateLocalTime">将本机电脑时间与网络时间同步。

注意:使用此项功能,必须以管理员身份运行本程序</sys:String>
|
||||
<sys:String x:Key="ButtonTestTime">检测时间误差</sys:String>
|
||||
<sys:String x:Key="ButtonProofreading">校对时间</sys:String>
|
||||
<!--以下为客户端参数显示窗口-->
|
||||
<sys:String x:Key="GroupBoxHeaderClientParameter">客户端配置参数</sys:String>
|
||||
<sys:String x:Key="TextBlockServerAddress">服务器地址(address):</sys:String>
|
||||
<sys:String x:Key="TextBlockServerPort">端口(port):</sys:String>
|
||||
<sys:String x:Key="TextBlockUserUUID">用户ID(uuid):</sys:String>
|
||||
<sys:String x:Key="ButtonCopyV2RayUUIDtoClip">复制</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_V2RayUUIDcopyedToClip">已复制到剪贴板中!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_V2RayEmptyToClip">空内容!</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayAlterId">额外ID:</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayAlterIdExplain">不超过64,客户端没此项可不填</sys:String>
|
||||
<sys:String x:Key="TextBlockEncryption">加密方式:</sys:String>
|
||||
<sys:String x:Key="TextBlockTransferProtocol">传输协议:</sys:String>
|
||||
<sys:String x:Key="TextBlockCamouflageType">伪装类型(混淆):</sys:String>
|
||||
<sys:String x:Key="TextBlockIsOrNotTLS">TLS设置:</sys:String>
|
||||
<sys:String x:Key="TextBlockCopyToClipExplain">提示:双击以上内容窗,即可复制到剪贴板中。</sys:String>
|
||||
<sys:String x:Key="TextBlockClientPath">路径(Path):</sys:String>
|
||||
<sys:String x:Key="TextBlockClientQuicKey">QUIC密钥:</sys:String>
|
||||
<sys:String x:Key="TextBlockClientMkcpSeed">mKCP Seed:</sys:String>
|
||||
<sys:String x:Key="TextBlockEncryptionIsAuto">默认auto</sys:String>
|
||||
<sys:String x:Key="GrouBoxHeaderUrlOrQR">二维码/URL</sys:String>
|
||||
<sys:String x:Key="TextBlockUsedParameter">以上参数可以手动或扫描输入客户端,用于官方客户端的配置和相关文件已经存放入目录下,点击 确定 按扭可打开</sys:String>
|
||||
<sys:String x:Key="TextBlockQrURLexplainV2Ray">二维码和URL链接可用于
v2rayN(windows)
Trojan-QT5(windows)
Qv2ray(windows)
Shadowrocket(ios)
v2rayNG(Android)
导入v2ray节点

注意:Vless协议需要手动输入配置参数,二维码和URL无效</sys:String>
|
||||
<sys:String x:Key="TextBlockQrURLexplainTrojan-go">"可用于ShadowRocket (ios)、igniter(Android)、Trojan-QT5 (windows) 扫码和导入url。注意:有的客户端可能不支持WebSocket模式。"</sys:String>
|
||||
<sys:String x:Key="TextBlockQrURLexplainTrojan">"可用于ShadowRocket (ios)、igniter(Android)、Trojan-QT5 (windows) 扫码和导入url。注意:有的客户端可能不支持WebSocket模式。"</sys:String>
|
||||
<sys:String x:Key="TextBlockQrURLexplainNaiveProxy">用于NaiveGUI(windows)的URL导入链接</sys:String>
|
||||
<sys:String x:Key="TextBlockQrURLexplainSSR">用于ShadowsocksR(windows)、SSRR(android)、Shadowrocket(ios)的扫码和URL导入链接</sys:String>
|
||||
<sys:String x:Key="TextBlockQrURLexplainSSmobile">用于手机客户端shadowsocks(android)、Shadowrocket(ios)的扫码和URL导入链接</sys:String>
|
||||
<sys:String x:Key="TextBlockQrURLexplainSSpc">用于电脑客户端Shadowsocks (windows)的扫码和URL导入链接</sys:String>
|
||||
<sys:String x:Key="TextBlockQrURLexplainSS">用于Shadowsocks (windows)、shadowsocks(android)、Shadowrocket(ios)的扫码和URL导入链接</sys:String>
|
||||
<sys:String x:Key="TextBlockClientPromptSS">提醒: 电脑客户端Shadowsocks (windows)与手机客户端shadowsocks(android)、Shadowrocket(ios)的导入格式不兼容,请选择相应格式。</sys:String>
|
||||
<sys:String x:Key="RadioButtonMobileSS">手机端</sys:String>
|
||||
<sys:String x:Key="RadioButtonPCSS">电脑端</sys:String>
|
||||
<sys:String x:Key="TextBlockShareQRcodeMtgTgIpv4">TG格式QR</sys:String>
|
||||
<sys:String x:Key="TextBlockURLMtgTgIpv4">TG格式URL(双击复制到剪切板中)</sys:String>
|
||||
<sys:String x:Key="TextBlockShareQRcodeMtgTmeIpv4">T.ME格式QR</sys:String>
|
||||
<sys:String x:Key="TextBlockURLMtgTmeIpv4">T.ME格式URL(双击复制到剪切板中)</sys:String>
|
||||
|
||||
<!--以下为程序内的-->
|
||||
<sys:String x:Key="MessageBoxShow_ErrorHostPortUserNotEmpty">主机地址、主机端口、用户名为必填项,不能为空!!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorHostPortErr">连接端口含有非数字字符!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorHostPasswordNotEmpty">登录密码为必填项,不能为空!!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorHostKeyNotEmpty">密钥文件为必填项,不能为空!!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorProxyAddressPortNotEmpty">如果选择了代理,则代理地址与端口不能为空!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorProxyUserPasswordNotEmpty">如果代理需要登录,则代理登录的用户名与密码不能为空!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorHostConnection">远程主机连接信息有误,请检查!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ChooseTemplate">请先选择配置模板!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_FunctionResultErr">发生错误,安装中断......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_Login">正在登录远程主机......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_LoginSuccessful">主机登录成功!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_DetectionRootPermission">检测是否运行在root权限下...</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorRootPermission">请使用具有root权限的账户登录主机!!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_DetectionRootOK">检测结果:OK!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_TestExistSoft">检测系统是否已经安装</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ExistedSoft">远程主机已安装</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ForceInstallSoft">,是否强制重新安装?</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_InstallationCanceledExit">安装取消,退出</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ForceInstallSoft">已选择强制安装</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_NoInstalledSoft">检测结果:未安装</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_CheckSystemRequirements">检测系统是否符合安装要求......</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_CurrentKernelVersion">当前系统内核版本为</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_RequiredKernelVersionExplain">,V2ray要求内核为2.6.23及以上。请升级内核再安装!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_KernelVersionNotMatch">系统内核版本不符合要求,安装失败!!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_MissingSystemComponents">系统缺乏必要的安装组件如:apt||dnf||yum||zypper||Syetemd,主机系统推荐使用:CentOS 7/8,Debian 8/9/10,Ubuntu 16.04及以上版本</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_MissingSystemComponents">系统环境不满足要求,安装失败!!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_SystemRequirementsOK">检测结果:OK!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_EnableSELinux">检测到系统启用SELinux,且工作在严格模式下,需改为宽松模式!修改中......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_SELinuxModifyOK">修改完毕!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ProofreadingTime">校对时间......</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_TimeError">本地时间与远程主机时间相差超过限制(90秒),请先用 '系统工具-->时间校对' 校对时间后再设置</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_TimeError">时间较对失败......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_TimeOK">时间差符合要求,OK!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_TestDomainResolve">正在检测域名是否解析到当前VPS的IP上......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_DomainResolveOK">解析正确!OK!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ErrorDomainResolve">域名未能正确解析到当前VPS的IP上!安装失败!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorDomainResolve">域名未能正确解析到当前VPS的IP上,请检查!若解析设置正确,请等待生效后再重试安装。如果域名使用了CDN,请先关闭!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_TestPortUsed">检测端口占用情况......</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorPortUsed">80/443端口之一,或全部被占用,将强制停止占用80/443端口的程序?</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ErrorPortUsedFail">端口被占用,安装失败......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ReleasePort">正在释放80/443端口......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ReleasePortOK">80/443端口释放完毕!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorPortUsedOther">端口被占用,将强制停止占用此端口的程序?</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ReleasePortOther">正在释放端口......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ReleasePortOKOther">端口释放完毕!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_PortNotUsed">检测结果:未被占用!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartInstalling">系统环境检测完毕,符合安装要求,开始布署......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_OpenFireWallPort">开启防火墙相应端口......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartInstallSoft">正在安装</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_CompilingSS">编译中,请耐心等待.............</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorInstallSoftFail">安装失败,脚本运行出错!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_SoftInstallSuccess">安装成功!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UploadSoftConfig">安装完毕,上传配置文件......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartInstallAcmeSh">正在安装acme.sh......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_AcmeShInstallSuccess">acme.sh安装成功!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ErrorAcmeShInstallFail">acme.sh安装失败!原因未知,请向开发者提问!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartApplyCert">申请域名证书......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ApplyCertSuccess">证书申请成功!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ApplyCertFail">证书申请失败!原因未知,请向开发者提问!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_IntallCertToSoft">安装证书到</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_IntallCertToSoftOK">证书成功安装到</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_IntallCertToSoftFail">证书安装到</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_InstallCertFailAsk">失败,原因未知,可以向开发者提问!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartInstallCaddy">安装Caddy......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_NotInstalledCaddy">检测结果:未安装Caddy!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ErrorInstallCaddyFail">安装Caddy失败!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_InstalledCaddyOK">Caddy安装成功!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UpgradeCaddy">正在为Http2Web模式升级Caddy v2.2.0测试版!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UploadCaddyConfig">上传Caddy配置文件......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UploadCaddyConfigOK">Caddy配置文件上传成功,OK!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartCaddyService">正在启动Caddy......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartCaddyServiceOK">Caddy启动成功!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartCaddyServiceFail">Caddy启动失败!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartCaddyServiceSecond">正在启动Caddy(第二次尝试)!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartCaddyServiceSecondFail">Caddy启动失败(第二次)!退出安装!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_CaddyServiceFailedExit">Caddy启动失败,原因未知!请向开发者问询!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartSoft">正在启动</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartSoftOK">启动成功!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartSoftFail">启动失败!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartSoftSecond">正在第二次尝试启动</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartSoftSecondFail">启动失败(第二次)!退出安装!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartSoftFailedExit">启动失败,原因如上!请排查原因!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_TestBBR">BBR测试......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_EnableBBR">正在启用BBR......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_BBRisEnabled">BBR已经启用了!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_BBRFailed">系统不满足启用BBR的条件,启用失败!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_BBREnabledSuccess">BBR 启用成功!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_GenerateClientConfig">生成客户端配置......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ProxyInstalledOK">安装成功,祝你玩的愉快!!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_LoginFailed">安装失败!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorLoginOccurred">发生错误!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorLoginUserOrPassword">密码错误或用户名错误!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorLoginHostOrPort">请检查主机地址及端口是否正确,如果通过代理,请检查代理是否正常工作</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorLoginKey">所选密钥文件错误或者格式不对!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorLoginKeyOrUser">使用密钥登录,密钥文件错误或用户名错误!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorLoginHostOrProxyPort">主机地址错误,如果使用了代理,也可能是连接代理的端口错误!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorUpgradeSoftNotInstall">退出!原因:远程主机未安装</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_OldScriptInstalledV2Ray">检测到使用旧安装脚本的V2Ray......</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_OldScriptInstalledV2Ray">检测到使用旧安装脚本的V2Ray,是否卸载旧版本并使用新安装脚本重新安装?</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_RemoveOldScriptInstalledV2Ray">正在卸载旧版本......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_RemoveOldVersionOK">卸载旧版本,OK!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_InstallNewVersion">安装新版本......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_MoveOriginalConfig">迁移原配置文件。</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UpgradedNewVersion">已更新到最新版本。</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_CurrentVersion">远程主机当前版本为:v</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_NewVersion">最新版本为:</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_IsOrNoUpgradeNewVersion">是否升级为最新版本?</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartUpgradeNewVersion">正在升级到最新版本</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UpgradeNewVersionOK">升级成功!当前已是最新版本!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UpgradeNewVersionFail">升级失败,原因未知,请向开发者提问!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UpgradeVersionCancel">升级取消,退出!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_IsNewVersion">远程主机当前已是最新版本:</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_NotUpgradeVersion">无需升级!退出!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_DomainNotEmpty">域名不能为空,请检查相关参数设置!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_PleaseInstallSoftAtX64">请在x86_64系统中安装</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_BackTrojanConfig">备份Trojan配置文件......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_RestoreTrojanConfig">恢复Trojan配置文件......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ExistedCaddy">"远程主机已安装Caddy,但不确定是否支持forward proxy,是否强制重新安装?"</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_RemoveCaddyOrRebuiled">请先行卸载Caddy或重装VPS系统!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_InstallRelySoft">正在安装依赖的软件......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_SoftInstalledOK">安装完毕!OK!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartCaddy">正在安装Caddy.....</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UpgradeNaiveProxy">正在为NaiveProxy升级服务端</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UpgradeNaiveProxyOK">升级完毕,OK!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_OptimizeNetwork">正在优化网络参数......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_OptimizeNetworkOK">优化网络参数,OK!</sys:String>
|
||||
<!--以下为V2Ray客户端说明文件-->
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine01">此文件为V2Ray官方程序所使用的客户端配置文件,配置为全局模式,socks5地址:127.0.0.1:1080,http代理地址:127.0.0.1:1081</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine02">v2ray官方网站:https://www.v2ray.com/</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine03">v2ray官方程序下载地址:https://github.com/v2ray/v2ray-core/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine04">下载相应版本,Windows选择v2ray-windows-64.zip或者v2ray-windows-32.zip,解压后提取v2ctl.exe和v2ray.exe。与config.json放在同一目录,运行v2ray.exe即可。</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine05">此文件为v2rayN、Trojan-QT5、v2rayNG(Android)、Shadowrocket(ios)扫码导入节点</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine06">v2rayN下载网址:https://github.com/2dust/v2rayN/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine07">Trojan-QT5:https://github.com/Trojan-Qt5/Trojan-Qt5</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine08">v2rayNG(Android)下载网址:https://github.com/2dust/v2rayNG/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine09">v2rayNG(Android)在Google Play下载网址:https://play.google.com/store/apps/details?id=com.v2ray.ang</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine10">Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine11">此文件为v2rayN、Trojan-QT5、v2rayNG(Android)、Shadowrocket(ios)复制粘贴导入节点的vmess网址</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine12">服务器通用连接配置参数:</sys:String>
|
||||
<!--以下为Trojan-go客户端说明文件-->
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine01">此文件为Trojan-go官方程序所使用的客户端配置文件,配置为全局模式,http与socks5地址:127.0.0.1:1080</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine02">Trojan-go官方网站:https://github.com/p4gefau1t/trojan-go</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine03">Trojan-go官方程序下载地址:https://github.com/p4gefau1t/trojan-go/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine04">下载相应版本,Windows选择Trojan-go-x.xx-win.zip,解压后提取trojan-go.exe。与config.json放在同一目录,运行trojan-go.exe即可。</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine05">此文件为Qv2ray (windows)、igniter(Android)扫码导入节点</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine06">Qv2ray (windows)下载网址:https://github.com/Qv2ray/Qv2ray/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine07">igniter(Android)下载网址:https://github.com/trojan-gfw/igniter/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine08">Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine09">此文件为Qv2ray (windows)、igniter(Android)复制粘贴导入节点的网址</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine10">服务器通用连接配置参数</sys:String>
|
||||
<!--以下为Trojan客户端说明文件-->
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine01">此文件为Trojan官方程序所使用的客户端配置文件,配置为全局模式,http与socks5地址:127.0.0.1:1080</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine02">Trojan官方网站:https://trojan-gfw.github.io/trojan/</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine03">Trojan官方程序下载地址:https://github.com/trojan-gfw/trojan/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine04">下载相应版本,Windows选择Trojan-x.xx-win.zip,解压后提取trojan.exe。与config.json放在同一目录,运行trojan.exe即可。</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine05">此文件为Trojan-QT5 (windows)、igniter(Android)、Shadowrocket(ios)扫码导入节点</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine06">Trojan-QT5 (windows)下载网址:https://github.com/TheWanderingCoel/Trojan-Qt5/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine07">igniter(Android)下载网址:https://github.com/trojan-gfw/igniter/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine08">Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine09">此文件为Trojan-QT5 (windows)、igniter(Android)、Shadowrocket(ios)复制粘贴导入节点的网址</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine10">服务器通用连接配置参数</sys:String>
|
||||
<!--以下为NaiveProxy客户端说明文件-->
|
||||
<sys:String x:Key="readmeTxtNaiveProxyExplainLine01">此文件为NaiveProxy官方程序所使用的客户端配置文件,配置为全局模式,socks5地址:127.0.0.1:1080</sys:String>
|
||||
<sys:String x:Key="readmeTxtNaiveProxyExplainLine02">NaiveProxy官方网站:https://github.com/klzgrad/naiveproxy</sys:String>
|
||||
<sys:String x:Key="readmeTxtNaiveProxyExplainLine03">NaiveProxy官方程序下载地址:https://github.com/klzgrad/naiveproxy/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtNaiveProxyExplainLine04">下载相应版本,Windows选择naiveproxy-x.xx-win.zip,解压后提取naive.exe。与config.json放在同一目录,运行naive.exe即可。</sys:String>
|
||||
<sys:String x:Key="readmeTxtNaiveProxyExplainLine05">此文件为NaiveGUI(windows)复制粘贴导入节点的网址</sys:String>
|
||||
<sys:String x:Key="readmeTxtNaiveProxyExplainLine06">NaiveGUI(windows)下载网址:https://github.com/ExcitedCodes/NaiveGUI/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtNaiveProxyExplainLine07">服务器通用连接配置参数</sys:String>
|
||||
<!--以下为SSR+TLS+Caddy客户端说明文件-->
|
||||
<sys:String x:Key="readmeTxtSSRExplainLine05">此文件为ShadowsocksR (windows)、SSRR(Android)、Shadowrocket(ios)扫码导入节点</sys:String>
|
||||
<sys:String x:Key="readmeTxtSSRExplainLine06">ShadowsocksR (windows)下载网址:https://github.com/shadowsocksrr/shadowsocksr-csharp/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtSSRExplainLine07">SSRR(Android)下载网址:https://github.com/shadowsocksrr/shadowsocksr-android/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtSSRExplainLine08">Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。</sys:String>
|
||||
<sys:String x:Key="readmeTxtSSRExplainLine09">此文件为ShadowsocksR (windows)、SSRR(Android)、Shadowrocket(ios)复制粘贴导入节点的网址</sys:String>
|
||||
<sys:String x:Key="readmeTxtSSRExplainLine10">服务器通用连接配置参数</sys:String>
|
||||
<!--以下为SS客户端说明文件-->
|
||||
<sys:String x:Key="readmeTxtExplainLineSS01">此文件为Shadowsocks (windows)扫码导入节点</sys:String>
|
||||
<sys:String x:Key="readmeTxtExplainLineSS02">此文件为Shadowsocks (windows)复制粘贴导入节点的网址</sys:String>
|
||||
<sys:String x:Key="readmeTxtExplainLineSS05">此文件为shadowsocks(Android)、Shadowrocket(ios)扫码导入节点</sys:String>
|
||||
<sys:String x:Key="readmeTxtExplainLineSS06">Shadowsocks (windows)下载网址:https://github.com/shadowsocks/shadowsocks-windows/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtExplainLineSS07">shadowsocks(Android)下载网址:https://github.com/shadowsocks/shadowsocks-android/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtExplainLineSS08">Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。</sys:String>
|
||||
<sys:String x:Key="readmeTxtExplainLineSS09">此文件为shadowsocks(Android)、Shadowrocket(ios)复制粘贴导入节点的网址</sys:String>
|
||||
<sys:String x:Key="readmeTxtExplainLineSS10">服务器通用连接配置参数</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS">插件使用说明</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS01">ProxySU默认所有插件,在Shadowsocks (windows)运行文件所在文件夹的子文件夹plugins下。</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS02">电脑端手动安装插件说明</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS03">先下载插件,各个插件Windows客户端下载地址为:</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS04">Simple-obfs: https://github.com/shadowsocks/simple-obfs/releases 只下载 obfs-local.zip</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS05">V2ray-plugin: https://github.com/shadowsocks/v2ray-plugin/releases 64位系统选择:v2ray-plugin-windows-amd64-vx.x.x.tar.gz,32位系统选择:v2ray-plugin-windows-386-vx.x.x.tar.gz (x为数字,是版本号)</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS06">Kcptun-plugin: https://github.com/shadowsocks/kcptun/releases 64位系统选择:kcptun-windows-amd64-xxxxxx.tar.gz,32位系统选择:kcptun-plugin-windows-386-xxxxxx.tar.gz (x为数字,是版本号)</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS07">GoQuiet-plugin: https://github.com/cbeuw/GoQuiet/releases 64位系统选择:gq-client-windows-amd64-x.x.x.exe,32位系统选择:gq-client-windows-386-x.x.x.exe(x为数字,是版本号)</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS08">Cloak-plugin: https://github.com/cbeuw/Cloak/releases 64位系统选择:ck-client-windows-amd64-x.x.x.exe,32位系统选择:ck-client-windows-386-x.x.x.exe(x为数字,是版本号)</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS09">在Shadowsocks (windows)运行文件所在文件夹中,新建文件夹plugins,将obfs-local.zip解压出的文件(两个)全部复制到plugins中,v2ray -plugin下载得到的文件,解压出的文件,复制到plugins中,并重命名为:v2ray-plugin.exe。Kcptun -plugin下载得到的文件,解压出两个文件,将其中的client_windows开头的文件,复制到plugins中,并重命名为:kcptun-client.exe。GoQuiet-plugin下载得到的文件,直接复制到plugin中,并重命名为:goquiet-client.exe。Cloak-plugin下载得到的文件,直接复制到plugin中,并重命名为:cloak-client.exe</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS10">安装完毕</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSSandroid02">手机安卓客户端插件安装说明</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSSandroid03">先下载插件,各个插件安卓客户端下载地址为:</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSSandroid04">Simple-obfs: https://github.com/shadowsocks/simple-obfs-android/releases 只下载 obfs-local-nightly-x.x.x.apk(x为数字,是版本号)</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSSandroid05">V2ray-plugin: https://github.com/shadowsocks/v2ray-plugin-android/releases 一般选择v2ray--universal-x.x.x.apk(x为数字,是版本号)</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSSandroid06">Kcptun-plugin: https://github.com/shadowsocks/kcptun-android/releases 一般选择kcptun--universal-x.x.x.apk(x为数字,是版本号)</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSSandroid07">将上述apk文件传到手机,安装即可!</sys:String>
|
||||
|
||||
|
||||
<!--<sys:String x:Key="MsgShowTime">Now</sys:String>
|
||||
<sys:String x:Key="BtnOK1">OK</sys:String>
|
||||
<sys:String x:Key="HdNo1">No.</sys:String>
|
||||
<sys:String x:Key="HdName1">Name</sys:String>
|
||||
<sys:String x:Key="HdGender1">Gender</sys:String>
|
||||
<sys:String x:Key="HdDept1">Dept</sys:String>
|
||||
<sys:String x:Key="HdEmail1">Email</sys:String>
|
||||
<sys:String x:Key="HdTel1">Tel</sys:String>
|
||||
<sys:String x:Key="MsgShowTime1">Now</sys:String>-->
|
||||
</ResourceDictionary>
|
|
@ -1,433 +0,0 @@
|
|||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:local="clr-namespace:ProxySU.Translations"
|
||||
xmlns:sys="clr-namespace:System;assembly=mscorlib">
|
||||
<!-- 主程序界面 -->
|
||||
<sys:String x:Key="TextBlockNewVersionReminder">最新版本已發布了,快去更新一下吧!</sys:String>
|
||||
<sys:String x:Key="TextBlockNewVersionDown">正在下載最新版,請等待完成提示....</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorDownProxyFail">最新版下載失敗,請稍後重試!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorDownProxySuccess">下載最新版成功,文件已存入當前ProxySU.exe同一目錄</sys:String>
|
||||
<sys:String x:Key="ButtonUpgradeProxySU">下載更新</sys:String>
|
||||
<sys:String x:Key="MainWindowsLanguage">Languages:</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderAppDeployment">應用佈署</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderResourceTools">資源工具</sys:String>
|
||||
<sys:String x:Key="TextBlockHostName">主機:</sys:String>
|
||||
<sys:String x:Key="TextBoxHostNamePrompt">IP或域名(不可為空)</sys:String>
|
||||
<sys:String x:Key="TextBlockHostPart">端口:</sys:String>
|
||||
<sys:String x:Key="TextBlockHostUser">用戶:</sys:String>
|
||||
<sys:String x:Key="TextBlockHostPassword">密碼:</sys:String>
|
||||
<sys:String x:Key="TextBlockHostCert">密鑰::</sys:String>
|
||||
<sys:String x:Key="TextBoxKeyNotEmptyPrompt">密鑰文件存放路徑(不可為空)</sys:String>
|
||||
<sys:String x:Key="ButtonOpenFileDialog">瀏覽...</sys:String>
|
||||
<sys:String x:Key="RadioButtonPasswordLogin">密碼登錄</sys:String>
|
||||
<sys:String x:Key="RadioButtonCertLogin">密鑰登錄</sys:String>
|
||||
<sys:String x:Key="RadioButtonNoProxy">無代理</sys:String>
|
||||
<sys:String x:Key="RadioButtonProxyNoLogin">不需登錄</sys:String>
|
||||
<sys:String x:Key="RadiobuttonProxyYesLogin">需要登錄</sys:String>
|
||||
<sys:String x:Key="TextBlockProxyHost">代理地址:</sys:String>
|
||||
<sys:String x:Key="TextBlockSetUpProcessing">等待安裝佈署</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderSysTools">系統工具</sys:String>
|
||||
<sys:String x:Key="ButtonV2RayTemplateConfiguration">V2Ray模板庫</sys:String>
|
||||
<sys:String x:Key="ButtonV2RayOneKeyInstall">V2ray一鍵安裝</sys:String>
|
||||
<sys:String x:Key="ButtonUpdateV2ray">升級V2Ray</sys:String>
|
||||
<sys:String x:Key="Button_canel">取消</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanGoTemplate">Trojan-Go參數設置</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanGoSetUp">Trojan-Go一鍵安裝</sys:String>
|
||||
<sys:String x:Key="ButtonUpdateTrojanGo">升級Trojan-Go</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanGoCancel">取消</sys:String>
|
||||
<sys:String x:Key="TextBlockCurrentlySelectedPlan">當前所選方案:</sys:String>
|
||||
<sys:String x:Key="TextBlockCurrentlySelectedPlanNo">未選擇方案</sys:String>
|
||||
<!-- 以下Trojan設置參數標籤頁界面 -->
|
||||
<sys:String x:Key="GroupBoxHeaderParameterTrojan">參數設置</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanTemplateExplanation">模式:Trojan+TLS+Caddy</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanServerDomain">服務器地址(域名):</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanPort">端口:443</sys:String>
|
||||
<sys:String x:Key="TextBoxDomainPrompt">域名不可為空</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanHostPassword">密碼:</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanChangePassword">更新</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanSetUp">Trojan一鍵安裝</sys:String>
|
||||
<sys:String x:Key="ButtonUpdateTrojan">升級Trojan</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanCancel">取消</sys:String>
|
||||
<!-- 以下NaiveProxy設置參數標籤頁界面 -->
|
||||
<sys:String x:Key="TextBlockNaiveProxyTemplateExplanation">模式:NaiveProxy+TLS+Caddy</sys:String>
|
||||
<sys:String x:Key="ButtonNaiveProxyChangeUser">隨機</sys:String>
|
||||
<sys:String x:Key="ButtonNavieSetUp">NaiveProxy一鍵安裝</sys:String>
|
||||
<sys:String x:Key="ButtonNaiveCancel">取消</sys:String>
|
||||
<!-- 以下SSR设置参数标签页界面 -->
|
||||
<sys:String x:Key="TextBlockSSRTemplateExplanation">模式:SSR+TLS+Caddy</sys:String>
|
||||
<sys:String x:Key="ButtonSSRSetUp">SSR一鍵安裝</sys:String>
|
||||
|
||||
<!-- 以下MTProto设置参数标签页界面 -->
|
||||
<sys:String x:Key="TextBlockMtgTemplateExplanation">模式:MTProto+TLS</sys:String>
|
||||
<sys:String x:Key="ButtonMtgSetUp">MTProto一鍵安裝</sys:String>
|
||||
<sys:String x:Key="TextBlockMtgFakeDomainExplanation">偽裝域名:</sys:String>
|
||||
<sys:String x:Key="TextBlockMtgPortExplanation">推薦用常見https端口443、2053、2083、2087、2096、8443</sys:String>
|
||||
<sys:String x:Key="TextBlockMtgSecretExplanation">密鑰將由服務端隨機生成,這裡無需設置。</sys:String>
|
||||
|
||||
<!-- 以下SS设置参数标签页界面 -->
|
||||
<sys:String x:Key="ButtonSetUpSS">SS 一鍵安裝</sys:String>
|
||||
<sys:String x:Key="ButtonTemplateConfigurationSS">SS 插件庫</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderNonePluginSS">經典模式</sys:String>
|
||||
<sys:String x:Key="TextBlockNonePluginPointSS">提示:這種模式,長時間,大流量使用,容易被阻斷和乾擾,不推薦使用!</sys:String>
|
||||
<sys:String x:Key="RadioButtonNonePluginSS">SS 經典</sys:String>
|
||||
<sys:String x:Key="TextBlockNonePluginExplainSS">SS經典使用模式,無需域名,數據高強度加密,數據被識別為未知數據。目前流量容易被識別,極易被干擾與阻斷,慎重使用!放在這裡僅僅只是一種情懷與致敬!</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderObfsPluginSS">Simple-obfs 插件</sys:String>
|
||||
<sys:String x:Key="TextBlockObfsPluginPointSS">提示:這是SS早期使用的流量混淆方案,插件已經長時間不再更新,不推薦使用!</sys:String>
|
||||
<sys:String x:Key="RadioButtonObfsPluginHttpWebSS">SS+obfs+http+Web</sys:String>
|
||||
<sys:String x:Key="TextBlockObfsPluginHttpWebExplainSS">無需域名,數據高強度加密,流量混淆為http(並非真正的http),使用Web網站偽裝,可在一定程度上增強抗識別!不支持CDN。</sys:String>
|
||||
<sys:String x:Key="RadioButtonObfsPluginHttpsWebSS">SS+obfs+TLS(https)+Web</sys:String>
|
||||
<sys:String x:Key="TextBlockObfsPluginTLShttpsWebExplainSS">需要域名,使用域名將很大增強抗識別,數據高強度加密,流量混淆為https(並非真正的https),使用Web網站偽裝,進一步增強抗識別!不支持CDN。</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayPluginSS">V2Ray 插件</sys:String>
|
||||
<sys:String x:Key="TextBlockV2rayPluginPointSS">提醒:ShadowRocket(ios)不支持SS+Quic模式</sys:String>
|
||||
<sys:String x:Key="RadioButtonWebSocketTLSWebSS">SS+WebSocket+TLS+Caddy(Web後置)</sys:String>
|
||||
<sys:String x:Key="RadioButtonWebSocketTLSWebFrontSS">SS+WebSocket+TLS+Caddy(Web前置)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayPluginPointSS">提示:上面方案中的Web前置與Web後置,使用效果上沒有差別,Web後置方案,TLS證書由acme.sh申請,證書到期後, acme.sh會自動續期,但是需要手動重啟SS加載新證書。而Web前置方案中的證書由Caddy自動申請並加載,不需要重啟SS。</sys:String>
|
||||
<sys:String x:Key="RadioButtonQuicSS">SS+QUIC</sys:String>
|
||||
<sys:String x:Key="TextBlockQuicExplainSS">通過V2Ray-Plugin使用QUIC協議傳輸,強制使用TLS加密。數據加密傳輸,被識別為udp流量,最初由谷歌創始,優點:減少延遲、多路復用、連接遷移,需要域名,</sys:String>
|
||||
<!--<sys:String x:Key="TabItemHeaderOtherPluginsSS">kcptun/GoQuiet/Cloak 插件</sys:String>-->
|
||||
<sys:String x:Key="TabItemHeaderOtherPluginsSS">kcptun 插件</sys:String>
|
||||
<sys:String x:Key="TextBlockGoQuietPluginPointSS">提醒:Shadowrocket(ios)不支持GoQuiet-plugin插件。 shadowsocks(Android)不支持GoQuiet-plugin與Cloak-plugin插件</sys:String>
|
||||
<sys:String x:Key="TextBlockKcptunPluginExplainSS">KCP是一個快速可靠協議,能以比TCP浪費10%-20%的帶寬的代價,換取平均延遲降低30%-40%,且最大延遲降低三倍的傳輸效果。使用UDP協議傳輸,數據高強度加密,傳輸同樣的內容,kcp 一般比TCP 消耗更多的流量,在丟包率高的線路下將極大提高網速,在個別運營商處可能會被QOS限制。</sys:String>
|
||||
<sys:String x:Key="TextBlockGoQuietPluginExplainSS">基本原理為模擬TLS的流量同時將服務器偽裝成一個正常的網站服務器,這個混淆思路並非首創:simple-obfs和ShadowsocksR的tls1.2_ticket_auth模式證明這條道是行得通的。此插件對現有的方法進行了改善,其目標為讓大規模封鎖HTTPS服務器(甚至IP段)成為封鎖SS的唯一有效手段</sys:String>
|
||||
<sys:String x:Key="TextBlockCloakPluginExplainSS">通過加密方式將代理流量混淆為合法的HTTPS流量,並將代理服務器偽裝成普通的Web服務器以規避互聯網審查。可以看成是上面GoQuiet升級版,優化網絡連接速度,並且不是混淆https而是真正的https流量。</sys:String>
|
||||
<sys:String x:Key="TextBlockPluginNameExplainSS">插件程序:</sys:String>
|
||||
<sys:String x:Key="TextBlockPluginOptionExplainSS">插件選項:</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ExplainBuildSS">使用編譯方式,時間稍長,請耐心等待......</sys:String>
|
||||
|
||||
<!-- 以下系統工具標籤頁界面 -->
|
||||
<sys:String x:Key="ButtonProofreadTime">校對時間</sys:String>
|
||||
<sys:String x:Key="ButtonClearOccupiedPorts">釋放80/443端口</sys:String>
|
||||
<sys:String x:Key="ButtonTestAndEnableBBR">啟用BBR</sys:String>
|
||||
<sys:String x:Key="ButtonRemoveAllSoft">卸載代理</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_RemoveAllSoft">僅支持卸載由ProxySU安裝的代理軟件及相關配置,請確保重要配置已備份。不支持卸載使用其他方法或腳本安裝的代理。確定要卸載遠程主機上的代理軟件嗎?</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartRemoveProxy">開始卸載......</sys:String>
|
||||
|
||||
<!-- 以下資源工具標籤頁界面 -->
|
||||
<sys:String x:Key="ButtonWebBrowserHomePage">主頁</sys:String>
|
||||
<sys:String x:Key="ButtonWebBrowserForward">前進</sys:String>
|
||||
<sys:String x:Key="ButtonWebBrowserBack">後退</sys:String>
|
||||
<sys:String x:Key="TextBlockWebExplain">由於眾所周知的原因,在某些時候,加載緩慢,請耐心等待一下</sys:String>
|
||||
<!-- 以下Trojan-go模板庫界面 -->
|
||||
<sys:String x:Key="GroupBoxHeaderTrojanGoTemplates">Trojan-go 模板庫</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoTLSwebPlan">http/2傳輸,Caddy2偽裝網站,抗識別,暫不支持CloudFlare的CDN</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoWebSocketTLSwebPlan">使用WebSocket傳輸,Caddy2偽裝網站,抗識別,支持CloudFlare的CDN</sys:String>
|
||||
<sys:String x:Key="GroupBoxHeaderParameterTrojanGo">參數設置</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoDomain">域名:</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoPort">端口: 443</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoPassword">密碼:</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoPasswordExplain">使用已有密碼,直接粘貼到框中</sys:String>
|
||||
<sys:String x:Key="TextBlockTrojanGoWebSocketPath">WebSocket路徑:</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanGoTemplateOK">確定</sys:String>
|
||||
<sys:String x:Key="ButtonTrojanGoTemplateCancel">取消</sys:String>
|
||||
<!-- 以下V2Ray模板庫界面 -->
|
||||
<sys:String x:Key="GroupBoxHeaderV2RayTemplates">V2Ray 模板庫</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayHotPlan">推薦方案</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayEarlyPlan">嚐鮮方案</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayVlessProtocol">VLESS協議</sys:String>
|
||||
<sys:String x:Key="TextBlockVlessExplain">VLESS 是一個無狀態的輕量傳輸協議,與 VMess 不同,VLESS 不依賴於系統時間,認證方式同樣為 UUID,但不需要 alterId。目前 VLESS 沒有自帶加密,請用於可靠信道,如 TLS。優點:可以有效的降低主機資源消耗。目前 VLESS 不支持分享。 VLESS 處於公測階段,測試期間請確保客戶端與服務端的 v2ray-core 均為最新版本。</sys:String>
|
||||
<sys:String x:Key="TextBlockVlessXtlsTcpExplain">XTLS 在低性能或沒有AES 硬解的設備上效果出眾,如在硬路由上換用XTLS,同樣跑滿CPU 時實現網速翻倍,或是相同網速時CPU 佔用率減半,而對於移動設備,計算量減少意味著省電。服務端客戶端版本要求4.29+ (需域名)不支持CDN。</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayVlessTcpTlsWebExplain">輕量協議VLESS,佔用更少主機資源,數據TLS加密傳輸,用Caddy2在節點上做偽裝網站。適合配置低的VPS,或多人共用節點,服務端客戶端版本要求4.27+ (需域名)不支持CDN。</sys:String>
|
||||
<sys:String x:Key="TextBlockVlessWebSocketTlsWebExplain">使用VLESS協議,與VMESS的此類型方案,更輕量。穩定性強,Caddy2做前置,隱藏代理特徵,被識別為訪問網站的https流量,抗封鎖識別最強,需要域名,支持CDN</sys:String>
|
||||
<sys:String x:Key="TextBlockVlessHttp2WebExplain">使用VLESS協議,與VMESS的此類型方案,更輕量。基於 HTTP/2 傳輸。完整按 HTTP/2 標準實現,Caddy2做前置,隱藏代理特徵,H2C協議轉發到V2Ray,需要域名,暫不支持CloudFlare的CDN</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayTcpProtocol">TCP傳輸協議</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayWebSocketProtocol">WebSocket傳輸協議</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayHttp2Protocol">Http/2傳輸協議</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayMkcpProtocol">mKCP傳輸協議</sys:String>
|
||||
<sys:String x:Key="TabItemHeaderV2RayQuicProtocol">QUIC傳輸協議</sys:String>
|
||||
<sys:String x:Key="GroupBoxHeaderParameterV2Ray">參數設置</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayServerPort">服務器端口:</sys:String>
|
||||
<sys:String x:Key="ButtonV2RayServerPortChange">隨機選擇</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayServerPortExplain">若使用TLS加密,請保持默認的443端口</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayUUIDExplain">使用已有UUID,直接粘貼到框中</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicUUID">QUIC密鑰:</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpSeedUUID">mKCP Seed:</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpExplain">啟用mKCP Seed密鑰,可增強抗識別,留空則禁用,要求版本4.24.2+</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayPath">路徑:</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayVlessWsPath">VLESS ws路徑:</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayVmessTcpPath">VMESS tcp路徑:</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayVmessWsPath">VMESS ws路徑:</sys:String>
|
||||
<sys:String x:Key="TextBlockQuicEncryption">QUIC加密方式:</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayDomain">域名:</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMaskSites">偽裝網站:</sys:String>
|
||||
<sys:String x:Key="TextBoxV2RayMaskSitesTag">設置此項可增加代理的隱蔽(可為空)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayWebSocketTlsWebExplain">穩定性強,Caddy2做前置,隱藏代理特徵,被識別為訪問網站的https流量,抗封鎖識別最強,需要域名,支持CDN</sys:String >
|
||||
<sys:String x:Key="TextBlockV2RayHttp2TlsWebExplain">基於 HTTP/2 傳輸。完整按 HTTP/2 標準實現,Caddy2做前置,隱藏代理特徵,H2C協議轉發到V2Ray,需要域名,暫不支持CloudFlare的CDN</sys:String>
|
||||
<sys:String x:Key="TextBlockVlessVmessXtlsTcpWebSocketExplainHot">VLESS over TCP with XTLS + 回落and 分流to WHATEVER(終極配置),由rprx大佬(xtls作者)配置並推薦,在服務端同時配置以下五種方案,共用同一域名與443端口,其中 WS 都可以通過 CDN。</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayTcpExplain">數據加密傳輸,會被識別為未知的tcp流量</sys:String>
|
||||
<sys:String x:Key="RadioButtonV2RayTcpHttp">TCP+Http偽裝</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayTcpHttpExplain">數據加密傳輸,並做http偽裝,會被識別為http流量,但並不是真正的http訪問</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayTcpTlsExplain">數據加密傳輸,傳輸協議使用TLS,會被識別為TLS流量,不等同於https流量特徵 (需域名)</sys:String>
|
||||
<sys:String x:Key="RadioButtonV2RayTcpTlsSelfSigned">TCP+TLS(自簽證書)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayTcpTlsSelfSignedExplain">數據加密傳輸,傳輸協議使用TLS,會被識別為TLS流量,不等同於https流量特徵 (無需域名)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RaySelfSignedShadowrocketExplain">Shadowrocket (ios)需要手動打開“允許不安全”選項</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayWebSocketExplain">數據加密傳輸,傳輸協議使用WebSocket,未啟用TLS,將被識別為WebSocket流量。</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayWebSocketTlsExplain">數據加密傳輸,傳輸協議使用WebSocket,啟用TLS,將被識別為TLS流量。 (需要域名)支持CDN。</sys:String>
|
||||
<sys:String x:Key="RadioButtonV2RayWebSocketTlsSelfSigned">WebSocket+TLS(自簽證書)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayWebSocketTlsSelfSignedExplain">數據加密傳輸,傳輸協議使用WebSocket,啟用TLS,將被識別為TLS流量。 (無需域名)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayHttp2Explain">基於 HTTP/2 的傳輸方式。它完整按照 HTTP/2 標準實現,需要域名</sys:String>
|
||||
<sys:String x:Key="RadioButtonV2RayHttp2SelfSigned">HTTP2(自簽證書)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayHttp2SelfSignedExplain">基於 HTTP/2 的傳輸方式。它完整按照 HTTP/2 標準實現,使用自簽名證書,不需要域名</sys:String>
|
||||
<sys:String x:Key="RadioButtonV2RayMkcpNone">mKCP(無偽裝)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpNoneExplain">數據加密傳輸,以增加帶寬佔用,減少延遲,udp協議,無偽裝,會被識別為udp流量</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpSRTPExplain">同mKCP(無偽裝),增加偽裝成 SRTP 數據包,會被識別為視頻通話數據(如 FaceTime)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpuTPExplain">同mKCP(無偽裝),增加偽裝成 uTP 數據包,會被識別為 BT 下載數據</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpWeChatExplain">同mKCP(無偽裝),增加偽裝成微信視頻通話的數據包</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpDTLSExplain">同mKCP(無偽裝),增加偽裝成 DTLS 1.2 數據包</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayMkcpWireGuardExplain">同mKCP(無偽裝),增加偽裝成 WireGuard 數據包。 (並不是真正的 WireGuard 協議)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicShadowrocketExplain">提醒:Shadowrocket目前暫不支持QUIC的傳輸模式。</sys:String>
|
||||
<sys:String x:Key="RadioButtonV2RayQuicNone">QUIC(無偽裝)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicNoneExplain">數據加密傳輸,無偽裝會被識別為udp流量,最初由谷歌創始,優點:減少延遲、多路復用、連接遷移</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicSRTPExplain">同QUIC(無偽裝),增加偽裝成 SRTP 數據包,會被識別為視頻通話數據(如 FaceTime)</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicuTPExplain">同QUIC(無偽裝),增加偽裝成 uTP 數據包,會被識別為 BT 下載數據</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicWeChatExplain">同QUIC(無偽裝),增加偽裝成微信視頻通話的數據包</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicDTLSExplain">同QUIC(無偽裝),增加偽裝成 DTLS 1.2 數據包</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayQuicWireGuardExplain">同QUIC(無偽裝),增加偽裝成 WireGuard 數據包。 (並不是真正的 WireGuard 協議)</sys:String>
|
||||
<!--以下為時間校對窗口-->
|
||||
<sys:String x:Key="RadioButtonNetworkTime">同步網絡時間</sys:String>
|
||||
<sys:String x:Key="TextBlockNetworkTime">將遠程主機時間校正為網絡時間,注意:本機電腦的時間必須也是與網絡時間同步的,否則本機電腦V2ray有可能連接出錯

推薦:優先使用此方法校對時間</sys:String>
|
||||
<sys:String x:Key="RadioButtonLocalTime">同步本機時間</sys:String>
|
||||
<sys:String x:Key="TextBlockLocalTime">將遠程主機時間同步為本地時間,注意:本機電腦的時間必須是準確的,與網絡時間同步的,否則其他客戶端中,有可能連接出錯

使用網絡校時無法校對時間時,使用此種方法</sys:String>
|
||||
<sys:String x:Key="RadioButtonUpDateLocalTime">更新本機時間</sys:String>
|
||||
<sys:String x:Key="TextBlockUpDateLocalTime">將本機電腦時間與網絡時間同步。

注意:使用此項功能,必須以管理員身份運行本程序</sys:String>
|
||||
<sys:String x:Key="ButtonTestTime">檢測時間誤差</sys:String>
|
||||
<sys:String x:Key="ButtonProofreading">校對時間</sys:String>
|
||||
<!--以下為客戶端參數顯示窗口-->
|
||||
<sys:String x:Key="GroupBoxHeaderClientParameter">客戶端配置參數</sys:String>
|
||||
<sys:String x:Key="TextBlockServerAddress">服務器地址(address):</sys:String>
|
||||
<sys:String x:Key="TextBlockServerPort">端口(port):</sys:String>
|
||||
<sys:String x:Key="TextBlockUserUUID">用戶ID(uuid):</sys:String>
|
||||
<sys:String x:Key="ButtonCopyV2RayUUIDtoClip">複製</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_V2RayUUIDcopyedToClip">已復製到剪貼板中!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_V2RayEmptyToClip">空內容!</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayAlterId">額外ID:</sys:String>
|
||||
<sys:String x:Key="TextBlockV2RayAlterIdExplain">不超過64,客戶端沒此項可不填</sys:String>
|
||||
<sys:String x:Key="TextBlockEncryption">加密方式:</sys:String>
|
||||
<sys:String x:Key="TextBlockTransferProtocol">傳輸協議:</sys:String>
|
||||
<sys:String x:Key="TextBlockCamouflageType">偽裝類型(混淆):</sys:String>
|
||||
<sys:String x:Key="TextBlockIsOrNotTLS">TLS設置:</sys:String>
|
||||
<sys:String x:Key="TextBlockCopyToClipExplain">提示:雙擊以上內容窗,即可複製到剪貼板中。</sys:String>
|
||||
<sys:String x:Key="TextBlockClientPath">路徑(Path):</sys:String>
|
||||
<sys:String x:Key="TextBlockClientMkcpQuicKey">mKCP Seed/QUIC密鑰:</sys:String>
|
||||
<sys:String x:Key="TextBlockEncryptionIsAuto">默認auto</sys:String>
|
||||
<sys:String x:Key="GrouBoxHeaderUrlOrQR">二維碼/URL</sys:String>
|
||||
<sys:String x:Key="TextBlockUsedParameter">以上參數可以手動或掃描輸入客戶端,用於官方客戶端的配置和相關文件已經存放入目錄下,點擊 確定 按扭可打開</sys:String>
|
||||
<sys:String x:Key="TextBlockQrURLexplainV2Ray">二維碼和URL鏈接可用於
v2rayN(windows)
Trojan-QT5(windows)
Qv2ray(windows)
Shadowrocket(ios)
v2rayNG(Android)
導入v2ray節點

注意:Vless協議需要手動輸入配置參數,二維碼和URL無效</sys:String>
|
||||
<sys:String x:Key="TextBlockQrURLexplainTrojan-go">"可用於ShadowRocket (ios)、igniter(Android)、Trojan-QT5 (windows) 掃碼和導入url。注意:有的客戶端可能不支持WebSocket模式。"</sys:String>
|
||||
<sys:String x:Key="TextBlockQrURLexplainTrojan">"可用於ShadowRocket (ios)、igniter(Android)、Trojan-QT5 (windows) 掃碼和導入url。注意:有的客戶端可能不支持WebSocket模式。"</sys:String>
|
||||
<sys:String x:Key="TextBlockQrURLexplainNaiveProxy">用於NaiveGUI(windows)的URL導入鏈接</sys:String>
|
||||
<sys:String x:Key="TextBlockQrURLexplainSSR">用於ShadowsocksR(windows)、SSRR(android)、Shadowrocket(ios)的掃碼和導入URL導入鏈接</sys:String>
|
||||
<sys:String x:Key="TextBlockQrURLexplainSSmobile">用於手機客戶端shadowsocks(android)、Shadowrocket(ios)的掃碼和URL導入鏈接</sys:String>
|
||||
<sys:String x:Key="TextBlockQrURLexplainSSpc">用於電腦客戶端Shadowsocks (windows)的掃碼和URL導入鏈接</sys:String>
|
||||
<sys:String x:Key="TextBlockQrURLexplainSS">用於Shadowsocks (windows)、shadowsocks(android)、Shadowrocket(ios)的掃碼和URL導入鏈接</sys:String>
|
||||
<sys:String x:Key="TextBlockClientPromptSS">提醒: 電腦客戶端Shadowsocks (windows)與手機客戶端shadowsocks(android)、Shadowrocket(ios)的導入格式不兼容,請選擇相應格式。</sys:String>
|
||||
<sys:String x:Key="RadioButtonMobileSS">手機端</sys:String>
|
||||
<sys:String x:Key="RadioButtonPCSS">電腦端</sys:String>
|
||||
<sys:String x:Key="TextBlockShareQRcodeMtgTgIpv4">TG格式QR</sys:String>
|
||||
<sys:String x:Key="TextBlockURLMtgTgIpv4">TG格式URL(雙擊複製到剪切板中)</sys:String>
|
||||
<sys:String x:Key="TextBlockShareQRcodeMtgTmeIpv4">T.ME格式QR</sys:String>
|
||||
<sys:String x:Key="TextBlockURLMtgTmeIpv4">T.ME格式URL(雙擊複製到剪切板中)</sys:String>
|
||||
<!--以下為程序內的-->
|
||||
<sys:String x:Key="MessageBoxShow_ErrorHostPortUserNotEmpty">主機地址、主機端口、用戶名為必填項,不能為空!!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorHostPortErr">連接端口含有非數字字符!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorHostPasswordNotEmpty">登錄密碼為必填項,不能為空!!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorHostKeyNotEmpty">密鑰文件為必填項,不能為空!!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorProxyAddressPortNotEmpty">如果選擇了代理,則代理地址與端口不能為空!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorProxyUserPasswordNotEmpty">如果代理需要登錄,則代理登錄的用戶名與密碼不能為空!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorHostConnection">遠程主機連接信息有誤,請檢查!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ChooseTemplate">請先選擇配置模板!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_FunctionResultErr">發生錯誤,安裝中斷......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_Login">正在登錄遠程主機......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_LoginSuccessful">主機登錄成功!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_DetectionRootPermission">檢測是否運行在root權限下...</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorRootPermission">請使用具有root權限的賬戶登錄主機! !</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_DetectionRootOK">檢測結果:OK!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_TestExistSoft">檢測系統是否已經安裝</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ExistedSoft">遠程主機已安裝</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ForceInstallSoft">,是否強制重新安裝?</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_InstallationCanceledExit">安裝取消,退出</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ForceInstallSoft">已選擇強制安裝</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_NoInstalledSoft">檢測結果:未安裝</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_CheckSystemRequirements">檢測系統是否符合安裝要求......</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_CurrentKernelVersion">當前系統內核版本為</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_RequiredKernelVersionExplain">,V2ray要求內核為2.6.23及以上。請升級內核再安裝!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_KernelVersionNotMatch">系統內核版本不符合要求,安裝失敗! !</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_MissingSystemComponents">系統缺乏必要的安裝組件如:apt||dnf||yum||zypper||Syetemd,主機系統推薦使用:CentOS 7/8,Debian 8/9/10 ,Ubuntu 16.04及以上版本</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_MissingSystemComponents">系統環境不滿足要求,安裝失敗! !</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_SystemRequirementsOK">檢測結果:OK!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_EnableSELinux">檢測到系統啟用SELinux,且工作在嚴格模式下,需改為寬鬆模式!修改中......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_SELinuxModifyOK">修改完畢!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ProofreadingTime">校對時間......</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_TimeError">本地時間與遠程主機時間相差超過限制(90秒),請先用 '系統工具-->時間校對' 校對時間後再設置</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_TimeError">時間較對失敗......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_TimeOK">時間差符合要求,OK!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_TestDomainResolve">正在檢測域名是否解析到當前VPS的IP上......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_DomainResolveOK">解析正確! OK!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ErrorDomainResolve">域名未能正確解析到當前VPS的IP上!安裝失敗!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorDomainResolve">域名未能正確解析到當前VPS的IP上,請檢查!若解析設置正確,請等待生效後再重試安裝。如果域名使用了CDN,請先關閉!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_TestPortUsed">檢測端口占用情況......</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorPortUsed">80/443端口之一,或全部被佔用,將強制停止佔用80/443端口的程序?</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ErrorPortUsedFail">端口被佔用,安裝失敗......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ReleasePort">正在釋放80/443端口......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ReleasePortOK">80/443端口釋放完畢!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorPortUsedOther">端口被佔用,將強制停止佔用此端口的程序?</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ReleasePortOther">正在釋放端口......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ReleasePortOKOther">端口釋放完畢!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_PortNotUsed">檢測結果:未被佔用!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartInstalling">系統環境檢測完畢,符合安裝要求,開始佈署......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_OpenFireWallPort">開啟防火牆相應端口......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartInstallSoft">正在安裝</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_CompilingSS">編譯中,請耐心等待.............</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorInstallSoftFail">安裝失敗,腳本運行出錯!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_SoftInstallSuccess">安裝成功!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UploadSoftConfig">安裝完畢,上傳配置文件......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartInstallAcmeSh">正在安裝acme.sh......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_AcmeShInstallSuccess">acme.sh安裝成功!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ErrorAcmeShInstallFail">acme.sh安裝失敗!原因未知,請向開發者提問!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartApplyCert">申請域名證書......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ApplyCertSuccess">證書申請成功!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ApplyCertFail">證書申請失敗!原因未知,請向開發者提問!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_IntallCertToSoft">安裝證書到</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_IntallCertToSoftOK">證書成功安裝到</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_IntallCertToSoftFail">證書安裝到</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_InstallCertFailAsk">失敗,原因未知,可以向開發者提問!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartInstallCaddy">安裝Caddy......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_NotInstalledCaddy">檢測結果:未安裝Caddy!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ErrorInstallCaddyFail">安裝Caddy失敗!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_InstalledCaddyOK">Caddy安裝成功!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UpgradeCaddy">正在為Http2Web模式升級Caddy v2.2.0測試版!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UploadCaddyConfig">上傳Caddy配置文件......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UploadCaddyConfigOK">Caddy配置文件上傳成功,OK!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartCaddyService">正在啟動Caddy......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartCaddyServiceOK">Caddy啟動成功!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartCaddyServiceFail">Caddy啟動失敗!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartCaddyServiceSecond">正在啟動Caddy(第二次嘗試)!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartCaddyServiceSecondFail">Caddy啟動失敗(第二次)!退出安裝!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_CaddyServiceFailedExit">Caddy啟動失敗,原因未知!請向開發者問詢!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartSoft">正在啟動</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartSoftOK">啟動成功!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartSoftFail">啟動失敗!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartSoftSecond">正在第二次嘗試啟動</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartSoftSecondFail">啟動失敗(第二次)!退出安裝!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartSoftFailedExit">啟動失敗,原因如上!請排查原因!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_TestBBR">BBR測試......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_EnableBBR">正在啟用BBR......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_BBRisEnabled">BBR已經啟用了!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_BBRFailed">系統不滿足啟用BBR的條件,啟用失敗!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_BBREnabledSuccess">BBR 啟用成功!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_GenerateClientConfig">生成客戶端配置......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ProxyInstalledOK">安裝成功,祝你玩的愉快! !</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_LoginFailed">安裝失敗!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorLoginOccurred">發生錯誤!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorLoginUserOrPassword">密碼錯誤或用戶名錯誤!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorLoginHostOrPort">請檢查主機地址及端口是否正確,如果通過代理,請檢查代理是否正常工作</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorLoginKey">所選密鑰文件錯誤或者格式不對!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorLoginKeyOrUser">使用密鑰登錄,密鑰文件錯誤或用戶名錯誤!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorLoginHostOrProxyPort">主機地址錯誤,如果使用了代理,也可能是連接代理的端口錯誤!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_ErrorUpgradeSoftNotInstall">退出!原因:遠程主機未安裝</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_OldScriptInstalledV2Ray">檢測到使用舊安裝腳本的V2Ray......</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_OldScriptInstalledV2Ray">檢測到使用舊安裝腳本的V2Ray,是否卸載舊版本並使用新安裝腳本重新安裝?</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_RemoveOldScriptInstalledV2Ray">正在卸載舊版本......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_RemoveOldVersionOK">卸載舊版本,OK!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_InstallNewVersion">安裝新版本......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_MoveOriginalConfig">遷移原配置文件。</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UpgradedNewVersion">已更新到最新版本。</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_CurrentVersion">遠程主機當前版本為:v</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_NewVersion">最新版本為:</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_IsOrNoUpgradeNewVersion">是否升級為最新版本?</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartUpgradeNewVersion">正在升級到最新版本</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UpgradeNewVersionOK">升級成功!當前已是最新版本!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UpgradeNewVersionFail">升級失敗,原因未知,請向開發者提問!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UpgradeVersionCancel">升級取消,退出!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_IsNewVersion">遠程主機當前已是最新版本:</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_NotUpgradeVersion">無需升級!退出!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_DomainNotEmpty">域名不能為空,請檢查相關參數設置!</sys:String>
|
||||
<sys:String x:Key="MessageBoxShow_PleaseInstallSoftAtX64">請在x86_64系統中安裝</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_BackTrojanConfig">備份Trojan配置文件......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_RestoreTrojanConfig">恢復Trojan配置文件......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_ExistedCaddy">"遠程主機已安裝Caddy,但不確定是否支持forward proxy,是否強制重新安裝?"</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_RemoveCaddyOrRebuiled">請先行卸載Caddy或重裝VPS系統!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_InstallRelySoft">正在安裝依賴的軟件......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_SoftInstalledOK">安裝完畢! OK!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_StartCaddy">正在安裝Caddy.....</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UpgradeNaiveProxy">正在為NaiveProxy升級服務端</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_UpgradeNaiveProxyOK">升級完畢,OK!</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_OptimizeNetwork">正在優化網絡參數......</sys:String>
|
||||
<sys:String x:Key="DisplayInstallInfo_OptimizeNetworkOK">優化網絡參數,OK!</sys:String>
|
||||
<!--以下為V2Ray客戶端說明文件-->
|
||||
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine01">此文件為V2Ray官方程序所使用的客戶端配置文件,配置為全局模式,socks5地址:127.0.0.1:1080,http代理地址:127.0.0.1:1081</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine02">v2ray官方網站:https://www.v2ray.com/</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine03">v2ray官方程序下載地址:https://github.com/v2ray/v2ray-core/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine04">下載相應版本,Windows選擇v2ray-windows-64.zip或者v2ray-windows-32.zip,解壓後提取v2ctl.exe和v2ray.exe。與config.json放在同一目錄,運行v2ray.exe即可。</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine05">此文件為v2rayN、Trojan-QT5、v2rayNG(Android)、Shadowrocket(ios)掃碼導入節點</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine06">v2rayN下載網址:https://github.com/2dust/v2rayN/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine07">Trojan-QT5:https://github.com/Trojan-Qt5/Trojan-Qt5</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine08">v2rayNG(Android)下載網址:https://github.com/2dust/v2rayNG/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine09">v2rayNG(Android)在Google Play下載網址:https://play.google.com/store/apps/details?id=com.v2ray.ang</sys:String >
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine10">Shadowrocket(ios)下載,需要使用國外區的AppleID。請自行谷歌方法。</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine11">此文件為v2rayN、Trojan-QT5、v2rayNG(Android)、Shadowrocket(ios)複製粘貼導入節點的vmess網址</sys:String>
|
||||
<sys:String x:Key="readmeTxtV2RayExplainLine12">服務器通用連接配置參數</sys:String>
|
||||
<!--以下為Trojan-go客戶端說明文件-->
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine01">此文件為Trojan-go官方程序所使用的客戶端配置文件,配置為全局模式,http與socks5地址:127.0.0.1:1080</sys:String >
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine02">Trojan-go官方網站:https://github.com/p4gefau1t/trojan-go</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine03">Trojan-go官方程序下載地址:https://github.com/p4gefau1t/trojan-go/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine04">下載相應版本,Windows選擇Trojan-go-x.xx-win.zip,解壓後提取trojan-go.exe。與config.json放在同一目錄,運行trojan-go.exe即可。</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine05">此文件為Qv2ray (windows)、igniter(Android)掃碼導入節點</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine06">Qv2ray (windows)下載網址:https://github.com/Qv2ray/Qv2ray/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine07">igniter(Android)下載網址:https://github.com/trojan-gfw/igniter/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine08">Shadowrocket(ios)下載,需要使用國外區的AppleID。請自行谷歌方法。</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine09">此文件為Qv2ray (windows)、igniter(Android)複製粘貼導入節點的網址</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojan-goExplainLine10">服務器通用連接配置參數</sys:String>
|
||||
<!--以下為Trojan客戶端說明文件-->
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine01">此文件為Trojan官方程序所使用的客戶端配置文件,配置為全局模式,http與socks5地址:127.0.0.1:1080</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine02">Trojan官方網站:https://trojan-gfw.github.io/trojan/</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine03">Trojan官方程序下載地址:https://github.com/trojan-gfw/trojan/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine04">下載相應版本,Windows選擇Trojan-x.xx-win.zip,解壓後提取trojan.exe。與config.json放在同一目錄,運行trojan.exe即可。</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine05">此文件為Trojan-QT5 (windows)、igniter(Android)、Shadowrocket(ios)掃碼導入節點</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine06">Trojan-QT5 (windows)下載網址:https://github.com/TheWanderingCoel/Trojan-Qt5/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine07">igniter(Android)下載網址:https://github.com/trojan-gfw/igniter/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine08">Shadowrocket(ios)下載,需要使用國外區的AppleID。請自行谷歌方法。</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine09">此文件為Trojan-QT5 (windows)、igniter(Android)、Shadowrocket(ios)複製粘貼導入節點的網址</sys:String>
|
||||
<sys:String x:Key="readmeTxtTrojanExplainLine10">服務器通用連接配置參數</sys:String>
|
||||
<!--以下為NaiveProxy客戶端說明文件-->
|
||||
<sys:String x:Key="readmeTxtNaiveProxyExplainLine01">此文件為NaiveProxy官方程序所使用的客戶端配置文件,配置為全局模式,socks5地址:127.0.0.1:1080</sys:String>
|
||||
<sys:String x:Key="readmeTxtNaiveProxyExplainLine02">NaiveProxy官方網站:https://github.com/klzgrad/naiveproxy</sys:String>
|
||||
<sys:String x:Key="readmeTxtNaiveProxyExplainLine03">NaiveProxy官方程序下載地址:https://github.com/klzgrad/naiveproxy/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtNaiveProxyExplainLine04">下載相應版本,Windows選擇naiveproxy-x.xx-win.zip,解壓後提取naive.exe。與config.json放在同一目錄,運行naive.exe即可。</sys:String>
|
||||
<sys:String x:Key="readmeTxtNaiveProxyExplainLine05">此文件為NaiveGUI(windows)複製粘貼導入節點的網址</sys:String>
|
||||
<sys:String x:Key="readmeTxtNaiveProxyExplainLine06">NaiveGUI(windows)下載網址:https://github.com/ExcitedCodes/NaiveGUI/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtNaiveProxyExplainLine07">服務器通用連接配置參數</sys:String>
|
||||
<!--以下為SSR+TLS+Caddy客戶端說明文件-->
|
||||
<sys:String x:Key="readmeTxtSSRExplainLine05">此文件為ShadowsocksR (windows)、SSRR(Android)、Shadowrocket(ios)掃碼導入節點</sys:String>
|
||||
<sys:String x:Key="readmeTxtSSRExplainLine06">ShadowsocksR (windows)下載網址:https://github.com/shadowsocksrr/shadowsocksr-csharp/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtSSRExplainLine07">SSRR(Android)下載網址:https://github.com/shadowsocksrr/shadowsocksr-android/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtSSRExplainLine08">Shadowrocket(ios)下載,需要使用國外區的AppleID。請自行谷歌方法。</sys:String>
|
||||
<sys:String x:Key="readmeTxtSSRExplainLine09">此文件為ShadowsocksR (windows)、SSRR(Android)、Shadowrocket(ios)複製粘貼導入節點的網址</sys:String>
|
||||
<sys:String x:Key="readmeTxtSSRExplainLine10">服務器通用連接配置參數</sys:String>
|
||||
<!--以下為SS客戶端說明文件-->
|
||||
<sys:String x:Key="readmeTxtExplainLineSS01">此文件為Shadowsocks (windows)掃碼導入節點</sys:String>
|
||||
<sys:String x:Key="readmeTxtExplainLineSS02">此文件為Shadowsocks (windows)複製粘貼導入節點的網址</sys:String>
|
||||
<sys:String x:Key="readmeTxtExplainLineSS05">此文件為shadowsocks(Android)、Shadowrocket(ios)掃碼導入節點</sys:String>
|
||||
<sys:String x:Key="readmeTxtExplainLineSS06">Shadowsocks (windows)下載網址:https://github.com/shadowsocks/shadowsocks-windows/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtExplainLineSS07">shadowsocks(Android)下載網址:https://github.com/shadowsocks/shadowsocks-android/releases</sys:String>
|
||||
<sys:String x:Key="readmeTxtExplainLineSS08">Shadowrocket(ios)下載,需要使用國外區的AppleID。請自行谷歌方法。</sys:String>
|
||||
<sys:String x:Key="readmeTxtExplainLineSS09">此文件為shadowsocks(Android)、Shadowrocket(ios)複製粘貼導入節點的網址</sys:String>
|
||||
<sys:String x:Key="readmeTxtExplainLineSS10">服務器通用連接配置參數</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS">插件使用說明</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS01">ProxySU默認所有插件,在Shadowsocks (windows)運行文件所在文件夾的子文件夾plugins下。</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS02">電腦端手動安裝插件說明</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS03">先下載插件,各個插件Windows客戶端下載地址為:</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS04">Simple-obfs: https://github.com/shadowsocks/simple-obfs/releases 只下載 obfs-local.zip</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS05">V2ray-plugin: https://github.com/shadowsocks/v2ray-plugin/releases 64位系統選擇:v2ray-plugin-windows-amd64-vx.xxtar.gz ,32位系統選擇:v2ray-plugin-windows-386-vx.xxtar.gz (x為數字,是版本號)</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS06">Kcptun-plugin: https://github.com/shadowsocks/kcptun/releases 64位系統選擇:kcptun-windows-amd64-xxxxxx.tar.gz,32位系統選擇:kcptun-plugin-windows-386-xxxxxx.tar.gz (x為數字,是版本號)</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS07">GoQuiet-plugin: https://github.com/cbeuw/GoQuiet/releases 64位系統選擇:gq-client-windows-amd64-xxxexe,32位系統選擇: gq-client-windows-386-xxxexe(x為數字,是版本號)</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS08">Cloak-plugin: https://github.com/cbeuw/Cloak/releases 64位系統選擇:ck-client-windows-amd64-xxxexe,32位系統選擇: ck-client-windows-386-xxxexe(x為數字,是版本號)</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS09">在Shadowsocks (windows)運行文件所在文件夾中,新建文件夾plugins,將obfs-local.zip解壓出的文件(兩個)全部複製到plugins中,v2ray -plugin下載得到的文件,解壓出的文件,複製到plugins中,並重命名為:v2ray-plugin.exe。 Kcptun -plugin下載得到的文件,解壓出兩個文件,將其中的client_windows開頭的文件,複製到plugins中,並重命名為:kcptun-client.exe。 GoQuiet-plugin下載得到的文件,直接複製到plugin中,並重命名為:goquiet-client.exe。 Cloak-plugin下載得到的文件,直接複製到plugin中,並重命名為:cloak-client.exe</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSS10">安裝完畢</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSSandroid02">手機安卓客戶端插件安裝說明</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSSandroid03">先下載插件,各個插件安卓客戶端下載地址為:</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSSandroid04">Simple-obfs: https://github.com/shadowsocks/simple-obfs-android/releases 只下載obfs-local-nightly-xxxapk(x為數字,是版本號)</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSSandroid05">V2ray-plugin: https://github.com/shadowsocks/v2ray-plugin-android/releases 一般選擇v2ray--universal-xxxapk(x為數字,是版本號)</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSSandroid06">Kcptun-plugin: https://github.com/shadowsocks/kcptun-android/releases 一般選擇kcptun--universal-xxxapk(x為數字,是版本號)</sys:String>
|
||||
<sys:String x:Key="readmeTxtPluginExplainSSandroid07">將上述apk文件傳到手機,安裝即可!</sys:String>
|
||||
</ResourceDictionary>
|
|
@ -1,115 +0,0 @@
|
|||
<Window x:Class="ProxySU.TrojanGoTemplateWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:local="clr-namespace:ProxySU"
|
||||
mc:Ignorable="d"
|
||||
Title="TrojanGoTemplateWindow" Height="450" Width="800">
|
||||
<Window.Resources>
|
||||
<Style BasedOn="{StaticResource {x:Type TextBox}}"
|
||||
TargetType="TextBox"
|
||||
x:Key="TitleText">
|
||||
<Style.Triggers>
|
||||
<MultiTrigger>
|
||||
<MultiTrigger.Conditions>
|
||||
<Condition Property="Text" Value=""/>
|
||||
<Condition Property="TextBox.IsFocused" Value="false"/>
|
||||
</MultiTrigger.Conditions>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate>
|
||||
<Border BorderThickness="1" BorderBrush="Gray" Margin="0">
|
||||
<TextBlock x:Name="MainTextBlock" Text="{TemplateBinding TextBox.Tag}" Width="{TemplateBinding TextBox.ActualWidth}" Foreground="Gray" VerticalAlignment="Center" HorizontalAlignment="Left"/>
|
||||
</Border>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</MultiTrigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</Window.Resources>
|
||||
<Grid>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="0.7*"></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
|
||||
</Grid.RowDefinitions>
|
||||
<GroupBox Header="{DynamicResource GroupBoxHeaderTrojanGoTemplates}" Grid.Row="0">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.6*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition Width="0.5*"></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<RadioButton x:Name="RadioButtonTrojanGoTLS2Web" Content="Trojan-Go+TLS+Web" Grid.Column="0" Grid.Row="1" Checked="RadioButtonTrojanTLS2Web_Checked"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockTrojanGoTLSwebPlan}" TextWrapping="Wrap" Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="1"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonTrojanGoWebSocketTLS2Web" Content="Trojan-Go+WebSocket+TLS+Web" Grid.Column="0" Grid.Row="2" Checked="RadioButtonTrojanGoWebSocketTLS2Web_Checked"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockTrojanGoWebSocketTLSwebPlan}" TextWrapping="Wrap" Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="2"></TextBlock>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
<GroupBox Header="{DynamicResource GroupBoxHeaderParameterTrojanGo}" Grid.Row="1">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.3*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition Width="0.3*"></ColumnDefinition>
|
||||
<ColumnDefinition Width="0.5*"></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock x:Name="TextBlockDomain" Text="{DynamicResource TextBlockTrojanGoDomain}" Grid.Column="0" Grid.Row="0" Margin="5" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxDomain" Style="{StaticResource TitleText}" Tag="{DynamicResource TextBoxDomainPrompt}" Grid.Column="1" Grid.Row="0" Margin="5"></TextBox>
|
||||
<TextBlock Text="{DynamicResource TextBlockTrojanGoPort}" Grid.Column="2" Grid.Row="0" Margin="5" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
|
||||
|
||||
<!--<Button x:Name="ButtonDomain" Content="检测" Visibility="Collapsed" Grid.Column="2" Grid.Row="0" Margin="2" Click="ButtonDomain_Click"></Button>-->
|
||||
<!--<TextBlock x:Name="TextBlockServerListenPort" Text="服务端口:" Grid.Column="0" Grid.Row="1"></TextBlock>
|
||||
<TextBox x:Name="TextBoxServerListenPort" Grid.Column="1" Grid.Row="1" Margin="3"></TextBox>
|
||||
<Button x:Name="ButtonServerListenPort" Content="随机选择" Grid.Column="2" Grid.Row="1" Margin="2" Click="ButtonServerListenPort_Click"></Button>-->
|
||||
|
||||
<TextBlock x:Name="TextBlockNewUUID" Text="{DynamicResource TextBlockTrojanGoPassword}" Grid.Column="0" Grid.Row="1" HorizontalAlignment="Right" VerticalAlignment="Center" ></TextBlock>
|
||||
<TextBox x:Name="TextBoxNewUUID" Grid.Column="1" Grid.Row="1" Margin="5"></TextBox>
|
||||
<Button x:Name="ButtonNewUUID" Content="{DynamicResource ButtonTrojanChangePassword}" Grid.Column="2" Grid.Row="1" Margin="3" Click="ButtonNewUUID_Click"></Button>
|
||||
<TextBlock Text="{DynamicResource TextBlockTrojanGoPasswordExplain}" TextWrapping="Wrap" Grid.Column="3" Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockPath" Text="{DynamicResource TextBlockTrojanGoWebSocketPath}" Grid.Column="0" Grid.Row="2" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxPath" Grid.Column="1" Grid.Row="2" Grid.ColumnSpan="1" Margin="5"></TextBox>
|
||||
<Button x:Name="ButtonPath" Content="{DynamicResource ButtonNaiveProxyChangeUser}" Grid.Column="2" Grid.Row="2" Margin="2" Click="ButtonPath_Click"></Button>
|
||||
|
||||
<TextBlock x:Name="TextBlockMaskSites" Text="{DynamicResource TextBlockV2RayMaskSites}" Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="2" Visibility="Hidden"></TextBlock>
|
||||
<TextBox x:Name="TextBoxMaskSites" Style="{StaticResource TitleText}" Tag="{DynamicResource TextBoxV2RayMaskSitesTag}" Grid.Column="1" Grid.Row="3" Margin="5" Visibility="Hidden"></TextBox>
|
||||
<Grid Grid.Column="0" Grid.Row="5" Grid.ColumnSpan="4">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Button x:Name="ButtondDecide" Content="{DynamicResource ButtonTrojanGoTemplateOK}" Grid.Column="1" Grid.Row="6" Margin="3" Click="ButtondDecide_Click"></Button>
|
||||
<Button x:Name="ButtondCancel" Content="{DynamicResource ButtonTrojanGoTemplateCancel}" Grid.Column="3" Grid.Row="6" Margin="3" Click="ButtondCancel_Click"></Button>
|
||||
|
||||
</Grid>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
</Grid>
|
||||
|
||||
</Grid>
|
||||
</Window>
|
|
@ -1,157 +0,0 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
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 ProxySU
|
||||
{
|
||||
/// <summary>
|
||||
/// TrojanGoTemplateWindow.xaml 的交互逻辑
|
||||
/// </summary>
|
||||
public partial class TrojanGoTemplateWindow : Window
|
||||
{
|
||||
public TrojanGoTemplateWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
RadioButtonTrojanGoTLS2Web.IsChecked = true;
|
||||
}
|
||||
private void ButtondDecide_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (string.IsNullOrEmpty(TextBoxDomain.Text.ToString()) == true)
|
||||
{
|
||||
//****** "域名不能为空,请检查相关参数设置!" ******
|
||||
MessageBox.Show(Application.Current.FindResource("MessageBoxShow_DomainNotEmpty").ToString());
|
||||
return;
|
||||
}
|
||||
//传递域名
|
||||
MainWindow.ReceiveConfigurationParameters[4] = TextBoxDomain.Text.ToString();
|
||||
//处理伪装网站域名中的前缀
|
||||
MainWindow.ReceiveConfigurationParameters[7] = TextBoxMaskSites.Text.ToString();
|
||||
|
||||
if (TextBoxMaskSites.Text.ToString().Length >= 7)
|
||||
{
|
||||
string testDomain = TextBoxMaskSites.Text.Substring(0, 7);
|
||||
if (String.Equals(testDomain, "https:/") || String.Equals(testDomain, "http://"))
|
||||
{
|
||||
//MessageBox.Show(testDomain);
|
||||
MainWindow.ReceiveConfigurationParameters[7] = TextBoxMaskSites.Text.Replace("/", "\\/");
|
||||
}
|
||||
else
|
||||
{
|
||||
MainWindow.ReceiveConfigurationParameters[7] = "http:\\/\\/" + TextBoxMaskSites.Text;
|
||||
}
|
||||
}
|
||||
|
||||
//传递服务端口
|
||||
MainWindow.ReceiveConfigurationParameters[1] = "443";
|
||||
//传递密码(uuid)
|
||||
MainWindow.ReceiveConfigurationParameters[2] = TextBoxNewUUID.Text.ToString();
|
||||
if (RadioButtonTrojanGoTLS2Web.IsChecked == true)
|
||||
{
|
||||
//传递模板类型
|
||||
MainWindow.ReceiveConfigurationParameters[0] = "TrojanGoTLS2Web";
|
||||
//传递方案名称
|
||||
MainWindow.ReceiveConfigurationParameters[8] = RadioButtonTrojanGoTLS2Web.Content.ToString();
|
||||
|
||||
}
|
||||
else if (RadioButtonTrojanGoWebSocketTLS2Web.IsChecked == true)
|
||||
{
|
||||
//传递模板类型
|
||||
MainWindow.ReceiveConfigurationParameters[0] = "TrojanGoWebSocketTLS2Web";
|
||||
//传递方案名称
|
||||
MainWindow.ReceiveConfigurationParameters[8] = RadioButtonTrojanGoWebSocketTLS2Web.Content.ToString();
|
||||
//传递路径
|
||||
MainWindow.ReceiveConfigurationParameters[6] = TextBoxPath.Text;
|
||||
}
|
||||
|
||||
this.Close();
|
||||
}
|
||||
//更新密码
|
||||
private void ButtonNewUUID_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
//Guid uuid = Guid.NewGuid();
|
||||
TextBoxNewUUID.Text = GenerateRandomUUID();
|
||||
}
|
||||
//更新路径
|
||||
private void ButtonPath_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
string path = GenerateRandomPath();
|
||||
TextBoxPath.Text = $"/{path}";
|
||||
//MessageBox.Show(path);
|
||||
}
|
||||
//private void ButtonServerListenPort_Click(object sender, RoutedEventArgs e)
|
||||
//{
|
||||
// TextBoxServerListenPort.Text = GetRandomPort();
|
||||
//}
|
||||
private void ButtondCancel_Click(object sender, RoutedEventArgs e) => Close();
|
||||
|
||||
private void RadioButtonTrojanTLS2Web_Checked(object sender, RoutedEventArgs e)
|
||||
{
|
||||
Guid uuid = Guid.NewGuid();
|
||||
TextBoxNewUUID.Text = uuid.ToString();
|
||||
TextBlockPath.Visibility = Visibility.Collapsed;
|
||||
TextBoxPath.Visibility = Visibility.Collapsed;
|
||||
ButtonPath.Visibility = Visibility.Collapsed;
|
||||
//Random random = new Random();
|
||||
//int randomServerPort = random.Next(10000, 50000);
|
||||
//TextBoxServerListenPort.Text = "443";
|
||||
}
|
||||
private void RadioButtonTrojanGoWebSocketTLS2Web_Checked(object sender, RoutedEventArgs e)
|
||||
{
|
||||
Guid uuid = Guid.NewGuid();
|
||||
TextBoxNewUUID.Text = uuid.ToString();
|
||||
TextBlockPath.Visibility = Visibility.Visible;
|
||||
TextBoxPath.Visibility = Visibility.Visible;
|
||||
ButtonPath.Visibility = Visibility.Visible;
|
||||
TextBoxPath.Text = "/trojan";
|
||||
}
|
||||
|
||||
//生成随机UUID
|
||||
private string GenerateRandomUUID()
|
||||
{
|
||||
Guid uuid = Guid.NewGuid();
|
||||
return uuid.ToString();
|
||||
}
|
||||
|
||||
//生成随机端口
|
||||
private int GetRandomPort()
|
||||
{
|
||||
Random random = new Random();
|
||||
return random.Next(10001, 60000);
|
||||
}
|
||||
//生成随机Path
|
||||
private string GenerateRandomPath()
|
||||
{
|
||||
Random random = new Random();
|
||||
int randomSerialNum = random.Next(0, 4);
|
||||
//Guid uuid = Guid.NewGuid();
|
||||
string uuid = GenerateRandomUUID();
|
||||
string[] pathArray = uuid.Split('-');
|
||||
string path = pathArray[randomSerialNum];
|
||||
return path;
|
||||
}
|
||||
//域名检测是否为空
|
||||
private bool TestDomainIsEmpty()
|
||||
{
|
||||
if (string.IsNullOrEmpty(TextBoxDomain.Text.ToString()) == true)
|
||||
{
|
||||
//****** "域名不能为空,请检查相关参数设置!" ******
|
||||
MessageBox.Show(Application.Current.FindResource("MessageBoxShow_DomainNotEmpty").ToString());
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -1,378 +0,0 @@
|
|||
<Window x:Name="TemplateConfiguration" x:Class="ProxySU.WindowTemplateConfiguration"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:local="clr-namespace:ProxySU"
|
||||
mc:Ignorable="d"
|
||||
Title="V2RayTemplateConfiguration" Height="600" Width="950">
|
||||
<Window.Resources>
|
||||
<Style BasedOn="{StaticResource {x:Type TextBox}}"
|
||||
TargetType="TextBox"
|
||||
x:Key="TitleText">
|
||||
<Style.Triggers>
|
||||
<MultiTrigger>
|
||||
<MultiTrigger.Conditions>
|
||||
<Condition Property="Text" Value=""/>
|
||||
<Condition Property="TextBox.IsFocused" Value="false"/>
|
||||
</MultiTrigger.Conditions>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate>
|
||||
<Border BorderThickness="1" BorderBrush="Gray" Margin="0">
|
||||
<TextBlock x:Name="MainTextBlock" Text="{TemplateBinding TextBox.Tag}" Width="{TemplateBinding TextBox.ActualWidth}" Foreground="Gray" VerticalAlignment="Center" HorizontalAlignment="Left"/>
|
||||
</Border>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</MultiTrigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
|
||||
</Window.Resources>
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<GroupBox Header="{DynamicResource GroupBoxHeaderV2RayTemplates}" Grid.Row="0" Grid.RowSpan="3">
|
||||
<Grid>
|
||||
<TabControl x:Name="TabControlTemplate">
|
||||
<TabItem Header="{DynamicResource TabItemHeaderV2RayHotPlan}" Width="100" Height="30">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.8*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition Width="0.3*"></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="0.2*"></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<RadioButton x:Name="RadioButtonWebSocketTLS2WebHot" Content="WebSocket+TLS+Web" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="1" Checked="RadioButtonWebSocketTLS2Web_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayWebSocketTlsWebExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="3" VerticalAlignment="Center" HorizontalAlignment="Left"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonHTTP2WebHot" Content="HTTP2+TLS+Web" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="2" Checked="RadioButtonWebSocketTLS2Web_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayHttp2TlsWebExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="2" Grid.ColumnSpan="3" VerticalAlignment="Center" HorizontalAlignment="Left"></TextBlock>
|
||||
|
||||
</Grid>
|
||||
</TabItem>
|
||||
|
||||
<TabItem Header="{DynamicResource TabItemHeaderV2RayEarlyPlan}" Width="100" Height="30">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="10"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition Width="10"></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="10"></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="0.4*"></RowDefinition>
|
||||
<RowDefinition Height="10"></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<Grid Grid.Column="1" Grid.Row="1">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.2*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Text="{DynamicResource TextBlockVlessVmessXtlsTcpWebSocketExplainHot}" TextWrapping="Wrap" Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="2" VerticalAlignment="Center" HorizontalAlignment="Left"></TextBlock>
|
||||
<TextBlock Text="1. VLESS over TCP with XTLS" Grid.Column="1" Grid.Row="1" VerticalAlignment="Bottom"></TextBlock>
|
||||
<TextBlock Text="2. VLESS over TCP with TLS" Grid.Column="1" Grid.Row="2" VerticalAlignment="Bottom"></TextBlock>
|
||||
<TextBlock Text="3. VLESS over WS with TLS" Grid.Column="1" Grid.Row="3" VerticalAlignment="Bottom"></TextBlock>
|
||||
<TextBlock Text="4. VMess over TCP with TLS" Grid.Column="1" Grid.Row="4" VerticalAlignment="Bottom"></TextBlock>
|
||||
<TextBlock Text="5. VMess over WS with TLS" Grid.Column="1" Grid.Row="5" VerticalAlignment="Bottom"></TextBlock>
|
||||
</Grid>
|
||||
<RadioButton x:Name="RadioButtonVlessVmessXtlsTcpWebSocketHot" Content="VLESS+VMESS+XTLS+TCP+WebSocket+Web" GroupName="TemplateGroup" Grid.Column="1" Grid.Row="2" Grid.ColumnSpan="2" Checked="RadioButtonVlessVmessXtlsTcpWebSocketHot_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
|
||||
<!--<Grid Grid.Column="0" Grid.Row="2">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="0.15*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock x:Name="TextBlockVlessVmessXtlsTcpWebSocket" Text="VLESS+VMESS+XTLS+TCP+WebSocket+Web" TextWrapping="Wrap" Margin="0,0,8,0" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Left" MouseDown="TextBlockVlessVmessXtlsTcpWebSocket_MouseDown"></TextBlock>
|
||||
</Grid>-->
|
||||
|
||||
</Grid>
|
||||
</TabItem>
|
||||
|
||||
|
||||
<TabItem Header="{DynamicResource TabItemHeaderV2RayVlessProtocol}" Width="100" Height="30">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="1.2*"></RowDefinition>
|
||||
<RowDefinition Height="1.2*"></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="3"></RowDefinition>
|
||||
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Text="{DynamicResource TextBlockVlessExplain}" TextWrapping="Wrap" Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="4" Margin="5,3,5,0"></TextBlock>
|
||||
|
||||
<RadioButton x:Name="RadioButtonVlessXtlsTcp" Content="VLESS+TCP+XTLS+Web" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="1" Checked="RadioButtonVlessTcpTlsWeb_Checked" VerticalAlignment="Center" HorizontalAlignment="Left" ></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockVlessXtlsTcpExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="3" Margin="0,0,5,0" VerticalAlignment="Center" HorizontalAlignment="Left"></TextBlock>
|
||||
|
||||
<RadioButton x:Name="RadioButtonVlessTcpTlsWeb" Content="VLESS+TCP+TLS+Web" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Left" Checked="RadioButtonVlessTcpTlsWeb_Checked" ></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayVlessTcpTlsWebExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="2" Grid.ColumnSpan="3" Margin="0,0,5,0" VerticalAlignment="Center" HorizontalAlignment="Left"></TextBlock>
|
||||
|
||||
<RadioButton x:Name="RadioButtonVlessWebSocketTlsWeb" Content="VLESS+WebSocket+TLS+Web" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="3" Checked="RadioButtonWebSocketTLS2Web_Checked" VerticalAlignment="Center" HorizontalAlignment="Left" />
|
||||
<TextBlock Text="{DynamicResource TextBlockVlessWebSocketTlsWebExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="3" Margin="0,0,8,0" Grid.ColumnSpan="3" VerticalAlignment="Center" HorizontalAlignment="Left"></TextBlock>
|
||||
|
||||
<RadioButton x:Name="RadioButtonVlessHttp2Web" Content="VLESS+http2+TLS+Web" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="4" Checked="RadioButtonWebSocketTLS2Web_Checked" VerticalAlignment="Center" HorizontalAlignment="Left"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockVlessHttp2WebExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="4" Grid.ColumnSpan="3" Margin="0,0,5,0" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
|
||||
</Grid>
|
||||
</TabItem>
|
||||
|
||||
|
||||
<TabItem Header="{DynamicResource TabItemHeaderV2RayTcpProtocol}" Width="110" Height="30">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="1.3*"></RowDefinition>
|
||||
<RowDefinition Height="1.7*"></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<RadioButton x:Name="RadioButtonTCP" Content="TCP" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="1" Checked="RadioButtonTCP_Checked" VerticalAlignment="Center" HorizontalAlignment="Left"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayTcpExplain}" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonTCPhttp" Content="{DynamicResource RadioButtonV2RayTcpHttp}" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="2" Checked="RadioButtonTCPhttp_Checked" VerticalAlignment="Center" HorizontalAlignment="Left" ></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayTcpHttpExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="2" Grid.ColumnSpan="3" VerticalAlignment="Center" HorizontalAlignment="Left"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonTCP2TLS" Content="TCP+TLS" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="3" Checked="RadioButtonTCP2TLS_Checked" VerticalAlignment="Center" HorizontalAlignment="Left" />
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayTcpTlsExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="3" Grid.ColumnSpan="3" VerticalAlignment="Center" HorizontalAlignment="Left"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonTcpTLS2SelfSigned" Content="{DynamicResource RadioButtonV2RayTcpTlsSelfSigned}" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="4" Checked="RadioButtonTCP2TLSnoDomain_Checked" VerticalAlignment="Center" HorizontalAlignment="Left" />
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayTcpTlsSelfSignedExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="4" Grid.ColumnSpan="3" VerticalAlignment="Center" HorizontalAlignment="Left"></TextBlock>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RaySelfSignedShadowrocketExplain}" TextWrapping="Wrap" Grid.Column="4" Grid.Row="4" HorizontalAlignment="Left" VerticalAlignment="Center" ></TextBlock>
|
||||
|
||||
</Grid>
|
||||
</TabItem>
|
||||
|
||||
<TabItem Header="{DynamicResource TabItemHeaderV2RayWebSocketProtocol}" Width="150" Height="30">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="1.5*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="1.3*"></RowDefinition>
|
||||
<RowDefinition Height="1.3*"></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<RadioButton x:Name="RadioButtonWebSocket" Content="WebSocket" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="1" Checked="RadioButtonTCP_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"/>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayWebSocketExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonWebSocketTLS" Content="WebSocket+TLS" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="2" Checked="RadioButtonHTTP2_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"/>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayWebSocketTlsExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="2" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonWebSocketTLS2Web" Content="WebSocket+TLS+Web" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="3" Checked="RadioButtonWebSocketTLS2Web_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayWebSocketTlsWebExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="3" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonWebSocketTLSselfSigned" Content="{DynamicResource RadioButtonV2RayWebSocketTlsSelfSigned}" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="4" Checked="RadioButtonWebSocketTLSselfSigned_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayWebSocketTlsSelfSignedExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="4" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RaySelfSignedShadowrocketExplain}" TextWrapping="Wrap" Grid.Column="4" Grid.Row="4" HorizontalAlignment="Left" VerticalAlignment="Center" ></TextBlock>
|
||||
|
||||
</Grid>
|
||||
</TabItem>
|
||||
<TabItem Header="{DynamicResource TabItemHeaderV2RayHttp2Protocol}" Width="110" Height="30">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="1*"></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition Height="1.8*"></RowDefinition>
|
||||
<RowDefinition Height="1.5*"></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<RadioButton x:Name="RadioButtonHTTP2" Content="HTTP2" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="1" Checked="RadioButtonHTTP2_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayHttp2Explain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonHTTP2Web" Content="HTTP2+TLS+Web" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="2" Checked="RadioButtonWebSocketTLS2Web_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayHttp2TlsWebExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="2" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonHTTP2selfSigned" Content="{DynamicResource RadioButtonV2RayHttp2SelfSigned}" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="3" Checked="RadioButtonWebSocketTLSselfSigned_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayHttp2SelfSignedExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="3" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RaySelfSignedShadowrocketExplain}" TextWrapping="Wrap" Grid.Column="4" Grid.Row="3" ></TextBlock>
|
||||
|
||||
</Grid>
|
||||
</TabItem>
|
||||
|
||||
<TabItem Header="{DynamicResource TabItemHeaderV2RayMkcpProtocol}" Width="110" Height="30">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<RadioButton x:Name="RadioButtonMkcpNone" Content="{DynamicResource RadioButtonV2RayMkcpNone}" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="1" Checked="RadioButtonMkcp_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayMkcpNoneExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButton2mKCP2SRTP" Content="mKCP+SRTP" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="2" Checked="RadioButtonMkcp_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayMkcpSRTPExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="2" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButton2mKCPuTP" Content="mKCP+uTP" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="3" Checked="RadioButtonMkcp_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayMkcpuTPExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="3" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButton2mKCP2WechatVideo" Content="mKCP+WechatVideo" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="4" Checked="RadioButtonMkcp_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayMkcpWeChatExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="4" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButton2mKCP2DTLS" Content="mKCP+DTLS 1.2" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="5" Checked="RadioButtonMkcp_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayMkcpDTLSExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="5" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButton2mKCP2WireGuard" Content="mKCP+WireGuard" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="6" Checked="RadioButtonMkcp_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayMkcpWireGuardExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="6" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
|
||||
</Grid>
|
||||
</TabItem>
|
||||
<TabItem Header="{DynamicResource TabItemHeaderV2RayQuicProtocol}" Width="110" Height="30">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayQuicShadowrocketExplain}" Foreground="Red" Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="5" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonQuicNone" Content="{DynamicResource RadioButtonV2RayQuicNone}" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="1" Checked="RadioButtonQuicNone_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayQuicNoneExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonQuicSRTP" Content="QUIC+SRTP" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="2" Checked="RadioButtonQuicNone_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayQuicSRTPExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="2" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonQuic2uTP" Content="QUIC+uTP" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="3" Checked="RadioButtonQuicNone_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayQuicuTPExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="3" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonQuicWechatVideo" Content="QUIC+WechatVideo" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="4" Checked="RadioButtonQuicNone_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayQuicWeChatExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="4" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonQuicDTLS" Content="QUIC+DTLS 1.2" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="5" Checked="RadioButtonQuicNone_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayQuicDTLSExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="5" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
<RadioButton x:Name="RadioButtonQuicWireGuard" Content="QUIC+WireGuard" GroupName="TemplateGroup" Grid.Column="0" Grid.Row="6" Checked="RadioButtonQuicNone_Checked" HorizontalAlignment="Left" VerticalAlignment="Center"></RadioButton>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayQuicWireGuardExplain}" TextWrapping="Wrap" Grid.Column="1" Grid.Row="6" Grid.ColumnSpan="3" HorizontalAlignment="Left" VerticalAlignment="Center"></TextBlock>
|
||||
|
||||
</Grid>
|
||||
</TabItem>
|
||||
</TabControl>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
<GroupBox Header="{DynamicResource GroupBoxHeaderParameterV2Ray}" Grid.Row="3" Grid.RowSpan="2">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="1.1*"></ColumnDefinition>
|
||||
<ColumnDefinition ></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
<ColumnDefinition></ColumnDefinition>
|
||||
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
<RowDefinition></RowDefinition>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock x:Name="TextBlockServerListenPort" Text="{DynamicResource TextBlockV2RayServerPort}" Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxServerListenPort" Grid.Column="1" Grid.Row="0" Grid.ColumnSpan="3" Margin="3"></TextBox>
|
||||
<Button x:Name="ButtonServerListenPort" Content="{DynamicResource ButtonV2RayServerPortChange}" Grid.Column="4" Grid.Row="0" Margin="2" Click="ButtonServerListenPort_Click"></Button>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayServerPortExplain}" Grid.Column="5" Grid.ColumnSpan="2" Grid.Row="0" Margin="3"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockNewUUID" Text="UUID:" Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxNewUUID" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="3" Margin="3"></TextBox>
|
||||
<Button x:Name="ButtonNewUUID" Content="{DynamicResource ButtonTrojanChangePassword}" Grid.Column="4" Grid.Row="1" Margin="2" Click="ButtonNewUUID_Click"></Button>
|
||||
<TextBlock Text="{DynamicResource TextBlockV2RayUUIDExplain}" TextWrapping="Wrap" Grid.Column="5" Grid.Row="1" Grid.ColumnSpan="2" Margin="0"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockQuicUUID" Text="{DynamicResource TextBlockV2RayQuicUUID}" Visibility="Collapsed" Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBlock x:Name="TextBlockMkcpSeedUUID" Text="{DynamicResource TextBlockV2RayMkcpSeedUUID}" Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxQuicAndMkcpSeedUUID" Grid.Column="1" Grid.Row="2" Grid.ColumnSpan="3" Margin="3"></TextBox>
|
||||
<Button x:Name="ButtonQuicAndmKcpSeedUUID" Content="{DynamicResource ButtonTrojanChangePassword}" Grid.Column="4" Grid.Row="2" Margin="2" Click="ButtonQuicAndMkcpSeedUUID_Click"></Button>
|
||||
<TextBlock x:Name="TextBlockMkcpUUID" Text="{DynamicResource TextBlockV2RayMkcpExplain}" TextWrapping="Wrap" Grid.Column="5" Grid.Row="2" Grid.ColumnSpan="2"></TextBlock>
|
||||
|
||||
<TextBlock x:Name="TextBlockPath" Text="{DynamicResource TextBlockV2RayPath}" Visibility="Collapsed" Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxPath" Visibility="Collapsed" Grid.Column="1" Grid.Row="3" Grid.ColumnSpan="3" Margin="3"></TextBox>
|
||||
<Button x:Name="ButtonPath" Content="{DynamicResource ButtonNaiveProxyChangeUser}" Visibility="Collapsed" Grid.Column="4" Grid.Row="3" Margin="2" Click="ButtonPath_Click"></Button>
|
||||
|
||||
<TextBlock x:Name="TextBlockPathVlessWs" Text="{DynamicResource TextBlockV2RayVlessWsPath}" Grid.Column="0" Grid.Row="3" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxPathVlessWS" Grid.Column="1" Grid.Row="3" Margin="3"></TextBox>
|
||||
<TextBlock x:Name="TextBlockPathVmessTcp" Text="{DynamicResource TextBlockV2RayVmessTcpPath}" Grid.Column="2" Grid.Row="3" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxPathVmessTcp" Grid.Column="3" Grid.Row="3" Margin="3"></TextBox>
|
||||
<TextBlock x:Name="TextBlockPathVmessWs" Text="{DynamicResource TextBlockV2RayVmessWsPath}" Grid.Column="4" Grid.Row="3" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxPathVmessWS" Grid.Column="5" Grid.Row="3" Margin="3"></TextBox>
|
||||
<Button x:Name="ButtonVlessVmessPath" Content="{DynamicResource ButtonNaiveProxyChangeUser}" Grid.Column="6" Grid.Row="3" Margin="2" Click="ButtonVlessVmessPath_Click"></Button>
|
||||
|
||||
<TextBlock x:Name="TextBlockQuicEncryption" Text="{DynamicResource TextBlockQuicEncryption}" Visibility="Collapsed" Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<ComboBox x:Name="ComboBoxEncryptionMethodInfo" Visibility="Collapsed" Grid.Column="1" Grid.Row="3" Grid.ColumnSpan="2" Height="25" Margin="3,0,0,0" SelectionChanged="ComboBoxEncryptionMethodInfo_SelectionChanged"></ComboBox>
|
||||
|
||||
<TextBlock x:Name="TextBlockDomain" Text="{DynamicResource TextBlockV2RayDomain}" Grid.Column="0" Grid.Row="4" Grid.ColumnSpan="1" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>
|
||||
<TextBox x:Name="TextBoxDomain" Style="{StaticResource TitleText}" Tag="{DynamicResource TextBoxDomainPrompt}" Grid.Column="1" Grid.Row="4" Grid.ColumnSpan="3" Margin="3"></TextBox>
|
||||
<Button x:Name="ButtonDomain" Content="检测" Visibility="Collapsed" Grid.Column="4" Grid.Row="4" Margin="2" Click="ButtonDomain_Click"></Button>
|
||||
<TextBlock x:Name="TextBlockMaskSites" Text="{DynamicResource TextBlockV2RayMaskSites}" Grid.Column="0" Grid.Row="5" Grid.ColumnSpan="1" Visibility="Hidden"></TextBlock>
|
||||
<TextBox x:Name="TextBoxMaskSites" Style="{StaticResource TitleText}" Tag="{DynamicResource TextBoxV2RayMaskSitesTag}" Grid.Column="1" Grid.Row="5" Grid.ColumnSpan="3" Margin="3" Visibility="Hidden"></TextBox>
|
||||
|
||||
|
||||
<Button x:Name="ButtondDecide" Content="{DynamicResource ButtonTrojanGoTemplateOK}" Grid.Column="1" Grid.Row="6" Margin="0" Click="ButtondDecide_Click"></Button>
|
||||
<Button x:Name="ButtondCancel" Content="{DynamicResource ButtonTrojanGoTemplateCancel}" Grid.Column="3" Grid.Row="6" Margin="0" Click="ButtondCancel_Click"></Button>
|
||||
<!--<Button x:Name="ButtonTestChecked" Content="测试选中状态" Grid.Column="5" Grid.Row="6" Click="ButtonTestChecked_Click"></Button>-->
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
|
||||
</Grid>
|
||||
</Window>
|
File diff suppressed because it is too large
Load diff
Binary file not shown.
13
ProxySuper.Core/App.cs
Normal file
13
ProxySuper.Core/App.cs
Normal file
|
@ -0,0 +1,13 @@
|
|||
using MvvmCross.ViewModels;
|
||||
using ProxySuper.Core.ViewModels;
|
||||
|
||||
namespace ProxySuper.Core
|
||||
{
|
||||
public class App : MvxApplication
|
||||
{
|
||||
public override void Initialize()
|
||||
{
|
||||
RegisterAppStart<HomeViewModel>();
|
||||
}
|
||||
}
|
||||
}
|
22
ProxySuper.Core/Converters/LoginSecretTypeConverter.cs
Normal file
22
ProxySuper.Core/Converters/LoginSecretTypeConverter.cs
Normal file
|
@ -0,0 +1,22 @@
|
|||
using ProxySuper.Core.Models.Hosts;
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Windows.Data;
|
||||
|
||||
namespace ProxySuper.Core.Converters
|
||||
{
|
||||
public class LoginSecretTypeConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
return value.Equals(parameter);
|
||||
}
|
||||
|
||||
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
|
||||
{
|
||||
if (parameter == null) return LoginSecretType.Password;
|
||||
return parameter;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
29
ProxySuper.Core/Converters/ProxyTypeConverter.cs
Normal file
29
ProxySuper.Core/Converters/ProxyTypeConverter.cs
Normal file
|
@ -0,0 +1,29 @@
|
|||
using System;
|
||||
using System.Globalization;
|
||||
using System.Windows.Data;
|
||||
|
||||
namespace ProxySuper.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;
|
||||
}
|
||||
}
|
||||
}
|
30
ProxySuper.Core/Converters/VisibleConverter.cs
Normal file
30
ProxySuper.Core/Converters/VisibleConverter.cs
Normal file
|
@ -0,0 +1,30 @@
|
|||
using System;
|
||||
using System.Globalization;
|
||||
using System.Windows;
|
||||
using System.Windows.Data;
|
||||
|
||||
namespace ProxySuper.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;
|
||||
}
|
||||
}
|
||||
}
|
82
ProxySuper.Core/Helpers/DateTimeUtils.cs
Normal file
82
ProxySuper.Core/Helpers/DateTimeUtils.cs
Normal file
|
@ -0,0 +1,82 @@
|
|||
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Net;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace ProxySuper.Core.Helpers
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
40
ProxySuper.Core/Helpers/Utils.cs
Normal file
40
ProxySuper.Core/Helpers/Utils.cs
Normal file
|
@ -0,0 +1,40 @@
|
|||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Linq;
|
||||
|
||||
namespace ProxySuper.Core.Services
|
||||
{
|
||||
public class Utils
|
||||
{
|
||||
public static string Base64Encode(string plainText)
|
||||
{
|
||||
var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
|
||||
return System.Convert.ToBase64String(plainTextBytes);
|
||||
}
|
||||
|
||||
public static string Base64Decode(string base64EncodedData)
|
||||
{
|
||||
var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
|
||||
return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
|
||||
}
|
||||
|
||||
public static T DeepClone<T>(T obj) where T : class
|
||||
{
|
||||
var serialized = JsonConvert.SerializeObject(obj);
|
||||
return JsonConvert.DeserializeObject<T>(serialized);
|
||||
}
|
||||
|
||||
public static string GetTickID()
|
||||
{
|
||||
return DateTime.Now.Ticks.ToString();
|
||||
}
|
||||
|
||||
private static Random random = new Random();
|
||||
public static string RandomString(int length)
|
||||
{
|
||||
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||
return new string(Enumerable.Repeat(chars, length)
|
||||
.Select(s => s[random.Next(s.Length)]).ToArray());
|
||||
}
|
||||
}
|
||||
}
|
42
ProxySuper.Core/Models/Caddy.cs
Normal file
42
ProxySuper.Core/Models/Caddy.cs
Normal file
|
@ -0,0 +1,42 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySuper.Core.Models
|
||||
{
|
||||
public static class Caddy
|
||||
{
|
||||
public static string Service = @"
|
||||
[Unit]
|
||||
Description=Caddy
|
||||
Documentation=https://caddyserver.com/docs/
|
||||
After=network.target network-online.target
|
||||
Requires=network-online.target
|
||||
|
||||
[Service]
|
||||
#User=caddy
|
||||
#Group=caddy
|
||||
User=root
|
||||
Group=root
|
||||
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
|
||||
ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile
|
||||
TimeoutStopSec=5s
|
||||
#LimitNOFILE=1048576
|
||||
#LimitNPROC=512
|
||||
PrivateTmp=true
|
||||
ProtectSystem=full
|
||||
#AmbientCapabilities=CAP_NET_BIND_SERVICE
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
";
|
||||
|
||||
public static string DefaultCaddyFile = @"
|
||||
:80 {
|
||||
respond ""Hello world!"";
|
||||
}
|
||||
";
|
||||
}
|
||||
}
|
57
ProxySuper.Core/Models/Hosts/Host.cs
Normal file
57
ProxySuper.Core/Models/Hosts/Host.cs
Normal file
|
@ -0,0 +1,57 @@
|
|||
using Microsoft.Win32;
|
||||
using MvvmCross.Commands;
|
||||
using Newtonsoft.Json;
|
||||
using System.ComponentModel;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
|
||||
namespace ProxySuper.Core.Models.Hosts
|
||||
{
|
||||
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 string PrivateKeyPassPhrase { get; set; }
|
||||
|
||||
public LocalProxy Proxy { get; set; }
|
||||
|
||||
public LoginSecretType SecretType { get; set; }
|
||||
|
||||
public IMvxCommand UploadPrivateKeyCommand => new MvxCommand(UploadPrivateKey);
|
||||
|
||||
private void UploadPrivateKey()
|
||||
{
|
||||
var fileDialog = new OpenFileDialog();
|
||||
fileDialog.FileOk += OnFileOk;
|
||||
fileDialog.ShowDialog();
|
||||
}
|
||||
|
||||
private void OnFileOk(object sender, CancelEventArgs e)
|
||||
{
|
||||
var file = sender as OpenFileDialog;
|
||||
PrivateKeyPath = file.FileName;
|
||||
|
||||
Task.Delay(300).ContinueWith((t) =>
|
||||
{
|
||||
MessageBox.Show("上传成功", "提示");
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
20
ProxySuper.Core/Models/Hosts/LocalProxy.cs
Normal file
20
ProxySuper.Core/Models/Hosts/LocalProxy.cs
Normal file
|
@ -0,0 +1,20 @@
|
|||
using Renci.SshNet;
|
||||
|
||||
namespace ProxySuper.Core.Models.Hosts
|
||||
{
|
||||
public class LocalProxy
|
||||
{
|
||||
public string Address { get; set; } = "127.0.0.1";
|
||||
|
||||
public int Port { get; set; } = 1080;
|
||||
|
||||
public ProxyTypes Type { get; set; }
|
||||
|
||||
public string UserName { get; set; }
|
||||
|
||||
public string Password { get; set; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
8
ProxySuper.Core/Models/Hosts/LoginSecretType.cs
Normal file
8
ProxySuper.Core/Models/Hosts/LoginSecretType.cs
Normal file
|
@ -0,0 +1,8 @@
|
|||
namespace ProxySuper.Core.Models.Hosts
|
||||
{
|
||||
public enum LoginSecretType
|
||||
{
|
||||
Password = 0,
|
||||
PrivateKey = 1
|
||||
}
|
||||
}
|
83
ProxySuper.Core/Models/ProjectProgress.cs
Normal file
83
ProxySuper.Core/Models/ProjectProgress.cs
Normal file
|
@ -0,0 +1,83 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySuper.Core.Models
|
||||
{
|
||||
public class ProjectProgress
|
||||
{
|
||||
private string _step;
|
||||
|
||||
private string _desc;
|
||||
|
||||
private int _percentage;
|
||||
|
||||
private string _logs;
|
||||
|
||||
public ProjectProgress()
|
||||
{
|
||||
_step = "步骤";
|
||||
|
||||
_desc = "步骤描述";
|
||||
|
||||
_percentage = 0;
|
||||
|
||||
_logs = string.Empty;
|
||||
|
||||
StepUpdate = () => { };
|
||||
}
|
||||
|
||||
|
||||
public Action StepUpdate { get; set; }
|
||||
|
||||
public Action LogsUpdate { get; set; }
|
||||
|
||||
public string Desc
|
||||
{
|
||||
get { return _desc; }
|
||||
set
|
||||
{
|
||||
_desc = value;
|
||||
StepUpdate();
|
||||
|
||||
_logs += _desc + "\n";
|
||||
LogsUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
public string Step
|
||||
{
|
||||
get { return _step; }
|
||||
set
|
||||
{
|
||||
_step = value;
|
||||
StepUpdate();
|
||||
|
||||
_logs += Step + "\n";
|
||||
LogsUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
public int Percentage
|
||||
{
|
||||
get { return _percentage; }
|
||||
set
|
||||
{
|
||||
_percentage = value;
|
||||
StepUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
public string Logs
|
||||
{
|
||||
get { return _logs; }
|
||||
set
|
||||
{
|
||||
_logs = value;
|
||||
LogsUpdate();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
34
ProxySuper.Core/Models/Projects/BrookSettings.cs
Normal file
34
ProxySuper.Core/Models/Projects/BrookSettings.cs
Normal file
|
@ -0,0 +1,34 @@
|
|||
using System.Collections.Generic;
|
||||
|
||||
namespace ProxySuper.Core.Models.Projects
|
||||
{
|
||||
public class BrookSettings : IProjectSettings
|
||||
{
|
||||
public string Domain { get; set; }
|
||||
|
||||
public string IP { get; set; }
|
||||
|
||||
public string Password { get; set; }
|
||||
|
||||
public BrookType BrookType { get; set; }
|
||||
|
||||
public int Port { get; set; } = 443;
|
||||
|
||||
public List<int> FreePorts
|
||||
{
|
||||
get
|
||||
{
|
||||
if (Port == 443)
|
||||
{
|
||||
return new List<int> { 80, 443 };
|
||||
}
|
||||
return new List<int> { Port };
|
||||
}
|
||||
}
|
||||
|
||||
public string Email => "server@brook.com";
|
||||
|
||||
public ProjectType Type { get; set; } = ProjectType.Brook;
|
||||
|
||||
}
|
||||
}
|
10
ProxySuper.Core/Models/Projects/BrookType.cs
Normal file
10
ProxySuper.Core/Models/Projects/BrookType.cs
Normal file
|
@ -0,0 +1,10 @@
|
|||
namespace ProxySuper.Core.Models.Projects
|
||||
{
|
||||
public enum BrookType
|
||||
{
|
||||
server,
|
||||
wsserver,
|
||||
wssserver,
|
||||
socks5
|
||||
}
|
||||
}
|
33
ProxySuper.Core/Models/Projects/HysteriaSettings.cs
Normal file
33
ProxySuper.Core/Models/Projects/HysteriaSettings.cs
Normal file
|
@ -0,0 +1,33 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySuper.Core.Models.Projects
|
||||
{
|
||||
public class HysteriaSettings : IProjectSettings
|
||||
{
|
||||
public string Domain { get; set; } = "";
|
||||
|
||||
public string Obfs { get; set; } = "";
|
||||
|
||||
public string Email { get; set; } = "";
|
||||
|
||||
public string Protocol { get; set; } = "udp";
|
||||
|
||||
public int Port { get; set; } = 36712;
|
||||
|
||||
public int UpMbps { get; set; } = 300;
|
||||
|
||||
public int DownMbps { get; set; } = 300;
|
||||
|
||||
public List<int> FreePorts
|
||||
{
|
||||
get
|
||||
{
|
||||
return new List<int> { Port, 80 };
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
32
ProxySuper.Core/Models/Projects/IProjectSettings.cs
Normal file
32
ProxySuper.Core/Models/Projects/IProjectSettings.cs
Normal file
|
@ -0,0 +1,32 @@
|
|||
using System.Collections.Generic;
|
||||
|
||||
namespace ProxySuper.Core.Models.Projects
|
||||
{
|
||||
public interface IProjectSettings
|
||||
{
|
||||
/// <summary>
|
||||
/// 端口
|
||||
/// </summary>
|
||||
int Port { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 域名
|
||||
/// </summary>
|
||||
string Domain { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 额外需要开放的端口
|
||||
/// </summary>
|
||||
List<int> FreePorts { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 类型
|
||||
/// </summary>
|
||||
//ProjectType Type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 邮箱
|
||||
/// </summary>
|
||||
string Email { get; }
|
||||
}
|
||||
}
|
34
ProxySuper.Core/Models/Projects/MTProtoGoSettings.cs
Normal file
34
ProxySuper.Core/Models/Projects/MTProtoGoSettings.cs
Normal file
|
@ -0,0 +1,34 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySuper.Core.Models.Projects
|
||||
{
|
||||
public class MTProtoGoSettings : IProjectSettings
|
||||
{
|
||||
public MTProtoGoSettings()
|
||||
{
|
||||
Port = 443;
|
||||
|
||||
Domain = string.Empty;
|
||||
|
||||
Cleartext = "bing.com";
|
||||
|
||||
SecretText = string.Empty;
|
||||
}
|
||||
|
||||
public int Port { get; set; }
|
||||
|
||||
public string Domain { get; set; }
|
||||
|
||||
public List<int> FreePorts => new List<int> { Port };
|
||||
|
||||
public string Email => "";
|
||||
|
||||
public string Cleartext { get; set; }
|
||||
|
||||
public string SecretText { get; set; }
|
||||
}
|
||||
}
|
53
ProxySuper.Core/Models/Projects/NaiveProxySettings.cs
Normal file
53
ProxySuper.Core/Models/Projects/NaiveProxySettings.cs
Normal file
|
@ -0,0 +1,53 @@
|
|||
using Newtonsoft.Json;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace ProxySuper.Core.Models.Projects
|
||||
{
|
||||
public class NaiveProxySettings : IProjectSettings
|
||||
{
|
||||
public NaiveProxySettings()
|
||||
{
|
||||
Port = 443;
|
||||
}
|
||||
|
||||
public List<int> FreePorts
|
||||
{
|
||||
get
|
||||
{
|
||||
return new List<int> { 80, 443, Port }.Distinct().ToList();
|
||||
}
|
||||
}
|
||||
|
||||
public ProjectType Type { get; set; } = ProjectType.NaiveProxy;
|
||||
|
||||
public int Port { get; set; }
|
||||
|
||||
public string Domain { get; set; }
|
||||
|
||||
public string UserName { get; set; }
|
||||
|
||||
public string Password { get; set; }
|
||||
|
||||
public string MaskDomain { get; set; }
|
||||
|
||||
[JsonIgnore]
|
||||
public string Email
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!string.IsNullOrEmpty(Domain))
|
||||
{
|
||||
var arr = Domain.Split('.');
|
||||
if (arr.Length == 3)
|
||||
{
|
||||
return $"{arr[0]}@{arr[1]}.{arr[2]}";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return $"{UserName + Port.ToString()}@gmail.com";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
13
ProxySuper.Core/Models/Projects/ProjectType.cs
Normal file
13
ProxySuper.Core/Models/Projects/ProjectType.cs
Normal file
|
@ -0,0 +1,13 @@
|
|||
namespace ProxySuper.Core.Models.Projects
|
||||
{
|
||||
public enum ProjectType
|
||||
{
|
||||
Xray = 0,
|
||||
TrojanGo = 1,
|
||||
NaiveProxy = 2,
|
||||
Brook = 3,
|
||||
V2ray = 4,
|
||||
MTProtoGo = 5,
|
||||
Hysteria = 6,
|
||||
}
|
||||
}
|
32
ProxySuper.Core/Models/Projects/RayType.cs
Normal file
32
ProxySuper.Core/Models/Projects/RayType.cs
Normal file
|
@ -0,0 +1,32 @@
|
|||
namespace ProxySuper.Core.Models.Projects
|
||||
{
|
||||
public enum RayType
|
||||
{
|
||||
// 入口
|
||||
VLESS_TCP_XTLS = 100,
|
||||
|
||||
// VLESS 101开头
|
||||
VLESS_TCP = 101,
|
||||
VLESS_WS = 102,
|
||||
VLESS_H2 = 103,
|
||||
VLESS_KCP = 104,
|
||||
VLESS_QUIC = 105,
|
||||
VLESS_gRPC = 110,
|
||||
|
||||
// VMESS 201开头
|
||||
VMESS_TCP = 201,
|
||||
VMESS_WS = 202,
|
||||
VMESS_H2 = 203,
|
||||
VMESS_KCP = 204,
|
||||
VMESS_QUIC = 205,
|
||||
|
||||
// Trojan 301开头
|
||||
Trojan_TCP = 301,
|
||||
Trojan_WS = 302,
|
||||
|
||||
// SS
|
||||
ShadowsocksAEAD = 401
|
||||
}
|
||||
|
||||
|
||||
}
|
91
ProxySuper.Core/Models/Projects/TrojanGoSettings.cs
Normal file
91
ProxySuper.Core/Models/Projects/TrojanGoSettings.cs
Normal file
|
@ -0,0 +1,91 @@
|
|||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace ProxySuper.Core.Models.Projects
|
||||
{
|
||||
public class TrojanGoSettings : IProjectSettings
|
||||
{
|
||||
public TrojanGoSettings()
|
||||
{
|
||||
WithTLS = true;
|
||||
Port = 443;
|
||||
WebSocketPath = "/ws";
|
||||
Password = Guid.NewGuid().ToString();
|
||||
}
|
||||
|
||||
public List<int> FreePorts
|
||||
{
|
||||
get
|
||||
{
|
||||
return new List<int> { 80, 443, Port }.Distinct().ToList();
|
||||
}
|
||||
}
|
||||
|
||||
public ProjectType Type { get; set; } = ProjectType.TrojanGo;
|
||||
|
||||
/// <summary>
|
||||
/// 是否安装TLS证书
|
||||
/// </summary>
|
||||
public bool WithTLS { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 域名
|
||||
/// </summary>
|
||||
public string Domain { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 端口
|
||||
/// </summary>
|
||||
public int Port { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 密码
|
||||
/// </summary>
|
||||
public string Password { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 伪装域名
|
||||
/// </summary>
|
||||
public string MaskDomain { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否开启WebSocket
|
||||
/// </summary>
|
||||
[JsonIgnore]
|
||||
public bool EnableWebSocket
|
||||
{
|
||||
get
|
||||
{
|
||||
return !string.IsNullOrEmpty(WebSocketPath);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// websocket路径
|
||||
/// </summary>
|
||||
public string WebSocketPath { get; set; }
|
||||
|
||||
|
||||
[JsonIgnore]
|
||||
public string Email
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!string.IsNullOrEmpty(Domain))
|
||||
{
|
||||
var arr = Domain.Split('.');
|
||||
if (arr.Length == 3)
|
||||
{
|
||||
return $"{arr[0]}@{arr[1]}.{arr[2]}";
|
||||
}
|
||||
}
|
||||
|
||||
var prefix = Password.Length > 7 ? Password.Substring(0, 7) : Password;
|
||||
return $"{prefix}@gmail.com";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
187
ProxySuper.Core/Models/Projects/V2raySettings.cs
Normal file
187
ProxySuper.Core/Models/Projects/V2raySettings.cs
Normal file
|
@ -0,0 +1,187 @@
|
|||
using Newtonsoft.Json;
|
||||
using ProxySuper.Core.Services;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
|
||||
namespace ProxySuper.Core.Models.Projects
|
||||
{
|
||||
public partial class V2raySettings : IProjectSettings
|
||||
{
|
||||
public static List<string> DisguiseTypes = new List<string> {
|
||||
"none",
|
||||
"srtp",
|
||||
"utp",
|
||||
"wechat-video",
|
||||
"dtls",
|
||||
"wireguard",
|
||||
};
|
||||
|
||||
public V2raySettings()
|
||||
{
|
||||
WithTLS = true;
|
||||
|
||||
var guid = Guid.NewGuid().ToString();
|
||||
Port = 443;
|
||||
VLESS_KCP_Port = 2001;
|
||||
VLESS_QUIC_Port = 2002;
|
||||
VLESS_gRPC_Port = 2003;
|
||||
|
||||
VMESS_KCP_Port = 3001;
|
||||
VMESS_QUIC_Port = 3002;
|
||||
ShadowSocksPort = 4001;
|
||||
|
||||
UUID = guid;
|
||||
Types = new List<RayType>();
|
||||
|
||||
VLESS_WS_Path = "/" + Utils.RandomString(6);
|
||||
VLESS_KCP_Type = "none";
|
||||
VLESS_KCP_Seed = guid;
|
||||
VLESS_QUIC_Key = "";
|
||||
VLESS_QUIC_Type = "none";
|
||||
VLESS_QUIC_Security = "none";
|
||||
VLESS_QUIC_Type = "none";
|
||||
VLESS_gRPC_ServiceName = Utils.RandomString(7);
|
||||
|
||||
VMESS_WS_Path = "/" + Utils.RandomString(8);
|
||||
VMESS_TCP_Path = "/" + Utils.RandomString(9);
|
||||
VMESS_KCP_Seed = guid;
|
||||
VMESS_QUIC_Key = "";
|
||||
VMESS_KCP_Type = "none";
|
||||
VMESS_QUIC_Security = "none";
|
||||
VMESS_QUIC_Type = "none";
|
||||
|
||||
TrojanPassword = guid;
|
||||
|
||||
ShadowSocksPassword = guid;
|
||||
ShadowSocksMethod = "aes-128-gcm";
|
||||
}
|
||||
|
||||
[JsonIgnore]
|
||||
public bool IsIPAddress
|
||||
{
|
||||
get
|
||||
{
|
||||
return IPAddress.TryParse(Domain, out _);
|
||||
}
|
||||
}
|
||||
|
||||
[JsonIgnore]
|
||||
public List<int> FreePorts
|
||||
{
|
||||
get
|
||||
{
|
||||
var list = new List<int>();
|
||||
list.Add(80);
|
||||
list.Add(Port);
|
||||
|
||||
if (Types.Contains(RayType.VLESS_KCP))
|
||||
{
|
||||
list.Add(VLESS_KCP_Port);
|
||||
}
|
||||
|
||||
if (Types.Contains(RayType.VLESS_QUIC))
|
||||
{
|
||||
list.Add(VLESS_QUIC_Port);
|
||||
}
|
||||
|
||||
if (Types.Contains(RayType.VMESS_KCP))
|
||||
{
|
||||
list.Add(VMESS_KCP_Port);
|
||||
}
|
||||
|
||||
if (Types.Contains(RayType.VMESS_QUIC))
|
||||
{
|
||||
list.Add(VMESS_QUIC_Port);
|
||||
}
|
||||
|
||||
if (Types.Contains(RayType.ShadowsocksAEAD))
|
||||
{
|
||||
list.Add(ShadowSocksPort);
|
||||
}
|
||||
|
||||
if (Types.Contains(RayType.VLESS_gRPC))
|
||||
{
|
||||
list.Add(VLESS_gRPC_Port);
|
||||
}
|
||||
|
||||
return list.Distinct().ToList();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 是否安装证书,
|
||||
/// 上传自有证书时选False,则不会自动安装证书。
|
||||
/// </summary>
|
||||
public bool WithTLS { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 端口
|
||||
/// </summary>
|
||||
public int Port { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 域名
|
||||
/// </summary>
|
||||
public string Domain { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// UUID
|
||||
/// </summary>
|
||||
public string UUID { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 多用户
|
||||
/// </summary>
|
||||
public List<string> MulitUUID { get; set; } = new List<string>();
|
||||
|
||||
/// <summary>
|
||||
/// 伪装域名
|
||||
/// </summary>
|
||||
public string MaskDomain { get; set; }
|
||||
|
||||
[JsonIgnore]
|
||||
public string Email
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!string.IsNullOrEmpty(Domain))
|
||||
{
|
||||
var arr = Domain.Split('.');
|
||||
if (arr.Length == 3)
|
||||
{
|
||||
return $"{arr[0]}@{arr[1]}.{arr[2]}";
|
||||
}
|
||||
}
|
||||
|
||||
return $"{UUID.Substring(2, 6)}@gmail.com";
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 安装类型
|
||||
/// </summary>
|
||||
public List<RayType> Types { get; set; } = new List<RayType>();
|
||||
|
||||
/// <summary>
|
||||
/// 根据xray类型获取路径
|
||||
/// </summary>
|
||||
/// <param name="type"></param>
|
||||
/// <returns></returns>
|
||||
public string GetPath(RayType type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case RayType.VLESS_WS:
|
||||
return VLESS_WS_Path;
|
||||
case RayType.VMESS_TCP:
|
||||
return VMESS_TCP_Path;
|
||||
case RayType.VMESS_WS:
|
||||
return VMESS_WS_Path;
|
||||
default:
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
33
ProxySuper.Core/Models/Projects/V2raySettings_SS.cs
Normal file
33
ProxySuper.Core/Models/Projects/V2raySettings_SS.cs
Normal file
|
@ -0,0 +1,33 @@
|
|||
using ProxySuper.Core.Services;
|
||||
|
||||
namespace ProxySuper.Core.Models.Projects
|
||||
{
|
||||
public partial class V2raySettings
|
||||
{
|
||||
/// <summary>
|
||||
/// ss password
|
||||
/// </summary>
|
||||
public string ShadowSocksPassword { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// ss method
|
||||
/// </summary>
|
||||
public string ShadowSocksMethod { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// ss port
|
||||
/// </summary>
|
||||
public int ShadowSocksPort { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// share link
|
||||
/// </summary>
|
||||
public string ShadowSocksShareLink
|
||||
{
|
||||
get
|
||||
{
|
||||
return ShareLink.Build(RayType.ShadowsocksAEAD, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
17
ProxySuper.Core/Models/Projects/V2raySettings_Trojan.cs
Normal file
17
ProxySuper.Core/Models/Projects/V2raySettings_Trojan.cs
Normal file
|
@ -0,0 +1,17 @@
|
|||
using ProxySuper.Core.Services;
|
||||
|
||||
namespace ProxySuper.Core.Models.Projects
|
||||
{
|
||||
public partial class V2raySettings
|
||||
{
|
||||
public string TrojanPassword { get; set; }
|
||||
|
||||
public string Trojan_TCP_ShareLink
|
||||
{
|
||||
get
|
||||
{
|
||||
return ShareLink.Build(RayType.Trojan_TCP, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
115
ProxySuper.Core/Models/Projects/V2raySettings_VLESS.cs
Normal file
115
ProxySuper.Core/Models/Projects/V2raySettings_VLESS.cs
Normal file
|
@ -0,0 +1,115 @@
|
|||
using ProxySuper.Core.Services;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Windows.Documents;
|
||||
|
||||
namespace ProxySuper.Core.Models.Projects
|
||||
{
|
||||
public partial class V2raySettings
|
||||
{
|
||||
/// <summary>
|
||||
/// vless tcp shareLink
|
||||
/// </summary>
|
||||
public string VLESS_TCP_ShareLink
|
||||
{
|
||||
get
|
||||
{
|
||||
return ShareLink.Build(RayType.VLESS_TCP, this);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// websocket path
|
||||
/// </summary>
|
||||
public string VLESS_WS_Path { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// VLESS WS ShareLink
|
||||
/// </summary>
|
||||
public string VLESS_WS_ShareLink
|
||||
{
|
||||
get
|
||||
{
|
||||
return ShareLink.Build(RayType.VLESS_WS, this);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// kcp seed
|
||||
/// </summary>
|
||||
public string VLESS_KCP_Seed { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// kcp type
|
||||
/// </summary>
|
||||
public string VLESS_KCP_Type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// kcp port
|
||||
/// </summary>
|
||||
public int VLESS_KCP_Port { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// VLESS KCP ShareLink
|
||||
/// </summary>
|
||||
public string VLESS_KCP_ShareLink
|
||||
{
|
||||
get
|
||||
{
|
||||
return ShareLink.Build(RayType.VLESS_KCP, this);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// vless quic security
|
||||
/// </summary>
|
||||
public string VLESS_QUIC_Security { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// vless quic type
|
||||
/// </summary>
|
||||
public string VLESS_QUIC_Type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// vless quic port
|
||||
/// </summary>
|
||||
public int VLESS_QUIC_Port { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// vless quic key
|
||||
/// </summary>
|
||||
public string VLESS_QUIC_Key { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// vless quic ShareLink
|
||||
/// </summary>
|
||||
public string VLESS_QUIC_ShareLink
|
||||
{
|
||||
get
|
||||
{
|
||||
return ShareLink.Build(RayType.VLESS_QUIC, this);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// grpc port
|
||||
/// </summary>
|
||||
public int VLESS_gRPC_Port { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// grpc service name
|
||||
/// </summary>
|
||||
public string VLESS_gRPC_ServiceName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// vless grpc share link
|
||||
/// </summary>
|
||||
public string VLESS_gRPC_ShareLink
|
||||
{
|
||||
get
|
||||
{
|
||||
return ShareLink.Build(RayType.VLESS_gRPC, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
96
ProxySuper.Core/Models/Projects/V2raySettings_VMESS.cs
Normal file
96
ProxySuper.Core/Models/Projects/V2raySettings_VMESS.cs
Normal file
|
@ -0,0 +1,96 @@
|
|||
using ProxySuper.Core.Services;
|
||||
|
||||
namespace ProxySuper.Core.Models.Projects
|
||||
{
|
||||
public partial class V2raySettings
|
||||
{
|
||||
/// <summary>
|
||||
/// vmess websocket path
|
||||
/// </summary>
|
||||
public string VMESS_WS_Path { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// vmess ws sharelink
|
||||
/// </summary>
|
||||
public string VMESS_WS_ShareLink
|
||||
{
|
||||
get
|
||||
{
|
||||
return ShareLink.Build(RayType.VMESS_WS, this);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// mvess tcp path
|
||||
/// </summary>
|
||||
public string VMESS_TCP_Path { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// vmess tcp ShareLink
|
||||
/// </summary>
|
||||
public string VMESS_TCP_ShareLink
|
||||
{
|
||||
get
|
||||
{
|
||||
return ShareLink.Build(RayType.VMESS_TCP, this);
|
||||
}
|
||||
}
|
||||
|
||||
/// <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 port
|
||||
/// </summary>
|
||||
public int VMESS_KCP_Port { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// vmess kcp ShareLink
|
||||
/// </summary>
|
||||
public string VMESS_KCP_ShareLink
|
||||
{
|
||||
get
|
||||
{
|
||||
return ShareLink.Build(RayType.VMESS_KCP, this);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// vmess quic security
|
||||
/// </summary>
|
||||
public string VMESS_QUIC_Security { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// vmess quic type
|
||||
/// </summary>
|
||||
public string VMESS_QUIC_Type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// vmess quic port
|
||||
/// </summary>
|
||||
public int VMESS_QUIC_Port { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// vmess quic key
|
||||
/// </summary>
|
||||
public string VMESS_QUIC_Key { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// vmess quic ShareLink
|
||||
/// </summary>
|
||||
public string VMESS_QUIC_ShareLink
|
||||
{
|
||||
get
|
||||
{
|
||||
return ShareLink.Build(RayType.VMESS_QUIC, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
32
ProxySuper.Core/Models/Projects/XraySettings.cs
Normal file
32
ProxySuper.Core/Models/Projects/XraySettings.cs
Normal file
|
@ -0,0 +1,32 @@
|
|||
using ProxySuper.Core.Services;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySuper.Core.Models.Projects
|
||||
{
|
||||
public class XraySettings : V2raySettings
|
||||
{
|
||||
public static List<string> UTLSList = new List<string> { "", "chrome", "firefox", "safari", "ios", "android", "edge", "360", "qq", "random", "randomized" };
|
||||
|
||||
//流控参数在服务端只有两种 "none", "xtls-rprx-vision",客户端可以选择三种:"none", "xtls-rprx-vision", "xtls-rprx-vision-udp443",但是选择了XTLS模式就是默认flow不为空或者"none",所以这里不再填加"none"这一项。
|
||||
public static List<string> FlowList = new List<string> { "xtls-rprx-vision", "xtls-rprx-vision-udp443" }; //{ "xtls-rprx-origin", "xtls-rprx-origin-udp443", "xtls-rprx-direct", "xtls-rprx-direct-udp443", "xtls-rprx-splice", "xtls-rprx-splice-udp443" };
|
||||
|
||||
public string UTLS { get; set; } = UTLSList[1];
|
||||
|
||||
public string Flow { get; set; } = FlowList[0];
|
||||
|
||||
/// <summary>
|
||||
/// vless xtls shareLink
|
||||
/// </summary>
|
||||
public string VLESS_TCP_XTLS_ShareLink
|
||||
{
|
||||
get
|
||||
{
|
||||
return ShareLink.Build(RayType.VLESS_TCP_XTLS, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
134
ProxySuper.Core/Models/Record.cs
Normal file
134
ProxySuper.Core/Models/Record.cs
Normal file
|
@ -0,0 +1,134 @@
|
|||
using MvvmCross.ViewModels;
|
||||
using Newtonsoft.Json;
|
||||
using ProxySuper.Core.Models.Hosts;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using ProxySuper.Core.Services;
|
||||
using System;
|
||||
using System.Text;
|
||||
|
||||
namespace ProxySuper.Core.Models
|
||||
{
|
||||
[JsonObject]
|
||||
public class Record : MvxViewModel
|
||||
{
|
||||
public Record()
|
||||
{
|
||||
_isChecked = false;
|
||||
}
|
||||
|
||||
private Host _host;
|
||||
private bool _isChecked;
|
||||
|
||||
[JsonProperty("id")]
|
||||
public string Id { get; set; }
|
||||
|
||||
[JsonProperty("host")]
|
||||
public Host Host
|
||||
{
|
||||
get { return _host; }
|
||||
set
|
||||
{
|
||||
_host = value;
|
||||
RaisePropertyChanged("Host");
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty("v2raySettings")]
|
||||
public V2raySettings V2raySettings { get; set; }
|
||||
|
||||
[JsonProperty("settings")]
|
||||
public XraySettings XraySettings { get; set; }
|
||||
|
||||
[JsonProperty("trojanGoSettings")]
|
||||
public TrojanGoSettings TrojanGoSettings { get; set; }
|
||||
|
||||
[JsonProperty("naiveProxySettings")]
|
||||
public NaiveProxySettings NaiveProxySettings { get; set; }
|
||||
|
||||
[JsonProperty("brook")]
|
||||
public BrookSettings BrookSettings { get; set; }
|
||||
|
||||
[JsonProperty("mtProtoGoSettings")]
|
||||
public MTProtoGoSettings MTProtoGoSettings { get; set; }
|
||||
|
||||
[JsonProperty]
|
||||
public HysteriaSettings HysteriaSettings { get; set; }
|
||||
|
||||
|
||||
[JsonIgnore]
|
||||
public ProjectType Type
|
||||
{
|
||||
get
|
||||
{
|
||||
if (XraySettings != null) return ProjectType.Xray;
|
||||
|
||||
if (V2raySettings != null) return ProjectType.V2ray;
|
||||
|
||||
if (TrojanGoSettings != null) return ProjectType.TrojanGo;
|
||||
|
||||
if (NaiveProxySettings != null) return ProjectType.NaiveProxy;
|
||||
|
||||
if (MTProtoGoSettings != null) return ProjectType.MTProtoGo;
|
||||
|
||||
if (HysteriaSettings != null) return ProjectType.Hysteria;
|
||||
|
||||
return ProjectType.Brook;
|
||||
}
|
||||
}
|
||||
|
||||
[JsonIgnore]
|
||||
public bool IsChecked
|
||||
{
|
||||
get
|
||||
{
|
||||
return _isChecked;
|
||||
}
|
||||
set
|
||||
{
|
||||
_isChecked = value;
|
||||
RaisePropertyChanged("IsChecked");
|
||||
}
|
||||
}
|
||||
|
||||
[JsonIgnore]
|
||||
public Action OnSave { get; set; } = () => { };
|
||||
|
||||
public string GetShareLink()
|
||||
{
|
||||
if (Type == ProjectType.V2ray)
|
||||
{
|
||||
StringBuilder strBuilder = new StringBuilder();
|
||||
V2raySettings.Types.ForEach(type =>
|
||||
{
|
||||
var link = ShareLink.Build(type, V2raySettings);
|
||||
strBuilder.AppendLine(link);
|
||||
});
|
||||
return strBuilder.ToString();
|
||||
}
|
||||
|
||||
if (Type == ProjectType.Xray)
|
||||
{
|
||||
StringBuilder strBuilder = new StringBuilder();
|
||||
XraySettings.Types.ForEach(type =>
|
||||
{
|
||||
var link = ShareLink.Build(type, XraySettings);
|
||||
strBuilder.AppendLine(link);
|
||||
});
|
||||
return strBuilder.ToString();
|
||||
}
|
||||
|
||||
if (Type == ProjectType.TrojanGo)
|
||||
{
|
||||
return ShareLink.BuildTrojanGo(TrojanGoSettings);
|
||||
}
|
||||
|
||||
if (Type == ProjectType.NaiveProxy)
|
||||
{
|
||||
return ShareLink.BuildNaiveProxy(NaiveProxySettings);
|
||||
}
|
||||
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
35
ProxySuper.Core/Properties/AssemblyInfo.cs
Normal file
35
ProxySuper.Core/Properties/AssemblyInfo.cs
Normal file
|
@ -0,0 +1,35 @@
|
|||
using System.Reflection;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// 有关程序集的一般信息由以下
|
||||
// 控制。更改这些特性值可修改
|
||||
// 与程序集关联的信息。
|
||||
[assembly: AssemblyTitle("ProxySuper.Core")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("ProxySuper.Core")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2021")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// 将 ComVisible 设置为 false 会使此程序集中的类型
|
||||
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
|
||||
//请将此类型的 ComVisible 特性设置为 true。
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
|
||||
[assembly: Guid("15779ee6-d8ca-44bf-bfe2-941e155eef3f")]
|
||||
|
||||
// 程序集的版本信息由下列四个值组成:
|
||||
//
|
||||
// 主版本
|
||||
// 次版本
|
||||
// 生成号
|
||||
// 修订号
|
||||
//
|
||||
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
|
||||
//通过使用 "*",如下所示:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
153
ProxySuper.Core/ProxySuper.Core.csproj
Normal file
153
ProxySuper.Core/ProxySuper.Core.csproj
Normal file
|
@ -0,0 +1,153 @@
|
|||
<?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>{15779EE6-D8CA-44BF-BFE2-941E155EEF3F}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>ProxySuper.Core</RootNamespace>
|
||||
<AssemblyName>ProxySuper.Core</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<Deterministic>true</Deterministic>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<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' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Microsoft.Extensions.Logging.Abstractions, Version=7.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Microsoft.Extensions.Logging.Abstractions.7.0.0\lib\net462\Microsoft.Extensions.Logging.Abstractions.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="MvvmCross, Version=8.0.2.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\MvvmCross.8.0.2\lib\net461\MvvmCross.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\json.net\net40\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="PresentationCore" />
|
||||
<Reference Include="PresentationFramework" />
|
||||
<Reference Include="QRCoder, Version=1.4.3.0, Culture=neutral, PublicKeyToken=c4ed5b9ae8358a28, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\QRCoder.1.4.3\lib\net40\QRCoder.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Renci.SshNet, Version=2023.0.0.0, Culture=neutral, PublicKeyToken=1cee9f8bde3db106, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\SSH.NET.2023.0.0\lib\net462\Renci.SshNet.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Console, Version=4.0.1.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Console.4.3.1\lib\net46\System.Console.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Numerics" />
|
||||
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Runtime" />
|
||||
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Web" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="WindowsBase" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="App.cs" />
|
||||
<Compile Include="Converters\LoginSecretTypeConverter.cs" />
|
||||
<Compile Include="Converters\ProxyTypeConverter.cs" />
|
||||
<Compile Include="Converters\VisibleConverter.cs" />
|
||||
<Compile Include="Helpers\DateTimeUtils.cs" />
|
||||
<Compile Include="Models\Caddy.cs" />
|
||||
<Compile Include="Models\Hosts\Host.cs" />
|
||||
<Compile Include="Models\Hosts\LoginSecretType.cs" />
|
||||
<Compile Include="Models\ProjectProgress.cs" />
|
||||
<Compile Include="Models\Projects\BrookSettings.cs" />
|
||||
<Compile Include="Models\Projects\BrookType.cs" />
|
||||
<Compile Include="Models\Projects\HysteriaSettings.cs" />
|
||||
<Compile Include="Models\Projects\IProjectSettings.cs" />
|
||||
<Compile Include="Models\Hosts\LocalProxy.cs" />
|
||||
<Compile Include="Models\Projects\MTProtoGoSettings.cs" />
|
||||
<Compile Include="Models\Projects\NaiveProxySettings.cs" />
|
||||
<Compile Include="Models\Projects\ProjectType.cs" />
|
||||
<Compile Include="Models\Projects\TrojanGoSettings.cs" />
|
||||
<Compile Include="Models\Projects\V2raySettings_SS.cs" />
|
||||
<Compile Include="Models\Projects\V2raySettings_Trojan.cs" />
|
||||
<Compile Include="Models\Projects\V2raySettings_VLESS.cs" />
|
||||
<Compile Include="Models\Projects\V2raySettings.cs" />
|
||||
<Compile Include="Models\Projects\V2raySettings_VMESS.cs" />
|
||||
<Compile Include="Models\Projects\XraySettings.cs" />
|
||||
<Compile Include="Models\Projects\RayType.cs" />
|
||||
<Compile Include="Models\Record.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Helpers\Utils.cs" />
|
||||
<Compile Include="Services\BrookService.cs" />
|
||||
<Compile Include="Services\HysteriaService.cs" />
|
||||
<Compile Include="Services\MTProtoGoService.cs" />
|
||||
<Compile Include="Services\NaiveProxyService.cs" />
|
||||
<Compile Include="Services\ServiceBase.cs" />
|
||||
<Compile Include="Services\ShareLink.cs" />
|
||||
<Compile Include="Services\TrojanGoConfigBuilder.cs" />
|
||||
<Compile Include="Services\TrojanGoService.cs" />
|
||||
<Compile Include="Services\V2rayConfigBuilder.cs" />
|
||||
<Compile Include="Services\V2rayService.cs" />
|
||||
<Compile Include="Services\XrayConfigBuilder.cs" />
|
||||
<Compile Include="Services\XrayService.cs" />
|
||||
<Compile Include="ViewModels\BrookConfigViewModel.cs" />
|
||||
<Compile Include="ViewModels\BrookEditorViewModel.cs" />
|
||||
<Compile Include="ViewModels\BrookInstallViewModel.cs" />
|
||||
<Compile Include="ViewModels\EnableRootViewModel.cs" />
|
||||
<Compile Include="ViewModels\HomeViewModel.cs" />
|
||||
<Compile Include="ViewModels\HysteriaConfigViewModel.cs" />
|
||||
<Compile Include="ViewModels\HysteriaEditorViewModel.cs" />
|
||||
<Compile Include="ViewModels\HysteriaInstallViewModel.cs" />
|
||||
<Compile Include="ViewModels\MTProtoGoConfigViewModel.cs" />
|
||||
<Compile Include="ViewModels\MTProtoGoEditorViewModel.cs" />
|
||||
<Compile Include="ViewModels\MTProtoGoInstallViewModel.cs" />
|
||||
<Compile Include="ViewModels\NaiveProxyConfigViewModel.cs" />
|
||||
<Compile Include="ViewModels\NaiveProxyEditorViewModel.cs" />
|
||||
<Compile Include="ViewModels\NaiveProxyInstallViewModel.cs" />
|
||||
<Compile Include="ViewModels\ShareLinkViewModel.cs" />
|
||||
<Compile Include="ViewModels\TrojanGoConfigViewModel.cs" />
|
||||
<Compile Include="ViewModels\TrojanGoEditorViewModel.cs" />
|
||||
<Compile Include="ViewModels\TrojanGoInstallViewModel.cs" />
|
||||
<Compile Include="ViewModels\V2rayConfigViewModel.cs" />
|
||||
<Compile Include="ViewModels\V2rayEditorViewModel.cs" />
|
||||
<Compile Include="ViewModels\V2rayInstallViewModel.cs" />
|
||||
<Compile Include="ViewModels\XrayConfigViewModel.cs" />
|
||||
<Compile Include="ViewModels\XrayEditorViewModel.cs" />
|
||||
<Compile Include="ViewModels\XrayInstallViewModel.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="app.config" />
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
171
ProxySuper.Core/Services/BrookService.cs
Normal file
171
ProxySuper.Core/Services/BrookService.cs
Normal file
|
@ -0,0 +1,171 @@
|
|||
using ProxySuper.Core.Models.Hosts;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using ProxySuper.Core.ViewModels;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
|
||||
namespace ProxySuper.Core.Services
|
||||
{
|
||||
public class BrookService : ServiceBase<BrookSettings>
|
||||
{
|
||||
private string brookServiceTemp = @"
|
||||
[Unit]
|
||||
Description=brook service
|
||||
After=network.target syslog.target
|
||||
Wants=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=##run_cmd##
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target";
|
||||
|
||||
|
||||
public BrookService(Host host, BrookSettings settings) : base(host, settings)
|
||||
{
|
||||
}
|
||||
|
||||
public void Install()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
Progress.Step = "安装Brook";
|
||||
Progress.Percentage = 0;
|
||||
|
||||
|
||||
Progress.Desc = "检测系统环境";
|
||||
EnsureRootUser();
|
||||
EnsureSystemEnv();
|
||||
Progress.Percentage = 20;
|
||||
|
||||
Progress.Desc = "安装必要的系统工具";
|
||||
InstallSystemTools();
|
||||
Progress.Percentage = 40;
|
||||
|
||||
Progress.Desc = "配置防火墙";
|
||||
ConfigFirewalld();
|
||||
Progress.Percentage = 50;
|
||||
|
||||
|
||||
Progress.Step = "检测网络环境";
|
||||
EnsureNetwork();
|
||||
Progress.Percentage = 60;
|
||||
if (Settings.BrookType == BrookType.wssserver)
|
||||
{
|
||||
Progress.Desc = "检测域名是否绑定本机IP";
|
||||
ValidateDomain();
|
||||
Progress.Percentage = 80;
|
||||
}
|
||||
|
||||
Progress.Step = "安装Brook服务";
|
||||
InstallBrook();
|
||||
|
||||
Progress.Percentage = 100;
|
||||
Progress.Step = "安装Brook成功";
|
||||
Progress.Desc = "安装Brook成功";
|
||||
|
||||
AppendCommand("分享连接:");
|
||||
AppendCommand(ShareLink.BuildBrook(Settings));
|
||||
|
||||
NavigationService.Navigate<BrookConfigViewModel, BrookSettings>(Settings);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void InstallBrook()
|
||||
{
|
||||
Progress.Desc = "执行Brook安装文件";
|
||||
string url = "https://github.com/txthinking/brook/releases/latest/download/brook_linux_amd64";
|
||||
if (ArchType == ArchType.arm)
|
||||
{
|
||||
url = url.Replace("brook_linux_amd64", "brook_linux_arm7");
|
||||
}
|
||||
|
||||
RunCmd($"curl -L {url} -o /usr/bin/brook");
|
||||
RunCmd("chmod +x /usr/bin/brook");
|
||||
|
||||
Progress.Desc = "设置Brook服务";
|
||||
var brookService = brookServiceTemp.Replace("##run_cmd##", GetRunBrookCommand());
|
||||
|
||||
RunCmd("rm -rf /etc/systemd/system/brook.service");
|
||||
RunCmd("touch /etc/systemd/system/brook.service");
|
||||
RunCmd($"echo \"{brookService}\" > /etc/systemd/system/brook.service");
|
||||
RunCmd("sudo chmod 777 /etc/systemd/system/brook.service");
|
||||
|
||||
Progress.Desc = "启动Brook服务";
|
||||
RunCmd("systemctl enable brook");
|
||||
RunCmd("systemctl restart brook");
|
||||
}
|
||||
|
||||
private string GetRunBrookCommand()
|
||||
{
|
||||
var runBrookCmd = string.Empty;
|
||||
|
||||
if (Settings.BrookType == BrookType.server)
|
||||
{
|
||||
return $"/usr/bin/brook server --listen :{Settings.Port} --password {Settings.Password}";
|
||||
}
|
||||
|
||||
if (Settings.BrookType == BrookType.wsserver)
|
||||
{
|
||||
return $"/usr/bin/brook wsserver --listen :{Settings.Port} --password {Settings.Password}";
|
||||
}
|
||||
|
||||
if (Settings.BrookType == BrookType.wssserver)
|
||||
{
|
||||
return $"/usr/bin/brook wssserver --domain {Settings.Domain} --password {Settings.Password}";
|
||||
}
|
||||
|
||||
if (Settings.BrookType == BrookType.socks5)
|
||||
{
|
||||
var ip = IsOnlyIPv6 ? IPv6 : IPv4;
|
||||
return $"/usr/bin/brook socks5 --socks5 {ip}:{Settings.Port}";
|
||||
}
|
||||
|
||||
return runBrookCmd;
|
||||
}
|
||||
|
||||
public void Uninstall()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
Progress.Step = "卸载Brook";
|
||||
Progress.Percentage = 0;
|
||||
|
||||
Progress.Desc = "停止Brook服务";
|
||||
RunCmd("systemctl stop brook");
|
||||
RunCmd("systemctl disable brook");
|
||||
Progress.Percentage = 30;
|
||||
|
||||
Progress.Desc = "删除Brook相关文件";
|
||||
RunCmd("rm -rf /etc/systemd/system/brook.service");
|
||||
RunCmd("rm -rf /usr/bin/brook");
|
||||
Progress.Percentage = 80;
|
||||
|
||||
Progress.Desc = "重置防火墙设置";
|
||||
ResetFirewalld();
|
||||
|
||||
Progress.Percentage = 100;
|
||||
Progress.Desc = "卸载完成";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
172
ProxySuper.Core/Services/HysteriaService.cs
Normal file
172
ProxySuper.Core/Services/HysteriaService.cs
Normal file
|
@ -0,0 +1,172 @@
|
|||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using ProxySuper.Core.Models.Hosts;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using Renci.SshNet.Messages;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
|
||||
namespace ProxySuper.Core.Services
|
||||
{
|
||||
public class HysteriaService : ServiceBase<HysteriaSettings>
|
||||
{
|
||||
public HysteriaService(Host host, HysteriaSettings settings) : base(host, settings)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
public void Install()
|
||||
{
|
||||
try
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
Progress.Step = "安装Hysteria";
|
||||
Progress.Percentage = 0;
|
||||
|
||||
|
||||
Progress.Desc = "检测系统环境";
|
||||
EnsureRootUser();
|
||||
EnsureSystemEnv();
|
||||
Progress.Percentage = 20;
|
||||
|
||||
Progress.Desc = "安装必要的系统工具";
|
||||
InstallSystemTools();
|
||||
Progress.Percentage = 40;
|
||||
|
||||
Progress.Desc = "配置防火墙";
|
||||
ConfigFirewalld();
|
||||
Progress.Percentage = 50;
|
||||
|
||||
Progress.Step = "检测网络环境";
|
||||
EnsureNetwork();
|
||||
Progress.Percentage = 60;
|
||||
|
||||
|
||||
Progress.Desc = "检测域名是否绑定本机IP";
|
||||
ValidateDomain();
|
||||
Progress.Percentage = 80;
|
||||
|
||||
Progress.Step = "上传Hysteria配置文件";
|
||||
UploadConfigFile();
|
||||
Progress.Step = "安装Hysteria服务";
|
||||
InstallHysteria();
|
||||
|
||||
Progress.Percentage = 100;
|
||||
Progress.Step = "安装Hysteria成功";
|
||||
Progress.Desc = "安装Hysteria成功";
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
public void Uninstall()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
Progress.Step = "卸载Hysteria";
|
||||
Progress.Percentage = 0;
|
||||
|
||||
Progress.Desc = "停止Hysteria服务";
|
||||
RunCmd("systemctl stop Hysteria");
|
||||
RunCmd("systemctl disable Hysteria");
|
||||
Progress.Percentage = 30;
|
||||
|
||||
Progress.Desc = "删除Hysteria相关文件";
|
||||
RunCmd("rm -rf /etc/systemd/system/Hysteria.service");
|
||||
RunCmd("rm -rf /usr/bin/Hysteria");
|
||||
Progress.Percentage = 80;
|
||||
|
||||
Progress.Desc = "重置防火墙设置";
|
||||
ResetFirewalld();
|
||||
|
||||
Progress.Percentage = 100;
|
||||
Progress.Desc = "卸载完成";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private string HysteriaServiceTemp = @"
|
||||
[Unit]
|
||||
Description=hysteria service
|
||||
After=network.target syslog.target
|
||||
Wants=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=##run_cmd##
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target";
|
||||
|
||||
private void InstallHysteria()
|
||||
{
|
||||
Progress.Desc = "执行Hysteria安装文件";
|
||||
string url = "https://github.com/apernet/hysteria/releases/download/v1.3.4/hysteria-linux-386";
|
||||
string targetPath = "/usr/bin/hysteria/hysteria-linux-386";
|
||||
|
||||
if (ArchType == ArchType.arm)
|
||||
{
|
||||
url = url.Replace("hysteria-linux-386", "hysteria-linux-arm");
|
||||
targetPath = targetPath.Replace("hysteria-linux-386", "hysteria-linux-arm");
|
||||
}
|
||||
|
||||
RunCmd($"curl -L {url} -o {targetPath}");
|
||||
RunCmd($"chmod +x {targetPath}");
|
||||
|
||||
Progress.Desc = "设置Hysteria服务";
|
||||
var cmd = targetPath + " -c /usr/bin/hysteria/config.json server";
|
||||
var hysteriaService = HysteriaServiceTemp.Replace("##run_cmd##", cmd);
|
||||
|
||||
RunCmd("rm -rf /etc/systemd/system/hysteria.service");
|
||||
RunCmd("touch /etc/systemd/system/hysteria.service");
|
||||
|
||||
RunCmd($"echo \"{hysteriaService}\" > /etc/systemd/system/hysteria.service");
|
||||
RunCmd("sudo chmod 777 /etc/systemd/system/hysteria.service");
|
||||
|
||||
|
||||
Progress.Desc = "启动Hysteria服务";
|
||||
RunCmd("systemctl enable hysteria");
|
||||
RunCmd("systemctl restart hysteria");
|
||||
}
|
||||
|
||||
private const string ConfigFilePath = @"Templates\Hysteria\config.json";
|
||||
private void UploadConfigFile()
|
||||
{
|
||||
var text = File.ReadAllText(ConfigFilePath, Encoding.UTF8);
|
||||
var json = JsonConvert.DeserializeObject(text);
|
||||
var obj = JToken.FromObject(json) as dynamic;
|
||||
|
||||
|
||||
obj["listen"] = $":{Settings.Port}";
|
||||
obj["acme"]["domains"][0] = Settings.Domain;
|
||||
obj["email"] = Settings.Email;
|
||||
obj["obfs"] = Settings.Obfs;
|
||||
|
||||
var configJson = JsonConvert.SerializeObject(
|
||||
obj,
|
||||
Formatting.Indented,
|
||||
new JsonSerializerSettings()
|
||||
{
|
||||
NullValueHandling = NullValueHandling.Ignore
|
||||
});
|
||||
|
||||
RunCmd("mkdir /usr/bin/hysteria");
|
||||
WriteToFile(configJson, "/usr/bin/hysteria/config.json");
|
||||
}
|
||||
}
|
||||
}
|
160
ProxySuper.Core/Services/MTProtoGoService.cs
Normal file
160
ProxySuper.Core/Services/MTProtoGoService.cs
Normal file
|
@ -0,0 +1,160 @@
|
|||
using ProxySuper.Core.Models.Hosts;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using ProxySuper.Core.ViewModels;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
|
||||
namespace ProxySuper.Core.Services
|
||||
{
|
||||
public class MTProtoGoService : ServiceBase<MTProtoGoSettings>
|
||||
{
|
||||
public MTProtoGoService(Host host, MTProtoGoSettings settings) : base(host, settings)
|
||||
{
|
||||
}
|
||||
|
||||
public void Install()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
Progress.Step = "1. 检测系统环境";
|
||||
Progress.Percentage = 0;
|
||||
|
||||
EnsureRootUser();
|
||||
EnsureSystemEnv();
|
||||
Progress.Percentage = 15;
|
||||
|
||||
Progress.Step = "2. 安装必要的系统工具";
|
||||
InstallSystemTools();
|
||||
Progress.Percentage = 25;
|
||||
|
||||
Progress.Step = "3. 配置防火墙";
|
||||
ConfigFirewalld();
|
||||
Progress.Percentage = 35;
|
||||
|
||||
Progress.Step = "4. 安装docker";
|
||||
InstallDocker();
|
||||
Progress.Percentage = 50;
|
||||
|
||||
Progress.Step = "5. 生成密钥";
|
||||
//RunCmd("docker pull nineseconds/mtg:2"); //拉取v2版本命令,但是似乎不用也可以。
|
||||
//下面的命令是v1版本的命令格式。可以保留。将来如启用v1,可用。
|
||||
//Settings.SecretText = RunCmd($"docker run nineseconds/mtg:1 generate-secret -c {Settings.Cleartext} tls").TrimEnd('\n');
|
||||
Settings.SecretText = RunCmd($"docker run nineseconds/mtg:2 generate-secret {Settings.Cleartext}").TrimEnd('\n');
|
||||
Progress.Percentage = 65;
|
||||
|
||||
Progress.Step = "6. 生成配置文件";
|
||||
Progress.Desc = "创建配置";
|
||||
RunCmd("touch /etc/mtg.toml");
|
||||
|
||||
Progress.Desc = "写入配置内容";
|
||||
RunCmd($"echo \"secret=\\\"{Settings.SecretText}\\\"\" > /etc/mtg.toml");
|
||||
RunCmd($"echo \"bind-to=\\\"0.0.0.0:{Settings.Port}\\\"\" >> /etc/mtg.toml");
|
||||
Progress.Percentage = 80;
|
||||
|
||||
Progress.Step = "7. 启动MTProto服务";
|
||||
RunCmd($"docker run -d -v /etc/mtg.toml:/config.toml --name=mtg --restart=always -p {Settings.Port + ":" + Settings.Port} nineseconds/mtg:2");
|
||||
Progress.Desc = "设置自启动MTProto服务";
|
||||
|
||||
Progress.Step = "安装完成";
|
||||
Progress.Percentage = 100;
|
||||
|
||||
AppendCommand("Host: " + Settings.Domain);
|
||||
AppendCommand("Port: " + Settings.Port);
|
||||
AppendCommand("Secret: " + Settings.SecretText);
|
||||
|
||||
NavigationService.Navigate<MTProtoGoConfigViewModel, MTProtoGoSettings>(Settings);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void Uninstall()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
Progress.Percentage = 0;
|
||||
Progress.Step = "卸载MTProto";
|
||||
|
||||
Progress.Desc = "检测系统环境";
|
||||
EnsureRootUser();
|
||||
Progress.Percentage = 30;
|
||||
|
||||
Progress.Desc = "删除docker容器";
|
||||
var cid = RunCmd("docker ps -q --filter name=mtg");
|
||||
RunCmd($"docker stop {cid}");
|
||||
RunCmd($"docker rm {cid}");
|
||||
Progress.Percentage = 100;
|
||||
Progress.Desc = "卸载完成";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void UpdateSettings()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
Progress.Percentage = 0;
|
||||
Progress.Step = "更新MTProto配置";
|
||||
|
||||
Progress.Desc = "暂停MTProto服务";
|
||||
var cid = RunCmd("docker ps -q --filter name=mtg");
|
||||
RunCmd($"docker stop {cid}");
|
||||
Progress.Percentage = 50;
|
||||
|
||||
Progress.Desc = "生成密钥";
|
||||
//Settings.SecretText = RunCmd($"docker run nineseconds/mtg:1 generate-secret -c {Settings.Cleartext} tls").TrimEnd('\n'); //v1版本
|
||||
Settings.SecretText = RunCmd($"docker run nineseconds/mtg:2 generate-secret {Settings.Cleartext}").TrimEnd('\n');
|
||||
Progress.Percentage = 65;
|
||||
|
||||
Progress.Desc = "修改配置文件";
|
||||
RunCmd($"echo \"secret=\\\"{Settings.SecretText}\\\"\" > /etc/mtg.toml");
|
||||
RunCmd($"echo \"bind-to=\\\"0.0.0.0:{Settings.Port}\\\"\" >> /etc/mtg.toml");
|
||||
Progress.Percentage = 80;
|
||||
|
||||
Progress.Desc = "重启MTProto服务";
|
||||
RunCmd($"docker restart {cid}");
|
||||
|
||||
Progress.Percentage = 100;
|
||||
Progress.Desc = "更新配置成功";
|
||||
|
||||
AppendCommand("Host: " + Settings.Domain);
|
||||
AppendCommand("Port: " + Settings.Port);
|
||||
AppendCommand("Secret: " + Settings.SecretText);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void InstallDocker()
|
||||
{
|
||||
Progress.Desc = "执行docker安装脚本";
|
||||
RunCmd("yes | curl https://get.docker.com | sh");
|
||||
|
||||
if (!FileExists("/usr/bin/docker"))
|
||||
{
|
||||
Progress.Desc = "docker安装失败";
|
||||
throw new Exception("docker安装失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
282
ProxySuper.Core/Services/NaiveProxyService.cs
Normal file
282
ProxySuper.Core/Services/NaiveProxyService.cs
Normal file
|
@ -0,0 +1,282 @@
|
|||
using Microsoft.Win32;
|
||||
using MvvmCross.ViewModels;
|
||||
using ProxySuper.Core.Models;
|
||||
using ProxySuper.Core.Models.Hosts;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using ProxySuper.Core.ViewModels;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
|
||||
namespace ProxySuper.Core.Services
|
||||
{
|
||||
public class NaiveProxyService : ServiceBase<NaiveProxySettings>
|
||||
{
|
||||
public NaiveProxyService(Host host, NaiveProxySettings settings) : base(host, settings)
|
||||
{
|
||||
}
|
||||
|
||||
public void Install()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
var index = 1;
|
||||
|
||||
Progress.Step = $"{index++}. 检测系统环境";
|
||||
EnsureRootUser();
|
||||
EnsureSystemEnv();
|
||||
Progress.Percentage = 20;
|
||||
|
||||
Progress.Step = $"{index++}. 安装系统必要工具";
|
||||
InstallSystemTools();
|
||||
Progress.Percentage = 30;
|
||||
|
||||
Progress.Step = $"{index++}. 配置防火墙";
|
||||
ConfigFirewalld();
|
||||
Progress.Percentage = 40;
|
||||
|
||||
Progress.Step = $"{index++}. 检测网络环境";
|
||||
EnsureNetwork();
|
||||
Progress.Percentage = 50;
|
||||
|
||||
Progress.Step = $"{index++}. 检测域名是否绑定到本机";
|
||||
ValidateDomain();
|
||||
Progress.Percentage = 60;
|
||||
|
||||
Progress.Step = $"{index++}. 安装NaiveProxy";
|
||||
InstallNaiveProxy();
|
||||
Progress.Percentage = 80;
|
||||
|
||||
Progress.Step = $"{index++}. 优化网络参数";
|
||||
ConfigNetwork();
|
||||
Progress.Percentage = 90;
|
||||
|
||||
Progress.Step = $"{index++}. 启动BBR";
|
||||
EnableBBR();
|
||||
|
||||
Progress.Desc = "重启Caddy服务";
|
||||
RunCmd("systemctl restart caddy");
|
||||
|
||||
Progress.Percentage = 100;
|
||||
Progress.Step = "NaiveProxy安装成功";
|
||||
Progress.Desc = string.Empty;
|
||||
|
||||
AppendCommand("分享连接:");
|
||||
AppendCommand(ShareLink.BuildNaiveProxy(Settings));
|
||||
|
||||
NavigationService.Navigate<NaiveProxyConfigViewModel, NaiveProxySettings>(Settings);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void Uninstall()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
Progress.Step = "卸载NaiveProxy";
|
||||
Progress.Percentage = 0;
|
||||
|
||||
Progress.Desc = "正在卸载...";
|
||||
RunCmd("rm -rf caddy_install.sh");
|
||||
Progress.Percentage = 10;
|
||||
|
||||
RunCmd("curl -o caddy_install.sh https://raw.githubusercontent.com/proxysu/shellscript/master/Caddy-Naive/caddy-naive-install.sh");
|
||||
Progress.Percentage = 20;
|
||||
|
||||
RunCmd("yes | bash caddy_install.sh uninstall");
|
||||
Progress.Percentage = 80;
|
||||
|
||||
RunCmd("rm -rf caddy_install.sh");
|
||||
Progress.Percentage = 100;
|
||||
Progress.Step = "卸载NaiveProxy成功";
|
||||
Progress.Desc = "卸载NaiveProxy成功";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void UpdateSettings()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
Progress.Step = "更新配置";
|
||||
Progress.Percentage = 0;
|
||||
|
||||
Progress.Desc = "检测系统环境";
|
||||
EnsureRootUser();
|
||||
EnsureSystemEnv();
|
||||
Progress.Percentage = 30;
|
||||
|
||||
UploadCaddySettings();
|
||||
Progress.Desc = "重启Caddy服务";
|
||||
RunCmd("systemctl restart caddy");
|
||||
Progress.Percentage = 100;
|
||||
|
||||
Progress.Step = "更新配置成功";
|
||||
Progress.Desc = string.Empty;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void UploadWeb()
|
||||
{
|
||||
var fileDialog = new OpenFileDialog();
|
||||
fileDialog.Filter = "压缩文件|*.zip";
|
||||
fileDialog.FileOk += DoUploadWeb;
|
||||
fileDialog.ShowDialog();
|
||||
}
|
||||
|
||||
|
||||
#region 私有方法
|
||||
|
||||
private void DoUploadWeb(object sender, CancelEventArgs e)
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
EnsureRootUser();
|
||||
|
||||
Progress.Step = "上传静态网站";
|
||||
Progress.Percentage = 0;
|
||||
|
||||
Progress.Desc = "检测系统环境";
|
||||
EnsureSystemEnv();
|
||||
Progress.Percentage = 20;
|
||||
|
||||
Progress.Desc = "创建网站目录";
|
||||
if (!FileExists("/usr/share/caddy"))
|
||||
{
|
||||
RunCmd("mkdir /usr/share/caddy");
|
||||
}
|
||||
RunCmd("rm -rf /usr/share/caddy/*");
|
||||
Progress.Percentage = 40;
|
||||
|
||||
Progress.Desc = "正在上传文件";
|
||||
var file = sender as OpenFileDialog;
|
||||
using (var stream = file.OpenFile())
|
||||
{
|
||||
UploadFile(stream, "/usr/share/caddy/caddy.zip");
|
||||
RunCmd("unzip /usr/share/caddy/caddy.zip -d /usr/share/caddy");
|
||||
RunCmd("chmod -R 777 /usr/share/caddy");
|
||||
Progress.Percentage = 700;
|
||||
}
|
||||
|
||||
Progress.Desc = "上传Caddy配置文件";
|
||||
UploadCaddySettings(useCustomWeb: true);
|
||||
Progress.Percentage = 90;
|
||||
|
||||
Progress.Desc = "重启caddy服务";
|
||||
RunCmd("systemctl restart caddy");
|
||||
Progress.Percentage = 100;
|
||||
Progress.Desc = "上传静态网站成功";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void InstallNaiveProxy()
|
||||
{
|
||||
Progress.Desc = "下载NaiveProxy安装文件";
|
||||
RunCmd(@"curl https://raw.githubusercontent.com/proxysu/shellscript/master/Caddy-Naive/caddy-naive-install.sh yes | bash");
|
||||
|
||||
Progress.Desc = "设置NaiveProxy开机启动";
|
||||
RunCmd("systemctl enable caddy");
|
||||
|
||||
Progress.Desc = "上传配置文件";
|
||||
UploadCaddySettings(false);
|
||||
}
|
||||
|
||||
private void ConfigNetwork()
|
||||
{
|
||||
RunCmd(@"bash -c 'echo ""fs.file-max = 51200"" >> /etc/sysctl.conf'");
|
||||
RunCmd(@"bash -c 'echo ""net.core.rmem_max = 67108864"" >> /etc/sysctl.conf'");
|
||||
RunCmd(@"bash -c 'echo ""net.core.wmem_max = 67108864"" >> /etc/sysctl.conf'");
|
||||
RunCmd(@"bash -c 'echo ""net.core.rmem_default = 65536"" >> /etc/sysctl.conf'");
|
||||
RunCmd(@"bash -c 'echo ""net.core.wmem_default = 65536"" >> /etc/sysctl.conf'");
|
||||
RunCmd(@"bash -c 'echo ""net.core.netdev_max_backlog = 4096"" >> /etc/sysctl.conf'");
|
||||
RunCmd(@"bash -c 'echo ""net.core.somaxconn = 4096"" >> /etc/sysctl.conf'");
|
||||
RunCmd(@"bash -c 'echo ""net.ipv4.tcp_syncookies = 1"" >> /etc/sysctl.conf'");
|
||||
RunCmd(@"bash -c 'echo ""net.ipv4.tcp_tw_reuse = 1"" >> /etc/sysctl.conf'");
|
||||
RunCmd(@"bash -c 'echo ""net.ipv4.tcp_tw_recycle = 0"" >> /etc/sysctl.conf'");
|
||||
RunCmd(@"bash -c 'echo ""net.ipv4.tcp_fin_timeout = 30"" >> /etc/sysctl.conf'");
|
||||
RunCmd(@"bash -c 'echo ""net.ipv4.tcp_keepalive_time = 1200"" >> /etc/sysctl.conf'");
|
||||
RunCmd(@"bash -c 'echo ""net.ipv4.ip_local_port_range = 10000 65000"" >> /etc/sysctl.conf'");
|
||||
RunCmd(@"bash -c 'echo ""net.ipv4.tcp_max_syn_backlog = 4096"" >> /etc/sysctl.conf'");
|
||||
RunCmd(@"bash -c 'echo ""net.ipv4.tcp_max_tw_buckets = 5000"" >> /etc/sysctl.conf'");
|
||||
RunCmd(@"bash -c 'echo ""net.ipv4.tcp_rmem = 4096 87380 67108864"" >> /etc/sysctl.conf'");
|
||||
RunCmd(@"bash -c 'echo ""net.ipv4.tcp_wmem = 4096 65536 67108864"" >> /etc/sysctl.conf'");
|
||||
RunCmd(@"bash -c 'echo ""net.ipv4.tcp_mtu_probing = 1"" >> /etc/sysctl.conf'");
|
||||
RunCmd(@"sysctl -p");
|
||||
}
|
||||
|
||||
private void UploadCaddySettings(bool useCustomWeb = false)
|
||||
{
|
||||
Progress.Desc = "生成配置文件";
|
||||
var caddyStr = BuildConfig(useCustomWeb);
|
||||
|
||||
if (FileExists("/etc/caddy/Caddyfile"))
|
||||
{
|
||||
RunCmd("mv /etc/caddy/Caddyfile /etc/caddy/Caddyfile.back");
|
||||
}
|
||||
|
||||
Progress.Desc = "上传配置文件";
|
||||
WriteToFile(caddyStr, "/etc/caddy/Caddyfile");
|
||||
}
|
||||
|
||||
private string BuildConfig(bool useCustomWeb = false)
|
||||
{
|
||||
var jsonStr = File.ReadAllText("Templates/NaiveProxy/naive_server.caddyfile");
|
||||
jsonStr = jsonStr.Replace("##port##", Settings.Port.ToString());
|
||||
jsonStr = jsonStr.Replace("##domain##", Settings.Domain);
|
||||
jsonStr = jsonStr.Replace("##basicauth##", $"basic_auth {Settings.UserName} {Settings.Password}");
|
||||
|
||||
if (!useCustomWeb && !string.IsNullOrEmpty(Settings.MaskDomain))
|
||||
{
|
||||
var prefix = "http://";
|
||||
if (Settings.MaskDomain.StartsWith("https://"))
|
||||
{
|
||||
prefix = "https://";
|
||||
}
|
||||
var domain = Settings.MaskDomain
|
||||
.TrimStart("http://".ToCharArray())
|
||||
.TrimStart("https://".ToCharArray());
|
||||
|
||||
jsonStr = jsonStr.Replace("##reverse_proxy##", $"reverse_proxy {prefix}{domain} {{ \n header_up Host {domain} \n }}");
|
||||
}
|
||||
else
|
||||
{
|
||||
jsonStr = jsonStr.Replace("##reverse_proxy##", "");
|
||||
jsonStr = jsonStr.Replace("#file_server", "file_server");
|
||||
}
|
||||
return jsonStr;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
843
ProxySuper.Core/Services/ServiceBase.cs
Normal file
843
ProxySuper.Core/Services/ServiceBase.cs
Normal file
|
@ -0,0 +1,843 @@
|
|||
using MvvmCross;
|
||||
using MvvmCross.Navigation;
|
||||
using ProxySuper.Core.Helpers;
|
||||
using ProxySuper.Core.Models;
|
||||
using ProxySuper.Core.Models.Hosts;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
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;
|
||||
using System.Windows.Navigation;
|
||||
|
||||
namespace ProxySuper.Core.Services
|
||||
{
|
||||
public enum ArchType
|
||||
{
|
||||
x86,
|
||||
arm
|
||||
}
|
||||
|
||||
public enum CmdType
|
||||
{
|
||||
None,
|
||||
Yum,
|
||||
Apt,
|
||||
Dnf
|
||||
}
|
||||
|
||||
public abstract class ServiceBase<TSettings> where TSettings : IProjectSettings
|
||||
{
|
||||
private Host _host;
|
||||
|
||||
private SshClient _sshClient;
|
||||
|
||||
private ProjectProgress _progress;
|
||||
|
||||
public ServiceBase(Host host, TSettings settings)
|
||||
{
|
||||
_host = host;
|
||||
|
||||
Settings = settings;
|
||||
|
||||
var connection = CreateConnectionInfo();
|
||||
if (connection != null)
|
||||
{
|
||||
_sshClient = new SshClient(connection);
|
||||
}
|
||||
|
||||
_progress = new ProjectProgress();
|
||||
|
||||
ArchType = ArchType.x86;
|
||||
|
||||
CmdType = CmdType.None;
|
||||
|
||||
IPv4 = string.Empty;
|
||||
|
||||
IPv6 = string.Empty;
|
||||
|
||||
IsOnlyIPv6 = false;
|
||||
|
||||
NavigationService = Mvx.IoCProvider.Resolve<IMvxNavigationService>();
|
||||
}
|
||||
|
||||
public string RunCmd(string command)
|
||||
{
|
||||
AppendCommand(command);
|
||||
|
||||
string result;
|
||||
if (_sshClient.IsConnected)
|
||||
{
|
||||
result = _sshClient.CreateCommand(command).Execute();
|
||||
}
|
||||
else
|
||||
{
|
||||
result = "连接已断开";
|
||||
}
|
||||
|
||||
AppendCommand(result);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public ProjectProgress Progress => _progress;
|
||||
|
||||
public TSettings Settings { get; set; }
|
||||
|
||||
public ArchType ArchType { get; set; }
|
||||
|
||||
public CmdType CmdType { get; set; }
|
||||
|
||||
public string IPv4 { get; set; }
|
||||
|
||||
public string IPv6 { get; set; }
|
||||
|
||||
public bool IsOnlyIPv6 { get; set; }
|
||||
|
||||
public IMvxNavigationService NavigationService { get; set; }
|
||||
|
||||
|
||||
#region 公用方法
|
||||
public void Connect()
|
||||
{
|
||||
Task.Run(() =>
|
||||
{
|
||||
if (_sshClient == null)
|
||||
{
|
||||
MessageBox.Show("无法建立连接,连接参数有误!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (_sshClient.IsConnected == false)
|
||||
{
|
||||
Progress.Desc = ("正在与服务器建立连接");
|
||||
try
|
||||
{
|
||||
_sshClient.Connect();
|
||||
Progress.Desc = ("建立连接成功");
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Progress.Desc = ("连接失败," + e.Message);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void Disconnect()
|
||||
{
|
||||
Task.Run(() =>
|
||||
{
|
||||
_sshClient?.Disconnect();
|
||||
});
|
||||
}
|
||||
|
||||
protected void WriteToFile(string text, string path)
|
||||
{
|
||||
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(text)))
|
||||
{
|
||||
using (var sftp = new SftpClient(_sshClient.ConnectionInfo))
|
||||
{
|
||||
try
|
||||
{
|
||||
sftp.Connect();
|
||||
sftp.UploadFile(stream, path, true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw ex;
|
||||
}
|
||||
finally
|
||||
{
|
||||
sftp.Disconnect();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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";
|
||||
}
|
||||
|
||||
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()})\"");
|
||||
}
|
||||
}
|
||||
|
||||
protected void ValidateDomain()
|
||||
{
|
||||
var domainIP = RunCmd($"ping \"{Settings.Domain}\" -c 1" + @" | sed '1{s/[^(]*(//;s/).*//;q}'")
|
||||
.Trim('\r', '\n');
|
||||
|
||||
if (IsOnlyIPv6)
|
||||
{
|
||||
Progress.Desc = ($"本机IP({IPv6})");
|
||||
if (IPv6 != domainIP)
|
||||
{
|
||||
//throw new Exception("域名解析地址与服务器IP不匹配!");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Progress.Desc = ($"本机IP({IPv4})");
|
||||
Progress.Desc = ($"域名IP({domainIP})");
|
||||
if (IPv4 != domainIP)
|
||||
{
|
||||
//throw new Exception("域名解析地址与服务器IP不匹配!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void EnableBBR()
|
||||
{
|
||||
Progress.Desc = ("检查系统是否满足启动BBR条件");
|
||||
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 (IsOnlyIPv6)
|
||||
{
|
||||
RemoveNat64();
|
||||
}
|
||||
Progress.Desc = ("启动BBR成功");
|
||||
}
|
||||
|
||||
if (!canInstallBBR)
|
||||
{
|
||||
Progress.Desc = ("系统不满足启用BBR条件,启动失败。");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 安装证书
|
||||
/// </summary>
|
||||
/// <param name="certPath"></param>
|
||||
/// <param name="keyPath"></param>
|
||||
protected void InstallCert(string dirPath, string certName, string keyName)
|
||||
{
|
||||
string certPath = dirPath + "/" + certName;
|
||||
string keyPath = dirPath + "/" + keyName;
|
||||
|
||||
Progress.Desc = ("安装Acme软件");
|
||||
#region 安装Acme
|
||||
// 安装依赖
|
||||
RunCmd(GetInstallCmd("socat"));
|
||||
|
||||
// 解决搬瓦工CentOS缺少问题
|
||||
RunCmd(GetInstallCmd("automake autoconf libtool"));
|
||||
|
||||
// 安装Acme
|
||||
var result = RunCmd($"curl https://get.acme.sh yes | sh");
|
||||
if (!result.Contains("nstall success"))
|
||||
{
|
||||
throw new Exception("安装 Acme 失败,请联系开发者!");
|
||||
}
|
||||
|
||||
RunCmd("alias acme.sh=~/.acme.sh/acme.sh");
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
#region 申请证书
|
||||
Progress.Desc = ("正在申请证书");
|
||||
// 申请证书
|
||||
var cmd = $"/root/.acme.sh/acme.sh --force --debug --issue --standalone -d {Settings.Domain} {(IsOnlyIPv6 ? "--listen-v6" : "")} --pre-hook \"systemctl stop caddy\" --post-hook \"systemctl start caddy\" --server letsencrypt";
|
||||
result = RunCmd(cmd);
|
||||
|
||||
|
||||
if (result.Contains("success"))
|
||||
{
|
||||
Progress.Desc = ("申请证书成功");
|
||||
}
|
||||
else
|
||||
{
|
||||
Progress.Desc = ("申请证书失败,如果申请次数过多请更换二级域名,或联系开发者!");
|
||||
throw new Exception("申请证书失败,如果申请次数过多请更换二级域名,或联系开发者!");
|
||||
}
|
||||
#endregion
|
||||
|
||||
// 安装证书
|
||||
Progress.Desc = ("安装TLS证书");
|
||||
RunCmd($"mkdir -p {dirPath}");
|
||||
RunCmd($"/root/.acme.sh/acme.sh --installcert -d {Settings.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"))
|
||||
{
|
||||
Progress.Desc = ("安装证书成功");
|
||||
}
|
||||
else
|
||||
{
|
||||
Progress.Desc = ("安装证书失败,请联系开发者!");
|
||||
throw new Exception("安装证书失败,请联系开发者!");
|
||||
}
|
||||
|
||||
RunCmd($"chmod 755 {dirPath}");
|
||||
}
|
||||
|
||||
protected void UploadFile(Stream stream, string path)
|
||||
{
|
||||
using (var sftp = new SftpClient(_sshClient.ConnectionInfo))
|
||||
{
|
||||
sftp.Connect();
|
||||
sftp.UploadFile(stream, path, true);
|
||||
sftp.Disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
public void EnsureRootUser()
|
||||
{
|
||||
// 禁止一些可能产生的干扰信息
|
||||
RunCmd(@"sed -i 's/echo/#echo/g' ~/.bashrc");
|
||||
RunCmd(@"sed -i 's/echo/#echo/g' ~/.profile");
|
||||
|
||||
var result = RunCmd("id -u");
|
||||
if (!result.Equals("0\n"))
|
||||
{
|
||||
throw new Exception("请使用Root权限账户登录!");
|
||||
}
|
||||
}
|
||||
|
||||
public void UninstallCaddy()
|
||||
{
|
||||
Progress.Desc = "关闭Caddy服务";
|
||||
RunCmd("systemctl stop caddy");
|
||||
RunCmd("systemctl disable caddy");
|
||||
|
||||
Progress.Desc = "彻底删除Caddy文件";
|
||||
RunCmd("rm -rf /etc/systemd/system/caddy.service");
|
||||
RunCmd("rm -rf /usr/bin/caddy");
|
||||
RunCmd("rm -rf /usr/share/caddy");
|
||||
RunCmd("rm -rf /etc/caddy");
|
||||
}
|
||||
|
||||
public void EnsureSystemEnv()
|
||||
{
|
||||
// cpu架构
|
||||
Progress.Desc = ("检测CPU架构");
|
||||
EnsureCPU();
|
||||
|
||||
// 安装命令类型
|
||||
Progress.Desc = ("检测系统安装命令");
|
||||
EnsureCmdType();
|
||||
|
||||
// systemctl
|
||||
Progress.Desc = ("检测Systemctl");
|
||||
EnsureSystemctl();
|
||||
|
||||
// SELinux
|
||||
Progress.Desc = ("检测SELinux");
|
||||
ConfigSELinux();
|
||||
}
|
||||
|
||||
public void InstallSystemTools()
|
||||
{
|
||||
Progress.Desc = ("更新安装包");
|
||||
RunUpdateCmd();
|
||||
|
||||
Progress.Desc = ("安装sudo工具");
|
||||
InstallSoftware("sudo");
|
||||
|
||||
Progress.Desc = ("安装curl工具");
|
||||
InstallSoftware("curl");
|
||||
|
||||
Progress.Desc = ("安装wget工具");
|
||||
InstallSoftware("wget");
|
||||
|
||||
Progress.Desc = ("安装ping工具");
|
||||
InstallSoftware("ping");
|
||||
|
||||
Progress.Desc = ("安装unzip工具");
|
||||
InstallSoftware("unzip");
|
||||
|
||||
Progress.Desc = ("安装cron工具");
|
||||
InstallSoftware("cron");
|
||||
|
||||
Progress.Desc = ("安装lsof工具");
|
||||
InstallSoftware("lsof");
|
||||
|
||||
Progress.Desc = ("安装systemd工具");
|
||||
InstallSoftware("systemd");
|
||||
}
|
||||
|
||||
public void ConfigFirewalld()
|
||||
{
|
||||
Progress.Desc = ("释放被占用的端口");
|
||||
Settings.FreePorts.ForEach(port => SetPortFree(port));
|
||||
|
||||
Progress.Desc = ("开放需要的端口");
|
||||
OpenPort(Settings.FreePorts.ToArray());
|
||||
}
|
||||
|
||||
public void ResetFirewalld()
|
||||
{
|
||||
ClosePort(Settings.FreePorts.ToArray());
|
||||
}
|
||||
|
||||
public void EnsureNetwork()
|
||||
{
|
||||
string cmd;
|
||||
|
||||
Progress.Desc = ("检测IPv4");
|
||||
cmd = RunCmd(@"curl -4 ip.sb");
|
||||
IPv4 = cmd.TrimEnd('\r', '\n');
|
||||
|
||||
Progress.Desc = ($"IPv4地址为{IPv4}");
|
||||
if (!string.IsNullOrEmpty(IPv4))
|
||||
{
|
||||
IsOnlyIPv6 = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
Progress.Desc = ("检测IPv6");
|
||||
cmd = RunCmd(@"curl -6 ip.sb");
|
||||
IPv6 = cmd.TrimEnd('\r', '\n');
|
||||
Progress.Desc = ($"IPv6地址为{IPv6}");
|
||||
|
||||
IsOnlyIPv6 = true;
|
||||
SetNat64();
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(IPv4) && string.IsNullOrEmpty(IPv6))
|
||||
{
|
||||
throw new Exception("未检测到服务器公网IP,请检查网络或重试。");
|
||||
}
|
||||
}
|
||||
|
||||
public void InstallCaddy()
|
||||
{
|
||||
RunCmd("rm -rf caddy.tar.gz");
|
||||
RunCmd("rm -rf /etc/caddy");
|
||||
RunCmd("rm -rf /usr/share/caddy");
|
||||
|
||||
var url = "https://github.com/caddyserver/caddy/releases/download/v2.4.3/caddy_2.4.3_linux_amd64.tar.gz";
|
||||
if (ArchType == ArchType.arm)
|
||||
{
|
||||
url = "https://github.com/caddyserver/caddy/releases/download/v2.4.3/caddy_2.4.3_linux_armv7.tar.gz";
|
||||
}
|
||||
|
||||
RunCmd($"wget -O caddy.tar.gz {url}");
|
||||
RunCmd("mkdir /etc/caddy");
|
||||
RunCmd("tar -zxvf caddy.tar.gz -C /etc/caddy");
|
||||
RunCmd("cp -rf /etc/caddy/caddy /usr/bin");
|
||||
WriteToFile(Caddy.DefaultCaddyFile, "/etc/caddy/Caddyfile");
|
||||
WriteToFile(Caddy.Service, "/etc/systemd/system/caddy.service");
|
||||
RunCmd("systemctl daemon-reload");
|
||||
RunCmd("systemctl enable caddy");
|
||||
|
||||
RunCmd("mkdir /usr/share/caddy");
|
||||
RunCmd("chmod 775 /usr/share/caddy");
|
||||
|
||||
if (!FileExists("/usr/bin/caddy"))
|
||||
{
|
||||
throw new Exception("Caddy服务器安装失败,请联系开发者!");
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region 检测System环境
|
||||
private void EnsureCPU()
|
||||
{
|
||||
var result = RunCmd("uname -m");
|
||||
if (result.Contains("x86"))
|
||||
{
|
||||
ArchType = ArchType.x86;
|
||||
}
|
||||
else if (result.Contains("arm") || result.Contains("arch"))
|
||||
{
|
||||
ArchType = ArchType.arm;
|
||||
}
|
||||
}
|
||||
|
||||
private void EnsureCmdType()
|
||||
{
|
||||
var result = string.Empty;
|
||||
|
||||
if (CmdType == CmdType.None)
|
||||
{
|
||||
result = RunCmd("command -v apt");
|
||||
if (!string.IsNullOrEmpty(result))
|
||||
{
|
||||
CmdType = CmdType.Apt;
|
||||
}
|
||||
}
|
||||
|
||||
if (CmdType == CmdType.None)
|
||||
{
|
||||
result = RunCmd("command -v dnf");
|
||||
if (!string.IsNullOrEmpty(result))
|
||||
{
|
||||
CmdType = CmdType.Dnf;
|
||||
}
|
||||
}
|
||||
|
||||
if (CmdType == CmdType.None)
|
||||
{
|
||||
result = RunCmd("command -v yum");
|
||||
if (!string.IsNullOrEmpty(result))
|
||||
{
|
||||
CmdType = CmdType.Yum;
|
||||
}
|
||||
}
|
||||
|
||||
if (CmdType == CmdType.None)
|
||||
{
|
||||
throw new Exception("未检测到正确的系统安装命令,请尝试使用ProxySU推荐的系统版本安装!");
|
||||
}
|
||||
}
|
||||
|
||||
private void EnsureSystemctl()
|
||||
{
|
||||
var result = RunCmd("command -v systemctl");
|
||||
if (string.IsNullOrEmpty(result))
|
||||
{
|
||||
throw new Exception("系统缺少 systemctl 组件,请尝试使用ProxySU推荐的系统版本安装!");
|
||||
}
|
||||
}
|
||||
|
||||
private void ConfigSELinux()
|
||||
{
|
||||
// SELinux
|
||||
var result = RunCmd("command -v getenforce");
|
||||
var isSELinux = !string.IsNullOrEmpty(result);
|
||||
|
||||
// 判断是否启用了SELinux,如果启用了,并且工作在Enforcing模式下,则改为Permissive模式
|
||||
if (isSELinux)
|
||||
{
|
||||
result = RunCmd("getenforce");
|
||||
|
||||
// 检测到系统启用SELinux,且工作在严格模式下,需改为宽松模式
|
||||
if (result.Contains("Enforcing"))
|
||||
{
|
||||
RunCmd("setenforce 0");
|
||||
RunCmd(@"sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config");
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region 私有方法
|
||||
|
||||
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");
|
||||
}
|
||||
|
||||
protected void AppendCommand(string command)
|
||||
{
|
||||
if (!command.EndsWith("\n"))
|
||||
{
|
||||
command += "\n";
|
||||
}
|
||||
Progress.Logs += command;
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
}
|
||||
|
||||
private void SetPortFree(int port)
|
||||
{
|
||||
string result = RunCmd($"lsof -n -P -i :{port} | grep LISTEN");
|
||||
|
||||
if (!string.IsNullOrEmpty(result))
|
||||
{
|
||||
string[] process = result.Split(' ');
|
||||
RunCmd($"systemctl stop {process[0]}");
|
||||
RunCmd($"systemctl disable {process[0]}");
|
||||
RunCmd($"pkill {process[0]}");
|
||||
}
|
||||
}
|
||||
|
||||
private 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");
|
||||
}
|
||||
|
||||
// 保持 ssh 端口开放
|
||||
RunCmd($"firewall-cmd --add-port={_host.Port}/tcp --permanent");
|
||||
foreach (var port in portList)
|
||||
{
|
||||
RunCmd($"firewall-cmd --add-port={port}/tcp --permanent");
|
||||
RunCmd($"firewall-cmd --add-port={port}/udp --permanent");
|
||||
}
|
||||
|
||||
RunCmd("yes | firewall-cmd --reload");
|
||||
}
|
||||
else
|
||||
{
|
||||
cmd = RunCmd("command -v ufw");
|
||||
if (string.IsNullOrEmpty(cmd))
|
||||
{
|
||||
RunCmd(GetInstallCmd("ufw"));
|
||||
RunCmd("echo y | ufw enable");
|
||||
}
|
||||
|
||||
// 保持 ssh 端口开放
|
||||
RunCmd($"ufw allow {_host.Port}/tcp");
|
||||
foreach (var port in portList)
|
||||
{
|
||||
RunCmd($"ufw allow {port}/tcp");
|
||||
RunCmd($"ufw allow {port}/udp");
|
||||
}
|
||||
RunCmd("yes | ufw reload");
|
||||
}
|
||||
}
|
||||
|
||||
private 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 --remove-port={port}/tcp --permanent");
|
||||
RunCmd($"firewall-cmd --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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void InstallSoftware(string software)
|
||||
{
|
||||
var result = RunCmd($"command -v {software}");
|
||||
if (string.IsNullOrEmpty(result))
|
||||
{
|
||||
RunCmd(GetInstallCmd(software));
|
||||
}
|
||||
}
|
||||
|
||||
private string GetInstallCmd(string soft)
|
||||
{
|
||||
if (CmdType == CmdType.Apt)
|
||||
{
|
||||
return $"apt install -y {soft}";
|
||||
}
|
||||
else if (CmdType == CmdType.Yum)
|
||||
{
|
||||
return $"yum install -y {soft}";
|
||||
}
|
||||
else
|
||||
{
|
||||
return $"dnf install -y {soft}";
|
||||
}
|
||||
}
|
||||
|
||||
private void RunUpdateCmd()
|
||||
{
|
||||
if (CmdType == CmdType.Apt)
|
||||
{
|
||||
RunCmd($"apt update -y");
|
||||
}
|
||||
else if (CmdType == CmdType.Yum)
|
||||
{
|
||||
RunCmd($"yum update -y");
|
||||
}
|
||||
else
|
||||
{
|
||||
RunCmd($"dnf update -y");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private ConnectionInfo CreateConnectionInfo()
|
||||
{
|
||||
try
|
||||
{
|
||||
var authMethods = new List<AuthenticationMethod>();
|
||||
|
||||
if (_host.SecretType == LoginSecretType.Password)
|
||||
{
|
||||
authMethods.Add(new PasswordAuthenticationMethod(_host.UserName, _host.Password));
|
||||
}
|
||||
|
||||
if (_host.SecretType == LoginSecretType.PrivateKey)
|
||||
{
|
||||
PrivateKeyFile keyFile;
|
||||
if (string.IsNullOrEmpty(_host.PrivateKeyPassPhrase))
|
||||
{
|
||||
keyFile = new PrivateKeyFile(_host.PrivateKeyPath);
|
||||
}
|
||||
else
|
||||
{
|
||||
keyFile = new PrivateKeyFile(_host.PrivateKeyPath, _host.PrivateKeyPassPhrase);
|
||||
}
|
||||
authMethods.Add(new PrivateKeyAuthenticationMethod(_host.UserName, keyFile));
|
||||
}
|
||||
|
||||
if (_host.Proxy.Type == ProxyTypes.None)
|
||||
{
|
||||
return new ConnectionInfo(
|
||||
host: _host.Address,
|
||||
username: _host.UserName,
|
||||
port: _host.Port,
|
||||
authenticationMethods: authMethods.ToArray());
|
||||
}
|
||||
|
||||
return new ConnectionInfo(
|
||||
host: _host.Address,
|
||||
port: _host.Port,
|
||||
username: _host.UserName,
|
||||
proxyType: _host.Proxy.Type,
|
||||
proxyHost: _host.Proxy.Address,
|
||||
proxyPort: _host.Proxy.Port,
|
||||
proxyUsername: _host.Proxy.UserName, proxyPassword: _host.Proxy.Password,
|
||||
authenticationMethods: authMethods.ToArray());
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
287
ProxySuper.Core/Services/ShareLink.cs
Normal file
287
ProxySuper.Core/Services/ShareLink.cs
Normal file
|
@ -0,0 +1,287 @@
|
|||
using Newtonsoft.Json;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using System;
|
||||
using System.Text;
|
||||
using System.Web;
|
||||
|
||||
namespace ProxySuper.Core.Services
|
||||
{
|
||||
public class ShareLink
|
||||
{
|
||||
public static string BuildBrook(BrookSettings settings)
|
||||
{
|
||||
var password = HttpUtility.UrlEncode(settings.Password);
|
||||
|
||||
if (settings.BrookType == BrookType.server)
|
||||
{
|
||||
var address = HttpUtility.UrlEncode($"{settings.IP}:{settings.Port}");
|
||||
return $"brook://server?password={password}&server={address}";
|
||||
}
|
||||
|
||||
if (settings.BrookType == BrookType.wsserver)
|
||||
{
|
||||
var address = HttpUtility.UrlEncode($"ws://{settings.IP}:{settings.Port}");
|
||||
return $"brook://wsserver?password={password}&wsserver={address}";
|
||||
}
|
||||
|
||||
if (settings.BrookType == BrookType.wssserver)
|
||||
{
|
||||
var address = HttpUtility.UrlEncode($"wss://{settings.Domain}:{settings.Port}");
|
||||
return $"brook://wssserver?password={password}&wssserver={address}";
|
||||
}
|
||||
|
||||
if (settings.BrookType == BrookType.socks5)
|
||||
{
|
||||
var address = HttpUtility.UrlEncode($"socks5://{settings.IP}:{settings.Port}");
|
||||
return $"brook://socks5?password={password}&socks5={address}";
|
||||
}
|
||||
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
public static string BuildNaiveProxy(NaiveProxySettings settings)
|
||||
{
|
||||
StringBuilder strBuilder = new StringBuilder();
|
||||
strBuilder.Append("naive+https://");
|
||||
strBuilder.Append($"{settings.UserName}:{settings.Password}");
|
||||
strBuilder.Append($"@{settings.Domain}:{settings.Port}");
|
||||
strBuilder.Append("?padding=true#naive_proxy");
|
||||
|
||||
return strBuilder.ToString();
|
||||
}
|
||||
|
||||
public static string BuildTrojanGo(TrojanGoSettings settings)
|
||||
{
|
||||
StringBuilder strBuilder = new StringBuilder();
|
||||
strBuilder.Append("trojan-go://");
|
||||
|
||||
strBuilder.Append($"{HttpUtility.UrlEncode(settings.Password)}@{settings.Domain}:{settings.Port}/?");
|
||||
if (settings.EnableWebSocket)
|
||||
{
|
||||
strBuilder.Append($"type=ws&path={HttpUtility.UrlEncode(settings.WebSocketPath)}&");
|
||||
}
|
||||
else
|
||||
{
|
||||
strBuilder.Append("type=original&");
|
||||
}
|
||||
strBuilder.Append($"#{HttpUtility.UrlEncode("trojan-go")}");
|
||||
|
||||
return strBuilder.ToString();
|
||||
}
|
||||
|
||||
public static string Build(RayType xrayType, V2raySettings settings)
|
||||
{
|
||||
|
||||
switch (xrayType)
|
||||
{
|
||||
case RayType.VLESS_TCP:
|
||||
case RayType.VLESS_TCP_XTLS:
|
||||
case RayType.VLESS_WS:
|
||||
case RayType.VLESS_KCP:
|
||||
case RayType.VLESS_QUIC:
|
||||
case RayType.VLESS_gRPC:
|
||||
case RayType.Trojan_TCP:
|
||||
return BuildVlessShareLink(xrayType, settings);
|
||||
case RayType.VMESS_TCP:
|
||||
case RayType.VMESS_WS:
|
||||
case RayType.VMESS_KCP:
|
||||
case RayType.VMESS_QUIC:
|
||||
return BuildVmessShareLink(xrayType, settings);
|
||||
case RayType.ShadowsocksAEAD:
|
||||
return BuildShadowSocksShareLink(settings);
|
||||
default:
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
private static string BuildShadowSocksShareLink(V2raySettings settings)
|
||||
{
|
||||
var _method = settings.ShadowSocksMethod;
|
||||
var _password = settings.ShadowSocksPassword;
|
||||
var _server = settings.Domain;
|
||||
var _port = settings.ShadowSocksPort;
|
||||
|
||||
var base64URL = Utils.Base64Encode($"{_method}:{_password}@{_server}:{_port}");
|
||||
return "ss://" + base64URL + "#ShadowSocks";
|
||||
}
|
||||
|
||||
private static string BuildVmessShareLink(RayType xrayType, V2raySettings settings)
|
||||
{
|
||||
var vmess = new Vmess
|
||||
{
|
||||
v = "2",
|
||||
add = settings.Domain,
|
||||
port = settings.Port.ToString(),
|
||||
id = settings.UUID,
|
||||
aid = "0",
|
||||
net = "",
|
||||
type = "none",
|
||||
host = "",
|
||||
path = "",
|
||||
tls = "tls",
|
||||
ps = "",
|
||||
};
|
||||
|
||||
switch (xrayType)
|
||||
{
|
||||
case RayType.VMESS_TCP:
|
||||
vmess.ps = "vmess-tcp-tls";
|
||||
vmess.net = "tcp";
|
||||
vmess.type = "http";
|
||||
vmess.path = settings.VMESS_TCP_Path;
|
||||
break;
|
||||
case RayType.VMESS_WS:
|
||||
vmess.ps = "vmess-ws-tls";
|
||||
vmess.net = "ws";
|
||||
vmess.type = "none";
|
||||
vmess.path = settings.VMESS_WS_Path;
|
||||
break;
|
||||
case RayType.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;
|
||||
case RayType.VMESS_QUIC:
|
||||
vmess.ps = "vmess-quic";
|
||||
vmess.port = settings.VMESS_QUIC_Port.ToString();
|
||||
vmess.net = "quic";
|
||||
vmess.type = settings.VMESS_QUIC_Type;
|
||||
vmess.path = settings.VMESS_QUIC_Key;
|
||||
vmess.host = settings.VMESS_QUIC_Security;
|
||||
vmess.tls = "tls";
|
||||
break;
|
||||
default:
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
var base64Url = Utils.Base64Encode(JsonConvert.SerializeObject(vmess));
|
||||
return $"vmess://" + base64Url;
|
||||
}
|
||||
|
||||
private static string BuildVlessShareLink(RayType xrayType, V2raySettings 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;
|
||||
|
||||
switch (xrayType)
|
||||
{
|
||||
case RayType.VLESS_TCP:
|
||||
_protocol = "vless";
|
||||
_type = "tcp";
|
||||
_descriptiveText = "vless-tcp-tls";
|
||||
break;
|
||||
case RayType.VLESS_TCP_XTLS:
|
||||
_protocol = "vless";
|
||||
_type = "tcp";
|
||||
_security = "tls";
|
||||
_descriptiveText = "vless-tcp-xtls";
|
||||
break;
|
||||
case RayType.VLESS_WS:
|
||||
_protocol = "vless";
|
||||
_type = "ws";
|
||||
_path = settings.VLESS_WS_Path;
|
||||
_descriptiveText = "vless-ws-tls";
|
||||
break;
|
||||
case RayType.VLESS_KCP:
|
||||
_protocol = "vless";
|
||||
_type = "kcp";
|
||||
_port = settings.VLESS_KCP_Port;
|
||||
_security = "none";
|
||||
_descriptiveText = "vless-mKCP";
|
||||
break;
|
||||
case RayType.VLESS_QUIC:
|
||||
_protocol = "vless";
|
||||
_port = settings.VLESS_QUIC_Port;
|
||||
_type = "quic";
|
||||
_security = "tls";
|
||||
_descriptiveText = "vless-quic";
|
||||
break;
|
||||
case RayType.VLESS_gRPC:
|
||||
_protocol = "vless";
|
||||
_type = "grpc";
|
||||
_port = settings.VLESS_gRPC_Port;
|
||||
_descriptiveText = "vless-gRPC";
|
||||
break;
|
||||
case RayType.Trojan_TCP:
|
||||
_protocol = "trojan";
|
||||
_uuid = settings.TrojanPassword;
|
||||
_descriptiveText = "trojan-tcp";
|
||||
break;
|
||||
default:
|
||||
throw new Exception("暂未实现的协议");
|
||||
}
|
||||
|
||||
|
||||
string parametersURL = string.Empty;
|
||||
if (xrayType != RayType.Trojan_TCP)
|
||||
{
|
||||
// 4.3 传输层相关段
|
||||
parametersURL = $"?type={_type}&encryption={_encryption}&security={_security}&path={HttpUtility.UrlEncode(_path)}";
|
||||
|
||||
// kcp
|
||||
if (xrayType == RayType.VLESS_KCP)
|
||||
{
|
||||
parametersURL += $"&seed={settings.VLESS_KCP_Seed}&headerType={settings.VLESS_KCP_Type}";
|
||||
}
|
||||
|
||||
if (xrayType == RayType.VLESS_QUIC)
|
||||
{
|
||||
parametersURL += $"&quicSecurity={settings.VLESS_QUIC_Security}";
|
||||
if (settings.VLESS_QUIC_Security != "none")
|
||||
{
|
||||
parametersURL += $"&key={HttpUtility.UrlEncode(settings.VLESS_QUIC_Key)}";
|
||||
}
|
||||
parametersURL += $"&headerType={settings.VLESS_QUIC_Type}";
|
||||
}
|
||||
|
||||
// 4.4 TLS 相关段
|
||||
if (settings is XraySettings)
|
||||
{
|
||||
if (xrayType == RayType.VLESS_TCP_XTLS)
|
||||
{
|
||||
var xraySettings = settings as XraySettings;
|
||||
parametersURL += $"&flow={xraySettings.Flow}";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (xrayType == RayType.VLESS_gRPC)
|
||||
{
|
||||
parametersURL += $"&serviceName={settings.VLESS_gRPC_ServiceName}&mode=gun";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
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; }
|
||||
}
|
||||
}
|
66
ProxySuper.Core/Services/TrojanGoConfigBuilder.cs
Normal file
66
ProxySuper.Core/Services/TrojanGoConfigBuilder.cs
Normal file
|
@ -0,0 +1,66 @@
|
|||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using System.IO;
|
||||
|
||||
namespace ProxySuper.Core.Services
|
||||
{
|
||||
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;
|
||||
|
||||
if (parameters.EnableWebSocket)
|
||||
{
|
||||
settings["websocket"]["enabled"] = true;
|
||||
settings["websocket"]["path"] = parameters.WebSocketPath;
|
||||
settings["websocket"]["host"] = 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 = caddyStr.Replace("##domain##", parameters.Domain);
|
||||
caddyStr = 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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
401
ProxySuper.Core/Services/TrojanGoService.cs
Normal file
401
ProxySuper.Core/Services/TrojanGoService.cs
Normal file
|
@ -0,0 +1,401 @@
|
|||
using Microsoft.Win32;
|
||||
using ProxySuper.Core.Models.Hosts;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using ProxySuper.Core.ViewModels;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
|
||||
namespace ProxySuper.Core.Services
|
||||
{
|
||||
public class TrojanGoService : ServiceBase<TrojanGoSettings>
|
||||
{
|
||||
public TrojanGoService(Host host, TrojanGoSettings settings) : base(host, settings)
|
||||
{
|
||||
}
|
||||
|
||||
public void Install()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
Progress.Percentage = 0;
|
||||
Progress.Step = "安装TrojanGo";
|
||||
Progress.Desc = "安装TrojanGo";
|
||||
EnsureRootUser();
|
||||
|
||||
if (FileExists("/usr/local/bin/trojan-go"))
|
||||
{
|
||||
var btnResult = MessageBox.Show("已经安装Trojan-Go,是否需要重装?", "提示", MessageBoxButton.YesNo);
|
||||
if (btnResult == MessageBoxResult.No)
|
||||
{
|
||||
MessageBox.Show("安装终止", "提示");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
var index = 1;
|
||||
Progress.Step = $"{index++}. 检测系统环境";
|
||||
EnsureSystemEnv();
|
||||
Progress.Percentage = 10;
|
||||
|
||||
Progress.Step = $"{index++}. 安装必要的系统工具";
|
||||
InstallSystemTools();
|
||||
Progress.Percentage = 30;
|
||||
|
||||
Progress.Step = $"{index++}. 配置防火墙";
|
||||
ConfigFirewalld();
|
||||
Progress.Percentage = 40;
|
||||
|
||||
Progress.Step = $"{index++}. 检测网络环境";
|
||||
EnsureNetwork();
|
||||
Progress.Percentage = 50;
|
||||
|
||||
Progress.Step = $"{index++}. 检测域名是否解析到本机";
|
||||
ValidateDomain();
|
||||
Progress.Percentage = 60;
|
||||
|
||||
Progress.Step = $"{index++}. 安装Caddy服务";
|
||||
InstallCaddy();
|
||||
Progress.Percentage = 70;
|
||||
|
||||
Progress.Step = $"{index++}. 安装TrojanGo";
|
||||
InstallTrojanGo();
|
||||
Progress.Percentage = 80;
|
||||
|
||||
Progress.Step = $"{index++}. 上传Caddy配置文件";
|
||||
UploadCaddySettings();
|
||||
Progress.Percentage = 90;
|
||||
|
||||
Progress.Step = $"{index++}. 启动BBR";
|
||||
EnableBBR();
|
||||
|
||||
Progress.Step = $"{index++}. 重启caddy服务";
|
||||
RunCmd("systemctl restart caddy");
|
||||
|
||||
Progress.Desc = "启用Trojan-Go开机启动";
|
||||
RunCmd("systemctl enable trojan-go");
|
||||
RunCmd("systemctl restart trojan-go");
|
||||
|
||||
AppendCommand("分享连接:");
|
||||
AppendCommand(ShareLink.BuildTrojanGo(Settings));
|
||||
|
||||
Progress.Percentage = 100;
|
||||
Progress.Step = "安装成功";
|
||||
Progress.Desc = string.Empty;
|
||||
|
||||
if (!Settings.WithTLS)
|
||||
{
|
||||
Progress.Step = "安装成功,请上传您的 TLS 证书。";
|
||||
}
|
||||
else
|
||||
{
|
||||
NavigationService.Navigate<TrojanGoConfigViewModel, TrojanGoSettings>(Settings);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void Uninstall()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
EnsureRootUser();
|
||||
|
||||
Progress.Step = "卸载Trojgan-Go";
|
||||
Progress.Percentage = 0;
|
||||
|
||||
Progress.Desc = "检测系统环境";
|
||||
EnsureSystemEnv();
|
||||
Progress.Percentage = 20;
|
||||
|
||||
Progress.Desc = "停止Trojan—Go服务";
|
||||
RunCmd("systemctl stop trojan-go");
|
||||
Progress.Percentage = 40;
|
||||
|
||||
|
||||
Progress.Desc = "卸载Caddy";
|
||||
UninstallCaddy();
|
||||
Progress.Percentage = 60;
|
||||
|
||||
Progress.Desc = "卸载Trojan-Go";
|
||||
RunCmd("rm -rf /usr/local/bin/trojan-go");
|
||||
RunCmd("rm -rf /usr/local/etc/trojan-go");
|
||||
Progress.Percentage = 90;
|
||||
|
||||
Progress.Desc = "删除 acme.sh";
|
||||
RunCmd("acme.sh --uninstall");
|
||||
RunCmd("rm -r ~/.acme.sh");
|
||||
|
||||
Progress.Percentage = 100;
|
||||
Progress.Step = "卸载Trojan-Go成功";
|
||||
Progress.Desc = string.Empty;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void UpdateSettings()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
Progress.Step = "更新配置文件";
|
||||
Progress.Percentage = 0;
|
||||
|
||||
Progress.Desc = "检测系统环境";
|
||||
EnsureRootUser();
|
||||
EnsureSystemEnv();
|
||||
Progress.Percentage = 30;
|
||||
|
||||
Progress.Desc = "更新配置文件";
|
||||
UploadTrojanGoSettings();
|
||||
Progress.Percentage = 70;
|
||||
|
||||
Progress.Desc = "重启caddy服务";
|
||||
RunCmd("systemctl restart caddy");
|
||||
Progress.Percentage = 80;
|
||||
|
||||
Progress.Desc = "重启Trojan-Go服务器";
|
||||
RunCmd("systemctl restart trojan-go");
|
||||
|
||||
Progress.Percentage = 100;
|
||||
Progress.Desc = "更新配置成功";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void UploadWeb()
|
||||
{
|
||||
var fileDialog = new OpenFileDialog();
|
||||
fileDialog.Filter = "压缩文件|*.zip";
|
||||
fileDialog.FileOk += DoUploadWeb;
|
||||
fileDialog.ShowDialog();
|
||||
}
|
||||
|
||||
public void UploadCert()
|
||||
{
|
||||
var fileDialog = new OpenFileDialog();
|
||||
fileDialog.Filter = "压缩文件|*.zip";
|
||||
fileDialog.FileOk += DoUploadCert;
|
||||
fileDialog.ShowDialog();
|
||||
}
|
||||
|
||||
public void ApplyForCert()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
Progress.Step = "续签证书";
|
||||
Progress.Percentage = 0;
|
||||
|
||||
Progress.Desc = "检测系统环境";
|
||||
EnsureRootUser();
|
||||
EnsureSystemEnv();
|
||||
Progress.Percentage = 20;
|
||||
|
||||
Progress.Desc = "安装TLS证书";
|
||||
InstallCert(
|
||||
dirPath: "/usr/local/etc/trojan-go",
|
||||
certName: "trojan-go.crt",
|
||||
keyName: "trojan-go.key");
|
||||
Progress.Percentage = 90;
|
||||
|
||||
Progress.Desc = "重启Trojan-go服务";
|
||||
RunCmd("systemctl restart trojan-go");
|
||||
|
||||
Progress.Percentage = 100;
|
||||
Progress.Step = "续签证书成功";
|
||||
Progress.Desc = "续签证书成功";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
#region 私有方法
|
||||
|
||||
|
||||
private void DoUploadCert(object sender, CancelEventArgs e)
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
EnsureRootUser();
|
||||
|
||||
Progress.Percentage = 0;
|
||||
Progress.Step = "上传自有证书";
|
||||
Progress.Desc = "检测系统环境";
|
||||
|
||||
EnsureSystemEnv();
|
||||
Progress.Percentage = 20;
|
||||
|
||||
Progress.Desc = "正在上传文件";
|
||||
var file = sender as OpenFileDialog;
|
||||
using (var stream = file.OpenFile())
|
||||
{
|
||||
var oldFileName = $"ssl_{DateTime.Now.Ticks}";
|
||||
RunCmd($"mv /usr/local/etc/trojan-go/ssl /usr/local/etc/trojan-go/{oldFileName}");
|
||||
|
||||
RunCmd("mkdir /usr/local/etc/trojan-go/ssl");
|
||||
UploadFile(stream, "/usr/local/etc/trojan-go/ssl/ssl.zip");
|
||||
RunCmd("unzip /usr/local/etc/trojan-go/ssl/ssl.zip -d /usr/local/etc/trojan-go/ssl");
|
||||
}
|
||||
|
||||
var crtFiles = RunCmd("find /usr/local/etc/trojan-go/ssl/*.crt").Split("\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
|
||||
var keyFiles = RunCmd("find /usr/local/etc/trojan-go/ssl/*.key").Split("\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
|
||||
if (crtFiles.Length > 0 && keyFiles.Length > 0)
|
||||
{
|
||||
RunCmd($"mv {crtFiles[0]} /usr/local/etc/trojan-go/ssl/trojan-go.crt");
|
||||
RunCmd($"mv {keyFiles[0]} /usr/local/etc/trojan-go/ssl/trojan-go.key");
|
||||
}
|
||||
else
|
||||
{
|
||||
Progress.Step = "上传失败";
|
||||
Progress.Desc = "上传证书失败,缺少 .crt 和 .key 文件";
|
||||
return;
|
||||
}
|
||||
|
||||
Progress.Desc = "重启trojan-go服务";
|
||||
RunCmd("systemctl restart trojan-go");
|
||||
|
||||
Progress.Percentage = 100;
|
||||
Progress.Desc = "上传证书完成";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void DoUploadWeb(object sender, CancelEventArgs e)
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
EnsureRootUser();
|
||||
|
||||
Progress.Step = "上传静态网站";
|
||||
Progress.Percentage = 0;
|
||||
|
||||
Progress.Desc = "检测系统环境";
|
||||
EnsureSystemEnv();
|
||||
Progress.Percentage = 20;
|
||||
|
||||
Progress.Desc = "创建网站目录";
|
||||
if (!FileExists("/usr/share/caddy"))
|
||||
{
|
||||
RunCmd("mkdir /usr/share/caddy");
|
||||
}
|
||||
RunCmd("rm -rf /usr/share/caddy/*");
|
||||
Progress.Percentage = 40;
|
||||
|
||||
Progress.Desc = "正在上传文件";
|
||||
var file = sender as OpenFileDialog;
|
||||
using (var stream = file.OpenFile())
|
||||
{
|
||||
UploadFile(stream, "/usr/share/caddy/caddy.zip");
|
||||
RunCmd("unzip /usr/share/caddy/caddy.zip -d /usr/share/caddy");
|
||||
RunCmd("chmod -R 777 /usr/share/caddy");
|
||||
Progress.Percentage = 700;
|
||||
}
|
||||
|
||||
Progress.Desc = "上传Caddy配置文件";
|
||||
UploadCaddySettings(useCustomWeb: true);
|
||||
Progress.Percentage = 90;
|
||||
|
||||
Progress.Desc = "重启caddy服务";
|
||||
RunCmd("systemctl restart caddy");
|
||||
Progress.Percentage = 100;
|
||||
Progress.Desc = "上传静态网站成功";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void UploadCaddySettings(bool useCustomWeb = false)
|
||||
{
|
||||
var config = TrojanGoConfigBuilder.BuildCaddyConfig(Settings, 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");
|
||||
}
|
||||
|
||||
private void InstallTrojanGo()
|
||||
{
|
||||
RunCmd(@"curl https://raw.githubusercontent.com/proxysu/shellscript/master/trojan-go.sh yes | bash");
|
||||
var success = FileExists("/usr/local/bin/trojan-go");
|
||||
if (success == false)
|
||||
{
|
||||
throw new Exception("trojan-go 安装失败,请联系开发者!");
|
||||
}
|
||||
|
||||
Progress.Desc = "设置Trojan-Go权限";
|
||||
RunCmd($"sed -i 's/User=nobody/User=root/g' /etc/systemd/system/trojan-go.service");
|
||||
RunCmd($"sed -i 's/CapabilityBoundingSet=/#CapabilityBoundingSet=/g' /etc/systemd/system/trojan-go.service");
|
||||
RunCmd($"sed -i 's/AmbientCapabilities=/#AmbientCapabilities=/g' /etc/systemd/system/trojan-go.service");
|
||||
RunCmd($"systemctl daemon-reload");
|
||||
|
||||
if (Settings.WithTLS)
|
||||
{
|
||||
Progress.Desc = "安装TLS证书";
|
||||
InstallCert(
|
||||
dirPath: "/usr/local/etc/trojan-go/ssl",
|
||||
certName: "trojan-go.crt",
|
||||
keyName: "trojan-go.key");
|
||||
}
|
||||
|
||||
Progress.Desc = "上传Trojan-Go配置文件";
|
||||
UploadTrojanGoSettings();
|
||||
}
|
||||
|
||||
private void UploadTrojanGoSettings()
|
||||
{
|
||||
// 上传配置
|
||||
Progress.Desc = "生成配置文件";
|
||||
var settings = TrojanGoConfigBuilder.BuildTrojanGoConfig(Settings);
|
||||
var stream = new MemoryStream(Encoding.UTF8.GetBytes(settings));
|
||||
|
||||
Progress.Desc = "正在上传配置文件";
|
||||
UploadFile(stream, "/usr/local/etc/trojan-go/config.json");
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
}
|
||||
}
|
287
ProxySuper.Core/Services/V2rayConfigBuilder.cs
Normal file
287
ProxySuper.Core/Services/V2rayConfigBuilder.cs
Normal file
|
@ -0,0 +1,287 @@
|
|||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySuper.Core.Services
|
||||
{
|
||||
public class V2rayConfigBuilder
|
||||
{
|
||||
private const string ServerLogDir = @"Templates\v2ray\server\00_log";
|
||||
private const string ServerApiDir = @"Templates\v2ray\server\01_api";
|
||||
private const string ServerDnsDir = @"Templates\v2ray\server\02_dns";
|
||||
private const string ServerRoutingDir = @"Templates\v2ray\server\03_routing";
|
||||
private const string ServerPolicyDir = @"Templates\v2ray\server\04_policy";
|
||||
private const string ServerInboundsDir = @"Templates\v2ray\server\05_inbounds";
|
||||
private const string ServerOutboundsDir = @"Templates\v2ray\server\06_outbounds";
|
||||
private const string ServerTransportDir = @"Templates\v2ray\server\07_transport";
|
||||
private const string ServerStatsDir = @"Templates\v2ray\server\08_stats";
|
||||
private const string ServerReverseDir = @"Templates\v2ray\server\09_reverse";
|
||||
private const string CaddyFileDir = @"Templates\v2ray\caddy";
|
||||
|
||||
public static int VLESS_TCP_Port = 1110;
|
||||
public static int VLESS_WS_Port = 1111;
|
||||
public static int VLESS_H2_Port = 1112;
|
||||
|
||||
public static int VMESS_TCP_Port = 1210;
|
||||
public static int VMESS_WS_Port = 1211;
|
||||
public static int VMESS_H2_Port = 1212;
|
||||
|
||||
public static int Trojan_TCP_Port = 1310;
|
||||
public static int Trojan_WS_Port = 1311;
|
||||
|
||||
public static int FullbackPort = 8080;
|
||||
|
||||
|
||||
|
||||
public static dynamic LoadV2rayConfig()
|
||||
{
|
||||
dynamic logObj = LoadJsonObj(Path.Combine(ServerLogDir, "00_log.json"));
|
||||
dynamic apiObj = LoadJsonObj(Path.Combine(ServerApiDir, "01_api.json"));
|
||||
dynamic dnsObj = LoadJsonObj(Path.Combine(ServerDnsDir, "02_dns.json"));
|
||||
dynamic routingObj = LoadJsonObj(Path.Combine(ServerRoutingDir, "03_routing.json"));
|
||||
dynamic policyObj = LoadJsonObj(Path.Combine(ServerPolicyDir, "04_policy.json"));
|
||||
dynamic inboundsObj = LoadJsonObj(Path.Combine(ServerInboundsDir, "05_inbounds.json"));
|
||||
dynamic outboundsObj = LoadJsonObj(Path.Combine(ServerOutboundsDir, "06_outbounds.json"));
|
||||
dynamic transportObj = LoadJsonObj(Path.Combine(ServerTransportDir, "07_transport.json"));
|
||||
dynamic statsObj = LoadJsonObj(Path.Combine(ServerStatsDir, "08_stats.json"));
|
||||
dynamic reverseObj = LoadJsonObj(Path.Combine(ServerReverseDir, "09_reverse.json"));
|
||||
|
||||
return new
|
||||
{
|
||||
log = logObj["log"],
|
||||
//api = apiObj["api"], api不能为空
|
||||
dns = dnsObj["dns"],
|
||||
routing = routingObj["routing"],
|
||||
policy = policyObj["policy"],
|
||||
inbounds = inboundsObj["inbounds"],
|
||||
outbounds = outboundsObj["outbounds"],
|
||||
transport = transportObj["transport"],
|
||||
stats = statsObj["stats"],
|
||||
reverse = reverseObj["reverse"]
|
||||
};
|
||||
}
|
||||
|
||||
public static string BuildCaddyConfig(V2raySettings parameters, bool useCustomWeb = false)
|
||||
{
|
||||
var caddyStr = File.ReadAllText(Path.Combine(CaddyFileDir, "base.caddyfile"));
|
||||
caddyStr = caddyStr.Replace("##domain##", parameters.IsIPAddress ? "" : parameters.Domain);
|
||||
caddyStr = caddyStr.Replace("##port##", FullbackPort.ToString());
|
||||
|
||||
if (!useCustomWeb && !string.IsNullOrEmpty(parameters.MaskDomain))
|
||||
{
|
||||
var prefix = "http://";
|
||||
if (parameters.MaskDomain.StartsWith("https://"))
|
||||
{
|
||||
prefix = "https://";
|
||||
}
|
||||
var domain = parameters.MaskDomain
|
||||
.TrimStart("http://".ToCharArray())
|
||||
.TrimStart("https://".ToCharArray());
|
||||
|
||||
caddyStr = caddyStr.Replace("##reverse_proxy##", $"reverse_proxy {prefix}{domain} {{ \n header_up Host {domain} \n }}");
|
||||
}
|
||||
else
|
||||
{
|
||||
caddyStr = caddyStr.Replace("##reverse_proxy##", "");
|
||||
}
|
||||
|
||||
return caddyStr;
|
||||
}
|
||||
|
||||
private static void SetClients(dynamic bound, List<string> uuidList)
|
||||
{
|
||||
bound.settings.clients.Clear();
|
||||
uuidList.ForEach(id =>
|
||||
{
|
||||
object obj;
|
||||
|
||||
obj = new { id = id };
|
||||
|
||||
bound.settings.clients.Add(JToken.FromObject(obj));
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
public static string BuildV2rayConfig(V2raySettings parameters)
|
||||
{
|
||||
var uuidList = new List<string>();
|
||||
uuidList.Add(parameters.UUID);
|
||||
uuidList.AddRange(parameters.MulitUUID);
|
||||
|
||||
var xrayConfig = LoadV2rayConfig();
|
||||
|
||||
var baseBound = GetBound("VLESS_TCP_TLS.json");
|
||||
baseBound.port = parameters.Port;
|
||||
baseBound.settings.fallbacks.Add(JToken.FromObject(new
|
||||
{
|
||||
dest = FullbackPort
|
||||
}));
|
||||
xrayConfig.inbounds.Add(baseBound);
|
||||
SetClients(baseBound, uuidList);
|
||||
|
||||
#region Fullbacks
|
||||
|
||||
if (parameters.Types.Contains(RayType.VLESS_WS))
|
||||
{
|
||||
var wsInbound = GetBound("VLESS_WS.json");
|
||||
wsInbound.port = VLESS_WS_Port;
|
||||
SetClients(wsInbound, uuidList);
|
||||
wsInbound.streamSettings.wsSettings.path = parameters.VLESS_WS_Path;
|
||||
baseBound.settings.fallbacks.Add(JToken.FromObject(new
|
||||
{
|
||||
dest = VLESS_WS_Port,
|
||||
path = parameters.VLESS_WS_Path,
|
||||
xver = 1,
|
||||
}));
|
||||
xrayConfig.inbounds.Add(JToken.FromObject(wsInbound));
|
||||
}
|
||||
|
||||
if (parameters.Types.Contains(RayType.VMESS_TCP))
|
||||
{
|
||||
var mtcpBound = GetBound("VMESS_TCP.json");
|
||||
mtcpBound.port = VMESS_TCP_Port;
|
||||
SetClients(mtcpBound, uuidList);
|
||||
mtcpBound.streamSettings.tcpSettings.header.request.path = parameters.VMESS_TCP_Path;
|
||||
baseBound.settings.fallbacks.Add(JToken.FromObject(new
|
||||
{
|
||||
dest = VMESS_TCP_Port,
|
||||
path = parameters.VMESS_TCP_Path,
|
||||
xver = 1,
|
||||
}));
|
||||
xrayConfig.inbounds.Add(JToken.FromObject(mtcpBound));
|
||||
}
|
||||
|
||||
if (parameters.Types.Contains(RayType.VMESS_WS))
|
||||
{
|
||||
var mwsBound = GetBound("VMESS_WS.json");
|
||||
mwsBound.port = VMESS_WS_Port;
|
||||
SetClients(mwsBound, uuidList);
|
||||
mwsBound.streamSettings.wsSettings.path = parameters.VMESS_WS_Path;
|
||||
baseBound.settings.fallbacks.Add(JToken.FromObject(new
|
||||
{
|
||||
dest = VMESS_WS_Port,
|
||||
path = parameters.VMESS_WS_Path,
|
||||
xver = 1,
|
||||
}));
|
||||
xrayConfig.inbounds.Add(JToken.FromObject(mwsBound));
|
||||
}
|
||||
|
||||
if (parameters.Types.Contains(RayType.Trojan_TCP))
|
||||
{
|
||||
var trojanTcpBound = GetBound("Trojan_TCP.json");
|
||||
trojanTcpBound.port = Trojan_TCP_Port;
|
||||
trojanTcpBound.settings.clients[0].password = parameters.TrojanPassword;
|
||||
trojanTcpBound.settings.fallbacks[0].dest = FullbackPort;
|
||||
baseBound.settings.fallbacks[0] = JToken.FromObject(new
|
||||
{
|
||||
dest = Trojan_TCP_Port,
|
||||
xver = 1,
|
||||
});
|
||||
xrayConfig.inbounds.Add(JToken.FromObject(trojanTcpBound));
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VLESS GRPC
|
||||
if (parameters.Types.Contains(RayType.VLESS_gRPC))
|
||||
{
|
||||
var gRPCInBound = GetBound("VLESS_gRPC.json");
|
||||
gRPCInBound.port = parameters.VLESS_gRPC_Port;
|
||||
SetClients(gRPCInBound, uuidList);
|
||||
gRPCInBound.streamSettings.grpcSettings.serviceName = parameters.VLESS_gRPC_ServiceName;
|
||||
gRPCInBound.streamSettings.tlsSettings.serverName = parameters.Domain;
|
||||
xrayConfig.inbounds.Add(JToken.FromObject(gRPCInBound));
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VLESS KCP
|
||||
if (parameters.Types.Contains(RayType.VLESS_KCP))
|
||||
{
|
||||
var kcpBound = GetBound("VLESS_KCP.json");
|
||||
kcpBound.port = parameters.VLESS_KCP_Port;
|
||||
SetClients(kcpBound, uuidList);
|
||||
kcpBound.streamSettings.kcpSettings.header.type = parameters.VLESS_KCP_Type;
|
||||
kcpBound.streamSettings.kcpSettings.seed = parameters.VLESS_KCP_Seed;
|
||||
xrayConfig.inbounds.Add(JToken.FromObject(kcpBound));
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VLESS QUIC
|
||||
if (parameters.Types.Contains(RayType.VLESS_QUIC))
|
||||
{
|
||||
var quicBound = GetBound("VLESS_QUIC.json");
|
||||
quicBound.port = parameters.VLESS_QUIC_Port;
|
||||
SetClients(quicBound, uuidList);
|
||||
quicBound.streamSettings.quicSettings.security = parameters.VLESS_QUIC_Security;
|
||||
quicBound.streamSettings.quicSettings.key = parameters.VLESS_QUIC_Key;
|
||||
quicBound.streamSettings.quicSettings.header.type = parameters.VLESS_QUIC_Type;
|
||||
xrayConfig.inbounds.Add(JToken.FromObject(quicBound));
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VMESS KCP
|
||||
if (parameters.Types.Contains(RayType.VMESS_KCP))
|
||||
{
|
||||
var kcpBound = GetBound("VMESS_KCP.json");
|
||||
kcpBound.port = parameters.VMESS_KCP_Port;
|
||||
SetClients(kcpBound, uuidList);
|
||||
kcpBound.streamSettings.kcpSettings.header.type = parameters.VMESS_KCP_Type;
|
||||
kcpBound.streamSettings.kcpSettings.seed = parameters.VMESS_KCP_Seed;
|
||||
xrayConfig.inbounds.Add(JToken.FromObject(kcpBound));
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VMESS QUIC
|
||||
if (parameters.Types.Contains(RayType.VMESS_QUIC))
|
||||
{
|
||||
var quicBound = GetBound("VMESS_QUIC.json");
|
||||
quicBound.port = parameters.VMESS_QUIC_Port;
|
||||
SetClients(quicBound, uuidList);
|
||||
quicBound.streamSettings.quicSettings.security = parameters.VMESS_QUIC_Security;
|
||||
quicBound.streamSettings.quicSettings.key = parameters.VMESS_QUIC_Key;
|
||||
quicBound.streamSettings.quicSettings.header.type = parameters.VMESS_QUIC_Type;
|
||||
xrayConfig.inbounds.Add(JToken.FromObject(quicBound));
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Shadowsocks
|
||||
if (parameters.Types.Contains(RayType.ShadowsocksAEAD))
|
||||
{
|
||||
var ssBound = GetBound("Shadowsocks-AEAD.json");
|
||||
ssBound.port = parameters.ShadowSocksPort;
|
||||
ssBound.settings.password = parameters.ShadowSocksPassword;
|
||||
ssBound.settings.method = parameters.ShadowSocksMethod;
|
||||
xrayConfig.inbounds.Add(JToken.FromObject(ssBound));
|
||||
}
|
||||
#endregion
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
449
ProxySuper.Core/Services/V2rayService.cs
Normal file
449
ProxySuper.Core/Services/V2rayService.cs
Normal file
|
@ -0,0 +1,449 @@
|
|||
using Microsoft.Win32;
|
||||
using ProxySuper.Core.Models.Hosts;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using ProxySuper.Core.ViewModels;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
|
||||
namespace ProxySuper.Core.Services
|
||||
{
|
||||
public class V2rayService : ServiceBase<V2raySettings>
|
||||
{
|
||||
public V2rayService(Host host, V2raySettings settings) : base(host, settings)
|
||||
{
|
||||
}
|
||||
|
||||
public void Install()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
int index = 1;
|
||||
EnsureRootUser();
|
||||
|
||||
if (FileExists("/usr/local/bin/v2ray"))
|
||||
{
|
||||
var btnResult = MessageBox.Show("已经安装v2ray,是否需要重装?", "提示", MessageBoxButton.YesNo);
|
||||
if (btnResult == MessageBoxResult.No)
|
||||
{
|
||||
MessageBox.Show("安装终止", "提示");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Progress.Step = $"{index++}. 检测系统环境";
|
||||
EnsureSystemEnv();
|
||||
Progress.Percentage = 5;
|
||||
|
||||
Progress.Step = $"{index++}. 安装必要的系统工具";
|
||||
InstallSystemTools();
|
||||
Progress.Percentage = 15;
|
||||
|
||||
Progress.Step = $"{index++}. 配置防火墙";
|
||||
ConfigFirewalld();
|
||||
Progress.Percentage = 20;
|
||||
|
||||
Progress.Step = $"{index++}. 检测网络环境";
|
||||
EnsureNetwork();
|
||||
if (Settings.IsIPAddress)
|
||||
{
|
||||
Progress.Desc = ("检查域名是否解析正确");
|
||||
ValidateDomain();
|
||||
}
|
||||
Progress.Percentage = 25;
|
||||
|
||||
Progress.Step = $"{index}. 同步系统和本地时间";
|
||||
SyncTimeDiff();
|
||||
Progress.Percentage = 30;
|
||||
|
||||
Progress.Step = $"{index++}. 安装Caddy服务器";
|
||||
InstallCaddy();
|
||||
Progress.Percentage = 50;
|
||||
|
||||
Progress.Step = $"{index++}. 安装V2ray-Core";
|
||||
InstallV2ray();
|
||||
Progress.Percentage = 80;
|
||||
|
||||
Progress.Step = $"{index++}. 上传Web服务器配置";
|
||||
UploadCaddyFile();
|
||||
Progress.Percentage = 90;
|
||||
|
||||
Progress.Step = $"{index++}. 启动BBR";
|
||||
EnableBBR();
|
||||
|
||||
Progress.Desc = "重启V2ray服务";
|
||||
|
||||
RunCmd("systemctl restart caddy");
|
||||
RunCmd("systemctl restart v2ray");
|
||||
|
||||
Progress.Percentage = 100;
|
||||
Progress.Step = "安装成功";
|
||||
Progress.Desc = string.Empty;
|
||||
|
||||
if (!Settings.WithTLS)
|
||||
{
|
||||
Progress.Step = "安装成功,请上传您的 TLS 证书。";
|
||||
}
|
||||
else
|
||||
{
|
||||
NavigationService.Navigate<V2rayConfigViewModel, V2raySettings>(Settings);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void UpdateSettings()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
Progress.Step = "更新V2ray配置";
|
||||
Progress.Percentage = 0;
|
||||
EnsureRootUser();
|
||||
var index = 0;
|
||||
|
||||
Progress.Desc = $"{index++}. 检测系统环境";
|
||||
EnsureSystemEnv();
|
||||
Progress.Percentage = 20;
|
||||
|
||||
Progress.Desc = $"{index++}. 配置防火墙";
|
||||
RunCmd("systemctl stop v2ray");
|
||||
RunCmd("systemctl stop caddy");
|
||||
ConfigFirewalld();
|
||||
Progress.Percentage = 40;
|
||||
|
||||
Progress.Desc = $"{index++}. 上传V2ray配置文件";
|
||||
var configJson = V2rayConfigBuilder.BuildV2rayConfig(Settings);
|
||||
WriteToFile(configJson, "/usr/local/etc/v2ray/config.json");
|
||||
Progress.Percentage = 70;
|
||||
|
||||
Progress.Desc = $"{index++}. 上传Caddy配置文件";
|
||||
UploadCaddyFile();
|
||||
Progress.Percentage = 90;
|
||||
|
||||
Progress.Desc = $"{index++}. 重启v2ray服务";
|
||||
RunCmd("systemctl restart caddy");
|
||||
RunCmd("systemctl restart v2ray");
|
||||
Progress.Percentage = 100;
|
||||
|
||||
Progress.Desc = ("更新配置成功");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void UpdateV2rayCore()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
Progress.Step = "更新V2ray-Core";
|
||||
Progress.Percentage = 0;
|
||||
|
||||
EnsureRootUser();
|
||||
Progress.Percentage = 20;
|
||||
|
||||
Progress.Desc = "下载最新版本V2ray-Core";
|
||||
EnsureSystemEnv();
|
||||
Progress.Percentage = 40;
|
||||
|
||||
RunCmd("bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)");
|
||||
RunCmd("systemctl restart v2ray");
|
||||
Progress.Percentage = 100;
|
||||
|
||||
Progress.Desc = "更新V2ray-Core成功";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void Uninstall()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
EnsureRootUser();
|
||||
|
||||
var index = 1;
|
||||
Progress.Percentage = 0;
|
||||
|
||||
Progress.Step = $"{index++}. 检测系统环境";
|
||||
Progress.Desc = "检测系统环境";
|
||||
EnsureSystemEnv();
|
||||
Progress.Percentage = 20;
|
||||
|
||||
Progress.Step = $"{index++}. 卸载Caddy服务";
|
||||
UninstallCaddy();
|
||||
Progress.Percentage = 40;
|
||||
|
||||
Progress.Step = $"{index++}. 卸载V2ray服务";
|
||||
UninstallV2ray();
|
||||
Progress.Percentage = 60;
|
||||
|
||||
Progress.Step = $"{index++}. 卸载Acme证书申请服务";
|
||||
UninstallAcme();
|
||||
Progress.Percentage = 80;
|
||||
|
||||
Progress.Step = $"{index++}. 重置防火墙端口";
|
||||
ResetFirewalld();
|
||||
Progress.Percentage = 100;
|
||||
|
||||
Progress.Step = "卸载完成";
|
||||
Progress.Desc = "卸载完成";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void UploadCert()
|
||||
{
|
||||
var fileDialog = new OpenFileDialog();
|
||||
fileDialog.Filter = "压缩文件|*.zip";
|
||||
fileDialog.FileOk += DoUploadCert;
|
||||
fileDialog.ShowDialog();
|
||||
}
|
||||
|
||||
public void UploadWeb()
|
||||
{
|
||||
var fileDialog = new OpenFileDialog();
|
||||
fileDialog.Filter = "压缩文件|*.zip";
|
||||
fileDialog.FileOk += DoUploadWeb;
|
||||
fileDialog.ShowDialog();
|
||||
}
|
||||
|
||||
public void ApplyForCert()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
Progress.Percentage = 0;
|
||||
Progress.Step = "续签证书";
|
||||
|
||||
Progress.Desc = "检测系统环境";
|
||||
EnsureRootUser();
|
||||
EnsureSystemEnv();
|
||||
|
||||
Progress.Desc = "安装证书";
|
||||
InstallCert(
|
||||
dirPath: "/usr/local/etc/v2ray/ssl",
|
||||
certName: "v2ray_ssl.crt",
|
||||
keyName: "v2ray_ssl.key");
|
||||
|
||||
Progress.Percentage = 90;
|
||||
Progress.Desc = "重启服务";
|
||||
RunCmd("systemctl restart v2ray");
|
||||
|
||||
Progress.Percentage = 100;
|
||||
Progress.Desc = "续签证书成功";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
#region 似有方法
|
||||
|
||||
private void DoUploadCert(object sender, CancelEventArgs e)
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
EnsureRootUser();
|
||||
|
||||
Progress.Percentage = 0;
|
||||
Progress.Step = "上传自有证书";
|
||||
Progress.Desc = "检测系统环境";
|
||||
|
||||
EnsureSystemEnv();
|
||||
Progress.Percentage = 20;
|
||||
|
||||
Progress.Desc = "正在上传文件";
|
||||
var file = sender as OpenFileDialog;
|
||||
using (var stream = file.OpenFile())
|
||||
{
|
||||
var oldFileName = $"ssl_{DateTime.Now.Ticks}";
|
||||
RunCmd($"mv /usr/local/etc/v2ray/ssl /usr/local/etc/v2ray/{oldFileName}");
|
||||
|
||||
RunCmd("mkdir /usr/local/etc/v2ray/ssl");
|
||||
UploadFile(stream, "/usr/local/etc/v2ray/ssl/ssl.zip");
|
||||
RunCmd("unzip /usr/local/etc/v2ray/ssl/ssl.zip -d /usr/local/etc/v2ray/ssl");
|
||||
}
|
||||
|
||||
var crtFiles = RunCmd("find /usr/local/etc/v2ray/ssl/*.crt").Split("\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
|
||||
var keyFiles = RunCmd("find /usr/local/etc/v2ray/ssl/*.key").Split("\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
|
||||
if (crtFiles.Length > 0 && keyFiles.Length > 0)
|
||||
{
|
||||
RunCmd($"mv {crtFiles[0]} /usr/local/etc/v2ray/ssl/v2ray_ssl.crt");
|
||||
RunCmd($"mv {keyFiles[0]} /usr/local/etc/v2ray/ssl/v2ray_ssl.key");
|
||||
}
|
||||
else
|
||||
{
|
||||
Progress.Step = "上传失败";
|
||||
Progress.Desc = "上传证书失败,缺少 .crt 和 .key 文件";
|
||||
return;
|
||||
}
|
||||
|
||||
Progress.Desc = "重启V2ray服务";
|
||||
RunCmd("systemctl restart v2ray");
|
||||
|
||||
Progress.Percentage = 100;
|
||||
Progress.Desc = "上传证书完成";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void DoUploadWeb(object sender, CancelEventArgs e)
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
EnsureRootUser();
|
||||
|
||||
Progress.Step = "上传静态网站";
|
||||
Progress.Desc = "上传静态网站";
|
||||
Progress.Percentage = 0;
|
||||
|
||||
Progress.Desc = "检测系统环境";
|
||||
EnsureSystemEnv();
|
||||
Progress.Percentage = 20;
|
||||
|
||||
Progress.Desc = "创建网站目录";
|
||||
if (!FileExists("/usr/share/caddy"))
|
||||
{
|
||||
RunCmd("mkdir /usr/share/caddy");
|
||||
}
|
||||
RunCmd("rm -rf /usr/share/caddy/*");
|
||||
Progress.Percentage = 40;
|
||||
|
||||
Progress.Desc = "正在上传文件";
|
||||
var file = sender as OpenFileDialog;
|
||||
using (var stream = file.OpenFile())
|
||||
{
|
||||
UploadFile(stream, "/usr/share/caddy/caddy.zip");
|
||||
RunCmd("unzip /usr/share/caddy/caddy.zip -d /usr/share/caddy");
|
||||
}
|
||||
RunCmd("chmod -R 777 /usr/share/caddy");
|
||||
Progress.Percentage = 80;
|
||||
|
||||
Progress.Desc = "上传Web配置文件";
|
||||
UploadCaddyFile(useCustomWeb: true);
|
||||
Progress.Percentage = 90;
|
||||
|
||||
Progress.Desc = "重启caddy服务";
|
||||
RunCmd("systemctl restart caddy");
|
||||
Progress.Percentage = 100;
|
||||
|
||||
Progress.Desc = "上传静态网站成功";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void InstallV2ray()
|
||||
{
|
||||
Progress.Desc = ("开始安装V2ray-Core");
|
||||
RunCmd("bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)");
|
||||
|
||||
if (!FileExists("/usr/local/bin/v2ray"))
|
||||
{
|
||||
Progress.Desc = ("V2ray-Core安装失败,请联系开发者");
|
||||
throw new Exception("V2ray-Core安装失败,请联系开发者");
|
||||
}
|
||||
|
||||
Progress.Desc = ("设置V2ray-Core权限");
|
||||
RunCmd($"sed -i 's/User=nobody/User=root/g' /etc/systemd/system/v2ray.service");
|
||||
RunCmd($"sed -i 's/CapabilityBoundingSet=/#CapabilityBoundingSet=/g' /etc/systemd/system/v2ray.service");
|
||||
RunCmd($"sed -i 's/AmbientCapabilities=/#AmbientCapabilities=/g' /etc/systemd/system/v2ray.service");
|
||||
RunCmd($"systemctl daemon-reload");
|
||||
RunCmd("systemctl enable v2ray");
|
||||
|
||||
if (FileExists("/usr/local/etc/v2ray/config.json"))
|
||||
{
|
||||
RunCmd(@"mv /usr/local/etc/v2ray/config.json /usr/local/etc/v2ray/config.json.1");
|
||||
}
|
||||
Progress.Percentage = 60;
|
||||
|
||||
if (Settings.WithTLS && !Settings.IsIPAddress)
|
||||
{
|
||||
Progress.Desc = ("安装TLS证书");
|
||||
InstallCert(
|
||||
dirPath: "/usr/local/etc/v2ray/ssl",
|
||||
certName: "v2ray_ssl.crt",
|
||||
keyName: "v2ray_ssl.key");
|
||||
Progress.Percentage = 75;
|
||||
}
|
||||
|
||||
Progress.Desc = ("生成v2ray服务器配置文件");
|
||||
var configJson = V2rayConfigBuilder.BuildV2rayConfig(Settings);
|
||||
WriteToFile(configJson, "/usr/local/etc/v2ray/config.json");
|
||||
}
|
||||
|
||||
private void UploadCaddyFile(bool useCustomWeb = false)
|
||||
{
|
||||
var configJson = V2rayConfigBuilder.BuildCaddyConfig(Settings, useCustomWeb);
|
||||
|
||||
if (FileExists("/etc/caddy/Caddyfile"))
|
||||
{
|
||||
RunCmd("mv /etc/caddy/Caddyfile /etc/caddy/Caddyfile.back");
|
||||
}
|
||||
WriteToFile(configJson, "/etc/caddy/Caddyfile");
|
||||
}
|
||||
|
||||
|
||||
private void UninstallV2ray()
|
||||
{
|
||||
Progress.Desc = "关闭V2ray服务";
|
||||
RunCmd("systemctl stop v2ray");
|
||||
RunCmd("systemctl disable v2ray");
|
||||
|
||||
Progress.Desc = "卸载V2ray";
|
||||
RunCmd("bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh) --remove");
|
||||
}
|
||||
|
||||
private void UninstallAcme()
|
||||
{
|
||||
Progress.Desc = "卸载 acme.sh";
|
||||
RunCmd("acme.sh --uninstall");
|
||||
|
||||
Progress.Desc = "删除 acme.sh 相关文件";
|
||||
RunCmd("rm -rf ~/.acme.sh");
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
293
ProxySuper.Core/Services/XrayConfigBuilder.cs
Normal file
293
ProxySuper.Core/Services/XrayConfigBuilder.cs
Normal file
|
@ -0,0 +1,293 @@
|
|||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
|
||||
namespace ProxySuper.Core.Services
|
||||
{
|
||||
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 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.IsIPAddress ? "" : parameters.Domain);
|
||||
caddyStr = caddyStr.Replace("##port##", FullbackPort.ToString());
|
||||
|
||||
if (!useCustomWeb && !string.IsNullOrEmpty(parameters.MaskDomain))
|
||||
{
|
||||
var prefix = "http://";
|
||||
if (parameters.MaskDomain.StartsWith("https://"))
|
||||
{
|
||||
prefix = "https://";
|
||||
}
|
||||
var domain = parameters.MaskDomain
|
||||
.TrimStart("http://".ToCharArray())
|
||||
.TrimStart("https://".ToCharArray())
|
||||
.TrimEnd('/');
|
||||
|
||||
caddyStr = caddyStr.Replace("##reverse_proxy##", $"reverse_proxy {prefix}{domain} {{ \n header_up Host {domain} \n }}");
|
||||
}
|
||||
else
|
||||
{
|
||||
caddyStr = caddyStr.Replace("##reverse_proxy##", "");
|
||||
}
|
||||
|
||||
return caddyStr;
|
||||
}
|
||||
|
||||
private static void SetClients(dynamic bound, List<string> uuidList, bool withXtls = false, string flow = "")
|
||||
{
|
||||
bound.settings.clients.Clear();
|
||||
uuidList.ForEach(id =>
|
||||
{
|
||||
object obj;
|
||||
if (!withXtls)
|
||||
{
|
||||
obj = new { id = id };
|
||||
}
|
||||
else
|
||||
{
|
||||
flow = "xtls-rprx-vision";//兼容普通tls与xtls
|
||||
obj = new { id = id, flow = flow };
|
||||
}
|
||||
|
||||
bound.settings.clients.Add(JToken.FromObject(obj));
|
||||
});
|
||||
}
|
||||
|
||||
public static string BuildXrayConfig(XraySettings parameters)
|
||||
{
|
||||
var uuidList = new List<string>();
|
||||
uuidList.Add(parameters.UUID);
|
||||
uuidList.AddRange(parameters.MulitUUID);
|
||||
|
||||
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);
|
||||
SetClients(baseBound, uuidList, withXtls: true, flow: parameters.Flow);
|
||||
|
||||
#region Fullbacks
|
||||
|
||||
if (parameters.Types.Contains(RayType.VLESS_WS))
|
||||
{
|
||||
var wsInbound = GetBound("VLESS_WS.json");
|
||||
wsInbound.port = VLESS_WS_Port;
|
||||
SetClients(wsInbound, uuidList);
|
||||
wsInbound.streamSettings.wsSettings.path = parameters.VLESS_WS_Path;
|
||||
baseBound.settings.fallbacks.Add(JToken.FromObject(new
|
||||
{
|
||||
dest = VLESS_WS_Port,
|
||||
path = parameters.VLESS_WS_Path,
|
||||
xver = 1,
|
||||
}));
|
||||
xrayConfig.inbounds.Add(JToken.FromObject(wsInbound));
|
||||
}
|
||||
|
||||
if (parameters.Types.Contains(RayType.VMESS_TCP))
|
||||
{
|
||||
var mtcpBound = GetBound("VMESS_TCP.json");
|
||||
mtcpBound.port = VMESS_TCP_Port;
|
||||
SetClients(mtcpBound, uuidList);
|
||||
mtcpBound.streamSettings.tcpSettings.header.request.path = parameters.VMESS_TCP_Path;
|
||||
baseBound.settings.fallbacks.Add(JToken.FromObject(new
|
||||
{
|
||||
dest = VMESS_TCP_Port,
|
||||
path = parameters.VMESS_TCP_Path,
|
||||
xver = 1,
|
||||
}));
|
||||
xrayConfig.inbounds.Add(JToken.FromObject(mtcpBound));
|
||||
}
|
||||
|
||||
if (parameters.Types.Contains(RayType.VMESS_WS))
|
||||
{
|
||||
var mwsBound = GetBound("VMESS_WS.json");
|
||||
mwsBound.port = VMESS_WS_Port;
|
||||
SetClients(mwsBound, uuidList);
|
||||
mwsBound.streamSettings.wsSettings.path = parameters.VMESS_WS_Path;
|
||||
baseBound.settings.fallbacks.Add(JToken.FromObject(new
|
||||
{
|
||||
dest = VMESS_WS_Port,
|
||||
path = parameters.VMESS_WS_Path,
|
||||
xver = 1,
|
||||
}));
|
||||
xrayConfig.inbounds.Add(JToken.FromObject(mwsBound));
|
||||
}
|
||||
|
||||
if (parameters.Types.Contains(RayType.Trojan_TCP))
|
||||
{
|
||||
var trojanTcpBound = GetBound("Trojan_TCP.json");
|
||||
trojanTcpBound.port = Trojan_TCP_Port;
|
||||
trojanTcpBound.settings.clients[0].password = parameters.TrojanPassword;
|
||||
trojanTcpBound.settings.fallbacks[0].dest = FullbackPort;
|
||||
baseBound.settings.fallbacks[0] = JToken.FromObject(new
|
||||
{
|
||||
dest = Trojan_TCP_Port,
|
||||
xver = 1,
|
||||
});
|
||||
xrayConfig.inbounds.Add(JToken.FromObject(trojanTcpBound));
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VLESS GRPC
|
||||
if (parameters.Types.Contains(RayType.VLESS_gRPC))
|
||||
{
|
||||
var gRPCInBound = GetBound("VLESS_gRPC.json");
|
||||
gRPCInBound.port = parameters.VLESS_gRPC_Port;
|
||||
SetClients(gRPCInBound, uuidList);
|
||||
gRPCInBound.streamSettings.grpcSettings.serviceName = parameters.VLESS_gRPC_ServiceName;
|
||||
gRPCInBound.streamSettings.tlsSettings.serverName = parameters.Domain;
|
||||
xrayConfig.inbounds.Add(JToken.FromObject(gRPCInBound));
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VLESS KCP
|
||||
if (parameters.Types.Contains(RayType.VLESS_KCP))
|
||||
{
|
||||
var kcpBound = GetBound("VLESS_KCP.json");
|
||||
kcpBound.port = parameters.VLESS_KCP_Port;
|
||||
SetClients(kcpBound, uuidList);
|
||||
kcpBound.streamSettings.kcpSettings.header.type = parameters.VLESS_KCP_Type;
|
||||
kcpBound.streamSettings.kcpSettings.seed = parameters.VLESS_KCP_Seed;
|
||||
xrayConfig.inbounds.Add(JToken.FromObject(kcpBound));
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VLESS QUIC
|
||||
if (parameters.Types.Contains(RayType.VLESS_QUIC))
|
||||
{
|
||||
var quicBound = GetBound("VLESS_QUIC.json");
|
||||
quicBound.port = parameters.VLESS_QUIC_Port;
|
||||
SetClients(quicBound, uuidList);
|
||||
quicBound.streamSettings.quicSettings.security = parameters.VLESS_QUIC_Security;
|
||||
quicBound.streamSettings.quicSettings.key = parameters.VLESS_QUIC_Key;
|
||||
quicBound.streamSettings.quicSettings.header.type = parameters.VLESS_QUIC_Type;
|
||||
xrayConfig.inbounds.Add(JToken.FromObject(quicBound));
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VMESS KCP
|
||||
if (parameters.Types.Contains(RayType.VMESS_KCP))
|
||||
{
|
||||
var kcpBound = GetBound("VMESS_KCP.json");
|
||||
kcpBound.port = parameters.VMESS_KCP_Port;
|
||||
SetClients(kcpBound, uuidList);
|
||||
kcpBound.streamSettings.kcpSettings.header.type = parameters.VMESS_KCP_Type;
|
||||
kcpBound.streamSettings.kcpSettings.seed = parameters.VMESS_KCP_Seed;
|
||||
xrayConfig.inbounds.Add(JToken.FromObject(kcpBound));
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VMESS QUIC
|
||||
if (parameters.Types.Contains(RayType.VMESS_QUIC))
|
||||
{
|
||||
var quicBound = GetBound("VMESS_QUIC.json");
|
||||
quicBound.port = parameters.VMESS_QUIC_Port;
|
||||
SetClients(quicBound, uuidList);
|
||||
quicBound.streamSettings.quicSettings.security = parameters.VMESS_QUIC_Security;
|
||||
quicBound.streamSettings.quicSettings.key = parameters.VMESS_QUIC_Key;
|
||||
quicBound.streamSettings.quicSettings.header.type = parameters.VMESS_QUIC_Type;
|
||||
xrayConfig.inbounds.Add(JToken.FromObject(quicBound));
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Shadowsocks
|
||||
if (parameters.Types.Contains(RayType.ShadowsocksAEAD))
|
||||
{
|
||||
var ssBound = GetBound("Shadowsocks-AEAD.json");
|
||||
ssBound.port = parameters.ShadowSocksPort;
|
||||
ssBound.settings.password = parameters.ShadowSocksPassword;
|
||||
ssBound.settings.method = parameters.ShadowSocksMethod;
|
||||
xrayConfig.inbounds.Add(JToken.FromObject(ssBound));
|
||||
}
|
||||
#endregion
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
448
ProxySuper.Core/Services/XrayService.cs
Normal file
448
ProxySuper.Core/Services/XrayService.cs
Normal file
|
@ -0,0 +1,448 @@
|
|||
using Microsoft.Win32;
|
||||
using ProxySuper.Core.Helpers;
|
||||
using ProxySuper.Core.Models.Hosts;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using ProxySuper.Core.ViewModels;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
|
||||
namespace ProxySuper.Core.Services
|
||||
{
|
||||
public class XrayService : ServiceBase<XraySettings>
|
||||
{
|
||||
|
||||
public XrayService(Host host, XraySettings settings) : base(host, settings)
|
||||
{
|
||||
}
|
||||
|
||||
public void Install()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
int index = 1;
|
||||
EnsureRootUser();
|
||||
|
||||
if (FileExists("/usr/local/bin/xray"))
|
||||
{
|
||||
var btnResult = MessageBox.Show("已经安装Xray,是否需要重装?", "提示", MessageBoxButton.YesNo);
|
||||
if (btnResult == MessageBoxResult.No)
|
||||
{
|
||||
MessageBox.Show("安装终止", "提示");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Progress.Step = $"{index++}. 检测系统环境";
|
||||
EnsureSystemEnv();
|
||||
Progress.Percentage = 5;
|
||||
|
||||
Progress.Step = $"{index++}. 安装必要的系统工具";
|
||||
InstallSystemTools();
|
||||
Progress.Percentage = 15;
|
||||
|
||||
Progress.Step = $"{index++}. 配置防火墙";
|
||||
ConfigFirewalld();
|
||||
Progress.Percentage = 20;
|
||||
|
||||
Progress.Step = $"{index++}. 检测网络环境";
|
||||
EnsureNetwork();
|
||||
if (Settings.IsIPAddress)
|
||||
{
|
||||
Progress.Desc = ("检查域名是否解析正确");
|
||||
ValidateDomain();
|
||||
}
|
||||
Progress.Percentage = 25;
|
||||
|
||||
Progress.Step = $"{index}. 同步系统和本地时间";
|
||||
SyncTimeDiff();
|
||||
Progress.Percentage = 30;
|
||||
|
||||
Progress.Step = $"{index++}. 安装Caddy服务器";
|
||||
InstallCaddy();
|
||||
Progress.Percentage = 50;
|
||||
|
||||
Progress.Step = $"{index++}. 安装Xray-Core";
|
||||
InstallXray();
|
||||
Progress.Percentage = 80;
|
||||
|
||||
Progress.Step = $"{index++}. 上传Web服务器配置";
|
||||
UploadCaddyFile();
|
||||
Progress.Percentage = 90;
|
||||
|
||||
Progress.Step = $"{index++}. 启动BBR";
|
||||
EnableBBR();
|
||||
|
||||
Progress.Desc = "重启Xray服务";
|
||||
RunCmd("systemctl restart caddy");
|
||||
RunCmd("systemctl restart xray");
|
||||
|
||||
Progress.Percentage = 100;
|
||||
Progress.Step = "安装成功";
|
||||
Progress.Desc = string.Empty;
|
||||
|
||||
if (!Settings.WithTLS)
|
||||
{
|
||||
Progress.Step = "安装成功,请上传您的 TLS 证书。";
|
||||
}
|
||||
else
|
||||
{
|
||||
NavigationService.Navigate<XrayConfigViewModel, XraySettings>(Settings);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void UpdateSettings()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
Progress.Step = "更新Xray配置";
|
||||
Progress.Percentage = 0;
|
||||
EnsureRootUser();
|
||||
var index = 0;
|
||||
|
||||
Progress.Desc = $"{index++}. 检测系统环境";
|
||||
EnsureSystemEnv();
|
||||
Progress.Percentage = 20;
|
||||
|
||||
Progress.Desc = $"{index++}. 配置防火墙";
|
||||
RunCmd("systemctl stop xray");
|
||||
RunCmd("systemctl stop caddy");
|
||||
ConfigFirewalld();
|
||||
Progress.Percentage = 40;
|
||||
|
||||
Progress.Desc = $"{index++}. 上传Xray配置文件";
|
||||
var configJson = XrayConfigBuilder.BuildXrayConfig(Settings);
|
||||
WriteToFile(configJson, "/usr/local/etc/xray/config.json");
|
||||
Progress.Percentage = 70;
|
||||
|
||||
Progress.Desc = $"{index++}. 上传Caddy配置文件";
|
||||
UploadCaddyFile();
|
||||
Progress.Percentage = 90;
|
||||
|
||||
Progress.Desc = $"{index++}. 重启xray服务";
|
||||
RunCmd("systemctl restart caddy");
|
||||
RunCmd("systemctl restart xray");
|
||||
Progress.Percentage = 100;
|
||||
|
||||
Progress.Desc = ("更新配置成功");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void UpdateXrayCore()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
Progress.Step = "更新Xray-Core";
|
||||
Progress.Percentage = 0;
|
||||
|
||||
EnsureRootUser();
|
||||
Progress.Percentage = 20;
|
||||
|
||||
Progress.Desc = "下载最新版本Xray-Core";
|
||||
EnsureSystemEnv();
|
||||
Progress.Percentage = 40;
|
||||
|
||||
RunCmd("bash -c \"$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)\" @ install");
|
||||
RunCmd("systemctl restart xray");
|
||||
Progress.Percentage = 100;
|
||||
|
||||
Progress.Desc = "更新Xray-Core成功";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void Uninstall()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
EnsureRootUser();
|
||||
|
||||
var index = 1;
|
||||
Progress.Percentage = 0;
|
||||
|
||||
Progress.Step = $"{index++}. 检测系统环境";
|
||||
Progress.Desc = "检测系统环境";
|
||||
EnsureSystemEnv();
|
||||
Progress.Percentage = 20;
|
||||
|
||||
Progress.Step = $"{index++}. 卸载Caddy服务";
|
||||
UninstallCaddy();
|
||||
Progress.Percentage = 40;
|
||||
|
||||
Progress.Step = $"{index++}. 卸载Xray服务";
|
||||
UninstallXray();
|
||||
Progress.Percentage = 60;
|
||||
|
||||
Progress.Step = $"{index++}. 卸载Acme证书申请服务";
|
||||
UninstallAcme();
|
||||
Progress.Percentage = 80;
|
||||
|
||||
Progress.Step = $"{index++}. 重置防火墙端口";
|
||||
ResetFirewalld();
|
||||
Progress.Percentage = 100;
|
||||
|
||||
Progress.Step = "卸载完成";
|
||||
Progress.Desc = "卸载完成";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void UploadCert()
|
||||
{
|
||||
var fileDialog = new OpenFileDialog();
|
||||
fileDialog.Filter = "压缩文件|*.zip";
|
||||
fileDialog.FileOk += DoUploadCert;
|
||||
fileDialog.ShowDialog();
|
||||
}
|
||||
|
||||
public void UploadWeb()
|
||||
{
|
||||
var fileDialog = new OpenFileDialog();
|
||||
fileDialog.Filter = "压缩文件|*.zip";
|
||||
fileDialog.FileOk += DoUploadWeb;
|
||||
fileDialog.ShowDialog();
|
||||
}
|
||||
|
||||
public void ApplyForCert()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
Progress.Percentage = 0;
|
||||
Progress.Step = "续签证书";
|
||||
|
||||
Progress.Desc = "检测系统环境";
|
||||
EnsureRootUser();
|
||||
EnsureSystemEnv();
|
||||
|
||||
Progress.Desc = "安装证书";
|
||||
InstallCert(
|
||||
dirPath: "/usr/local/etc/xray/ssl",
|
||||
certName: "xray_ssl.crt",
|
||||
keyName: "xray_ssl.key");
|
||||
|
||||
Progress.Percentage = 90;
|
||||
Progress.Desc = "重启服务";
|
||||
RunCmd("systemctl restart xray");
|
||||
|
||||
Progress.Percentage = 100;
|
||||
Progress.Desc = "续签证书成功";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
#region 私有方法
|
||||
|
||||
private void DoUploadCert(object sender, CancelEventArgs e)
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
EnsureRootUser();
|
||||
|
||||
Progress.Percentage = 0;
|
||||
Progress.Step = "上传自有证书";
|
||||
Progress.Desc = "检测系统环境";
|
||||
|
||||
EnsureSystemEnv();
|
||||
Progress.Percentage = 20;
|
||||
|
||||
Progress.Desc = "正在上传文件";
|
||||
var file = sender as OpenFileDialog;
|
||||
using (var stream = file.OpenFile())
|
||||
{
|
||||
var oldFileName = $"ssl_{DateTime.Now.Ticks}";
|
||||
RunCmd($"mv /usr/local/etc/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);
|
||||
var keyFiles = RunCmd("find /usr/local/etc/xray/ssl/*.key").Split("\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
|
||||
if (crtFiles.Length > 0 && keyFiles.Length > 0)
|
||||
{
|
||||
RunCmd($"mv {crtFiles[0]} /usr/local/etc/xray/ssl/xray_ssl.crt");
|
||||
RunCmd($"mv {keyFiles[0]} /usr/local/etc/xray/ssl/xray_ssl.key");
|
||||
}
|
||||
else
|
||||
{
|
||||
Progress.Step = "上传失败";
|
||||
Progress.Desc = "上传证书失败,缺少 .crt 和 .key 文件";
|
||||
return;
|
||||
}
|
||||
|
||||
Progress.Desc = "重启Xray服务";
|
||||
RunCmd("systemctl restart xray");
|
||||
|
||||
Progress.Percentage = 100;
|
||||
Progress.Desc = "上传证书完成";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void DoUploadWeb(object sender, CancelEventArgs e)
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
EnsureRootUser();
|
||||
|
||||
Progress.Step = "上传静态网站";
|
||||
Progress.Desc = "上传静态网站";
|
||||
Progress.Percentage = 0;
|
||||
|
||||
Progress.Desc = "检测系统环境";
|
||||
EnsureSystemEnv();
|
||||
Progress.Percentage = 20;
|
||||
|
||||
Progress.Desc = "创建网站目录";
|
||||
if (!FileExists("/usr/share/caddy"))
|
||||
{
|
||||
RunCmd("mkdir /usr/share/caddy");
|
||||
}
|
||||
RunCmd("rm -rf /usr/share/caddy/*");
|
||||
Progress.Percentage = 40;
|
||||
|
||||
Progress.Desc = "正在上传文件";
|
||||
var file = sender as OpenFileDialog;
|
||||
using (var stream = file.OpenFile())
|
||||
{
|
||||
UploadFile(stream, "/usr/share/caddy/caddy.zip");
|
||||
RunCmd("unzip /usr/share/caddy/caddy.zip -d /usr/share/caddy");
|
||||
}
|
||||
RunCmd("chmod -R 777 /usr/share/caddy");
|
||||
Progress.Percentage = 80;
|
||||
|
||||
Progress.Desc = "上传Web配置文件";
|
||||
UploadCaddyFile(useCustomWeb: true);
|
||||
Progress.Percentage = 90;
|
||||
|
||||
Progress.Desc = "重启caddy服务";
|
||||
RunCmd("systemctl restart caddy");
|
||||
Progress.Percentage = 100;
|
||||
|
||||
Progress.Desc = "上传静态网站成功";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void InstallXray()
|
||||
{
|
||||
Progress.Desc = ("开始安装Xray-Core");
|
||||
RunCmd("bash -c \"$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)\" @ install");
|
||||
|
||||
if (!FileExists("/usr/local/bin/xray"))
|
||||
{
|
||||
Progress.Desc = ("Xray-Core安装失败,请联系开发者");
|
||||
throw new Exception("Xray-Core安装失败,请联系开发者");
|
||||
}
|
||||
|
||||
Progress.Desc = ("设置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");
|
||||
}
|
||||
Progress.Percentage = 60;
|
||||
|
||||
if (Settings.WithTLS && !Settings.IsIPAddress)
|
||||
{
|
||||
Progress.Desc = ("安装TLS证书");
|
||||
InstallCert(
|
||||
dirPath: "/usr/local/etc/xray/ssl",
|
||||
certName: "xray_ssl.crt",
|
||||
keyName: "xray_ssl.key");
|
||||
Progress.Percentage = 75;
|
||||
}
|
||||
|
||||
Progress.Desc = ("生成Xray服务器配置文件");
|
||||
var configJson = XrayConfigBuilder.BuildXrayConfig(Settings);
|
||||
WriteToFile(configJson, "/usr/local/etc/xray/config.json");
|
||||
}
|
||||
|
||||
private void UploadCaddyFile(bool useCustomWeb = false)
|
||||
{
|
||||
var configJson = XrayConfigBuilder.BuildCaddyConfig(Settings, useCustomWeb);
|
||||
|
||||
if (FileExists("/etc/caddy/Caddyfile"))
|
||||
{
|
||||
RunCmd("mv /etc/caddy/Caddyfile /etc/caddy/Caddyfile.back");
|
||||
}
|
||||
WriteToFile(configJson, "/etc/caddy/Caddyfile");
|
||||
}
|
||||
|
||||
private void UninstallXray()
|
||||
{
|
||||
Progress.Desc = "关闭Xray服务";
|
||||
RunCmd("systemctl stop xray");
|
||||
RunCmd("systemctl disable xray");
|
||||
|
||||
Progress.Desc = "卸载Xray";
|
||||
RunCmd("bash -c \"$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)\" @ remove");
|
||||
}
|
||||
|
||||
private void UninstallAcme()
|
||||
{
|
||||
Progress.Desc = "卸载 acme.sh";
|
||||
RunCmd("acme.sh --uninstall");
|
||||
|
||||
Progress.Desc = "删除 acme.sh 相关文件";
|
||||
RunCmd("rm -rf ~/.acme.sh");
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
24
ProxySuper.Core/ViewModels/BrookConfigViewModel.cs
Normal file
24
ProxySuper.Core/ViewModels/BrookConfigViewModel.cs
Normal file
|
@ -0,0 +1,24 @@
|
|||
using MvvmCross.ViewModels;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using ProxySuper.Core.Services;
|
||||
|
||||
namespace ProxySuper.Core.ViewModels
|
||||
{
|
||||
public class BrookConfigViewModel : MvxViewModel<BrookSettings>
|
||||
{
|
||||
public BrookSettings Settings { get; set; }
|
||||
|
||||
public override void Prepare(BrookSettings parameter)
|
||||
{
|
||||
Settings = parameter;
|
||||
}
|
||||
|
||||
public string Link
|
||||
{
|
||||
get
|
||||
{
|
||||
return ShareLink.BuildBrook(Settings);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
102
ProxySuper.Core/ViewModels/BrookEditorViewModel.cs
Normal file
102
ProxySuper.Core/ViewModels/BrookEditorViewModel.cs
Normal file
|
@ -0,0 +1,102 @@
|
|||
using MvvmCross.Commands;
|
||||
using MvvmCross.Navigation;
|
||||
using MvvmCross.ViewModels;
|
||||
using ProxySuper.Core.Models;
|
||||
using ProxySuper.Core.Models.Hosts;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using ProxySuper.Core.Services;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace ProxySuper.Core.ViewModels
|
||||
{
|
||||
public class BrookEditorViewModel : MvxViewModel<Record, Record>
|
||||
{
|
||||
public BrookEditorViewModel(IMvxNavigationService navigationService)
|
||||
{
|
||||
NavigationService = navigationService;
|
||||
}
|
||||
|
||||
public IMvxNavigationService NavigationService { get; }
|
||||
|
||||
public string Id { get; set; }
|
||||
|
||||
public Host Host { get; set; }
|
||||
|
||||
public BrookSettings Settings { get; set; }
|
||||
|
||||
public List<string> BrookTypes
|
||||
{
|
||||
get
|
||||
{
|
||||
return new List<string> {
|
||||
BrookType.server.ToString(),
|
||||
BrookType.wsserver.ToString(),
|
||||
BrookType.wssserver.ToString(),
|
||||
BrookType.socks5.ToString(),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public string CheckedBrookType
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.BrookType.ToString();
|
||||
}
|
||||
set
|
||||
{
|
||||
Settings.BrookType = (BrookType)Enum.Parse(typeof(BrookType), value);
|
||||
|
||||
if (Settings.BrookType == BrookType.wssserver)
|
||||
{
|
||||
Settings.Port = 443;
|
||||
RaisePropertyChanged("Settings");
|
||||
}
|
||||
RaisePropertyChanged("EnablePort");
|
||||
RaisePropertyChanged("EnableDomain");
|
||||
RaisePropertyChanged("EnableIP");
|
||||
}
|
||||
}
|
||||
|
||||
public bool EnablePort => Settings.BrookType != BrookType.wssserver;
|
||||
|
||||
public bool EnableDomain => Settings.BrookType == BrookType.wssserver;
|
||||
|
||||
public bool EnableIP => Settings.BrookType != BrookType.wssserver;
|
||||
|
||||
public IMvxCommand SaveCommand => new MvxCommand(() => Save());
|
||||
|
||||
public IMvxCommand SaveAndInstallCommand => new MvxCommand(SaveAndInstall);
|
||||
|
||||
public override void Prepare(Record parameter)
|
||||
{
|
||||
var record = Utils.DeepClone(parameter);
|
||||
Id = record.Id;
|
||||
Host = record.Host;
|
||||
Settings = record.BrookSettings;
|
||||
}
|
||||
|
||||
public void Save()
|
||||
{
|
||||
NavigationService.Close(this, new Record()
|
||||
{
|
||||
Id = Id,
|
||||
Host = Host,
|
||||
BrookSettings = Settings,
|
||||
});
|
||||
}
|
||||
|
||||
private void SaveAndInstall()
|
||||
{
|
||||
var record = new Record
|
||||
{
|
||||
Id = this.Id,
|
||||
Host = this.Host,
|
||||
BrookSettings = Settings,
|
||||
};
|
||||
NavigationService.Close(this, record);
|
||||
NavigationService.Navigate<BrookInstallViewModel, Record>(record);
|
||||
}
|
||||
}
|
||||
}
|
65
ProxySuper.Core/ViewModels/BrookInstallViewModel.cs
Normal file
65
ProxySuper.Core/ViewModels/BrookInstallViewModel.cs
Normal file
|
@ -0,0 +1,65 @@
|
|||
using MvvmCross.Commands;
|
||||
using MvvmCross.ViewModels;
|
||||
using ProxySuper.Core.Models;
|
||||
using ProxySuper.Core.Models.Hosts;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using ProxySuper.Core.Services;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySuper.Core.ViewModels
|
||||
{
|
||||
public class BrookInstallViewModel : MvxViewModel<Record>
|
||||
{
|
||||
Host _host;
|
||||
|
||||
BrookSettings _settings;
|
||||
|
||||
BrookService _service;
|
||||
|
||||
public override void Prepare(Record parameter)
|
||||
{
|
||||
_host = parameter.Host;
|
||||
_settings = parameter.BrookSettings;
|
||||
}
|
||||
|
||||
public override Task Initialize()
|
||||
{
|
||||
_service = new BrookService(_host, _settings);
|
||||
_service.Progress.StepUpdate = () => RaisePropertyChanged("Progress");
|
||||
_service.Progress.LogsUpdate = () => RaisePropertyChanged("Logs");
|
||||
_service.Connect();
|
||||
return base.Initialize();
|
||||
}
|
||||
|
||||
public override void ViewDestroy(bool viewFinishing = true)
|
||||
{
|
||||
_service.Disconnect();
|
||||
this.SaveInstallLog();
|
||||
base.ViewDestroy(viewFinishing);
|
||||
}
|
||||
|
||||
public ProjectProgress Progress => _service.Progress;
|
||||
|
||||
public string Logs => _service.Progress.Logs;
|
||||
|
||||
public IMvxCommand InstallCommand => new MvxCommand(_service.Install);
|
||||
|
||||
public IMvxCommand UninstallCommand => new MvxCommand(_service.Uninstall);
|
||||
|
||||
private void SaveInstallLog()
|
||||
{
|
||||
if (!Directory.Exists("Logs"))
|
||||
{
|
||||
Directory.CreateDirectory("Logs");
|
||||
}
|
||||
|
||||
var fileName = System.IO.Path.Combine("Logs", DateTime.Now.ToString("yyyy-MM-dd hh-mm") + ".brook.txt");
|
||||
File.WriteAllText(fileName, Logs);
|
||||
}
|
||||
}
|
||||
}
|
168
ProxySuper.Core/ViewModels/EnableRootViewModel.cs
Normal file
168
ProxySuper.Core/ViewModels/EnableRootViewModel.cs
Normal file
|
@ -0,0 +1,168 @@
|
|||
using MvvmCross.Commands;
|
||||
using MvvmCross.ViewModels;
|
||||
using ProxySuper.Core.Models.Hosts;
|
||||
using Renci.SshNet;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
|
||||
namespace ProxySuper.Core.ViewModels
|
||||
{
|
||||
public class EnableRootViewModel : MvxViewModel
|
||||
{
|
||||
private SshClient _sshClient;
|
||||
|
||||
public EnableRootViewModel()
|
||||
{
|
||||
Host = new Host();
|
||||
}
|
||||
|
||||
public Host Host { get; set; }
|
||||
|
||||
public string RootUserName { get; set; }
|
||||
|
||||
public string RootPassword { get; set; }
|
||||
|
||||
public string OutputText { get; set; }
|
||||
|
||||
public IMvxCommand ExecuteCommand => new MvxCommand(Execute);
|
||||
|
||||
public override void ViewDisappearing()
|
||||
{
|
||||
base.ViewDisappearing();
|
||||
if (_sshClient != null)
|
||||
{
|
||||
_sshClient.Disconnect();
|
||||
_sshClient.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
public void Execute()
|
||||
{
|
||||
Task.Factory.StartNew(() =>
|
||||
{
|
||||
OpenConnect();
|
||||
if (!_sshClient.IsConnected)
|
||||
{
|
||||
MessageBox.Show("连接失败,请重试!");
|
||||
return;
|
||||
}
|
||||
|
||||
string result = string.Empty;
|
||||
result = RunCmd("id -u");
|
||||
|
||||
if (result.TrimEnd('\r', '\n') == "0")
|
||||
{
|
||||
MessageBox.Show("当前账户已经具有root权限,无需再设置!");
|
||||
return;
|
||||
}
|
||||
|
||||
result = RunCmd($"echo {Host.Password} | sudo -S id -u");
|
||||
if (result.TrimEnd('\r', '\n') != "0")
|
||||
{
|
||||
MessageBox.Show("当前账户无法获取sudo权限,设置失败!");
|
||||
return;
|
||||
}
|
||||
|
||||
string cmdPre = $"echo {Host.Password} | sudo -S id -u" + ';';
|
||||
RunCmd(cmdPre + "sudo sed -i 's/PermitRootLogin /#PermitRootLogin /g' /etc/ssh/sshd_config");
|
||||
RunCmd(cmdPre + "sudo sed -i 's/PasswordAuthentication /#PasswordAuthentication /g' /etc/ssh/sshd_config");
|
||||
RunCmd(cmdPre + "sudo sed -i 's/PermitEmptyPasswords /#PermitEmptyPasswords /g' /etc/ssh/sshd_config");
|
||||
RunCmd(cmdPre + "echo 'PermitRootLogin yes' | sudo tee -a /etc/ssh/sshd_config");
|
||||
RunCmd(cmdPre + "echo 'PasswordAuthentication yes' | sudo tee -a /etc/ssh/sshd_config");
|
||||
RunCmd(cmdPre + "echo 'PermitEmptyPasswords no' | sudo tee -a /etc/ssh/sshd_config");
|
||||
RunCmd(cmdPre + "sudo systemctl restart sshd");
|
||||
|
||||
result = RunCmd(@"cat /dev/urandom | tr -dc '_A-Z#\-+=a-z(0-9%^>)]{<|' | head -c 20 ; echo ''");
|
||||
string setPassword = result.TrimEnd('\r', '\n') + '\n';
|
||||
RunCmd(cmdPre + $"echo \"{setPassword}{setPassword}\" | sudo passwd root");
|
||||
RunCmd("sudo systemctl restart sshd");
|
||||
|
||||
RootUserName = "root";
|
||||
RootPassword = setPassword.Trim('\n');
|
||||
RaisePropertyChanged("RootUserName");
|
||||
RaisePropertyChanged("RootPassword");
|
||||
|
||||
|
||||
var filePath = Host.Address.Replace(':', '_');
|
||||
using (StreamWriter sw = new StreamWriter("Logs\\host_password_info.txt"))
|
||||
{
|
||||
sw.WriteLine(Host.Address);
|
||||
sw.WriteLine("root");
|
||||
sw.WriteLine(setPassword);
|
||||
}
|
||||
WriteOutput("设置成功,账号信息保存在Logs/host_password_info.txt");
|
||||
WriteOutput("账号:\nroot");
|
||||
WriteOutput($"密码:\n{setPassword}");
|
||||
});
|
||||
}
|
||||
|
||||
protected string RunCmd(string cmdStr)
|
||||
{
|
||||
var cmd = _sshClient.CreateCommand(cmdStr);
|
||||
WriteOutput(cmdStr);
|
||||
|
||||
var result = cmd.Execute();
|
||||
WriteOutput(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private void WriteOutput(string text)
|
||||
{
|
||||
OutputText += text + '\n';
|
||||
RaisePropertyChanged("OutputText");
|
||||
}
|
||||
|
||||
|
||||
private void OpenConnect()
|
||||
{
|
||||
WriteOutput("正在建立连接...");
|
||||
var conneInfo = CreateConnectionInfo(Host);
|
||||
_sshClient = new SshClient(conneInfo);
|
||||
try
|
||||
{
|
||||
_sshClient.Connect();
|
||||
WriteOutput("Connected...");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
WriteOutput(ex.Message);
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
private ConnectionInfo CreateConnectionInfo(Host host)
|
||||
{
|
||||
AuthenticationMethod auth = null;
|
||||
|
||||
if (host.SecretType == LoginSecretType.Password)
|
||||
{
|
||||
auth = new PasswordAuthenticationMethod(host.UserName, host.Password);
|
||||
}
|
||||
else if (host.SecretType == LoginSecretType.PrivateKey)
|
||||
{
|
||||
auth = new PrivateKeyAuthenticationMethod(host.UserName, new PrivateKeyFile(host.PrivateKeyPath));
|
||||
}
|
||||
|
||||
if (host.Proxy.Type == ProxyTypes.None)
|
||||
{
|
||||
return new ConnectionInfo(host.Address, host.Port, host.UserName, auth);
|
||||
}
|
||||
else
|
||||
{
|
||||
return new ConnectionInfo(
|
||||
host: host.Address,
|
||||
port: host.Port,
|
||||
username: host.UserName,
|
||||
proxyType: host.Proxy.Type,
|
||||
proxyHost: host.Proxy.Address,
|
||||
proxyPort: host.Proxy.Port,
|
||||
proxyUsername: host.Proxy.UserName,
|
||||
proxyPassword: host.Proxy.Password,
|
||||
authenticationMethods: auth);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
380
ProxySuper.Core/ViewModels/HomeViewModel.cs
Normal file
380
ProxySuper.Core/ViewModels/HomeViewModel.cs
Normal file
|
@ -0,0 +1,380 @@
|
|||
using MvvmCross.Commands;
|
||||
using MvvmCross.Navigation;
|
||||
using MvvmCross.ViewModels;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Serialization;
|
||||
using ProxySuper.Core.Models;
|
||||
using ProxySuper.Core.Models.Hosts;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using ProxySuper.Core.Services;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
|
||||
namespace ProxySuper.Core.ViewModels
|
||||
{
|
||||
public class HomeViewModel : MvxViewModel
|
||||
{
|
||||
private readonly IMvxNavigationService _navigationService;
|
||||
|
||||
public HomeViewModel(IMvxNavigationService navigationService)
|
||||
{
|
||||
_navigationService = navigationService;
|
||||
ReadRecords();
|
||||
}
|
||||
|
||||
public void ReadRecords()
|
||||
{
|
||||
List<Record> records = new List<Record>();
|
||||
if (File.Exists("Data/Record.json"))
|
||||
{
|
||||
var json = File.ReadAllText("Data/Record.json");
|
||||
records = JsonConvert.DeserializeObject<List<Record>>(json);
|
||||
}
|
||||
|
||||
this.Records = new MvxObservableCollection<Record>();
|
||||
|
||||
records.ForEach(item =>
|
||||
{
|
||||
if (string.IsNullOrEmpty(item.Id))
|
||||
{
|
||||
item.Id = Guid.NewGuid().ToString();
|
||||
}
|
||||
this.Records.Add(item);
|
||||
});
|
||||
}
|
||||
|
||||
public void SaveToJson()
|
||||
{
|
||||
var json = JsonConvert.SerializeObject(Records, Formatting.Indented, new JsonSerializerSettings
|
||||
{
|
||||
ContractResolver = new CamelCasePropertyNamesContractResolver()
|
||||
});
|
||||
if (!Directory.Exists("Data"))
|
||||
{
|
||||
Directory.CreateDirectory("Data");
|
||||
}
|
||||
File.WriteAllText("Data/Record.json", json);
|
||||
}
|
||||
|
||||
public void SortDone(string id)
|
||||
{
|
||||
var item = Records.Where(x => x.Id == id).FirstOrDefault();
|
||||
if (item == null) return;
|
||||
|
||||
var index = Records.IndexOf(item);
|
||||
if (index >= Records.Count - 1) return;
|
||||
|
||||
Records.Remove(item);
|
||||
Records.Insert(index + 1, item);
|
||||
|
||||
RaisePropertyChanged("Records");
|
||||
SaveToJson();
|
||||
}
|
||||
|
||||
public void SortUp(string id)
|
||||
{
|
||||
var item = Records.Where(x => x.Id == id).FirstOrDefault();
|
||||
if (item == null) return;
|
||||
|
||||
var index = Records.IndexOf(item);
|
||||
if (index <= 0) return;
|
||||
|
||||
Records.Remove(item);
|
||||
Records.Insert(index - 1, item);
|
||||
|
||||
RaisePropertyChanged("Records");
|
||||
SaveToJson();
|
||||
}
|
||||
|
||||
public MvxObservableCollection<Record> Records { get; set; }
|
||||
|
||||
public IMvxCommand SortUpCommand => new MvxCommand<string>(SortUp);
|
||||
|
||||
public IMvxCommand SortDoneCommand => new MvxCommand<string>(SortDone);
|
||||
|
||||
public IMvxCommand AddV2rayCommand => new MvxAsyncCommand(AddV2rayRecord);
|
||||
|
||||
public IMvxCommand AddXrayCommand => new MvxAsyncCommand(AddXrayRecord);
|
||||
|
||||
public IMvxCommand AddTrojanGoCommand => new MvxAsyncCommand(AddTrojanGoRecord);
|
||||
|
||||
public IMvxCommand AddNaiveProxyCommand => new MvxAsyncCommand(AddNaiveProxyRecord);
|
||||
|
||||
public IMvxCommand AddMTProtoGoCommand => new MvxAsyncCommand(AddMTProtoGoRecord);
|
||||
|
||||
public IMvxCommand AddBrookCommand => new MvxAsyncCommand(AddBrookRecord);
|
||||
|
||||
public IMvxCommand AddHysteriaCommand => new MvxAsyncCommand(AddHysteriaRecord);
|
||||
|
||||
public IMvxCommand RemoveCommand => new MvxAsyncCommand<string>(DeleteRecord);
|
||||
|
||||
public IMvxCommand EditCommand => new MvxAsyncCommand<string>(EditRecord);
|
||||
|
||||
public IMvxCommand ViewConfigCommand => new MvxAsyncCommand<string>(ViewConfig);
|
||||
|
||||
public IMvxCommand InstallCommand => new MvxAsyncCommand<string>(GoToInstall);
|
||||
|
||||
public async Task AddV2rayRecord()
|
||||
{
|
||||
Record record = new Record();
|
||||
record.Id = Utils.GetTickID();
|
||||
record.Host = new Host();
|
||||
record.V2raySettings = new V2raySettings();
|
||||
|
||||
var result = await _navigationService.Navigate<V2rayEditorViewModel, Record, Record>(record);
|
||||
if (result == null) return;
|
||||
|
||||
Records.Add(result);
|
||||
SaveToJson();
|
||||
}
|
||||
|
||||
public async Task AddXrayRecord()
|
||||
{
|
||||
Record record = new Record();
|
||||
record.Id = Utils.GetTickID();
|
||||
record.Host = new Host();
|
||||
record.XraySettings = new XraySettings();
|
||||
|
||||
var result = await _navigationService.Navigate<XrayEditorViewModel, Record, Record>(record);
|
||||
if (result == null) return;
|
||||
|
||||
Records.Add(result);
|
||||
SaveToJson();
|
||||
}
|
||||
|
||||
public async Task AddTrojanGoRecord()
|
||||
{
|
||||
Record record = new Record();
|
||||
record.Id = Utils.GetTickID();
|
||||
record.Host = new Host();
|
||||
record.TrojanGoSettings = new TrojanGoSettings();
|
||||
|
||||
var result = await _navigationService.Navigate<TrojanGoEditorViewModel, Record, Record>(record);
|
||||
if (result == null) return;
|
||||
|
||||
Records.Add(result);
|
||||
|
||||
SaveToJson();
|
||||
}
|
||||
|
||||
public async Task AddMTProtoGoRecord()
|
||||
{
|
||||
Record record = new Record();
|
||||
record.Id = Utils.GetTickID();
|
||||
record.Host = new Host();
|
||||
record.MTProtoGoSettings = new MTProtoGoSettings();
|
||||
|
||||
var result = await _navigationService.Navigate<MTProtoGoEditorViewModel, Record, Record>(record);
|
||||
if (result == null) return;
|
||||
|
||||
Records.Add(result);
|
||||
|
||||
SaveToJson();
|
||||
}
|
||||
|
||||
public async Task AddNaiveProxyRecord()
|
||||
{
|
||||
Record record = new Record();
|
||||
record.Id = Utils.GetTickID();
|
||||
record.Host = new Host();
|
||||
record.NaiveProxySettings = new NaiveProxySettings();
|
||||
|
||||
var result = await _navigationService.Navigate<NaiveProxyEditorViewModel, Record, Record>(record);
|
||||
if (result == null) return;
|
||||
|
||||
Records.Add(result);
|
||||
|
||||
SaveToJson();
|
||||
}
|
||||
|
||||
public async Task AddBrookRecord()
|
||||
{
|
||||
Record record = new Record();
|
||||
record.Id = Utils.GetTickID();
|
||||
record.Host = new Host();
|
||||
record.BrookSettings = new BrookSettings();
|
||||
|
||||
var result = await _navigationService.Navigate<BrookEditorViewModel, Record, Record>(record);
|
||||
if (result == null) return;
|
||||
|
||||
Records.Add(result);
|
||||
|
||||
SaveToJson();
|
||||
}
|
||||
|
||||
public async Task AddHysteriaRecord()
|
||||
{
|
||||
Record record = new Record();
|
||||
record.Id = Utils.GetTickID();
|
||||
record.Host = new Host();
|
||||
record.HysteriaSettings = new HysteriaSettings();
|
||||
|
||||
var result = await _navigationService.Navigate<HysteriaEditorViewModel, Record, Record>(record);
|
||||
if (result == null) return;
|
||||
|
||||
Records.Add(result);
|
||||
|
||||
SaveToJson();
|
||||
}
|
||||
|
||||
|
||||
public async Task EditRecord(string id)
|
||||
{
|
||||
var record = Records.FirstOrDefault(x => x.Id == id);
|
||||
if (record == null) return;
|
||||
|
||||
Record result = null;
|
||||
if (record.Type == ProjectType.V2ray)
|
||||
{
|
||||
result = await _navigationService.Navigate<V2rayEditorViewModel, Record, Record>(record);
|
||||
if (result == null) return;
|
||||
|
||||
record.Host = result.Host;
|
||||
record.V2raySettings = result.V2raySettings;
|
||||
}
|
||||
if (record.Type == ProjectType.Xray)
|
||||
{
|
||||
result = await _navigationService.Navigate<XrayEditorViewModel, Record, Record>(record);
|
||||
if (result == null) return;
|
||||
|
||||
record.Host = result.Host;
|
||||
record.XraySettings = result.XraySettings;
|
||||
}
|
||||
if (record.Type == ProjectType.TrojanGo)
|
||||
{
|
||||
result = await _navigationService.Navigate<TrojanGoEditorViewModel, Record, Record>(record);
|
||||
if (result == null) return;
|
||||
|
||||
record.Host = result.Host;
|
||||
record.TrojanGoSettings = result.TrojanGoSettings;
|
||||
}
|
||||
if (record.Type == ProjectType.NaiveProxy)
|
||||
{
|
||||
result = await _navigationService.Navigate<NaiveProxyEditorViewModel, Record, Record>(record);
|
||||
if (result == null) return;
|
||||
|
||||
record.Host = result.Host;
|
||||
record.NaiveProxySettings = result.NaiveProxySettings;
|
||||
}
|
||||
if (record.Type == ProjectType.Brook)
|
||||
{
|
||||
result = await _navigationService.Navigate<BrookEditorViewModel, Record, Record>(record);
|
||||
if (result == null) return;
|
||||
|
||||
record.Host = result.Host;
|
||||
record.BrookSettings = result.BrookSettings;
|
||||
}
|
||||
if (record.Type == ProjectType.MTProtoGo)
|
||||
{
|
||||
result = await _navigationService.Navigate<MTProtoGoEditorViewModel, Record, Record>(record);
|
||||
if (result == null) return;
|
||||
|
||||
record.Host = result.Host;
|
||||
record.MTProtoGoSettings = result.MTProtoGoSettings;
|
||||
}
|
||||
if (record.Type == ProjectType.Hysteria)
|
||||
{
|
||||
result = await _navigationService.Navigate<HysteriaEditorViewModel, Record, Record>(record);
|
||||
if (result == null) return;
|
||||
|
||||
record.Host = result.Host;
|
||||
record.HysteriaSettings = result.HysteriaSettings;
|
||||
}
|
||||
|
||||
SaveToJson();
|
||||
}
|
||||
|
||||
public async Task DeleteRecord(string id)
|
||||
{
|
||||
var result = MessageBox.Show($"您确认删除主机吗?", "提示", MessageBoxButton.OKCancel);
|
||||
if (result == MessageBoxResult.OK)
|
||||
{
|
||||
var record = Records.FirstOrDefault(x => x.Id == id);
|
||||
if (record != null)
|
||||
{
|
||||
Records.Remove(record);
|
||||
SaveToJson();
|
||||
}
|
||||
}
|
||||
await Task.CompletedTask;
|
||||
}
|
||||
|
||||
public async Task ViewConfig(string id)
|
||||
{
|
||||
var record = Records.FirstOrDefault(x => x.Id == id);
|
||||
if (record == null) return;
|
||||
|
||||
if (record.Type == ProjectType.V2ray)
|
||||
{
|
||||
await _navigationService.Navigate<V2rayConfigViewModel, V2raySettings>(record.V2raySettings);
|
||||
}
|
||||
if (record.Type == ProjectType.Xray)
|
||||
{
|
||||
await _navigationService.Navigate<XrayConfigViewModel, XraySettings>(record.XraySettings);
|
||||
}
|
||||
if (record.Type == ProjectType.TrojanGo)
|
||||
{
|
||||
await _navigationService.Navigate<TrojanGoConfigViewModel, TrojanGoSettings>(record.TrojanGoSettings);
|
||||
}
|
||||
if (record.Type == ProjectType.NaiveProxy)
|
||||
{
|
||||
await _navigationService.Navigate<NaiveProxyConfigViewModel, NaiveProxySettings>(record.NaiveProxySettings);
|
||||
}
|
||||
if (record.Type == ProjectType.Brook)
|
||||
{
|
||||
await _navigationService.Navigate<BrookConfigViewModel, BrookSettings>(record.BrookSettings);
|
||||
}
|
||||
if (record.Type == ProjectType.MTProtoGo)
|
||||
{
|
||||
await _navigationService.Navigate<MTProtoGoConfigViewModel, MTProtoGoSettings>(record.MTProtoGoSettings);
|
||||
}
|
||||
if (record.Type == ProjectType.Hysteria)
|
||||
{
|
||||
await _navigationService.Navigate<HysteriaConfigViewModel, HysteriaSettings>(record.HysteriaSettings);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task GoToInstall(string id)
|
||||
{
|
||||
var record = Records.FirstOrDefault(x => x.Id == id);
|
||||
if (record == null) return;
|
||||
record.OnSave = SaveToJson;
|
||||
|
||||
if (record.Type == ProjectType.V2ray)
|
||||
{
|
||||
await _navigationService.Navigate<V2rayInstallViewModel, Record>(record);
|
||||
}
|
||||
if (record.Type == ProjectType.Xray)
|
||||
{
|
||||
await _navigationService.Navigate<XrayInstallViewModel, Record>(record);
|
||||
}
|
||||
if (record.Type == ProjectType.TrojanGo)
|
||||
{
|
||||
await _navigationService.Navigate<TrojanGoInstallViewModel, Record>(record);
|
||||
}
|
||||
if (record.Type == ProjectType.NaiveProxy)
|
||||
{
|
||||
await _navigationService.Navigate<NaiveProxyInstallViewModel, Record>(record);
|
||||
}
|
||||
if (record.Type == ProjectType.Brook)
|
||||
{
|
||||
await _navigationService.Navigate<BrookInstallViewModel, Record>(record);
|
||||
}
|
||||
if (record.Type == ProjectType.MTProtoGo)
|
||||
{
|
||||
await _navigationService.Navigate<MTProtoGoInstallViewModel, Record>(record);
|
||||
}
|
||||
if (record.Type == ProjectType.Hysteria)
|
||||
{
|
||||
await _navigationService.Navigate<HysteriaInstallViewModel, Record>(record);
|
||||
}
|
||||
|
||||
SaveToJson();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
45
ProxySuper.Core/ViewModels/HysteriaConfigViewModel.cs
Normal file
45
ProxySuper.Core/ViewModels/HysteriaConfigViewModel.cs
Normal file
|
@ -0,0 +1,45 @@
|
|||
using MvvmCross.ViewModels;
|
||||
using Newtonsoft.Json;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySuper.Core.ViewModels
|
||||
{
|
||||
public class HysteriaConfigViewModel : MvxViewModel<HysteriaSettings>
|
||||
{
|
||||
public HysteriaSettings Settings { get; set; }
|
||||
|
||||
public override void Prepare(HysteriaSettings parameter)
|
||||
{
|
||||
Settings = parameter;
|
||||
}
|
||||
|
||||
public string ClientJson {
|
||||
|
||||
get
|
||||
{
|
||||
var jsonData = new
|
||||
{
|
||||
server = $"{Settings.Domain}:{Settings.Port}",
|
||||
obfs = Settings.Obfs,
|
||||
up_mbps = 10,
|
||||
down_mbps = 50,
|
||||
socks5 = new
|
||||
{
|
||||
listen = "127.0.0.1:1080"
|
||||
},
|
||||
http = new
|
||||
{
|
||||
listen = "127.0.0.1:1081"
|
||||
}
|
||||
};
|
||||
|
||||
return JsonConvert.SerializeObject(jsonData, Formatting.Indented);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
68
ProxySuper.Core/ViewModels/HysteriaEditorViewModel.cs
Normal file
68
ProxySuper.Core/ViewModels/HysteriaEditorViewModel.cs
Normal file
|
@ -0,0 +1,68 @@
|
|||
using MvvmCross.Commands;
|
||||
using MvvmCross.Navigation;
|
||||
using MvvmCross.ViewModels;
|
||||
using ProxySuper.Core.Models;
|
||||
using ProxySuper.Core.Models.Hosts;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using ProxySuper.Core.Services;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Navigation;
|
||||
|
||||
namespace ProxySuper.Core.ViewModels
|
||||
{
|
||||
public class HysteriaEditorViewModel : MvxViewModel<Record, Record>
|
||||
{
|
||||
public string Id { get; set; }
|
||||
|
||||
public Host Host { get; set; }
|
||||
|
||||
public HysteriaSettings Settings { get; set; }
|
||||
|
||||
public IMvxNavigationService NavigationService { get; }
|
||||
|
||||
public IMvxCommand SaveCommand => new MvxCommand(() => Save());
|
||||
|
||||
public IMvxCommand SaveAndInstallCommand => new MvxCommand(SaveAndInstall);
|
||||
|
||||
public HysteriaEditorViewModel(IMvxNavigationService mvxNavigationService)
|
||||
{
|
||||
NavigationService = mvxNavigationService;
|
||||
}
|
||||
|
||||
public override void Prepare(Record parameter)
|
||||
{
|
||||
var record = Utils.DeepClone(parameter);
|
||||
|
||||
Id = record.Id;
|
||||
Host = record.Host;
|
||||
Settings = record.HysteriaSettings;
|
||||
}
|
||||
|
||||
public void Save()
|
||||
{
|
||||
NavigationService.Close(this, new Record
|
||||
{
|
||||
Id = Id,
|
||||
Host = Host,
|
||||
HysteriaSettings = Settings,
|
||||
});
|
||||
}
|
||||
|
||||
public void SaveAndInstall()
|
||||
{
|
||||
var record = new Record
|
||||
{
|
||||
Id = Id,
|
||||
Host = Host,
|
||||
HysteriaSettings = Settings,
|
||||
};
|
||||
|
||||
NavigationService.Close(this, record);
|
||||
NavigationService.Navigate<HysteriaInstallViewModel, Record>(record);
|
||||
}
|
||||
}
|
||||
}
|
66
ProxySuper.Core/ViewModels/HysteriaInstallViewModel.cs
Normal file
66
ProxySuper.Core/ViewModels/HysteriaInstallViewModel.cs
Normal file
|
@ -0,0 +1,66 @@
|
|||
using MvvmCross.Commands;
|
||||
using MvvmCross.ViewModels;
|
||||
using ProxySuper.Core.Models;
|
||||
using ProxySuper.Core.Models.Hosts;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using ProxySuper.Core.Services;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySuper.Core.ViewModels
|
||||
{
|
||||
public class HysteriaInstallViewModel : MvxViewModel<Record>
|
||||
{
|
||||
public Host _host { get; set; }
|
||||
|
||||
public HysteriaSettings _settings { get; set; }
|
||||
|
||||
public HysteriaService _service { get; set; }
|
||||
|
||||
public override void Prepare(Record parameter)
|
||||
{
|
||||
_host = parameter.Host;
|
||||
_settings = parameter.HysteriaSettings;
|
||||
}
|
||||
|
||||
public override Task Initialize()
|
||||
{
|
||||
_service = new HysteriaService(_host, _settings);
|
||||
_service.Progress.StepUpdate = () => RaisePropertyChanged("Progress");
|
||||
_service.Progress.LogsUpdate = () => RaisePropertyChanged("Logs");
|
||||
_service.Connect();
|
||||
return base.Initialize();
|
||||
}
|
||||
|
||||
public override void ViewDestroy(bool viewFinishing = true)
|
||||
{
|
||||
_service.Disconnect();
|
||||
this.SaveInstallLog();
|
||||
base.ViewDestroy(viewFinishing);
|
||||
}
|
||||
|
||||
public ProjectProgress Progress => _service.Progress;
|
||||
|
||||
public string Logs => _service.Progress.Logs;
|
||||
|
||||
public IMvxCommand InstallCommand => new MvxCommand(_service.Install);
|
||||
|
||||
public IMvxCommand UninstallCommand => new MvxCommand(_service.Uninstall);
|
||||
|
||||
|
||||
private void SaveInstallLog()
|
||||
{
|
||||
if (!Directory.Exists("Logs"))
|
||||
{
|
||||
Directory.CreateDirectory("Logs");
|
||||
}
|
||||
|
||||
var fileName = System.IO.Path.Combine("Logs", DateTime.Now.ToString("yyyy-MM-dd hh-mm") + ".hysteria.txt");
|
||||
File.WriteAllText(fileName, Logs);
|
||||
}
|
||||
}
|
||||
}
|
21
ProxySuper.Core/ViewModels/MTProtoGoConfigViewModel.cs
Normal file
21
ProxySuper.Core/ViewModels/MTProtoGoConfigViewModel.cs
Normal file
|
@ -0,0 +1,21 @@
|
|||
using MvvmCross.ViewModels;
|
||||
using ProxySuper.Core.Models;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySuper.Core.ViewModels
|
||||
{
|
||||
public class MTProtoGoConfigViewModel : MvxViewModel<MTProtoGoSettings>
|
||||
{
|
||||
public MTProtoGoSettings Settings { get; set; }
|
||||
|
||||
public override void Prepare(MTProtoGoSettings parameter)
|
||||
{
|
||||
Settings = parameter;
|
||||
}
|
||||
}
|
||||
}
|
66
ProxySuper.Core/ViewModels/MTProtoGoEditorViewModel.cs
Normal file
66
ProxySuper.Core/ViewModels/MTProtoGoEditorViewModel.cs
Normal file
|
@ -0,0 +1,66 @@
|
|||
using MvvmCross.Commands;
|
||||
using MvvmCross.Navigation;
|
||||
using MvvmCross.ViewModels;
|
||||
using ProxySuper.Core.Models;
|
||||
using ProxySuper.Core.Models.Hosts;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using ProxySuper.Core.Services;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySuper.Core.ViewModels
|
||||
{
|
||||
public class MTProtoGoEditorViewModel : MvxViewModel<Record, Record>
|
||||
{
|
||||
public MTProtoGoEditorViewModel(IMvxNavigationService navigationService)
|
||||
{
|
||||
NavigationService = navigationService;
|
||||
}
|
||||
|
||||
public IMvxNavigationService NavigationService { get; }
|
||||
|
||||
public IMvxCommand SaveCommand => new MvxCommand(Save);
|
||||
|
||||
public IMvxCommand SaveAndInstallCommand => new MvxCommand(SaveAndInstall);
|
||||
|
||||
public string Id { get; set; }
|
||||
|
||||
public Host Host { get; set; }
|
||||
|
||||
public MTProtoGoSettings Settings { get; set; }
|
||||
|
||||
public override void Prepare(Record parameter)
|
||||
{
|
||||
var record = Utils.DeepClone(parameter);
|
||||
|
||||
Id = record.Id;
|
||||
Host = record.Host;
|
||||
Settings = record.MTProtoGoSettings;
|
||||
}
|
||||
|
||||
private void Save()
|
||||
{
|
||||
NavigationService.Close(this, new Record
|
||||
{
|
||||
Id = this.Id,
|
||||
Host = this.Host,
|
||||
MTProtoGoSettings = Settings,
|
||||
});
|
||||
}
|
||||
|
||||
private void SaveAndInstall()
|
||||
{
|
||||
var record = new Record
|
||||
{
|
||||
Id = this.Id,
|
||||
Host = this.Host,
|
||||
MTProtoGoSettings = Settings,
|
||||
};
|
||||
NavigationService.Close(this, record);
|
||||
NavigationService.Navigate<MTProtoGoInstallViewModel, Record>(record);
|
||||
}
|
||||
}
|
||||
}
|
94
ProxySuper.Core/ViewModels/MTProtoGoInstallViewModel.cs
Normal file
94
ProxySuper.Core/ViewModels/MTProtoGoInstallViewModel.cs
Normal file
|
@ -0,0 +1,94 @@
|
|||
using MvvmCross.Commands;
|
||||
using MvvmCross.ViewModels;
|
||||
using ProxySuper.Core.Models;
|
||||
using ProxySuper.Core.Models.Hosts;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using ProxySuper.Core.Services;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySuper.Core.ViewModels
|
||||
{
|
||||
public class MTProtoGoInstallViewModel : MvxViewModel<Record>
|
||||
{
|
||||
Host _host;
|
||||
|
||||
MTProtoGoSettings _settings;
|
||||
|
||||
MTProtoGoService _mtproxyService;
|
||||
|
||||
Action _onSave;
|
||||
|
||||
public override void Prepare(Record parameter)
|
||||
{
|
||||
_host = parameter.Host;
|
||||
_settings = parameter.MTProtoGoSettings;
|
||||
_onSave = parameter.OnSave;
|
||||
}
|
||||
|
||||
public override Task Initialize()
|
||||
{
|
||||
_mtproxyService = new MTProtoGoService(_host, _settings);
|
||||
_mtproxyService.Progress.StepUpdate = () => RaisePropertyChanged("Progress");
|
||||
_mtproxyService.Progress.LogsUpdate = () => RaisePropertyChanged("Logs");
|
||||
_mtproxyService.Connect();
|
||||
return base.Initialize();
|
||||
}
|
||||
|
||||
public override void ViewDestroy(bool viewFinishing = true)
|
||||
{
|
||||
_mtproxyService.Disconnect();
|
||||
this.SaveInstallLog();
|
||||
base.ViewDestroy(viewFinishing);
|
||||
}
|
||||
|
||||
public ProjectProgress Progress
|
||||
{
|
||||
get => _mtproxyService.Progress;
|
||||
}
|
||||
|
||||
public string Logs
|
||||
{
|
||||
get => _mtproxyService.Progress.Logs;
|
||||
}
|
||||
|
||||
|
||||
#region Command
|
||||
|
||||
public IMvxCommand InstallCommand => new MvxCommand(() =>
|
||||
{
|
||||
_mtproxyService.Install();
|
||||
|
||||
// 安装时生成的Secret需要保存
|
||||
_onSave();
|
||||
});
|
||||
|
||||
public IMvxCommand UpdateSettingsCommand => new MvxCommand(() =>
|
||||
{
|
||||
_mtproxyService.UpdateSettings();
|
||||
|
||||
// 安装时生成的Secret需要保存
|
||||
_onSave();
|
||||
});
|
||||
|
||||
public IMvxCommand UninstallCommand => new MvxCommand(_mtproxyService.Uninstall);
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
private void SaveInstallLog()
|
||||
{
|
||||
if (!Directory.Exists("Logs"))
|
||||
{
|
||||
Directory.CreateDirectory("Logs");
|
||||
}
|
||||
|
||||
var fileName = System.IO.Path.Combine("Logs", DateTime.Now.ToString("yyyy-MM-dd hh-mm") + ".mtproxy-go.txt");
|
||||
File.WriteAllText(fileName, Logs);
|
||||
}
|
||||
}
|
||||
}
|
24
ProxySuper.Core/ViewModels/NaiveProxyConfigViewModel.cs
Normal file
24
ProxySuper.Core/ViewModels/NaiveProxyConfigViewModel.cs
Normal file
|
@ -0,0 +1,24 @@
|
|||
using MvvmCross.ViewModels;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using ProxySuper.Core.Services;
|
||||
|
||||
namespace ProxySuper.Core.ViewModels
|
||||
{
|
||||
public class NaiveProxyConfigViewModel : MvxViewModel<NaiveProxySettings>
|
||||
{
|
||||
public NaiveProxySettings Settings { get; set; }
|
||||
|
||||
public override void Prepare(NaiveProxySettings parameter)
|
||||
{
|
||||
Settings = parameter;
|
||||
}
|
||||
|
||||
public string Link
|
||||
{
|
||||
get
|
||||
{
|
||||
return ShareLink.BuildNaiveProxy(Settings);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
63
ProxySuper.Core/ViewModels/NaiveProxyEditorViewModel.cs
Normal file
63
ProxySuper.Core/ViewModels/NaiveProxyEditorViewModel.cs
Normal file
|
@ -0,0 +1,63 @@
|
|||
using MvvmCross.Commands;
|
||||
using MvvmCross.Navigation;
|
||||
using MvvmCross.ViewModels;
|
||||
using ProxySuper.Core.Models;
|
||||
using ProxySuper.Core.Models.Hosts;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using ProxySuper.Core.Services;
|
||||
|
||||
namespace ProxySuper.Core.ViewModels
|
||||
{
|
||||
public class NaiveProxyEditorViewModel : MvxViewModel<Record, Record>
|
||||
{
|
||||
public NaiveProxyEditorViewModel(IMvxNavigationService navigationService)
|
||||
{
|
||||
NavigationService = navigationService;
|
||||
}
|
||||
|
||||
public IMvxNavigationService NavigationService { get; }
|
||||
|
||||
public string Id { get; set; }
|
||||
|
||||
public Host Host { get; set; }
|
||||
|
||||
public NaiveProxySettings Settings { get; set; }
|
||||
|
||||
public override void Prepare(Record parameter)
|
||||
{
|
||||
var record = Utils.DeepClone(parameter);
|
||||
|
||||
Id = record.Id;
|
||||
Host = record.Host;
|
||||
Settings = record.NaiveProxySettings;
|
||||
}
|
||||
|
||||
|
||||
public IMvxCommand SaveCommand => new MvxCommand(Save);
|
||||
|
||||
public IMvxCommand SaveAndInstallCommand => new MvxCommand(SaveAndInstall);
|
||||
|
||||
private void Save()
|
||||
{
|
||||
NavigationService.Close(this, new Record
|
||||
{
|
||||
Id = Id,
|
||||
Host = Host,
|
||||
NaiveProxySettings = Settings
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
private void SaveAndInstall()
|
||||
{
|
||||
var record = new Record
|
||||
{
|
||||
Id = this.Id,
|
||||
Host = this.Host,
|
||||
NaiveProxySettings = Settings,
|
||||
};
|
||||
NavigationService.Close(this, record);
|
||||
NavigationService.Navigate<NaiveProxyInstallViewModel, Record>(record);
|
||||
}
|
||||
}
|
||||
}
|
75
ProxySuper.Core/ViewModels/NaiveProxyInstallViewModel.cs
Normal file
75
ProxySuper.Core/ViewModels/NaiveProxyInstallViewModel.cs
Normal file
|
@ -0,0 +1,75 @@
|
|||
using MvvmCross.Commands;
|
||||
using MvvmCross.ViewModels;
|
||||
using ProxySuper.Core.Models;
|
||||
using ProxySuper.Core.Models.Hosts;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using ProxySuper.Core.Services;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySuper.Core.ViewModels
|
||||
{
|
||||
public class NaiveProxyInstallViewModel : MvxViewModel<Record>
|
||||
{
|
||||
Host _host;
|
||||
|
||||
NaiveProxySettings _settings;
|
||||
|
||||
NaiveProxyService _service;
|
||||
|
||||
public override void Prepare(Record parameter)
|
||||
{
|
||||
_host = parameter.Host;
|
||||
_settings = parameter.NaiveProxySettings;
|
||||
}
|
||||
|
||||
public override Task Initialize()
|
||||
{
|
||||
_service = new NaiveProxyService(_host, _settings);
|
||||
_service.Progress.StepUpdate = () => RaisePropertyChanged("Progress");
|
||||
_service.Progress.LogsUpdate = () => RaisePropertyChanged("Logs");
|
||||
_service.Connect();
|
||||
return base.Initialize();
|
||||
}
|
||||
|
||||
public override void ViewDestroy(bool viewFinishing = true)
|
||||
{
|
||||
_service.Disconnect();
|
||||
this.SaveInstallLog();
|
||||
base.ViewDestroy(viewFinishing);
|
||||
}
|
||||
|
||||
|
||||
public ProjectProgress Progress => _service.Progress;
|
||||
|
||||
public string Logs => _service.Progress.Logs;
|
||||
|
||||
|
||||
#region Commands
|
||||
|
||||
public IMvxCommand InstallCommand => new MvxCommand(_service.Install);
|
||||
|
||||
public IMvxCommand UpdateSettingsCommand => new MvxCommand(_service.UpdateSettings);
|
||||
|
||||
public IMvxCommand UninstallCommand => new MvxCommand(_service.Uninstall);
|
||||
|
||||
public IMvxCommand UploadWebCommand => new MvxCommand(_service.UploadWeb);
|
||||
|
||||
#endregion
|
||||
|
||||
private void SaveInstallLog()
|
||||
{
|
||||
if (!Directory.Exists("Logs"))
|
||||
{
|
||||
Directory.CreateDirectory("Logs");
|
||||
}
|
||||
|
||||
var fileName = System.IO.Path.Combine("Logs", DateTime.Now.ToString("yyyy-MM-dd hh-mm") + ".naiveproxy.txt");
|
||||
File.WriteAllText(fileName, Logs);
|
||||
}
|
||||
}
|
||||
}
|
31
ProxySuper.Core/ViewModels/ShareLinkViewModel.cs
Normal file
31
ProxySuper.Core/ViewModels/ShareLinkViewModel.cs
Normal file
|
@ -0,0 +1,31 @@
|
|||
using MvvmCross.ViewModels;
|
||||
using ProxySuper.Core.Models;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace ProxySuper.Core.ViewModels
|
||||
{
|
||||
public class ShareLinkViewModel : MvxViewModel<List<Record>>
|
||||
{
|
||||
public List<Record> Records { get; set; }
|
||||
|
||||
public override void Prepare(List<Record> parameter)
|
||||
{
|
||||
Records = parameter;
|
||||
}
|
||||
|
||||
public string ShareLinks
|
||||
{
|
||||
get
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
Records.ForEach(record =>
|
||||
{
|
||||
var link = record.GetShareLink();
|
||||
sb.AppendLine(link);
|
||||
});
|
||||
return sb.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
24
ProxySuper.Core/ViewModels/TrojanGoConfigViewModel.cs
Normal file
24
ProxySuper.Core/ViewModels/TrojanGoConfigViewModel.cs
Normal file
|
@ -0,0 +1,24 @@
|
|||
using MvvmCross.ViewModels;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using ProxySuper.Core.Services;
|
||||
|
||||
namespace ProxySuper.Core.ViewModels
|
||||
{
|
||||
public class TrojanGoConfigViewModel : MvxViewModel<TrojanGoSettings>
|
||||
{
|
||||
public TrojanGoSettings Settings { get; set; }
|
||||
|
||||
public override void Prepare(TrojanGoSettings parameter)
|
||||
{
|
||||
Settings = parameter;
|
||||
}
|
||||
|
||||
public string Link
|
||||
{
|
||||
get
|
||||
{
|
||||
return ShareLink.BuildTrojanGo(Settings);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
63
ProxySuper.Core/ViewModels/TrojanGoEditorViewModel.cs
Normal file
63
ProxySuper.Core/ViewModels/TrojanGoEditorViewModel.cs
Normal file
|
@ -0,0 +1,63 @@
|
|||
using MvvmCross.Commands;
|
||||
using MvvmCross.Navigation;
|
||||
using MvvmCross.ViewModels;
|
||||
using ProxySuper.Core.Models;
|
||||
using ProxySuper.Core.Models.Hosts;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using ProxySuper.Core.Services;
|
||||
|
||||
namespace ProxySuper.Core.ViewModels
|
||||
{
|
||||
public class TrojanGoEditorViewModel : MvxViewModel<Record, Record>
|
||||
{
|
||||
public TrojanGoEditorViewModel(IMvxNavigationService navigationService)
|
||||
{
|
||||
NavigationService = navigationService;
|
||||
}
|
||||
|
||||
public IMvxNavigationService NavigationService { get; }
|
||||
|
||||
public IMvxCommand SaveCommand => new MvxCommand(Save);
|
||||
|
||||
public IMvxCommand SaveAndInstallCommand => new MvxCommand(SaveAndInstall);
|
||||
|
||||
public string Id { get; set; }
|
||||
|
||||
public Host Host { get; set; }
|
||||
|
||||
public TrojanGoSettings Settings { get; set; }
|
||||
|
||||
public override void Prepare(Record parameter)
|
||||
{
|
||||
var record = Utils.DeepClone(parameter);
|
||||
|
||||
Id = record.Id;
|
||||
Host = record.Host;
|
||||
Settings = record.TrojanGoSettings;
|
||||
}
|
||||
|
||||
private void Save()
|
||||
{
|
||||
NavigationService.Close(this, new Record
|
||||
{
|
||||
Id = this.Id,
|
||||
Host = this.Host,
|
||||
TrojanGoSettings = Settings,
|
||||
});
|
||||
}
|
||||
|
||||
private void SaveAndInstall()
|
||||
{
|
||||
var record = new Record
|
||||
{
|
||||
Id = this.Id,
|
||||
Host = this.Host,
|
||||
TrojanGoSettings = Settings,
|
||||
};
|
||||
NavigationService.Close(this, record);
|
||||
NavigationService.Navigate<TrojanGoInstallViewModel, Record>(record);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
85
ProxySuper.Core/ViewModels/TrojanGoInstallViewModel.cs
Normal file
85
ProxySuper.Core/ViewModels/TrojanGoInstallViewModel.cs
Normal file
|
@ -0,0 +1,85 @@
|
|||
using MvvmCross.Commands;
|
||||
using MvvmCross.ViewModels;
|
||||
using ProxySuper.Core.Models;
|
||||
using ProxySuper.Core.Models.Hosts;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using ProxySuper.Core.Services;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySuper.Core.ViewModels
|
||||
{
|
||||
public class TrojanGoInstallViewModel : MvxViewModel<Record>
|
||||
{
|
||||
Host _host;
|
||||
|
||||
TrojanGoSettings _settings;
|
||||
|
||||
TrojanGoService _trojanGoService;
|
||||
|
||||
public override void Prepare(Record parameter)
|
||||
{
|
||||
_host = parameter.Host;
|
||||
_settings = parameter.TrojanGoSettings;
|
||||
}
|
||||
|
||||
public override Task Initialize()
|
||||
{
|
||||
_trojanGoService = new TrojanGoService(_host, _settings);
|
||||
_trojanGoService.Progress.StepUpdate = () => RaisePropertyChanged("Progress");
|
||||
_trojanGoService.Progress.LogsUpdate = () => RaisePropertyChanged("Logs");
|
||||
_trojanGoService.Connect();
|
||||
return base.Initialize();
|
||||
}
|
||||
|
||||
public override void ViewDestroy(bool viewFinishing = true)
|
||||
{
|
||||
_trojanGoService.Disconnect();
|
||||
this.SaveInstallLog();
|
||||
base.ViewDestroy(viewFinishing);
|
||||
}
|
||||
|
||||
public ProjectProgress Progress
|
||||
{
|
||||
get => _trojanGoService.Progress;
|
||||
}
|
||||
|
||||
public string Logs
|
||||
{
|
||||
get => _trojanGoService.Progress.Logs;
|
||||
}
|
||||
|
||||
|
||||
#region Command
|
||||
|
||||
public IMvxCommand InstallCommand => new MvxCommand(_trojanGoService.Install);
|
||||
|
||||
public IMvxCommand UpdateSettingsCommand => new MvxCommand(_trojanGoService.UpdateSettings);
|
||||
|
||||
public IMvxCommand UninstallCommand => new MvxCommand(_trojanGoService.Uninstall);
|
||||
|
||||
public IMvxCommand UploadCertCommand => new MvxCommand(_trojanGoService.UploadCert);
|
||||
|
||||
public IMvxCommand UploadWebCommand => new MvxCommand(_trojanGoService.UploadWeb);
|
||||
|
||||
public IMvxCommand ApplyForCertCommand => new MvxCommand(_trojanGoService.ApplyForCert);
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
private void SaveInstallLog()
|
||||
{
|
||||
if (!Directory.Exists("Logs"))
|
||||
{
|
||||
Directory.CreateDirectory("Logs");
|
||||
}
|
||||
|
||||
var fileName = System.IO.Path.Combine("Logs", DateTime.Now.ToString("yyyy-MM-dd hh-mm") + ".trojan-go.txt");
|
||||
File.WriteAllText(fileName, Logs);
|
||||
}
|
||||
}
|
||||
}
|
109
ProxySuper.Core/ViewModels/V2rayConfigViewModel.cs
Normal file
109
ProxySuper.Core/ViewModels/V2rayConfigViewModel.cs
Normal file
|
@ -0,0 +1,109 @@
|
|||
using MvvmCross.ViewModels;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySuper.Core.ViewModels
|
||||
{
|
||||
public class V2rayConfigViewModel : MvxViewModel<V2raySettings>
|
||||
{
|
||||
public V2raySettings Settings { get; set; }
|
||||
|
||||
public override void Prepare(V2raySettings parameter)
|
||||
{
|
||||
Settings = parameter;
|
||||
}
|
||||
|
||||
|
||||
public bool Checked_VLESS_TCP
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.VLESS_TCP);
|
||||
}
|
||||
}
|
||||
|
||||
public bool Checked_VLESS_WS
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.VLESS_WS);
|
||||
}
|
||||
}
|
||||
|
||||
public bool Checked_VLESS_KCP
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.VLESS_KCP);
|
||||
}
|
||||
}
|
||||
|
||||
public bool Checked_VLESS_QUIC
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.VLESS_QUIC);
|
||||
}
|
||||
}
|
||||
|
||||
public bool Checked_VLESS_gRPC
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.VLESS_gRPC);
|
||||
}
|
||||
}
|
||||
|
||||
public bool Checked_VMESS_TCP
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.VMESS_TCP);
|
||||
}
|
||||
}
|
||||
|
||||
public bool Checked_VMESS_WS
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.VMESS_WS);
|
||||
}
|
||||
}
|
||||
|
||||
public bool Checked_VMESS_KCP
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.VMESS_KCP);
|
||||
}
|
||||
}
|
||||
|
||||
public bool Checked_VMESS_QUIC
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.VMESS_QUIC);
|
||||
}
|
||||
}
|
||||
|
||||
public bool Checked_Trojan_TCP
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.Trojan_TCP);
|
||||
}
|
||||
}
|
||||
|
||||
public bool CheckedShadowSocks
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.ShadowsocksAEAD);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
572
ProxySuper.Core/ViewModels/V2rayEditorViewModel.cs
Normal file
572
ProxySuper.Core/ViewModels/V2rayEditorViewModel.cs
Normal file
|
@ -0,0 +1,572 @@
|
|||
using MvvmCross.Commands;
|
||||
using MvvmCross.Navigation;
|
||||
using MvvmCross.ViewModels;
|
||||
using ProxySuper.Core.Models;
|
||||
using ProxySuper.Core.Models.Hosts;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using ProxySuper.Core.Services;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Controls;
|
||||
|
||||
namespace ProxySuper.Core.ViewModels
|
||||
{
|
||||
public partial class V2rayEditorViewModel : MvxViewModel<Record, Record>
|
||||
{
|
||||
public V2rayEditorViewModel(IMvxNavigationService navigationService)
|
||||
{
|
||||
NavigationService = navigationService;
|
||||
}
|
||||
|
||||
public string Id { get; set; }
|
||||
|
||||
public Host Host { get; set; }
|
||||
|
||||
public V2raySettings Settings { get; set; }
|
||||
|
||||
public IMvxCommand SaveCommand => new MvxCommand(Save);
|
||||
|
||||
public IMvxCommand SaveAndInstallCommand => new MvxCommand(SaveAndInstall);
|
||||
|
||||
public IMvxNavigationService NavigationService { get; }
|
||||
|
||||
public override void Prepare(Record parameter)
|
||||
{
|
||||
var record = Utils.DeepClone(parameter);
|
||||
Id = record.Id;
|
||||
Host = record.Host;
|
||||
Settings = record.V2raySettings;
|
||||
}
|
||||
|
||||
public void Save()
|
||||
{
|
||||
NavigationService.Close(this, new Record()
|
||||
{
|
||||
Id = Id,
|
||||
Host = Host,
|
||||
V2raySettings = Settings,
|
||||
});
|
||||
}
|
||||
|
||||
public void SaveAndInstall()
|
||||
{
|
||||
var record = new Record()
|
||||
{
|
||||
Id = Id,
|
||||
Host = Host,
|
||||
V2raySettings = Settings,
|
||||
};
|
||||
NavigationService.Close(this, record);
|
||||
NavigationService.Navigate<V2rayInstallViewModel, Record>(record);
|
||||
}
|
||||
}
|
||||
|
||||
public partial class V2rayEditorViewModel
|
||||
{
|
||||
public List<string> KcpTypes => V2raySettings.DisguiseTypes;
|
||||
|
||||
public List<string> QuicTypes => V2raySettings.DisguiseTypes;
|
||||
|
||||
/// <summary>
|
||||
/// https://www.v2ray.com/chapter_02/transport/quic.html
|
||||
/// </summary>
|
||||
public List<string> QuicSecurities => new List<string> {
|
||||
"none",
|
||||
"aes-128-gcm",
|
||||
"chacha20-poly1305"
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// https://www.v2ray.com/chapter_02/protocols/shadowsocks.html
|
||||
/// </summary>
|
||||
public List<string> ShadowSocksMethods => new List<string> {
|
||||
"aes-256-cfb",
|
||||
"aes-128-cfb",
|
||||
"chacha20",
|
||||
"chacha20-ietf",
|
||||
"aes-256-gcm",
|
||||
"aes-128-gcm",
|
||||
"chacha20-poly1305"
|
||||
};
|
||||
|
||||
public IMvxCommand RandomUuid => new MvxCommand(() => GetUuid());
|
||||
|
||||
public bool WithTLS
|
||||
{
|
||||
get => Settings.WithTLS;
|
||||
set
|
||||
{
|
||||
Settings.WithTLS = value;
|
||||
RaisePropertyChanged("Port");
|
||||
}
|
||||
}
|
||||
|
||||
public int Port
|
||||
{
|
||||
get => Settings.Port;
|
||||
set
|
||||
{
|
||||
Settings.Port = value;
|
||||
RaisePropertyChanged("Port");
|
||||
}
|
||||
}
|
||||
|
||||
public int VLESS_KCP_Port
|
||||
{
|
||||
get => Settings.VLESS_KCP_Port;
|
||||
set
|
||||
{
|
||||
Settings.VLESS_KCP_Port = value;
|
||||
RaisePropertyChanged("VLESS_KCP_Port");
|
||||
}
|
||||
}
|
||||
|
||||
public int VMESS_KCP_Port
|
||||
{
|
||||
get => Settings.VMESS_KCP_Port;
|
||||
set
|
||||
{
|
||||
Settings.VMESS_KCP_Port = value;
|
||||
RaisePropertyChanged("VMESS_KCP_Port");
|
||||
}
|
||||
}
|
||||
|
||||
public string UUID
|
||||
{
|
||||
get => Settings.UUID;
|
||||
set
|
||||
{
|
||||
Settings.UUID = value;
|
||||
RaisePropertyChanged("UUID");
|
||||
}
|
||||
}
|
||||
|
||||
public string MultiUUID
|
||||
{
|
||||
get => string.Join(",", Settings.MulitUUID);
|
||||
set
|
||||
{
|
||||
var input = value.Replace(',', ',');
|
||||
var arr = input.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList();
|
||||
arr.RemoveAll(x => x == this.UUID);
|
||||
Settings.MulitUUID = arr;
|
||||
RaisePropertyChanged("MultiUUID");
|
||||
}
|
||||
}
|
||||
|
||||
public string Domain
|
||||
{
|
||||
get => Settings.Domain;
|
||||
set
|
||||
{
|
||||
Settings.Domain = value;
|
||||
RaisePropertyChanged("Domain");
|
||||
}
|
||||
}
|
||||
|
||||
public string MaskDomain
|
||||
{
|
||||
get => Settings.MaskDomain;
|
||||
set
|
||||
{
|
||||
Settings.MaskDomain = value;
|
||||
RaisePropertyChanged("MaskDomain");
|
||||
}
|
||||
}
|
||||
|
||||
#region Torjan
|
||||
public string TrojanPassword
|
||||
{
|
||||
get => Settings.TrojanPassword;
|
||||
set => Settings.TrojanPassword = value;
|
||||
}
|
||||
public bool Checked_Trojan_TCP
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.Trojan_TCP);
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value == true)
|
||||
{
|
||||
if (!Settings.Types.Contains(RayType.Trojan_TCP))
|
||||
Settings.Types.Add(RayType.Trojan_TCP);
|
||||
}
|
||||
else
|
||||
{
|
||||
Settings.Types.Remove(RayType.Trojan_TCP);
|
||||
}
|
||||
RaisePropertyChanged("Checked_Trojan_TCP");
|
||||
}
|
||||
}
|
||||
public string Trojan_TCP_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(RayType.Trojan_TCP, Settings);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region ShadowSocks
|
||||
public int ShadowSocksPort
|
||||
{
|
||||
get => Settings.ShadowSocksPort;
|
||||
set
|
||||
{
|
||||
Settings.ShadowSocksPort = value;
|
||||
RaisePropertyChanged("ShadowSocksPort");
|
||||
}
|
||||
}
|
||||
public bool CheckedShadowSocks
|
||||
{
|
||||
|
||||
get => Settings.Types.Contains(RayType.ShadowsocksAEAD);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, RayType.ShadowsocksAEAD);
|
||||
RaisePropertyChanged("CheckedShadowSocks");
|
||||
}
|
||||
}
|
||||
|
||||
public string ShadowSocksPassword
|
||||
{
|
||||
get => Settings.ShadowSocksPassword;
|
||||
set => Settings.ShadowSocksPassword = value;
|
||||
}
|
||||
public string ShadowSocksMethod
|
||||
{
|
||||
get => Settings.ShadowSocksMethod;
|
||||
set
|
||||
{
|
||||
var namespaceStr = typeof(ComboBoxItem).FullName + ":";
|
||||
var trimValue = value.Replace(namespaceStr, "");
|
||||
trimValue = trimValue.Trim();
|
||||
Settings.ShadowSocksMethod = trimValue;
|
||||
RaisePropertyChanged("ShadowSocksMethod");
|
||||
}
|
||||
}
|
||||
public string ShadowSocksShareLink
|
||||
{
|
||||
get => ShareLink.Build(RayType.ShadowsocksAEAD, Settings);
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
private void CheckBoxChanged(bool value, RayType type)
|
||||
{
|
||||
if (value == true)
|
||||
{
|
||||
if (!Settings.Types.Contains(type))
|
||||
{
|
||||
Settings.Types.Add(type);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Settings.Types.RemoveAll(x => x == type);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void GetUuid()
|
||||
{
|
||||
UUID = Guid.NewGuid().ToString();
|
||||
RaisePropertyChanged("UUID");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// VMESS SETTINGS
|
||||
/// </summary>
|
||||
public partial class V2rayEditorViewModel
|
||||
{
|
||||
#region VMESS TCP
|
||||
public bool Checked_VMESS_TCP
|
||||
{
|
||||
get => Settings.Types.Contains(RayType.VMESS_TCP);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, RayType.VMESS_TCP);
|
||||
RaisePropertyChanged("Checked_VMESS_TCP");
|
||||
}
|
||||
}
|
||||
public string VMESS_TCP_Path
|
||||
{
|
||||
get => Settings.VMESS_TCP_Path;
|
||||
set => Settings.VMESS_TCP_Path = value;
|
||||
}
|
||||
public string VMESS_TCP_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(RayType.VMESS_TCP, Settings);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VMESS WS
|
||||
public bool Checked_VMESS_WS
|
||||
{
|
||||
get => Settings.Types.Contains(RayType.VMESS_WS);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, RayType.VMESS_WS);
|
||||
RaisePropertyChanged("Checked_VMESS_WS");
|
||||
}
|
||||
}
|
||||
public string VMESS_WS_Path
|
||||
{
|
||||
get => Settings.VMESS_WS_Path;
|
||||
set => Settings.VMESS_WS_Path = value;
|
||||
}
|
||||
public string VMESS_WS_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(RayType.VMESS_WS, Settings);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VMESS KCP
|
||||
public string VMESS_KCP_Seed
|
||||
{
|
||||
get => Settings.VMESS_KCP_Seed;
|
||||
set => Settings.VMESS_KCP_Seed = value;
|
||||
}
|
||||
public string VMESS_KCP_Type
|
||||
{
|
||||
get => Settings.VMESS_KCP_Type;
|
||||
set
|
||||
{
|
||||
var namespaceStr = typeof(ComboBoxItem).FullName + ":";
|
||||
var trimValue = value.Replace(namespaceStr, "");
|
||||
trimValue = trimValue.Trim();
|
||||
Settings.VMESS_KCP_Type = trimValue;
|
||||
RaisePropertyChanged("VMESS_KCP_Type");
|
||||
}
|
||||
}
|
||||
public bool Checked_VMESS_KCP
|
||||
{
|
||||
get => Settings.Types.Contains(RayType.VMESS_KCP);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, RayType.VMESS_KCP);
|
||||
RaisePropertyChanged("Checked_VMESS_KCP");
|
||||
}
|
||||
}
|
||||
public string VMESS_KCP_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(RayType.VMESS_KCP, Settings);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VMESS QUIC
|
||||
public bool Checked_VMESS_QUIC
|
||||
{
|
||||
get => Settings.Types.Contains(RayType.VMESS_QUIC);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, RayType.VMESS_QUIC);
|
||||
RaisePropertyChanged(nameof(Checked_VMESS_QUIC));
|
||||
}
|
||||
}
|
||||
public string VMESS_QUIC_Key
|
||||
{
|
||||
get => Settings.VMESS_QUIC_Key;
|
||||
set
|
||||
{
|
||||
Settings.VMESS_QUIC_Key = value;
|
||||
RaisePropertyChanged(nameof(VMESS_QUIC_Key));
|
||||
}
|
||||
}
|
||||
public string VMESS_QUIC_Security
|
||||
{
|
||||
get => Settings.VMESS_QUIC_Security;
|
||||
set
|
||||
{
|
||||
Settings.VMESS_QUIC_Security = value;
|
||||
RaisePropertyChanged(nameof(VMESS_QUIC_Security));
|
||||
}
|
||||
}
|
||||
public string VMESS_QUIC_Type
|
||||
{
|
||||
get => Settings.VMESS_QUIC_Type;
|
||||
set
|
||||
{
|
||||
Settings.VMESS_QUIC_Type = value;
|
||||
RaisePropertyChanged(nameof(VMESS_QUIC_Type));
|
||||
}
|
||||
}
|
||||
public int VMESS_QUIC_Port
|
||||
{
|
||||
get => Settings.VMESS_QUIC_Port;
|
||||
set
|
||||
{
|
||||
Settings.VMESS_QUIC_Port = value;
|
||||
RaisePropertyChanged(nameof(VMESS_QUIC_Port));
|
||||
}
|
||||
}
|
||||
public string VMESS_QUIC_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(RayType.VMESS_QUIC, Settings);
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// VLESS SETTINGS
|
||||
/// </summary>
|
||||
public partial class V2rayEditorViewModel
|
||||
{
|
||||
#region VLESS TCP
|
||||
public bool Checked_VLESS_TCP
|
||||
{
|
||||
get => Settings.Types.Contains(RayType.VLESS_TCP);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, RayType.VLESS_TCP);
|
||||
RaisePropertyChanged("Checked_VLESS_TCP");
|
||||
}
|
||||
}
|
||||
public string VLESS_TCP_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(RayType.VLESS_TCP, Settings);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VLESS WS
|
||||
public string VLESS_WS_Path
|
||||
{
|
||||
get => Settings.VLESS_WS_Path;
|
||||
set => Settings.VLESS_WS_Path = value;
|
||||
}
|
||||
public bool Checked_VLESS_WS
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.VLESS_WS);
|
||||
}
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, RayType.VLESS_WS);
|
||||
RaisePropertyChanged("Checked_VLESS_WS");
|
||||
}
|
||||
}
|
||||
public string VLESS_WS_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(RayType.VLESS_WS, Settings);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VLESS KCP
|
||||
public string VLESS_KCP_Seed
|
||||
{
|
||||
get => Settings.VLESS_KCP_Seed;
|
||||
set => Settings.VLESS_KCP_Seed = value;
|
||||
}
|
||||
public string VLESS_KCP_Type
|
||||
{
|
||||
get => Settings.VLESS_KCP_Type;
|
||||
set
|
||||
{
|
||||
var namespaceStr = typeof(ComboBoxItem).FullName + ":";
|
||||
var trimValue = value.Replace(namespaceStr, "");
|
||||
trimValue = trimValue.Trim();
|
||||
Settings.VLESS_KCP_Type = trimValue;
|
||||
RaisePropertyChanged("VLESS_KCP_Type");
|
||||
}
|
||||
}
|
||||
public bool Checked_VLESS_KCP
|
||||
{
|
||||
get => Settings.Types.Contains(RayType.VLESS_KCP);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, RayType.VLESS_KCP);
|
||||
RaisePropertyChanged("Checked_VLESS_KCP");
|
||||
}
|
||||
}
|
||||
public string VLESS_KCP_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(RayType.VLESS_KCP, Settings);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VLESS QUIC
|
||||
public bool Checked_VLESS_QUIC
|
||||
{
|
||||
get => Settings.Types.Contains(RayType.VLESS_QUIC);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, RayType.VLESS_QUIC);
|
||||
RaisePropertyChanged(nameof(Checked_VLESS_QUIC));
|
||||
}
|
||||
}
|
||||
public string VLESS_QUIC_Key
|
||||
{
|
||||
get => Settings.VLESS_QUIC_Key; set
|
||||
{
|
||||
Settings.VLESS_QUIC_Key = value;
|
||||
RaisePropertyChanged(nameof(VLESS_QUIC_Key));
|
||||
}
|
||||
}
|
||||
public string VLESS_QUIC_Security
|
||||
{
|
||||
get => Settings.VLESS_QUIC_Security;
|
||||
set
|
||||
{
|
||||
Settings.VLESS_QUIC_Security = value;
|
||||
RaisePropertyChanged(nameof(VLESS_QUIC_Security));
|
||||
}
|
||||
}
|
||||
public string VLESS_QUIC_Type
|
||||
{
|
||||
get => Settings.VLESS_QUIC_Type;
|
||||
set
|
||||
{
|
||||
Settings.VLESS_QUIC_Type = value;
|
||||
RaisePropertyChanged(nameof(VLESS_QUIC_Type));
|
||||
}
|
||||
}
|
||||
public int VLESS_QUIC_Port
|
||||
{
|
||||
get => Settings.VLESS_QUIC_Port;
|
||||
set
|
||||
{
|
||||
Settings.VLESS_QUIC_Port = value;
|
||||
RaisePropertyChanged(nameof(VLESS_QUIC_Port));
|
||||
}
|
||||
}
|
||||
public string VLESS_QUIC_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(RayType.VLESS_QUIC, Settings);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VLESS gRPC
|
||||
public string VLESS_gRPC_ServiceName
|
||||
{
|
||||
get => Settings.VLESS_gRPC_ServiceName;
|
||||
set => Settings.VLESS_gRPC_ServiceName = value;
|
||||
}
|
||||
public int VLESS_gRPC_Port
|
||||
{
|
||||
get => Settings.VLESS_gRPC_Port;
|
||||
set => Settings.VLESS_gRPC_Port = value;
|
||||
}
|
||||
public bool Checked_VLESS_gRPC
|
||||
{
|
||||
get => Settings.Types.Contains(RayType.VLESS_gRPC);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, RayType.VLESS_gRPC);
|
||||
RaisePropertyChanged("Checked_VLESS_gRPC");
|
||||
}
|
||||
}
|
||||
public string VLESS_gRPC_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(RayType.VLESS_gRPC, Settings);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
88
ProxySuper.Core/ViewModels/V2rayInstallViewModel.cs
Normal file
88
ProxySuper.Core/ViewModels/V2rayInstallViewModel.cs
Normal file
|
@ -0,0 +1,88 @@
|
|||
using MvvmCross.Commands;
|
||||
using MvvmCross.ViewModels;
|
||||
using ProxySuper.Core.Models;
|
||||
using ProxySuper.Core.Models.Hosts;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using ProxySuper.Core.Services;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySuper.Core.ViewModels
|
||||
{
|
||||
public class V2rayInstallViewModel : MvxViewModel<Record>
|
||||
{
|
||||
Host _host;
|
||||
|
||||
V2raySettings _settings;
|
||||
|
||||
V2rayService _service;
|
||||
|
||||
public override void ViewDestroy(bool viewFinishing = true)
|
||||
{
|
||||
_service.Disconnect();
|
||||
this.SaveInstallLog();
|
||||
base.ViewDestroy(viewFinishing);
|
||||
}
|
||||
|
||||
public override void Prepare(Record parameter)
|
||||
{
|
||||
this._host = parameter.Host;
|
||||
this._settings = parameter.V2raySettings;
|
||||
}
|
||||
|
||||
public override Task Initialize()
|
||||
{
|
||||
_service = new V2rayService(_host, _settings);
|
||||
_service.Progress.StepUpdate = () => RaisePropertyChanged("Progress");
|
||||
_service.Progress.LogsUpdate = () => RaisePropertyChanged("Logs");
|
||||
_service.Connect();
|
||||
|
||||
return base.Initialize();
|
||||
}
|
||||
|
||||
public ProjectProgress Progress
|
||||
{
|
||||
get => _service.Progress;
|
||||
}
|
||||
|
||||
public string Logs
|
||||
{
|
||||
get => _service.Progress.Logs;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#region Command
|
||||
|
||||
public IMvxCommand InstallCommand => new MvxCommand(_service.Install);
|
||||
|
||||
public IMvxCommand UpdateSettingsCommand => new MvxCommand(_service.UpdateSettings);
|
||||
|
||||
public IMvxCommand UpdateV2rayCoreCommand => new MvxCommand(_service.UpdateV2rayCore);
|
||||
|
||||
public IMvxCommand UninstallCommand => new MvxCommand(_service.Uninstall);
|
||||
|
||||
public IMvxCommand UploadCertCommand => new MvxCommand(_service.UploadCert);
|
||||
|
||||
public IMvxCommand UploadWebCommand => new MvxCommand(_service.UploadWeb);
|
||||
|
||||
public IMvxCommand ApplyForCertCommand => new MvxCommand(_service.ApplyForCert);
|
||||
|
||||
#endregion
|
||||
|
||||
private void SaveInstallLog()
|
||||
{
|
||||
if (!Directory.Exists("Logs"))
|
||||
{
|
||||
Directory.CreateDirectory("Logs");
|
||||
}
|
||||
|
||||
var fileName = Path.Combine("Logs", DateTime.Now.ToString("yyyy-MM-dd hh-mm") + ".v2ray.txt");
|
||||
File.WriteAllText(fileName, Logs);
|
||||
}
|
||||
}
|
||||
}
|
122
ProxySuper.Core/ViewModels/XrayConfigViewModel.cs
Normal file
122
ProxySuper.Core/ViewModels/XrayConfigViewModel.cs
Normal file
|
@ -0,0 +1,122 @@
|
|||
using MvvmCross.ViewModels;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
|
||||
namespace ProxySuper.Core.ViewModels
|
||||
{
|
||||
public class XrayConfigViewModel : MvxViewModel<XraySettings>
|
||||
{
|
||||
|
||||
public XraySettings Settings { get; set; }
|
||||
|
||||
public override void Prepare(XraySettings parameter)
|
||||
{
|
||||
Settings = parameter;
|
||||
}
|
||||
|
||||
public string Flow
|
||||
{
|
||||
get { return Settings.Flow; }
|
||||
}
|
||||
|
||||
public string UTLS
|
||||
{
|
||||
get { return Settings.UTLS; }
|
||||
}
|
||||
|
||||
public bool Checked_VLESS_TCP_XTLS
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.VLESS_TCP_XTLS);
|
||||
}
|
||||
}
|
||||
|
||||
public bool Checked_VLESS_TCP
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.VLESS_TCP);
|
||||
}
|
||||
}
|
||||
|
||||
public bool Checked_VLESS_WS
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.VLESS_WS);
|
||||
}
|
||||
}
|
||||
|
||||
public bool Checked_VLESS_KCP
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.VLESS_KCP);
|
||||
}
|
||||
}
|
||||
|
||||
public bool Checked_VLESS_QUIC
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.VLESS_QUIC);
|
||||
}
|
||||
}
|
||||
|
||||
public bool Checked_VLESS_gRPC
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.VLESS_gRPC);
|
||||
}
|
||||
}
|
||||
|
||||
public bool Checked_VMESS_TCP
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.VMESS_TCP);
|
||||
}
|
||||
}
|
||||
|
||||
public bool Checked_VMESS_WS
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.VMESS_WS);
|
||||
}
|
||||
}
|
||||
|
||||
public bool Checked_VMESS_KCP
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.VMESS_KCP);
|
||||
}
|
||||
}
|
||||
|
||||
public bool Checked_VMESS_QUIC
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.VMESS_QUIC);
|
||||
}
|
||||
}
|
||||
|
||||
public bool Checked_Trojan_TCP
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.Trojan_TCP);
|
||||
}
|
||||
}
|
||||
|
||||
public bool CheckedShadowSocks
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.ShadowsocksAEAD);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
609
ProxySuper.Core/ViewModels/XrayEditorViewModel.cs
Normal file
609
ProxySuper.Core/ViewModels/XrayEditorViewModel.cs
Normal file
|
@ -0,0 +1,609 @@
|
|||
using MvvmCross.Commands;
|
||||
using MvvmCross.Navigation;
|
||||
using MvvmCross.ViewModels;
|
||||
using ProxySuper.Core.Models;
|
||||
using ProxySuper.Core.Models.Hosts;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using ProxySuper.Core.Services;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Windows.Controls;
|
||||
|
||||
namespace ProxySuper.Core.ViewModels
|
||||
{
|
||||
public partial class XrayEditorViewModel : MvxViewModel<Record, Record>
|
||||
{
|
||||
public XrayEditorViewModel(IMvxNavigationService navigationService)
|
||||
{
|
||||
NavigationService = navigationService;
|
||||
}
|
||||
|
||||
|
||||
public string Id { get; set; }
|
||||
|
||||
public Host Host { get; set; }
|
||||
|
||||
public XraySettings Settings { get; set; }
|
||||
|
||||
public IMvxCommand SaveCommand => new MvxCommand(Save);
|
||||
|
||||
public IMvxCommand SaveAndInstallCommand => new MvxCommand(SaveAndInstall);
|
||||
|
||||
public IMvxNavigationService NavigationService { get; }
|
||||
|
||||
public override void Prepare(Record parameter)
|
||||
{
|
||||
var record = Utils.DeepClone(parameter);
|
||||
Id = record.Id;
|
||||
Host = record.Host;
|
||||
Settings = record.XraySettings;
|
||||
}
|
||||
|
||||
public void Save()
|
||||
{
|
||||
NavigationService.Close(this, new Record()
|
||||
{
|
||||
Id = Id,
|
||||
Host = Host,
|
||||
XraySettings = Settings,
|
||||
});
|
||||
}
|
||||
|
||||
public void SaveAndInstall()
|
||||
{
|
||||
var record = new Record()
|
||||
{
|
||||
Id = Id,
|
||||
Host = Host,
|
||||
XraySettings = Settings,
|
||||
};
|
||||
NavigationService.Close(this, record);
|
||||
NavigationService.Navigate<XrayInstallViewModel, Record>(record);
|
||||
}
|
||||
}
|
||||
|
||||
public partial class XrayEditorViewModel
|
||||
{
|
||||
public List<string> UTLSList { get => XraySettings.UTLSList; }
|
||||
|
||||
public List<string> KcpTypes => V2raySettings.DisguiseTypes;
|
||||
|
||||
public List<string> QuicTypes => V2raySettings.DisguiseTypes;
|
||||
|
||||
public List<string> QuicSecurities => new List<string>
|
||||
{
|
||||
"none",
|
||||
"aes-128-gcm",
|
||||
"chacha20-poly1305"
|
||||
};
|
||||
|
||||
public List<string> ShadowSocksMethods => new List<string>
|
||||
{
|
||||
"2022-blake3-aes-128-gcm",
|
||||
"2022-blake3-aes-256-gcm",
|
||||
"2022-blake3-chacha20-poly1305",
|
||||
"aes-256-gcm",
|
||||
"aes-128-gcm",
|
||||
"chacha20-poly1305",
|
||||
"none"
|
||||
};
|
||||
|
||||
public IMvxCommand RandomUuid => new MvxCommand(() => GetUuid());
|
||||
|
||||
public bool WithTLS
|
||||
{
|
||||
get => Settings.WithTLS;
|
||||
set
|
||||
{
|
||||
Settings.WithTLS = value;
|
||||
RaisePropertyChanged("Port");
|
||||
}
|
||||
}
|
||||
|
||||
public int Port
|
||||
{
|
||||
get => Settings.Port;
|
||||
set
|
||||
{
|
||||
Settings.Port = value;
|
||||
RaisePropertyChanged("Port");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public string UTLS
|
||||
{
|
||||
get => Settings.UTLS;
|
||||
set
|
||||
{
|
||||
Settings.UTLS = value;
|
||||
RaisePropertyChanged(nameof(UTLS));
|
||||
}
|
||||
}
|
||||
|
||||
public int VLESS_KCP_Port
|
||||
{
|
||||
get => Settings.VLESS_KCP_Port;
|
||||
set
|
||||
{
|
||||
Settings.VLESS_KCP_Port = value;
|
||||
RaisePropertyChanged("VLESS_KCP_Port");
|
||||
}
|
||||
}
|
||||
|
||||
public int VMESS_KCP_Port
|
||||
{
|
||||
get => Settings.VMESS_KCP_Port;
|
||||
set
|
||||
{
|
||||
Settings.VMESS_KCP_Port = value;
|
||||
RaisePropertyChanged("VMESS_KCP_Port");
|
||||
}
|
||||
}
|
||||
|
||||
public string UUID
|
||||
{
|
||||
get => Settings.UUID;
|
||||
set
|
||||
{
|
||||
Settings.UUID = value;
|
||||
RaisePropertyChanged("UUID");
|
||||
}
|
||||
}
|
||||
|
||||
public string MultiUUID
|
||||
{
|
||||
get => string.Join(",", Settings.MulitUUID);
|
||||
set
|
||||
{
|
||||
var input = value.Replace(',', ',');
|
||||
var arr = input.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList();
|
||||
arr.RemoveAll(x => x == this.UUID);
|
||||
Settings.MulitUUID = arr;
|
||||
RaisePropertyChanged("MultiUUID");
|
||||
}
|
||||
}
|
||||
|
||||
public string Domain
|
||||
{
|
||||
get => Settings.Domain;
|
||||
set
|
||||
{
|
||||
Settings.Domain = value;
|
||||
RaisePropertyChanged("Domain");
|
||||
}
|
||||
}
|
||||
|
||||
public string MaskDomain
|
||||
{
|
||||
get => Settings.MaskDomain;
|
||||
set
|
||||
{
|
||||
Settings.MaskDomain = value;
|
||||
RaisePropertyChanged("MaskDomain");
|
||||
}
|
||||
}
|
||||
|
||||
#region Trojan
|
||||
public string TrojanPassword
|
||||
{
|
||||
get => Settings.TrojanPassword;
|
||||
set => Settings.TrojanPassword = value;
|
||||
}
|
||||
|
||||
public bool Checked_Trojan_TCP
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.Trojan_TCP);
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value == true)
|
||||
{
|
||||
if (!Settings.Types.Contains(RayType.Trojan_TCP))
|
||||
Settings.Types.Add(RayType.Trojan_TCP);
|
||||
}
|
||||
else
|
||||
{
|
||||
Settings.Types.Remove(RayType.Trojan_TCP);
|
||||
}
|
||||
RaisePropertyChanged("Checked_Trojan_TCP");
|
||||
}
|
||||
}
|
||||
public string Trojan_TCP_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(RayType.Trojan_TCP, Settings);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region ShadowSocks
|
||||
public int ShadowSocksPort
|
||||
{
|
||||
get => Settings.ShadowSocksPort;
|
||||
set
|
||||
{
|
||||
Settings.ShadowSocksPort = value;
|
||||
RaisePropertyChanged("ShadowSocksPort");
|
||||
}
|
||||
}
|
||||
public bool CheckedShadowSocks
|
||||
{
|
||||
|
||||
get => Settings.Types.Contains(RayType.ShadowsocksAEAD);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, RayType.ShadowsocksAEAD);
|
||||
RaisePropertyChanged("CheckedShadowSocks");
|
||||
}
|
||||
}
|
||||
public string ShadowSocksPassword
|
||||
{
|
||||
get => Settings.ShadowSocksPassword;
|
||||
set => Settings.ShadowSocksPassword = value;
|
||||
}
|
||||
public string ShadowSocksMethod
|
||||
{
|
||||
get => Settings.ShadowSocksMethod;
|
||||
set
|
||||
{
|
||||
var namespaceStr = typeof(ComboBoxItem).FullName + ":";
|
||||
var trimValue = value.Replace(namespaceStr, "");
|
||||
trimValue = trimValue.Trim();
|
||||
Settings.ShadowSocksMethod = trimValue;
|
||||
RaisePropertyChanged("ShadowSocksMethod");
|
||||
}
|
||||
}
|
||||
public string ShadowSocksShareLink
|
||||
{
|
||||
get => ShareLink.Build(RayType.ShadowsocksAEAD, Settings);
|
||||
}
|
||||
#endregion
|
||||
|
||||
private void CheckBoxChanged(bool value, RayType type)
|
||||
{
|
||||
if (value == true)
|
||||
{
|
||||
if (!Settings.Types.Contains(type))
|
||||
{
|
||||
Settings.Types.Add(type);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Settings.Types.RemoveAll(x => x == type);
|
||||
}
|
||||
}
|
||||
|
||||
private void GetUuid()
|
||||
{
|
||||
UUID = Guid.NewGuid().ToString();
|
||||
RaisePropertyChanged("UUID");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// VMESS
|
||||
/// </summary>
|
||||
public partial class XrayEditorViewModel
|
||||
{
|
||||
#region VMESS TCP
|
||||
public bool Checked_VMESS_TCP
|
||||
{
|
||||
get => Settings.Types.Contains(RayType.VMESS_TCP);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, RayType.VMESS_TCP);
|
||||
RaisePropertyChanged("Checked_VMESS_TCP");
|
||||
}
|
||||
}
|
||||
public string VMESS_TCP_Path
|
||||
{
|
||||
get => Settings.VMESS_TCP_Path;
|
||||
set => Settings.VMESS_TCP_Path = value;
|
||||
}
|
||||
public string VMESS_TCP_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(RayType.VMESS_TCP, Settings);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VMESS WS
|
||||
public bool Checked_VMESS_WS
|
||||
{
|
||||
get => Settings.Types.Contains(RayType.VMESS_WS);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, RayType.VMESS_WS);
|
||||
RaisePropertyChanged("Checked_VMESS_WS");
|
||||
}
|
||||
}
|
||||
public string VMESS_WS_Path
|
||||
{
|
||||
get => Settings.VMESS_WS_Path;
|
||||
set => Settings.VMESS_WS_Path = value;
|
||||
}
|
||||
public string VMESS_WS_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(RayType.VMESS_WS, Settings);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VMESS KCP
|
||||
public string VMESS_KCP_Seed
|
||||
{
|
||||
get => Settings.VMESS_KCP_Seed;
|
||||
set => Settings.VMESS_KCP_Seed = value;
|
||||
}
|
||||
public string VMESS_KCP_Type
|
||||
{
|
||||
get => Settings.VMESS_KCP_Type;
|
||||
set
|
||||
{
|
||||
var namespaceStr = typeof(ComboBoxItem).FullName + ":";
|
||||
var trimValue = value.Replace(namespaceStr, "");
|
||||
trimValue = trimValue.Trim();
|
||||
Settings.VMESS_KCP_Type = trimValue;
|
||||
RaisePropertyChanged("VMESS_KCP_Type");
|
||||
}
|
||||
}
|
||||
public bool Checked_VMESS_KCP
|
||||
{
|
||||
get => Settings.Types.Contains(RayType.VMESS_KCP);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, RayType.VMESS_KCP);
|
||||
RaisePropertyChanged("Checked_VMESS_KCP");
|
||||
}
|
||||
}
|
||||
public string VMESS_KCP_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(RayType.VMESS_KCP, Settings);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VMESS QUIC
|
||||
public bool Checked_VMESS_QUIC
|
||||
{
|
||||
get => Settings.Types.Contains(RayType.VMESS_QUIC);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, RayType.VMESS_QUIC);
|
||||
RaisePropertyChanged(nameof(Checked_VMESS_QUIC));
|
||||
}
|
||||
}
|
||||
public string VMESS_QUIC_Key
|
||||
{
|
||||
get => Settings.VMESS_QUIC_Key;
|
||||
set
|
||||
{
|
||||
Settings.VMESS_QUIC_Key = value;
|
||||
RaisePropertyChanged(nameof(VMESS_QUIC_Key));
|
||||
}
|
||||
}
|
||||
public string VMESS_QUIC_Security
|
||||
{
|
||||
get => Settings.VMESS_QUIC_Security;
|
||||
set
|
||||
{
|
||||
Settings.VMESS_QUIC_Security = value;
|
||||
RaisePropertyChanged(nameof(VMESS_QUIC_Security));
|
||||
}
|
||||
}
|
||||
public string VMESS_QUIC_Type
|
||||
{
|
||||
get => Settings.VMESS_QUIC_Type;
|
||||
set
|
||||
{
|
||||
Settings.VMESS_QUIC_Type = value;
|
||||
RaisePropertyChanged(nameof(VMESS_QUIC_Type));
|
||||
}
|
||||
}
|
||||
public int VMESS_QUIC_Port
|
||||
{
|
||||
get => Settings.VMESS_QUIC_Port;
|
||||
set
|
||||
{
|
||||
Settings.VMESS_QUIC_Port = value;
|
||||
RaisePropertyChanged(nameof(VMESS_QUIC_Port));
|
||||
}
|
||||
}
|
||||
public string VMESS_QUIC_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(RayType.VMESS_QUIC, Settings);
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// VLESS
|
||||
/// </summary>
|
||||
public partial class XrayEditorViewModel
|
||||
{
|
||||
#region VLESS XTLS
|
||||
|
||||
public List<string> FlowList { get => XraySettings.FlowList; }
|
||||
|
||||
public string Flow
|
||||
{
|
||||
get => Settings.Flow;
|
||||
set
|
||||
{
|
||||
Settings.Flow = value;
|
||||
RaisePropertyChanged(nameof(Flow));
|
||||
}
|
||||
}
|
||||
public bool Checked_VLESS_TCP_XTLS
|
||||
{
|
||||
get => Settings.Types.Contains(RayType.VLESS_TCP_XTLS);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, RayType.VLESS_TCP_XTLS);
|
||||
RaisePropertyChanged("Checked_VLESS_TCP_XTLS");
|
||||
}
|
||||
}
|
||||
public string VLESS_TCP_XTLS_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(RayType.VLESS_TCP_XTLS, Settings);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VLESS TCP
|
||||
public bool Checked_VLESS_TCP
|
||||
{
|
||||
get => Settings.Types.Contains(RayType.VLESS_TCP);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, RayType.VLESS_TCP);
|
||||
RaisePropertyChanged("Checked_VLESS_TCP");
|
||||
}
|
||||
}
|
||||
public string VLESS_TCP_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(RayType.VLESS_TCP, Settings);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VLESS WS
|
||||
public string VLESS_WS_Path
|
||||
{
|
||||
get => Settings.VLESS_WS_Path;
|
||||
set => Settings.VLESS_WS_Path = value;
|
||||
}
|
||||
public bool Checked_VLESS_WS
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.Types.Contains(RayType.VLESS_WS);
|
||||
}
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, RayType.VLESS_WS);
|
||||
RaisePropertyChanged("Checked_VLESS_WS");
|
||||
}
|
||||
}
|
||||
public string VLESS_WS_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(RayType.VLESS_WS, Settings);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VLESS QUIC
|
||||
public string VLESS_QUIC_Key
|
||||
{
|
||||
get => Settings.VLESS_QUIC_Key; set
|
||||
{
|
||||
Settings.VLESS_QUIC_Key = value;
|
||||
RaisePropertyChanged(nameof(VLESS_QUIC_Key));
|
||||
}
|
||||
}
|
||||
public bool Checked_VLESS_QUIC
|
||||
{
|
||||
get => Settings.Types.Contains(RayType.VLESS_QUIC);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, RayType.VLESS_QUIC);
|
||||
RaisePropertyChanged(nameof(Checked_VLESS_QUIC));
|
||||
}
|
||||
}
|
||||
public string VLESS_QUIC_Security
|
||||
{
|
||||
get => Settings.VLESS_QUIC_Security;
|
||||
set
|
||||
{
|
||||
Settings.VLESS_QUIC_Security = value;
|
||||
RaisePropertyChanged(nameof(VLESS_QUIC_Security));
|
||||
}
|
||||
}
|
||||
public string VLESS_QUIC_Type
|
||||
{
|
||||
get => Settings.VLESS_QUIC_Type;
|
||||
set
|
||||
{
|
||||
Settings.VLESS_QUIC_Type = value;
|
||||
RaisePropertyChanged(nameof(VLESS_QUIC_Type));
|
||||
}
|
||||
}
|
||||
public int VLESS_QUIC_Port
|
||||
{
|
||||
get => Settings.VLESS_QUIC_Port;
|
||||
set
|
||||
{
|
||||
Settings.VLESS_QUIC_Port = value;
|
||||
RaisePropertyChanged(nameof(VLESS_QUIC_Port));
|
||||
}
|
||||
}
|
||||
public string VLESS_QUIC_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(RayType.VLESS_QUIC, Settings);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VLESS KCP
|
||||
public string VLESS_KCP_Seed
|
||||
{
|
||||
get => Settings.VLESS_KCP_Seed;
|
||||
set
|
||||
{
|
||||
Settings.VLESS_KCP_Seed = value;
|
||||
RaisePropertyChanged(nameof(VLESS_KCP_Seed));
|
||||
}
|
||||
}
|
||||
public string VLESS_KCP_Type
|
||||
{
|
||||
get => Settings.VLESS_KCP_Type;
|
||||
set
|
||||
{
|
||||
var namespaceStr = typeof(ComboBoxItem).FullName + ":";
|
||||
var trimValue = value.Replace(namespaceStr, "");
|
||||
trimValue = trimValue.Trim();
|
||||
Settings.VLESS_KCP_Type = trimValue;
|
||||
RaisePropertyChanged("VLESS_KCP_Type");
|
||||
}
|
||||
}
|
||||
public bool Checked_VLESS_KCP
|
||||
{
|
||||
get => Settings.Types.Contains(RayType.VLESS_KCP);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, RayType.VLESS_KCP);
|
||||
RaisePropertyChanged("Checked_VLESS_KCP");
|
||||
}
|
||||
}
|
||||
public string VLESS_KCP_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(RayType.VLESS_KCP, Settings);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region VLESS gRPC
|
||||
public string VLESS_gRPC_ServiceName
|
||||
{
|
||||
get => Settings.VLESS_gRPC_ServiceName;
|
||||
set => Settings.VLESS_gRPC_ServiceName = value;
|
||||
}
|
||||
public int VLESS_gRPC_Port
|
||||
{
|
||||
get => Settings.VLESS_gRPC_Port;
|
||||
set => Settings.VLESS_gRPC_Port = value;
|
||||
}
|
||||
public bool Checked_VLESS_gRPC
|
||||
{
|
||||
get => Settings.Types.Contains(RayType.VLESS_gRPC);
|
||||
set
|
||||
{
|
||||
CheckBoxChanged(value, RayType.VLESS_gRPC);
|
||||
RaisePropertyChanged("Checked_VLESS_gRPC");
|
||||
}
|
||||
}
|
||||
public string VLESS_gRPC_ShareLink
|
||||
{
|
||||
get => ShareLink.Build(RayType.VLESS_gRPC, Settings);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
}
|
88
ProxySuper.Core/ViewModels/XrayInstallViewModel.cs
Normal file
88
ProxySuper.Core/ViewModels/XrayInstallViewModel.cs
Normal file
|
@ -0,0 +1,88 @@
|
|||
using MvvmCross.Commands;
|
||||
using MvvmCross.ViewModels;
|
||||
using ProxySuper.Core.Models;
|
||||
using ProxySuper.Core.Models.Hosts;
|
||||
using ProxySuper.Core.Models.Projects;
|
||||
using ProxySuper.Core.Services;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxySuper.Core.ViewModels
|
||||
{
|
||||
public class XrayInstallViewModel : MvxViewModel<Record>
|
||||
{
|
||||
Host _host;
|
||||
|
||||
XraySettings _settings;
|
||||
|
||||
XrayService _xrayService;
|
||||
|
||||
public override void ViewDestroy(bool viewFinishing = true)
|
||||
{
|
||||
_xrayService.Disconnect();
|
||||
this.SaveInstallLog();
|
||||
base.ViewDestroy(viewFinishing);
|
||||
}
|
||||
|
||||
public override void Prepare(Record parameter)
|
||||
{
|
||||
this._host = parameter.Host;
|
||||
this._settings = parameter.XraySettings;
|
||||
}
|
||||
|
||||
public override Task Initialize()
|
||||
{
|
||||
_xrayService = new XrayService(_host, _settings);
|
||||
_xrayService.Progress.StepUpdate = () => RaisePropertyChanged("Progress");
|
||||
_xrayService.Progress.LogsUpdate = () => RaisePropertyChanged("Logs");
|
||||
_xrayService.Connect();
|
||||
|
||||
return base.Initialize();
|
||||
}
|
||||
|
||||
public ProjectProgress Progress
|
||||
{
|
||||
get => _xrayService.Progress;
|
||||
}
|
||||
|
||||
public string Logs
|
||||
{
|
||||
get => _xrayService.Progress.Logs;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#region Command
|
||||
|
||||
public IMvxCommand InstallCommand => new MvxCommand(_xrayService.Install);
|
||||
|
||||
public IMvxCommand UpdateSettingsCommand => new MvxCommand(_xrayService.UpdateSettings);
|
||||
|
||||
public IMvxCommand UpdateXrayCoreCommand => new MvxCommand(_xrayService.UpdateXrayCore);
|
||||
|
||||
public IMvxCommand UninstallCommand => new MvxCommand(_xrayService.Uninstall);
|
||||
|
||||
public IMvxCommand UploadCertCommand => new MvxCommand(_xrayService.UploadCert);
|
||||
|
||||
public IMvxCommand UploadWebCommand => new MvxCommand(_xrayService.UploadWeb);
|
||||
|
||||
public IMvxCommand ApplyForCertCommand => new MvxCommand(_xrayService.ApplyForCert);
|
||||
|
||||
#endregion
|
||||
|
||||
private void SaveInstallLog()
|
||||
{
|
||||
if (!Directory.Exists("Logs"))
|
||||
{
|
||||
Directory.CreateDirectory("Logs");
|
||||
}
|
||||
|
||||
var fileName = Path.Combine("Logs", DateTime.Now.ToString("yyyy-MM-dd hh-mm") + ".xary.txt");
|
||||
File.WriteAllText(fileName, Logs);
|
||||
}
|
||||
}
|
||||
}
|
15
ProxySuper.Core/app.config
Normal file
15
ProxySuper.Core/app.config
Normal file
|
@ -0,0 +1,15 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<runtime>
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="Microsoft.Extensions.Logging.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
</configuration>
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue