From b614bc676c27bcf660d5e4e92b0117c941683bf8 Mon Sep 17 00:00:00 2001 From: next-autumn Date: Wed, 26 May 2021 16:50:19 +0800 Subject: [PATCH] v4.0.1 release --- 7z/7z.exe | Bin 474624 -> 0 bytes 7z/readme.md | 1 - ProxySU.sln | 17 - ProxySU/App.xaml | 15 - ProxySU/App.xaml.cs | 16 - ProxySU/ClassModel.cs | 86 - ProxySU/MainWindow.xaml | 849 - ProxySU/MainWindow.xaml.cs | 10528 -------- ProxySU/ProofreadTimeWindow.xaml | 58 - ProxySU/ProofreadTimeWindow.xaml.cs | 258 - ProxySU/Properties/AssemblyInfo.cs | 55 - ProxySU/Properties/Resources.Designer.cs | 71 - ProxySU/Properties/Resources.resx | 117 - ProxySU/Properties/Settings.Designer.cs | 30 - ProxySU/Properties/Settings.settings | 7 - ProxySU/ProxySU.csproj | 213 - ProxySU/ProxySU.csproj.user | 17 - ProxySU/ProxySU.ico | Bin 16958 -> 0 bytes ProxySU/ResultClientInformation.xaml | 570 - ProxySU/ResultClientInformation.xaml.cs | 4942 ---- ProxySU/SSpluginWindow.xaml | 279 - ProxySU/SSpluginWindow.xaml.cs | 394 - ProxySU/Translations/ProxySU.en-US.xaml | 619 - ProxySU/Translations/ProxySU.zh-CN.xaml | 507 - ProxySU/Translations/ProxySU.zh-TW.xaml | 488 - ProxySU/TrojanGoTemplateWindow.xaml | 131 - ProxySU/TrojanGoTemplateWindow.xaml.cs | 194 - ProxySU/V2RayTemplateWindow.xaml | 390 - ProxySU/V2RayTemplateWindow.xaml.cs | 1146 - ProxySU/XayTemplateWindow.xaml | 390 - ProxySU/XayTemplateWindow.xaml.cs | 1146 - ProxySU/bin/Beta/Beta.zip | Bin 795020 -> 0 bytes ProxySU/packages.config | 4 - ProxySU_Core/App.config | 14 - ProxySU_Core/App.xaml | 33 - ProxySU_Core/App.xaml.cs | 17 - ProxySU_Core/AssemblyInfo.cs | 10 - ProxySU_Core/Common/Base64.cs | 23 - .../Converters/LoginSecretTypeConverter.cs | 32 - ProxySU_Core/Converters/ProxyTypeConverter.cs | 31 - ProxySU_Core/Converters/VisibleConverter.cs | 34 - ProxySU_Core/Models/AppSettings.cs | 13 - ProxySU_Core/Models/Developers/IParameters.cs | 15 - ProxySU_Core/Models/Developers/Project.cs | 740 - .../Developers/TrojanGoConfigBuilder.cs | 63 - .../Models/Developers/TrojanGoProject.cs | 135 - .../Models/Developers/TrojanGoSettings.cs | 29 - .../Models/Developers/XrayConfigBuilder.cs | 232 - ProxySU_Core/Models/Developers/XrayProject.cs | 321 - .../Models/Developers/XraySettings.cs | 220 - ProxySU_Core/Models/Host.cs | 35 - ProxySU_Core/Models/LocalProxy.cs | 20 - ProxySU_Core/Models/LocalProxyType.cs | 23 - ProxySU_Core/Models/LoginSecretType.cs | 12 - ProxySU_Core/Models/Record.cs | 24 - ProxySU_Core/Models/ShareLink.cs | 196 - ProxySU_Core/Models/XrayType.cs | 34 - ProxySU_Core/Properties/AssemblyInfo.cs | 55 - ProxySU_Core/Properties/Resources.Designer.cs | 63 - ProxySU_Core/Properties/Resources.resx | 117 - ProxySU_Core/Properties/Settings.Designer.cs | 26 - ProxySU_Core/Properties/Settings.settings | 7 - ProxySU_Core/ProxySU.ico | Bin 16958 -> 0 bytes ProxySU_Core/ProxySU_Core.csproj | 463 - ProxySU_Core/Resources/Languages/en.xaml | 122 - ProxySU_Core/Resources/Languages/zh_cn.xaml | 120 - ProxySU_Core/Resources/ProxySU.ico | Bin 16958 -> 0 bytes .../MaterialDesignThemes.Overrides.xaml | 48 - .../Templates/trojan-go/base.caddyfile | 9 - .../Templates/trojan-go/trojan-go.json | 16 - ProxySU_Core/Templates/xray/base.json | 12 - .../Templates/xray/caddy/base.caddyfile | 9 - .../Templates/xray/client/00_log/00_log.json | 5 - .../Templates/xray/client/01_api/01_api.json | 3 - .../Templates/xray/client/02_dns/02_dns.json | 3 - .../xray/client/03_routing/03_routing.json | 3 - .../xray/client/04_policy/04_policy.json | 3 - .../xray/client/05_inbounds/05_inbounds.json | 23 - .../client/06_outbounds/06_outbounds.json | 3 - .../client/06_outbounds/VLESS_HTTP2_TLS.json | 31 - .../client/06_outbounds/VLESS_TCP_TLS_WS.json | 32 - .../client/07_transport/07_transport.json | 3 - .../xray/client/08_stats/08_stats.json | 3 - .../xray/client/09_reverse/09_reverse.json | 3 - .../Templates/xray/server/00_log/00_log.json | 6 - .../Templates/xray/server/01_api/01_api.json | 3 - .../Templates/xray/server/02_dns/02_dns.json | 3 - .../xray/server/03_routing/03_routing.json | 14 - .../xray/server/04_policy/04_policy.json | 3 - .../xray/server/05_inbounds/05_inbounds.json | 3 - .../server/05_inbounds/Shadowsocks-AEAD.json | 13 - .../xray/server/05_inbounds/Trojan_TCP.json | 24 - .../xray/server/05_inbounds/Trojan_WS.json | 26 - .../xray/server/05_inbounds/VLESS_HTTP2.json | 19 - .../xray/server/05_inbounds/VLESS_KCP.json | 24 - .../server/05_inbounds/VLESS_TCP_XTLS.json | 31 - .../xray/server/05_inbounds/VLESS_WS.json | 21 - .../xray/server/05_inbounds/VLESS_gRPC.json | 25 - .../xray/server/05_inbounds/VMESS_HTTP2.json | 18 - .../xray/server/05_inbounds/VMESS_KCP.json | 23 - .../xray/server/05_inbounds/VMESS_TCP.json | 27 - .../xray/server/05_inbounds/VMESS_WS.json | 20 - .../server/06_outbounds/06_outbounds.json | 12 - .../server/07_transport/07_transport.json | 3 - .../xray/server/08_stats/08_stats.json | 3 - .../xray/server/09_reverse/09_reverse.json | 3 - ProxySU_Core/Tools/DateTimeUtils.cs | 83 - ProxySU_Core/Tools/Extensions.cs | 62 - ProxySU_Core/ViewModels/BaseCommand.cs | 41 - ProxySU_Core/ViewModels/BaseModel.cs | 38 - ProxySU_Core/ViewModels/BaseViewModel.cs | 20 - ProxySU_Core/ViewModels/HostViewModel.cs | 144 - ProxySU_Core/ViewModels/IdValueViewModel.cs | 21 - ProxySU_Core/ViewModels/RecordViewModel.cs | 58 - ProxySU_Core/ViewModels/Terminal.cs | 38 - .../ViewModels/XraySettingsViewModel.cs | 399 - .../Views/ClientInfo/ClientInfoWindow.xaml | 114 - .../Views/ClientInfo/ClientInfoWindow.xaml.cs | 127 - .../Views/ClientInfo/ShadowSocksControl.xaml | 34 - .../ClientInfo/ShadowSocksControl.xaml.cs | 28 - .../Views/ClientInfo/Trojan_TCP_Control.xaml | 29 - .../ClientInfo/Trojan_TCP_Control.xaml.cs | 28 - .../Views/ClientInfo/VLESS_KCP_Control.xaml | 59 - .../ClientInfo/VLESS_KCP_Control.xaml.cs | 28 - .../ClientInfo/VLESS_TCP_TLS_Control.xaml | 64 - .../ClientInfo/VLESS_TCP_TLS_Control.xaml.cs | 28 - .../ClientInfo/VLESS_WS_TLS_Control.xaml | 64 - .../ClientInfo/VLESS_WS_TLS_Control.xaml.cs | 28 - .../Views/ClientInfo/VLESS_XTLS_Control.xaml | 64 - .../ClientInfo/VLESS_XTLS_Control.xaml.cs | 28 - .../Views/ClientInfo/VLESS_gRPC_Control.xaml | 64 - .../ClientInfo/VLESS_gRPC_Control.xaml.cs | 28 - .../Views/ClientInfo/VMESS_KCP_Control.xaml | 59 - .../ClientInfo/VMESS_KCP_Control.xaml.cs | 28 - .../ClientInfo/VMESS_TCP_TLS_Control.xaml | 59 - .../ClientInfo/VMESS_TCP_TLS_Control.xaml.cs | 28 - .../ClientInfo/VMESS_WS_TLS_Control.xaml | 59 - .../ClientInfo/VMESS_WS_TLS_Control.xaml.cs | 28 - ProxySU_Core/Views/MainWindow.xaml | 171 - ProxySU_Core/Views/MainWindow.xaml.cs | 220 - .../RecordEditor/RecordEditorWindow.xaml | 76 - .../RecordEditor/RecordEditorWindow.xaml.cs | 53 - .../Views/RecordEditor/ServerInfoControl.xaml | 198 - .../RecordEditor/ServerInfoControl.xaml.cs | 28 - .../Views/RecordEditor/XrayEditorControl.xaml | 295 - .../RecordEditor/XrayEditorControl.xaml.cs | 28 - ProxySU_Core/Views/TerminalWindow.xaml | 124 - ProxySU_Core/Views/TerminalWindow.xaml.cs | 235 - ProxySU_Core/Views/TextBoxWindow.xaml | 17 - ProxySU_Core/Views/TextBoxWindow.xaml.cs | 33 - ProxySU_Core/packages.config | 12 - TemplateConfg/naive/naive_client_config.json | 5 - TemplateConfg/naive/naive_server.caddyfile | 14 - TemplateConfg/naive/naive_server_config.json | 69 - TemplateConfg/ss/WebSocketTLSWeb.caddyfile | 18 - .../ss/ss_obfs_http_web_config.caddyfile | 7 - TemplateConfg/ss/ss_server_config.json | 13 - .../ss/ss_tls_caddy_config.caddyfile | 10 - TemplateConfg/ssr/ssr_tls.caddyfile | 10 - TemplateConfg/trojan-go/trojan-go.caddyfile | 10 - .../trojan-go/trojan-go_all_config.json | 26 - TemplateConfg/trojan/trojan.caddyfile | 10 - .../trojan/trojan_client_config.json | 33 - .../trojan/trojan_server_config.json | 50 - TemplateConfg/v2ray/base.json | 12 - TemplateConfg/v2ray/caddy/Http2Web.caddyfile | 18 - .../v2ray/caddy/WebSocketTLSWeb.caddyfile | 18 - .../v2ray/caddy/vlessTcpTlsWeb.caddyfile | 10 - TemplateConfg/v2ray/client/00_log/00_log.json | 5 - TemplateConfg/v2ray/client/01_api/01_api.json | 3 - TemplateConfg/v2ray/client/02_dns/02_dns.json | 3 - .../v2ray/client/03_routing/03_routing.json | 3 - .../v2ray/client/04_policy/04_policy.json | 3 - .../v2ray/client/05_inbounds/05_inbounds.json | 22 - .../client/06_outbounds/06_outbounds.json | 3 - .../06_outbounds/Http2Web_client_config.json | 32 - .../Http2selfSigned_client_config.json | 32 - .../WebSocketTLSWeb_client_config.json | 29 - ...WebSocketTLS_selfSigned_client_config.json | 32 - .../WebSocket_TLS_client_config.json | 29 - .../06_outbounds/http2_client_config.json | 29 - .../06_outbounds/mkcp_client_config.json | 34 - .../06_outbounds/quic_client_config.json | 32 - .../tcpTLSselfSigned_client_config.json | 29 - .../06_outbounds/tcp_TLS_client_config.json | 26 - .../06_outbounds/tcp_client_config.json | 25 - .../06_outbounds/tcp_http_client_config.json | 56 - .../client/06_outbounds/trojan_tcp_tls.json | 23 - .../vless_http2_tls_server_config.json | 31 - .../vless_mkcp_client_config.json | 33 - .../vless_tcp_tls_caddy_cilent_config.json | 25 - .../vless_tcp_xtls_client_config.json | 26 - .../vless_ws_tls_client_config.json | 28 - .../vmess_tcp_tls_client_config.json | 36 - .../06_outbounds/webSocket_client_config.json | 25 - .../client/07_transport/07_transport.json | 3 - .../v2ray/client/08_stats/08_stats.json | 3 - .../v2ray/client/09_reverse/09_reverse.json | 3 - TemplateConfg/v2ray/server/00_log/00_log.json | 5 - TemplateConfg/v2ray/server/01_api/01_api.json | 3 - TemplateConfg/v2ray/server/02_dns/02_dns.json | 3 - .../v2ray/server/03_routing/03_routing.json | 14 - .../v2ray/server/04_policy/04_policy.json | 3 - .../server/05_inbounds/00_padavan_router.json | 9 - .../v2ray/server/05_inbounds/05_inbounds.json | 3 - .../05_inbounds/Http2Web_server_config.json | 27 - .../Http2selfSigned_server_config.json | 28 - .../WebSocketTLSWeb_server_config.json | 23 - ...WebSocketTLS_selfSigned_server_config.json | 28 - .../WebSocket_TLS_server_config.json | 31 - .../05_inbounds/http2_server_config.json | 31 - .../05_inbounds/mkcp_server_config.json | 28 - .../05_inbounds/quic_server_config.json | 26 - .../tcpTLSselfSigned_server_config.json | 25 - .../05_inbounds/tcp_TLS_server_config.json | 28 - .../05_inbounds/tcp_http_server_config.json | 44 - .../server/05_inbounds/tcp_server_config.json | 16 - .../vless_http2_tls_server_config.json | 27 - .../05_inbounds/vless_mkcp_server_config.json | 28 - .../vless_tcp_tls_server_config.json | 36 - .../vless_tcp_xtls_server_config.json | 37 - ...mess_xtls_tcp_websocket_server_config.json | 144 - .../vless_ws_tls_server_config.json | 24 - .../05_inbounds/webSocket_server_config.json | 19 - .../server/06_outbounds/06_outbounds.json | 12 - .../server/07_transport/07_transport.json | 3 - .../v2ray/server/08_stats/08_stats.json | 3 - .../v2ray/server/09_reverse/09_reverse.json | 3 - TemplateConfg/xray/base.json | 12 - TemplateConfg/xray/caddy/Http2Web.caddyfile | 18 - .../xray/caddy/WebSocketTLSWeb.caddyfile | 18 - .../xray/caddy/vlessTcpTlsWeb.caddyfile | 10 - TemplateConfg/xray/client/00_log/00_log.json | 5 - TemplateConfg/xray/client/01_api/01_api.json | 3 - TemplateConfg/xray/client/02_dns/02_dns.json | 3 - .../xray/client/03_routing/03_routing.json | 3 - .../xray/client/04_policy/04_policy.json | 3 - .../xray/client/05_inbounds/05_inbounds.json | 22 - .../client/06_outbounds/06_outbounds.json | 3 - .../06_outbounds/Http2Web_client_config.json | 32 - .../Http2selfSigned_client_config.json | 32 - .../WebSocketTLSWeb_client_config.json | 29 - ...WebSocketTLS_selfSigned_client_config.json | 32 - .../WebSocket_TLS_client_config.json | 29 - .../06_outbounds/http2_client_config.json | 29 - .../06_outbounds/mkcp_client_config.json | 34 - .../06_outbounds/quic_client_config.json | 32 - .../tcpTLSselfSigned_client_config.json | 29 - .../06_outbounds/tcp_TLS_client_config.json | 26 - .../06_outbounds/tcp_client_config.json | 25 - .../06_outbounds/tcp_http_client_config.json | 56 - .../client/06_outbounds/trojan_tcp_tls.json | 23 - .../vless_http2_tls_server_config.json | 31 - .../vless_mkcp_client_config.json | 33 - .../vless_tcp_tls_caddy_cilent_config.json | 25 - .../vless_tcp_xtls_client_config.json | 26 - .../vless_ws_tls_client_config.json | 28 - .../vmess_tcp_tls_client_config.json | 36 - .../06_outbounds/webSocket_client_config.json | 25 - .../client/07_transport/07_transport.json | 3 - .../xray/client/08_stats/08_stats.json | 3 - .../xray/client/09_reverse/09_reverse.json | 3 - TemplateConfg/xray/server/00_log/00_log.json | 5 - TemplateConfg/xray/server/01_api/01_api.json | 3 - TemplateConfg/xray/server/02_dns/02_dns.json | 3 - .../xray/server/03_routing/03_routing.json | 14 - .../xray/server/04_policy/04_policy.json | 3 - .../server/05_inbounds/00_padavan_router.json | 9 - .../xray/server/05_inbounds/05_inbounds.json | 3 - .../05_inbounds/Http2Web_server_config.json | 27 - .../Http2selfSigned_server_config.json | 28 - .../WebSocketTLSWeb_server_config.json | 23 - ...WebSocketTLS_selfSigned_server_config.json | 28 - .../WebSocket_TLS_server_config.json | 31 - .../05_inbounds/http2_server_config.json | 31 - .../05_inbounds/mkcp_server_config.json | 28 - .../05_inbounds/quic_server_config.json | 26 - .../tcpTLSselfSigned_server_config.json | 25 - .../05_inbounds/tcp_TLS_server_config.json | 28 - .../05_inbounds/tcp_http_server_config.json | 44 - .../server/05_inbounds/tcp_server_config.json | 16 - .../vless_http2_tls_server_config.json | 27 - .../05_inbounds/vless_mkcp_server_config.json | 28 - .../vless_tcp_tls_server_config.json | 36 - .../vless_tcp_xtls_server_config.json | 37 - ...mess_xtls_tcp_websocket_server_config.json | 145 - .../vless_ws_tls_server_config.json | 24 - .../05_inbounds/webSocket_server_config.json | 19 - .../server/06_outbounds/06_outbounds.json | 12 - .../server/07_transport/07_transport.json | 3 - .../xray/server/08_stats/08_stats.json | 3 - .../xray/server/09_reverse/09_reverse.json | 3 - json.net/net40/Newtonsoft.Json.dll | Bin 574376 -> 0 bytes json.net/net40/Newtonsoft.Json.xml | 9646 ------- json.net/net40/README.md | 1 - qrcoder/net40/QRCoder.dll | Bin 117248 -> 0 bytes qrcoder/net40/readme.md | 1 - ssh.net/net40/Renci.SshNet.dll | Bin 795648 -> 0 bytes ssh.net/net40/Renci.SshNet.xml | 21682 ---------------- 299 files changed, 65290 deletions(-) delete mode 100644 7z/7z.exe delete mode 100644 7z/readme.md delete mode 100644 ProxySU/App.xaml delete mode 100644 ProxySU/App.xaml.cs delete mode 100644 ProxySU/ClassModel.cs delete mode 100644 ProxySU/MainWindow.xaml delete mode 100644 ProxySU/MainWindow.xaml.cs delete mode 100644 ProxySU/ProofreadTimeWindow.xaml delete mode 100644 ProxySU/ProofreadTimeWindow.xaml.cs delete mode 100644 ProxySU/Properties/AssemblyInfo.cs delete mode 100644 ProxySU/Properties/Resources.Designer.cs delete mode 100644 ProxySU/Properties/Resources.resx delete mode 100644 ProxySU/Properties/Settings.Designer.cs delete mode 100644 ProxySU/Properties/Settings.settings delete mode 100644 ProxySU/ProxySU.csproj delete mode 100644 ProxySU/ProxySU.csproj.user delete mode 100644 ProxySU/ProxySU.ico delete mode 100644 ProxySU/ResultClientInformation.xaml delete mode 100644 ProxySU/ResultClientInformation.xaml.cs delete mode 100644 ProxySU/SSpluginWindow.xaml delete mode 100644 ProxySU/SSpluginWindow.xaml.cs delete mode 100644 ProxySU/Translations/ProxySU.en-US.xaml delete mode 100644 ProxySU/Translations/ProxySU.zh-CN.xaml delete mode 100644 ProxySU/Translations/ProxySU.zh-TW.xaml delete mode 100644 ProxySU/TrojanGoTemplateWindow.xaml delete mode 100644 ProxySU/TrojanGoTemplateWindow.xaml.cs delete mode 100644 ProxySU/V2RayTemplateWindow.xaml delete mode 100644 ProxySU/V2RayTemplateWindow.xaml.cs delete mode 100644 ProxySU/XayTemplateWindow.xaml delete mode 100644 ProxySU/XayTemplateWindow.xaml.cs delete mode 100644 ProxySU/bin/Beta/Beta.zip delete mode 100644 ProxySU/packages.config delete mode 100644 ProxySU_Core/App.config delete mode 100644 ProxySU_Core/App.xaml delete mode 100644 ProxySU_Core/App.xaml.cs delete mode 100644 ProxySU_Core/AssemblyInfo.cs delete mode 100644 ProxySU_Core/Common/Base64.cs delete mode 100644 ProxySU_Core/Converters/LoginSecretTypeConverter.cs delete mode 100644 ProxySU_Core/Converters/ProxyTypeConverter.cs delete mode 100644 ProxySU_Core/Converters/VisibleConverter.cs delete mode 100644 ProxySU_Core/Models/AppSettings.cs delete mode 100644 ProxySU_Core/Models/Developers/IParameters.cs delete mode 100644 ProxySU_Core/Models/Developers/Project.cs delete mode 100644 ProxySU_Core/Models/Developers/TrojanGoConfigBuilder.cs delete mode 100644 ProxySU_Core/Models/Developers/TrojanGoProject.cs delete mode 100644 ProxySU_Core/Models/Developers/TrojanGoSettings.cs delete mode 100644 ProxySU_Core/Models/Developers/XrayConfigBuilder.cs delete mode 100644 ProxySU_Core/Models/Developers/XrayProject.cs delete mode 100644 ProxySU_Core/Models/Developers/XraySettings.cs delete mode 100644 ProxySU_Core/Models/Host.cs delete mode 100644 ProxySU_Core/Models/LocalProxy.cs delete mode 100644 ProxySU_Core/Models/LocalProxyType.cs delete mode 100644 ProxySU_Core/Models/LoginSecretType.cs delete mode 100644 ProxySU_Core/Models/Record.cs delete mode 100644 ProxySU_Core/Models/ShareLink.cs delete mode 100644 ProxySU_Core/Models/XrayType.cs delete mode 100644 ProxySU_Core/Properties/AssemblyInfo.cs delete mode 100644 ProxySU_Core/Properties/Resources.Designer.cs delete mode 100644 ProxySU_Core/Properties/Resources.resx delete mode 100644 ProxySU_Core/Properties/Settings.Designer.cs delete mode 100644 ProxySU_Core/Properties/Settings.settings delete mode 100644 ProxySU_Core/ProxySU.ico delete mode 100644 ProxySU_Core/ProxySU_Core.csproj delete mode 100644 ProxySU_Core/Resources/Languages/en.xaml delete mode 100644 ProxySU_Core/Resources/Languages/zh_cn.xaml delete mode 100644 ProxySU_Core/Resources/ProxySU.ico delete mode 100644 ProxySU_Core/Resources/Styles/MaterialDesignThemes.Overrides.xaml delete mode 100644 ProxySU_Core/Templates/trojan-go/base.caddyfile delete mode 100644 ProxySU_Core/Templates/trojan-go/trojan-go.json delete mode 100644 ProxySU_Core/Templates/xray/base.json delete mode 100644 ProxySU_Core/Templates/xray/caddy/base.caddyfile delete mode 100644 ProxySU_Core/Templates/xray/client/00_log/00_log.json delete mode 100644 ProxySU_Core/Templates/xray/client/01_api/01_api.json delete mode 100644 ProxySU_Core/Templates/xray/client/02_dns/02_dns.json delete mode 100644 ProxySU_Core/Templates/xray/client/03_routing/03_routing.json delete mode 100644 ProxySU_Core/Templates/xray/client/04_policy/04_policy.json delete mode 100644 ProxySU_Core/Templates/xray/client/05_inbounds/05_inbounds.json delete mode 100644 ProxySU_Core/Templates/xray/client/06_outbounds/06_outbounds.json delete mode 100644 ProxySU_Core/Templates/xray/client/06_outbounds/VLESS_HTTP2_TLS.json delete mode 100644 ProxySU_Core/Templates/xray/client/06_outbounds/VLESS_TCP_TLS_WS.json delete mode 100644 ProxySU_Core/Templates/xray/client/07_transport/07_transport.json delete mode 100644 ProxySU_Core/Templates/xray/client/08_stats/08_stats.json delete mode 100644 ProxySU_Core/Templates/xray/client/09_reverse/09_reverse.json delete mode 100644 ProxySU_Core/Templates/xray/server/00_log/00_log.json delete mode 100644 ProxySU_Core/Templates/xray/server/01_api/01_api.json delete mode 100644 ProxySU_Core/Templates/xray/server/02_dns/02_dns.json delete mode 100644 ProxySU_Core/Templates/xray/server/03_routing/03_routing.json delete mode 100644 ProxySU_Core/Templates/xray/server/04_policy/04_policy.json delete mode 100644 ProxySU_Core/Templates/xray/server/05_inbounds/05_inbounds.json delete mode 100644 ProxySU_Core/Templates/xray/server/05_inbounds/Shadowsocks-AEAD.json delete mode 100644 ProxySU_Core/Templates/xray/server/05_inbounds/Trojan_TCP.json delete mode 100644 ProxySU_Core/Templates/xray/server/05_inbounds/Trojan_WS.json delete mode 100644 ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_HTTP2.json delete mode 100644 ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_KCP.json delete mode 100644 ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_TCP_XTLS.json delete mode 100644 ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_WS.json delete mode 100644 ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_gRPC.json delete mode 100644 ProxySU_Core/Templates/xray/server/05_inbounds/VMESS_HTTP2.json delete mode 100644 ProxySU_Core/Templates/xray/server/05_inbounds/VMESS_KCP.json delete mode 100644 ProxySU_Core/Templates/xray/server/05_inbounds/VMESS_TCP.json delete mode 100644 ProxySU_Core/Templates/xray/server/05_inbounds/VMESS_WS.json delete mode 100644 ProxySU_Core/Templates/xray/server/06_outbounds/06_outbounds.json delete mode 100644 ProxySU_Core/Templates/xray/server/07_transport/07_transport.json delete mode 100644 ProxySU_Core/Templates/xray/server/08_stats/08_stats.json delete mode 100644 ProxySU_Core/Templates/xray/server/09_reverse/09_reverse.json delete mode 100644 ProxySU_Core/Tools/DateTimeUtils.cs delete mode 100644 ProxySU_Core/Tools/Extensions.cs delete mode 100644 ProxySU_Core/ViewModels/BaseCommand.cs delete mode 100644 ProxySU_Core/ViewModels/BaseModel.cs delete mode 100644 ProxySU_Core/ViewModels/BaseViewModel.cs delete mode 100644 ProxySU_Core/ViewModels/HostViewModel.cs delete mode 100644 ProxySU_Core/ViewModels/IdValueViewModel.cs delete mode 100644 ProxySU_Core/ViewModels/RecordViewModel.cs delete mode 100644 ProxySU_Core/ViewModels/Terminal.cs delete mode 100644 ProxySU_Core/ViewModels/XraySettingsViewModel.cs delete mode 100644 ProxySU_Core/Views/ClientInfo/ClientInfoWindow.xaml delete mode 100644 ProxySU_Core/Views/ClientInfo/ClientInfoWindow.xaml.cs delete mode 100644 ProxySU_Core/Views/ClientInfo/ShadowSocksControl.xaml delete mode 100644 ProxySU_Core/Views/ClientInfo/ShadowSocksControl.xaml.cs delete mode 100644 ProxySU_Core/Views/ClientInfo/Trojan_TCP_Control.xaml delete mode 100644 ProxySU_Core/Views/ClientInfo/Trojan_TCP_Control.xaml.cs delete mode 100644 ProxySU_Core/Views/ClientInfo/VLESS_KCP_Control.xaml delete mode 100644 ProxySU_Core/Views/ClientInfo/VLESS_KCP_Control.xaml.cs delete mode 100644 ProxySU_Core/Views/ClientInfo/VLESS_TCP_TLS_Control.xaml delete mode 100644 ProxySU_Core/Views/ClientInfo/VLESS_TCP_TLS_Control.xaml.cs delete mode 100644 ProxySU_Core/Views/ClientInfo/VLESS_WS_TLS_Control.xaml delete mode 100644 ProxySU_Core/Views/ClientInfo/VLESS_WS_TLS_Control.xaml.cs delete mode 100644 ProxySU_Core/Views/ClientInfo/VLESS_XTLS_Control.xaml delete mode 100644 ProxySU_Core/Views/ClientInfo/VLESS_XTLS_Control.xaml.cs delete mode 100644 ProxySU_Core/Views/ClientInfo/VLESS_gRPC_Control.xaml delete mode 100644 ProxySU_Core/Views/ClientInfo/VLESS_gRPC_Control.xaml.cs delete mode 100644 ProxySU_Core/Views/ClientInfo/VMESS_KCP_Control.xaml delete mode 100644 ProxySU_Core/Views/ClientInfo/VMESS_KCP_Control.xaml.cs delete mode 100644 ProxySU_Core/Views/ClientInfo/VMESS_TCP_TLS_Control.xaml delete mode 100644 ProxySU_Core/Views/ClientInfo/VMESS_TCP_TLS_Control.xaml.cs delete mode 100644 ProxySU_Core/Views/ClientInfo/VMESS_WS_TLS_Control.xaml delete mode 100644 ProxySU_Core/Views/ClientInfo/VMESS_WS_TLS_Control.xaml.cs delete mode 100644 ProxySU_Core/Views/MainWindow.xaml delete mode 100644 ProxySU_Core/Views/MainWindow.xaml.cs delete mode 100644 ProxySU_Core/Views/RecordEditor/RecordEditorWindow.xaml delete mode 100644 ProxySU_Core/Views/RecordEditor/RecordEditorWindow.xaml.cs delete mode 100644 ProxySU_Core/Views/RecordEditor/ServerInfoControl.xaml delete mode 100644 ProxySU_Core/Views/RecordEditor/ServerInfoControl.xaml.cs delete mode 100644 ProxySU_Core/Views/RecordEditor/XrayEditorControl.xaml delete mode 100644 ProxySU_Core/Views/RecordEditor/XrayEditorControl.xaml.cs delete mode 100644 ProxySU_Core/Views/TerminalWindow.xaml delete mode 100644 ProxySU_Core/Views/TerminalWindow.xaml.cs delete mode 100644 ProxySU_Core/Views/TextBoxWindow.xaml delete mode 100644 ProxySU_Core/Views/TextBoxWindow.xaml.cs delete mode 100644 ProxySU_Core/packages.config delete mode 100644 TemplateConfg/naive/naive_client_config.json delete mode 100644 TemplateConfg/naive/naive_server.caddyfile delete mode 100644 TemplateConfg/naive/naive_server_config.json delete mode 100644 TemplateConfg/ss/WebSocketTLSWeb.caddyfile delete mode 100644 TemplateConfg/ss/ss_obfs_http_web_config.caddyfile delete mode 100644 TemplateConfg/ss/ss_server_config.json delete mode 100644 TemplateConfg/ss/ss_tls_caddy_config.caddyfile delete mode 100644 TemplateConfg/ssr/ssr_tls.caddyfile delete mode 100644 TemplateConfg/trojan-go/trojan-go.caddyfile delete mode 100644 TemplateConfg/trojan-go/trojan-go_all_config.json delete mode 100644 TemplateConfg/trojan/trojan.caddyfile delete mode 100644 TemplateConfg/trojan/trojan_client_config.json delete mode 100644 TemplateConfg/trojan/trojan_server_config.json delete mode 100644 TemplateConfg/v2ray/base.json delete mode 100644 TemplateConfg/v2ray/caddy/Http2Web.caddyfile delete mode 100644 TemplateConfg/v2ray/caddy/WebSocketTLSWeb.caddyfile delete mode 100644 TemplateConfg/v2ray/caddy/vlessTcpTlsWeb.caddyfile delete mode 100644 TemplateConfg/v2ray/client/00_log/00_log.json delete mode 100644 TemplateConfg/v2ray/client/01_api/01_api.json delete mode 100644 TemplateConfg/v2ray/client/02_dns/02_dns.json delete mode 100644 TemplateConfg/v2ray/client/03_routing/03_routing.json delete mode 100644 TemplateConfg/v2ray/client/04_policy/04_policy.json delete mode 100644 TemplateConfg/v2ray/client/05_inbounds/05_inbounds.json delete mode 100644 TemplateConfg/v2ray/client/06_outbounds/06_outbounds.json delete mode 100644 TemplateConfg/v2ray/client/06_outbounds/Http2Web_client_config.json delete mode 100644 TemplateConfg/v2ray/client/06_outbounds/Http2selfSigned_client_config.json delete mode 100644 TemplateConfg/v2ray/client/06_outbounds/WebSocketTLSWeb_client_config.json delete mode 100644 TemplateConfg/v2ray/client/06_outbounds/WebSocketTLS_selfSigned_client_config.json delete mode 100644 TemplateConfg/v2ray/client/06_outbounds/WebSocket_TLS_client_config.json delete mode 100644 TemplateConfg/v2ray/client/06_outbounds/http2_client_config.json delete mode 100644 TemplateConfg/v2ray/client/06_outbounds/mkcp_client_config.json delete mode 100644 TemplateConfg/v2ray/client/06_outbounds/quic_client_config.json delete mode 100644 TemplateConfg/v2ray/client/06_outbounds/tcpTLSselfSigned_client_config.json delete mode 100644 TemplateConfg/v2ray/client/06_outbounds/tcp_TLS_client_config.json delete mode 100644 TemplateConfg/v2ray/client/06_outbounds/tcp_client_config.json delete mode 100644 TemplateConfg/v2ray/client/06_outbounds/tcp_http_client_config.json delete mode 100644 TemplateConfg/v2ray/client/06_outbounds/trojan_tcp_tls.json delete mode 100644 TemplateConfg/v2ray/client/06_outbounds/vless_http2_tls_server_config.json delete mode 100644 TemplateConfg/v2ray/client/06_outbounds/vless_mkcp_client_config.json delete mode 100644 TemplateConfg/v2ray/client/06_outbounds/vless_tcp_tls_caddy_cilent_config.json delete mode 100644 TemplateConfg/v2ray/client/06_outbounds/vless_tcp_xtls_client_config.json delete mode 100644 TemplateConfg/v2ray/client/06_outbounds/vless_ws_tls_client_config.json delete mode 100644 TemplateConfg/v2ray/client/06_outbounds/vmess_tcp_tls_client_config.json delete mode 100644 TemplateConfg/v2ray/client/06_outbounds/webSocket_client_config.json delete mode 100644 TemplateConfg/v2ray/client/07_transport/07_transport.json delete mode 100644 TemplateConfg/v2ray/client/08_stats/08_stats.json delete mode 100644 TemplateConfg/v2ray/client/09_reverse/09_reverse.json delete mode 100644 TemplateConfg/v2ray/server/00_log/00_log.json delete mode 100644 TemplateConfg/v2ray/server/01_api/01_api.json delete mode 100644 TemplateConfg/v2ray/server/02_dns/02_dns.json delete mode 100644 TemplateConfg/v2ray/server/03_routing/03_routing.json delete mode 100644 TemplateConfg/v2ray/server/04_policy/04_policy.json delete mode 100644 TemplateConfg/v2ray/server/05_inbounds/00_padavan_router.json delete mode 100644 TemplateConfg/v2ray/server/05_inbounds/05_inbounds.json delete mode 100644 TemplateConfg/v2ray/server/05_inbounds/Http2Web_server_config.json delete mode 100644 TemplateConfg/v2ray/server/05_inbounds/Http2selfSigned_server_config.json delete mode 100644 TemplateConfg/v2ray/server/05_inbounds/WebSocketTLSWeb_server_config.json delete mode 100644 TemplateConfg/v2ray/server/05_inbounds/WebSocketTLS_selfSigned_server_config.json delete mode 100644 TemplateConfg/v2ray/server/05_inbounds/WebSocket_TLS_server_config.json delete mode 100644 TemplateConfg/v2ray/server/05_inbounds/http2_server_config.json delete mode 100644 TemplateConfg/v2ray/server/05_inbounds/mkcp_server_config.json delete mode 100644 TemplateConfg/v2ray/server/05_inbounds/quic_server_config.json delete mode 100644 TemplateConfg/v2ray/server/05_inbounds/tcpTLSselfSigned_server_config.json delete mode 100644 TemplateConfg/v2ray/server/05_inbounds/tcp_TLS_server_config.json delete mode 100644 TemplateConfg/v2ray/server/05_inbounds/tcp_http_server_config.json delete mode 100644 TemplateConfg/v2ray/server/05_inbounds/tcp_server_config.json delete mode 100644 TemplateConfg/v2ray/server/05_inbounds/vless_http2_tls_server_config.json delete mode 100644 TemplateConfg/v2ray/server/05_inbounds/vless_mkcp_server_config.json delete mode 100644 TemplateConfg/v2ray/server/05_inbounds/vless_tcp_tls_server_config.json delete mode 100644 TemplateConfg/v2ray/server/05_inbounds/vless_tcp_xtls_server_config.json delete mode 100644 TemplateConfg/v2ray/server/05_inbounds/vless_vmess_xtls_tcp_websocket_server_config.json delete mode 100644 TemplateConfg/v2ray/server/05_inbounds/vless_ws_tls_server_config.json delete mode 100644 TemplateConfg/v2ray/server/05_inbounds/webSocket_server_config.json delete mode 100644 TemplateConfg/v2ray/server/06_outbounds/06_outbounds.json delete mode 100644 TemplateConfg/v2ray/server/07_transport/07_transport.json delete mode 100644 TemplateConfg/v2ray/server/08_stats/08_stats.json delete mode 100644 TemplateConfg/v2ray/server/09_reverse/09_reverse.json delete mode 100644 TemplateConfg/xray/base.json delete mode 100644 TemplateConfg/xray/caddy/Http2Web.caddyfile delete mode 100644 TemplateConfg/xray/caddy/WebSocketTLSWeb.caddyfile delete mode 100644 TemplateConfg/xray/caddy/vlessTcpTlsWeb.caddyfile delete mode 100644 TemplateConfg/xray/client/00_log/00_log.json delete mode 100644 TemplateConfg/xray/client/01_api/01_api.json delete mode 100644 TemplateConfg/xray/client/02_dns/02_dns.json delete mode 100644 TemplateConfg/xray/client/03_routing/03_routing.json delete mode 100644 TemplateConfg/xray/client/04_policy/04_policy.json delete mode 100644 TemplateConfg/xray/client/05_inbounds/05_inbounds.json delete mode 100644 TemplateConfg/xray/client/06_outbounds/06_outbounds.json delete mode 100644 TemplateConfg/xray/client/06_outbounds/Http2Web_client_config.json delete mode 100644 TemplateConfg/xray/client/06_outbounds/Http2selfSigned_client_config.json delete mode 100644 TemplateConfg/xray/client/06_outbounds/WebSocketTLSWeb_client_config.json delete mode 100644 TemplateConfg/xray/client/06_outbounds/WebSocketTLS_selfSigned_client_config.json delete mode 100644 TemplateConfg/xray/client/06_outbounds/WebSocket_TLS_client_config.json delete mode 100644 TemplateConfg/xray/client/06_outbounds/http2_client_config.json delete mode 100644 TemplateConfg/xray/client/06_outbounds/mkcp_client_config.json delete mode 100644 TemplateConfg/xray/client/06_outbounds/quic_client_config.json delete mode 100644 TemplateConfg/xray/client/06_outbounds/tcpTLSselfSigned_client_config.json delete mode 100644 TemplateConfg/xray/client/06_outbounds/tcp_TLS_client_config.json delete mode 100644 TemplateConfg/xray/client/06_outbounds/tcp_client_config.json delete mode 100644 TemplateConfg/xray/client/06_outbounds/tcp_http_client_config.json delete mode 100644 TemplateConfg/xray/client/06_outbounds/trojan_tcp_tls.json delete mode 100644 TemplateConfg/xray/client/06_outbounds/vless_http2_tls_server_config.json delete mode 100644 TemplateConfg/xray/client/06_outbounds/vless_mkcp_client_config.json delete mode 100644 TemplateConfg/xray/client/06_outbounds/vless_tcp_tls_caddy_cilent_config.json delete mode 100644 TemplateConfg/xray/client/06_outbounds/vless_tcp_xtls_client_config.json delete mode 100644 TemplateConfg/xray/client/06_outbounds/vless_ws_tls_client_config.json delete mode 100644 TemplateConfg/xray/client/06_outbounds/vmess_tcp_tls_client_config.json delete mode 100644 TemplateConfg/xray/client/06_outbounds/webSocket_client_config.json delete mode 100644 TemplateConfg/xray/client/07_transport/07_transport.json delete mode 100644 TemplateConfg/xray/client/08_stats/08_stats.json delete mode 100644 TemplateConfg/xray/client/09_reverse/09_reverse.json delete mode 100644 TemplateConfg/xray/server/00_log/00_log.json delete mode 100644 TemplateConfg/xray/server/01_api/01_api.json delete mode 100644 TemplateConfg/xray/server/02_dns/02_dns.json delete mode 100644 TemplateConfg/xray/server/03_routing/03_routing.json delete mode 100644 TemplateConfg/xray/server/04_policy/04_policy.json delete mode 100644 TemplateConfg/xray/server/05_inbounds/00_padavan_router.json delete mode 100644 TemplateConfg/xray/server/05_inbounds/05_inbounds.json delete mode 100644 TemplateConfg/xray/server/05_inbounds/Http2Web_server_config.json delete mode 100644 TemplateConfg/xray/server/05_inbounds/Http2selfSigned_server_config.json delete mode 100644 TemplateConfg/xray/server/05_inbounds/WebSocketTLSWeb_server_config.json delete mode 100644 TemplateConfg/xray/server/05_inbounds/WebSocketTLS_selfSigned_server_config.json delete mode 100644 TemplateConfg/xray/server/05_inbounds/WebSocket_TLS_server_config.json delete mode 100644 TemplateConfg/xray/server/05_inbounds/http2_server_config.json delete mode 100644 TemplateConfg/xray/server/05_inbounds/mkcp_server_config.json delete mode 100644 TemplateConfg/xray/server/05_inbounds/quic_server_config.json delete mode 100644 TemplateConfg/xray/server/05_inbounds/tcpTLSselfSigned_server_config.json delete mode 100644 TemplateConfg/xray/server/05_inbounds/tcp_TLS_server_config.json delete mode 100644 TemplateConfg/xray/server/05_inbounds/tcp_http_server_config.json delete mode 100644 TemplateConfg/xray/server/05_inbounds/tcp_server_config.json delete mode 100644 TemplateConfg/xray/server/05_inbounds/vless_http2_tls_server_config.json delete mode 100644 TemplateConfg/xray/server/05_inbounds/vless_mkcp_server_config.json delete mode 100644 TemplateConfg/xray/server/05_inbounds/vless_tcp_tls_server_config.json delete mode 100644 TemplateConfg/xray/server/05_inbounds/vless_tcp_xtls_server_config.json delete mode 100644 TemplateConfg/xray/server/05_inbounds/vless_vmess_xtls_tcp_websocket_server_config.json delete mode 100644 TemplateConfg/xray/server/05_inbounds/vless_ws_tls_server_config.json delete mode 100644 TemplateConfg/xray/server/05_inbounds/webSocket_server_config.json delete mode 100644 TemplateConfg/xray/server/06_outbounds/06_outbounds.json delete mode 100644 TemplateConfg/xray/server/07_transport/07_transport.json delete mode 100644 TemplateConfg/xray/server/08_stats/08_stats.json delete mode 100644 TemplateConfg/xray/server/09_reverse/09_reverse.json delete mode 100644 json.net/net40/Newtonsoft.Json.dll delete mode 100644 json.net/net40/Newtonsoft.Json.xml delete mode 100644 json.net/net40/README.md delete mode 100644 qrcoder/net40/QRCoder.dll delete mode 100644 qrcoder/net40/readme.md delete mode 100644 ssh.net/net40/Renci.SshNet.dll delete mode 100644 ssh.net/net40/Renci.SshNet.xml diff --git a/7z/7z.exe b/7z/7z.exe deleted file mode 100644 index 3a8ee478adf2e62da9691a1867c32b57fc96f598..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 474624 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 diff --git a/7z/readme.md b/7z/readme.md deleted file mode 100644 index 892f500..0000000 --- a/7z/readme.md +++ /dev/null @@ -1 +0,0 @@ -这个7z.exe文件,只是为了生成Release.zip方便。可有可无。ProxySU并不调用。 \ No newline at end of file diff --git a/ProxySU.sln b/ProxySU.sln index b6c6063..78ce6b6 100644 --- a/ProxySU.sln +++ b/ProxySU.sln @@ -3,15 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.31005.135 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProxySU", "ProxySU\ProxySU.csproj", "{DD5505BC-E7F1-4D03-ABC7-B636E893FC09}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProxySU_Core", "ProxySU_Core\ProxySU_Core.csproj", "{B066015C-D347-4493-92F1-6556D3863996}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{18714411-764D-47E5-AFE6-A96200B7CE41}" - ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig - EndProjectSection -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libs", "Libs", "{CE908112-DB46-4B91-8236-9139A19D66E9}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProxySuper.WPF", "ProxySuper.WPF\ProxySuper.WPF.csproj", "{B083EBFD-2925-46C9-8B00-E2C1300CEBA1}" @@ -24,14 +15,6 @@ 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 - {B066015C-D347-4493-92F1-6556D3863996}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B066015C-D347-4493-92F1-6556D3863996}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B066015C-D347-4493-92F1-6556D3863996}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B066015C-D347-4493-92F1-6556D3863996}.Release|Any CPU.Build.0 = Release|Any CPU {B083EBFD-2925-46C9-8B00-E2C1300CEBA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B083EBFD-2925-46C9-8B00-E2C1300CEBA1}.Debug|Any CPU.Build.0 = Debug|Any CPU {B083EBFD-2925-46C9-8B00-E2C1300CEBA1}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/ProxySU/App.xaml b/ProxySU/App.xaml deleted file mode 100644 index 4a9db0e..0000000 --- a/ProxySU/App.xaml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - diff --git a/ProxySU/App.xaml.cs b/ProxySU/App.xaml.cs deleted file mode 100644 index 6ed5114..0000000 --- a/ProxySU/App.xaml.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Configuration; -using System.Data; -using System.Linq; -using System.Windows; - -namespace ProxySU -{ - ///

- /// App.xaml 的交互逻辑 - /// - public partial class App : Application - { - } -} diff --git a/ProxySU/ClassModel.cs b/ProxySU/ClassModel.cs deleted file mode 100644 index 4bea9a7..0000000 --- a/ProxySU/ClassModel.cs +++ /dev/null @@ -1,86 +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.Navigation; -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.ComponentModel; -using System.Net.Sockets; -using System.Runtime.InteropServices; -using System.Runtime; -using System.Globalization; -using Microsoft.Win32; -using System.Security; - -namespace ProxySU -{ - class ClassModel - { - //检测域名是否为空 - public static bool TestDomainIsEmpty(string domainStr) - { - domainStr = domainStr.Trim(); - if (string.IsNullOrEmpty(domainStr) == true) - { - //****** "域名不能为空,请检查相关参数设置!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_DomainNotEmpty").ToString()); - return false; - } - else - { - return true; - } - } - //伪装网站预处理 - public static bool PreDomainMask(string uri) - { - uri = uri.Trim(); - if (String.IsNullOrEmpty(uri) == false) - { - if (uri.Contains("/") == true) - { - //MessageBox.Show("伪装网址输入格式错误!请重新输入!"); - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_MaskSitesToolTip").ToString()); - return false; - } - } - return true; - } - //伪装网址的处理 - public static string DisguiseURLprocessing(string fakeUrl) - { - fakeUrl = fakeUrl.Trim(); - return fakeUrl; - //处理伪装网站域名中的前缀 - //if (fakeUrl.Length >= 7) - //{ - // string testDomainMask = fakeUrl.Substring(0, 7); - // if (String.Equals(testDomainMask, "https:/") || String.Equals(testDomainMask, "http://")) - // { - // var uri = new Uri(fakeUrl); - // return uri.Host; - // } - - //} - - } - } -} diff --git a/ProxySU/MainWindow.xaml b/ProxySU/MainWindow.xaml deleted file mode 100644 index 9a26b7b..0000000 --- a/ProxySU/MainWindow.xaml +++ /dev/null @@ -1,849 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ProxySU/MainWindow.xaml.cs b/ProxySU/MainWindow.xaml.cs deleted file mode 100644 index 7350959..0000000 --- a/ProxySU/MainWindow.xaml.cs +++ /dev/null @@ -1,10528 +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.Navigation; -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.ComponentModel; -using System.Net.Sockets; -using System.Runtime.InteropServices; -using System.Runtime; -using System.Globalization; -using Microsoft.Win32; -using System.Security; - -namespace ProxySU -{ - class NatDns64 - { - private string ipaddr { set; get; } //Dns64网关地址 - private int avg { set; get; } //ping的平均值 - - public NatDns64(string IpAddr, int Avg) - { - this.ipaddr = IpAddr; - this.avg = Avg; - } - - public string IpAddr - { - get { return ipaddr; } - set { this.ipaddr = IpAddr; } - } - - public int Avg - { - get { return avg; } - set { this.avg = Avg; } - } - } - /// - /// MainWindow.xaml 的交互逻辑 - /// - public partial class MainWindow : Window - { - //多语言参数 - public class LanguageInfo - { - public string Name { get; set; } - public string Value { get; set; } - } - public static string[] ReceiveConfigurationParameters { get; set; } - - //ReceiveConfigurationParameters[0]----模板类型 - //ReceiveConfigurationParameters[1]----服务端口 - //ReceiveConfigurationParameters[2]----V2Ray uuid/(naive/Trojan-go/Trojan/SSR/SS)' Password - //ReceiveConfigurationParameters[3]----QUIC加密方式/SSR 加密方法/SS 加密方式/naive'user/VLESS ws Path/trojan-go mux concurrency - //ReceiveConfigurationParameters[4]----Domain - //ReceiveConfigurationParameters[5]----伪装类型/插件名称/trojan-go mux idle_timeout - //ReceiveConfigurationParameters[6]----V2Ray&Trojan-go&SS--Websocket'Path/http2'Path/QUIC密钥/mKCP Seed/VMESS ws Path - //ReceiveConfigurationParameters[7]----伪装网站 - //ReceiveConfigurationParameters[8]----方案名称 - //ReceiveConfigurationParameters[9]----插件参数选项/VMESS tcp Path/MTProto Parameters/trojan-go是否启用Mux(true) - //public static ConnectionInfo ConnectionInfo; - - public static string proxyType = "V2Ray"; //代理类型标识: V2Ray\TrojanGo\Trojan\NaiveProxy - public static readonly string pwdir = AppDomain.CurrentDomain.BaseDirectory; //执行文件所在目录 - public static bool mKCPvlessIsSet = false; //mKCP是否使用VLESS协议 - static bool testDomain = false; //设置标识--域名是否需要检测解析,初始化为不需要 - static string ipv4 = String.Empty; //保存获取的ipv4地址 - static string ipv6 = String.Empty; //保存获取的ipv6地址 - static bool onlyIpv6 = false; //主机是否基于纯ipv6地址 - static bool functionResult = true; //标示功能函数是否执行状态(true无错误发生/false有错误发生) - static string sshShellCommand = String.Empty; //定义保存执行的命令 - static string currentStatus = String.Empty; //定议保存要显示的状态 - static string currentShellCommandResult = String.Empty; //定义Shell命令执行结果保存变量 - static bool getApt = false; //判断系统软件管理,下同 - static bool getDnf = false; - static bool getYum = false; - static string sshCmdUpdate = String.Empty; //保存软件安装所用更新软件库命令 - static string sshCmdInstall = String.Empty; //保存软件安装所用命令格式 - static int randomCaddyListenPort = 8800; //Caddy做伪装网站所监听的端口,随机10001-60000 - static int installationDegree = 0; //安装进度条显示的百分比 - static string saveShellScriptFileName = "install.sh"; //用来保存下载的脚本名称 - static string acmeEmail = ""; - - //****** ****** - // Application.Current.FindResource("").ToString() - // - // {DynamicResource } - //SetUpProgressBarProcessing(0); - public MainWindow() - { - InitializeComponent(); - - #region 多语言选择设置 初始设置为auto - List languageList = new List(); - - languageList.Add(new LanguageInfo { Name = "auto", Value = "auto" }); - languageList.Add(new LanguageInfo { Name = "English", Value = "en-US" }); - languageList.Add(new LanguageInfo { Name = "简体中文", Value = "zh-CN" }); - languageList.Add(new LanguageInfo { Name = "正體中文", Value = "zh-TW" }); - - ComboBoxLanguage.ItemsSource = languageList; - - ComboBoxLanguage.DisplayMemberPath = "Name";//显示出来的值 - ComboBoxLanguage.SelectedValuePath = "Value";//实际选中后获取的结果的值 - ComboBoxLanguage.SelectedIndex = 0; - - DataContext = this; - string Culture = System.Globalization.CultureInfo.InstalledUICulture.Name; - //Culture = "en-US"; - ResourcesLoad(Culture); - #endregion - - //初始化参数设置数组 - ReceiveConfigurationParameters = new string[10]; - - //初始化选定密码登录 - RadioButtonPasswordLogin.IsChecked = true; - //初始化选定无代理 - RadioButtonNoProxy.IsChecked = true; - //初始化代理无需登录 - RadioButtonProxyNoLogin.IsChecked = true; - //初始化隐藏Socks4代理, - RadioButtonSocks4.Visibility = Visibility.Collapsed; - - //初始化Trojan的密码 - TextBoxTrojanPassword.Text = RandomUUID(); - - //初始化NaiveProxy的用户名和密码 - TextBoxNaivePassword.Text = RandomUUID(); - TextBoxNaiveUser.Text = RandomUserName(); - - //初始化SSR的密码 - TextBoxSSRPassword.Text = RandomUUID(); - - //初始化V2Ray所选方案面板为不显示 - GridV2rayCurrentlyPlan.Visibility = Visibility.Hidden; - - //初始化Xray所选方案面板为不显示 - GridXrayCurrentlyPlan.Visibility = Visibility.Hidden; - - //自动检查ProxySU是否有新版本发布,有则显示更新提示 - Thread thread = new Thread(() => TestLatestVersionProxySU(TextBlockLastVersionProxySU, TextBlockNewVersionReminder, ButtonUpgradeProxySU)); - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - } - - #region 检测新版本代码 - - //检测ProxySU新版本 - private void TestLatestVersionProxySU(TextBlock TextBlockLastVersionProxySU, TextBlock TextBlockNewVersionReminder, Button ButtonUpgradeProxySU) - { - string strJson = GetLatestJson(@"https://api.github.com/repos/proxysu/windows/releases/latest"); - if (String.IsNullOrEmpty(strJson) == false) - { - JObject lastVerJsonObj = JObject.Parse(strJson); - string lastVersion = (string)lastVerJsonObj["tag_name"];//得到远程版本信息 - - string lastVersionNoV = lastVersion.Replace("v", String.Empty); - - Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; - //MessageBox.Show(version.ToString()); - string cerversion = version.ToString().Substring(0, 6); //获取本地版本信息 - //MessageBox.Show(cerversion); - string[] lastVerComp = lastVersionNoV.Split('.'); - string[] localVerComp = cerversion.Split('.'); - - //版本信息不相同,则认为新版本发布,显示出新版本信息及更新提醒,下载按钮 - if (int.Parse(lastVerComp[0]) > int.Parse(localVerComp[0])) - { - TextBlockLastVersionProxySU.Dispatcher.BeginInvoke(updateNewVersionProxySUAction, TextBlockLastVersionProxySU, TextBlockNewVersionReminder, ButtonUpgradeProxySU, lastVersion); - return; - } - else if (int.Parse(lastVerComp[0]) == int.Parse(localVerComp[0])) - { - if (int.Parse(lastVerComp[1]) > int.Parse(localVerComp[1])) - { - TextBlockLastVersionProxySU.Dispatcher.BeginInvoke(updateNewVersionProxySUAction, TextBlockLastVersionProxySU, TextBlockNewVersionReminder, ButtonUpgradeProxySU, lastVersion); - return; - } - else if (int.Parse(lastVerComp[1]) == int.Parse(localVerComp[1])) - { - if (int.Parse(lastVerComp[2]) > int.Parse(localVerComp[2])) - { - TextBlockLastVersionProxySU.Dispatcher.BeginInvoke(updateNewVersionProxySUAction, TextBlockLastVersionProxySU, TextBlockNewVersionReminder, ButtonUpgradeProxySU, lastVersion); - return; - } - } - } - } - } - - //下载最新版ProxySU - private void ButtonUpgradeProxySU_Click(object sender, RoutedEventArgs e) - { - TextBlockNewVersionReminder.Visibility = Visibility.Hidden; - TextBlockNewVersionDown.Visibility = Visibility.Visible; - //TextBlockNewVersionReminder.Text = Application.Current.FindResource("TextBlockNewVersionDown").ToString(); - try - { - string strJson = GetLatestJson(@"https://api.github.com/repos/proxysu/windows/releases/latest"); - if (String.IsNullOrEmpty(strJson) == false) - { - JObject lastVerJsonObj = JObject.Parse(strJson); - string lastVersion = (string)lastVerJsonObj["tag_name"];//得到远程版本信息 - string latestVerDownUrl = (string)lastVerJsonObj["assets"][0]["browser_download_url"];//得到最新版文件下载地址 - string latestNewVerFileName = (string)lastVerJsonObj["assets"][0]["name"];//得到最新版文件名 - string latestNewVerExplanation = (string)lastVerJsonObj["body"];//得到更新说明 - - WebClient webClientNewVer = new WebClient(); - webClientNewVer.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); - //webClientNewVer.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged); - if (CheckDir(lastVersion)) - { - Uri latestVerDownUri = new Uri(latestVerDownUrl); - webClientNewVer.DownloadFileAsync(latestVerDownUri, lastVersion + @"\" + latestNewVerFileName); - //webClientNewVer.DownloadFile(latestVerDownUrl, latestNewVerFileName); - - using (StreamWriter sw = new StreamWriter(lastVersion + @"\" + "readme.txt")) - { - sw.WriteLine(latestNewVerExplanation); - } - } - } - } - catch (Exception ex1) - { - // MessageBox.Show(ex1.ToString()); - - return; - } - } - //文件下载完处理方法 - private void Completed(object sender, AsyncCompletedEventArgs e) - { - if (e.Cancelled == true) - { - MessageBox.Show(e.Error.ToString()); - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorDownProxyFail").ToString()); - //label1.Text = "Download cancelled!"; - } - else - { - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorDownProxySuccess").ToString()); - } - } - - //获取LatestJson - private string GetLatestJson(string theLatestUrl) - { - try - { - //ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | (SecurityProtocolType)3072 | (SecurityProtocolType)768 | SecurityProtocolType.Tls; - ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; - // ServicePointManager.SecurityProtocol = (SecurityProtocolType)(0xc0 | 0x300 | 0xc00 | 0x30); - //string url = "https://api.github.com/repos/proxysu/windows/releases/latest"; - Uri uri = new Uri(theLatestUrl); - HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri); - req.Accept = @"application/json"; - req.UserAgent = @"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0"; - HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); - Stream stream = resp.GetResponseStream(); - StreamReader sr = new StreamReader(stream); - string strJson = sr.ReadToEnd(); - return strJson; - } - catch (Exception ex1) - { - return null; - } - } - - - //更新新版本提醒显示 - Action updateNewVersionProxySUAction = new Action(UpdateNewVersionProxySU); - private static void UpdateNewVersionProxySU(TextBlock TextBlockLastVersionProxySU, TextBlock TextBlockNewVersionReminder, Button ButtonUpgradeProxySU, string theLatestVersion) - { - TextBlockLastVersionProxySU.Text = theLatestVersion; - TextBlockLastVersionProxySU.Visibility = Visibility.Visible; - TextBlockNewVersionReminder.Visibility = Visibility.Visible; - ButtonUpgradeProxySU.Visibility = Visibility.Visible; - } - - #endregion - - #region 安装过程信息显示 端口数字防错代码,密钥选择代码 - - //更新状态条显示 - Action updateAction = new Action(UpdateTextBlock); - private static void UpdateTextBlock(TextBlock textBlockName, ProgressBar progressBar, string currentStatus) - { - textBlockName.Text = currentStatus; - - //if (currentStatus.Contains("成功") == true || currentStatus.ToLower().Contains("success") == true) - //{ - // progressBar.IsIndeterminate = false; - // progressBar.Value = 100; - //} - //else - if (currentStatus.Contains("失败") == true || currentStatus.Contains("取消") == true || currentStatus.Contains("退出") == true || currentStatus.ToLower().Contains("fail") == true || currentStatus.ToLower().Contains("cancel") == true || currentStatus.ToLower().Contains("exit") == true) - { - progressBar.IsIndeterminate = false; - progressBar.Value = 0; - } - //else - //{ - // progressBar.IsIndeterminate = true; - // //progressBar.Value = 0; - //} - - - } - - //进度条更新百分比 - private void SetUpProgressBarProcessing(int max) - { - - for (int i = installationDegree; i <= max; i++) - { - Thread.Sleep(100); - Dispatcher.Invoke(new Action(ProgressBarSetUpProcessing.SetValue), System.Windows.Threading.DispatcherPriority.Background, new object[] { ProgressBar.ValueProperty, Convert.ToDouble(i) }); - } - installationDegree = max; - } - - - //更新监视窗内的显示 - //结尾自动添加一个换行符 - Action updateMonitorAction = new Action(UpdateTextBox); - private static void UpdateTextBox(TextBox textBoxName, string currentResult) - { - textBoxName.Text = textBoxName.Text + currentResult + Environment.NewLine; - textBoxName.ScrollToEnd(); - } - - //结尾不添加换行符 - Action updateMonitorActionNoWrap = new Action(UpdateTextBoxNoWrap); - private static void UpdateTextBoxNoWrap(TextBox textBoxName, string currentResult) - { - textBoxName.Text = textBoxName.Text + currentResult; - textBoxName.ScrollToEnd(); - } - - //退出主程序 - private void Button_canel_Click(object sender, RoutedEventArgs e) - { - Application.Current.Shutdown(); - } - - // private static readonly Regex _regex = new Regex("[^0-9]+"); - - //检测数字输入 - private void TextBoxPort_PreviewTextInput(object sender, TextCompositionEventArgs e) - { - Regex regex = new Regex("[^0-9]+"); - e.Handled = regex.IsMatch(e.Text); - } - - //检测字符串是否只由数字组成 - private bool IsOnlyNumber(string value) - { - value = value.Trim(); - Regex r = new Regex(@"^[0-9]+$"); - return r.Match(value).Success; - } - - //端口输入框是否可使用粘贴命令 - private void TextBoxPort_PreviewExecuted(object sender, ExecutedRoutedEventArgs e) - { - if (e.Command == ApplicationCommands.Paste) - { - e.Handled = false;//true为不能使用粘贴命令,false为可以使用粘贴命令 - } - } - - //打开证书浏览 - private void ButtonOpenFileDialog_Click(object sender, RoutedEventArgs e) - { - var openFileDialog = new Microsoft.Win32.OpenFileDialog() - { - Filter = "Cert Files (*.*)|*.*" - }; - var result = openFileDialog.ShowDialog(); - if (result == true) - { - TextBoxCertFilePath.Text = openFileDialog.FileName; - } - } - #endregion - - #region 主界面控件的有效无效控制代码块及界面语言 - - //加载语言资源文件 - private void ResourcesLoad(string Culture) - { - List dictionaryList = new List(); - foreach (ResourceDictionary dictionary in Application.Current.Resources.MergedDictionaries) - { - dictionaryList.Add(dictionary); - } - string requestedCulture = string.Format(@"Translations\ProxySU.{0}.xaml", Culture); - //string requestedCulture = string.Format(@"Translations\ProxySU.{0}.xaml", "default"); - ResourceDictionary resourceDictionary = dictionaryList.FirstOrDefault(d => d.Source.OriginalString.Equals(requestedCulture)); - if (resourceDictionary == null) - { - requestedCulture = @"Translations\ProxySU.en-US.xaml"; - resourceDictionary = dictionaryList.FirstOrDefault(d => d.Source.OriginalString.Equals(requestedCulture)); - } - if (resourceDictionary != null) - { - Application.Current.Resources.MergedDictionaries.Remove(resourceDictionary); - Application.Current.Resources.MergedDictionaries.Add(resourceDictionary); - } - } - - //界面语言处理 - private void ComboBoxLanguage_SelectionChanged(object sender, SelectionChangedEventArgs e) - { - string languageCulture; - object languageSelected; - languageSelected = ComboBoxLanguage.SelectedValue; - languageCulture = languageSelected.ToString(); - if (languageCulture.Equals("auto")) - { - languageCulture = System.Globalization.CultureInfo.InstalledUICulture.Name; - ResourcesLoad(languageCulture); - } - else - { - ResourcesLoad(languageCulture); - } - //display.Text = language; - } - private void RadioButtonNoProxy_Checked(object sender, RoutedEventArgs e) - { - TextBlockProxyHost.IsEnabled = false; - TextBlockProxyHost.Visibility = Visibility.Collapsed; - TextBoxProxyHost.IsEnabled = false; - TextBoxProxyHost.Visibility = Visibility.Collapsed; - TextBlockProxyPort.IsEnabled = false; - TextBlockProxyPort.Visibility = Visibility.Collapsed; - TextBoxProxyPort.IsEnabled = false; - TextBoxProxyPort.Visibility = Visibility.Collapsed; - RadioButtonProxyNoLogin.IsEnabled = false; - RadioButtonProxyNoLogin.Visibility = Visibility.Collapsed; - RadiobuttonProxyYesLogin.IsEnabled = false; - RadiobuttonProxyYesLogin.Visibility = Visibility.Collapsed; - TextBlockProxyUser.IsEnabled = false; - TextBlockProxyUser.Visibility = Visibility.Collapsed; - TextBoxProxyUserName.IsEnabled = false; - TextBoxProxyUserName.Visibility = Visibility.Collapsed; - TextBlockProxyPassword.IsEnabled = false; - TextBlockProxyPassword.Visibility = Visibility.Collapsed; - PasswordBoxProxyPassword.IsEnabled = false; - PasswordBoxProxyPassword.Visibility = Visibility.Collapsed; - } - - private void RadioButtonNoProxy_Unchecked(object sender, RoutedEventArgs e) - { - TextBlockProxyHost.IsEnabled = true; - TextBlockProxyHost.Visibility = Visibility.Visible; - TextBoxProxyHost.IsEnabled = true; - TextBoxProxyHost.Visibility = Visibility.Visible; - TextBlockProxyPort.IsEnabled = true; - TextBlockProxyPort.Visibility = Visibility.Visible; - TextBoxProxyPort.IsEnabled = true; - TextBoxProxyPort.Visibility = Visibility.Visible; - RadioButtonProxyNoLogin.IsEnabled = true; - RadioButtonProxyNoLogin.Visibility = Visibility.Visible; - RadiobuttonProxyYesLogin.IsEnabled = true; - RadiobuttonProxyYesLogin.Visibility = Visibility.Visible; - if (RadioButtonProxyNoLogin.IsChecked == true) - { - TextBlockProxyUser.IsEnabled = false; - TextBlockProxyUser.Visibility = Visibility.Collapsed; - TextBlockProxyPassword.IsEnabled = false; - TextBlockProxyPassword.Visibility = Visibility.Collapsed; - TextBoxProxyUserName.IsEnabled = false; - TextBoxProxyUserName.Visibility = Visibility.Collapsed; - PasswordBoxProxyPassword.IsEnabled = false; - PasswordBoxProxyPassword.Visibility = Visibility.Collapsed; - } - else - { - TextBlockProxyUser.IsEnabled = true; - TextBlockProxyUser.Visibility = Visibility.Visible; - TextBoxProxyUserName.IsEnabled = true; - TextBoxProxyUserName.Visibility = Visibility.Visible; - TextBlockProxyPassword.IsEnabled = true; - TextBlockProxyPassword.Visibility = Visibility.Visible; - PasswordBoxProxyPassword.IsEnabled = true; - PasswordBoxProxyPassword.Visibility = Visibility.Visible; - } - } - - private void RadioButtonPasswordLogin_Checked(object sender, RoutedEventArgs e) - { - ButtonOpenFileDialog.IsEnabled = false; - ButtonOpenFileDialog.Visibility = Visibility.Collapsed; - TextBoxCertFilePath.IsEnabled = false; - TextBoxCertFilePath.Visibility = Visibility.Collapsed; - TextBlockCert.Visibility = Visibility.Collapsed; - TextBlockPassword.Visibility = Visibility.Visible; - PasswordBoxHostPassword.IsEnabled = true; - PasswordBoxHostPassword.Visibility = Visibility.Visible; - } - - private void RadioButtonCertLogin_Checked(object sender, RoutedEventArgs e) - { - //TextBlockPassword.Text = "密钥:"; - TextBlockCert.Visibility = Visibility.Visible; - TextBlockPassword.Visibility = Visibility.Collapsed; - PasswordBoxHostPassword.IsEnabled = false; - PasswordBoxHostPassword.Visibility = Visibility.Collapsed; - ButtonOpenFileDialog.IsEnabled = true; - ButtonOpenFileDialog.Visibility = Visibility.Visible; - TextBoxCertFilePath.IsEnabled = true; - TextBoxCertFilePath.Visibility = Visibility.Visible; - } - - private void RadioButtonProxyNoLogin_Checked(object sender, RoutedEventArgs e) - { - TextBlockProxyUser.IsEnabled = false; - TextBlockProxyUser.Visibility = Visibility.Collapsed; - TextBlockProxyPassword.IsEnabled = false; - TextBlockProxyPassword.Visibility = Visibility.Collapsed; - TextBoxProxyUserName.IsEnabled = false; - TextBoxProxyUserName.Visibility = Visibility.Collapsed; - PasswordBoxProxyPassword.IsEnabled = false; - PasswordBoxProxyPassword.Visibility = Visibility.Collapsed; - } - - private void RadiobuttonProxyYesLogin_Checked(object sender, RoutedEventArgs e) - { - TextBlockProxyUser.IsEnabled = true; - TextBlockProxyUser.Visibility = Visibility.Visible; - TextBlockProxyPassword.IsEnabled = true; - TextBlockProxyPassword.Visibility = Visibility.Visible; - TextBoxProxyUserName.IsEnabled = true; - TextBoxProxyUserName.Visibility = Visibility.Visible; - PasswordBoxProxyPassword.IsEnabled = true; - PasswordBoxProxyPassword.Visibility = Visibility.Visible; - } - #endregion - - //远程主机连接信息 - private ConnectionInfo GenerateConnectionInfo() - { - acmeEmail = AcmeEmailTextBox.Text; - - ConnectionInfo connectionInfo; - - if (string.IsNullOrEmpty(acmeEmail)) - { - var acmeEmailDesc = Application.Current.FindResource("AcmeEmailDesc").ToString(); - MessageBox.Show(acmeEmailDesc); - return connectionInfo = null; - } - - #region 检测输入的内容是否有错,并读取内容 - if (string.IsNullOrEmpty(PreTrim(TextBoxHost.Text)) == true || string.IsNullOrEmpty(PreTrim(TextBoxPort.Text)) == true || string.IsNullOrEmpty(PreTrim(TextBoxUserName.Text)) == true) - { - //******"主机地址、主机端口、用户名为必填项,不能为空"****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostPortUserNotEmpty").ToString()); - - return connectionInfo = null; - } - string sshHostName = PreTrim(TextBoxHost.Text); - int sshPort = 22; - - if (IsOnlyNumber(PreTrim(TextBoxPort.Text)) == true) - { - TextBoxPort.Text = PreTrim(TextBoxPort.Text); - sshPort = int.Parse(TextBoxPort.Text); - } - else - { - //******"连接端口含有非数字字符!"****** - MessageBox.Show("Host Port" + Application.Current.FindResource("MessageBoxShow_ErrorHostPortErr").ToString()); - return connectionInfo = null; - } - - string sshUser = PreTrim(TextBoxUserName.Text); - - if (RadioButtonPasswordLogin.IsChecked == true && string.IsNullOrEmpty(PasswordBoxHostPassword.Password) == true) - { - //****** "登录密码为必填项,不能为空!!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostPasswordNotEmpty").ToString()); - return connectionInfo = null; - } - string sshPassword = PasswordBoxHostPassword.Password.ToString(); - if (RadioButtonCertLogin.IsChecked == true && string.IsNullOrEmpty(TextBoxCertFilePath.Text) == true) - { - //****** "密钥文件为必填项,不能为空!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostKeyNotEmpty").ToString()); - return connectionInfo = null; - } - string sshPrivateKey = TextBoxCertFilePath.Text.ToString(); - ProxyTypes proxyTypes = new ProxyTypes();//默认为None - - //proxyTypes = ProxyTypes.Socks5; - if (RadioButtonHttp.IsChecked == true) - { - proxyTypes = ProxyTypes.Http; - } - else if (RadioButtonSocks4.IsChecked == true) - { - proxyTypes = ProxyTypes.Socks4; - } - else if (RadioButtonSocks5.IsChecked == true) - { - proxyTypes = ProxyTypes.Socks5; - } - else - { - proxyTypes = ProxyTypes.None; - } - - //MessageBox.Show(proxyTypes.ToString()); - if (RadioButtonNoProxy.IsChecked == false && (string.IsNullOrEmpty(PreTrim(TextBoxProxyHost.Text)) == true || string.IsNullOrEmpty(PreTrim(TextBoxProxyPort.Text)) == true)) - { - //****** "如果选择了代理,则代理地址与端口不能为空!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorProxyAddressPortNotEmpty").ToString()); - return connectionInfo = null; - } - string sshProxyHost = PreTrim(TextBoxProxyHost.Text); - - int sshProxyPort = 1080; - if (IsOnlyNumber(PreTrim(TextBoxProxyPort.Text)) == true) - { - TextBoxProxyPort.Text = PreTrim(TextBoxProxyPort.Text); - sshProxyPort = int.Parse(TextBoxProxyPort.Text); - } - else - { - //******"连接端口含有非数字字符!"****** - MessageBox.Show("Proxy Port" + Application.Current.FindResource("MessageBoxShow_ErrorHostPortErr").ToString()); - return connectionInfo = null; - } - - if (RadioButtonNoProxy.IsChecked == false && RadiobuttonProxyYesLogin.IsChecked == true && (string.IsNullOrEmpty(PreTrim(TextBoxProxyUserName.Text)) == true || string.IsNullOrEmpty(PasswordBoxProxyPassword.Password) == true)) - { - //****** "如果代理需要登录,则代理登录的用户名与密码不能为空!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorProxyUserPasswordNotEmpty").ToString()); - return connectionInfo = null; - } - string sshProxyUser = PreTrim(TextBoxProxyUserName.Text); - string sshProxyPassword = PasswordBoxProxyPassword.Password; - - #endregion - - - //var connectionInfo = new PasswordConnectionInfo(sshHostName, sshPort, sshUser, sshPassword); - - connectionInfo = new ConnectionInfo( - sshHostName, - sshPort, - sshUser, - proxyTypes, - sshProxyHost, - sshProxyPort, - sshProxyUser, - sshProxyPassword, - new PasswordAuthenticationMethod(sshUser, sshPassword) - //new PrivateKeyAuthenticationMethod(sshUser, new PrivateKeyFile(sshPrivateKey)) - ); - - if (RadioButtonCertLogin.IsChecked == true) - { - connectionInfo = new ConnectionInfo( - sshHostName, - sshPort, - sshUser, - proxyTypes, - sshProxyHost, - sshProxyPort, - sshProxyUser, - sshProxyPassword, - //new PasswordAuthenticationMethod(sshUser, sshPassword) - new PrivateKeyAuthenticationMethod(sshUser, new PrivateKeyFile(sshPrivateKey)) - ); - - } - return connectionInfo; - } - - //登录主机过程中出现的异常处理 - private void ProcessException(string exceptionMessage) - { - //下面代码需要保留,以备将来启用 - //if (exceptionMessage.Contains("连接尝试失败") == true) - //{ - // //****** "请检查主机地址及端口是否正确,如果通过代理,请检查代理是否正常工作!" ****** - // MessageBox.Show($"{exceptionMessage}\n" + - // Application.Current.FindResource("MessageBoxShow_ErrorLoginHostOrPort").ToString()); - //} - - //else if (exceptionMessage.Contains("denied (password)") == true) - //{ - // //****** "密码错误或用户名错误" ****** - // MessageBox.Show($"{exceptionMessage}\n" + - // Application.Current.FindResource("MessageBoxShow_ErrorLoginUserOrPassword").ToString()); - //} - //else if (exceptionMessage.Contains("Invalid private key file") == true) - //{ - // //****** "所选密钥文件错误或者格式不对!" ****** - // MessageBox.Show($"{exceptionMessage}\n" + - // Application.Current.FindResource("MessageBoxShow_ErrorLoginKey").ToString()); - //} - //else if (exceptionMessage.Contains("denied (publickey)") == true) - //{ - // //****** "使用密钥登录,密钥文件错误或用户名错误" ****** - // MessageBox.Show($"{exceptionMessage}\n" + - // Application.Current.FindResource("MessageBoxShow_ErrorLoginKeyOrUser").ToString()); - //} - //else if (exceptionMessage.Contains("目标计算机积极拒绝") == true) - //{ - // //****** "主机地址错误,如果使用了代理,也可能是连接代理的端口错误" ****** - // MessageBox.Show($"{exceptionMessage}\n" + - // Application.Current.FindResource("MessageBoxShow_ErrorLoginHostOrProxyPort").ToString()); - //} - //else - //{ - //****** "发生错误" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorLoginOccurred").ToString()); - MessageBox.Show(exceptionMessage); - //} - - } - - - #region V2Ray相关 - - //打开v2ray模板设置窗口 - private void ButtonTemplateConfiguration_Click(object sender, RoutedEventArgs e) - { - //清空初始化模板参数 - for (int i = 0; i != ReceiveConfigurationParameters.Length; i++) - - { - ReceiveConfigurationParameters[i] = ""; - } - WindowTemplateConfiguration windowTemplateConfiguration = new WindowTemplateConfiguration(); - windowTemplateConfiguration.Closed += windowTemplateConfigurationClosed; - windowTemplateConfiguration.ShowDialog(); - } - - //V2Ray模板设置窗口关闭后,触发事件,将所选的方案与其参数显示在UI上 - private void windowTemplateConfigurationClosed(object sender, System.EventArgs e) - { - if (String.IsNullOrEmpty(ReceiveConfigurationParameters[0]) == true) - { - //显示"未选择方案!" - TextBlockCurrentlySelectedPlan.Text = Application.Current.FindResource("TextBlockCurrentlySelectedPlanNo").ToString(); - - GridV2rayCurrentlyPlan.Visibility = Visibility.Hidden; - - return; - } - else - { - GridV2rayCurrentlyPlan.Visibility = Visibility.Visible; - } - TextBlockCurrentlySelectedPlan.Text = ReceiveConfigurationParameters[8]; //所选方案名称 - TextBlockCurrentlySelectedPlanPort.Text = ReceiveConfigurationParameters[1]; //服务器端口 - TextBlockCurrentlySelectedPlanUUID.Text = ReceiveConfigurationParameters[2]; //UUID - TextBlockCurrentlySelectedPlanPathSeedKey.Text = ReceiveConfigurationParameters[6]; //mKCP Seed\Quic Key\Path - //MessageBox.Show(ReceiveConfigurationParameters[7]); - TextBlockCurrentlySelectedPlanFakeWebsite.Text = ReceiveConfigurationParameters[7]; //伪装网站 - - if (String.Equals(ReceiveConfigurationParameters[0], "TCP") == true - || String.Equals(ReceiveConfigurationParameters[0], "TCPhttp") == true - || String.Equals(ReceiveConfigurationParameters[0], "tcpTLSselfSigned") == true - || String.Equals(ReceiveConfigurationParameters[0], "webSocket") == true) - { - //隐藏Path/mKCP Seed/Quic Key - HideV2RayPathSeedKey(); - HideVlessVmessXtlsTcpWs(); - - //隐藏域名/Quic加密方式 - HideV2RayDomainQuicEncrypt(); - - //隐藏伪装网站 - HideV2RayMaskSites(); - - } - else if (String.Equals(ReceiveConfigurationParameters[0], "tcpTLS") == true) - { - //隐藏Path/mKCP Seed/Quic Key - HideV2RayPathSeedKey(); - HideVlessVmessXtlsTcpWs(); - - //显示域名 - ShowV2RayDomainQuicEncrypt(); - - //隐藏伪装网站 - HideV2RayMaskSites(); - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessVmessXtlsTcpWebSocketWeb") == true) - { - //显示复合方案路径 - ShowVlessVmessXtlsTcpWs(); - - //显示域名 - ShowV2RayDomainQuicEncrypt(); - - //显示伪装网站(暂时不显示) - ShowV2RayMaskSites(); - - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessTcpTlsWeb") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessXtlsTcp") == true) - { - //隐藏Path/mKCP Seed/Quic Key - HideV2RayPathSeedKey(); - HideVlessVmessXtlsTcpWs(); - - //显示域名 - ShowV2RayDomainQuicEncrypt(); - - //显示伪装网站(暂时不显示) - ShowV2RayMaskSites(); - } - else if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS") == true - || String.Equals(ReceiveConfigurationParameters[0], "Http2") == true) - { - //显示Path - ShowV2RayPathSeedKey(); - TextBlockV2RayShowPathSeedKey.Text = "Path:"; - TextBlockCurrentlySelectedPlanPathSeedKey.Text = ReceiveConfigurationParameters[6]; //mKCP Seed\Quic Key\Path - - - //显示域名 - ShowV2RayDomainQuicEncrypt(); - - //显示伪装网站(暂时不显示) - HideV2RayMaskSites(); - } - else if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "http2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessWebSocketTlsWeb") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessHttp2Web") == true) - { - //显示Path - ShowV2RayPathSeedKey(); - TextBlockV2RayShowPathSeedKey.Text = "Path:"; - TextBlockCurrentlySelectedPlanPathSeedKey.Text = ReceiveConfigurationParameters[6]; //mKCP Seed\Quic Key\Path - - //显示域名 - ShowV2RayDomainQuicEncrypt(); - - //显示伪装网站(暂时不显示) - ShowV2RayMaskSites(); - } - else if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLSselfSigned") == true - || String.Equals(ReceiveConfigurationParameters[0], "http2selfSigned") == true) - { - //显示Path - ShowV2RayPathSeedKey(); - TextBlockV2RayShowPathSeedKey.Text = "Path:"; - TextBlockCurrentlySelectedPlanPathSeedKey.Text = ReceiveConfigurationParameters[6]; //mKCP Seed\Quic Key\Path - - //隐藏域名/Quic加密方式 - HideV2RayDomainQuicEncrypt(); - - //隐藏伪装网站 - HideV2RayMaskSites(); - } - else if (ReceiveConfigurationParameters[0].Contains("mKCP") == true) - { - //显示mKCP Seed - ShowV2RayPathSeedKey(); - TextBlockV2RayShowPathSeedKey.Text = "mKCP Seed:"; - TextBlockCurrentlySelectedPlanPathSeedKey.Text = ReceiveConfigurationParameters[6]; //mKCP Seed\Quic Key\Path - - //隐藏域名/Quic加密方式 - HideV2RayDomainQuicEncrypt(); - - //隐藏伪装网站 - HideV2RayMaskSites(); - } - else if (ReceiveConfigurationParameters[0].Contains("Quic") == true) - { - //显示QUIC Key - ShowV2RayPathSeedKey(); - TextBlockV2RayShowPathSeedKey.Text = "QUIC Key:"; - TextBlockCurrentlySelectedPlanPathSeedKey.Text = ReceiveConfigurationParameters[6]; //mKCP Seed\Quic Key\Path - - //显示Quic加密方式 - ShowV2RayDomainQuicEncrypt(); - TextBlockV2RayShowCurrentlySelectedPlanDomain.Text = Application.Current.FindResource("TextBlockQuicEncryption").ToString(); - TextBlockCurrentlySelectedPlanDomain.Text = ReceiveConfigurationParameters[3]; //Quic加密方式 - if (String.Equals(TextBlockCurrentlySelectedPlanDomain.Text, "none") == true) - { - HideV2RayPathSeedKey(); - } - - - //隐藏伪装网站 - HideV2RayMaskSites(); - } - } - - #region 当前方案界面控制 - //显示端口与UUID - private void ShowV2RayCurrentPortUUID() - { - TextBlockV2RayShowPort.Visibility = Visibility.Visible; - TextBlockCurrentlySelectedPlanPort.Visibility = Visibility.Visible; - - TextBlockV2RayShowUUID.Visibility = Visibility.Visible; - TextBlockCurrentlySelectedPlanUUID.Visibility = Visibility.Visible; - } - - //显示Path/mKCP Seed/Quic Key - private void ShowV2RayPathSeedKey() - { - HideVlessVmessXtlsTcpWs(); - TextBlockV2RayShowPathSeedKey.Visibility = Visibility.Visible; - TextBlockCurrentlySelectedPlanPathSeedKey.Visibility = Visibility.Visible; - } - - //隐藏Path/mKCP Seed/Quic Key - private void HideV2RayPathSeedKey() - { - TextBlockV2RayShowPathSeedKey.Visibility = Visibility.Hidden; - TextBlockCurrentlySelectedPlanPathSeedKey.Visibility = Visibility.Hidden; - } - - //显示VLESS VMESS XTLS TCP WS 复合方案 - private void ShowVlessVmessXtlsTcpWs() - { - HideV2RayPathSeedKey(); - GridVlessVmessXtlsTcpWs.Visibility = Visibility.Visible; - TextBlockBoxPathVlessWS.Text = ReceiveConfigurationParameters[3]; - TextBlockBoxPathVmessTcp.Text = ReceiveConfigurationParameters[9]; - TextBlockBoxPathVmessWS.Text = ReceiveConfigurationParameters[6]; - } - - //隐藏VLESS VMESS XTLS TCP WS 复合方案 - private void HideVlessVmessXtlsTcpWs() - { - GridVlessVmessXtlsTcpWs.Visibility = Visibility.Collapsed; - } - - //显示域名/Quic加密方式 - private void ShowV2RayDomainQuicEncrypt() - { - TextBlockV2RayShowCurrentlySelectedPlanDomain.Visibility = Visibility.Visible; - TextBlockCurrentlySelectedPlanDomain.Visibility = Visibility.Visible; - TextBlockV2RayShowCurrentlySelectedPlanDomain.Text = Application.Current.FindResource("TextBlockV2RayDomain").ToString(); - TextBlockCurrentlySelectedPlanDomain.Text = ReceiveConfigurationParameters[4]; //域名 - - } - - //隐藏域名/Quic加密方式 - private void HideV2RayDomainQuicEncrypt() - { - TextBlockV2RayShowCurrentlySelectedPlanDomain.Visibility = Visibility.Hidden; - TextBlockCurrentlySelectedPlanDomain.Visibility = Visibility.Hidden; - } - //显示伪装网站 - private void ShowV2RayMaskSites() - { - TextBlockV2RayShowCurrentlySelectedPlanFakeWebsite.Visibility = Visibility.Visible; - TextBlockCurrentlySelectedPlanFakeWebsite.Visibility = Visibility.Visible; - } - - //隐藏伪装网站 - private void HideV2RayMaskSites() - { - TextBlockV2RayShowCurrentlySelectedPlanFakeWebsite.Visibility = Visibility.Hidden; - TextBlockCurrentlySelectedPlanFakeWebsite.Visibility = Visibility.Hidden; - } - #endregion - - //传送V2Ray模板参数,启动V2Ray安装进程 - private void Button_Login_Click(object sender, RoutedEventArgs e) - - { - ConnectionInfo connectionInfo = GenerateConnectionInfo(); - if (connectionInfo == null) - { - //****** "远程主机连接信息有误,请检查!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostConnection").ToString()); - return; - } - - - //生成客户端配置时,连接的服务主机的IP或者域名 - if (String.IsNullOrEmpty(ReceiveConfigurationParameters[4]) == true) - { - ReceiveConfigurationParameters[4] = PreTrim(TextBoxHost.Text); - testDomain = false; - } - //选择模板 - if (String.IsNullOrEmpty(ReceiveConfigurationParameters[0]) == true) - { - //******"请先选择配置模板!"****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ChooseTemplate").ToString()); - return; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "TCP") == true - || String.Equals(ReceiveConfigurationParameters[0], "TCPhttp") == true - || String.Equals(ReceiveConfigurationParameters[0], "tcpTLSselfSigned") == true - || String.Equals(ReceiveConfigurationParameters[0], "webSocket") == true - || String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLSselfSigned") == true - || String.Equals(ReceiveConfigurationParameters[0], "http2selfSigned") == true - || ReceiveConfigurationParameters[0].Contains("mKCP") == true - || ReceiveConfigurationParameters[0].Contains("Quic") == true) - { - testDomain = false; - - } - else if (String.Equals(ReceiveConfigurationParameters[0], "tcpTLS") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessXtlsTcp") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessTcpTlsWeb") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessWebSocketTlsWeb") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessHttp2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessVmessXtlsTcpWebSocketWeb") == true - || String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "Http2") == true - || String.Equals(ReceiveConfigurationParameters[0], "http2Web") == true) - { - testDomain = true; - - } - - - //Thread thread - //SetUpProgressBarProcessing(0); //重置安装进度 - installationDegree = 0; - TextBoxMonitorCommandResults.Text = ""; - //Thread thread = new Thread(() => StartSetUpV2ray(connectionInfo, TextBlockSetUpProcessing, ProgressBarSetUpProcessing)); - Thread thread = new Thread(() => StartSetUpV2ray(connectionInfo)); - - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - - - } - - //登录远程主机布署V2ray程序 - private void StartSetUpV2ray(ConnectionInfo connectionInfo) - { - functionResult = true; - onlyIpv6 = false; - getApt = false; - getDnf = false; - getYum = false; - - //******"正在登录远程主机......"****** - SetUpProgressBarProcessing(1); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_Login").ToString(); - MainWindowsShowInfo(currentStatus); - - try - { - #region 主机指纹,暂未启用 - //byte[] expectedFingerPrint = new byte[] { - // 0x66, 0x31, 0xaf, 0x00, 0x54, 0xb9, 0x87, 0x31, - // 0xff, 0x58, 0x1c, 0x31, 0xb1, 0xa2, 0x4c, 0x6b - // }; - #endregion - using (var client = new SshClient(connectionInfo)) - { - #region ssh登录验证主机指纹代码块,暂未启用 - // client.HostKeyReceived += (sender, e) => - // { - // if (expectedFingerPrint.Length == e.FingerPrint.Length) - // { - // for (var i = 0; i < expectedFingerPrint.Length; i++) - // { - // if (expectedFingerPrint[i] != e.FingerPrint[i]) - // { - // e.CanTrust = false; - // break; - // } - // } - // } - // else - // { - // e.CanTrust = false; - // } - // }; - #endregion - - client.Connect(); - if (client.IsConnected == true) - { - //******"主机登录成功"****** - SetUpProgressBarProcessing(3); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginSuccessful").ToString(); - MainWindowsShowInfo(currentStatus); - //Thread.Sleep(3000); - } - - //检测root权限 5--7 - functionResult = RootAuthorityDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测是否已安装代理 8--10 - functionResult = SoftInstalledIsNoYes(client, "v2ray", @"/usr/local/bin/v2ray"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测系统是否符合安装要求 11--30 - //检测关闭Selinux及系统组件是否齐全(apt-get/yum/dnf/systemctl) - //安装依赖软件,检测端口,防火墙开启端口 - functionResult = ShutDownSelinuxAndSysComponentsDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测校对时间 31--33 - functionResult = CheckProofreadingTime(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测域名解析是否正确 34---36 - if (testDomain == true) - { - functionResult = DomainResolutionCurrentIPDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - } - - //下载安装脚本安装 37--40 - functionResult = ProxySoftInstall(client, @"V2Ray", @"https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh"); - //functionResult = ProxySoftInstallV2ray(client, @"V2Ray", @"https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh"); - - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - //functionResult = V2RayInstallScript(client); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //程序是否安装成功检测 41--43 - functionResult = SoftInstalledSuccessOrFail(client, "v2ray", @"/usr/local/bin/v2ray"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //生成服务端配置 44--46 - functionResult = GenerateServerConfigurationV2Ray(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //****** "上传配置文件......" ****** 47--50 - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadSoftConfig").ToString(); - MainWindowsShowInfo(currentStatus); - string serverRemoteConfig = @"/usr/local/etc/v2ray/config.json"; - UploadConfig(connectionInfo, @"config.json", serverRemoteConfig); - File.Delete(@"config.json"); - SetUpProgressBarProcessing(50); - - //如果使用http2/WebSocketTLS/tcpTLS/VlessTcpTlsWeb/VLESS+TCP+XTLS+Web模式,先要安装acme.sh,申请证书 - if (String.Equals(ReceiveConfigurationParameters[0], "Http2") == true - || String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS") == true - || String.Equals(ReceiveConfigurationParameters[0], "tcpTLS") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessXtlsTcp") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessTcpTlsWeb") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessVmessXtlsTcpWebSocketWeb") == true) - { - //安装acme.sh与申请证书 51--57 - functionResult = AcmeShInstall(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //安装证书到V2Ray 58--60 - functionResult = CertInstallToV2ray(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - } - - - #region Caddy安装 61--70 - - //如果是VLESS+TCP+XTLS+Web/VLESS+TCP+TLS+Web/VLESS+WebSocket+TLS+Web/VLESS+http2+TLS+Web/WebSocket+TLS+Web/http2Web模式,需要安装Caddy - if (String.Equals(ReceiveConfigurationParameters[0], "VlessXtlsTcp") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessTcpTlsWeb") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessWebSocketTlsWeb") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessHttp2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "http2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessVmessXtlsTcpWebSocketWeb") == true) - { - //安装Caddy 61--66 - functionResult = CaddyInstall(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - - #region 上传Caddy配置文件 67--70 - - //******"上传Caddy配置文件"****** - SetUpProgressBarProcessing(67); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadCaddyConfig").ToString(); - MainWindowsShowInfo(currentStatus); - - string serverConfig = ""; - sshShellCommand = @"mv /etc/caddy/Caddyfile /etc/caddy/Caddyfile.bak"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - if (String.Equals(ReceiveConfigurationParameters[0], "VlessXtlsTcp") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessTcpTlsWeb") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessVmessXtlsTcpWebSocketWeb") == true) - { - serverConfig = $"{pwdir}" + @"TemplateConfg\v2ray\caddy\vlessTcpTlsWeb.caddyfile"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessWebSocketTlsWeb") == true - || String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS2Web") == true) - { - serverConfig = $"{pwdir}" + @"TemplateConfg\v2ray\caddy\WebSocketTLSWeb.caddyfile"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessHttp2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "http2Web") == true) - { - serverConfig = $"{pwdir}" + @"TemplateConfg\v2ray\caddy\Http2Web.caddyfile"; - } - - string upLoadPath = "/etc/caddy/Caddyfile"; - client.RunCommand("mv /etc/caddy/Caddyfile /etc/caddy/Caddyfile.bak"); - UploadConfig(connectionInfo, serverConfig, upLoadPath); - - functionResult = FileCheckExists(client, @"/etc/caddy/Caddyfile"); - if (functionResult == false) - { - //****** "Caddy配置文件上传失败!" ******32 - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadCaddyConfigFailed").ToString(); - MainWindowsShowInfo(currentStatus); - FunctionResultErr(); - client.Disconnect(); - return; - } - - //****** "Caddy配置文件上传成功,OK!" ******32 - SetUpProgressBarProcessing(70); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadCaddyConfigOK").ToString(); - MainWindowsShowInfo(currentStatus); - - //设置Caddy配置文件 - functionResult = SetCaddyfile(client, upLoadPath); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - - #endregion - - //启动Caddy服务 - functionResult = SoftStartDetect(client, "caddy", @"/usr/bin/caddy"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - } - #endregion - - //****** "正在启动V2ray......" ******35 - functionResult = SoftStartDetect(client, "v2ray", @"/usr/local/bin/v2ray"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //测试BBR条件,若满足提示是否启用 - functionResult = DetectBBRandEnable(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - client.Disconnect();//断开服务器ssh连接 - - //生成客户端配置 96--98 - functionResult = GenerateClientConfigurationV2Ray(); - - //****** "V2Ray安装成功,祝你玩的愉快!!" ******40 - SetUpProgressBarProcessing(100); - currentStatus = "V2Ray" + Application.Current.FindResource("DisplayInstallInfo_ProxyInstalledOK").ToString(); - MainWindowsShowInfo(currentStatus); - - Thread.Sleep(1000); - - //显示服务端连接参数 - proxyType = "V2Ray"; - ResultClientInformation resultClientInformation = new ResultClientInformation(); - resultClientInformation.ShowDialog(); - - return; - - } - } - catch (Exception ex1)//例外处理 - { - ProcessException(ex1.Message); - - //****** "安装失败!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - } - - #region V2Ray专用调用函数 - //安装代理程序 37--40 - //functionResult = ProxySoftInstall(client,@"",@""); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - private bool ProxySoftInstallV2ray(SshClient client, string proxyName, string downloadUrl) - { - //****** "系统环境检测完毕,符合安装要求,开始布署......" ****** - SetUpProgressBarProcessing(37); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstalling").ToString(); - MainWindowsShowInfo(currentStatus); - - //****** "正在安装{proxyName}......" ****** - SetUpProgressBarProcessing(38); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstallSoft").ToString() + $"{proxyName}......"; - MainWindowsShowInfo(currentStatus); - - saveShellScriptFileName = GenerateRandomScriptFileName(GenerateRandomStr(10)); - - sshShellCommand = $"curl -o {saveShellScriptFileName} {downloadUrl}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - functionResult = FileCheckExists(client, $"{saveShellScriptFileName}"); - if (functionResult == false) - { - //***文件下载失败!*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DownloadScriptFailed").ToString(); - MainWindowsShowInfo(currentStatus); - return false; - - } - sshShellCommand = $"yes | bash {saveShellScriptFileName} --version v4.32.1"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"rm -f {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - SetUpProgressBarProcessing(40); - return true; - } - - - //生成V2Ray服务端配置 44--46 - //functionResult = GenerateServerConfiguration(client); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - private bool GenerateServerConfigurationV2Ray(SshClient client) - { - SetUpProgressBarProcessing(44); - //修改v2ray.service - - sshShellCommand = $"sed -i 's/User=nobody/User=root/g' /etc/systemd/system/v2ray.service"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"sed -i 's/CapabilityBoundingSet=/#CapabilityBoundingSet=/g' /etc/systemd/system/v2ray.service"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"sed -i 's/AmbientCapabilities=/#AmbientCapabilities=/g' /etc/systemd/system/v2ray.service"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"systemctl daemon-reload"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //备用下载地址:https://raw.githubusercontent.com/proxysu/Resources/master/v2ray/v2ray.service - - //sshShellCommand = $"yes | curl -o /etc/systemd/system/v2ray.service https://raw.githubusercontent.com/proxysu/Resources/master/v2ray/v2ray.service"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //备份原来的文件 - functionResult = FileCheckExists(client, @"/usr/local/etc/v2ray/config.json"); - if (functionResult == true) - { - - sshShellCommand = @"mv /usr/local/etc/v2ray/config.json /usr/local/etc/v2ray/config.json.1"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - } - //读取配置文件各个模块 - string logConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\00_log\00_log.json"; - string apiConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\01_api\01_api.json"; - string dnsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\02_dns\02_dns.json"; - string routingConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\03_routing\03_routing.json"; - string policyConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\04_policy\04_policy.json"; - string inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\05_inbounds\05_inbounds.json"; - string outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\06_outbounds\06_outbounds.json"; - string transportConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\07_transport\07_transport.json"; - string statsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\08_stats\08_stats.json"; - string reverseConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\09_reverse\09_reverse.json"; - string baseConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\base.json"; - - //配置文件模块合成 - using (StreamReader reader = File.OpenText(baseConfigJson)) - { - JObject serverJson = (JObject)JToken.ReadFrom(new JsonTextReader(reader)); - //读取"log" - using (StreamReader readerJson = File.OpenText(logConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - serverJson["log"] = jObjectJson["log"]; - } - //读取"api" - using (StreamReader readerJson = File.OpenText(apiConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - serverJson["api"] = jObjectJson["api"]; - } - //读取"dns" - using (StreamReader readerJson = File.OpenText(dnsConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - serverJson["dns"] = jObjectJson["dns"]; - } - //读取"routing" - using (StreamReader readerJson = File.OpenText(routingConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - serverJson["routing"] = jObjectJson["routing"]; - } - //读取"policy" - using (StreamReader readerJson = File.OpenText(policyConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - serverJson["policy"] = jObjectJson["policy"]; - } - //读取"inbounds" - using (StreamReader readerJson = File.OpenText(inboundsConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - serverJson["inbounds"] = jObjectJson["inbounds"]; - } - //读取"outbounds" - using (StreamReader readerJson = File.OpenText(outboundsConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - serverJson["outbounds"] = jObjectJson["outbounds"]; - } - //读取"transport" - using (StreamReader readerJson = File.OpenText(transportConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - serverJson["transport"] = jObjectJson["transport"]; - } - //读取"stats" - using (StreamReader readerJson = File.OpenText(statsConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - serverJson["stats"] = jObjectJson["stats"]; - } - //读取"reverse" - using (StreamReader readerJson = File.OpenText(reverseConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - serverJson["reverse"] = jObjectJson["reverse"]; - } - - //依据安装模式读取相应模板 - if (String.Equals(ReceiveConfigurationParameters[0], "TCP") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\05_inbounds\tcp_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "TCPhttp") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\05_inbounds\tcp_http_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "tcpTLS") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\05_inbounds\tcp_TLS_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "tcpTLSselfSigned") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\05_inbounds\tcpTLSselfSigned_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessXtlsTcp") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\05_inbounds\vless_tcp_xtls_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessTcpTlsWeb") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\05_inbounds\vless_tcp_tls_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessWebSocketTlsWeb") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\05_inbounds\vless_ws_tls_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessHttp2Web") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\05_inbounds\vless_http2_tls_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessVmessXtlsTcpWebSocketWeb") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\05_inbounds\vless_vmess_xtls_tcp_websocket_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "webSocket") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\05_inbounds\webSocket_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\05_inbounds\WebSocket_TLS_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLSselfSigned") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\05_inbounds\WebSocketTLS_selfSigned_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS2Web") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\05_inbounds\WebSocketTLSWeb_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "Http2") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\05_inbounds\http2_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "http2Web") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\05_inbounds\Http2Web_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "http2selfSigned") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\Http2selfSigned_server_config.json"; - } - //else if (String.Equals(ReceiveConfigurationParameters[0], "MkcpNone")|| String.Equals(ReceiveConfigurationParameters[0], "mKCP2SRTP")||String.Equals(ReceiveConfigurationParameters[0], "mKCPuTP")|| String.Equals(ReceiveConfigurationParameters[0], "mKCP2WechatVideo")|| String.Equals(ReceiveConfigurationParameters[0], "mKCP2DTLS")|| String.Equals(ReceiveConfigurationParameters[0], "mKCP2WireGuard")) - else if (ReceiveConfigurationParameters[0].Contains("mKCP") == true) - { - if (mKCPvlessIsSet == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\05_inbounds\vless_mkcp_server_config.json"; - } - else - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\05_inbounds\mkcp_server_config.json"; - } - - } - - // else if (String.Equals(ReceiveConfigurationParameters[0], "QuicNone") || String.Equals(ReceiveConfigurationParameters[0], "QuicSRTP") || String.Equals(ReceiveConfigurationParameters[0], "Quic2uTP") || String.Equals(ReceiveConfigurationParameters[0], "QuicWechatVideo") || String.Equals(ReceiveConfigurationParameters[0], "QuicDTLS") || String.Equals(ReceiveConfigurationParameters[0], "QuicWireGuard")) - else if (ReceiveConfigurationParameters[0].Contains("Quic") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\server\05_inbounds\quic_server_config.json"; - } - - //读取"inbounds" - using (StreamReader readerJson = File.OpenText(inboundsConfigJson)) - { - JObject jObjectJsonTmp = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - var jObjectJson = (dynamic)jObjectJsonTmp; - - //Padavan路由固件服务端设置(因为客户端分流有问题所以在服务端弥补)加上后会影响一定的速度 - - //string sniffingAddServer = $"{pwdir}" + @"TemplateConfg\v2ray\server\05_inbounds\00_padavan_router.json"; - //using (StreamReader readerSniffingJson = File.OpenText(sniffingAddServer)) - //{ - // JObject jObjectSniffingJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerSniffingJson)); - // jObjectJson["inbounds"][0]["sniffing"] = jObjectSniffingJson["sniffing"]; - //} - - //设置uuid - jObjectJson["inbounds"][0]["settings"]["clients"][0]["id"] = ReceiveConfigurationParameters[2]; - - //除WebSocketTLSWeb/http2Web/VLESS+WebSocket+TLS+Web/VLESS+http2+TLS+Web模式外设置监听端口 - if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS2Web") == false - && String.Equals(ReceiveConfigurationParameters[0], "http2Web") == false - && String.Equals(ReceiveConfigurationParameters[0], "VlessWebSocketTlsWeb") == false - && String.Equals(ReceiveConfigurationParameters[0], "VlessHttp2Web") == false) - { - jObjectJson["inbounds"][0]["port"] = int.Parse(ReceiveConfigurationParameters[1]); - } - - //设置VLESS协议的回落端口,指向Caddy - if (String.Equals(ReceiveConfigurationParameters[0], "VlessTcpTlsWeb") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessXtlsTcp") == true) - { - //设置Caddy随机监听的端口 - randomCaddyListenPort = GetRandomPort(); - - //指向Caddy监听的随机端口 - jObjectJson["inbounds"][0]["settings"]["fallbacks"][0]["dest"] = randomCaddyListenPort; - } - //设置VLESS+VMESS+Trojan+XTLS+TCP+WebSocket+Web协议 - if (String.Equals(ReceiveConfigurationParameters[0], "VlessVmessXtlsTcpWebSocketWeb") == true) - { - //设置Caddy随机监听的端口 - randomCaddyListenPort = GetRandomPort(); - - //指向Caddy监听的随机端口 - jObjectJson["inbounds"][1]["settings"]["fallbacks"][0]["dest"] = randomCaddyListenPort; - //设置其他模式的UUID - jObjectJson["inbounds"][1]["settings"]["clients"][0]["password"] = ReceiveConfigurationParameters[2]; - jObjectJson["inbounds"][2]["settings"]["clients"][0]["id"] = ReceiveConfigurationParameters[2]; - jObjectJson["inbounds"][3]["settings"]["clients"][0]["id"] = ReceiveConfigurationParameters[2]; - jObjectJson["inbounds"][4]["settings"]["clients"][0]["id"] = ReceiveConfigurationParameters[2]; - - //设置Vless回落与分流的Path - jObjectJson["inbounds"][0]["settings"]["fallbacks"][1]["path"] = ReceiveConfigurationParameters[3]; - jObjectJson["inbounds"][0]["settings"]["fallbacks"][2]["path"] = ReceiveConfigurationParameters[9]; - jObjectJson["inbounds"][0]["settings"]["fallbacks"][3]["path"] = ReceiveConfigurationParameters[6]; - - //设置Vless ws Path - jObjectJson["inbounds"][2]["streamSettings"]["wsSettings"]["path"] = ReceiveConfigurationParameters[3]; - //设置Vmess tcp Path - jObjectJson["inbounds"][3]["streamSettings"]["tcpSettings"]["header"]["request"]["path"][0] = ReceiveConfigurationParameters[9]; - //设置Vmess ws Path - jObjectJson["inbounds"][4]["streamSettings"]["wsSettings"]["path"] = ReceiveConfigurationParameters[6]; - - } - - //TLS自签证书/WebSocketTLS(自签证书)/http2自签证书模式下,使用v2ctl 生成自签证书 - if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLSselfSigned") == true - || String.Equals(ReceiveConfigurationParameters[0], "tcpTLSselfSigned") == true - || String.Equals(ReceiveConfigurationParameters[0], "http2selfSigned") == true) - { - string selfSignedCa = client.RunCommand("/usr/local/bin/v2ctl cert --ca").Result; - JObject selfSignedCaJObject = JObject.Parse(selfSignedCa); - jObjectJson["inbounds"][0]["streamSettings"]["tlsSettings"]["certificates"][0] = selfSignedCaJObject; - } - - //如果是WebSocketTLSWeb/WebSocketTLS/WebSocketTLS(自签证书)/VLESS+WebSocket+TLS+Web模式,则设置路径 - if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS") == true - || String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLSselfSigned") == true - || String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessWebSocketTlsWeb") == true) - { - jObjectJson["inbounds"][0]["streamSettings"]["wsSettings"]["path"] = ReceiveConfigurationParameters[6]; - } - - //如果是Http2/http2Web/http2自签/VLESS+http2+TLS+Web模式下,设置路径 - if (String.Equals(ReceiveConfigurationParameters[0], "Http2") == true - || String.Equals(ReceiveConfigurationParameters[0], "http2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "http2selfSigned") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessHttp2Web") == true) - { - jObjectJson["inbounds"][0]["streamSettings"]["httpSettings"]["path"] = ReceiveConfigurationParameters[6]; - } - - //如果是Http2+Web/VLESS+http2+TLS+Web模式下,设置host - if (String.Equals(ReceiveConfigurationParameters[0], "http2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessHttp2Web") == true) - { - jObjectJson["inbounds"][0]["streamSettings"]["httpSettings"]["host"][0] = ReceiveConfigurationParameters[4]; - } - - //mkcp模式下,设置伪装类型 - if (ReceiveConfigurationParameters[0].Contains("mKCP") == true) - { - jObjectJson["inbounds"][0]["streamSettings"]["kcpSettings"]["header"]["type"] = ReceiveConfigurationParameters[5]; - if (String.IsNullOrEmpty(ReceiveConfigurationParameters[6]) == false) - { - jObjectJson["inbounds"][0]["streamSettings"]["kcpSettings"]["seed"] = ReceiveConfigurationParameters[6]; - } - } - - //quic模式下设置伪装类型及密钥 - if (ReceiveConfigurationParameters[0].Contains("Quic") == true) - { - jObjectJson["inbounds"][0]["streamSettings"]["quicSettings"]["header"]["type"] = ReceiveConfigurationParameters[5]; - jObjectJson["inbounds"][0]["streamSettings"]["quicSettings"]["security"] = ReceiveConfigurationParameters[3]; - - if (String.Equals(ReceiveConfigurationParameters[3], "none") == true) - { - ReceiveConfigurationParameters[6] = ""; - } - jObjectJson["inbounds"][0]["streamSettings"]["quicSettings"]["key"] = ReceiveConfigurationParameters[6]; - } - - serverJson["inbounds"] = jObjectJson["inbounds"]; - } - - using (StreamWriter sw = new StreamWriter(@"config.json")) - { - sw.Write(serverJson.ToString()); - } - } - SetUpProgressBarProcessing(46); - return true; - } - - //安装证书到V2Ray 58--60 - //functionResult = CertInstallToV2ray(client); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - private bool CertInstallToV2ray(SshClient client) - { - //****** "安装证书到V2ray......" ******26 - SetUpProgressBarProcessing(58); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_IntallCertToSoft").ToString() + "V2ray......"; - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"mkdir -p /usr/local/etc/v2ray/ssl"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"/root/.acme.sh/acme.sh --installcert -d {ReceiveConfigurationParameters[4]} --certpath /usr/local/etc/v2ray/ssl/v2ray_ssl.crt --keypath /usr/local/etc/v2ray/ssl/v2ray_ssl.key --capath /usr/local/etc/v2ray/ssl/v2ray_ssl.crt --reloadcmd \"systemctl restart v2ray\""; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"if [ ! -f ""/usr/local/etc/v2ray/ssl/v2ray_ssl.key"" ]; then echo ""0""; else echo ""1""; fi | head -n 1"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - if (currentShellCommandResult.Contains("1") == true) - { - //****** "证书成功安装到V2ray!" ******27 - SetUpProgressBarProcessing(60); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_IntallCertToSoftOK").ToString() + "V2Ray!"; - MainWindowsShowInfo(currentStatus); - } - else - { - //****** "证书安装到V2ray失败,原因未知,可以向开发者提问!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_IntallCertToSoftFail").ToString() + - "V2Ray" + - Application.Current.FindResource("DisplayInstallInfo_InstallCertFailAsk").ToString(); - MainWindowsShowInfo(currentStatus); - return false; - } - - //设置私钥权限 - sshShellCommand = @"chmod 644 /usr/local/etc/v2ray/ssl/v2ray_ssl.key"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - return true; - } - - //生成V2Ray客户端配置 96--98 - //functionResult = GenerateClientConfiguration(); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - private bool GenerateClientConfigurationV2Ray() - { - //****** "生成客户端配置......" ******39 - SetUpProgressBarProcessing(96); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_GenerateClientConfig").ToString(); - MainWindowsShowInfo(currentStatus); - - string logConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\00_log\00_log.json"; - string apiConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\01_api\01_api.json"; - string dnsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\02_dns\02_dns.json"; - string routingConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\03_routing\03_routing.json"; - string policyConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\04_policy\04_policy.json"; - string inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\05_inbounds\05_inbounds.json"; - string outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\06_outbounds\06_outbounds.json"; - string transportConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\07_transport\07_transport.json"; - string statsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\08_stats\08_stats.json"; - string reverseConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\09_reverse\09_reverse.json"; - string baseConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\base.json"; - //Thread.Sleep(1000); - if (!Directory.Exists("v2ray_config"))//如果不存在就创建file文件夹      - { - Directory.CreateDirectory("v2ray_config");//创建该文件夹   - } - - using (StreamReader reader = File.OpenText(baseConfigJson)) - { - JObject clientJson = (JObject)JToken.ReadFrom(new JsonTextReader(reader)); - //读取"log" - using (StreamReader readerJson = File.OpenText(logConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - clientJson["log"] = jObjectJson["log"]; - } - //读取"api" - using (StreamReader readerJson = File.OpenText(apiConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - clientJson["api"] = jObjectJson["api"]; - } - //读取"dns" - using (StreamReader readerJson = File.OpenText(dnsConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - clientJson["dns"] = jObjectJson["dns"]; - } - //读取"routing" - using (StreamReader readerJson = File.OpenText(routingConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - clientJson["routing"] = jObjectJson["routing"]; - } - //读取"policy" - using (StreamReader readerJson = File.OpenText(policyConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - clientJson["policy"] = jObjectJson["policy"]; - } - //读取"inbounds" - using (StreamReader readerJson = File.OpenText(inboundsConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - clientJson["inbounds"] = jObjectJson["inbounds"]; - } - //读取"outbounds" - using (StreamReader readerJson = File.OpenText(outboundsConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - clientJson["outbounds"] = jObjectJson["outbounds"]; - } - //读取"transport" - using (StreamReader readerJson = File.OpenText(transportConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - clientJson["transport"] = jObjectJson["transport"]; - } - //读取"stats" - using (StreamReader readerJson = File.OpenText(statsConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - clientJson["stats"] = jObjectJson["stats"]; - } - //读取"reverse" - using (StreamReader readerJson = File.OpenText(reverseConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - clientJson["reverse"] = jObjectJson["reverse"]; - } - - //根据不同的安装方案,选择相应的客户端模板 - if (String.Equals(ReceiveConfigurationParameters[0], "VlessVmessXtlsTcpWebSocketWeb") == false) - { - #region 单模式方案 - //根据选择的不同模式,选择相应的配置文件 - if (String.Equals(ReceiveConfigurationParameters[0], "TCP") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\06_outbounds\tcp_client_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "TCPhttp") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\06_outbounds\tcp_http_client_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "tcpTLS") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\06_outbounds\tcp_TLS_client_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "tcpTLSselfSigned") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\06_outbounds\tcpTLSselfSigned_client_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessXtlsTcp") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\06_outbounds\vless_tcp_xtls_client_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessTcpTlsWeb") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\06_outbounds\vless_tcp_tls_caddy_cilent_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessWebSocketTlsWeb") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\06_outbounds\vless_ws_tls_client_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessHttp2Web") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\06_outbounds\vless_http2_tls_server_config.json"; - } - - else if (String.Equals(ReceiveConfigurationParameters[0], "webSocket") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\06_outbounds\webSocket_client_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\06_outbounds\WebSocket_TLS_client_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLSselfSigned") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\06_outbounds\WebSocketTLS_selfSigned_client_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS2Web") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\06_outbounds\WebSocketTLSWeb_client_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "Http2") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\06_outbounds\http2_client_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "http2Web") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\06_outbounds\Http2Web_client_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "http2selfSigned") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\06_outbounds\Http2selfSigned_client_config.json"; - } - //else if (String.Equals(ReceiveConfigurationParameters[0], "MkcpNone")|| String.Equals(ReceiveConfigurationParameters[0], "mKCP2SRTP")||String.Equals(ReceiveConfigurationParameters[0], "mKCPuTP")|| String.Equals(ReceiveConfigurationParameters[0], "mKCP2WechatVideo")|| String.Equals(ReceiveConfigurationParameters[0], "mKCP2DTLS")|| String.Equals(ReceiveConfigurationParameters[0], "mKCP2WireGuard")) - else if (ReceiveConfigurationParameters[0].Contains("mKCP") == true) - { - if (mKCPvlessIsSet == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\06_outbounds\vless_mkcp_client_config.json"; - } - else - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\06_outbounds\mkcp_client_config.json"; - } - - } - // else if (String.Equals(ReceiveConfigurationParameters[0], "QuicNone") || String.Equals(ReceiveConfigurationParameters[0], "QuicSRTP") || String.Equals(ReceiveConfigurationParameters[0], "Quic2uTP") || String.Equals(ReceiveConfigurationParameters[0], "QuicWechatVideo") || String.Equals(ReceiveConfigurationParameters[0], "QuicDTLS") || String.Equals(ReceiveConfigurationParameters[0], "QuicWireGuard")) - else if (ReceiveConfigurationParameters[0].Contains("Quic") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\v2ray\client\06_outbounds\quic_client_config.json"; - } - - - //读取"相应模板的outbounds" - using (StreamReader readerJson = File.OpenText(outboundsConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - - //设置客户端的地址/端口/id - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["address"] = ReceiveConfigurationParameters[4]; - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["port"] = int.Parse(ReceiveConfigurationParameters[1]); - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["users"][0]["id"] = ReceiveConfigurationParameters[2]; - - - //设置WebSocket模式下的path - if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS") == true - || String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLSselfSigned") == true - || String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessWebSocketTlsWeb") == true) - { - jObjectJson["outbounds"][0]["streamSettings"]["wsSettings"]["path"] = ReceiveConfigurationParameters[6]; - } - - //设置http2模式下的path - if (String.Equals(ReceiveConfigurationParameters[0], "Http2") == true - || String.Equals(ReceiveConfigurationParameters[0], "http2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "http2selfSigned") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessHttp2Web") == true) - { - jObjectJson["outbounds"][0]["streamSettings"]["httpSettings"]["path"] = ReceiveConfigurationParameters[6]; - } - - //设置http2+TLS+Web/VLESS+http2+TLS+Web模式下的host - if (String.Equals(ReceiveConfigurationParameters[0], "http2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessHttp2Web") == true) - { - jObjectJson["outbounds"][0]["streamSettings"]["httpSettings"]["host"][0] = ReceiveConfigurationParameters[4]; - } - - //设置VLESS+TCP+XTLS+Web模式下的serverName - //if (String.Equals(ReceiveConfigurationParameters[0], "VlessXtlsTcp") == true) - //{ - // jObjectJson["outbounds"][0]["streamSettings"]["xtlsSettings"]["serverName"] = ReceiveConfigurationParameters[4]; - //} - - //设置mkcp - if (ReceiveConfigurationParameters[0].Contains("mKCP") == true) - { - jObjectJson["outbounds"][0]["streamSettings"]["kcpSettings"]["header"]["type"] = ReceiveConfigurationParameters[5]; - if (String.IsNullOrEmpty(ReceiveConfigurationParameters[6]) == false) - { - jObjectJson["outbounds"][0]["streamSettings"]["kcpSettings"]["seed"] = ReceiveConfigurationParameters[6]; - } - } - - //设置QUIC - if (ReceiveConfigurationParameters[0].Contains("Quic") == true) - { - jObjectJson["outbounds"][0]["streamSettings"]["quicSettings"]["header"]["type"] = ReceiveConfigurationParameters[5]; - jObjectJson["outbounds"][0]["streamSettings"]["quicSettings"]["security"] = ReceiveConfigurationParameters[3]; - if (String.Equals(ReceiveConfigurationParameters[3], "none") == true) - { - ReceiveConfigurationParameters[6] = ""; - } - jObjectJson["outbounds"][0]["streamSettings"]["quicSettings"]["key"] = ReceiveConfigurationParameters[6]; - } - - clientJson["outbounds"] = jObjectJson["outbounds"]; - - } - - using (StreamWriter sw = new StreamWriter(@"v2ray_config\config.json")) - { - sw.Write(clientJson.ToString()); - } - - #endregion - - } - else - { - //复合方案所需要的配置文件 - //VLESS over TCP with XTLS模式 - //string outboundsConfigJsons = $"{pwdir}" + @"TemplateConfg\v2ray\client\06_outbounds\vless_tcp_xtls_client_config.json"; - //using (StreamReader readerJson = File.OpenText(outboundsConfigJsons)) - //{ - // JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - - // //设置客户端的地址/端口/id - // jObjectJson["outbounds"][0]["settings"]["vnext"][0]["address"] = ReceiveConfigurationParameters[4]; - // jObjectJson["outbounds"][0]["settings"]["vnext"][0]["port"] = int.Parse(ReceiveConfigurationParameters[1]); - // jObjectJson["outbounds"][0]["settings"]["vnext"][0]["users"][0]["id"] = ReceiveConfigurationParameters[2]; - - // clientJson["outbounds"] = jObjectJson["outbounds"]; - // if (!Directory.Exists(@"v2ray_config\vless_tcp_xtls_client_config"))//如果不存在就创建file文件夹      - // { - // Directory.CreateDirectory(@"v2ray_config\vless_tcp_xtls_client_config");//创建该文件夹   - // } - // using (StreamWriter sw = new StreamWriter(@"v2ray_config\vless_tcp_xtls_client_config\config.json")) - // { - // sw.Write(clientJson.ToString()); - // } - //} - - //VLESS over TCP with TLS模式 - string outboundsConfigJsons = $"{pwdir}" + @"TemplateConfg\v2ray\client\06_outbounds\vless_tcp_tls_caddy_cilent_config.json"; - using (StreamReader readerJson = File.OpenText(outboundsConfigJsons)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - - //设置客户端的地址/端口/id - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["address"] = ReceiveConfigurationParameters[4]; - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["port"] = int.Parse(ReceiveConfigurationParameters[1]); - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["users"][0]["id"] = ReceiveConfigurationParameters[2]; - - clientJson["outbounds"] = jObjectJson["outbounds"]; - if (!Directory.Exists(@"v2ray_config\vless_tcp_tls_client_config"))//如果不存在就创建file文件夹      - { - Directory.CreateDirectory(@"v2ray_config\vless_tcp_tls_client_config");//创建该文件夹   - } - using (StreamWriter sw = new StreamWriter(@"v2ray_config\vless_tcp_tls_client_config\config.json")) - { - sw.Write(clientJson.ToString()); - } - } - - //VLESS over WS with TLS 模式 - outboundsConfigJsons = $"{pwdir}" + @"TemplateConfg\v2ray\client\06_outbounds\vless_ws_tls_client_config.json"; - using (StreamReader readerJson = File.OpenText(outboundsConfigJsons)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - - //设置客户端的地址/端口/id - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["address"] = ReceiveConfigurationParameters[4]; - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["port"] = int.Parse(ReceiveConfigurationParameters[1]); - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["users"][0]["id"] = ReceiveConfigurationParameters[2]; - jObjectJson["outbounds"][0]["streamSettings"]["wsSettings"]["path"] = ReceiveConfigurationParameters[3]; - - clientJson["outbounds"] = jObjectJson["outbounds"]; - if (!Directory.Exists(@"v2ray_config\vless_ws_tls_client_config"))//如果不存在就创建file文件夹      - { - Directory.CreateDirectory(@"v2ray_config\vless_ws_tls_client_config");//创建该文件夹   - } - using (StreamWriter sw = new StreamWriter(@"v2ray_config\vless_ws_tls_client_config\config.json")) - { - sw.Write(clientJson.ToString()); - } - } - - //VMess over TCP with TLS模式 - outboundsConfigJsons = $"{pwdir}" + @"TemplateConfg\v2ray\client\06_outbounds\vmess_tcp_tls_client_config.json"; - using (StreamReader readerJson = File.OpenText(outboundsConfigJsons)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - - //设置客户端的地址/端口/id - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["address"] = ReceiveConfigurationParameters[4]; - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["port"] = int.Parse(ReceiveConfigurationParameters[1]); - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["users"][0]["id"] = ReceiveConfigurationParameters[2]; - jObjectJson["outbounds"][0]["streamSettings"]["tcpSettings"]["header"]["request"]["path"][0] = ReceiveConfigurationParameters[9]; - - clientJson["outbounds"] = jObjectJson["outbounds"]; - if (!Directory.Exists(@"v2ray_config\vmess_tcp_tls_client_config"))//如果不存在就创建file文件夹      - { - Directory.CreateDirectory(@"v2ray_config\vmess_tcp_tls_client_config");//创建该文件夹   - } - using (StreamWriter sw = new StreamWriter(@"v2ray_config\vmess_tcp_tls_client_config\config.json")) - { - sw.Write(clientJson.ToString()); - } - } - - //VMess over WS with TLS模式 - outboundsConfigJsons = $"{pwdir}" + @"TemplateConfg\v2ray\client\06_outbounds\WebSocketTLSWeb_client_config.json"; - using (StreamReader readerJson = File.OpenText(outboundsConfigJsons)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - - //设置客户端的地址/端口/id - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["address"] = ReceiveConfigurationParameters[4]; - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["port"] = int.Parse(ReceiveConfigurationParameters[1]); - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["users"][0]["id"] = ReceiveConfigurationParameters[2]; - jObjectJson["outbounds"][0]["streamSettings"]["wsSettings"]["path"] = ReceiveConfigurationParameters[6]; - - clientJson["outbounds"] = jObjectJson["outbounds"]; - if (!Directory.Exists(@"v2ray_config\vmess_ws_tls_client_config"))//如果不存在就创建file文件夹      - { - Directory.CreateDirectory(@"v2ray_config\vmess_ws_tls_client_config");//创建该文件夹   - } - using (StreamWriter sw = new StreamWriter(@"v2ray_config\vmess_ws_tls_client_config\config.json")) - { - sw.Write(clientJson.ToString()); - } - } - - //Trojan over TCP with TLS模式 - outboundsConfigJsons = $"{pwdir}" + @"TemplateConfg\v2ray\client\06_outbounds\trojan_tcp_tls.json"; - using (StreamReader readerJson = File.OpenText(outboundsConfigJsons)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - - //设置客户端的地址/端口/id - jObjectJson["outbounds"][0]["settings"]["servers"][0]["address"] = ReceiveConfigurationParameters[4]; - jObjectJson["outbounds"][0]["settings"]["servers"][0]["port"] = int.Parse(ReceiveConfigurationParameters[1]); - jObjectJson["outbounds"][0]["settings"]["servers"][0]["password"] = ReceiveConfigurationParameters[2]; - jObjectJson["outbounds"][0]["streamSettings"]["tlsSettings"]["serverName"] = ReceiveConfigurationParameters[4]; - - clientJson["outbounds"] = jObjectJson["outbounds"]; - if (!Directory.Exists(@"v2ray_config\trojan_tcp_tls_client_config"))//如果不存在就创建file文件夹      - { - Directory.CreateDirectory(@"v2ray_config\trojan_tcp_tls_client_config");//创建该文件夹   - } - using (StreamWriter sw = new StreamWriter(@"v2ray_config\trojan_tcp_tls_client_config\config.json")) - { - sw.Write(clientJson.ToString()); - } - } - - } - } - SetUpProgressBarProcessing(98); - return true; - } - - - #endregion - - //检测升级远程主机端的V2Ray版本 - private void ButtonUpdateV2ray_Click(object sender, RoutedEventArgs e) - { - ConnectionInfo connectionInfo = GenerateConnectionInfo(); - if (connectionInfo == null) - { - //****** "远程主机连接信息有误,请检查!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostConnection").ToString()); - return; - } - installationDegree = 0; - TextBoxMonitorCommandResults.Text = ""; - Thread thread = new Thread(() => UpdateV2ray(connectionInfo)); - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - } - - //升级V2ray主程序 - private void UpdateV2ray(ConnectionInfo connectionInfo) - { - functionResult = true; - onlyIpv6 = false; - getApt = false; - getDnf = false; - getYum = false; - - //******"正在登录远程主机......"****** - SetUpProgressBarProcessing(1); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_Login").ToString(); - MainWindowsShowInfo(currentStatus); - - try - { - #region 主机指纹,暂未启用 - //byte[] expectedFingerPrint = new byte[] { - // 0x66, 0x31, 0xaf, 0x00, 0x54, 0xb9, 0x87, 0x31, - // 0xff, 0x58, 0x1c, 0x31, 0xb1, 0xa2, 0x4c, 0x6b - // }; - #endregion - using (var client = new SshClient(connectionInfo)) - - { - #region ssh登录验证主机指纹代码块,暂未启用 - // client.HostKeyReceived += (sender, e) => - // { - // if (expectedFingerPrint.Length == e.FingerPrint.Length) - // { - // for (var i = 0; i < expectedFingerPrint.Length; i++) - // { - // if (expectedFingerPrint[i] != e.FingerPrint[i]) - // { - // e.CanTrust = false; - // break; - // } - // } - // } - // else - // { - // e.CanTrust = false; - // } - // }; - #endregion - - client.Connect(); - if (client.IsConnected == true) - { - //******"主机登录成功"****** - SetUpProgressBarProcessing(3); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginSuccessful").ToString(); - MainWindowsShowInfo(currentStatus); - } - - //检测root权限 5--7 - functionResult = RootAuthorityDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - - //******"检测系统是否已经安装V2ray......"****** - SetUpProgressBarProcessing(20); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestExistSoft").ToString() + "V2ray......"; - MainWindowsShowInfo(currentStatus); - - //Thread.Sleep(1000); - //检测是否安装V2Ray - //sshShellCommand = @"find / -name v2ray"; - //sshShellCommand = @"if [[ -f /usr/local/bin/v2ray ]];then echo '1';else echo '0'; fi"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //if (currentShellCommandResult.Contains("/usr/local/bin/v2ray") == false) - //if (currentShellCommandResult.Trim().Equals("0") == true) - functionResult = FileCheckExists(client, @"/usr/local/bin/v2ray"); - if (functionResult == false) - { - //******"退出!原因:远程主机未安装V2ray"****** - currentStatus = Application.Current.FindResource("MessageBoxShow_ErrorUpgradeSoftNotInstall").ToString() + "V2Ray!"; - MainWindowsShowInfo(currentStatus); - MessageBox.Show(currentStatus); - client.Disconnect(); - return; - - } - - //sshcmd = @"/usr/local/bin/v2ray -version | head -n 1 | cut -d "" "" -f2"; - sshShellCommand = @"/usr/local/bin/v2ray -version | head -n 1 | cut -d "" "" -f2"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - string v2rayCurrentVersion = currentShellCommandResult;//不含字母v - - //sshcmd = @"curl -H ""Accept: application/json"" -H ""User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:74.0) Gecko/20100101 Firefox/74.0"" -s ""https://api.github.com/repos/v2fly/v2ray-core/releases/latest"" --connect-timeout 10| grep 'tag_name' | cut -d\"" -f4"; - sshShellCommand = @"curl -H ""Accept: application/json"" -H ""User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:74.0) Gecko/20100101 Firefox/74.0"" -s ""https://api.github.com/repos/v2fly/v2ray-core/releases/latest"" --connect-timeout 10 | grep 'tag_name' | cut -d\"" -f4"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - string v2rayNewVersion = currentShellCommandResult;//包含字母v - - if (v2rayNewVersion.Contains(v2rayCurrentVersion) == false) - { - MessageBoxResult messageBoxResult = MessageBox.Show( - //****** "远程主机当前版本为:v" ****** - Application.Current.FindResource("DisplayInstallInfo_CurrentVersion").ToString() + - $"{v2rayCurrentVersion}\n" + - //****** "最新版本为:" ****** - Application.Current.FindResource("DisplayInstallInfo_NewVersion").ToString() + - $"{v2rayNewVersion}\n" + - //****** "是否升级为最新版本?" ****** - Application.Current.FindResource("DisplayInstallInfo_IsOrNoUpgradeNewVersion").ToString(), "", MessageBoxButton.YesNo, MessageBoxImage.Question); - if (messageBoxResult == MessageBoxResult.Yes) - { - //****** "正在升级到最新版本......" ****** - SetUpProgressBarProcessing(60); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartUpgradeNewVersion").ToString(); - MainWindowsShowInfo(currentStatus); - - //client.RunCommand(@"bash <(curl -L -s https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)"); - sshShellCommand = $"bash <(curl -L -s https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - SetUpProgressBarProcessing(80); - //sshcmd = @"/usr/local/bin/v2ray -version | head -n 1 | cut -d "" "" -f2"; - sshShellCommand = @"/usr/local/bin/v2ray -version | head -n 1 | cut -d "" "" -f2"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - v2rayCurrentVersion = currentShellCommandResult;//不含字母v - if (v2rayNewVersion.Contains(v2rayCurrentVersion) == true) - { - //****** "升级成功!当前已是最新版本!" ****** - MessageBox.Show(Application.Current.FindResource("DisplayInstallInfo_UpgradeNewVersionOK").ToString()); - //****** "升级成功!当前已是最新版本!" ****** - SetUpProgressBarProcessing(100); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UpgradeNewVersionOK").ToString(); - MainWindowsShowInfo(currentStatus); - } - else - { - //****** "升级失败,原因未知,请向开发者提问!" ****** - MessageBox.Show(Application.Current.FindResource("DisplayInstallInfo_UpgradeNewVersionFail").ToString()); - //****** "升级失败,原因未知,请向开发者提问!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UpgradeNewVersionFail").ToString(); - MainWindowsShowInfo(currentStatus); - } - } - else - { - //****** "升级取消,退出!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UpgradeVersionCancel").ToString(); - MainWindowsShowInfo(currentStatus); - - client.Disconnect(); - return; - } - } - else - { - //****** "远程主机当前已是最新版本:" ****** - SetUpProgressBarProcessing(100); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_IsNewVersion").ToString() + - $"{v2rayNewVersion}\n" + - //****** "无需升级!退出!" ****** - Application.Current.FindResource("DisplayInstallInfo_NotUpgradeVersion").ToString(); - MessageBox.Show(currentStatus); - MainWindowsShowInfo(currentStatus); - } - - client.Disconnect(); - return; - } - } - catch (Exception ex1)//例外处理 - #region 例外处理 - { - ProcessException(ex1.Message); - - //****** "主机登录失败!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - #endregion - - } - #endregion - - #region Xray相关 - //打开Xray模板设置窗口 - private void ButtonTemplateConfigurationXray_Click(object sender, RoutedEventArgs e) - { - //清空初始化模板参数 - for (int i = 0; i != ReceiveConfigurationParameters.Length; i++) - - { - ReceiveConfigurationParameters[i] = ""; - } - XrayWindowTemplateConfiguration XraywindowTemplateConfiguration = new XrayWindowTemplateConfiguration(); - XraywindowTemplateConfiguration.Closed += XraywindowTemplateConfigurationClosed; - XraywindowTemplateConfiguration.ShowDialog(); - } - - //Xay模板设置窗口关闭后,触发事件,将所选的方案与其参数显示在UI上 - private void XraywindowTemplateConfigurationClosed(object sender, System.EventArgs e) - { - if (String.IsNullOrEmpty(ReceiveConfigurationParameters[0]) == true) - { - //显示"未选择方案!" - TextBlockCurrentlySelectedPlanXray.Text = Application.Current.FindResource("TextBlockCurrentlySelectedPlanNo").ToString(); - - GridXrayCurrentlyPlan.Visibility = Visibility.Hidden; - - return; - } - else - { - GridXrayCurrentlyPlan.Visibility = Visibility.Visible; - } - TextBlockCurrentlySelectedPlanXray.Text = ReceiveConfigurationParameters[8]; //所选方案名称 - TextBlockCurrentlySelectedPlanPortXray.Text = ReceiveConfigurationParameters[1]; //服务器端口 - TextBlockCurrentlySelectedPlanUUIDXray.Text = ReceiveConfigurationParameters[2]; //UUID - TextBlockCurrentlySelectedPlanPathSeedKeyXray.Text = ReceiveConfigurationParameters[6]; //mKCP Seed\Quic Key\Path - //MessageBox.Show(ReceiveConfigurationParameters[7]); - TextBlockCurrentlySelectedPlanFakeWebsiteXray.Text = ReceiveConfigurationParameters[7]; //伪装网站 - - if (String.Equals(ReceiveConfigurationParameters[0], "TCP") == true - || String.Equals(ReceiveConfigurationParameters[0], "TCPhttp") == true - || String.Equals(ReceiveConfigurationParameters[0], "tcpTLSselfSigned") == true - || String.Equals(ReceiveConfigurationParameters[0], "webSocket") == true) - { - //隐藏Path/mKCP Seed/Quic Key - HideXayPathSeedKey(); - HideVlessVmessXtlsTcpWsXray(); - - //隐藏域名/Quic加密方式 - HideXrayDomainQuicEncrypt(); - - //隐藏伪装网站 - HideXrayMaskSites(); - - } - else if (String.Equals(ReceiveConfigurationParameters[0], "tcpTLS") == true) - { - //隐藏Path/mKCP Seed/Quic Key - HideXayPathSeedKey(); - HideVlessVmessXtlsTcpWsXray(); - - //显示域名 - ShowXrayDomainQuicEncrypt(); - - //隐藏伪装网站 - HideXrayMaskSites(); - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessVmessXtlsTcpWebSocketWeb") == true) - { - //显示复合方案路径 - ShowVlessVmessXtlsTcpWsXray(); - - //显示域名 - ShowXrayDomainQuicEncrypt(); - - //显示伪装网站 - ShowXayMaskSites(); - - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessTcpTlsWeb") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessXtlsTcp") == true) - { - //隐藏Path/mKCP Seed/Quic Key - HideXayPathSeedKey(); - HideVlessVmessXtlsTcpWsXray(); - - //显示域名 - ShowXrayDomainQuicEncrypt(); - - //显示伪装网站 - ShowXayMaskSites(); - } - else if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS") == true - || String.Equals(ReceiveConfigurationParameters[0], "Http2") == true) - { - //显示Path - ShowXayPathSeedKey(); - TextBlockXrayShowPathSeedKey.Text = "Path:"; - TextBlockCurrentlySelectedPlanPathSeedKeyXray.Text = ReceiveConfigurationParameters[6]; //mKCP Seed\Quic Key\Path - - - //显示域名 - ShowXrayDomainQuicEncrypt(); - - //显示伪装网站(暂时不显示) - HideXrayMaskSites(); - } - else if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "http2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessWebSocketTlsWeb") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessHttp2Web") == true) - { - //显示Path - ShowXayPathSeedKey(); - TextBlockXrayShowPathSeedKey.Text = "Path:"; - TextBlockCurrentlySelectedPlanPathSeedKeyXray.Text = ReceiveConfigurationParameters[6]; //mKCP Seed\Quic Key\Path - - //显示域名 - ShowXrayDomainQuicEncrypt(); - - //显示伪装网站 - ShowXayMaskSites(); - } - else if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLSselfSigned") == true - || String.Equals(ReceiveConfigurationParameters[0], "http2selfSigned") == true) - { - //显示Path - ShowXayPathSeedKey(); - TextBlockXrayShowPathSeedKey.Text = "Path:"; - TextBlockCurrentlySelectedPlanPathSeedKeyXray.Text = ReceiveConfigurationParameters[6]; //mKCP Seed\Quic Key\Path - - //隐藏域名/Quic加密方式 - HideXrayDomainQuicEncrypt(); - - //隐藏伪装网站 - HideXrayMaskSites(); - } - else if (ReceiveConfigurationParameters[0].Contains("mKCP") == true) - { - //显示mKCP Seed - ShowXayPathSeedKey(); - TextBlockXrayShowPathSeedKey.Text = "mKCP Seed:"; - TextBlockCurrentlySelectedPlanPathSeedKeyXray.Text = ReceiveConfigurationParameters[6]; //mKCP Seed\Quic Key\Path - - //隐藏域名/Quic加密方式 - HideXrayDomainQuicEncrypt(); - - //隐藏伪装网站 - HideXrayMaskSites(); - } - else if (ReceiveConfigurationParameters[0].Contains("Quic") == true) - { - //显示QUIC Key - ShowXayPathSeedKey(); - TextBlockXrayShowPathSeedKey.Text = "QUIC Key:"; - TextBlockCurrentlySelectedPlanPathSeedKeyXray.Text = ReceiveConfigurationParameters[6]; //mKCP Seed\Quic Key\Path - - //显示Quic加密方式 - ShowXrayDomainQuicEncrypt(); - TextBlockXrayShowCurrentlySelectedPlanDomain.Text = Application.Current.FindResource("TextBlockQuicEncryption").ToString(); - TextBlockCurrentlySelectedPlanDomainXray.Text = ReceiveConfigurationParameters[3]; //Quic加密方式 - if (String.Equals(TextBlockCurrentlySelectedPlanDomain.Text, "none") == true) - { - HideXayPathSeedKey(); - } - - - //隐藏伪装网站 - HideXrayMaskSites(); - } - } - - #region 当前方案界面控制 - //显示端口与UUID - private void ShowXrayCurrentPortUUID() - { - TextBlockXrayShowPort.Visibility = Visibility.Visible; - TextBlockCurrentlySelectedPlanPortXray.Visibility = Visibility.Visible; - - TextBlockXrayShowUUID.Visibility = Visibility.Visible; - TextBlockCurrentlySelectedPlanUUIDXray.Visibility = Visibility.Visible; - } - - //显示Path/mKCP Seed/Quic Key - private void ShowXayPathSeedKey() - { - HideVlessVmessXtlsTcpWsXray(); - TextBlockXrayShowPathSeedKey.Visibility = Visibility.Visible; - TextBlockCurrentlySelectedPlanPathSeedKeyXray.Visibility = Visibility.Visible; - } - - //隐藏Path/mKCP Seed/Quic Key - private void HideXayPathSeedKey() - { - TextBlockXrayShowPathSeedKey.Visibility = Visibility.Hidden; - TextBlockCurrentlySelectedPlanPathSeedKeyXray.Visibility = Visibility.Hidden; - } - - //显示VLESS VMESS XTLS TCP WS 复合方案 - private void ShowVlessVmessXtlsTcpWsXray() - { - HideXayPathSeedKey(); - GridVlessVmessXtlsTcpWsXray.Visibility = Visibility.Visible; - TextBlockBoxPathVlessWSXray.Text = ReceiveConfigurationParameters[3]; - TextBlockBoxPathVmessTcpXray.Text = ReceiveConfigurationParameters[9]; - TextBlockBoxPathVmessWSXray.Text = ReceiveConfigurationParameters[6]; - } - - //隐藏VLESS VMESS XTLS TCP WS 复合方案 - private void HideVlessVmessXtlsTcpWsXray() - { - GridVlessVmessXtlsTcpWsXray.Visibility = Visibility.Collapsed; - } - - //显示域名/Quic加密方式 - private void ShowXrayDomainQuicEncrypt() - { - TextBlockXrayShowCurrentlySelectedPlanDomain.Visibility = Visibility.Visible; - TextBlockCurrentlySelectedPlanDomainXray.Visibility = Visibility.Visible; - TextBlockXrayShowCurrentlySelectedPlanDomain.Text = Application.Current.FindResource("TextBlockV2RayDomain").ToString(); - TextBlockCurrentlySelectedPlanDomainXray.Text = ReceiveConfigurationParameters[4]; //域名 - - } - - //隐藏域名/Quic加密方式 - private void HideXrayDomainQuicEncrypt() - { - TextBlockXrayShowCurrentlySelectedPlanDomain.Visibility = Visibility.Hidden; - TextBlockCurrentlySelectedPlanDomainXray.Visibility = Visibility.Hidden; - } - //显示伪装网站 - private void ShowXayMaskSites() - { - TextBlockXrayShowCurrentlySelectedPlanFakeWebsite.Visibility = Visibility.Visible; - TextBlockCurrentlySelectedPlanFakeWebsiteXray.Visibility = Visibility.Visible; - } - - //隐藏伪装网站 - private void HideXrayMaskSites() - { - TextBlockXrayShowCurrentlySelectedPlanFakeWebsite.Visibility = Visibility.Hidden; - TextBlockCurrentlySelectedPlanFakeWebsiteXray.Visibility = Visibility.Hidden; - } - #endregion - - //传送Xray模板参数,启动Xray安装进程 - private void ButtonXraySetUP_Click(object sender, RoutedEventArgs e) - - { - ConnectionInfo connectionInfo = GenerateConnectionInfo(); - if (connectionInfo == null) - { - //****** "远程主机连接信息有误,请检查!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostConnection").ToString()); - return; - } - - - //生成客户端配置时,连接的服务主机的IP或者域名 - if (String.IsNullOrEmpty(ReceiveConfigurationParameters[4]) == true) - { - ReceiveConfigurationParameters[4] = PreTrim(TextBoxHost.Text); - testDomain = false; - } - //选择模板 - if (String.IsNullOrEmpty(ReceiveConfigurationParameters[0]) == true) - { - //******"请先选择配置模板!"****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ChooseTemplate").ToString()); - return; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "TCP") == true - || String.Equals(ReceiveConfigurationParameters[0], "TCPhttp") == true - || String.Equals(ReceiveConfigurationParameters[0], "tcpTLSselfSigned") == true - || String.Equals(ReceiveConfigurationParameters[0], "webSocket") == true - || String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLSselfSigned") == true - || String.Equals(ReceiveConfigurationParameters[0], "http2selfSigned") == true - || ReceiveConfigurationParameters[0].Contains("mKCP") == true - || ReceiveConfigurationParameters[0].Contains("Quic") == true) - { - testDomain = false; - - } - else if (String.Equals(ReceiveConfigurationParameters[0], "tcpTLS") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessXtlsTcp") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessTcpTlsWeb") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessWebSocketTlsWeb") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessHttp2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessVmessXtlsTcpWebSocketWeb") == true - || String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "Http2") == true - || String.Equals(ReceiveConfigurationParameters[0], "http2Web") == true) - { - testDomain = true; - - } - - - //Thread thread - //SetUpProgressBarProcessing(0); //重置安装进度 - installationDegree = 0; - TextBoxMonitorCommandResults.Text = ""; - //Thread thread = new Thread(() => StartSetUpXray(connectionInfo, TextBlockSetUpProcessing, ProgressBarSetUpProcessing)); - Thread thread = new Thread(() => StartSetUpXray(connectionInfo)); - - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - - - } - - //登录远程主机布署Xray程序 - private void StartSetUpXray(ConnectionInfo connectionInfo) - { - functionResult = true; - onlyIpv6 = false; - getApt = false; - getDnf = false; - getYum = false; - - //******"正在登录远程主机......"****** - SetUpProgressBarProcessing(1); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_Login").ToString(); - MainWindowsShowInfo(currentStatus); - - try - { - #region 主机指纹,暂未启用 - //byte[] expectedFingerPrint = new byte[] { - // 0x66, 0x31, 0xaf, 0x00, 0x54, 0xb9, 0x87, 0x31, - // 0xff, 0x58, 0x1c, 0x31, 0xb1, 0xa2, 0x4c, 0x6b - // }; - #endregion - using (var client = new SshClient(connectionInfo)) - { - #region ssh登录验证主机指纹代码块,暂未启用 - // client.HostKeyReceived += (sender, e) => - // { - // if (expectedFingerPrint.Length == e.FingerPrint.Length) - // { - // for (var i = 0; i < expectedFingerPrint.Length; i++) - // { - // if (expectedFingerPrint[i] != e.FingerPrint[i]) - // { - // e.CanTrust = false; - // break; - // } - // } - // } - // else - // { - // e.CanTrust = false; - // } - // }; - #endregion - - client.Connect(); - if (client.IsConnected == true) - { - //******"主机登录成功"****** - SetUpProgressBarProcessing(3); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginSuccessful").ToString(); - MainWindowsShowInfo(currentStatus); - //Thread.Sleep(3000); - } - - //检测root权限 5--7 - functionResult = RootAuthorityDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测是否已安装代理 8--10 - functionResult = SoftInstalledIsNoYes(client, "xray", @"/usr/local/bin/xray"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测系统是否符合安装要求 11--30 - //检测关闭Selinux及系统组件是否齐全(apt-get/yum/dnf/systemctl) - //安装依赖软件,检测端口,防火墙开启端口 - functionResult = ShutDownSelinuxAndSysComponentsDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测校对时间 31--33 - functionResult = CheckProofreadingTime(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测域名解析是否正确 34---36 - if (testDomain == true) - { - functionResult = DomainResolutionCurrentIPDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - } - - //下载安装脚本安装 37--40 - //functionResult = ProxySoftInstall(client, @"Xray", @"https://raw.githubusercontent.com/v2fly/fhs-install-Xray/master/install-release.sh"); - functionResult = ProxySoftInstall(client, @"Xray", @"https://raw.githubusercontent.com/XTLS/Xray-install/main/install-release.sh"); - - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - //functionResult = XrayInstallScript(client); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //程序是否安装成功检测 41--43 - functionResult = SoftInstalledSuccessOrFail(client, "xray", @"/usr/local/bin/xray"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //生成服务端配置 44--46 - functionResult = GenerateServerConfigurationXray(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //****** "上传配置文件......" ****** 47--50 - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadSoftConfig").ToString(); - MainWindowsShowInfo(currentStatus); - string serverRemoteConfig = @"/usr/local/etc/xray/config.json"; - UploadConfig(connectionInfo, @"config.json", serverRemoteConfig); - File.Delete(@"config.json"); - SetUpProgressBarProcessing(50); - - //如果使用http2/WebSocketTLS/tcpTLS/VlessTcpTlsWeb/VLESS+TCP+XTLS+Web模式,先要安装acme.sh,申请证书 - if (String.Equals(ReceiveConfigurationParameters[0], "Http2") == true - || String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS") == true - || String.Equals(ReceiveConfigurationParameters[0], "tcpTLS") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessXtlsTcp") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessTcpTlsWeb") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessVmessXtlsTcpWebSocketWeb") == true) - { - //安装acme.sh与申请证书 51--57 - functionResult = AcmeShInstall(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //安装证书到Xray 58--60 - functionResult = CertInstallToXray(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - } - - - #region Caddy安装 61--70 - - //如果是VLESS+TCP+XTLS+Web/VLESS+TCP+TLS+Web/VLESS+WebSocket+TLS+Web/VLESS+http2+TLS+Web/WebSocket+TLS+Web/http2Web模式,需要安装Caddy - if (String.Equals(ReceiveConfigurationParameters[0], "VlessXtlsTcp") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessTcpTlsWeb") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessWebSocketTlsWeb") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessHttp2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "http2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessVmessXtlsTcpWebSocketWeb") == true) - { - //安装Caddy 61--66 - functionResult = CaddyInstall(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - - #region 上传Caddy配置文件 67--70 - - //******"上传Caddy配置文件"****** - SetUpProgressBarProcessing(67); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadCaddyConfig").ToString(); - MainWindowsShowInfo(currentStatus); - - string serverConfig = ""; - sshShellCommand = @"mv /etc/caddy/Caddyfile /etc/caddy/Caddyfile.bak"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - if (String.Equals(ReceiveConfigurationParameters[0], "VlessXtlsTcp") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessTcpTlsWeb") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessVmessXtlsTcpWebSocketWeb") == true) - { - serverConfig = $"{pwdir}" + @"TemplateConfg\xray\caddy\vlessTcpTlsWeb.caddyfile"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessWebSocketTlsWeb") == true - || String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS2Web") == true) - { - serverConfig = $"{pwdir}" + @"TemplateConfg\xray\caddy\WebSocketTLSWeb.caddyfile"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessHttp2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "http2Web") == true) - { - serverConfig = $"{pwdir}" + @"TemplateConfg\xray\caddy\Http2Web.caddyfile"; - } - - string upLoadPath = "/etc/caddy/Caddyfile"; - client.RunCommand("mv /etc/caddy/Caddyfile /etc/caddy/Caddyfile.bak"); - UploadConfig(connectionInfo, serverConfig, upLoadPath); - - functionResult = FileCheckExists(client, @"/etc/caddy/Caddyfile"); - if (functionResult == false) - { - //****** "Caddy配置文件上传失败!" ******32 - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadCaddyConfigFailed").ToString(); - MainWindowsShowInfo(currentStatus); - FunctionResultErr(); - client.Disconnect(); - return; - } - - //****** "Caddy配置文件上传成功,OK!" ******32 - SetUpProgressBarProcessing(70); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadCaddyConfigOK").ToString(); - MainWindowsShowInfo(currentStatus); - - //设置Caddy配置文件 - functionResult = SetCaddyfile(client, upLoadPath); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - - #endregion - - //启动Caddy服务 - functionResult = SoftStartDetect(client, "caddy", @"/usr/bin/caddy"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - } - #endregion - - //****** "正在启动Xray......" ******35 - functionResult = SoftStartDetect(client, "xray", @"/usr/local/bin/xray"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //测试BBR条件,若满足提示是否启用 - functionResult = DetectBBRandEnable(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - client.Disconnect();//断开服务器ssh连接 - - //生成客户端配置 96--98 - functionResult = GenerateClientConfigurationXray(); - - //****** "Xray安装成功,祝你玩的愉快!!" ******40 - SetUpProgressBarProcessing(100); - currentStatus = "Xray" + Application.Current.FindResource("DisplayInstallInfo_ProxyInstalledOK").ToString(); - MainWindowsShowInfo(currentStatus); - - Thread.Sleep(1000); - - //显示服务端连接参数 - proxyType = "Xray"; - ResultClientInformation resultClientInformation = new ResultClientInformation(); - resultClientInformation.ShowDialog(); - - return; - - } - } - catch (Exception ex1)//例外处理 - { - ProcessException(ex1.Message); - - //****** "安装失败!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - } - - #region Xray专用调用函数 - //安装代理程序 37--40 - //functionResult = ProxySoftInstall(client,@"",@""); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - /* private bool ProxySoftInstallV2ray(SshClient client, string proxyName, string downloadUrl) - { - //****** "系统环境检测完毕,符合安装要求,开始布署......" ****** - SetUpProgressBarProcessing(37); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstalling").ToString(); - MainWindowsShowInfo(currentStatus); - - //****** "正在安装{proxyName}......" ****** - SetUpProgressBarProcessing(38); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstallSoft").ToString() + $"{proxyName}......"; - MainWindowsShowInfo(currentStatus); - - saveShellScriptFileName = GenerateRandomScriptFileName(GenerateRandomStr(10)); - - sshShellCommand = $"curl -o {saveShellScriptFileName} {downloadUrl}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - functionResult = FileCheckExists(client, $"{saveShellScriptFileName}"); - if (functionResult == false) - { - //***文件下载失败!*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DownloadScriptFailed").ToString(); - MainWindowsShowInfo(currentStatus); - return false; - - } - sshShellCommand = $"yes | bash {saveShellScriptFileName} --version v4.32.1"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"rm -f {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - SetUpProgressBarProcessing(40); - return true; - } */ - - - //生成Xray服务端配置 44--46 - //functionResult = GenerateServerConfiguration(client); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - private bool GenerateServerConfigurationXray(SshClient client) - { - SetUpProgressBarProcessing(44); - //修改xray.service - - sshShellCommand = $"sed -i 's/User=nobody/User=root/g' /etc/systemd/system/xray.service"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"sed -i 's/CapabilityBoundingSet=/#CapabilityBoundingSet=/g' /etc/systemd/system/xray.service"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"sed -i 's/AmbientCapabilities=/#AmbientCapabilities=/g' /etc/systemd/system/xray.service"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"systemctl daemon-reload"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //备用下载地址:https://raw.githubusercontent.com/proxysu/Resources/master/xray/xray.service - - //sshShellCommand = $"yes | curl -o /etc/systemd/system/xray.service https://raw.githubusercontent.com/proxysu/Resources/master/xray/xray.service"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //备份原来的文件 - functionResult = FileCheckExists(client, @"/usr/local/etc/xray/config.json"); - if (functionResult == true) - { - - sshShellCommand = @"mv /usr/local/etc/xray/config.json /usr/local/etc/xray/config.json.1"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - } - //读取配置文件各个模块 - string logConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\00_log\00_log.json"; - string apiConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\01_api\01_api.json"; - string dnsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\02_dns\02_dns.json"; - string routingConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\03_routing\03_routing.json"; - string policyConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\04_policy\04_policy.json"; - string inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\05_inbounds\05_inbounds.json"; - string outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\06_outbounds\06_outbounds.json"; - string transportConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\07_transport\07_transport.json"; - string statsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\08_stats\08_stats.json"; - string reverseConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\09_reverse\09_reverse.json"; - string baseConfigJson = $"{pwdir}" + @"TemplateConfg\xray\base.json"; - - //配置文件模块合成 - using (StreamReader reader = File.OpenText(baseConfigJson)) - { - JObject serverJson = (JObject)JToken.ReadFrom(new JsonTextReader(reader)); - //读取"log" - using (StreamReader readerJson = File.OpenText(logConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - serverJson["log"] = jObjectJson["log"]; - } - //读取"api" - using (StreamReader readerJson = File.OpenText(apiConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - serverJson["api"] = jObjectJson["api"]; - } - //读取"dns" - using (StreamReader readerJson = File.OpenText(dnsConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - serverJson["dns"] = jObjectJson["dns"]; - } - //读取"routing" - using (StreamReader readerJson = File.OpenText(routingConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - serverJson["routing"] = jObjectJson["routing"]; - } - //读取"policy" - using (StreamReader readerJson = File.OpenText(policyConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - serverJson["policy"] = jObjectJson["policy"]; - } - //读取"inbounds" - using (StreamReader readerJson = File.OpenText(inboundsConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - serverJson["inbounds"] = jObjectJson["inbounds"]; - } - //读取"outbounds" - using (StreamReader readerJson = File.OpenText(outboundsConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - serverJson["outbounds"] = jObjectJson["outbounds"]; - } - //读取"transport" - using (StreamReader readerJson = File.OpenText(transportConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - serverJson["transport"] = jObjectJson["transport"]; - } - //读取"stats" - using (StreamReader readerJson = File.OpenText(statsConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - serverJson["stats"] = jObjectJson["stats"]; - } - //读取"reverse" - using (StreamReader readerJson = File.OpenText(reverseConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - serverJson["reverse"] = jObjectJson["reverse"]; - } - - //依据安装模式读取相应模板 - if (String.Equals(ReceiveConfigurationParameters[0], "TCP") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\05_inbounds\tcp_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "TCPhttp") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\05_inbounds\tcp_http_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "tcpTLS") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\05_inbounds\tcp_TLS_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "tcpTLSselfSigned") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\05_inbounds\tcpTLSselfSigned_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessXtlsTcp") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\05_inbounds\vless_tcp_xtls_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessTcpTlsWeb") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\05_inbounds\vless_tcp_tls_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessWebSocketTlsWeb") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\05_inbounds\vless_ws_tls_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessHttp2Web") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\05_inbounds\vless_http2_tls_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessVmessXtlsTcpWebSocketWeb") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\05_inbounds\vless_vmess_xtls_tcp_websocket_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "webSocket") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\05_inbounds\webSocket_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\05_inbounds\WebSocket_TLS_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLSselfSigned") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\05_inbounds\WebSocketTLS_selfSigned_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS2Web") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\05_inbounds\WebSocketTLSWeb_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "Http2") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\05_inbounds\http2_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "http2Web") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\05_inbounds\Http2Web_server_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "http2selfSigned") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\Http2selfSigned_server_config.json"; - } - //else if (String.Equals(ReceiveConfigurationParameters[0], "MkcpNone")|| String.Equals(ReceiveConfigurationParameters[0], "mKCP2SRTP")||String.Equals(ReceiveConfigurationParameters[0], "mKCPuTP")|| String.Equals(ReceiveConfigurationParameters[0], "mKCP2WechatVideo")|| String.Equals(ReceiveConfigurationParameters[0], "mKCP2DTLS")|| String.Equals(ReceiveConfigurationParameters[0], "mKCP2WireGuard")) - else if (ReceiveConfigurationParameters[0].Contains("mKCP") == true) - { - if (mKCPvlessIsSet == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\05_inbounds\vless_mkcp_server_config.json"; - } - else - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\05_inbounds\mkcp_server_config.json"; - } - - } - - // else if (String.Equals(ReceiveConfigurationParameters[0], "QuicNone") || String.Equals(ReceiveConfigurationParameters[0], "QuicSRTP") || String.Equals(ReceiveConfigurationParameters[0], "Quic2uTP") || String.Equals(ReceiveConfigurationParameters[0], "QuicWechatVideo") || String.Equals(ReceiveConfigurationParameters[0], "QuicDTLS") || String.Equals(ReceiveConfigurationParameters[0], "QuicWireGuard")) - else if (ReceiveConfigurationParameters[0].Contains("Quic") == true) - { - inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\server\05_inbounds\quic_server_config.json"; - } - - //读取"inbounds" - using (StreamReader readerJson = File.OpenText(inboundsConfigJson)) - { - JObject jObjectJsonTmp = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - var jObjectJson = (dynamic)jObjectJsonTmp; - - //Padavan路由固件服务端设置(因为客户端分流有问题所以在服务端弥补)加上后会影响一定的速度 - - //string sniffingAddServer = $"{pwdir}" + @"TemplateConfg\xray\server\05_inbounds\00_padavan_router.json"; - //using (StreamReader readerSniffingJson = File.OpenText(sniffingAddServer)) - //{ - // JObject jObjectSniffingJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerSniffingJson)); - // jObjectJson["inbounds"][0]["sniffing"] = jObjectSniffingJson["sniffing"]; - //} - - //设置uuid - jObjectJson["inbounds"][0]["settings"]["clients"][0]["id"] = ReceiveConfigurationParameters[2]; - - //除WebSocketTLSWeb/http2Web/VLESS+WebSocket+TLS+Web/VLESS+http2+TLS+Web模式外设置监听端口 - if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS2Web") == false - && String.Equals(ReceiveConfigurationParameters[0], "http2Web") == false - && String.Equals(ReceiveConfigurationParameters[0], "VlessWebSocketTlsWeb") == false - && String.Equals(ReceiveConfigurationParameters[0], "VlessHttp2Web") == false) - { - jObjectJson["inbounds"][0]["port"] = int.Parse(ReceiveConfigurationParameters[1]); - } - - //设置VLESS协议的回落端口,指向Caddy - if (String.Equals(ReceiveConfigurationParameters[0], "VlessTcpTlsWeb") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessXtlsTcp") == true) - { - //设置Caddy随机监听的端口 - randomCaddyListenPort = GetRandomPort(); - - //指向Caddy监听的随机端口 - jObjectJson["inbounds"][0]["settings"]["fallbacks"][0]["dest"] = randomCaddyListenPort; - } - //设置VLESS+VMESS+Trojan+XTLS+TCP+WebSocket+Web协议 - if (String.Equals(ReceiveConfigurationParameters[0], "VlessVmessXtlsTcpWebSocketWeb") == true) - { - //设置Caddy随机监听的端口 - randomCaddyListenPort = GetRandomPort(); - - //指向Caddy监听的随机端口 - jObjectJson["inbounds"][1]["settings"]["fallbacks"][0]["dest"] = randomCaddyListenPort; - //设置其他模式的UUID - jObjectJson["inbounds"][1]["settings"]["clients"][0]["password"] = ReceiveConfigurationParameters[2]; - jObjectJson["inbounds"][2]["settings"]["clients"][0]["id"] = ReceiveConfigurationParameters[2]; - jObjectJson["inbounds"][3]["settings"]["clients"][0]["id"] = ReceiveConfigurationParameters[2]; - jObjectJson["inbounds"][4]["settings"]["clients"][0]["id"] = ReceiveConfigurationParameters[2]; - - //设置Vless回落与分流的Path - jObjectJson["inbounds"][0]["settings"]["fallbacks"][1]["path"] = ReceiveConfigurationParameters[3]; - jObjectJson["inbounds"][0]["settings"]["fallbacks"][2]["path"] = ReceiveConfigurationParameters[9]; - jObjectJson["inbounds"][0]["settings"]["fallbacks"][3]["path"] = ReceiveConfigurationParameters[6]; - - //设置Vless ws Path - jObjectJson["inbounds"][2]["streamSettings"]["wsSettings"]["path"] = ReceiveConfigurationParameters[3]; - //设置Vmess tcp Path - jObjectJson["inbounds"][3]["streamSettings"]["tcpSettings"]["header"]["request"]["path"][0] = ReceiveConfigurationParameters[9]; - //设置Vmess ws Path - jObjectJson["inbounds"][4]["streamSettings"]["wsSettings"]["path"] = ReceiveConfigurationParameters[6]; - - } - - //TLS自签证书/WebSocketTLS(自签证书)/http2自签证书模式下,使用v2ctl 生成自签证书 - if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLSselfSigned") == true - || String.Equals(ReceiveConfigurationParameters[0], "tcpTLSselfSigned") == true - || String.Equals(ReceiveConfigurationParameters[0], "http2selfSigned") == true) - { - string selfSignedCa = client.RunCommand("/usr/local/bin/xray tls cert --ca").Result; - JObject selfSignedCaJObject = JObject.Parse(selfSignedCa); - jObjectJson["inbounds"][0]["streamSettings"]["tlsSettings"]["certificates"][0] = selfSignedCaJObject; - } - - //如果是WebSocketTLSWeb/WebSocketTLS/WebSocketTLS(自签证书)/VLESS+WebSocket+TLS+Web模式,则设置路径 - if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS") == true - || String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLSselfSigned") == true - || String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessWebSocketTlsWeb") == true) - { - jObjectJson["inbounds"][0]["streamSettings"]["wsSettings"]["path"] = ReceiveConfigurationParameters[6]; - } - - //如果是Http2/http2Web/http2自签/VLESS+http2+TLS+Web模式下,设置路径 - if (String.Equals(ReceiveConfigurationParameters[0], "Http2") == true - || String.Equals(ReceiveConfigurationParameters[0], "http2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "http2selfSigned") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessHttp2Web") == true) - { - jObjectJson["inbounds"][0]["streamSettings"]["httpSettings"]["path"] = ReceiveConfigurationParameters[6]; - } - - //如果是Http2+Web/VLESS+http2+TLS+Web模式下,设置host - if (String.Equals(ReceiveConfigurationParameters[0], "http2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessHttp2Web") == true) - { - jObjectJson["inbounds"][0]["streamSettings"]["httpSettings"]["host"][0] = ReceiveConfigurationParameters[4]; - } - - //mkcp模式下,设置伪装类型 - if (ReceiveConfigurationParameters[0].Contains("mKCP") == true) - { - jObjectJson["inbounds"][0]["streamSettings"]["kcpSettings"]["header"]["type"] = ReceiveConfigurationParameters[5]; - if (String.IsNullOrEmpty(ReceiveConfigurationParameters[6]) == false) - { - jObjectJson["inbounds"][0]["streamSettings"]["kcpSettings"]["seed"] = ReceiveConfigurationParameters[6]; - } - } - - //quic模式下设置伪装类型及密钥 - if (ReceiveConfigurationParameters[0].Contains("Quic") == true) - { - jObjectJson["inbounds"][0]["streamSettings"]["quicSettings"]["header"]["type"] = ReceiveConfigurationParameters[5]; - jObjectJson["inbounds"][0]["streamSettings"]["quicSettings"]["security"] = ReceiveConfigurationParameters[3]; - - if (String.Equals(ReceiveConfigurationParameters[3], "none") == true) - { - ReceiveConfigurationParameters[6] = ""; - } - jObjectJson["inbounds"][0]["streamSettings"]["quicSettings"]["key"] = ReceiveConfigurationParameters[6]; - } - - serverJson["inbounds"] = jObjectJson["inbounds"]; - } - - using (StreamWriter sw = new StreamWriter(@"config.json")) - { - sw.Write(serverJson.ToString()); - } - } - SetUpProgressBarProcessing(46); - return true; - } - - //安装证书到Xray 58--60 - //functionResult = CertInstallToXray(client); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - private bool CertInstallToXray(SshClient client) - { - //****** "安装证书到Xray......" ******26 - SetUpProgressBarProcessing(58); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_IntallCertToSoft").ToString() + "Xray......"; - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"mkdir -p /usr/local/etc/xray/ssl"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"/root/.acme.sh/acme.sh --installcert -d {ReceiveConfigurationParameters[4]} --certpath /usr/local/etc/xray/ssl/xray_ssl.crt --keypath /usr/local/etc/xray/ssl/xray_ssl.key --capath /usr/local/etc/xray/ssl/xray_ssl.crt --reloadcmd \"systemctl restart xray\""; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"if [ ! -f ""/usr/local/etc/xray/ssl/xray_ssl.key"" ]; then echo ""0""; else echo ""1""; fi | head -n 1"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - if (currentShellCommandResult.Contains("1") == true) - { - //****** "证书成功安装到Xray!" ******27 - SetUpProgressBarProcessing(60); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_IntallCertToSoftOK").ToString() + "Xray!"; - MainWindowsShowInfo(currentStatus); - } - else - { - //****** "证书安装到Xray失败,原因未知,可以向开发者提问!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_IntallCertToSoftFail").ToString() + - "Xray" + - Application.Current.FindResource("DisplayInstallInfo_InstallCertFailAsk").ToString(); - MainWindowsShowInfo(currentStatus); - return false; - } - - //设置私钥权限 - sshShellCommand = @"chmod 644 /usr/local/etc/xray/ssl/xray_ssl.key"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - return true; - } - - //生成Xray客户端配置 96--98 - //functionResult = GenerateClientConfiguration(); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - private bool GenerateClientConfigurationXray() - { - //****** "生成客户端配置......" ******39 - SetUpProgressBarProcessing(96); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_GenerateClientConfig").ToString(); - MainWindowsShowInfo(currentStatus); - - string logConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\00_log\00_log.json"; - string apiConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\01_api\01_api.json"; - string dnsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\02_dns\02_dns.json"; - string routingConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\03_routing\03_routing.json"; - string policyConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\04_policy\04_policy.json"; - string inboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\05_inbounds\05_inbounds.json"; - string outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\06_outbounds\06_outbounds.json"; - string transportConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\07_transport\07_transport.json"; - string statsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\08_stats\08_stats.json"; - string reverseConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\09_reverse\09_reverse.json"; - string baseConfigJson = $"{pwdir}" + @"TemplateConfg\xray\base.json"; - //Thread.Sleep(1000); - if (!Directory.Exists("xray_config"))//如果不存在就创建file文件夹      - { - Directory.CreateDirectory("xray_config");//创建该文件夹   - } - - using (StreamReader reader = File.OpenText(baseConfigJson)) - { - JObject clientJson = (JObject)JToken.ReadFrom(new JsonTextReader(reader)); - //读取"log" - using (StreamReader readerJson = File.OpenText(logConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - clientJson["log"] = jObjectJson["log"]; - } - //读取"api" - using (StreamReader readerJson = File.OpenText(apiConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - clientJson["api"] = jObjectJson["api"]; - } - //读取"dns" - using (StreamReader readerJson = File.OpenText(dnsConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - clientJson["dns"] = jObjectJson["dns"]; - } - //读取"routing" - using (StreamReader readerJson = File.OpenText(routingConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - clientJson["routing"] = jObjectJson["routing"]; - } - //读取"policy" - using (StreamReader readerJson = File.OpenText(policyConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - clientJson["policy"] = jObjectJson["policy"]; - } - //读取"inbounds" - using (StreamReader readerJson = File.OpenText(inboundsConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - clientJson["inbounds"] = jObjectJson["inbounds"]; - } - //读取"outbounds" - using (StreamReader readerJson = File.OpenText(outboundsConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - clientJson["outbounds"] = jObjectJson["outbounds"]; - } - //读取"transport" - using (StreamReader readerJson = File.OpenText(transportConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - clientJson["transport"] = jObjectJson["transport"]; - } - //读取"stats" - using (StreamReader readerJson = File.OpenText(statsConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - clientJson["stats"] = jObjectJson["stats"]; - } - //读取"reverse" - using (StreamReader readerJson = File.OpenText(reverseConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - clientJson["reverse"] = jObjectJson["reverse"]; - } - - //根据不同的安装方案,选择相应的客户端模板 - if (String.Equals(ReceiveConfigurationParameters[0], "VlessVmessXtlsTcpWebSocketWeb") == false) - { - #region 单模式方案 - //根据选择的不同模式,选择相应的配置文件 - if (String.Equals(ReceiveConfigurationParameters[0], "TCP") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\06_outbounds\tcp_client_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "TCPhttp") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\06_outbounds\tcp_http_client_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "tcpTLS") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\06_outbounds\tcp_TLS_client_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "tcpTLSselfSigned") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\06_outbounds\tcpTLSselfSigned_client_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessXtlsTcp") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\06_outbounds\vless_tcp_xtls_client_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessTcpTlsWeb") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\06_outbounds\vless_tcp_tls_caddy_cilent_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessWebSocketTlsWeb") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\06_outbounds\vless_ws_tls_client_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "VlessHttp2Web") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\06_outbounds\vless_http2_tls_server_config.json"; - } - - else if (String.Equals(ReceiveConfigurationParameters[0], "webSocket") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\06_outbounds\webSocket_client_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\06_outbounds\WebSocket_TLS_client_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLSselfSigned") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\06_outbounds\WebSocketTLS_selfSigned_client_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS2Web") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\06_outbounds\WebSocketTLSWeb_client_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "Http2") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\06_outbounds\http2_client_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "http2Web") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\06_outbounds\Http2Web_client_config.json"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "http2selfSigned") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\06_outbounds\Http2selfSigned_client_config.json"; - } - //else if (String.Equals(ReceiveConfigurationParameters[0], "MkcpNone")|| String.Equals(ReceiveConfigurationParameters[0], "mKCP2SRTP")||String.Equals(ReceiveConfigurationParameters[0], "mKCPuTP")|| String.Equals(ReceiveConfigurationParameters[0], "mKCP2WechatVideo")|| String.Equals(ReceiveConfigurationParameters[0], "mKCP2DTLS")|| String.Equals(ReceiveConfigurationParameters[0], "mKCP2WireGuard")) - else if (ReceiveConfigurationParameters[0].Contains("mKCP") == true) - { - if (mKCPvlessIsSet == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\06_outbounds\vless_mkcp_client_config.json"; - } - else - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\06_outbounds\mkcp_client_config.json"; - } - - } - // else if (String.Equals(ReceiveConfigurationParameters[0], "QuicNone") || String.Equals(ReceiveConfigurationParameters[0], "QuicSRTP") || String.Equals(ReceiveConfigurationParameters[0], "Quic2uTP") || String.Equals(ReceiveConfigurationParameters[0], "QuicWechatVideo") || String.Equals(ReceiveConfigurationParameters[0], "QuicDTLS") || String.Equals(ReceiveConfigurationParameters[0], "QuicWireGuard")) - else if (ReceiveConfigurationParameters[0].Contains("Quic") == true) - { - outboundsConfigJson = $"{pwdir}" + @"TemplateConfg\xray\client\06_outbounds\quic_client_config.json"; - } - - - //读取"相应模板的outbounds" - using (StreamReader readerJson = File.OpenText(outboundsConfigJson)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - - //设置客户端的地址/端口/id - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["address"] = ReceiveConfigurationParameters[4]; - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["port"] = int.Parse(ReceiveConfigurationParameters[1]); - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["users"][0]["id"] = ReceiveConfigurationParameters[2]; - - - //设置WebSocket模式下的path - if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS") == true - || String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLSselfSigned") == true - || String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLS2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessWebSocketTlsWeb") == true) - { - jObjectJson["outbounds"][0]["streamSettings"]["wsSettings"]["path"] = ReceiveConfigurationParameters[6]; - } - - //设置http2模式下的path - if (String.Equals(ReceiveConfigurationParameters[0], "Http2") == true - || String.Equals(ReceiveConfigurationParameters[0], "http2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "http2selfSigned") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessHttp2Web") == true) - { - jObjectJson["outbounds"][0]["streamSettings"]["httpSettings"]["path"] = ReceiveConfigurationParameters[6]; - } - - //设置http2+TLS+Web/VLESS+http2+TLS+Web模式下的host - if (String.Equals(ReceiveConfigurationParameters[0], "http2Web") == true - || String.Equals(ReceiveConfigurationParameters[0], "VlessHttp2Web") == true) - { - jObjectJson["outbounds"][0]["streamSettings"]["httpSettings"]["host"][0] = ReceiveConfigurationParameters[4]; - } - - //设置VLESS+TCP+XTLS+Web模式下的serverName - //if (String.Equals(ReceiveConfigurationParameters[0], "VlessXtlsTcp") == true) - //{ - // jObjectJson["outbounds"][0]["streamSettings"]["xtlsSettings"]["serverName"] = ReceiveConfigurationParameters[4]; - //} - - //设置mkcp - if (ReceiveConfigurationParameters[0].Contains("mKCP") == true) - { - jObjectJson["outbounds"][0]["streamSettings"]["kcpSettings"]["header"]["type"] = ReceiveConfigurationParameters[5]; - if (String.IsNullOrEmpty(ReceiveConfigurationParameters[6]) == false) - { - jObjectJson["outbounds"][0]["streamSettings"]["kcpSettings"]["seed"] = ReceiveConfigurationParameters[6]; - } - } - - //设置QUIC - if (ReceiveConfigurationParameters[0].Contains("Quic") == true) - { - jObjectJson["outbounds"][0]["streamSettings"]["quicSettings"]["header"]["type"] = ReceiveConfigurationParameters[5]; - jObjectJson["outbounds"][0]["streamSettings"]["quicSettings"]["security"] = ReceiveConfigurationParameters[3]; - if (String.Equals(ReceiveConfigurationParameters[3], "none") == true) - { - ReceiveConfigurationParameters[6] = ""; - } - jObjectJson["outbounds"][0]["streamSettings"]["quicSettings"]["key"] = ReceiveConfigurationParameters[6]; - } - - clientJson["outbounds"] = jObjectJson["outbounds"]; - - } - - using (StreamWriter sw = new StreamWriter(@"xray_config\config.json")) - { - sw.Write(clientJson.ToString()); - } - - #endregion - - } - else - { - //复合方案所需要的配置文件 - //VLESS over TCP with XTLS模式 - string outboundsConfigJsons = $"{pwdir}" + @"TemplateConfg\xray\client\06_outbounds\vless_tcp_xtls_client_config.json"; - using (StreamReader readerJson = File.OpenText(outboundsConfigJsons)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - - //设置客户端的地址/端口/id - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["address"] = ReceiveConfigurationParameters[4]; - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["port"] = int.Parse(ReceiveConfigurationParameters[1]); - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["users"][0]["id"] = ReceiveConfigurationParameters[2]; - - clientJson["outbounds"] = jObjectJson["outbounds"]; - if (!Directory.Exists(@"xray_config\vless_tcp_xtls_client_config"))//如果不存在就创建file文件夹      - { - Directory.CreateDirectory(@"xray_config\vless_tcp_xtls_client_config");//创建该文件夹   - } - using (StreamWriter sw = new StreamWriter(@"xray_config\vless_tcp_xtls_client_config\config.json")) - { - sw.Write(clientJson.ToString()); - } - } - - //VLESS over TCP with TLS模式 - outboundsConfigJsons = $"{pwdir}" + @"TemplateConfg\xray\client\06_outbounds\vless_tcp_tls_caddy_cilent_config.json"; - using (StreamReader readerJson = File.OpenText(outboundsConfigJsons)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - - //设置客户端的地址/端口/id - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["address"] = ReceiveConfigurationParameters[4]; - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["port"] = int.Parse(ReceiveConfigurationParameters[1]); - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["users"][0]["id"] = ReceiveConfigurationParameters[2]; - - clientJson["outbounds"] = jObjectJson["outbounds"]; - if (!Directory.Exists(@"xray_config\vless_tcp_tls_client_config"))//如果不存在就创建file文件夹      - { - Directory.CreateDirectory(@"xray_config\vless_tcp_tls_client_config");//创建该文件夹   - } - using (StreamWriter sw = new StreamWriter(@"xray_config\vless_tcp_tls_client_config\config.json")) - { - sw.Write(clientJson.ToString()); - } - } - - //VLESS over WS with TLS 模式 - outboundsConfigJsons = $"{pwdir}" + @"TemplateConfg\xray\client\06_outbounds\vless_ws_tls_client_config.json"; - using (StreamReader readerJson = File.OpenText(outboundsConfigJsons)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - - //设置客户端的地址/端口/id - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["address"] = ReceiveConfigurationParameters[4]; - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["port"] = int.Parse(ReceiveConfigurationParameters[1]); - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["users"][0]["id"] = ReceiveConfigurationParameters[2]; - jObjectJson["outbounds"][0]["streamSettings"]["wsSettings"]["path"] = ReceiveConfigurationParameters[3]; - - clientJson["outbounds"] = jObjectJson["outbounds"]; - if (!Directory.Exists(@"xray_config\vless_ws_tls_client_config"))//如果不存在就创建file文件夹      - { - Directory.CreateDirectory(@"xray_config\vless_ws_tls_client_config");//创建该文件夹   - } - using (StreamWriter sw = new StreamWriter(@"xray_config\vless_ws_tls_client_config\config.json")) - { - sw.Write(clientJson.ToString()); - } - } - - //VMess over TCP with TLS模式 - outboundsConfigJsons = $"{pwdir}" + @"TemplateConfg\xray\client\06_outbounds\vmess_tcp_tls_client_config.json"; - using (StreamReader readerJson = File.OpenText(outboundsConfigJsons)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - - //设置客户端的地址/端口/id - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["address"] = ReceiveConfigurationParameters[4]; - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["port"] = int.Parse(ReceiveConfigurationParameters[1]); - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["users"][0]["id"] = ReceiveConfigurationParameters[2]; - jObjectJson["outbounds"][0]["streamSettings"]["tcpSettings"]["header"]["request"]["path"][0] = ReceiveConfigurationParameters[9]; - - clientJson["outbounds"] = jObjectJson["outbounds"]; - if (!Directory.Exists(@"xray_config\vmess_tcp_tls_client_config"))//如果不存在就创建file文件夹      - { - Directory.CreateDirectory(@"xray_config\vmess_tcp_tls_client_config");//创建该文件夹   - } - using (StreamWriter sw = new StreamWriter(@"xray_config\vmess_tcp_tls_client_config\config.json")) - { - sw.Write(clientJson.ToString()); - } - } - - //VMess over WS with TLS模式 - outboundsConfigJsons = $"{pwdir}" + @"TemplateConfg\xray\client\06_outbounds\WebSocketTLSWeb_client_config.json"; - using (StreamReader readerJson = File.OpenText(outboundsConfigJsons)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - - //设置客户端的地址/端口/id - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["address"] = ReceiveConfigurationParameters[4]; - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["port"] = int.Parse(ReceiveConfigurationParameters[1]); - jObjectJson["outbounds"][0]["settings"]["vnext"][0]["users"][0]["id"] = ReceiveConfigurationParameters[2]; - jObjectJson["outbounds"][0]["streamSettings"]["wsSettings"]["path"] = ReceiveConfigurationParameters[6]; - - clientJson["outbounds"] = jObjectJson["outbounds"]; - if (!Directory.Exists(@"xray_config\vmess_ws_tls_client_config"))//如果不存在就创建file文件夹      - { - Directory.CreateDirectory(@"xray_config\vmess_ws_tls_client_config");//创建该文件夹   - } - using (StreamWriter sw = new StreamWriter(@"xray_config\vmess_ws_tls_client_config\config.json")) - { - sw.Write(clientJson.ToString()); - } - } - - //Trojan over TCP with TLS模式 - outboundsConfigJsons = $"{pwdir}" + @"TemplateConfg\xray\client\06_outbounds\trojan_tcp_tls.json"; - using (StreamReader readerJson = File.OpenText(outboundsConfigJsons)) - { - JObject jObjectJson = (JObject)JToken.ReadFrom(new JsonTextReader(readerJson)); - - //设置客户端的地址/端口/id - jObjectJson["outbounds"][0]["settings"]["servers"][0]["address"] = ReceiveConfigurationParameters[4]; - jObjectJson["outbounds"][0]["settings"]["servers"][0]["port"] = int.Parse(ReceiveConfigurationParameters[1]); - jObjectJson["outbounds"][0]["settings"]["servers"][0]["password"] = ReceiveConfigurationParameters[2]; - jObjectJson["outbounds"][0]["streamSettings"]["tlsSettings"]["serverName"] = ReceiveConfigurationParameters[4]; - - clientJson["outbounds"] = jObjectJson["outbounds"]; - if (!Directory.Exists(@"xray_config\trojan_tcp_tls_client_config"))//如果不存在就创建file文件夹      - { - Directory.CreateDirectory(@"xray_config\trojan_tcp_tls_client_config");//创建该文件夹   - } - using (StreamWriter sw = new StreamWriter(@"xray_config\trojan_tcp_tls_client_config\config.json")) - { - sw.Write(clientJson.ToString()); - } - } - - } - } - SetUpProgressBarProcessing(98); - return true; - } - - - #endregion - - //检测升级远程主机端的Xray版本 - private void ButtonUpdateXray_Click(object sender, RoutedEventArgs e) - { - ConnectionInfo connectionInfo = GenerateConnectionInfo(); - if (connectionInfo == null) - { - //****** "远程主机连接信息有误,请检查!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostConnection").ToString()); - return; - } - installationDegree = 0; - TextBoxMonitorCommandResults.Text = ""; - Thread thread = new Thread(() => UpdateXray(connectionInfo)); - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - } - - //升级Xray主程序 - private void UpdateXray(ConnectionInfo connectionInfo) - { - functionResult = true; - onlyIpv6 = false; - getApt = false; - getDnf = false; - getYum = false; - - //******"正在登录远程主机......"****** - SetUpProgressBarProcessing(1); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_Login").ToString(); - MainWindowsShowInfo(currentStatus); - - try - { - #region 主机指纹,暂未启用 - //byte[] expectedFingerPrint = new byte[] { - // 0x66, 0x31, 0xaf, 0x00, 0x54, 0xb9, 0x87, 0x31, - // 0xff, 0x58, 0x1c, 0x31, 0xb1, 0xa2, 0x4c, 0x6b - // }; - #endregion - using (var client = new SshClient(connectionInfo)) - - { - #region ssh登录验证主机指纹代码块,暂未启用 - // client.HostKeyReceived += (sender, e) => - // { - // if (expectedFingerPrint.Length == e.FingerPrint.Length) - // { - // for (var i = 0; i < expectedFingerPrint.Length; i++) - // { - // if (expectedFingerPrint[i] != e.FingerPrint[i]) - // { - // e.CanTrust = false; - // break; - // } - // } - // } - // else - // { - // e.CanTrust = false; - // } - // }; - #endregion - - client.Connect(); - if (client.IsConnected == true) - { - //******"主机登录成功"****** - SetUpProgressBarProcessing(3); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginSuccessful").ToString(); - MainWindowsShowInfo(currentStatus); - } - - //检测root权限 5--7 - functionResult = RootAuthorityDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - - //******"检测系统是否已经安装Xray......"****** - SetUpProgressBarProcessing(20); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestExistSoft").ToString() + "Xray......"; - MainWindowsShowInfo(currentStatus); - - //Thread.Sleep(1000); - //检测是否安装Xray - //sshShellCommand = @"find / -name xray"; - //sshShellCommand = @"if [[ -f /usr/local/bin/xray ]];then echo '1';else echo '0'; fi"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //if (currentShellCommandResult.Contains("/usr/local/bin/xray") == false) - //if (currentShellCommandResult.Trim().Equals("0") == true) - functionResult = FileCheckExists(client, @"/usr/local/bin/xray"); - if (functionResult == false) - { - //******"退出!原因:远程主机未安装Xray"****** - currentStatus = Application.Current.FindResource("MessageBoxShow_ErrorUpgradeSoftNotInstall").ToString() + "Xray!"; - MainWindowsShowInfo(currentStatus); - MessageBox.Show(currentStatus); - - client.Disconnect(); - return; - - } - - //sshcmd = @"/usr/local/bin/xray -version | head -n 1 | cut -d "" "" -f2"; - sshShellCommand = @"/usr/local/bin/xray -version | head -n 1 | cut -d "" "" -f2"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - string xrayCurrentVersion = currentShellCommandResult;//不含字母v - - //sshcmd = @"curl -H ""Accept: application/json"" -H ""User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:74.0) Gecko/20100101 Firefox/74.0"" -s ""https://api.github.com/repos/v2fly/xray-core/releases/latest"" --connect-timeout 10| grep 'tag_name' | cut -d\"" -f4"; - sshShellCommand = @"curl -H ""Accept: application/json"" -H ""User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:74.0) Gecko/20100101 Firefox/74.0"" -sS ""https://api.github.com/repos/XTLS/Xray-core/releases/latest"" --connect-timeout 10 | grep 'tag_name' | cut -d\"" -f4"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - string xrayNewVersion = currentShellCommandResult;//包含字母v - - if (xrayNewVersion.Contains(xrayCurrentVersion) == false) - { - MessageBoxResult messageBoxResult = MessageBox.Show( - //****** "远程主机当前版本为:v" ****** - Application.Current.FindResource("DisplayInstallInfo_CurrentVersion").ToString() + - $"{xrayCurrentVersion}\n" + - //****** "最新版本为:" ****** - Application.Current.FindResource("DisplayInstallInfo_NewVersion").ToString() + - $"{xrayNewVersion}\n" + - //****** "是否升级为最新版本?" ****** - Application.Current.FindResource("DisplayInstallInfo_IsOrNoUpgradeNewVersion").ToString(), "", MessageBoxButton.YesNo, MessageBoxImage.Question); - if (messageBoxResult == MessageBoxResult.Yes) - { - //****** "正在升级到最新版本......" ****** - SetUpProgressBarProcessing(60); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartUpgradeNewVersion").ToString(); - MainWindowsShowInfo(currentStatus); - - //client.RunCommand(@"bash <(curl -L -s https://raw.githubusercontent.com/v2fly/fhs-install-xray/master/install-release.sh)"); - sshShellCommand = $"bash <(curl -L -s https://raw.githubusercontent.com/XTLS/Xray-install/main/install-release.sh)"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - SetUpProgressBarProcessing(80); - //sshcmd = @"/usr/local/bin/xray -version | head -n 1 | cut -d "" "" -f2"; - sshShellCommand = @"/usr/local/bin/xray -version | head -n 1 | cut -d "" "" -f2"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - xrayCurrentVersion = currentShellCommandResult;//不含字母v - if (xrayNewVersion.Contains(xrayCurrentVersion) == true) - { - //****** "升级成功!当前已是最新版本!" ****** - SetUpProgressBarProcessing(100); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UpgradeNewVersionOK").ToString(); - MainWindowsShowInfo(currentStatus); - MessageBox.Show(currentStatus); - } - else - { - //****** "升级失败,原因未知,请向开发者提问!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UpgradeNewVersionFail").ToString(); - MainWindowsShowInfo(currentStatus); - MessageBox.Show(currentStatus); - } - } - else - { - //****** "升级取消,退出!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UpgradeVersionCancel").ToString(); - MainWindowsShowInfo(currentStatus); - - client.Disconnect(); - return; - } - } - else - { - //****** "远程主机当前已是最新版本:" ****** - SetUpProgressBarProcessing(100); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_IsNewVersion").ToString() + - $"{xrayNewVersion}\n" + - //****** "无需升级!退出!" ****** - Application.Current.FindResource("DisplayInstallInfo_NotUpgradeVersion").ToString(); - MessageBox.Show(currentStatus); - MainWindowsShowInfo(currentStatus); - } - - client.Disconnect(); - return; - } - } - catch (Exception ex1)//例外处理 - #region 例外处理 - { - ProcessException(ex1.Message); - - //****** "主机登录失败!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - #endregion - - } - - #endregion - - #region Trojan-go相关 - - //打开设置TrojanGo参数窗口 - private void ButtonTrojanGoTemplate_Click(object sender, RoutedEventArgs e) - { - for (int i = 0; i != ReceiveConfigurationParameters.Length; i++) - - { - ReceiveConfigurationParameters[i] = ""; - } - TrojanGoTemplateWindow windowTrojanGoTemplateConfiguration = new TrojanGoTemplateWindow(); - windowTrojanGoTemplateConfiguration.Closed += windowTrojanGoTemplateConfigurationClosed; - windowTrojanGoTemplateConfiguration.ShowDialog(); - } - //TrojanGo模板设置窗口关闭后,触发事件,将所选的方案与其参数显示在UI上 - private void windowTrojanGoTemplateConfigurationClosed(object sender, System.EventArgs e) - { - if (String.IsNullOrEmpty(ReceiveConfigurationParameters[0]) == true) - { - //显示"未选择方案!" - TextBlockCurrentlySelectedPlan.Text = Application.Current.FindResource("TextBlockCurrentlySelectedPlanNo").ToString(); - - TextBlockTrojanGoShowPort.Visibility = Visibility.Hidden; - TextBlockTrojanGoCurrentlySelectedPlanPort.Visibility = Visibility.Hidden; - - TextBlockTrojanGoShowPassword.Visibility = Visibility.Hidden; - TextBlockTrojanGoCurrentlySelectedPlanPassword.Visibility = Visibility.Hidden; - - TextBlockTrojanGoShowPath.Visibility = Visibility.Hidden; - TextBlockTrojanGoCurrentlySelectedPlanPathSeedKey.Visibility = Visibility.Hidden; - - TextBlockTrojanGoShowCurrentlySelectedPlanDomain.Visibility = Visibility.Hidden; - TextBlockTrojanGoCurrentlySelectedPlanDomain.Visibility = Visibility.Hidden; - - TextBlockTrojanGoShowCurrentlySelectedPlanFakeWebsite.Visibility = Visibility.Hidden; - TextBlockTrojanGoCurrentlySelectedPlanFakeWebsite.Visibility = Visibility.Hidden; - return; - } - TextBlockTrojanGoCurrentlySelectedPlan.Text = ReceiveConfigurationParameters[8]; //所选方案名称 - TextBlockTrojanGoCurrentlySelectedPlanPort.Text = ReceiveConfigurationParameters[1]; //服务器端口 - TextBlockTrojanGoCurrentlySelectedPlanPassword.Text = ReceiveConfigurationParameters[2]; //UUID - TextBlockTrojanGoCurrentlySelectedPlanPathSeedKey.Text = ReceiveConfigurationParameters[6]; //mKCP Seed\Quic Key\Path - TextBlockTrojanGoCurrentlySelectedPlanDomain.Text = ReceiveConfigurationParameters[4]; //域名 - TextBlockTrojanGoCurrentlySelectedPlanFakeWebsite.Text = ReceiveConfigurationParameters[7]; //伪装网站 - - if (String.Equals(ReceiveConfigurationParameters[0], "TrojanGoTLS2Web")) - { - TextBlockTrojanGoShowPort.Visibility = Visibility.Visible; - TextBlockTrojanGoCurrentlySelectedPlanPort.Visibility = Visibility.Visible; - - TextBlockTrojanGoShowPassword.Visibility = Visibility.Visible; - TextBlockTrojanGoCurrentlySelectedPlanPassword.Visibility = Visibility.Visible; - - TextBlockTrojanGoShowPath.Visibility = Visibility.Hidden; - TextBlockTrojanGoCurrentlySelectedPlanPathSeedKey.Visibility = Visibility.Hidden; - - TextBlockTrojanGoShowCurrentlySelectedPlanDomain.Visibility = Visibility.Visible; - TextBlockTrojanGoCurrentlySelectedPlanDomain.Visibility = Visibility.Visible; - - TextBlockTrojanGoShowCurrentlySelectedPlanFakeWebsite.Visibility = Visibility.Hidden; - TextBlockTrojanGoCurrentlySelectedPlanFakeWebsite.Visibility = Visibility.Hidden; - - } - else if (String.Equals(ReceiveConfigurationParameters[0], "TrojanGoWebSocketTLS2Web")) - { - TextBlockTrojanGoShowPort.Visibility = Visibility.Visible; - TextBlockTrojanGoCurrentlySelectedPlanPort.Visibility = Visibility.Visible; - - TextBlockTrojanGoShowPassword.Visibility = Visibility.Visible; - TextBlockTrojanGoCurrentlySelectedPlanPassword.Visibility = Visibility.Visible; - - TextBlockTrojanGoShowPath.Text = "WebSocket Path:"; - TextBlockTrojanGoCurrentlySelectedPlanPathSeedKey.Text = ReceiveConfigurationParameters[6]; //mKCP Seed\Quic Key\Path - - - TextBlockTrojanGoShowPath.Visibility = Visibility.Visible; - TextBlockTrojanGoCurrentlySelectedPlanPathSeedKey.Visibility = Visibility.Visible; - - TextBlockTrojanGoShowCurrentlySelectedPlanDomain.Visibility = Visibility.Visible; - TextBlockTrojanGoCurrentlySelectedPlanDomain.Visibility = Visibility.Visible; - - TextBlockTrojanGoShowCurrentlySelectedPlanFakeWebsite.Visibility = Visibility.Hidden; - TextBlockTrojanGoCurrentlySelectedPlanFakeWebsite.Visibility = Visibility.Hidden; - } - - } - - //传递TrojanGo参数 - private void ButtonTrojanGoSetUp_Click(object sender, RoutedEventArgs e) - { - ConnectionInfo connectionInfo = GenerateConnectionInfo(); - if (connectionInfo == null) - { - //****** "远程主机连接信息有误,请检查!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostConnection").ToString()); - return; - } - - if (String.IsNullOrEmpty(ReceiveConfigurationParameters[0]) == true) - { - //******"请先选择配置模板!"****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ChooseTemplate").ToString()); - return; - } - if (String.IsNullOrEmpty(ReceiveConfigurationParameters[4]) == true) - { - //****** "域名不能为空,请检查相关参数设置!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_DomainNotEmpty").ToString()); - return; - } - installationDegree = 0; - TextBoxMonitorCommandResults.Text = ""; - Thread thread = new Thread(() => StartSetUpTrojanGo(connectionInfo)); - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - } - - //登录远程主机布署Trojan-Go程序 - private void StartSetUpTrojanGo(ConnectionInfo connectionInfo) - { - functionResult = true; - onlyIpv6 = false; - getApt = false; - getDnf = false; - getYum = false; - - //******"正在登录远程主机......"****** - SetUpProgressBarProcessing(1); - string currentStatus = Application.Current.FindResource("DisplayInstallInfo_Login").ToString(); - MainWindowsShowInfo(currentStatus); - - try - { - #region 主机指纹,暂未启用 - //byte[] expectedFingerPrint = new byte[] { - // 0x66, 0x31, 0xaf, 0x00, 0x54, 0xb9, 0x87, 0x31, - // 0xff, 0x58, 0x1c, 0x31, 0xb1, 0xa2, 0x4c, 0x6b - // }; - #endregion - using (var client = new SshClient(connectionInfo)) - - { - #region ssh登录验证主机指纹代码块,暂未启用 - // client.HostKeyReceived += (sender, e) => - // { - // if (expectedFingerPrint.Length == e.FingerPrint.Length) - // { - // for (var i = 0; i < expectedFingerPrint.Length; i++) - // { - // if (expectedFingerPrint[i] != e.FingerPrint[i]) - // { - // e.CanTrust = false; - // break; - // } - // } - // } - // else - // { - // e.CanTrust = false; - // } - // }; - #endregion - - client.Connect(); - if (client.IsConnected == true) - { - //******"主机登录成功"****** - SetUpProgressBarProcessing(3); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginSuccessful").ToString(); - MainWindowsShowInfo(currentStatus); - - } - - //检测root权限 5--7 - functionResult = RootAuthorityDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测是否已安装代理 8--10 - functionResult = SoftInstalledIsNoYes(client, "trojan-go", @"/usr/local/bin/trojan-go"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测关闭Selinux及系统组件是否齐全(apt-get/yum/dnf/systemctl)11--30 - //安装依赖软件,检测端口,防火墙开启端口 - functionResult = ShutDownSelinuxAndSysComponentsDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测域名是否解析到当前IP上 34---36 - functionResult = DomainResolutionCurrentIPDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //下载脚本安装Trojan-go 37--40 - functionResult = ProxySoftInstall(client, @"Trojan-go", @"https://raw.githubusercontent.com/proxysu/shellscript/master/trojan-go.sh"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - //functionResult = TrojanGoInstall(client); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //程序是否安装成功检测并设置开机启动 41--43 - functionResult = SoftInstalledSuccessOrFail(client, "trojan-go", @"/usr/local/bin/trojan-go"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //生成Trojan-go服务端配置 44--46 - functionResult = GenerateServerConfigurationTrojanGo(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //上传配置文件 - string upLoadPath = "/usr/local/etc/trojan-go/config.json"; - UploadConfig(connectionInfo, @"config.json", upLoadPath); - File.Delete(@"config.json"); - - //acme.sh安装与申请证书 51--57 - functionResult = AcmeShInstall(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - - //****** "安装证书到Trojan-go......" ****** - SetUpProgressBarProcessing(58); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_IntallCertToSoft").ToString() + "Trojan-go......"; - MainWindowsShowInfo(currentStatus); - - sshShellCommand = $"/root/.acme.sh/acme.sh --installcert -d {ReceiveConfigurationParameters[4]} --certpath /usr/local/etc/trojan-go/trojan-go.crt --keypath /usr/local/etc/trojan-go/trojan-go.key --capath /usr/local/etc/trojan-go/trojan-go.crt --reloadcmd \"systemctl restart trojan-go\""; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"if [ ! -f ""/usr/local/etc/trojan-go/trojan-go.key"" ]; then echo ""0""; else echo ""1""; fi | head -n 1"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - if (currentShellCommandResult.Contains("1") == true) - { - //****** "证书成功安装到Trojan-go!" ****** - SetUpProgressBarProcessing(60); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_IntallCertToSoftOK").ToString() + "Trojan-go!"; - MainWindowsShowInfo(currentStatus); - } - else - { - //****** "证书安装到Trojan-go失败,原因未知,可以向开发者提问!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_IntallCertToSoftFail").ToString() + - "Trojan-go" + - Application.Current.FindResource("DisplayInstallInfo_InstallCertFailAsk").ToString(); - MainWindowsShowInfo(currentStatus); - client.Disconnect(); - return; - } - - //设置证书权限 - sshShellCommand = @"chmod 644 /usr/local/etc/trojan-go/trojan-go.key"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //Caddy安装与检测安装是否成功 61--66 - functionResult = CaddyInstall(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - - //****** "上传Caddy配置文件......" ****** - SetUpProgressBarProcessing(67); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadCaddyConfig").ToString(); - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"mv /etc/caddy/Caddyfile /etc/caddy/Caddyfile.bak"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - string caddyConfig = $"{pwdir}" + @"TemplateConfg\trojan-go\trojan-go.caddyfile"; - - upLoadPath = "/etc/caddy/Caddyfile"; - UploadConfig(connectionInfo, caddyConfig, upLoadPath); - - //设置Caddy配置文件 - functionResult = SetCaddyfile(client, upLoadPath); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - - //****** "Caddy配置文件上传成功,OK!" ****** - SetUpProgressBarProcessing(70); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadCaddyConfigOK").ToString(); - MainWindowsShowInfo(currentStatus); - - //程序启动检测Caddy - functionResult = SoftStartDetect(client, "caddy", @"/usr/bin/caddy"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //程序启动检测Trojan-go - functionResult = SoftStartDetect(client, "trojan-go", @"/usr/local/bin/trojan-go"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测BBR,满足条件并启动 90--95 - functionResult = DetectBBRandEnable(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - client.Disconnect();//断开服务器ssh连接 - - - //****** "生成客户端配置......" ****** - SetUpProgressBarProcessing(96); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_GenerateClientConfig").ToString(); - MainWindowsShowInfo(currentStatus); - - if (!Directory.Exists("trojan-go_config"))//如果不存在就创建file文件夹      - { - Directory.CreateDirectory("trojan-go_config");//创建该文件夹   - } - - string clientConfig = $"{pwdir}" + @"TemplateConfg\trojan-go\trojan-go_all_config.json"; //生成的客户端配置文件 - - using (StreamReader reader = File.OpenText(clientConfig)) - { - JObject clientJson = (JObject)JToken.ReadFrom(new JsonTextReader(reader)); - clientJson["run_type"] = "client"; - clientJson["local_addr"] = "127.0.0.1"; - clientJson["local_port"] = 1080; - clientJson["remote_addr"] = ReceiveConfigurationParameters[4]; - clientJson["remote_port"] = 443; - //设置密码 - clientJson["password"][0] = ReceiveConfigurationParameters[2]; - clientJson["ssl"]["sni"] = ReceiveConfigurationParameters[4]; - //如果是WebSocket协议则设置路径 - if (String.Equals(ReceiveConfigurationParameters[0], "TrojanGoWebSocketTLS2Web")) - { - clientJson["websocket"]["enabled"] = true; - clientJson["websocket"]["path"] = ReceiveConfigurationParameters[6]; - clientJson["websocket"]["host"] = ReceiveConfigurationParameters[4]; - } - //如果开启了mux,设置客户端配置文件参数 - if (String.Equals(ReceiveConfigurationParameters[9], "true") == true) - { - clientJson["mux"]["enabled"] = true; - clientJson["mux"]["concurrency"] = int.Parse(ReceiveConfigurationParameters[3]); - clientJson["mux"]["idle_timeout"] = int.Parse(ReceiveConfigurationParameters[5]); - //if(int.TryParse(ReceiveConfigurationParameters[3],out int value) == true) - //{ - // clientJson["mux"]["concurrency"] = value; - //} - //if (int.TryParse(ReceiveConfigurationParameters[5], out int value2) == true) - //{ - // clientJson["mux"]["idle_timeout"] = value2; - //} - //clientJson["mux"]["idle_timeout"] = int.TryParse(ReceiveConfigurationParameters[5], out int value2); - //clientJson["mux"]["idle_timeout"] = value2; - } - - using (StreamWriter sw = new StreamWriter(@"trojan-go_config\config.json")) - { - sw.Write(clientJson.ToString()); - } - } - - //****** "Trojan-go安装成功,祝你玩的愉快!!" ****** - SetUpProgressBarProcessing(100); - currentStatus = "Trojan-go" + Application.Current.FindResource("DisplayInstallInfo_ProxyInstalledOK").ToString(); - MainWindowsShowInfo(currentStatus); - - //显示服务端连接参数 - proxyType = "TrojanGo"; - - ResultClientInformation resultClientInformation = new ResultClientInformation(); - resultClientInformation.ShowDialog(); - return; - } - } - catch (Exception ex1)//例外处理 - #region 例外处理 - { - ProcessException(ex1.Message); - - //****** "安装失败!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - #endregion - - } - - //下载脚本安装Trojan-go 37--40 - //functionResult = TrojanGoInstall(client); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - //private bool TrojanGoInstall(SshClient client) - //{ - // //****** "系统环境检测完毕,符合安装要求,开始布署......" ****** - // SetUpProgressBarProcessing(37); - // currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstalling").ToString(); - // MainWindowsShowInfo(currentStatus); - - // //****** "正在安装Trojan-go......" ****** - // SetUpProgressBarProcessing(38); - // currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstallSoft").ToString() + "Trojan-go......"; - // MainWindowsShowInfo(currentStatus); - - // sshShellCommand = $"curl -o /tmp/trojan-go.sh https://raw.githubusercontent.com/proxysu/shellscript/master/trojan-go.sh"; - // currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - // functionResult = FileCheckExists(client, @"/tmp/trojan-go.sh"); - // if (functionResult == true) - // { - // sshShellCommand = @"yes | bash /tmp/trojan-go.sh -f"; - // currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - // sshShellCommand = @"rm -f /tmp/trojan-go.sh"; - // currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - // } - // else - // { - // //***安装脚本下载失败!*** - // currentStatus = Application.Current.FindResource("DisplayInstallInfo_DownloadScriptFailed").ToString(); - // MainWindowsShowInfo(currentStatus); - // return false; - // } - - - // SetUpProgressBarProcessing(40); - // return true; - //} - - //生成Trojan-go服务端配置 44--46 - //functionResult = GenerateServerConfigurationTrojanGo(client); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - private bool GenerateServerConfigurationTrojanGo(SshClient client) - { - //备份原配置文件 - sshShellCommand = @"mv /etc/trojan-go/config.json /etc/trojan-go/config.json.1"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //****** "安装完毕,上传配置文件......" ****** - SetUpProgressBarProcessing(44); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadSoftConfig").ToString(); - MainWindowsShowInfo(currentStatus); - - string serverConfig = $"{pwdir}" + @"TemplateConfg\trojan-go\trojan-go_all_config.json"; //服务端配置文件 - //string upLoadPath = @"/usr/local/etc/trojan-go/config.json"; //服务端文件位置 - - //生成服务端配置 - using (StreamReader reader = File.OpenText(serverConfig)) - { - //设置Caddy随机监听的端口,用于Trojan-go,Trojan,V2Ray vless TLS - //Random random = new Random(); - randomCaddyListenPort = GetRandomPort(); - - JObject serverJson = (JObject)JToken.ReadFrom(new JsonTextReader(reader)); - serverJson["run_type"] = "server"; - serverJson["local_addr"] = "0.0.0.0"; - serverJson["local_port"] = 443; - serverJson["remote_addr"] = "127.0.0.1"; - serverJson["remote_port"] = randomCaddyListenPort; - //设置密码 - serverJson["password"][0] = ReceiveConfigurationParameters[2]; - //设置证书 - serverJson["ssl"]["cert"] = "/usr/local/etc/trojan-go/trojan-go.crt"; - serverJson["ssl"]["key"] = "/usr/local/etc/trojan-go/trojan-go.key"; - serverJson["ssl"]["sni"] = ReceiveConfigurationParameters[4]; - - if (String.Equals(ReceiveConfigurationParameters[0], "TrojanGoWebSocketTLS2Web")) - { - serverJson["websocket"]["enabled"] = true; - serverJson["websocket"]["path"] = ReceiveConfigurationParameters[6]; - serverJson["websocket"]["host"] = ReceiveConfigurationParameters[4]; - } - - using (StreamWriter sw = new StreamWriter(@"config.json")) - { - sw.Write(serverJson.ToString()); - } - } - - - SetUpProgressBarProcessing(46); - return true; - } - - - //检测升级Trojan-Go版本传递参数 - private void ButtonUpdateTrojanGo_Click(object sender, RoutedEventArgs e) - { - ConnectionInfo connectionInfo = GenerateConnectionInfo(); - if (connectionInfo == null) - { - //****** "远程主机连接信息有误,请检查!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostConnection").ToString()); - return; - } - installationDegree = 0; - Thread thread = new Thread(() => UpdateTojanGo(connectionInfo)); - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - } - - //升级Trojan-go主程序 - private void UpdateTojanGo(ConnectionInfo connectionInfo) - { - functionResult = true; - onlyIpv6 = false; - getApt = false; - getDnf = false; - getYum = false; - - //******"正在登录远程主机......"****** - SetUpProgressBarProcessing(1); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_Login").ToString(); - MainWindowsShowInfo(currentStatus); - - try - { - #region 主机指纹,暂未启用 - //byte[] expectedFingerPrint = new byte[] { - // 0x66, 0x31, 0xaf, 0x00, 0x54, 0xb9, 0x87, 0x31, - // 0xff, 0x58, 0x1c, 0x31, 0xb1, 0xa2, 0x4c, 0x6b - // }; - #endregion - using (var client = new SshClient(connectionInfo)) - - { - #region ssh登录验证主机指纹代码块,暂未启用 - // client.HostKeyReceived += (sender, e) => - // { - // if (expectedFingerPrint.Length == e.FingerPrint.Length) - // { - // for (var i = 0; i < expectedFingerPrint.Length; i++) - // { - // if (expectedFingerPrint[i] != e.FingerPrint[i]) - // { - // e.CanTrust = false; - // break; - // } - // } - // } - // else - // { - // e.CanTrust = false; - // } - // }; - #endregion - - client.Connect(); - if (client.IsConnected == true) - { - //******"主机登录成功"****** - SetUpProgressBarProcessing(3); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginSuccessful").ToString(); - MainWindowsShowInfo(currentStatus); - } - - //检测root权限 5--7 - functionResult = RootAuthorityDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - - //******"检测系统是否已经安装Trojan-go......"****** - SetUpProgressBarProcessing(20); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestExistSoft").ToString() + "Trojan-go......"; - MainWindowsShowInfo(currentStatus); - - //string cmdTestTrojanInstalled = @"find / -name trojan-go"; - - //sshShellCommand = @"find / -name trojan-go"; - //sshShellCommand = @"if [[ -f /usr/local/bin/trojan-go ]];then echo '1';else echo '0'; fi"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //if (currentShellCommandResult.Contains("/usr/local/bin/trojan-go") == false) - //if (currentShellCommandResult.Trim().Equals("0") == true) - functionResult = FileCheckExists(client, @"/usr/local/bin/trojan-go"); - if (functionResult == false) - { - //******"退出!原因:远程主机未安装Trojan-go"****** - currentStatus = Application.Current.FindResource("MessageBoxShow_ErrorUpgradeSoftNotInstall").ToString() + "Trojan-go!"; - MainWindowsShowInfo(currentStatus); - MessageBox.Show(currentStatus); - client.Disconnect(); - return; - - } - SetUpProgressBarProcessing(40); - //获取当前安装的版本 - //string sshcmd = @"echo ""$(/usr/local/bin/trojan-go -version)"" | head -n 1 | cut -d "" "" -f2"; - sshShellCommand = @"echo ""$(/usr/local/bin/trojan-go -version)"" | head -n 1 | cut -d "" "" -f2"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - string trojanCurrentVersion = currentShellCommandResult;//含字母v - - //获取最新版本 - //sshcmd = @"curl -s https://api.github.com/repos/p4gefau1t/trojan-go/tags | grep 'name' | cut -d\"" -f4 | head -1"; - sshShellCommand = @"curl -s https://api.github.com/repos/p4gefau1t/trojan-go/tags | grep 'name' | cut -d\"" -f4 | head -1"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - string trojanNewVersion = currentShellCommandResult;//含字母v - - if (trojanNewVersion.Equals(trojanCurrentVersion) == false) - { - MessageBoxResult messageBoxResult = MessageBox.Show( - //****** "远程主机当前版本为:v" ****** - Application.Current.FindResource("DisplayInstallInfo_CurrentVersion").ToString() + - $"{trojanCurrentVersion}\n" + - //****** "最新版本为:" ****** - Application.Current.FindResource("DisplayInstallInfo_NewVersion").ToString() + - $"{trojanNewVersion}\n" + - //****** "是否升级为最新版本?" ****** - Application.Current.FindResource("DisplayInstallInfo_IsOrNoUpgradeNewVersion").ToString(), "", MessageBoxButton.YesNo, MessageBoxImage.Question); - if (messageBoxResult == MessageBoxResult.Yes) - { - //****** "正在升级到最新版本......" ****** - SetUpProgressBarProcessing(60); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartUpgradeNewVersion").ToString(); - MainWindowsShowInfo(currentStatus); - - //备份配置文件 - //sshcmd = @"mv /usr/local/etc/trojan/config.json /usr/local/etc/trojan/config.json.bak"; - //client.RunCommand(sshcmd); - //升级Trojan-Go主程序 - //client.RunCommand("curl -o /tmp/trojan-go.sh https://raw.githubusercontent.com/proxysu/shellscript/master/trojan-go.sh"); - //client.RunCommand("yes | bash /tmp/trojan-go.sh -f"); - - saveShellScriptFileName = GenerateRandomScriptFileName(GenerateRandomStr(10)); - - sshShellCommand = $"curl -o {saveShellScriptFileName} https://raw.githubusercontent.com/proxysu/shellscript/master/trojan-go.sh"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - functionResult = FileCheckExists(client, $"{saveShellScriptFileName}"); - if (functionResult == false) - { - //***文件下载失败!*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DownloadScriptFailed").ToString(); - MainWindowsShowInfo(currentStatus); - return; - } - - sshShellCommand = $"yes | bash {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"rm -f {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - SetUpProgressBarProcessing(80); - - //获取升级后的版本 - //sshcmd = @"echo ""$(/usr/local/bin/trojan-go -version)"" | head -n 1 | cut -d "" "" -f2"; - sshShellCommand = @"echo ""$(/usr/local/bin/trojan-go -version)"" | head -n 1 | cut -d "" "" -f2"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - trojanCurrentVersion = currentShellCommandResult;//含字母v - if (trojanNewVersion.Equals(trojanCurrentVersion) == true) - { - //恢复原来的配置文件备份 - //sshcmd = @"rm -f /usr/local/etc/trojan/config.json"; - //client.RunCommand(sshcmd); - //sshcmd = @"mv /usr/local/etc/trojan/config.json.bak /usr/local/etc/trojan/config.json"; - //client.RunCommand(sshcmd); - - //****** "升级成功!当前已是最新版本!" ****** - MessageBox.Show(Application.Current.FindResource("DisplayInstallInfo_UpgradeNewVersionOK").ToString()); - //****** "升级成功!当前已是最新版本!" ****** - SetUpProgressBarProcessing(100); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UpgradeNewVersionOK").ToString(); - MainWindowsShowInfo(currentStatus); - } - else - { - //****** "升级失败,原因未知,请向开发者提问!" ****** - MessageBox.Show(Application.Current.FindResource("DisplayInstallInfo_UpgradeNewVersionFail").ToString()); - //****** "升级失败,原因未知,请向开发者提问!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UpgradeNewVersionFail").ToString(); - MainWindowsShowInfo(currentStatus); - - client.Disconnect(); - return; - } - } - - else - { - //****** "升级取消,退出!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UpgradeVersionCancel").ToString(); - MainWindowsShowInfo(currentStatus); - - client.Disconnect(); - return; - } - } - else - { - //****** "远程主机当前已是最新版本:" ****** - SetUpProgressBarProcessing(100); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_IsNewVersion").ToString() + - $"{trojanNewVersion}\n" + - //****** "无需升级!退出!" ****** - Application.Current.FindResource("DisplayInstallInfo_NotUpgradeVersion").ToString(); - MessageBox.Show(currentStatus); - MainWindowsShowInfo(currentStatus); - } - - client.Disconnect(); - return; - } - } - catch (Exception ex1)//例外处理 - #region 例外处理 - { - ProcessException(ex1.Message); - - //****** "主机登录失败!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - #endregion - - } - #endregion - - #region Trojan相关 - - //Trojan参数传递 - private void ButtonTrojanSetUp_Click(object sender, RoutedEventArgs e) - { - ConnectionInfo connectionInfo = GenerateConnectionInfo(); - if (connectionInfo == null) - { - //****** "远程主机连接信息有误,请检查!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostConnection").ToString()); - return; - } - //清空参数空间 - for (int i = 0; i != ReceiveConfigurationParameters.Length; i++) - - { - ReceiveConfigurationParameters[i] = ""; - } - bool preDomainMask = ClassModel.PreDomainMask(TextBoxTrojanSites.Text); - bool domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxTrojanHostDomain.Text); - //if (string.IsNullOrEmpty(PreTrim(TextBoxTrojanHostDomain.Text)) == true) - //{ - // //****** "域名不能为空,请检查相关参数设置!" ****** - // MessageBox.Show(Application.Current.FindResource("MessageBoxShow_DomainNotEmpty").ToString()); - // return; - //} - if (domainNotEmpty == false || preDomainMask == false) - { - return; - } - //传递模板类型 - ReceiveConfigurationParameters[0] = "TrojanTLS2Web"; - - //传递域名 - ReceiveConfigurationParameters[4] = PreTrim(TextBoxTrojanHostDomain.Text); - //传递伪装网站 - ReceiveConfigurationParameters[7] = ClassModel.DisguiseURLprocessing(PreTrim(TextBoxTrojanSites.Text)); - - //传递服务端口 - ReceiveConfigurationParameters[1] = "443"; - //传递密码(uuid) - ReceiveConfigurationParameters[2] = TextBoxTrojanPassword.Text.ToString(); - - //启动布署进程 - installationDegree = 0; - TextBoxMonitorCommandResults.Text = ""; - Thread thread = new Thread(() => StartSetUpTrojan(connectionInfo)); - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - } - - //登录远程主机布署Trojan程序 - private void StartSetUpTrojan(ConnectionInfo connectionInfo) - { - functionResult = true; - onlyIpv6 = false; - getApt = false; - getDnf = false; - getYum = false; - - //******"正在登录远程主机......"****** - SetUpProgressBarProcessing(1); - string currentStatus = Application.Current.FindResource("DisplayInstallInfo_Login").ToString(); - MainWindowsShowInfo(currentStatus); - - try - { - #region 主机指纹,暂未启用 - //byte[] expectedFingerPrint = new byte[] { - // 0x66, 0x31, 0xaf, 0x00, 0x54, 0xb9, 0x87, 0x31, - // 0xff, 0x58, 0x1c, 0x31, 0xb1, 0xa2, 0x4c, 0x6b - // }; - #endregion - using (var client = new SshClient(connectionInfo)) - - { - #region ssh登录验证主机指纹代码块,暂未启用 - // client.HostKeyReceived += (sender, e) => - // { - // if (expectedFingerPrint.Length == e.FingerPrint.Length) - // { - // for (var i = 0; i < expectedFingerPrint.Length; i++) - // { - // if (expectedFingerPrint[i] != e.FingerPrint[i]) - // { - // e.CanTrust = false; - // break; - // } - // } - // } - // else - // { - // e.CanTrust = false; - // } - // }; - #endregion - - client.Connect(); - if (client.IsConnected == true) - { - //******"主机登录成功"****** - SetUpProgressBarProcessing(3); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginSuccessful").ToString(); - MainWindowsShowInfo(currentStatus); - } - - //检测root权限 5--7 - functionResult = RootAuthorityDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测是否已安装代理 8--10 - functionResult = SoftInstalledIsNoYes(client, "trojan", @"/usr/local/bin/trojan"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测关闭Selinux及系统组件是否齐全(apt-get/yum/dnf/systemctl)11--30 - //安装依赖软件,检测端口,防火墙开启端口 - functionResult = ShutDownSelinuxAndSysComponentsDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - - //检测是否为64位系统 - sshShellCommand = @"uname -m"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - string resultCmd = currentShellCommandResult; - if (resultCmd.Contains("x86_64") == false) - { - //******"请在x86_64系统中安装Trojan" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_PleaseInstallSoftAtX64").ToString() + "NaiveProxy......"); - //****** "系统环境不满足要求,安装失败!!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_MissingSystemComponents").ToString(); - MainWindowsShowInfo(currentStatus); - return; - } - - //检测域名是否解析到当前IP上 34---36 - functionResult = DomainResolutionCurrentIPDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //下载安装脚本安装 37-40 - functionResult = ProxySoftInstall(client, @"Trojan", @"https://raw.githubusercontent.com/trojan-gfw/trojan-quickstart/master/trojan-quickstart.sh"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - ////****** "正在安装Trojan......" ****** - //SetUpProgressBarProcessing(37); - //currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstallSoft").ToString() + "Trojan......"; - //MainWindowsShowInfo(currentStatus); - - //sshShellCommand = $"curl -o /tmp/trojan-quickstart.sh https://raw.githubusercontent.com/trojan-gfw/trojan-quickstart/master/trojan-quickstart.sh"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //sshShellCommand = @"yes | bash /tmp/trojan-quickstart.sh"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //sshShellCommand = @"rm -f /tmp/trojan-quickstart.sh"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //程序是否安装成功检测并设置开机启动 41--43 - functionResult = SoftInstalledSuccessOrFail(client, "trojan", @"/usr/local/bin/trojan"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //****** "安装完毕,上传配置文件......" ****** - SetUpProgressBarProcessing(44); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadSoftConfig").ToString(); - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"mv /usr/local/etc/trojan/config.json /usr/local/etc/trojan/config.json.1"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - string serverConfig = $"{pwdir}" + @"TemplateConfg\trojan\trojan_server_config.json"; //服务端配置文件 - string upLoadPath = @"/usr/local/etc/trojan/config.json"; //服务端文件位置 - - //生成服务端配置 - using (StreamReader reader = File.OpenText(serverConfig)) - { - JObject serverJson = (JObject)JToken.ReadFrom(new JsonTextReader(reader)); - //设置密码 - serverJson["password"][0] = ReceiveConfigurationParameters[2]; - - //设置Caddy随机监听的端口,用于Trojan-go,Trojan,V2Ray vless TLS - //Random random = new Random(); - randomCaddyListenPort = GetRandomPort(); - - //设置转发到Caddy的随机监听端口 - serverJson["remote_port"] = randomCaddyListenPort; - - using (StreamWriter sw = new StreamWriter(@"config.json")) - { - sw.Write(serverJson.ToString()); - } - } - UploadConfig(connectionInfo, @"config.json", upLoadPath); - - File.Delete(@"config.json"); - - //acme.sh安装与申请证书 51--57 - functionResult = AcmeShInstall(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //****** "安装证书到Trojan......" ****** - SetUpProgressBarProcessing(58); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_IntallCertToSoft").ToString() + "Trojan......"; - MainWindowsShowInfo(currentStatus); - - sshShellCommand = $"/root/.acme.sh/acme.sh --installcert -d {ReceiveConfigurationParameters[4]} --certpath /usr/local/etc/trojan/trojan_ssl.crt --keypath /usr/local/etc/trojan/trojan_ssl.key --capath /usr/local/etc/trojan/trojan_ssl.crt --reloadcmd \"systemctl restart trojan\""; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"if [ ! -f ""/usr/local/etc/trojan/trojan_ssl.key"" ]; then echo ""0""; else echo ""1""; fi | head -n 1"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - if (currentShellCommandResult.Contains("1") == true) - { - //****** "证书成功安装到Trojan!" ****** - SetUpProgressBarProcessing(60); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_IntallCertToSoftOK").ToString() + "Trojan!"; - MainWindowsShowInfo(currentStatus); - } - else - { - //****** "证书安装到Trojan失败,原因未知,可以向开发者提问!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_IntallCertToSoftFail").ToString() + - "Trojan" + - Application.Current.FindResource("DisplayInstallInfo_InstallCertFailAsk").ToString(); - MainWindowsShowInfo(currentStatus); - return; - } - - //设置证书权限 - sshShellCommand = @"chmod 644 /usr/local/etc/trojan/trojan_ssl.key"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //Caddy安装 61--66 - functionResult = CaddyInstall(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //****** "上传Caddy配置文件......" ****** - SetUpProgressBarProcessing(67); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadCaddyConfig").ToString(); - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"mv /etc/caddy/Caddyfile /etc/caddy/Caddyfile.bak"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - string caddyConfig = $"{pwdir}" + @"TemplateConfg\trojan\trojan.caddyfile"; - upLoadPath = @"/etc/caddy/Caddyfile"; - - UploadConfig(connectionInfo, caddyConfig, upLoadPath); - - //设置Caddy配置文件 - functionResult = SetCaddyfile(client, upLoadPath); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //****** "Caddy配置文件上传成功,OK!" ****** - SetUpProgressBarProcessing(70); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadCaddyConfigOK").ToString(); - MainWindowsShowInfo(currentStatus); - - //程序启动检测Caddy - functionResult = SoftStartDetect(client, "caddy", @"/usr/bin/caddy"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //程序启动检测Trojan - functionResult = SoftStartDetect(client, "trojan", @"/usr/local/bin/trojan"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测BBR,满足条件并启动 90--95 - functionResult = DetectBBRandEnable(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - client.Disconnect();//断开服务器ssh连接 - - //****** "生成客户端配置......" ****** - SetUpProgressBarProcessing(96); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_GenerateClientConfig").ToString(); - MainWindowsShowInfo(currentStatus); - if (!Directory.Exists("trojan_config"))//如果不存在就创建file文件夹      - { - Directory.CreateDirectory("trojan_config");//创建该文件夹   - } - - string clientConfig = $"{pwdir}" + @"TemplateConfg\trojan\trojan_client_config.json"; //生成的客户端配置文件 - using (StreamReader reader = File.OpenText(clientConfig)) - { - JObject clientJson = (JObject)JToken.ReadFrom(new JsonTextReader(reader)); - - clientJson["remote_addr"] = ReceiveConfigurationParameters[4]; - clientJson["remote_port"] = int.Parse(ReceiveConfigurationParameters[1]); - clientJson["password"][0] = ReceiveConfigurationParameters[2]; - - using (StreamWriter sw = new StreamWriter(@"trojan_config\config.json")) - { - sw.Write(clientJson.ToString()); - } - } - - //****** "Trojan安装成功,祝你玩的愉快!!" ****** - SetUpProgressBarProcessing(100); - currentStatus = "Trojan" + Application.Current.FindResource("DisplayInstallInfo_ProxyInstalledOK").ToString(); - MainWindowsShowInfo(currentStatus); - - //显示服务端连接参数 - proxyType = "Trojan"; - - ResultClientInformation resultClientInformation = new ResultClientInformation(); - resultClientInformation.ShowDialog(); - return; - } - } - catch (Exception ex1)//例外处理 - #region 例外处理 - { - ProcessException(ex1.Message); - - //****** "安装失败!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - #endregion - - } - - //检测升级远程主机Trojan版本传递参数 - private void ButtonUpdateTrojan_Click(object sender, RoutedEventArgs e) - { - ConnectionInfo connectionInfo = GenerateConnectionInfo(); - if (connectionInfo == null) - { - //****** "远程主机连接信息有误,请检查!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostConnection").ToString()); - return; - } - installationDegree = 0; - TextBoxMonitorCommandResults.Text = ""; - Thread thread = new Thread(() => UpdateTojan(connectionInfo)); - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - } - - //升级Trojan主程序 - private void UpdateTojan(ConnectionInfo connectionInfo) - { - functionResult = true; - onlyIpv6 = false; - getApt = false; - getDnf = false; - getYum = false; - - //******"正在登录远程主机......"****** - SetUpProgressBarProcessing(1); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_Login").ToString(); - MainWindowsShowInfo(currentStatus); - - try - { - #region 主机指纹,暂未启用 - //byte[] expectedFingerPrint = new byte[] { - // 0x66, 0x31, 0xaf, 0x00, 0x54, 0xb9, 0x87, 0x31, - // 0xff, 0x58, 0x1c, 0x31, 0xb1, 0xa2, 0x4c, 0x6b - // }; - #endregion - using (var client = new SshClient(connectionInfo)) - - { - #region ssh登录验证主机指纹代码块,暂未启用 - // client.HostKeyReceived += (sender, e) => - // { - // if (expectedFingerPrint.Length == e.FingerPrint.Length) - // { - // for (var i = 0; i < expectedFingerPrint.Length; i++) - // { - // if (expectedFingerPrint[i] != e.FingerPrint[i]) - // { - // e.CanTrust = false; - // break; - // } - // } - // } - // else - // { - // e.CanTrust = false; - // } - // }; - #endregion - - client.Connect(); - if (client.IsConnected == true) - { - //******"主机登录成功"****** - SetUpProgressBarProcessing(3); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginSuccessful").ToString(); - MainWindowsShowInfo(currentStatus); - } - - //检测root权限 5--7 - functionResult = RootAuthorityDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - - //******"检测系统是否已经安装Trojan......"****** - SetUpProgressBarProcessing(20); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestExistSoft").ToString() + "Trojan......"; - MainWindowsShowInfo(currentStatus); - - - //string cmdTestTrojanInstalled = @"find / -name trojan"; - //string resultCmdTestTrojanInstalled = client.RunCommand(cmdTestTrojanInstalled).Result; - //sshShellCommand = @"find / -name trojan"; - //sshShellCommand = @"if [[ -f /usr/local/bin/trojan ]];then echo '1';else echo '0'; fi"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //if (currentShellCommandResult.Contains("/usr/local/bin/trojan") == false) - //if (currentShellCommandResult.Trim().Equals("0") == true) - functionResult = FileCheckExists(client, @"/usr/local/bin/trojan"); - if (functionResult == false) - { - //******"退出!原因:远程主机未安装Trojan"****** - currentStatus = Application.Current.FindResource("MessageBoxShow_ErrorUpgradeSoftNotInstall").ToString() + "Trojan!"; - MainWindowsShowInfo(currentStatus); - MessageBox.Show(currentStatus); - client.Disconnect(); - return; - - } - - SetUpProgressBarProcessing(40); - - //获取当前安装的版本 - //string sshcmd = @"echo ""$(/usr/local/bin/trojan -v 2>&1)"" | head -n 1 | cut -d "" "" -f4"; - //string trojanCurrentVersion = client.RunCommand(sshcmd).Result;//不含字母v - sshShellCommand = @"echo ""$(/usr/local/bin/trojan -v 2>&1)"" | head -n 1 | cut -d "" "" -f4"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - string trojanCurrentVersion = currentShellCommandResult;//不含字母v - - - //sshcmd = @"curl -fsSL https://api.github.com/repos/trojan-gfw/trojan/releases/latest | grep tag_name | sed -E 's/.*""v(.*)"".*/\1/'"; - //获取最新版本 - - sshShellCommand = @"curl -fsSL https://api.github.com/repos/trojan-gfw/trojan/releases/latest | grep tag_name | sed -E 's/.*""v(.*)"".*/\1/'"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - string trojanNewVersion = currentShellCommandResult;//不含字母v - - if (trojanNewVersion.Equals(trojanCurrentVersion) == false) - { - MessageBoxResult messageBoxResult = MessageBox.Show( - //****** "远程主机当前版本为:v" ****** - Application.Current.FindResource("DisplayInstallInfo_CurrentVersion").ToString() + - $"{trojanCurrentVersion}\n" + - //****** "最新版本为:" ****** - Application.Current.FindResource("DisplayInstallInfo_NewVersion").ToString() + - $"{trojanNewVersion}\n" + - //****** "是否升级为最新版本?" ****** - Application.Current.FindResource("DisplayInstallInfo_IsOrNoUpgradeNewVersion").ToString(), "", MessageBoxButton.YesNo, MessageBoxImage.Question); - if (messageBoxResult == MessageBoxResult.Yes) - { - //****** "正在升级到最新版本......" ****** - SetUpProgressBarProcessing(60); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartUpgradeNewVersion").ToString(); - MainWindowsShowInfo(currentStatus); - - //****** "备份Trojan配置文件......" ****** - SetUpProgressBarProcessing(80); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_BackTrojanConfig").ToString(); - MainWindowsShowInfo(currentStatus); - - //string sshcmd = @"mv /usr/local/etc/trojan/config.json /usr/local/etc/trojan/config.json.bak"; - //client.RunCommand(sshcmd); - sshShellCommand = @"mv /usr/local/etc/trojan/config.json /usr/local/etc/trojan/config.json.bak"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //升级Trojan主程序 - //client.RunCommand("curl -o /tmp/trojan-quickstart.sh https://raw.githubusercontent.com/trojan-gfw/trojan-quickstart/master/trojan-quickstart.sh"); - //client.RunCommand("yes | bash /tmp/trojan-quickstart.sh"); - - saveShellScriptFileName = GenerateRandomScriptFileName(GenerateRandomStr(10)); - - sshShellCommand = $"curl -o {saveShellScriptFileName} https://raw.githubusercontent.com/trojan-gfw/trojan-quickstart/master/trojan-quickstart.sh"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - functionResult = FileCheckExists(client, $"{saveShellScriptFileName}"); - if (functionResult == false) - { - //***文件下载失败!*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DownloadScriptFailed").ToString(); - MainWindowsShowInfo(currentStatus); - return; - } - - sshShellCommand = $"yes | bash {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"rm -f {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //sshcmd = @"echo ""$(/usr/local/bin/trojan -v 2>&1)"" | head -n 1 | cut -d "" "" -f4"; - sshShellCommand = @"echo ""$(/usr/local/bin/trojan -v 2>&1)"" | head -n 1 | cut -d "" "" -f4"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - trojanCurrentVersion = currentShellCommandResult;//不含字母v - //trojanCurrentVersion = client.RunCommand(sshcmd).Result;//不含字母v - if (trojanNewVersion.Equals(trojanCurrentVersion) == true) - { - //****** "恢复Trojan配置文件......" ****** - SetUpProgressBarProcessing(90); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_RestoreTrojanConfig").ToString(); - MainWindowsShowInfo(currentStatus); - - //sshcmd = @"rm -f /usr/local/etc/trojan/config.json"; - //client.RunCommand(sshcmd); - sshShellCommand = @"rm -f /usr/local/etc/trojan/config.json"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //sshcmd = @"mv /usr/local/etc/trojan/config.json.bak /usr/local/etc/trojan/config.json"; - //client.RunCommand(sshcmd); - sshShellCommand = @"mv /usr/local/etc/trojan/config.json.bak /usr/local/etc/trojan/config.json"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //****** "升级成功!当前已是最新版本!" ****** - SetUpProgressBarProcessing(100); - MessageBox.Show(Application.Current.FindResource("DisplayInstallInfo_UpgradeNewVersionOK").ToString()); - //****** "升级成功!当前已是最新版本!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UpgradeNewVersionOK").ToString(); - MainWindowsShowInfo(currentStatus); - - } - else - { - //****** "升级失败,原因未知,请向开发者提问!" ****** - MessageBox.Show(Application.Current.FindResource("DisplayInstallInfo_UpgradeNewVersionFail").ToString()); - //****** "升级失败,原因未知,请向开发者提问!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UpgradeNewVersionFail").ToString(); - MainWindowsShowInfo(currentStatus); - } - } - - else - { - //****** "升级取消,退出!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UpgradeVersionCancel").ToString(); - MainWindowsShowInfo(currentStatus); - - client.Disconnect(); - return; - } - } - else - { - //****** "远程主机当前已是最新版本:" ****** - SetUpProgressBarProcessing(100); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_IsNewVersion").ToString() + - $"{trojanNewVersion}\n" + - //****** "无需升级!退出!" ****** - Application.Current.FindResource("DisplayInstallInfo_NotUpgradeVersion").ToString(); - MessageBox.Show(currentStatus); - MainWindowsShowInfo(currentStatus); - } - - client.Disconnect(); - return; - } - } - catch (Exception ex1)//例外处理 - #region 例外处理 - { - ProcessException(ex1.Message); - //****** "主机登录失败!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - #endregion - - } - - //更新Trojan的密码 - private void ButtonTrojanPassword_Click(object sender, RoutedEventArgs e) - { - TextBoxTrojanPassword.Text = RandomUUID(); - } - #endregion - - #region NaiveProxy相关 - - //NaiveProxy一键安装开始传递参数 - private void ButtonNavieSetUp_Click(object sender, RoutedEventArgs e) - { - //if (string.IsNullOrEmpty(PreTrim(TextBoxNaiveHostDomain.Text)) == true) - //{ - // //****** "域名不能为空,请检查相关参数设置!" ****** - // MessageBox.Show(Application.Current.FindResource("MessageBoxShow_DomainNotEmpty").ToString()); - // return; - //} - - ConnectionInfo connectionInfo = GenerateConnectionInfo(); - if (connectionInfo == null) - { - //****** "远程主机连接信息有误,请检查!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostConnection").ToString()); - return; - } - //清空参数空间 - for (int i = 0; i != ReceiveConfigurationParameters.Length; i++) - - { - ReceiveConfigurationParameters[i] = ""; - } - - bool preDomainMask = ClassModel.PreDomainMask(TextBoxNaiveSites.Text); - bool domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxNaiveHostDomain.Text); - if (domainNotEmpty == false || preDomainMask == false) - { - return; - } - //传递参数 - ReceiveConfigurationParameters[4] = PreTrim(TextBoxNaiveHostDomain.Text);//传递域名 - ReceiveConfigurationParameters[1] = "443";//传递端口 - ReceiveConfigurationParameters[3] = TextBoxNaiveUser.Text;//传递用户名 - ReceiveConfigurationParameters[2] = TextBoxNaivePassword.Text;//传递密码 - ReceiveConfigurationParameters[7] = ClassModel.DisguiseURLprocessing(PreTrim(TextBoxNaiveSites.Text));//传递伪装网站 - - //启动布署进程 - installationDegree = 0; - TextBoxMonitorCommandResults.Text = ""; - Thread thread = new Thread(() => StartSetUpNaive(connectionInfo)); - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - } - - //登录远程主机布署NaiveProxy程序 - private void StartSetUpNaive(ConnectionInfo connectionInfo) - { - functionResult = true; - onlyIpv6 = false; - getApt = false; - getDnf = false; - getYum = false; - - //******"正在登录远程主机......"****** - SetUpProgressBarProcessing(1); - string currentStatus = Application.Current.FindResource("DisplayInstallInfo_Login").ToString(); - MainWindowsShowInfo(currentStatus); - - try - { - #region 主机指纹,暂未启用 - //byte[] expectedFingerPrint = new byte[] { - // 0x66, 0x31, 0xaf, 0x00, 0x54, 0xb9, 0x87, 0x31, - // 0xff, 0x58, 0x1c, 0x31, 0xb1, 0xa2, 0x4c, 0x6b - // }; - #endregion - using (var client = new SshClient(connectionInfo)) - - { - #region ssh登录验证主机指纹代码块,暂未启用 - // client.HostKeyReceived += (sender, e) => - // { - // if (expectedFingerPrint.Length == e.FingerPrint.Length) - // { - // for (var i = 0; i < expectedFingerPrint.Length; i++) - // { - // if (expectedFingerPrint[i] != e.FingerPrint[i]) - // { - // e.CanTrust = false; - // break; - // } - // } - // } - // else - // { - // e.CanTrust = false; - // } - // }; - #endregion - - client.Connect(); - if (client.IsConnected == true) - { - //******"主机登录成功"****** - SetUpProgressBarProcessing(3); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginSuccessful").ToString(); - MainWindowsShowInfo(currentStatus); - - } - - //检测root权限 5--7 - functionResult = RootAuthorityDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测是否已安装代理 8--10 - functionResult = SoftInstalledIsNoYes(client, "caddy", @"/usr/bin/caddy"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测关闭Selinux及系统组件是否齐全(apt-get/yum/dnf/systemctl)11--30 - //安装依赖软件,检测端口,防火墙开启端口 - functionResult = ShutDownSelinuxAndSysComponentsDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测域名是否解析到当前IP上 34---36 - functionResult = DomainResolutionCurrentIPDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //安装代理程序 37--40 - functionResult = ProxySoftInstall(client, @"NaiveProxy", @"https://raw.githubusercontent.com/proxysu/shellscript/master/Caddy-Naive/caddy-naive-install.sh"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - ////****** "系统环境检测完毕,符合安装要求,开始布署......" ****** - //SetUpProgressBarProcessing(60); - //currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstalling").ToString(); - //MainWindowsShowInfo(currentStatus); - - ////Caddy安装与检测安装是否成功 61--66 - //functionResult = CaddyInstall(client); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - - ////使用带插件的Caddy替换 - ////****** "正在为NaiveProxy升级服务端!" ****** - ////SetUpProgressBarProcessing(76); - //currentStatus = Application.Current.FindResource("DisplayInstallInfo_UpgradeNaiveProxy").ToString(); - //MainWindowsShowInfo(currentStatus); - - //sshShellCommand = $"curl -o /tmp/caddy.zip https://raw.githubusercontent.com/proxysu/Resources/master/Caddy2/caddy2.zip"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //functionResult = FileCheckExists(client, @"/tmp/caddy.zip"); - //if (functionResult == false) - //{ - // //***文件下载失败!*** - // currentStatus = Application.Current.FindResource("DisplayInstallInfo_DownloadScriptFailed").ToString(); - // MainWindowsShowInfo(currentStatus); - // return; - //} - //sshShellCommand = @"yes | unzip -o /tmp/caddy.zip"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //sshShellCommand = @"chmod +x ./caddy"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //sshShellCommand = @"systemctl stop caddy;rm -f /usr/bin/caddy"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //sshShellCommand = @"cp caddy /usr/bin/"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //sshShellCommand = @"rm -f /tmp/caddy.zip caddy"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - ////****** "升级完毕,OK!" ****** - ////SetUpProgressBarProcessing(79); - //currentStatus = Application.Current.FindResource("DisplayInstallInfo_UpgradeNaiveProxyOK").ToString(); - //MainWindowsShowInfo(currentStatus); - - //****** "上传Caddy配置文件......" ****** - SetUpProgressBarProcessing(67); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadCaddyConfig").ToString(); - MainWindowsShowInfo(currentStatus); - - //生成服务端配置 - string caddyConfig = $"{pwdir}" + @"TemplateConfg\naive\naive_server.caddyfile"; - string upLoadPath = @"/etc/caddy/Caddyfile"; - UploadConfig(connectionInfo, caddyConfig, upLoadPath); - //$"sed -i 's/##domain##/{ReceiveConfigurationParameters[4]}/' {upLoadPath}" - //$"sed -i 's/##basicauth##/basicauth {ReceiveConfigurationParameters[3]} {ReceiveConfigurationParameters[2]}/' {upLoadPath}" - - //设置Caddy配置文件 - functionResult = SetCaddyfile(client, upLoadPath); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - sshShellCommand = $"sed -i 's/##basicauth##/basic_auth {ReceiveConfigurationParameters[3]} {ReceiveConfigurationParameters[2]}/' {upLoadPath}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"sed -i 's/file_server/#file_server/' {upLoadPath}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //string caddyConfig = $"{pwdir}" + @"TemplateConfg\naive\naive_server_config.json"; - //using (StreamReader reader = File.OpenText(caddyConfig)) - //{ - // JObject serverJson = (JObject)JToken.ReadFrom(new JsonTextReader(reader)); - // serverJson["apps"]["http"]["servers"]["srv0"]["routes"][0]["handle"][0]["auth_user"] = ReceiveConfigurationParameters[3];//----用户名 - // serverJson["apps"]["http"]["servers"]["srv0"]["routes"][0]["handle"][0]["auth_pass"] = ReceiveConfigurationParameters[2]; //----密码 - - // serverJson["apps"]["http"]["servers"]["srv0"]["routes"][1]["match"][0]["host"][0] = ReceiveConfigurationParameters[4]; //----域名 - - // serverJson["apps"]["http"]["servers"]["srv0"]["tls_connection_policies"][0]["match"]["sni"][0] = ReceiveConfigurationParameters[4]; //----域名 - - // serverJson["apps"]["tls"]["automation"]["policies"][0]["subjects"][0] = ReceiveConfigurationParameters[4]; //-----域名 - // serverJson["apps"]["tls"]["automation"]["policies"][0]["issuer"]["email"] = $"user@{ReceiveConfigurationParameters[4]}"; //-----邮箱 - // //保存配置文件 - // using (StreamWriter sw = new StreamWriter(@"config.json")) - // { - // sw.Write(serverJson.ToString()); - // } - //} - //string upLoadPath = @"/etc/caddy/config.json"; - //UploadConfig(connectionInfo, @"config.json", upLoadPath); - - //File.Delete(@"config.json"); - - //****** Caddy配置文件上传成功,OK! ****** - SetUpProgressBarProcessing(70); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadCaddyConfigOK").ToString(); - MainWindowsShowInfo(currentStatus); - - //sshShellCommand = @"sed -i 's/Caddyfile/config.json/' /lib/systemd/system/caddy.service"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //sshShellCommand = @"systemctl daemon-reload"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //程序启动检测Caddy - functionResult = SoftStartDetect(client, "caddy", @"/usr/bin/caddy"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - ////设置伪装网站 - //if (String.IsNullOrEmpty(ReceiveConfigurationParameters[7]) == false) - //{ - // sshCmd = $"sed -i 's/##sites##/proxy \\/ {ReceiveConfigurationParameters[7]}/' {upLoadPath}"; - // //MessageBox.Show(sshCmd); - // client.RunCommand(sshCmd); - //} - //Thread.Sleep(2000); - - //****** "正在优化网络参数......" ****** - SetUpProgressBarProcessing(80); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_OptimizeNetwork").ToString(); - MainWindowsShowInfo(currentStatus); - - //优化网络参数 - sshShellCommand = @"bash -c 'echo ""fs.file-max = 51200"" >> /etc/sysctl.conf'"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"bash -c 'echo ""net.core.rmem_max = 67108864"" >> /etc/sysctl.conf'"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"bash -c 'echo ""net.core.wmem_max = 67108864"" >> /etc/sysctl.conf'"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"bash -c 'echo ""net.core.rmem_default = 65536"" >> /etc/sysctl.conf'"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"bash -c 'echo ""net.core.wmem_default = 65536"" >> /etc/sysctl.conf'"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"bash -c 'echo ""net.core.netdev_max_backlog = 4096"" >> /etc/sysctl.conf'"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"bash -c 'echo ""net.core.somaxconn = 4096"" >> /etc/sysctl.conf'"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"bash -c 'echo ""net.ipv4.tcp_syncookies = 1"" >> /etc/sysctl.conf'"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"bash -c 'echo ""net.ipv4.tcp_tw_reuse = 1"" >> /etc/sysctl.conf'"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"bash -c 'echo ""net.ipv4.tcp_tw_recycle = 0"" >> /etc/sysctl.conf'"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"bash -c 'echo ""net.ipv4.tcp_fin_timeout = 30"" >> /etc/sysctl.conf'"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"bash -c 'echo ""net.ipv4.tcp_keepalive_time = 1200"" >> /etc/sysctl.conf'"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"bash -c 'echo ""net.ipv4.ip_local_port_range = 10000 65000"" >> /etc/sysctl.conf'"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"bash -c 'echo ""net.ipv4.tcp_max_syn_backlog = 4096"" >> /etc/sysctl.conf'"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"bash -c 'echo ""net.ipv4.tcp_max_tw_buckets = 5000"" >> /etc/sysctl.conf'"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"bash -c 'echo ""net.ipv4.tcp_rmem = 4096 87380 67108864"" >> /etc/sysctl.conf'"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"bash -c 'echo ""net.ipv4.tcp_wmem = 4096 65536 67108864"" >> /etc/sysctl.conf'"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"bash -c 'echo ""net.ipv4.tcp_mtu_probing = 1"" >> /etc/sysctl.conf'"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"sysctl -p"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //****** "优化网络参数,OK!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_OptimizeNetworkOK").ToString(); ; - MainWindowsShowInfo(currentStatus); - - //检测BBR,满足条件并启动 90--95 - functionResult = DetectBBRandEnable(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - client.Disconnect();//断开服务器ssh连接 - - //****** "生成客户端配置......" ****** - SetUpProgressBarProcessing(96); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_GenerateClientConfig").ToString(); - MainWindowsShowInfo(currentStatus); - - if (!Directory.Exists("naive_config"))//如果不存在就创建file文件夹      - { - Directory.CreateDirectory("naive_config");//创建该文件夹   - } - - string clientConfig = $"{pwdir}" + @"TemplateConfg\naive\naive_client_config.json"; //生成的客户端配置文件 - using (StreamReader reader = File.OpenText(clientConfig)) - { - JObject clientJson = (JObject)JToken.ReadFrom(new JsonTextReader(reader)); - - clientJson["proxy"] = $"https://{ReceiveConfigurationParameters[3]}:{ReceiveConfigurationParameters[2]}@{ReceiveConfigurationParameters[4]}"; - using (StreamWriter sw = new StreamWriter(@"naive_config\config.json")) - { - sw.Write(clientJson.ToString()); - } - } - - - //****** "NaiveProxy安装成功,祝你玩的愉快!!" ****** - SetUpProgressBarProcessing(100); - currentStatus = "NaiveProxy" + Application.Current.FindResource("DisplayInstallInfo_ProxyInstalledOK").ToString(); - MainWindowsShowInfo(currentStatus); - - //显示服务端连接参数 - proxyType = "NaiveProxy"; - ResultClientInformation resultClientInformation = new ResultClientInformation(); - resultClientInformation.ShowDialog(); - return; - } - } - catch (Exception ex1)//例外处理 - #region 例外处理 - { - ProcessException(ex1.Message); - - //****** "安装失败!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - #endregion - - } - - //更新NaiveProxy的密码 - private void ButtonNaivePassword_Click(object sender, RoutedEventArgs e) - { - TextBoxNaivePassword.Text = RandomUUID(); - } - - //生成随机UUID - private string RandomUUID() - { - Guid uuid = Guid.NewGuid(); - //TextBoxNaivePassword.Text = uuid.ToString(); - return uuid.ToString(); - } - - //NaiveProxy产生随机用户名 - private string RandomUserName() - { - 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; - // TextBoxPath.Text = $"/{path}"; - //MessageBox.Show(path); - } - - //NaiveProxy更改用户名,随机方式 - private void ButtonNaiveUser_Click(object sender, RoutedEventArgs e) - { - TextBoxNaiveUser.Text = RandomUserName(); - } - - #endregion - - #region SSR+TLS+Caddy相关 - - //SSR参数传递 - private void ButtonSSRSetUp_Click(object sender, RoutedEventArgs e) - { - ConnectionInfo connectionInfo = GenerateConnectionInfo(); - if (connectionInfo == null) - { - //****** "远程主机连接信息有误,请检查!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostConnection").ToString()); - return; - } - //清空参数空间 - for (int i = 0; i != ReceiveConfigurationParameters.Length; i++) - - { - ReceiveConfigurationParameters[i] = ""; - } - - bool domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxSSRHostDomain.Text); - bool preDomainMask = ClassModel.PreDomainMask(TextBoxSSRSites.Text); - if (domainNotEmpty == false || preDomainMask == false) - { - return; - } - //if (string.IsNullOrEmpty(PreTrim(TextBoxSSRHostDomain.Text)) == true) - //{ - // //****** "域名不能为空,请检查相关参数设置!" ****** - // MessageBox.Show(Application.Current.FindResource("MessageBoxShow_DomainNotEmpty").ToString()); - // return; - //} - - //传递域名 - ReceiveConfigurationParameters[4] = PreTrim(TextBoxSSRHostDomain.Text); - //传递伪装网站 - ReceiveConfigurationParameters[7] = ClassModel.DisguiseURLprocessing(PreTrim(TextBoxSSRSites.Text)); - - //传递服务端口 - ReceiveConfigurationParameters[1] = "443"; - //传递密码(uuid) - ReceiveConfigurationParameters[2] = TextBoxSSRPassword.Text.ToString(); - - - installationDegree = 0; - TextBoxMonitorCommandResults.Text = ""; - Thread thread = new Thread(() => StartSetUpSSR(connectionInfo)); - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - } - - //登录远程主机布署SSR+TLS+Caddy程序 - private void StartSetUpSSR(ConnectionInfo connectionInfo) - { - functionResult = true; - onlyIpv6 = false; - getApt = false; - getDnf = false; - getYum = false; - - //******"正在登录远程主机......"****** - SetUpProgressBarProcessing(1); - string currentStatus = Application.Current.FindResource("DisplayInstallInfo_Login").ToString(); - MainWindowsShowInfo(currentStatus); - - try - { - #region 主机指纹,暂未启用 - //byte[] expectedFingerPrint = new byte[] { - // 0x66, 0x31, 0xaf, 0x00, 0x54, 0xb9, 0x87, 0x31, - // 0xff, 0x58, 0x1c, 0x31, 0xb1, 0xa2, 0x4c, 0x6b - // }; - #endregion - using (var client = new SshClient(connectionInfo)) - - { - #region ssh登录验证主机指纹代码块,暂未启用 - // client.HostKeyReceived += (sender, e) => - // { - // if (expectedFingerPrint.Length == e.FingerPrint.Length) - // { - // for (var i = 0; i < expectedFingerPrint.Length; i++) - // { - // if (expectedFingerPrint[i] != e.FingerPrint[i]) - // { - // e.CanTrust = false; - // break; - // } - // } - // } - // else - // { - // e.CanTrust = false; - // } - // }; - #endregion - - client.Connect(); - if (client.IsConnected == true) - { - //******"主机登录成功"****** - SetUpProgressBarProcessing(3); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginSuccessful").ToString(); - MainWindowsShowInfo(currentStatus); - } - - //检测root权限 5--7 - functionResult = RootAuthorityDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测是否已安装代理 8--10 - functionResult = SoftInstalledIsNoYes(client, "server.py", @"/usr/local/shadowsocks/server.py"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测关闭Selinux及系统组件是否齐全(apt-get/yum/dnf/systemctl)11--30 - //安装依赖软件,检测端口,防火墙开启端口 - functionResult = ShutDownSelinuxAndSysComponentsDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测域名是否解析到当前IP上 34---36 - functionResult = DomainResolutionCurrentIPDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //下载脚本安装SSR 37--40 - functionResult = ProxySoftInstall(client, @"SSR", @"https://raw.githubusercontent.com/proxysu/shellscript/master/ssr/ssr.sh"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - ////****** "系统环境检测完毕,符合安装要求,开始布署......" ****** - //SetUpProgressBarProcessing(37); - //currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstalling").ToString(); - //MainWindowsShowInfo(currentStatus); - - ////下载安装脚本安装 - ////****** "正在安装SSR......" ****** - //SetUpProgressBarProcessing(38); - //currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstallSoft").ToString() + "SSR......"; - //MainWindowsShowInfo(currentStatus); - - //sshShellCommand = $"curl -o /tmp/ssr.sh https://raw.githubusercontent.com/proxysu/shellscript/master/ssr/ssr.sh"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //sshShellCommand = @"yes | bash /tmp/ssr.sh"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //sshShellCommand = @"rm -f /tmp/ssr.sh"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //程序是否安装成功检测并设置开机启动 41--43 - functionResult = SoftInstalledSuccessOrFail(client, "server.py", @"/usr/local/shadowsocks/server.py"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - - //****** "安装完毕,上传配置文件......" ****** - SetUpProgressBarProcessing(44); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadSoftConfig").ToString(); - MainWindowsShowInfo(currentStatus); - - //生成服务端配置 - string upLoadPath = @"/etc/shadowsocks.json"; - - //设置指向Caddy监听的随机端口 - randomCaddyListenPort = GetRandomPort(); - string randomSSRListenPortStr = randomCaddyListenPort.ToString(); - - sshShellCommand = $"sed -i 's/8800/{randomSSRListenPortStr}/' {upLoadPath}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //设置密码 - sshShellCommand = $"sed -i 's/##password##/{ReceiveConfigurationParameters[2]}/' {upLoadPath}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //Caddy安装与检测安装是否成功 61--66 - functionResult = CaddyInstall(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //****** "上传Caddy配置文件......" ****** - SetUpProgressBarProcessing(67); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadCaddyConfig").ToString(); - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"mv /etc/caddy/Caddyfile /etc/caddy/Caddyfile.bak"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - string caddyConfig = $"{pwdir}" + @"TemplateConfg\ssr\ssr_tls.caddyfile"; - upLoadPath = @"/etc/caddy/Caddyfile"; - - UploadConfig(connectionInfo, caddyConfig, upLoadPath); - - functionResult = SetCaddyfile(client, @"/etc/caddy/Caddyfile"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //****** "Caddy配置文件上传成功,OK!" ****** - SetUpProgressBarProcessing(70); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadCaddyConfigOK").ToString(); - MainWindowsShowInfo(currentStatus); - - //程序启动检测Caddy - functionResult = SoftStartDetect(client, "caddy", @"/usr/bin/caddy"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //程序启动检测SSR - functionResult = SoftStartDetect(client, "ssr", @"/usr/bin/ssr"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测BBR,满足条件并启动 90--95 - functionResult = DetectBBRandEnable(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - client.Disconnect();//断开服务器ssh连接 - - //****** "生成客户端配置......" ****** - SetUpProgressBarProcessing(96); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_GenerateClientConfig").ToString(); - MainWindowsShowInfo(currentStatus); - - if (!Directory.Exists("ssr_config"))//如果不存在就创建file文件夹      - { - Directory.CreateDirectory("ssr_config");//创建该文件夹   - } - - - //****** "SSR+TLS+Caddy安装成功,祝你玩的愉快!!" ****** - SetUpProgressBarProcessing(100); - currentStatus = "SSR+TLS+Caddy" + Application.Current.FindResource("DisplayInstallInfo_ProxyInstalledOK").ToString(); - MainWindowsShowInfo(currentStatus); - - //显示服务端连接参数 - proxyType = "SSR"; - - ResultClientInformation resultClientInformation = new ResultClientInformation(); - resultClientInformation.ShowDialog(); - return; - } - } - catch (Exception ex1)//例外处理 - #region 例外处理 - { - ProcessException(ex1.Message); - - //****** "安装失败!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - #endregion - - } - - //更新SSR的密码 - private void ButtonSSRPassword_Click(object sender, RoutedEventArgs e) - { - TextBoxSSRPassword.Text = RandomUUID(); - } - - - #endregion - - #region SS相关 - - //打开SS Plugin设置窗口 - private void ButtonTemplateConfigurationSS_Click(object sender, RoutedEventArgs e) - { - //清空初始化模板参数 - for (int i = 0; i != ReceiveConfigurationParameters.Length; i++) - - { - ReceiveConfigurationParameters[i] = ""; - } - SSpluginWindow windowTemplateConfigurationSS = new SSpluginWindow(); - windowTemplateConfigurationSS.Closed += windowTemplateConfigurationSSClosed; - windowTemplateConfigurationSS.ShowDialog(); - } - //SS Plugin设置窗口关闭后,触发事件,将所选的方案与其参数显示在UI上 - private void windowTemplateConfigurationSSClosed(object sender, System.EventArgs e) - { - if (String.IsNullOrEmpty(ReceiveConfigurationParameters[0]) == true) - { - //显示"未选择方案!" - TextBlockCurrentlySelectedPlanSS.Text = Application.Current.FindResource("TextBlockCurrentlySelectedPlanNo").ToString(); - - TextBlockShowPortSS.Visibility = Visibility.Hidden; - TextBlockCurrentlySelectedPlanPortSS.Visibility = Visibility.Hidden; - - TextBlockShowUUIDSS.Visibility = Visibility.Hidden; - TextBlockCurrentlySelectedPlanUUIDSS.Visibility = Visibility.Hidden; - - TextBlockShowMethodSS.Visibility = Visibility.Hidden; - TextBlockCurrentlySelectedPlanMethodSS.Visibility = Visibility.Hidden; - - TextBlockShowDomainSS.Visibility = Visibility.Hidden; - TextBlockCurrentlySelectedPlanDomainSS.Visibility = Visibility.Hidden; - - TextBlockShowPathSS.Visibility = Visibility.Hidden; - TextBlockCurrentlySelectedPlanPathSS.Visibility = Visibility.Hidden; - - TextBlockShowFakeWebsiteSS.Visibility = Visibility.Hidden; - TextBlockCurrentlySelectedPlanFakeWebsite.Visibility = Visibility.Hidden; - return; - } - TextBlockCurrentlySelectedPlanSS.Text = ReceiveConfigurationParameters[8]; //所选方案名称 - TextBlockCurrentlySelectedPlanPortSS.Text = ReceiveConfigurationParameters[1]; //服务器端口 - TextBlockCurrentlySelectedPlanUUIDSS.Text = ReceiveConfigurationParameters[2]; //密码 - TextBlockCurrentlySelectedPlanMethodSS.Text = ReceiveConfigurationParameters[3]; //加密方法 - TextBlockCurrentlySelectedPlanDomainSS.Text = ReceiveConfigurationParameters[4]; //域名 - TextBlockCurrentlySelectedPlanPathSS.Text = ReceiveConfigurationParameters[6]; //WebSocket Path - TextBlockCurrentlySelectedPlanFakeWebsite.Text = ReceiveConfigurationParameters[7]; //伪装网站 - - if (String.Equals(ReceiveConfigurationParameters[0], "NonePluginSS") - || String.Equals(ReceiveConfigurationParameters[0], "ObfsPluginHttpWebSS") - || String.Equals(ReceiveConfigurationParameters[0], "WebSocketSS") - || String.Equals(ReceiveConfigurationParameters[0], "KcptunPluginSS") - ) - { - //显示端口 - TextBlockShowPortSS.Visibility = Visibility.Visible; - TextBlockCurrentlySelectedPlanPortSS.Visibility = Visibility.Visible; - //显示密码 - TextBlockShowUUIDSS.Visibility = Visibility.Visible; - TextBlockCurrentlySelectedPlanUUIDSS.Visibility = Visibility.Visible; - //显示加密方式 - TextBlockShowMethodSS.Visibility = Visibility.Visible; - TextBlockCurrentlySelectedPlanMethodSS.Visibility = Visibility.Visible; - //隐藏域名 - TextBlockShowDomainSS.Visibility = Visibility.Hidden; - TextBlockCurrentlySelectedPlanDomainSS.Visibility = Visibility.Hidden; - //隐藏WebSocket路径 - TextBlockShowPathSS.Visibility = Visibility.Hidden; - TextBlockCurrentlySelectedPlanPathSS.Visibility = Visibility.Hidden; - //隐藏伪装网站 - TextBlockShowFakeWebsiteSS.Visibility = Visibility.Hidden; - TextBlockCurrentlySelectedPlanFakeWebsiteSS.Visibility = Visibility.Hidden; - - } - else if (String.Equals(ReceiveConfigurationParameters[0], "ObfsPluginHttpsWebSS") - || String.Equals(ReceiveConfigurationParameters[0], "QuicSS") - || String.Equals(ReceiveConfigurationParameters[0], "GoQuietPluginSS") - || String.Equals(ReceiveConfigurationParameters[0], "CloakPluginSS") - ) - { - //显示端口 - TextBlockShowPortSS.Visibility = Visibility.Visible; - TextBlockCurrentlySelectedPlanPortSS.Visibility = Visibility.Visible; - //显示密码 - TextBlockShowUUIDSS.Visibility = Visibility.Visible; - TextBlockCurrentlySelectedPlanUUIDSS.Visibility = Visibility.Visible; - //显示加密方式 - TextBlockShowMethodSS.Visibility = Visibility.Visible; - TextBlockCurrentlySelectedPlanMethodSS.Visibility = Visibility.Visible; - //显示域名 - TextBlockShowDomainSS.Visibility = Visibility.Visible; - TextBlockCurrentlySelectedPlanDomainSS.Visibility = Visibility.Visible; - //隐藏WebSocket路径 - TextBlockShowPathSS.Visibility = Visibility.Hidden; - TextBlockCurrentlySelectedPlanPathSS.Visibility = Visibility.Hidden; - //显示伪装网站 - TextBlockShowFakeWebsiteSS.Visibility = Visibility.Visible; - TextBlockCurrentlySelectedPlanFakeWebsiteSS.Visibility = Visibility.Visible; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLSWebFrontSS")) - { - //显示端口 - TextBlockShowPortSS.Visibility = Visibility.Visible; - TextBlockCurrentlySelectedPlanPortSS.Visibility = Visibility.Visible; - //显示密码 - TextBlockShowUUIDSS.Visibility = Visibility.Visible; - TextBlockCurrentlySelectedPlanUUIDSS.Visibility = Visibility.Visible; - //显示加密方式 - TextBlockShowMethodSS.Visibility = Visibility.Visible; - TextBlockCurrentlySelectedPlanMethodSS.Visibility = Visibility.Visible; - //显示域名 - TextBlockShowDomainSS.Visibility = Visibility.Visible; - TextBlockCurrentlySelectedPlanDomainSS.Visibility = Visibility.Visible; - //隐藏WebSocket路径 - TextBlockShowPathSS.Visibility = Visibility.Visible; - TextBlockCurrentlySelectedPlanPathSS.Visibility = Visibility.Visible; - //显示伪装网站 - TextBlockShowFakeWebsiteSS.Visibility = Visibility.Visible; - TextBlockCurrentlySelectedPlanFakeWebsiteSS.Visibility = Visibility.Visible; - } - - } - - //传送SS参数,启动SS安装进程 - private void Button_LoginSS_Click(object sender, RoutedEventArgs e) - - { - ConnectionInfo connectionInfo = GenerateConnectionInfo(); - if (connectionInfo == null) - { - //****** "远程主机连接信息有误,请检查!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostConnection").ToString()); - return; - } - - //读取模板配置 - - //生成客户端配置时,连接的服务主机的IP或者域名 - if (String.IsNullOrEmpty(ReceiveConfigurationParameters[4]) == true) - { - ReceiveConfigurationParameters[4] = PreTrim(TextBoxHost.Text); - testDomain = false; - } - //选择模板 - if (String.IsNullOrEmpty(ReceiveConfigurationParameters[0]) == true) - { - //******"请先选择配置模板!"****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ChooseTemplate").ToString()); - return; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "NonePluginSS") - || String.Equals(ReceiveConfigurationParameters[0], "ObfsPluginHttpWebSS") - || String.Equals(ReceiveConfigurationParameters[0], "WebSocketSS") - || String.Equals(ReceiveConfigurationParameters[0], "KcptunPluginSS") - ) - { - testDomain = false; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "GoQuietPluginSS") - || String.Equals(ReceiveConfigurationParameters[0], "CloakPluginSS") - || String.Equals(ReceiveConfigurationParameters[0], "QuicSS") - || String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLSWebFrontSS") - || String.Equals(ReceiveConfigurationParameters[0], "ObfsPluginHttpsWebSS") - ) - { - testDomain = true; - } - - installationDegree = 0; - TextBoxMonitorCommandResults.Text = ""; - Thread thread = new Thread(() => StartSetUpSS(connectionInfo)); - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - - } - - //登录远程主机布署SS程序 - private void StartSetUpSS(ConnectionInfo connectionInfo) - { - functionResult = true; - onlyIpv6 = false; - getApt = false; - getDnf = false; - getYum = false; - - //******"正在登录远程主机......"****** - SetUpProgressBarProcessing(1); - string currentStatus = Application.Current.FindResource("DisplayInstallInfo_Login").ToString(); - MainWindowsShowInfo(currentStatus); - - try - { - #region 主机指纹,暂未启用 - //byte[] expectedFingerPrint = new byte[] { - // 0x66, 0x31, 0xaf, 0x00, 0x54, 0xb9, 0x87, 0x31, - // 0xff, 0x58, 0x1c, 0x31, 0xb1, 0xa2, 0x4c, 0x6b - // }; - #endregion - using (var client = new SshClient(connectionInfo)) - - { - #region ssh登录验证主机指纹代码块,暂未启用 - // client.HostKeyReceived += (sender, e) => - // { - // if (expectedFingerPrint.Length == e.FingerPrint.Length) - // { - // for (var i = 0; i < expectedFingerPrint.Length; i++) - // { - // if (expectedFingerPrint[i] != e.FingerPrint[i]) - // { - // e.CanTrust = false; - // break; - // } - // } - // } - // else - // { - // e.CanTrust = false; - // } - // }; - #endregion - - client.Connect(); - if (client.IsConnected == true) - { - //******"主机登录成功"****** - SetUpProgressBarProcessing(3); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginSuccessful").ToString(); - MainWindowsShowInfo(currentStatus); - } - - //检测root权限 5--7 - functionResult = RootAuthorityDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测是否已安装代理 8--10 - functionResult = SoftInstalledIsNoYes(client, "ss-server", @"/usr/local/bin/ss-server"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测关闭Selinux及系统组件是否齐全(apt-get/yum/dnf/systemctl)11--30 - //安装依赖软件,检测端口,防火墙开启端口 - functionResult = ShutDownSelinuxAndSysComponentsDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //如果使用是TLS模式,需要检测域名解析是否正确 - if (testDomain == true) - { - //检测域名是否解析到当前IP上 34---36 - functionResult = DomainResolutionCurrentIPDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - } - //****** "系统环境检测完毕,符合安装要求,开始布署......" ****** - SetUpProgressBarProcessing(37); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstalling").ToString(); - MainWindowsShowInfo(currentStatus); - - //下载安装脚本安装 - //****** "正在安装SS,使用编译方式,时间稍长,请耐心等待............" ****** - SetUpProgressBarProcessing(38); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstallSoft").ToString() + "SS," + Application.Current.FindResource("DisplayInstallInfo_ExplainBuildSS").ToString(); - MainWindowsShowInfo(currentStatus); - - saveShellScriptFileName = GenerateRandomScriptFileName(GenerateRandomStr(10)); - - sshShellCommand = $"curl -o {saveShellScriptFileName} https://raw.githubusercontent.com/proxysu/shellscript/master/ss/ss-install.sh"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - functionResult = FileCheckExists(client, $"{saveShellScriptFileName}"); - if (functionResult == false) - { - //***文件下载失败!*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DownloadScriptFailed").ToString(); - MainWindowsShowInfo(currentStatus); - return; - } - - sshShellCommand = $"yes | bash {saveShellScriptFileName}"; - TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 - - //****** "编译中,请耐心等待............" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_CompilingSS").ToString(); - MainWindowsShowInfo(currentStatus); - - Thread threadWaitSScompile = new Thread(() => MonitorCompileSSprocess()); - threadWaitSScompile.SetApartmentState(ApartmentState.STA); - threadWaitSScompile.Start(); - - //开始编译。。。 - currentShellCommandResult = client.RunCommand(sshShellCommand).Result; - compileSSend = true; //中止显示"**"的线程 - threadWaitSScompile.Abort(); - TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 - - sshShellCommand = $"rm -f {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //程序是否安装成功检测并设置开机启动 41--43 - functionResult = SoftInstalledSuccessOrFail(client, "ss-server", @"/usr/local/bin/ss-server"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //****** "上传配置文件......" ****** - SetUpProgressBarProcessing(44); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadSoftConfig").ToString(); - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"mv /etc/shadowsocks-libev/config.json /etc/shadowsocks-libev/config.json.1"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //string getIpv4 = client.RunCommand(@"curl -4 ip.sb").Result; - //string getIpv6 = client.RunCommand(@"wget -qO- -t1 -T2 ipv6.icanhazip.com").Result; - - //生成服务端配置 - - string serverConfig = $"{pwdir}" + @"TemplateConfg\ss\ss_server_config.json"; - string ssPluginType = ""; - using (StreamReader reader = File.OpenText(serverConfig)) - { - JObject serverJson = (JObject)JToken.ReadFrom(new JsonTextReader(reader)); - - //设置服务器监听地址 - //if (String.IsNullOrEmpty(getIpv6) == true) - //{ - serverJson["server"] = "0.0.0.0"; - //} - //else - //{ - // JArray serverIp = JArray.Parse(@"[""[::0]"", ""0.0.0.0""]"); - // serverJson["server"] = serverIp; - //} - - //设置密码 - serverJson["password"] = ReceiveConfigurationParameters[2]; - //设置监听端口 - serverJson["server_port"] = int.Parse(ReceiveConfigurationParameters[1]); - //设置加密方式 - serverJson["method"] = ReceiveConfigurationParameters[3]; - //产生伪装Web的监听端口 - randomCaddyListenPort = GetRandomPort(); - - string failoverPort = randomCaddyListenPort.ToString(); - //obfs http模式 - if (String.Equals(ReceiveConfigurationParameters[0], "ObfsPluginHttpWebSS") == true) - { - serverJson["plugin"] = @"obfs-server"; - serverJson["plugin_opts"] = $"obfs=http;failover=127.0.0.1:{failoverPort}"; - //客户端项 - ReceiveConfigurationParameters[5] = @"obfs-local"; - ReceiveConfigurationParameters[9] = "obfs=http;obfs-host=www.bing.com"; - - } - else if (String.Equals(ReceiveConfigurationParameters[0], "ObfsPluginHttpsWebSS") == true) - { - serverJson["plugin"] = @"obfs-server"; - serverJson["plugin_opts"] = $"obfs=tls;failover=127.0.0.1:{failoverPort}"; - //客户端项 - ReceiveConfigurationParameters[5] = @"obfs-local"; - ReceiveConfigurationParameters[9] = $"obfs=tls;obfs-host={ReceiveConfigurationParameters[4]}"; - - } - else if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketSS") == true) - { - serverJson["plugin"] = @"v2ray-plugin"; - serverJson["plugin_opts"] = $"server"; - //客户端项 - ReceiveConfigurationParameters[5] = @"v2ray-plugin"; - ReceiveConfigurationParameters[9] = ""; - - } - else if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLSWebFrontSS") == true) - { - serverJson["server_port"] = 10000; - serverJson["plugin"] = @"v2ray-plugin"; - serverJson["plugin_opts"] = $"server;host={ReceiveConfigurationParameters[4]};path={ReceiveConfigurationParameters[6]}"; - - //客户端项 - ReceiveConfigurationParameters[5] = @"v2ray-plugin"; - ReceiveConfigurationParameters[9] = $"tls;host={ReceiveConfigurationParameters[4]};path={ReceiveConfigurationParameters[6]}"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "QuicSS") == true) - { - serverJson["mode"] = "tcp"; - serverJson["plugin"] = @"v2ray-plugin"; - serverJson["plugin_opts"] = $"server;mode=quic;host={ReceiveConfigurationParameters[4]}"; - //客户端项 - ReceiveConfigurationParameters[5] = @"v2ray-plugin"; - ReceiveConfigurationParameters[9] = $"mode=quic;host={ReceiveConfigurationParameters[4]}"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "KcptunPluginSS") == true) - { - serverJson["mode"] = "tcp"; - serverJson["plugin"] = @"kcptun-plugin-server"; - serverJson["plugin_opts"] = $"key={ReceiveConfigurationParameters[2]}"; - //客户端项 - ReceiveConfigurationParameters[5] = @"kcptun"; - ReceiveConfigurationParameters[9] = $"key={ReceiveConfigurationParameters[2]}"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "GoQuietPluginSS") == true) - { - serverJson["plugin"] = @"goquiet-plugin-server"; - serverJson["plugin_opts"] = $"WebServerAddr=127.0.0.1:{failoverPort};Key={ReceiveConfigurationParameters[2]}"; - //客户端项 - ReceiveConfigurationParameters[5] = @"goquiet"; - ReceiveConfigurationParameters[9] = $"ServerName={ReceiveConfigurationParameters[4]};Key={ReceiveConfigurationParameters[2]};Browser=chrome"; - - } - else if (String.Equals(ReceiveConfigurationParameters[0], "CloakPluginSS") == true) - { - //****** "正在安装 Cloak-Plugin......" ****** - SetUpProgressBarProcessing(48); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstallSoft").ToString() + " Cloak-Plugin......"; - MainWindowsShowInfo(currentStatus); - - saveShellScriptFileName = GenerateRandomScriptFileName(GenerateRandomStr(10)); - - sshShellCommand = $"curl -o {saveShellScriptFileName} https://raw.githubusercontent.com/proxysu/shellscript/master/ss/ss-plugins/cloak-plugin-install.sh"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - functionResult = FileCheckExists(client, $"{saveShellScriptFileName}"); - if (functionResult == false) - { - //***文件下载失败!*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DownloadScriptFailed").ToString(); - MainWindowsShowInfo(currentStatus); - return; - } - - sshShellCommand = $"yes | bash {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"rm -f {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //程序是否安装成功检测并设置开机启动 41--43 - functionResult = SoftInstalledSuccessOrFail(client, "cloak-plugin-server", @"/usr/local/bin/cloak-plugin-server"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - - string bypassUID = client.RunCommand(@"/usr/local/bin/cloak-plugin-server -u").Result.TrimEnd('\r', '\n'); - string generateKey = client.RunCommand(@"/usr/local/bin/cloak-plugin-server -k").Result.TrimEnd('\r', '\n'); - string[] keyCloak = generateKey.Split(new char[] { ',' }); - string publicKey = keyCloak[0]; - string privateKey = keyCloak[1]; - - serverJson["plugin"] = @"cloak-plugin-server"; - serverJson["plugin_opts"] = $"BypassUID={bypassUID};PrivateKey={privateKey};RedirAddr=127.0.0.1:{failoverPort};DatabasePath=/etc/shadowsocks-libev/userinfo.db;StreamTimeout=300"; - //客户端项 - ReceiveConfigurationParameters[5] = @"cloak"; - ReceiveConfigurationParameters[9] = $"UID={bypassUID};PublicKey={publicKey};Transport=direct;ServerName={ReceiveConfigurationParameters[4]};BrowserSig=chrome;NumConn=4;EncryptionMethod=plain;StreamTimeout=300"; - - } - ssPluginType = (string)serverJson["plugin"]; - using (StreamWriter sw = new StreamWriter(@"config.json")) - { - sw.Write(serverJson.ToString()); - } - } - - string upLoadPath = @"/etc/shadowsocks-libev/config.json"; - UploadConfig(connectionInfo, @"config.json", upLoadPath); - - File.Delete(@"config.json"); - - //安装所使用的插件 - if (String.Equals(ssPluginType, "obfs-server")) - { - //****** "正在安装 Simple-obfs Plugin......" ****** - SetUpProgressBarProcessing(48); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstallSoft").ToString() + " Simple-obfs Plugin......"; - MainWindowsShowInfo(currentStatus); - - saveShellScriptFileName = GenerateRandomScriptFileName(GenerateRandomStr(10)); - - sshShellCommand = $"curl -o {saveShellScriptFileName} https://raw.githubusercontent.com/proxysu/shellscript/master/ss/ss-plugins/obfs-install.sh"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - functionResult = FileCheckExists(client, $"{saveShellScriptFileName}"); - if (functionResult == false) - { - //***文件下载失败!*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DownloadScriptFailed").ToString(); - MainWindowsShowInfo(currentStatus); - return; - } - - sshShellCommand = $"yes | bash {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"rm -f {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //程序是否安装成功检测并设置开机启动 41--43 - functionResult = SoftInstalledSuccessOrFail(client, "obfs-server", @"/usr/local/bin/obfs-server"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - - } - else if (String.Equals(ssPluginType, "v2ray-plugin")) - { - //****** "正在安装 V2Ray-Plugin......" ****** - SetUpProgressBarProcessing(48); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstallSoft").ToString() + " V2Ray-Plugin......"; - MainWindowsShowInfo(currentStatus); - - saveShellScriptFileName = GenerateRandomScriptFileName(GenerateRandomStr(10)); - - sshShellCommand = $"curl -o {saveShellScriptFileName} https://raw.githubusercontent.com/proxysu/shellscript/master/ss/ss-plugins/v2ray-plugin-install.sh"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - functionResult = FileCheckExists(client, $"{saveShellScriptFileName}"); - if (functionResult == false) - { - //***文件下载失败!*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DownloadScriptFailed").ToString(); - MainWindowsShowInfo(currentStatus); - return; - } - - sshShellCommand = $"yes | bash {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"rm -f {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //程序是否安装成功检测并设置开机启动 41--43 - functionResult = SoftInstalledSuccessOrFail(client, "v2ray-plugin", @"/usr/local/bin/v2ray-plugin"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - } - else if (String.Equals(ssPluginType, "kcptun-plugin-server")) - { - //****** "正在安装 Kcptun-Plugin......" ****** - SetUpProgressBarProcessing(48); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstallSoft").ToString() + " Kcptun-Plugin......"; - MainWindowsShowInfo(currentStatus); - - saveShellScriptFileName = GenerateRandomScriptFileName(GenerateRandomStr(10)); - - sshShellCommand = $"curl -o {saveShellScriptFileName} https://raw.githubusercontent.com/proxysu/shellscript/master/ss/ss-plugins/kcptun-plugin-install.sh"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - functionResult = FileCheckExists(client, $"{saveShellScriptFileName}"); - if (functionResult == false) - { - //***文件下载失败!*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DownloadScriptFailed").ToString(); - MainWindowsShowInfo(currentStatus); - return; - } - - sshShellCommand = $"yes | bash {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"rm -f {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //程序是否安装成功检测并设置开机启动 41--43 - functionResult = SoftInstalledSuccessOrFail(client, "kcptun-plugin-server", @"/usr/local/bin/kcptun-plugin-server"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - } - else if (String.Equals(ssPluginType, "goquiet-plugin-server")) - { - //****** "正在安装 GoQuiet-Plugin......" ****** - SetUpProgressBarProcessing(48); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstallSoft").ToString() + " GoQuiet-Plugin......"; - MainWindowsShowInfo(currentStatus); - - saveShellScriptFileName = GenerateRandomScriptFileName(GenerateRandomStr(10)); - - sshShellCommand = $"curl -o {saveShellScriptFileName} https://raw.githubusercontent.com/proxysu/shellscript/master/ss/ss-plugins/goquiet-plugin-install.sh"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - functionResult = FileCheckExists(client, $"{saveShellScriptFileName}"); - if (functionResult == false) - { - //***文件下载失败!*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DownloadScriptFailed").ToString(); - MainWindowsShowInfo(currentStatus); - return; - } - - sshShellCommand = $"yes | bash {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"rm -f {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //程序是否安装成功检测并设置开机启动 41--43 - functionResult = SoftInstalledSuccessOrFail(client, "goquiet-plugin-server", @"/usr/local/bin/goquiet-plugin-server"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - } - else if (String.Equals(ssPluginType, "cloak-plugin-server")) - { - - } - - - //如果使用v2ray-plugin Quic模式,先要安装acme.sh,申请证书 - if (String.Equals(ReceiveConfigurationParameters[0], "QuicSS") == true) - { - //acme.sh安装与申请证书 51--57 - functionResult = AcmeShInstall(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - } - - //如果使用Web伪装网站模式,需要安装Caddy - if (String.Equals(ReceiveConfigurationParameters[0], "ObfsPluginHttpWebSS") == true - || String.Equals(ReceiveConfigurationParameters[0], "ObfsPluginHttpsWebSS") == true - || String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLSWebFrontSS") == true - || String.Equals(ReceiveConfigurationParameters[0], "GoQuietPluginSS") == true - || String.Equals(ReceiveConfigurationParameters[0], "CloakPluginSS") == true - ) - { - //Caddy安装 61--66 - functionResult = CaddyInstall(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //****** "上传Caddy配置文件......" ****** - SetUpProgressBarProcessing(67); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadCaddyConfig").ToString(); - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"mv /etc/caddy/Caddyfile /etc/caddy/Caddyfile.bak"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - if (String.Equals(ReceiveConfigurationParameters[0], "ObfsPluginHttpWebSS") == true) - { - serverConfig = $"{pwdir}" + @"TemplateConfg\ss\ss_obfs_http_web_config.caddyfile"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "ObfsPluginHttpsWebSS") == true - || String.Equals(ReceiveConfigurationParameters[0], "GoQuietPluginSS") == true - || String.Equals(ReceiveConfigurationParameters[0], "CloakPluginSS") == true) - { - serverConfig = $"{pwdir}" + @"TemplateConfg\ss\ss_tls_caddy_config.caddyfile"; - } - else if (String.Equals(ReceiveConfigurationParameters[0], "WebSocketTLSWebFrontSS") == true) - { - serverConfig = $"{pwdir}" + @"TemplateConfg\ss\WebSocketTLSWeb.caddyfile"; - } - - upLoadPath = @"/etc/caddy/Caddyfile"; - - UploadConfig(connectionInfo, serverConfig, upLoadPath); - - //设置Caddy配置文件 - functionResult = SetCaddyfile(client, @"/etc/caddy/Caddyfile"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //****** "Caddy配置文件上传成功,OK!" ****** - SetUpProgressBarProcessing(70); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadCaddyConfigOK").ToString(); - MainWindowsShowInfo(currentStatus); - - //程序启动检测Caddy - functionResult = SoftStartDetect(client, "caddy", @"/usr/bin/caddy"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - } - - //程序启动检测SS - functionResult = SoftStartDetect(client, "ss-server", @"/usr/local/bin/ss-server"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测BBR,满足条件并启动 90--95 - functionResult = DetectBBRandEnable(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - - client.Disconnect();//断开服务器ssh连接 - - //****** "生成客户端配置......" ****** - SetUpProgressBarProcessing(96); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_GenerateClientConfig").ToString(); - MainWindowsShowInfo(currentStatus); - - //****** "SS安装成功,祝你玩的愉快!!" ****** - SetUpProgressBarProcessing(100); - currentStatus = "SS" + Application.Current.FindResource("DisplayInstallInfo_ProxyInstalledOK").ToString(); - MainWindowsShowInfo(currentStatus); - - //显示服务端连接参数 - proxyType = "SS"; - ResultClientInformation resultClientInformation = new ResultClientInformation(); - resultClientInformation.ShowDialog(); - - return; - } - } - catch (Exception ex1)//例外处理 - #region 例外处理 - { - ProcessException(ex1.Message); - - //****** "安装失败!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - #endregion - } - - //编译SS时,中间监视窗口显示"****"不断增长进度,直到编译结束 - private static bool compileSSend = false; - private void MonitorCompileSSprocess() - { - currentShellCommandResult = "**"; - while (compileSSend == false) - { - TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorActionNoWrap, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 - Thread.Sleep(1000); - } - } - - #endregion - - #region MTProto相关 - //传递参数启动安装进程 - private void ButtonMtgSetUp_Click(object sender, RoutedEventArgs e) - { - ConnectionInfo connectionInfo = GenerateConnectionInfo(); - if (connectionInfo == null) - { - //****** "远程主机连接信息有误,请检查!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostConnection").ToString()); - return; - } - //清空参数空间 - for (int i = 0; i != ReceiveConfigurationParameters.Length; i++) - - { - ReceiveConfigurationParameters[i] = ""; - } - //传递服务器地址 - ReceiveConfigurationParameters[4] = PreTrim(TextBoxHost.Text); ; - //传递服务端口 - ReceiveConfigurationParameters[1] = PreTrim(TextBoxMtgHostPort.Text); - //传递伪装域名 - if (String.IsNullOrEmpty(PreTrim(TextBoxMtgSites.Text)) == true) - { - ReceiveConfigurationParameters[7] = "azure.microsoft.com"; - } - else - { - ReceiveConfigurationParameters[7] = PreTrim(TextBoxMtgSites.Text); - } - installationDegree = 0; - TextBoxMonitorCommandResults.Text = ""; - Thread thread = new Thread(() => StartSetUpMtg(connectionInfo)); - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - } - - //Mtg安装进程 - private void StartSetUpMtg(ConnectionInfo connectionInfo) - { - functionResult = true; - onlyIpv6 = false; - getApt = false; - getDnf = false; - getYum = false; - - //******"正在登录远程主机......"****** - SetUpProgressBarProcessing(1); - string currentStatus = Application.Current.FindResource("DisplayInstallInfo_Login").ToString(); - MainWindowsShowInfo(currentStatus); - - try - { - #region 主机指纹,暂未启用 - //byte[] expectedFingerPrint = new byte[] { - // 0x66, 0x31, 0xaf, 0x00, 0x54, 0xb9, 0x87, 0x31, - // 0xff, 0x58, 0x1c, 0x31, 0xb1, 0xa2, 0x4c, 0x6b - // }; - #endregion - using (var client = new SshClient(connectionInfo)) - - { - #region ssh登录验证主机指纹代码块,暂未启用 - // client.HostKeyReceived += (sender, e) => - // { - // if (expectedFingerPrint.Length == e.FingerPrint.Length) - // { - // for (var i = 0; i < expectedFingerPrint.Length; i++) - // { - // if (expectedFingerPrint[i] != e.FingerPrint[i]) - // { - // e.CanTrust = false; - // break; - // } - // } - // } - // else - // { - // e.CanTrust = false; - // } - // }; - #endregion - - client.Connect(); - if (client.IsConnected == true) - { - //******"主机登录成功"****** - SetUpProgressBarProcessing(3); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginSuccessful").ToString(); - MainWindowsShowInfo(currentStatus); - } - - //检测root权限 5--7 - functionResult = RootAuthorityDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测是否已安装代理 8--10 - functionResult = SoftInstalledIsNoYes(client, "mtg", @"/usr/local/bin/mtg"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测关闭Selinux及系统组件是否齐全(apt-get/yum/dnf/systemctl)11--30 - //安装依赖软件,检测端口,防火墙开启端口 - functionResult = ShutDownSelinuxAndSysComponentsDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //检测是否为64位系统 - sshShellCommand = @"uname -m"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - string resultCmd = currentShellCommandResult; - if (resultCmd.Contains("x86_64") == false) - { - //******"请在x86_64系统中安装MTProto" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_PleaseInstallSoftAtX64").ToString() + "MTProto......"); - //****** "系统环境不满足要求,安装失败!!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_MissingSystemComponents").ToString(); - MainWindowsShowInfo(currentStatus); - return; - } - - //下载安装脚本安装MTProto 37--40 - - functionResult = MTProtoInstall(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //程序是否安装成功检测并设置开机启动 41--43 - functionResult = SoftInstalledSuccessOrFail(client, "mtg", @"/usr/local/bin/mtg"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //****** "正在启动MTProto......" ****** - SetUpProgressBarProcessing(70); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartSoft").ToString() + "MTProto......"; - MainWindowsShowInfo(currentStatus); - - //启动MTProto服务 - functionResult = SoftStartDetect(client, "mtg", @"/usr/local/bin/mtg"); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - //****** "生成客户端配置......" ****** - SetUpProgressBarProcessing(80); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_GenerateClientConfig").ToString(); - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"systemctl stop mtg"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - sshShellCommand = @"cat /usr/local/etc/mtg.sh"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - sshShellCommand = currentShellCommandResult; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - Thread.Sleep(3000); - sshShellCommand = @"cat /usr/local/etc/mtg_info.json"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - ReceiveConfigurationParameters[9] = currentShellCommandResult; - if (String.IsNullOrEmpty(ReceiveConfigurationParameters[9]) == true) - { - Thread.Sleep(3000); - sshShellCommand = @"cat /usr/local/etc/mtg_info.json"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - ReceiveConfigurationParameters[9] = currentShellCommandResult; - } - sshShellCommand = @"pkill mtg"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - sshShellCommand = @"systemctl restart mtg"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - if (String.IsNullOrEmpty(ReceiveConfigurationParameters[9]) == true) - { - //***客户端配置获取失败!*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_GetClientConfigFailed").ToString(); - MainWindowsShowInfo(currentStatus); - FunctionResultErr(); - client.Disconnect(); - return; - } - - //检测BBR,满足条件并启动 90--95 - functionResult = DetectBBRandEnable(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - client.Disconnect();//断开服务器ssh连接 - - //Thread.Sleep(1000); - //if (!Directory.Exists("mtproto_config"))//如果不存在就创建file文件夹      - //{ - // Directory.CreateDirectory("mtproto_config");//创建该文件夹   - //} - //using (StreamWriter sw = new StreamWriter(@"mtproto_config\mtproto_info.json")) - //{ - // sw.Write(currentShellCommandResult.ToString()); - //} - - //****** "MTProto+TLS安装成功,祝你玩的愉快!!" ****** - SetUpProgressBarProcessing(100); - currentStatus = "MTProto+TLS" + Application.Current.FindResource("DisplayInstallInfo_ProxyInstalledOK").ToString(); - MainWindowsShowInfo(currentStatus); - - //显示服务端连接参数 - proxyType = "MTProto"; - - ResultClientInformation resultClientInformation = new ResultClientInformation(); - resultClientInformation.ShowDialog(); - return; - } - } - catch (Exception ex1)//例外处理 - #region 例外处理 - { - ProcessException(ex1.Message); - - //****** "安装失败!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - #endregion - - } - - //下载安装脚本安装MTProto 37--40 - //functionResult = MTProtoInstall(client); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - private bool MTProtoInstall(SshClient client) - { - //****** "系统环境检测完毕,符合安装要求,开始布署......" ****** - SetUpProgressBarProcessing(37); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstalling").ToString(); - MainWindowsShowInfo(currentStatus); - - //下载安装脚本安装 - //****** "正在安装MTProto......" ****** - SetUpProgressBarProcessing(38); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstallSoft").ToString() + "MTProto......"; - MainWindowsShowInfo(currentStatus); - - saveShellScriptFileName = GenerateRandomScriptFileName(GenerateRandomStr(10)); - - sshShellCommand = $"curl -o {saveShellScriptFileName} https://raw.githubusercontent.com/proxysu/shellscript/master/MTProto/mtg_install.sh"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - functionResult = FileCheckExists(client, $"{saveShellScriptFileName}"); - if (functionResult == false) - { - //***文件下载失败!*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DownloadScriptFailed").ToString(); - MainWindowsShowInfo(currentStatus); - return false; - } - - sshShellCommand = $"yes | bash {saveShellScriptFileName} {ReceiveConfigurationParameters[1]} {ReceiveConfigurationParameters[7]}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"rm -f {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - SetUpProgressBarProcessing(40); - return true; - } - #endregion - - #region 其他功能函数及系统工具相关 - //TextBox输入内容做预处理 - private string PreTrim(string preString) - { - return preString.Trim(); - } - //产生随机端口 - private int GetRandomPort() - { - Random random = new Random(); - return random.Next(10001, 60000); - } - - //产生随机字符串 - private string GenerateRandomStr(int length) - { - var rand = System.Security.Cryptography.RandomNumberGenerator.Create(); - byte[] bytes = new byte[length * 2]; - rand.GetBytes(bytes); - string randStr = Convert.ToBase64String(bytes); - randStr = randStr.Replace("+", "").Replace("/", "").Replace("=", "").Substring(0, length); - //MessageBox.Show(randStr); - return randStr; - } - //生成保存的shell脚本名称 - private string GenerateRandomScriptFileName(string filename) - { - return "/tmp/tmp." + filename + ".sh"; - } - //判断目录是否存在,不存在则创建 - private static bool CheckDir(string folder) - { - try - { - if (!Directory.Exists(folder))//如果不存在就创建file文件夹 - Directory.CreateDirectory(folder);//创建该文件夹   - return true; - } - catch (Exception) - { - return false; - } - } - - //目录已存在则生成序号递增,并返回所创建的目录路径。 - private string CreateConfigSaveDir(string upperDir, string configDir) - { - try - { - //string saveFileFolderFirst = configDir; - int num = 1; - //string saveFileFolder; - //saveFileFolder = EncodeURIComponent(configDir); - string saveFileFolder = configDir.Replace(":", "_"); - CheckDir(upperDir); - while (Directory.Exists(upperDir + @"\" + saveFileFolder) == true) - { - saveFileFolder = configDir + "_copy_" + num.ToString(); - num++; - } - CheckDir(upperDir + @"\" + saveFileFolder); - return upperDir + @"\" + saveFileFolder; - } - catch (Exception) - { - //string saveFileFolder = ""; - //return upperDir + @"\" + saveFileFolder; - return upperDir; - } - - } - - - //上传配置文件 - private void UploadConfig(ConnectionInfo connectionInfo, string uploadConfig, string upLoadPath) - { - try - { - using (var sftpClient = new SftpClient(connectionInfo)) - { - sftpClient.Connect(); - FileStream openUploadConfigFile = File.OpenRead(uploadConfig); - sftpClient.UploadFile(openUploadConfigFile, upLoadPath, true); - openUploadConfigFile.Close(); - sftpClient.Disconnect(); - } - - } - catch (Exception ex2) - { - MessageBox.Show("sftp" + ex2.ToString()); - //MessageBox.Show("sftp出现未知错误,上传文件失败,请重试!"); - return; - } - } - - //下载配置文件 - private void DownloadConfig(ConnectionInfo connectionInfo, string localConfigSavePathAndFileName, string remoteConfigPathAndFileName) - { - try - { - using (var sftpClient = new SftpClient(connectionInfo)) - { - sftpClient.Connect(); - FileStream createDownloadConfig = File.Open(localConfigSavePathAndFileName, FileMode.Create); - sftpClient.DownloadFile(remoteConfigPathAndFileName, createDownloadConfig); - createDownloadConfig.Close(); - - sftpClient.Disconnect(); - } - - } - catch (Exception ex2) - { - MessageBox.Show("sftp" + ex2.ToString()); - //MessageBox.Show("sftp出现未知错误,下载文件失败,请重试!"); - return; - } - } - - //伪装网站处理 - //private string DisguiseURLprocessing(string fakeUrl) - //{ - //var uri = new Uri(fakeUrl); - //return uri.Host; - - ////处理伪装网站域名中的前缀 - //if (fakeUrl.Length >= 7) - //{ - // string testDomainMask = fakeUrl.Substring(0, 7); - // if (String.Equals(testDomainMask, "https:/") || String.Equals(testDomainMask, "http://")) - // { - // //MessageBox.Show(testDomain); - // string[] tmpUrl = fakeUrl.Split('/'); - // //MainWindow.ReceiveConfigurationParameters[7] = TextBoxMaskSites.Text.Replace("/", "\\/"); - // fakeUrl = tmpUrl[2]; - // } - - //} - //return fakeUrl; - // } - - #region 检测系统内核是否符合安装要求 - //private static bool DetectKernelVersion(string kernelVer) - //{ - // string[] linuxKernelCompared = kernelVer.Split('.'); - // if (int.Parse(linuxKernelCompared[0]) > 2) - // { - // //MessageBox.Show($"当前系统内核版本为{result.Result},符合安装要求!"); - // return true; - // } - // else if (int.Parse(linuxKernelCompared[0]) < 2) - // { - // //MessageBox.Show($"当前系统内核版本为{result.Result},V2ray要求内核为2.6.23及以上。请升级内核再安装!"); - // return false; - // } - // else if (int.Parse(linuxKernelCompared[0]) == 2) - // { - // if (int.Parse(linuxKernelCompared[1]) > 6) - // { - // //MessageBox.Show($"当前系统内核版本为{result.Result},符合安装要求!"); - // return true; - // } - // else if (int.Parse(linuxKernelCompared[1]) < 6) - // { - // //MessageBox.Show($"当前系统内核版本为{result.Result},V2ray要求内核为2.6.23及以上。请升级内核再安装!"); - // return false; - // } - // else if (int.Parse(linuxKernelCompared[1]) == 6) - // { - // if (int.Parse(linuxKernelCompared[2]) < 23) - // { - // //MessageBox.Show($"当前系统内核版本为{result.Result},V2ray要求内核为2.6.23及以上。请升级内核再安装!"); - // return false; - // } - // else - // { - // //MessageBox.Show($"当前系统内核版本为{result.Result},符合安装要求!"); - // return true; - // } - - // } - // } - // return false; - - //} - #endregion - - //打开系统工具中的校对时间窗口 - private void ButtonProofreadTime_Click(object sender, RoutedEventArgs e) - { - ConnectionInfo connectionInfo = GenerateConnectionInfo(); - if (connectionInfo == null) - { - //****** "远程主机连接信息有误,请检查!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostConnection").ToString()); - return; - } - - ProofreadTimeWindow proofreadTimeWindow = new ProofreadTimeWindow(); - ProofreadTimeWindow.ProfreadTimeReceiveConnectionInfo = connectionInfo; - - proofreadTimeWindow.ShowDialog(); - - } - //释放80/443端口 - private void ButtonClearOccupiedPorts_Click(object sender, RoutedEventArgs e) - { - //****** "80/443端口之一,或全部被占用,将强制停止占用80/443端口的程序?" ****** - MessageBoxResult dialogResult = MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorPortUsed").ToString(), "Stop application", MessageBoxButton.YesNo); - if (dialogResult == MessageBoxResult.No) - { - return; - } - - ConnectionInfo testconnect = GenerateConnectionInfo(); - try - { - using (var client = new SshClient(testconnect)) - { - client.Connect(); - - //检测是否运行在root权限下 - string testRootAuthority = client.RunCommand(@"id -u").Result; - if (testRootAuthority.Equals("0\n") == false) - { - //******"请使用具有root权限的账户登录主机!!"****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorRootPermission").ToString()); - client.Disconnect(); - return; - } - string cmdTestPort; - string cmdResult; - cmdTestPort = @"lsof -n -P -i :443 | grep LISTEN"; - cmdResult = client.RunCommand(cmdTestPort).Result; - - if (String.IsNullOrEmpty(cmdResult) == false) - { - - string[] cmdResultArry443 = cmdResult.Split(' '); - client.RunCommand($"systemctl stop {cmdResultArry443[0]}"); - client.RunCommand($"systemctl disable {cmdResultArry443[0]}"); - client.RunCommand($"kill -9 {cmdResultArry443[3]}"); - } - - cmdTestPort = @"lsof -n -P -i :80 | grep LISTEN"; - cmdResult = client.RunCommand(cmdTestPort).Result; - if (String.IsNullOrEmpty(cmdResult) == false) - { - string[] cmdResultArry80 = cmdResult.Split(' '); - client.RunCommand($"systemctl stop {cmdResultArry80[0]}"); - client.RunCommand($"systemctl disable {cmdResultArry80[0]}"); - client.RunCommand($"kill -9 {cmdResultArry80[3]}"); - } - //****** "80/443端口释放完毕!" ****** - MessageBox.Show(Application.Current.FindResource("DisplayInstallInfo_ReleasePortOK").ToString()); - client.Disconnect(); - } - } - catch (Exception ex) - { - MessageBox.Show(ex.Message); - } - } - - //启用BBR - private void ButtonTestAndEnableBBR_Click(object sender, RoutedEventArgs e) - { - ConnectionInfo connectionInfo = GenerateConnectionInfo(); - if (connectionInfo == null) - { - //****** "远程主机连接信息有误,请检查!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostConnection").ToString()); - return; - } - - installationDegree = 0; - TextBoxMonitorCommandResults.Text = ""; - Thread thread = new Thread(() => StartTestAndEnableBBR(connectionInfo)); - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - } - - //启用BBR的主要进程 - private void StartTestAndEnableBBR(ConnectionInfo connectionInfo) - { - functionResult = true; - onlyIpv6 = false; - getApt = false; - getDnf = false; - getYum = false; - - //******"正在登录远程主机......"****** - SetUpProgressBarProcessing(1); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_Login").ToString(); - MainWindowsShowInfo(currentStatus); - - try - { - #region 主机指纹,暂未启用 - //byte[] expectedFingerPrint = new byte[] { - // 0x66, 0x31, 0xaf, 0x00, 0x54, 0xb9, 0x87, 0x31, - // 0xff, 0x58, 0x1c, 0x31, 0xb1, 0xa2, 0x4c, 0x6b - // }; - #endregion - using (var client = new SshClient(connectionInfo)) - - { - #region ssh登录验证主机指纹代码块,暂未启用 - // client.HostKeyReceived += (sender, e) => - // { - // if (expectedFingerPrint.Length == e.FingerPrint.Length) - // { - // for (var i = 0; i < expectedFingerPrint.Length; i++) - // { - // if (expectedFingerPrint[i] != e.FingerPrint[i]) - // { - // e.CanTrust = false; - // break; - // } - // } - // } - // else - // { - // e.CanTrust = false; - // } - // }; - #endregion - - client.Connect(); - if (client.IsConnected == true) - { - //******"主机登录成功"****** - SetUpProgressBarProcessing(5); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginSuccessful").ToString(); - MainWindowsShowInfo(currentStatus); - } - - //检测root权限 5--7 - functionResult = RootAuthorityDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - SetUpProgressBarProcessing(30); - //****** "BBR测试......" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestBBR").ToString(); - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"uname -r"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - string[] linuxKernelVerStrBBR = currentShellCommandResult.Split('-'); - - bool detectResultBBR = DetectKernelVersionBBR(linuxKernelVerStrBBR[0]); - - sshShellCommand = @"sysctl net.ipv4.tcp_congestion_control | grep bbr"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - string resultCmdTestBBR = currentShellCommandResult; - //如果内核满足大于等于4.9,且还未启用BBR,则启用BBR - if (detectResultBBR == true && resultCmdTestBBR.Contains("bbr") == false) - { - SetUpProgressBarProcessing(60); - //****** "正在启用BBR......" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_EnableBBR").ToString(); - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"bash -c 'echo ""net.core.default_qdisc=fq"" >> /etc/sysctl.conf'"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"bash -c 'echo ""net.ipv4.tcp_congestion_control=bbr"" >> /etc/sysctl.conf'"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"sysctl -p"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - } - else if (resultCmdTestBBR.Contains("bbr") == true) - { - SetUpProgressBarProcessing(100); - //****** "BBR已经启用了!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_BBRisEnabled").ToString(); - MainWindowsShowInfo(currentStatus); - - } - else - { - //****** "系统不满足启用BBR的条件,启用失败!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_BBRFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - - client.Disconnect();//断开服务器ssh连接 - - return; - } - } - catch (Exception ex1)//例外处理 - #region 例外处理 - { - ProcessException(ex1.Message); - - //****** "主机登录失败!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - #endregion - - } - - //检测要启用BBR主要的内核版本 - private static bool DetectKernelVersionBBR(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 ButtonRemoveAllSoft_Click(object sender, RoutedEventArgs e) - { - //******"仅支持卸载由ProxySU安装的代理软件及相关配置,请确保重要配置已备份。不支持卸载使用其他方法或脚本安装的代理。确定要卸载远程主机上的代理软件吗?"****** - string messageShow = Application.Current.FindResource("MessageBoxShow_RemoveAllSoft").ToString(); - MessageBoxResult messageBoxResult = MessageBox.Show(messageShow, "", MessageBoxButton.YesNo, MessageBoxImage.Question); - if (messageBoxResult == MessageBoxResult.Yes) - { - - ConnectionInfo connectionInfo = GenerateConnectionInfo(); - if (connectionInfo == null) - { - //****** "远程主机连接信息有误,请检查!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostConnection").ToString()); - return; - } - - installationDegree = 0; - TextBoxMonitorCommandResults.Text = ""; - Thread thread = new Thread(() => StartRemoveProxySoft(connectionInfo)); - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - } - - } - //卸载代理进程 - private void StartRemoveProxySoft(ConnectionInfo connectionInfo) - { - functionResult = true; - getApt = false; - getDnf = false; - getYum = false; - onlyIpv6 = false; - - //******"正在登录远程主机......"****** - SetUpProgressBarProcessing(1); - string currentStatus = Application.Current.FindResource("DisplayInstallInfo_Login").ToString(); - MainWindowsShowInfo(currentStatus); - - try - { - #region 主机指纹,暂未启用 - //byte[] expectedFingerPrint = new byte[] { - // 0x66, 0x31, 0xaf, 0x00, 0x54, 0xb9, 0x87, 0x31, - // 0xff, 0x58, 0x1c, 0x31, 0xb1, 0xa2, 0x4c, 0x6b - // }; - #endregion - using (var client = new SshClient(connectionInfo)) - - { - #region ssh登录验证主机指纹代码块,暂未启用 - // client.HostKeyReceived += (sender, e) => - // { - // if (expectedFingerPrint.Length == e.FingerPrint.Length) - // { - // for (var i = 0; i < expectedFingerPrint.Length; i++) - // { - // if (expectedFingerPrint[i] != e.FingerPrint[i]) - // { - // e.CanTrust = false; - // break; - // } - // } - // } - // else - // { - // e.CanTrust = false; - // } - // }; - #endregion - - client.Connect(); - if (client.IsConnected == true) - { - //******"主机登录成功"****** - SetUpProgressBarProcessing(5); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginSuccessful").ToString(); - MainWindowsShowInfo(currentStatus); - //Thread.Sleep(3000); - } - - - //检测root权限 5--7 - functionResult = RootAuthorityDetect(client); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - functionResult = FileCheckExists(client, @"/etc/resolv.conf.proxysu"); - if (functionResult == true) - { - sshShellCommand = @"mv /etc/resolv.conf.proxysu /etc/resolv.conf "; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - } - - sshShellCommand = @"command -v apt-get"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - getApt = !String.IsNullOrEmpty(currentShellCommandResult); - - sshShellCommand = @"command -v dnf"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - getDnf = !String.IsNullOrEmpty(currentShellCommandResult); - - sshShellCommand = @"command -v yum"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - getYum = !String.IsNullOrEmpty(currentShellCommandResult); - - //设置安装软件所用的命令格式 - if (getApt == true) - { - sshCmdUpdate = @"apt-get update"; - //sshCmdInstall = @"apt-get -y install "; - } - else if (getDnf == true) - { - sshCmdUpdate = @"dnf clean all;dnf makecache"; - //sshCmdInstall = @"dnf -y install "; - } - else if (getYum == true) - { - sshCmdUpdate = @"yum clean all; yum makecache"; - //sshCmdInstall = @"yum -y install "; - } - - //检测主机是否为纯ipv6的主机 - onlyIpv6 = OnlyIpv6HostDetect(client); - - //如果未检测到有效的ip,连接就会被断开 - if (client.IsConnected == false) - { - return; - } - if (onlyIpv6 == true) - { - functionResult = SetUpNat64(client, true); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - //SetUpNat64(client, true); - //sshShellCommand = $"{sshCmdUpdate}"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - } - - - //******"开始卸载......"****** - SetUpProgressBarProcessing(10); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartRemoveProxy").ToString() + "......"; - MainWindowsShowInfo(currentStatus); - - #region 卸载V2Ray - - //******"检测系统是否已经安装V2ray......"******03 - SetUpProgressBarProcessing(11); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestExistSoft").ToString() + "V2ray......"; - MainWindowsShowInfo(currentStatus); - - //sshShellCommand = @"find / -name v2ray"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - functionResult = FileCheckExists(client, @"/usr/local/bin/v2ray"); - if (functionResult == true) - { - //******"检测到已安装V2Ray!开始卸载V2Ray......"****** - SetUpProgressBarProcessing(12); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DiscoverProxySoft").ToString() - + "V2Ray!" - + Application.Current.FindResource("DisplayInstallInfo_StartRemoveProxy").ToString() - + "V2Ray......"; - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"systemctl stop v2ray"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - saveShellScriptFileName = GenerateRandomScriptFileName(GenerateRandomStr(10)); - - sshShellCommand = $"curl -o {saveShellScriptFileName} https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - functionResult = FileCheckExists(client, $"{saveShellScriptFileName}"); - if (functionResult == false) - { - //***文件下载失败!*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DownloadScriptFailed").ToString(); - MainWindowsShowInfo(currentStatus); - return; - } - - sshShellCommand = $"bash {saveShellScriptFileName} --remove"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"systemctl disable v2ray"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"rm -rf /usr/local/etc/v2ray /var/log/v2ray"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"rm -f {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //sshShellCommand = @"find / -name v2ray"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - functionResult = FileCheckExists(client, @"/usr/local/bin/v2ray"); - if (functionResult == true) - //if (currentShellCommandResult.Contains("/usr/local/bin/v2ray") == true) - { - //******"V2Ray卸载失败!请向开发者问询!"****** - currentStatus = "V2Ray" + Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - else - { - //******"V2Ray卸载成功!"****** - SetUpProgressBarProcessing(16); - currentStatus = "V2Ray" + Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftSuccess").ToString(); - MainWindowsShowInfo(currentStatus); - } - - } - else - { - //******"检测结果:未安装V2Ray!"******04 - SetUpProgressBarProcessing(16); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_NoInstalledSoft").ToString() + "V2Ray!"; - MainWindowsShowInfo(currentStatus); - } - - #endregion - - #region 卸载Trojan-go - - //******"检测系统是否已经安装Trojan-go......"******03 - SetUpProgressBarProcessing(17); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestExistSoft").ToString() + "Trojan-go......"; - MainWindowsShowInfo(currentStatus); - - //sshShellCommand = @"find / -name trojan-go"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //if (currentShellCommandResult.Contains("/usr/local/bin/trojan-go") == true) - functionResult = FileCheckExists(client, @"/usr/local/bin/trojan-go"); - if (functionResult == true) - { - //******"检测到已安装Trojan-go,开始卸载Trojan-go......"****** - SetUpProgressBarProcessing(18); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DiscoverProxySoft").ToString() - + "Trojan-go!" - + Application.Current.FindResource("DisplayInstallInfo_StartRemoveProxy").ToString() - + "Trojan-go......"; - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"systemctl stop trojan-go"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - saveShellScriptFileName = GenerateRandomScriptFileName(GenerateRandomStr(10)); - - sshShellCommand = $"curl -o {saveShellScriptFileName} https://raw.githubusercontent.com/proxysu/shellscript/master/trojan-go.sh"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - functionResult = FileCheckExists(client, $"{saveShellScriptFileName}"); - if (functionResult == false) - { - //***文件下载失败!*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DownloadScriptFailed").ToString(); - MainWindowsShowInfo(currentStatus); - return; - } - - sshShellCommand = $"bash {saveShellScriptFileName} --remove"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"systemctl disable trojan-go"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"rm -rf /usr/local/etc/trojan-go /var/log/trojan-go"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"rm -f {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //sshShellCommand = @"find / -name trojan-go"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //if (currentShellCommandResult.Contains("/usr/local/bin/trojan-go") == true) - functionResult = FileCheckExists(client, @"/usr/local/bin/trojan-go"); - if (functionResult == true) - { - //******"Trojan-go卸载失败!请向开发者问询!"****** - currentStatus = "Trojan-go" + Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - else - { - //******"Trojan-go卸载成功!"****** - SetUpProgressBarProcessing(22); - currentStatus = "Trojan-go" + Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftSuccess").ToString(); - MainWindowsShowInfo(currentStatus); - } - - } - else - { - //******"检测结果:未安装Trojan-go!"******04 - SetUpProgressBarProcessing(22); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_NoInstalledSoft").ToString() + "Trojan-go!"; - MainWindowsShowInfo(currentStatus); - } - - #endregion - - #region 卸载Trojan - - //******"检测系统是否已经安装Trojan......"******03 - SetUpProgressBarProcessing(23); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestExistSoft").ToString() + "Trojan......"; - MainWindowsShowInfo(currentStatus); - - //sshShellCommand = @"find / -name trojan"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //if (currentShellCommandResult.Contains("/usr/local/bin/trojan") == true) - functionResult = FileCheckExists(client, @"/usr/local/bin/trojan"); - if (functionResult == true) - { - //******"检测到已安装Trojan,开始卸载Trojan......"****** - SetUpProgressBarProcessing(24); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DiscoverProxySoft").ToString() - + "Trojan!" - + Application.Current.FindResource("DisplayInstallInfo_StartRemoveProxy").ToString() - + "Trojan......"; - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"systemctl stop trojan"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"systemctl disable trojan"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"rm -rf /usr/local/bin/trojan /etc/systemd/system/trojan.service /usr/local/etc/trojan"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //sshShellCommand = @"find / -name trojan"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //if (currentShellCommandResult.Contains("/usr/local/bin/trojan") == true) - functionResult = FileCheckExists(client, @"/usr/local/bin/trojan"); - if (functionResult == true) - { - //******"Trojan卸载失败!请向开发者问询!"****** - currentStatus = "Trojan" + Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - else - { - //******"Trojan卸载成功!"****** - SetUpProgressBarProcessing(30); - currentStatus = "Trojan" + Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftSuccess").ToString(); - MainWindowsShowInfo(currentStatus); - } - - } - else - { - //******"检测结果:未安装Trojan!"******04 - SetUpProgressBarProcessing(30); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_NoInstalledSoft").ToString() + "Trojan!"; - MainWindowsShowInfo(currentStatus); - } - - #endregion - - #region 卸载SSR - - //******"检测系统是否已经安装SSR......"******03 - SetUpProgressBarProcessing(31); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestExistSoft").ToString() + "SSR......"; - MainWindowsShowInfo(currentStatus); - - //sshShellCommand = @"if [ -f /usr/local/shadowsocks/server.py ];then echo '1';else echo '0'; fi"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //if (currentShellCommandResult.Contains("1") == true) - functionResult = FileCheckExists(client, @"/usr/local/shadowsocks/server.py"); - if (functionResult == true) - { - //******"检测到已安装SSR,开始卸载SSR......"****** - SetUpProgressBarProcessing(32); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DiscoverProxySoft").ToString() - + "SSR!" - + Application.Current.FindResource("DisplayInstallInfo_StartRemoveProxy").ToString() - + "SSR......"; - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"systemctl stop ssr"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - saveShellScriptFileName = GenerateRandomScriptFileName(GenerateRandomStr(10)); - - sshShellCommand = $"curl -o {saveShellScriptFileName} https://raw.githubusercontent.com/proxysu/shellscript/master/ssr/ssr.sh"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - functionResult = FileCheckExists(client, $"{saveShellScriptFileName}"); - if (functionResult == false) - { - //***文件下载失败!*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DownloadScriptFailed").ToString(); - MainWindowsShowInfo(currentStatus); - return; - } - - sshShellCommand = $"bash {saveShellScriptFileName} uninstall"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"systemctl disable ssr"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"rm -f {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //sshShellCommand = @"if [ -f /usr/local/shadowsocks/server.py ];then echo '1';else echo '0'; fi"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //if (currentShellCommandResult.Contains("1") == true) - functionResult = FileCheckExists(client, @"/usr/local/shadowsocks/server.py"); - if (functionResult == true) - { - //******"SSR卸载失败!请向开发者问询!"****** - currentStatus = "SSR" + Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - else - { - //******"SSR卸载成功!"****** - SetUpProgressBarProcessing(36); - currentStatus = "SSR" + Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftSuccess").ToString(); - MainWindowsShowInfo(currentStatus); - } - - } - else - { - //******"检测结果:未安装SSR!"******04 - SetUpProgressBarProcessing(36); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_NoInstalledSoft").ToString() + "SSR!"; - MainWindowsShowInfo(currentStatus); - } - - #endregion - - #region 卸载SS (Shadowsoks-libev) - - //******"检测系统是否已经安装SS (Shadowsoks-libev)......"******03 - SetUpProgressBarProcessing(37); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestExistSoft").ToString() + "SS (Shadowsoks-libev)......"; - MainWindowsShowInfo(currentStatus); - - //sshShellCommand = @"find / -name ss-server"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //if (currentShellCommandResult.Contains("/usr/local/bin/ss-server") == true) - functionResult = FileCheckExists(client, @"/usr/local/bin/ss-server"); - if (functionResult == true) - { - //******"检测到SS(Shadowsoks-libev),开始卸载SS(Shadowsoks-libev)......"****** - SetUpProgressBarProcessing(38); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DiscoverProxySoft").ToString() - + "SS (Shadowsoks-libev)!" - + Application.Current.FindResource("DisplayInstallInfo_StartRemoveProxy").ToString() - + "SS (Shadowsoks-libev)......"; - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"systemctl stop ss-server"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - saveShellScriptFileName = GenerateRandomScriptFileName(GenerateRandomStr(10)); - - sshShellCommand = $"curl -o {saveShellScriptFileName} https://raw.githubusercontent.com/proxysu/shellscript/master/ss/ss-install.sh"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - functionResult = FileCheckExists(client, $"{saveShellScriptFileName}"); - if (functionResult == false) - { - //***文件下载失败!*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DownloadScriptFailed").ToString(); - MainWindowsShowInfo(currentStatus); - return; - } - - sshShellCommand = $"bash {saveShellScriptFileName} uninstall"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"systemctl disable ss-server"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"rm -f {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //卸载插件 - sshShellCommand = @"rm -f /usr/local/bin/obfs-server /usr/local/bin/obfs-local /usr/local/bin/v2ray-plugin /usr/local/bin/kcptun-plugin-server /usr/local/bin/goquiet-plugin-server /usr/local/bin/cloak-plugin-server"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //sshShellCommand = @"find / -name ss-server"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //if (currentShellCommandResult.Contains("/usr/local/bin/ss-server") == true) - functionResult = FileCheckExists(client, @"/usr/local/bin/ss-server"); - if (functionResult == true) - { - //******"SS(Shadowsoks-libev)卸载失败!请向开发者问询!"****** - currentStatus = "SS (Shadowsoks-libev)" + Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - else - { - //******"SS (Shadowsoks-libev)卸载成功!"****** - SetUpProgressBarProcessing(40); - currentStatus = "SS (Shadowsoks-libev)" + Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftSuccess").ToString(); - MainWindowsShowInfo(currentStatus); - } - - } - else - { - //******"检测结果:未安装SS(Shadowsoks-libev)!"******04 - SetUpProgressBarProcessing(40); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_NoInstalledSoft").ToString() + "SS (Shadowsoks-libev)!"; - MainWindowsShowInfo(currentStatus); - } - - - #endregion - - #region 卸载acme.sh - - //******"检测系统是否已经安装acme.sh......"******03 - SetUpProgressBarProcessing(41); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestExistSoft").ToString() + "acme.sh......"; - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"if [[ -d ~/.acme.sh ]];then echo '1';else echo '0'; fi"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - if (currentShellCommandResult.Contains("1") == true) - { - //******"检测到acme.sh,开始卸载acme.sh......"****** - SetUpProgressBarProcessing(42); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DiscoverProxySoft").ToString() - + "acme.sh!" - + Application.Current.FindResource("DisplayInstallInfo_StartRemoveProxy").ToString() - + "acme.sh......"; - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"/root/.acme.sh/acme.sh --uninstall"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"rm -r ~/.acme.sh"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"if [[ -d ~/.acme.sh ]];then echo '1';else echo '0'; fi"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - if (currentShellCommandResult.Contains("1") == true) - { - //******"acme.sh卸载失败!请向开发者问询!"****** - currentStatus = "acme.sh" + Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - else - { - sshShellCommand = @"sed -i 's/. ""/root/.acme.sh/acme.sh.env""//g' /root/.bashrc"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //******"acme.sh卸载成功!"****** - SetUpProgressBarProcessing(46); - currentStatus = "acme.sh" + Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftSuccess").ToString(); - MainWindowsShowInfo(currentStatus); - } - - } - else - { - //******"检测结果:未安装acme.sh!"******04 - SetUpProgressBarProcessing(46); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_NoInstalledSoft").ToString() + "acme.sh!"; - MainWindowsShowInfo(currentStatus); - } - - #endregion - - - #region 卸载NaiveProxy - - //******"检测系统是否已经安装NaiveProxy......"******03 - SetUpProgressBarProcessing(48); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestExistSoft").ToString() + "NaiveProxy......"; - MainWindowsShowInfo(currentStatus); - - //sshShellCommand = @"find / -name caddy"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //if (currentShellCommandResult.Contains("/usr/bin/caddy") == true) - functionResult = FileCheckExists(client, @"/etc/caddy/naive"); - if (functionResult == true) - { - //******"检测到NaiveProxy,开始卸载NaiveProxy......"****** - SetUpProgressBarProcessing(49); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DiscoverProxySoft").ToString() - + "NaiveProxy!" - + Application.Current.FindResource("DisplayInstallInfo_StartRemoveProxy").ToString() - + "NaiveProxy......"; - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"systemctl stop caddy"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"systemctl disable caddy"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - saveShellScriptFileName = GenerateRandomScriptFileName(GenerateRandomStr(10)); - - sshShellCommand = $"curl -o {saveShellScriptFileName} https://raw.githubusercontent.com/proxysu/shellscript/master/Caddy-Naive/caddy-naive-install.sh"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - functionResult = FileCheckExists(client, $"{saveShellScriptFileName}"); - if (functionResult == false) - { - //***文件下载失败!*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DownloadScriptFailed").ToString(); - MainWindowsShowInfo(currentStatus); - return; - } - - sshShellCommand = $"bash {saveShellScriptFileName} uninstall"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"rm -f {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - - - //sshShellCommand = @"find / -name caddy"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //if (currentShellCommandResult.Contains("/usr/local/bin/caddy") == true) - functionResult = FileCheckExists(client, @"/usr/bin/naive"); - if (functionResult == true) - { - //******"Caddy/NaiveProxy卸载失败!请向开发者问询!"****** - currentStatus = "NaiveProxy" + Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - else - { - //******"Caddy/NaiveProxy卸载成功!"****** - SetUpProgressBarProcessing(60); - currentStatus = "NaiveProxy" + Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftSuccess").ToString(); - MainWindowsShowInfo(currentStatus); - } - - } - else - { - //******"检测结果:未安装NaiveProxy!"******04 - SetUpProgressBarProcessing(60); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_NoInstalledSoft").ToString() + "NaiveProxy!"; - MainWindowsShowInfo(currentStatus); - } - - #endregion - - - #region 卸载Caddy - - //******"检测系统是否已经安装Caddy......"******03 - SetUpProgressBarProcessing(48); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestExistSoft").ToString() + "Caddy......"; - MainWindowsShowInfo(currentStatus); - - //sshShellCommand = @"find / -name caddy"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //if (currentShellCommandResult.Contains("/usr/bin/caddy") == true) - functionResult = FileCheckExists(client, @"/usr/bin/caddy"); - if (functionResult == true) - { - //******"检测到Caddy,开始卸载Caddy......"****** - SetUpProgressBarProcessing(49); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DiscoverProxySoft").ToString() - + "Caddy!" - + Application.Current.FindResource("DisplayInstallInfo_StartRemoveProxy").ToString() - + "Caddy......"; - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"systemctl stop caddy"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"systemctl disable caddy"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //检测系统是否支持yum 或 apt-get或zypper - //如果不存在组件,则命令结果为空,string.IsNullOrEmpty值为真, - - sshShellCommand = @"command -v apt-get"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - bool getApt = !String.IsNullOrEmpty(currentShellCommandResult); - - sshShellCommand = @"command -v dnf"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - bool getDnf = !String.IsNullOrEmpty(currentShellCommandResult); - - sshShellCommand = @"command -v yum"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - bool getYum = !String.IsNullOrEmpty(currentShellCommandResult); - - SetUpProgressBarProcessing(55); - - sshShellCommand = @"command -v zypper"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - bool getZypper = String.IsNullOrEmpty(currentShellCommandResult); - - - string sshCmdRemove = ""; - //string sshCmdRemove2; - //设置安装软件所用的命令格式 - if (getApt == true) - { - //sshCmdUpdate = @"apt-get update"; - sshCmdRemove = @"apt-get -y autoremove --purge "; - } - else if (getDnf == true) - { - //sshCmdUpdate = @"dnf -q makecache"; - sshCmdRemove = @"dnf -y remove "; - } - else if (getYum == true) - { - //sshCmdUpdate = @"yum -q makecache"; - sshCmdRemove = @"yum -y remove "; - } - else if (getZypper == true) - { - //sshCmdUpdate = @"zypper ref"; - sshCmdRemove = @"zypper -y remove "; - } - - sshShellCommand = $"{sshCmdRemove}caddy"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //sshShellCommand = @"find / -name caddy"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //if (currentShellCommandResult.Contains("/usr/local/bin/caddy") == true) - functionResult = FileCheckExists(client, @"/usr/bin/caddy"); - if (functionResult == true) - { - //******"Caddy卸载失败!请向开发者问询!"****** - currentStatus = "Caddy" + Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - else - { - //******"Caddy卸载成功!"****** - SetUpProgressBarProcessing(60); - currentStatus = "Caddy" + Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftSuccess").ToString(); - MainWindowsShowInfo(currentStatus); - } - - } - else - { - //******"检测结果:未安装Caddy!"******04 - SetUpProgressBarProcessing(60); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_NoInstalledSoft").ToString() + "Caddy!"; - MainWindowsShowInfo(currentStatus); - } - - #endregion - - #region 卸载MtProto - //******"检测系统是否已经安装MtProto......"******03 - SetUpProgressBarProcessing(61); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestExistSoft").ToString() + "MtProto......"; - MainWindowsShowInfo(currentStatus); - - //sshShellCommand = @"find / -name mtg"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //if (currentShellCommandResult.Contains("/usr/local/bin/mtg") == true) - functionResult = FileCheckExists(client, @"/usr/local/bin/mtg"); - if (functionResult == true) - { - //******"检测到MtProto,开始卸载MtProto......"****** - SetUpProgressBarProcessing(63); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DiscoverProxySoft").ToString() - + "MtProto!" - + Application.Current.FindResource("DisplayInstallInfo_StartRemoveProxy").ToString() - + "MtProto......"; - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"systemctl stop mtg"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"systemctl disable mtg"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"rm -rf /etc/systemd/system/mtg.service"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"rm -rf /usr/local/bin/mtg"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"rm -rf /usr/local/etc/mtg_info.json"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"rm -rf /usr/local/etc/mtg.sh"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //sshShellCommand = @"find / -name mtg"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //if (currentShellCommandResult.Contains("/usr/local/bin/mtg") == true) - functionResult = FileCheckExists(client, @"/usr/local/bin/mtg"); - if (functionResult == true) - { - //******"MtProto卸载失败!请向开发者问询!"****** - currentStatus = "MtProto" + Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - else - { - //******"MtProto卸载成功!"****** - SetUpProgressBarProcessing(65); - currentStatus = "MtProto" + Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftSuccess").ToString(); - MainWindowsShowInfo(currentStatus); - } - - } - else - { - //******"检测结果:未安装MtProto!"******04 - SetUpProgressBarProcessing(65); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_NoInstalledSoft").ToString() + "MtProto!"; - MainWindowsShowInfo(currentStatus); - } - #endregion - - #region 卸载Xay - - //******"检测系统是否已经安装Xray......"******03 - SetUpProgressBarProcessing(66); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestExistSoft").ToString() + "Xray......"; - MainWindowsShowInfo(currentStatus); - - //sshShellCommand = @"find / -name v2ray"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - functionResult = FileCheckExists(client, @"/usr/local/bin/xray"); - if (functionResult == true) - { - //******"检测到已安装V2Ray!开始卸载Xray......"****** - SetUpProgressBarProcessing(68); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DiscoverProxySoft").ToString() - + "Xray!" - + Application.Current.FindResource("DisplayInstallInfo_StartRemoveProxy").ToString() - + "Xray......"; - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"systemctl stop xray"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - saveShellScriptFileName = GenerateRandomScriptFileName(GenerateRandomStr(10)); - - sshShellCommand = $"curl -o {saveShellScriptFileName} https://raw.githubusercontent.com/XTLS/Xray-install/main/install-release.sh"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - functionResult = FileCheckExists(client, $"{saveShellScriptFileName}"); - if (functionResult == false) - { - //***文件下载失败!*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DownloadScriptFailed").ToString(); - MainWindowsShowInfo(currentStatus); - return; - } - - sshShellCommand = $"bash {saveShellScriptFileName} --remove"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"systemctl disable xray"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"rm -rf /usr/local/etc/xray /var/log/xray"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"rm -f {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - functionResult = FileCheckExists(client, @"/usr/local/bin/xray"); - if (functionResult == true) - //if (currentShellCommandResult.Contains("/usr/local/bin/v2ray") == true) - { - //******"V2Ray卸载失败!请向开发者问询!"****** - currentStatus = "Xray" + Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - else - { - //******"V2Ray卸载成功!"****** - SetUpProgressBarProcessing(70); - currentStatus = "Xray" + Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftSuccess").ToString(); - MainWindowsShowInfo(currentStatus); - } - - } - else - { - //******"检测结果:未安装Xray!"******04 - SetUpProgressBarProcessing(70); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_NoInstalledSoft").ToString() + "Xray!"; - MainWindowsShowInfo(currentStatus); - } - - #endregion - - //如果是纯ipv6主机,则需要删除前面设置的Nat64网关 - if (onlyIpv6 == true) - { - SetUpNat64(client, false); - //sshShellCommand = $"{sshCmdUpdate}"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - } - - - //******"卸载成功!"******04 - SetUpProgressBarProcessing(100); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftSuccess").ToString(); - MainWindowsShowInfo(currentStatus); - client.Disconnect(); - - MessageBox.Show(Application.Current.FindResource("DisplayInstallInfo_RemoveProxySoftSuccess").ToString()); - - return; - } - } - catch (Exception ex1)//例外处理 - #region 例外处理 - { - ProcessException(ex1.Message); - - //****** "主机登录失败!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - #endregion - - } - - #region 启用Root密码登录 - private void ButtonEnableRootPassWord_Click(object sender, RoutedEventArgs e) - { - //******"本功能需要当前登录的账户具有sudo权限,是否为远程主机启用root账户并设置密码?"****** - string messageShow = Application.Current.FindResource("MessageBoxShow_EnableRootPassword").ToString(); - MessageBoxResult messageBoxResult = MessageBox.Show(messageShow, "", MessageBoxButton.YesNo, MessageBoxImage.Question); - if (messageBoxResult == MessageBoxResult.Yes) - { - ConnectionInfo connectionInfo = GenerateConnectionInfo(); - if (connectionInfo == null) - { - //****** "远程主机连接信息有误,请检查!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostConnection").ToString()); - return; - } - - ReceiveConfigurationParameters[4] = PreTrim(TextBoxHost.Text); ;//传递主机地址 - ReceiveConfigurationParameters[2] = PasswordBoxHostPassword.Password;//传递当前账户密码 - - installationDegree = 0; - TextBoxMonitorCommandResults.Text = ""; - Thread thread = new Thread(() => EnableRootPassWord(connectionInfo)); - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - } - } - //启用Root密码登录进程 - private void EnableRootPassWord(ConnectionInfo connectionInfo) - { - functionResult = true; - getApt = false; - getDnf = false; - getYum = false; - onlyIpv6 = false; - - //******"正在登录远程主机......"****** - SetUpProgressBarProcessing(1); - string currentStatus = Application.Current.FindResource("DisplayInstallInfo_Login").ToString(); - MainWindowsShowInfo(currentStatus); - - try - { - #region 主机指纹,暂未启用 - //byte[] expectedFingerPrint = new byte[] { - // 0x66, 0x31, 0xaf, 0x00, 0x54, 0xb9, 0x87, 0x31, - // 0xff, 0x58, 0x1c, 0x31, 0xb1, 0xa2, 0x4c, 0x6b - // }; - #endregion - using (var client = new SshClient(connectionInfo)) - - { - #region ssh登录验证主机指纹代码块,暂未启用 - // client.HostKeyReceived += (sender, e) => - // { - // if (expectedFingerPrint.Length == e.FingerPrint.Length) - // { - // for (var i = 0; i < expectedFingerPrint.Length; i++) - // { - // if (expectedFingerPrint[i] != e.FingerPrint[i]) - // { - // e.CanTrust = false; - // break; - // } - // } - // } - // else - // { - // e.CanTrust = false; - // } - // }; - #endregion - - client.Connect(); - if (client.IsConnected == true) - { - //******"主机登录成功"****** - SetUpProgressBarProcessing(5); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginSuccessful").ToString(); - MainWindowsShowInfo(currentStatus); - } - - //检测root权限 5--7 - //******"检测是否运行在root权限下..."******01 - SetUpProgressBarProcessing(5); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DetectionRootPermission").ToString(); - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"id -u"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - if (currentShellCommandResult.TrimEnd('\r', '\n').Equals("0") == true) - { - //******"当前账户已经具有root权限,无需再设置!"****** - currentStatus = Application.Current.FindResource("MessageBoxShow_AlreadyRoot").ToString(); - MainWindowsShowInfo(currentStatus); - MessageBox.Show(currentStatus); - client.Disconnect(); - return; - } - - SetUpProgressBarProcessing(10); - string hostPassword = "'" + ReceiveConfigurationParameters[2] + "'"; - //MessageBox.Show(hostPassword); - sshShellCommand = $"echo {hostPassword} | sudo -S id -u"; - //MessageBox.Show(sshShellCommand); - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - if (currentShellCommandResult.TrimEnd('\r', '\n').Equals("0") == false) - { - //******"当前账户无法获取sudo权限,设置失败!"****** - currentStatus = Application.Current.FindResource("MessageBoxShow_NoSudoToAccount").ToString(); - MainWindowsShowInfo(currentStatus); - MessageBox.Show(currentStatus); - client.Disconnect(); - return; - } - - SetUpProgressBarProcessing(20); - string cmdPre = $"echo {hostPassword} | sudo -S id -u" + ';'; - sshShellCommand = cmdPre + @"sudo sed -i 's/PermitRootLogin /#PermitRootLogin /g' /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = cmdPre + @"sudo sed -i 's/PasswordAuthentication /#PasswordAuthentication /g' /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - SetUpProgressBarProcessing(30); - sshShellCommand = cmdPre + @"sudo sed -i 's/PermitEmptyPasswords /#PermitEmptyPasswords /g' /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = cmdPre + @"echo 'PermitRootLogin yes' | sudo tee -a /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - SetUpProgressBarProcessing(40); - sshShellCommand = cmdPre + @"echo 'PasswordAuthentication yes' | sudo tee -a /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = cmdPre + @"echo 'PermitEmptyPasswords no' | sudo tee -a /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - SetUpProgressBarProcessing(60); - sshShellCommand = cmdPre + @"sudo systemctl restart sshd"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //******"生成20位随机密码!"****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_GenerateRandomPassword").ToString(); - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"cat /dev/urandom | tr -dc '_A-Z#\-+=a-z(0-9%^>)]{<|' | head -c 20 ; echo ''"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - SetUpProgressBarProcessing(80); - string setPassword = currentShellCommandResult.TrimEnd('\r', '\n') + '\n'; - - sshShellCommand = cmdPre + $"echo -e \"{setPassword}{setPassword}\" | sudo passwd root"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - client.Disconnect(); - - //***保存密码信息*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_EnableRootPasswordSavePasswordInfo").ToString(); - MainWindowsShowInfo(currentStatus); - - string filePath = ReceiveConfigurationParameters[4].Replace(':', '_'); - CheckDir(filePath); - using (StreamWriter sw = new StreamWriter($"{filePath}\\host_password_info.txt")) - { - sw.WriteLine(ReceiveConfigurationParameters[4]); - sw.WriteLine("root"); - sw.WriteLine(setPassword); - } - - SetUpProgressBarProcessing(100); - //***远程主机Root账户密码登录已启用,密码保存在随后打开的文件夹中!*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_EnableRootPasswordSuccess").ToString(); - MainWindowsShowInfo(currentStatus); - MessageBox.Show(currentStatus); - System.Diagnostics.Process.Start("explorer.exe", filePath); - return; - } - } - catch (Exception ex1)//例外处理 - #region 例外处理 - { - ProcessException(ex1.Message); - - //****** "主机登录失败!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - #endregion - - } - - #endregion - - #region 启用Root证书密钥登录 - private void ButtonEnableRootCert_Click(object sender, RoutedEventArgs e) - { - //******"本功能需要当前登录的账户具有root或者sudo权限,是否为远程主机启用root证书密钥登录?"****** - string messageShow = Application.Current.FindResource("MessageBoxShow_ButtonEnableRootCert").ToString(); - MessageBoxResult messageBoxResult = MessageBox.Show(messageShow, "", MessageBoxButton.YesNo, MessageBoxImage.Question); - if (messageBoxResult == MessageBoxResult.Yes) - { - ConnectionInfo connectionInfo = GenerateConnectionInfo(); - if (connectionInfo == null) - { - //****** "远程主机连接信息有误,请检查!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostConnection").ToString()); - return; - } - - ReceiveConfigurationParameters[4] = PreTrim(TextBoxHost.Text);//传递主机地址 - ReceiveConfigurationParameters[2] = PasswordBoxHostPassword.Password; - - installationDegree = 0; - TextBoxMonitorCommandResults.Text = ""; - Thread thread = new Thread(() => EnableRootCert(connectionInfo)); - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - } - } - - //启用Root证书密钥登录进程 - private void EnableRootCert(ConnectionInfo connectionInfo) - { - functionResult = true; - getApt = false; - getDnf = false; - getYum = false; - onlyIpv6 = false; - - string filePath = String.Empty; - - //******"正在登录远程主机......"****** - SetUpProgressBarProcessing(1); - string currentStatus = Application.Current.FindResource("DisplayInstallInfo_Login").ToString(); - MainWindowsShowInfo(currentStatus); - - try - { - #region 主机指纹,暂未启用 - //byte[] expectedFingerPrint = new byte[] { - // 0x66, 0x31, 0xaf, 0x00, 0x54, 0xb9, 0x87, 0x31, - // 0xff, 0x58, 0x1c, 0x31, 0xb1, 0xa2, 0x4c, 0x6b - // }; - #endregion - using (var client = new SshClient(connectionInfo)) - - { - #region ssh登录验证主机指纹代码块,暂未启用 - // client.HostKeyReceived += (sender, e) => - // { - // if (expectedFingerPrint.Length == e.FingerPrint.Length) - // { - // for (var i = 0; i < expectedFingerPrint.Length; i++) - // { - // if (expectedFingerPrint[i] != e.FingerPrint[i]) - // { - // e.CanTrust = false; - // break; - // } - // } - // } - // else - // { - // e.CanTrust = false; - // } - // }; - #endregion - - client.Connect(); - if (client.IsConnected == true) - { - //******"主机登录成功"****** - SetUpProgressBarProcessing(5); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginSuccessful").ToString(); - MainWindowsShowInfo(currentStatus); - } - - //检测root权限 5--7 - //******"检测是否运行在root权限下..."******01 - SetUpProgressBarProcessing(5); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DetectionRootPermission").ToString(); - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"id -u"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - if (currentShellCommandResult.TrimEnd('\r', '\n').Equals("0") == true) - { - SetUpProgressBarProcessing(20); - - //***正在生成密钥......*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_EnableRootCertGenerateCert").ToString(); - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"rm -rf /tmp/rootuser.key /tmp/rootuser.key.pub"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"yes | ssh-keygen -b 2048 -t rsa -f /tmp/rootuser.key -q -N ''"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"yes | ssh-keygen -p -P '' -N '' -m PEM -f /tmp/rootuser.key"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"mkdir -p /root/.ssh"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"cat /tmp/rootuser.key.pub | tee -a /root/.ssh/authorized_keys"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"chmod 777 /tmp/rootuser.key"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - SetUpProgressBarProcessing(30); - //***正在下载密钥......*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_EnableRootCertDownloadCert").ToString(); - MainWindowsShowInfo(currentStatus); - - filePath = CreateConfigSaveDir(@"root_cert", ReceiveConfigurationParameters[4].Replace(':', '_')); - string localConfigSavePathAndFileName = $"{filePath}\\rootuser.key"; - string remoteConfigPathAndFileName = @"/tmp/rootuser.key"; - DownloadConfig(connectionInfo, localConfigSavePathAndFileName, remoteConfigPathAndFileName); - - localConfigSavePathAndFileName = $"{filePath}\\rootuser.key.pub"; - remoteConfigPathAndFileName = @"/tmp/rootuser.key.pub"; - DownloadConfig(connectionInfo, localConfigSavePathAndFileName, remoteConfigPathAndFileName); - - sshShellCommand = @"rm -rf /tmp/rootuser.key /tmp/rootuser.key.pub"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - SetUpProgressBarProcessing(50); - //***远程主机启用密钥登录......*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_EnableRootCertSetCertEnable").ToString(); - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"sed -i 's/PermitRootLogin /#PermitRootLogin /g' /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"sed -i 's/StrictModes /#StrictModes /g' /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - SetUpProgressBarProcessing(70); - sshShellCommand = @"sed -i 's/PubkeyAuthentication /#PubkeyAuthentication /g' /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"sed -i 's/#AuthorizedKeysFile /AuthorizedKeysFile /g' /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - SetUpProgressBarProcessing(80); - sshShellCommand = @"sed -i 's/#RSAAuthentication /RSAAuthentication /g' /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"echo 'PermitRootLogin yes' | tee -a /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - SetUpProgressBarProcessing(90); - sshShellCommand = @"echo 'StrictModes no' | tee -a /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"echo 'PubkeyAuthentication yes' | tee -a /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"systemctl restart sshd"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - } - else - { - SetUpProgressBarProcessing(10); - string hostPassword = "'" + ReceiveConfigurationParameters[2] + "'"; - //MessageBox.Show(hostPassword); - sshShellCommand = $"echo {hostPassword} | sudo -S id -u"; - //MessageBox.Show(sshShellCommand); - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - //MessageBox.Show(currentShellCommandResult); - if (currentShellCommandResult.TrimEnd('\r', '\n').Equals("0") == false) - { - //******"当前账户无法获取sudo权限,设置失败!"****** - currentStatus = Application.Current.FindResource("MessageBoxShow_NoSudoToAccount").ToString(); - MainWindowsShowInfo(currentStatus); - MessageBox.Show(currentStatus); - client.Disconnect(); - return; - } - - SetUpProgressBarProcessing(20); - string cmdPre = $"echo {hostPassword} | sudo -S id -u" + ';'; - //***正在生成密钥......*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_EnableRootCertGenerateCert").ToString(); - MainWindowsShowInfo(currentStatus); - - sshShellCommand = cmdPre + @"sudo rm -rf /tmp/rootuser.key /tmp/rootuser.key.pub"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = cmdPre + @"yes | sudo ssh-keygen -b 2048 -t rsa -f /tmp/rootuser.key -q -N ''"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = cmdPre + @"yes | sudo ssh-keygen -p -P '' -N '' -m PEM -f /tmp/rootuser.key"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = cmdPre + @"sudo mkdir -p /root/.ssh"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = cmdPre + @"cat /tmp/rootuser.key.pub | sudo tee -a /root/.ssh/authorized_keys"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = cmdPre + @"sudo chmod 777 /tmp/rootuser.key"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - SetUpProgressBarProcessing(30); - //***正在下载密钥......*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_EnableRootCertDownloadCert").ToString(); - MainWindowsShowInfo(currentStatus); - - filePath = CreateConfigSaveDir(@"root_cert", ReceiveConfigurationParameters[4].Replace(':', '_')); - string localConfigSavePathAndFileName = $"{filePath}\\rootuser.key"; - string remoteConfigPathAndFileName = @"/tmp/rootuser.key"; - DownloadConfig(connectionInfo, localConfigSavePathAndFileName, remoteConfigPathAndFileName); - - localConfigSavePathAndFileName = $"{filePath}\\rootuser.key.pub"; - remoteConfigPathAndFileName = @"/tmp/rootuser.key.pub"; - DownloadConfig(connectionInfo, localConfigSavePathAndFileName, remoteConfigPathAndFileName); - - sshShellCommand = cmdPre + @"sudo rm -rf /tmp/rootuser.key /tmp/rootuser.key.pub"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - SetUpProgressBarProcessing(50); - //***远程主机启用密钥登录......*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_EnableRootCertSetCertEnable").ToString(); - MainWindowsShowInfo(currentStatus); - - //string cmdPre = $"echo {hostPassword} | sudo -S id -u" + ';'; - sshShellCommand = cmdPre + @"sudo sed -i 's/PermitRootLogin /#PermitRootLogin /g' /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = cmdPre + @"sudo sed -i 's/StrictModes /#StrictModes /g' /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - SetUpProgressBarProcessing(70); - sshShellCommand = cmdPre + @"sudo sed -i 's/PubkeyAuthentication /#PubkeyAuthentication /g' /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = cmdPre + @"sudo sed -i 's/#AuthorizedKeysFile /AuthorizedKeysFile /g' /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - SetUpProgressBarProcessing(80); - sshShellCommand = cmdPre + @"sudo sed -i 's/#RSAAuthentication /RSAAuthentication /g' /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = cmdPre + @"echo 'PermitRootLogin yes' | sudo tee -a /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - SetUpProgressBarProcessing(90); - sshShellCommand = cmdPre + @"echo 'StrictModes no' | sudo tee -a /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = cmdPre + @"echo 'PubkeyAuthentication yes' | sudo tee -a /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = cmdPre + @"sudo systemctl restart sshd"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - } - client.Disconnect(); - - SetUpProgressBarProcessing(100); - //******"远程主机root账户证书密钥登录已启用,密钥文件rootuser.key保存在随后打开的文件夹中!"****** - currentStatus = Application.Current.FindResource("MessageBoxShow_ButtonEnableRootCertSuccess").ToString(); - MainWindowsShowInfo(currentStatus); - MessageBox.Show(currentStatus); - System.Diagnostics.Process.Start("explorer.exe", filePath); - - return; - } - } - catch (Exception ex1)//例外处理 - #region 例外处理 - { - ProcessException(ex1.Message); - - //****** "主机登录失败!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - #endregion - - } - - - #endregion - - #region 禁止root账户密码登录 - //root禁止密码登录 - private void ButtonRootProhibitsPasswordLogin_Click(object sender, RoutedEventArgs e) - { - //******"本功能需要远程主机已经开启了其他登录方式,如密钥方式等,否则将可能造成远程主机无法连接,是否禁止远程主机的root账户密码登录方式?"****** - string messageShow = Application.Current.FindResource("MessageBoxShow_ButtonRootProhibitsPasswordLogin").ToString(); - MessageBoxResult messageBoxResult = MessageBox.Show(messageShow, "", MessageBoxButton.YesNo, MessageBoxImage.Question); - if (messageBoxResult == MessageBoxResult.Yes) - { - ConnectionInfo connectionInfo = GenerateConnectionInfo(); - if (connectionInfo == null) - { - //****** "远程主机连接信息有误,请检查!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostConnection").ToString()); - return; - } - - ReceiveConfigurationParameters[4] = PreTrim(TextBoxHost.Text);//传递主机地址 - ReceiveConfigurationParameters[2] = PasswordBoxHostPassword.Password;//传递主机密码 - - installationDegree = 0; - TextBoxMonitorCommandResults.Text = ""; - Thread thread = new Thread(() => RootProhibitsPasswordLogin(connectionInfo)); - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - } - } - - //禁止root密码登录进程 - private void RootProhibitsPasswordLogin(ConnectionInfo connectionInfo) - { - functionResult = true; - getApt = false; - getDnf = false; - getYum = false; - onlyIpv6 = false; - - string filePath = String.Empty; - - //******"正在登录远程主机......"****** - SetUpProgressBarProcessing(1); - string currentStatus = Application.Current.FindResource("DisplayInstallInfo_Login").ToString(); - MainWindowsShowInfo(currentStatus); - - try - { - #region 主机指纹,暂未启用 - //byte[] expectedFingerPrint = new byte[] { - // 0x66, 0x31, 0xaf, 0x00, 0x54, 0xb9, 0x87, 0x31, - // 0xff, 0x58, 0x1c, 0x31, 0xb1, 0xa2, 0x4c, 0x6b - // }; - #endregion - using (var client = new SshClient(connectionInfo)) - - { - #region ssh登录验证主机指纹代码块,暂未启用 - // client.HostKeyReceived += (sender, e) => - // { - // if (expectedFingerPrint.Length == e.FingerPrint.Length) - // { - // for (var i = 0; i < expectedFingerPrint.Length; i++) - // { - // if (expectedFingerPrint[i] != e.FingerPrint[i]) - // { - // e.CanTrust = false; - // break; - // } - // } - // } - // else - // { - // e.CanTrust = false; - // } - // }; - #endregion - - client.Connect(); - if (client.IsConnected == true) - { - //******"主机登录成功"****** - SetUpProgressBarProcessing(5); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginSuccessful").ToString(); - MainWindowsShowInfo(currentStatus); - } - - //检测root权限 5--7 - //******"检测是否运行在root权限下..."******01 - SetUpProgressBarProcessing(5); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DetectionRootPermission").ToString(); - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"id -u"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - if (currentShellCommandResult.TrimEnd('\r', '\n').Equals("0") == true) - { - SetUpProgressBarProcessing(20); - - //***正在关闭root账户密码登录方式......*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_SetRootProhibitsPasswordLogin").ToString(); - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"sed -i 's/PasswordAuthentication /#PasswordAuthentication /g' /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"sed -i 's/PermitEmptyPasswords /#PermitEmptyPasswords /g' /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"echo 'PasswordAuthentication no' | tee -a /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"echo 'PermitEmptyPasswords no' | tee -a /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"systemctl restart sshd"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - } - else - { - SetUpProgressBarProcessing(10); - string hostPassword = "'" + ReceiveConfigurationParameters[2] + "'"; - //MessageBox.Show(hostPassword); - sshShellCommand = $"echo {hostPassword} | sudo -S id -u"; - //MessageBox.Show(sshShellCommand); - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - //MessageBox.Show(currentShellCommandResult); - if (currentShellCommandResult.TrimEnd('\r', '\n').Equals("0") == false) - { - //******"当前账户无法获取sudo权限,设置失败!"****** - currentStatus = Application.Current.FindResource("MessageBoxShow_NoSudoToAccount").ToString(); - MainWindowsShowInfo(currentStatus); - MessageBox.Show(currentStatus); - client.Disconnect(); - return; - } - - SetUpProgressBarProcessing(20); - string cmdPre = $"echo {hostPassword} | sudo -S id -u" + ';'; - - //***正在关闭root账户密码登录方式......*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_SetRootProhibitsPasswordLogin").ToString(); - MainWindowsShowInfo(currentStatus); - - sshShellCommand = cmdPre + @"sudo sed -i 's/PasswordAuthentication /#PasswordAuthentication /g' /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = cmdPre + @"sudo sed -i 's/PermitEmptyPasswords /#PermitEmptyPasswords /g' /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = cmdPre + @"echo 'PasswordAuthentication no' | sudo tee -a /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = cmdPre + @"echo 'PermitEmptyPasswords no' | sudo tee -a /etc/ssh/sshd_config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = cmdPre + @"sudo systemctl restart sshd"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - } - client.Disconnect(); - - SetUpProgressBarProcessing(100); - //******"远程主机root账户密码登录方式已关闭!"****** - currentStatus = Application.Current.FindResource("MessageBoxShow_RootProhibitsPasswordLoginOK").ToString(); - MainWindowsShowInfo(currentStatus); - MessageBox.Show(currentStatus); - - return; - } - } - catch (Exception ex1)//例外处理 - #region 例外处理 - { - ProcessException(ex1.Message); - - //****** "主机登录失败!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginFailed").ToString(); - MainWindowsShowInfo(currentStatus); - } - #endregion - } - #endregion - - //安装日志另存为... - private void ButtonSaveInstalledLog_Click(object sender, RoutedEventArgs e) - { - string logSaveName = ChooseSaveFile("Log Save as...", $"{pwdir}"); - if (String.IsNullOrEmpty(logSaveName) == false) - { - using (StreamWriter sw = new StreamWriter($"{logSaveName}")) - { - sw.WriteLine($"{TextBoxMonitorCommandResults.Text}"); - } - } - } - private string ChooseSaveFile(string title, string initFolder) - { - SaveFileDialog dlg = new SaveFileDialog(); - dlg.Title = title; - string localTime = DateTime.Now.ToLocalTime().ToString().Replace(' ', '-').Replace(':', '-').Replace('/', '-').Replace('\\', '-'); - dlg.FileName = $"{PreTrim(TextBoxHost.Text).Replace(':', '_')}_{localTime}.txt"; // Default file name - dlg.DefaultExt = ".txt"; // Default file extension - dlg.Filter = "Text documents|*.txt"; // Filter files by extension - dlg.InitialDirectory = initFolder; - - // Process save file dialog box results - if (dlg.ShowDialog() == true) - { - return dlg.FileName; - } - else - { - return null; - } - } - - #endregion - - #region 标签页控制 - - private void ButtonWebBrowserHomePage_Click(object sender, RoutedEventArgs e) - { - try - { - WebBrowserResourcesAndTools.Source = new Uri("https://github.com/proxysu/windows/wiki/ResourcesAndTools"); - } - catch (Exception ex) - { - MessageBox.Show(ex.Message); - } - } - private void ButtonWebBrowserBack_Click(object sender, RoutedEventArgs e) - { - try - { - WebBrowserResourcesAndTools.GoBack(); - } - catch (Exception ex) - { - MessageBox.Show(ex.Message); - } - } - - private void ButtonWebBrowserForward_Click(object sender, RoutedEventArgs e) - { - try - { - WebBrowserResourcesAndTools.GoForward(); - } - catch (Exception ex) - { - MessageBox.Show(ex.Message); - } - } - - - - #region 免翻网址资源标签 - private void ButtonWebBrowserHomePageFreeWallURL_Click(object sender, RoutedEventArgs e) - { - try - { - WebBrowserResourcesAndToolsFreeWallURL.Source = new Uri("https://github.com/proxysu/windows/wiki/FreeWallURL"); - } - catch (Exception ex) - { - MessageBox.Show(ex.Message); - } - } - - private void ButtonWebBrowserBackFreeWallURL_Click(object sender, RoutedEventArgs e) - { - try - { - WebBrowserResourcesAndToolsFreeWallURL.GoBack(); - } - catch (Exception ex) - { - MessageBox.Show(ex.Message); - } - } - - private void ButtonWebBrowserForwardFreeWallURL_Click(object sender, RoutedEventArgs e) - { - try - { - WebBrowserResourcesAndToolsFreeWallURL.GoForward(); - } - catch (Exception ex) - { - MessageBox.Show(ex.Message); - } - } - - #endregion - - #region 常见问题标签 - private void ButtonWebBrowserHomePageCommonError_Click(object sender, RoutedEventArgs e) - { - try - { - WebBrowserCommonError.Source = new Uri("https://github.com/proxysu/windows/wiki/CommonError"); - } - catch (Exception ex) - { - MessageBox.Show(ex.Message); - } - } - - private void ButtonWebBrowserBackCommonError_Click(object sender, RoutedEventArgs e) - { - try - { - WebBrowserCommonError.GoBack(); - } - catch (Exception ex) - { - MessageBox.Show(ex.Message); - } - } - - private void ButtonWebBrowserForwardCommonError_Click(object sender, RoutedEventArgs e) - { - try - { - WebBrowserCommonError.GoForward(); - } - catch (Exception ex) - { - MessageBox.Show(ex.Message); - } - } - - - #endregion - #endregion - - #region 测试用代码 - private void Button_Click(object sender, RoutedEventArgs e) - { - //string host = ClassModel.DisguiseURLprocessing("www.google.com/accout/"); - //MessageBox.Show(host); - //saveShellScriptFileName = GenerateRandomScriptFileName(GenerateRandomStr(10)); - //saveShellScriptFileName = "tmp." + saveShellScriptFileName + ".sh"; - //MessageBox.Show(saveShellScriptFileName); - //var rand = System.Security.Cryptography.RandomNumberGenerator.Create(); - //byte[] bytes = new byte[8]; - //rand.GetBytes(bytes); - //string randStr = Convert.ToBase64String(bytes); - //randStr = randStr.Replace("+","").Replace("/", "").Replace("=",""); - //MessageBox.Show(randStr); - proxyType = "V2Ray"; - ResultClientInformation resultClientInformation = new ResultClientInformation(); - resultClientInformation.ShowDialog(); - //return; - //string pwdir = AppDomain.CurrentDomain.BaseDirectory; - //MessageBox.Show(pwdir); - //ConnectionInfo connectionInfo = GenerateConnectionInfo(); - //if (connectionInfo == null) - //{ - // //****** "远程主机连接信息有误,请检查!" ****** - // MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostConnection").ToString()); - // return; - //} - //using (var client = new SshClient(connectionInfo)) - //{ - // client.Connect(); - // if (client.IsConnected == true) - // { - // //******"主机登录成功"****** - // SetUpProgressBarProcessing(3); - // currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginSuccessful").ToString(); - // MainWindowsShowInfo(currentStatus); - - // } - // string fileProxy = @"/usr/local/bin/v2ray"; - // sshShellCommand = $"if [[ -f {fileProxy} ]];then echo '1';else echo '0'; fi"; - // //sshShellCommand = @"if [[ -f /usr/local/bin/v2ray ]];then echo '1';else echo '0'; fi"; - // currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - // if (currentShellCommandResult.Trim().Equals("0") == true) - // { - // MessageBox.Show("0"); - // } - // else - // { - // MessageBox.Show("1"); - // } - // // SetUpNat64(client, true); - // //FilterFastestIP(client); - // //string cmdErr = client.RunCommand(@"aaa ee").Error; - // //MessageBox.Show(cmdErr); - // //SshCommand cmdResult = client.RunCommand(@"pwd"); - // //string result = cmdResult.Result; - // //MessageBox.Show("result:" + result); - // //string error = cmdResult.Error; - // //MessageBox.Show("err:" + error); - - // //int cmdExitStatus = cmdResult.ExitStatus; - // //MessageBox.Show("cmdExitStatus:" + cmdExitStatus.ToString()); - - // //SshCommand cmdResultCat = client.RunCommand(@"cat tt.t"); - // //string resultCat = cmdResultCat.Result; - // //MessageBox.Show("resultCat:" + resultCat); - // //string errorCat = cmdResultCat.Error; - // //MessageBox.Show("errCat:" + errorCat); - - // //cmdExitStatus = cmdResultCat.ExitStatus; - // //MessageBox.Show("cmdExitStatus:" + cmdExitStatus.ToString()); - - // //SoftInstalledSuccessOrFail(client, "v2ray", @"/usr/local/bin/v2ray"); - // //CaddyInstall(client); - // //if (client.IsConnected == true) - // //{ - // // MessageBox.Show("Connected"); - // //} - // //if (client.IsConnected == false) - // //{ - // // MessageBox.Show("disConnected"); - // //} - //} - } - - private string CaddyInstallTest(SshClient client) - { - - if (client.IsConnected == true) - { - //******"主机登录成功"****** - SetUpProgressBarProcessing(3); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginSuccessful").ToString(); - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"id -u"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - client.Disconnect(); - } - return ""; - } - #endregion - - #region 布署代理所用到的步骤函数 - - //检测主机是否为纯ipv6的主机 - private bool OnlyIpv6HostDetect(SshClient client) - { - //****** "正在检测是否为纯ipv6主机......." ******11 - //SetUpProgressBarProcessing(34); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_OnlyIpv6HostDetect").ToString(); - MainWindowsShowInfo(currentStatus); - - //再次初始化相关变量 - ipv4 = String.Empty; - ipv6 = String.Empty; - - //sshShellCommand = @"curl -4 ip.sb"; - sshShellCommand = @"curl -s https://api.ip.sb/ip --ipv4 --max-time 8"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - ipv4 = currentShellCommandResult.TrimEnd('\r', '\n'); - - sshShellCommand = @"curl -s https://api.ip.sb/ip --ipv6 --max-time 8"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - ipv6 = currentShellCommandResult.TrimEnd('\r', '\n'); - - if (String.IsNullOrEmpty(ipv4) == false) - { - return false; - } - else - { - if (String.IsNullOrEmpty(ipv6) == false) - { - - return true; - } - else - { - //FunctionResultErr(); - client.Disconnect(); - //****未检测到有效的IP地址......*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_NoIpDetect").ToString(); - MainWindowsShowInfo(currentStatus); - MessageBox.Show(currentStatus); - return false; - } - } - - } - - //设置Nat64与删除设置Nat64 - private bool SetUpNat64(SshClient client, bool set) - { - if (set == true) - { - //****** "正在查找最快的Nat64网关......" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_FindFastestSetUpNat64").ToString(); - MainWindowsShowInfo(currentStatus); - //string[] dns64 = new string[2]; - var dns64 = FilterFastestIP(client); - - if (functionResult == false) - { - //****** "未能找到有效的Nat64网关......" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_FindFastestSetUpNat64Failed").ToString(); - MainWindowsShowInfo(currentStatus); - MessageBox.Show(currentStatus); - //FunctionResultErr(); - client.Disconnect(); - return false; - } - - //****** "正在设置Nat64网关......" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_SetUpNat64").ToString(); - MainWindowsShowInfo(currentStatus); - - functionResult = FileCheckExists(client, @"/etc/resolv.conf.proxysu"); - if (functionResult == false) - { - sshShellCommand = @"mv /etc/resolv.conf /etc/resolv.conf.proxysu"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - } - - - foreach (string gateip in dns64) - { - sshShellCommand = $"echo \"nameserver {gateip}\" > /etc/resolv.conf"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"curl -fsSL https://api.github.com/repos/proxysu/windows/releases/latest"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - SshCommand currentShellCommand = client.RunCommand(sshShellCommand); - int cmdExitStatus = currentShellCommand.ExitStatus; - if (cmdExitStatus == 0) - { - return true; - } - - } - - } - else - { - //****** "正在删除Nat64网关......" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DeleteSetUpNat64").ToString(); - MainWindowsShowInfo(currentStatus); - sshShellCommand = @"rm /etc/resolv.conf"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - sshShellCommand = @"mv /etc/resolv.conf.proxysu /etc/resolv.conf"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - } - - return true; - } - - //筛选最优的NAT64地址 - private string[] FilterFastestIP(SshClient client) - { - 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", - }; - - List NatDns64s = new List(); - foreach (string gateip in gateNat64) - { - sshShellCommand = $"ping6 -c4 {gateip} | grep avg | awk '{{print $4}}'|cut -d/ -f2"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - if (String.IsNullOrEmpty(currentShellCommandResult) != true) - { - if (float.TryParse(currentShellCommandResult, out float delay) == true) - { - - int delayInt = (int)(delay * 1000); - NatDns64 ipaddr = new NatDns64($"{gateip}", delayInt); - NatDns64s.Add(ipaddr); - } - } - - } - NatDns64s = NatDns64s.OrderBy(o => o.Avg).ToList(); - int listCount = NatDns64s.Count; - currentStatus = listCount.ToString() + " NAT64 gateways are valid"; - MainWindowsShowInfo(currentStatus); - if (listCount < 1) - { - functionResult = false; - } - else - { - functionResult = true; - } - string[] returnstr = new string[listCount]; - for (int i = 0; i < listCount; i++) - { - returnstr[i] = NatDns64s[i].IpAddr; - } - //returnstr[0] = NatDns64s[0].IpAddr; - //returnstr[1] = NatDns64s[1].IpAddr; - return returnstr; - } - - //纯ipv6主机安装脚本处理 - //private void Ipv6ScriptEdit(SshClient client,string scriptFile) - //{ - // sshShellCommand = $"sed -i 's/api.github.com/{apiGithubCom}/g' {scriptFile}"; - // currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - // sshShellCommand = $"sed -i 's/raw.githubusercontent.com/raw.githubusercontent.com/g' {scriptFile}"; - // currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - // sshShellCommand = $"sed -i 's/https:\\/\\/github.com/https:\\/\\/{githubCom}/g' {scriptFile}"; - // currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - //} - - - #region 安装过程提示信息 - - //安装过程提示信息 - // MainWindowsShowInfo(currentStatus); - // currentShellCommandResult = MainWindowsShowCmd(client,sshShellCommand); - private string MainWindowsShowInfo(string currentStatus) - { - TextBlockSetUpProcessing.Dispatcher.BeginInvoke(updateAction, TextBlockSetUpProcessing, ProgressBarSetUpProcessing, currentStatus); - string currentShellCommandResult = currentStatus; - TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果在监视窗口 - - return currentShellCommandResult; - } - - //安装过程所运行的命令与相应结果 - private string MainWindowsShowCmd(SshClient client, string sshShellCommand, bool stopIfError = true) - { - TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 - SshCommand cmdResult = client.RunCommand(sshShellCommand); - string currentShellCommandResult = cmdResult.Result; //命令执行成功的结果 - string currentShellCommandError = cmdResult.Error; //命令执行出错的提示 - int cmdExitStatus = cmdResult.ExitStatus; - //if (String.IsNullOrEmpty(currentShellCommandResult) == true) - if (cmdExitStatus == 1) - { - if (stopIfError) { } - //currentShellCommandResult = currentShellCommandError; - TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandError);//显示命令执行错误的提示 - } - TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 - - return currentShellCommandResult; - } - - //调用的函数返回false后的提示 - private string FunctionResultErr() - { - //*****"发生错误,安装中断......"***** - string currentStatus = Application.Current.FindResource("DisplayInstallInfo_FunctionResultErr").ToString(); - MainWindowsShowInfo(currentStatus); - return ""; - } - - //判断某个文件是否存在 - //functionResult = FileCheckExists(client, @"/usr/local/bin/mtg"); - private bool FileCheckExists(SshClient client, string pathFile) - { - sshShellCommand = $"if [[ -f {pathFile} ]];then echo '1';else echo '0'; fi"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - if (currentShellCommandResult.Trim().Equals("1") == true) - { - return true; - } - else - { - return false; - } - - } - #endregion - - //检测root权限 5--7 - //functionResult = RootAuthorityDetect(client); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - private bool RootAuthorityDetect(SshClient client) - { - sshShellCommand = @"uname -a"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - //禁止一些可能产生的干扰信息 - sshShellCommand = @"sed -i 's/echo/#echo/g' ~/.bashrc"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"sed -i 's/echo/#echo/g' ~/.profile"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //******"检测是否运行在root权限下..."******01 - SetUpProgressBarProcessing(5); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DetectionRootPermission").ToString(); - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"id -u"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //string testRootAuthority = currentShellCommandResult; - if (currentShellCommandResult.Equals("0\n") == false) - { - //******"请使用具有root权限的账户登录主机!!"****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorRootPermission").ToString()); - //client.Disconnect(); - return false; - } - else - { - //******"检测结果:OK!"******02 - SetUpProgressBarProcessing(7); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DetectionRootOK").ToString(); - MainWindowsShowInfo(currentStatus); - //return true; - } - return true; - } - - //检测是否已安装代理 8--10 - //soft--要检测的程序 - //condition---已安装的条件 - //functionResult = SoftInstalledIsNoYes(client, "v2ray", @"/usr/local/bin/v2ray"); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - private bool SoftInstalledIsNoYes(SshClient client, string soft, string condition) - { - //******"检测系统是否已经安装......"******03 - SetUpProgressBarProcessing(8); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestExistSoft").ToString() + $"{soft}......"; - MainWindowsShowInfo(currentStatus); - - - //sshShellCommand = $"find / -name {soft}"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //string resultCmdTestV2rayInstalled = currentShellCommandResult; - //if (currentShellCommandResult.Contains($"{condition}") == true) - functionResult = FileCheckExists(client, condition); - if (functionResult == true) - { - //******"远程主机已安装V2ray,是否强制重新安装?"****** - string messageShow = Application.Current.FindResource("MessageBoxShow_ExistedSoft").ToString() + - $"{soft}" + - Application.Current.FindResource("MessageBoxShow_ForceInstallSoft").ToString(); - MessageBoxResult messageBoxResult = MessageBox.Show(messageShow, "", MessageBoxButton.YesNo, MessageBoxImage.Question); - if (messageBoxResult == MessageBoxResult.No) - { - //******"安装取消,退出"****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_InstallationCanceledExit").ToString(); - MainWindowsShowInfo(currentStatus); - //client.Disconnect(); - return false; - } - else - { - //******"已选择强制安装!"******04 - SetUpProgressBarProcessing(10); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_ForceInstallSoft").ToString() + $"{soft}"; - MainWindowsShowInfo(currentStatus); - - } - } - else - { - //******"检测结果:未安装"******04 - SetUpProgressBarProcessing(10); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_NoInstalledSoft").ToString() + $"{soft}"; - MainWindowsShowInfo(currentStatus); - } - return true; - } - - //检测关闭Selinux及系统组件是否齐全(apt-get/yum/dnf/systemctl)11--30 - //安装依赖软件,检测端口,防火墙开启端口,检测是否为纯ipv6主机,若是则设置Nat64网关 - //functionResult = ShutDownSelinuxAndSysComponentsDetect(client); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - private bool ShutDownSelinuxAndSysComponentsDetect(SshClient client) - { - - //检测系统是否支持yum 或 apt-get或zypper,且支持Systemd - //如果不存在组件,则命令结果为空,String.IsNullOrEmpty值为真 - //取反则getApt,getDnf,getYum,getSystem,getGetenforce为假 - //不存在组件,则为假 - - //******"检测系统是否符合安装要求......"****** - SetUpProgressBarProcessing(11); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_CheckSystemRequirements").ToString(); - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"command -v apt-get"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - getApt = !String.IsNullOrEmpty(currentShellCommandResult); - - sshShellCommand = @"command -v dnf"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - getDnf = !String.IsNullOrEmpty(currentShellCommandResult); - - sshShellCommand = @"command -v yum"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - getYum = !String.IsNullOrEmpty(currentShellCommandResult); - - SetUpProgressBarProcessing(13); - - //sshShellCommand = @"command -v zypper"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - //bool getZypper = ! String.IsNullOrEmpty(currentShellCommandResult); - - sshShellCommand = @"command -v systemctl"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - bool getSystemd = !String.IsNullOrEmpty(currentShellCommandResult); - - sshShellCommand = @"command -v getenforce"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - bool getGetenforce = !String.IsNullOrEmpty(currentShellCommandResult); - - - //没有安装apt-get,也没有安装dnf\yum,也没有安装zypper,或者没有安装systemd的,不满足安装条件 - //也就是apt-get ,dnf\yum, zypper必须安装其中之一,且必须安装Systemd的系统才能安装。 - if ((getApt == false && getDnf == false && getYum == false) || getSystemd == false) - { - //******"系统缺乏必要的安装组件如:apt-get||dnf||yum||zypper||Syetemd,主机系统推荐使用:CentOS 7/8,Debian 8/9/10,Ubuntu 16.04及以上版本"****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_MissingSystemComponents").ToString()); - - //******"系统环境不满足要求,安装失败!!"****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_MissingSystemComponents").ToString(); - MainWindowsShowInfo(currentStatus); - - return false; - } - else - { - //******"检测结果:OK!"******06 - SetUpProgressBarProcessing(16); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_SystemRequirementsOK").ToString(); - MainWindowsShowInfo(currentStatus); - } - - //检测是否安装dig - if (string.IsNullOrEmpty(client.RunCommand("command -v dig").Result) == true) - { - //设置安装软件所用的命令格式 - if (getApt == true) - { - sshCmdUpdate = @"apt-get update"; - sshCmdInstall = @"apt-get -y install dnsutils"; - } - else if (getDnf == true) - { - sshCmdUpdate = @"dnf makecache"; - sshCmdInstall = @"dnf -y install bind-utils"; - } - else if (getYum == true) - { - sshCmdUpdate = @"yum makecache"; - sshCmdInstall = @"yum -y install bind-utils"; - } - sshShellCommand = sshCmdUpdate; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = sshCmdInstall; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - } - - //设置安装软件所用的命令格式 - if (getApt == true) - { - sshCmdUpdate = @"apt-get update"; - sshCmdInstall = @"apt-get -y install "; - } - else if (getDnf == true) - { - sshCmdUpdate = @"dnf clean all;dnf makecache"; - sshCmdInstall = @"dnf -y install "; - } - else if (getYum == true) - { - sshCmdUpdate = @"yum clean all; yum makecache"; - sshCmdInstall = @"yum -y install "; - } - //else if (getZypper == true) - //{ - // sshCmdUpdate = @"zypper ref"; - // sshCmdInstall = @"zypper -y install "; - //} - - //判断是否启用了SELinux,如果启用了,并且工作在Enforcing模式下,则改为Permissive模式 - if (getGetenforce == true) - { - sshShellCommand = @"getenforce"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - //string testSELinux = currentShellCommandResult; - - if (currentShellCommandResult.Contains("Enforcing") == true) - { - //******"检测到系统启用SELinux,且工作在严格模式下,需改为宽松模式!修改中......"******07 - SetUpProgressBarProcessing(18); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_EnableSELinux").ToString(); - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"setenforce 0"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //******"修改完毕!"******08 - SetUpProgressBarProcessing(20); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_SELinuxModifyOK").ToString(); - MainWindowsShowInfo(currentStatus); - } - - } - - sshShellCommand = $"{sshCmdUpdate}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //在相应系统内安装curl(如果没有安装curl)--此为依赖软件 - if (string.IsNullOrEmpty(client.RunCommand("command -v curl").Result) == true) - { - sshShellCommand = $"{sshCmdInstall}curl"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - } - // 在相应系统内安装wget(如果没有安装wget)--此为依赖软件 - if (string.IsNullOrEmpty(client.RunCommand("command -v wget").Result) == true) - { - sshShellCommand = $"{sshCmdInstall}wget"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - } - // 在相应系统内安装unzip(如果没有安装unzip)--此为依赖软件 - if (string.IsNullOrEmpty(client.RunCommand("command -v unzip").Result) == true) - { - sshShellCommand = $"{sshCmdInstall}unzip"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - } - //处理极其少见的xz-utils未安装的情况 - - if (getApt == true) - { - sshShellCommand = $"{sshCmdInstall}xz-utils"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - } - else if (getDnf == true || getYum == true) - { - sshShellCommand = $"{sshCmdInstall}xz-devel"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - } - - //检测是否安装lsof - if (string.IsNullOrEmpty(client.RunCommand("command -v lsof").Result) == true) - { - sshShellCommand = $"{sshCmdInstall}lsof"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - } - - //检测主机是否为纯ipv6的主机 - onlyIpv6 = OnlyIpv6HostDetect(client); - - //如果未检测到有效的ip,连接就会被断开 - if (client.IsConnected == false) - { - return false; - } - if (onlyIpv6 == true) - { - functionResult = SetUpNat64(client, true); - if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return false; } - //sshShellCommand = $"{sshCmdUpdate}"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - } - - //****** "检测端口占用情况......" ****** - SetUpProgressBarProcessing(22); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestPortUsed").ToString(); - MainWindowsShowInfo(currentStatus); - - if (String.Equals(ReceiveConfigurationParameters[1], "80") == true || String.Equals(ReceiveConfigurationParameters[1], "443") == true) - { - string testPort80 = string.Empty; - string testPort443 = string.Empty; - - sshShellCommand = @"lsof -n -P -i :80 | grep LISTEN"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - testPort80 = currentShellCommandResult; - - sshShellCommand = @"lsof -n -P -i :443 | grep LISTEN"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - testPort443 = currentShellCommandResult; - - - if (String.IsNullOrEmpty(testPort80) == false || String.IsNullOrEmpty(testPort443) == false) - { - //****** "80/443端口之一,或全部被占用,将强制停止占用80/443端口的程序?" ****** - MessageBoxResult dialogResult = MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorPortUsed").ToString(), "Stop application", MessageBoxButton.YesNo); - if (dialogResult == MessageBoxResult.No) - { - //****** "端口被占用,安装失败......" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_ErrorPortUsedFail").ToString(); - MainWindowsShowInfo(currentStatus); - //client.Disconnect(); - return false; - } - - //****** "正在释放80/443端口......" ****** - SetUpProgressBarProcessing(24); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_ReleasePort").ToString(); - MainWindowsShowInfo(currentStatus); - - if (String.IsNullOrEmpty(testPort443) == false) - { - string[] cmdResultArry443 = testPort443.Split(' '); - - sshShellCommand = $"systemctl stop {cmdResultArry443[0]}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"systemctl disable {cmdResultArry443[0]}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"pkill {cmdResultArry443[0]}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - } - - if (String.IsNullOrEmpty(testPort80) == false) - { - string[] cmdResultArry80 = testPort80.Split(' '); - - sshShellCommand = $"systemctl stop {cmdResultArry80[0]}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"systemctl disable {cmdResultArry80[0]}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"pkill {cmdResultArry80[0]}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - } - testPort80 = string.Empty; - testPort443 = string.Empty; - - sshShellCommand = @"lsof -n -P -i :80 | grep LISTEN"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - testPort80 = currentShellCommandResult; - - sshShellCommand = @"lsof -n -P -i :443 | grep LISTEN"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - testPort443 = currentShellCommandResult; - - - if (String.IsNullOrEmpty(testPort80) == false || String.IsNullOrEmpty(testPort443) == false) - { - //****** "端口被占用,安装失败......" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_ErrorPortUsedFail").ToString(); - MainWindowsShowInfo(currentStatus); - //client.Disconnect(); - return false; - } - //****** "80/443端口释放完毕!" ****** - SetUpProgressBarProcessing(26); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_ReleasePortOK").ToString(); - MainWindowsShowInfo(currentStatus); - } - else - { - //****** "检测结果:未被占用!" ****** - SetUpProgressBarProcessing(26); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_PortNotUsed").ToString(); - MainWindowsShowInfo(currentStatus); - } - } - else - { - string testPort = string.Empty; - - sshShellCommand = $"lsof -n -P -i :{ReceiveConfigurationParameters[1]} | grep LISTEN"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - testPort = currentShellCommandResult; - - if (String.IsNullOrEmpty(testPort) == false) - { - //****** "端口被占用,将强制停止占用此端口的程序?" ****** - MessageBoxResult dialogResult = MessageBox.Show(ReceiveConfigurationParameters[1] + Application.Current.FindResource("MessageBoxShow_ErrorPortUsedOther").ToString(), "Stop application", MessageBoxButton.YesNo); - if (dialogResult == MessageBoxResult.No) - { - //****** "端口被占用,安装失败......" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_ErrorPortUsedFail").ToString(); - MainWindowsShowInfo(currentStatus); - //client.Disconnect(); - return false; - } - - //****** "正在释放端口......" ****** - SetUpProgressBarProcessing(24); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_ReleasePortOther").ToString(); - MainWindowsShowInfo(currentStatus); - - string[] cmdResultArry = testPort.Split(' '); - - sshShellCommand = $"systemctl stop {cmdResultArry[0]}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"systemctl disable {cmdResultArry[0]}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"pkill {cmdResultArry[0]}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - testPort = string.Empty; - - sshShellCommand = $"lsof -n -P -i :{ReceiveConfigurationParameters[1]} | grep LISTEN"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - testPort = currentShellCommandResult; - - if (String.IsNullOrEmpty(testPort) == false) - { - //****** "端口被占用,安装失败......" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_ErrorPortUsedFail").ToString(); - MainWindowsShowInfo(currentStatus); - //client.Disconnect(); - return false; - } - - //****** "端口释放完毕!" ****** - SetUpProgressBarProcessing(26); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_ReleasePortOKOther").ToString(); - MainWindowsShowInfo(currentStatus); - - } - else - { - //****** "检测结果:未被占用!" ****** - SetUpProgressBarProcessing(26); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_PortNotUsed").ToString(); - MainWindowsShowInfo(currentStatus); - } - } - //****** "开启防火墙相应端口......" ****** - SetUpProgressBarProcessing(27); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_OpenFireWallPort").ToString(); - MainWindowsShowInfo(currentStatus); - string openFireWallPort = ReceiveConfigurationParameters[1]; - if (String.IsNullOrEmpty(client.RunCommand("command -v firewall-cmd").Result) == false) - { - //有很奇怪的vps主机,在firewalld未运行时,端口是关闭的,无法访问。所以要先启动firewalld - //用于保证acme.sh申请证书成功 - sshShellCommand = @"firewall-cmd --state"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - if (String.Equals(currentShellCommandResult.Trim(), "running") == false) - { - sshShellCommand = @"systemctl restart firewalld"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - } - - - if (String.Equals(openFireWallPort, "443")) - { - sshShellCommand = @"firewall-cmd --zone=public --add-port=80/tcp --permanent"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"firewall-cmd --zone=public --add-port=80/udp --permanent"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"firewall-cmd --zone=public --add-port=443/tcp --permanent"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"firewall-cmd --zone=public --add-port=443/udp --permanent"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"yes | firewall-cmd --reload"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - } - else - { - sshShellCommand = $"firewall-cmd --zone=public --add-port={openFireWallPort}/tcp --permanent"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"firewall-cmd --zone=public --add-port={openFireWallPort}/udp --permanent"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"yes | firewall-cmd --reload"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - } - } - else if (String.IsNullOrEmpty(client.RunCommand("command -v ufw").Result) == false) - { - if (String.Equals(openFireWallPort, "443")) - { - sshShellCommand = @"ufw allow 80/tcp"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"ufw allow 80/udp"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"ufw allow 443/tcp"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"ufw allow 443/udp"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"yes | ufw reload"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - } - else - { - sshShellCommand = $"ufw allow {openFireWallPort}/tcp"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"ufw allow {openFireWallPort}/udp"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"yes | ufw reload"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - } - } - - SetUpProgressBarProcessing(30); - return true; - } - - //检测校对时间 31--33 - //functionResult = CheckProofreadingTime(client); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - private bool CheckProofreadingTime(SshClient client) - { - //******"校对时间......"******09 - SetUpProgressBarProcessing(31); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_ProofreadingTime").ToString(); - MainWindowsShowInfo(currentStatus); - - //获取远程主机的时间戳 - 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); - if (Math.Abs(timeStampLocal - timeStampVPS) >= 90) - { - //******"本地时间与远程主机时间相差超过限制(90秒),请先用 '系统工具-->时间校对' 校对时间后再设置"****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_TimeError").ToString()); - //"时间较对失败......" - currentStatus = Application.Current.FindResource("DisplayInstallInfo_TimeError").ToString(); - MainWindowsShowInfo(currentStatus); - - //client.Disconnect(); - return false; - } - //******"时间差符合要求,OK!"******10 - SetUpProgressBarProcessing(33); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_TimeOK").ToString(); - MainWindowsShowInfo(currentStatus); - return true; - } - - - //检测域名是否解析到当前IP上 34---36 - //functionResult = DomainResolutionCurrentIPDetect(client); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - private bool DomainResolutionCurrentIPDetect(SshClient client) - { - //****** "正在检测域名是否解析到当前VPS的IP上......" ******11 - SetUpProgressBarProcessing(34); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestDomainResolve").ToString(); - MainWindowsShowInfo(currentStatus); - - //再次初始化相关变量 - //ipv4 = String.Empty; - //ipv6 = String.Empty; - //onlyIpv6 = false; - - //sshShellCommand = @"curl -4 ip.sb"; - //sshShellCommand = @"curl -s https://api.ip.sb/ip --ipv4 --max-time 8"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - //ipv4 = currentShellCommandResult.TrimEnd('\r', '\n'); - - //sshShellCommand = @"curl -s https://api.ip.sb/ip --ipv6 --max-time 8"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - //ipv6 = currentShellCommandResult.TrimEnd('\r', '\n'); - - if (onlyIpv6 == false) - { - string nativeIp = ipv4; - - //string cmdFilter = ""; - string cmdFilter = @"| grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | head -n 1"; - sshShellCommand = $"dig @resolver1.opendns.com A {ReceiveConfigurationParameters[4]} +short -4 {cmdFilter}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - string resultTestDomainCmd = currentShellCommandResult.TrimEnd('\r', '\n'); - if (String.Equals(nativeIp, resultTestDomainCmd) == true) - { - //****** "解析正确!OK!" ******12 - SetUpProgressBarProcessing(36); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DomainResolveOK").ToString(); - MainWindowsShowInfo(currentStatus); - //onlyIpv6 = false; - return true; - } - - } - else - { - string nativeIp = ipv6; - - //string cmdFilter = ""; - string cmdFilter = @"| grep -oE '(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))' | head -n 1"; - sshShellCommand = $"dig @resolver1.opendns.com AAAA {ReceiveConfigurationParameters[4]} +short -6 {cmdFilter}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - string resultTestDomainCmd = currentShellCommandResult.TrimEnd('\r', '\n'); - if (String.Equals(nativeIp, resultTestDomainCmd) == true) - { - //****** "解析正确!OK!" ******12 - SetUpProgressBarProcessing(36); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DomainResolveOK").ToString(); - MainWindowsShowInfo(currentStatus); - //onlyIpv6 = true; - - return true; - } - - } - //****** "域名未能正确解析到当前VPS的IP上!安装失败!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_ErrorDomainResolve").ToString(); - MainWindowsShowInfo(currentStatus); - - //****** "域名未能正确解析到当前VPS的IP上,请检查!若解析设置正确,请等待生效后再重试安装。如果域名使用了CDN,请先关闭!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorDomainResolve").ToString()); - //client.Disconnect(); - return false; - - } - - - //安装代理程序 37--40 - //functionResult = ProxySoftInstall(client,@"",@""); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - private bool ProxySoftInstall(SshClient client, string proxyName, string downloadUrl) - { - //****** "系统环境检测完毕,符合安装要求,开始布署......" ****** - SetUpProgressBarProcessing(37); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstalling").ToString(); - MainWindowsShowInfo(currentStatus); - - //****** "正在安装{proxyName}......" ****** - SetUpProgressBarProcessing(38); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstallSoft").ToString() + $"{proxyName}......"; - MainWindowsShowInfo(currentStatus); - - saveShellScriptFileName = GenerateRandomScriptFileName(GenerateRandomStr(10)); - - sshShellCommand = $"curl -o {saveShellScriptFileName} {downloadUrl}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - functionResult = FileCheckExists(client, $"{saveShellScriptFileName}"); - if (functionResult == false) - { - //***文件下载失败!*** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_DownloadScriptFailed").ToString(); - MainWindowsShowInfo(currentStatus); - return false; - - } - sshShellCommand = $"yes | bash {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"rm -f {saveShellScriptFileName}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - SetUpProgressBarProcessing(40); - return true; - } - - //程序是否安装成功检测并设置开机启动 41--43 - //soft--要检测的程序 - //condition---成功安装的条件 - //functionResult = SoftInstalledSuccessOrFail(client,"v2ray",@"/usr/local/bin/v2ray"); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - private bool SoftInstalledSuccessOrFail(SshClient client, string soft, string condition) - { - SetUpProgressBarProcessing(41); - //sshShellCommand = $"find / -name {soft}"; - //sshShellCommand = $"if [[ -f {condition} ]];then echo '1';else echo '0'; fi"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - bool functionResult = FileCheckExists(client, condition); - - //if (!currentShellCommandResult.Contains($"{condition}")) - if (functionResult == false) - { - //****** "安装失败,官方脚本运行出错!" ****** - MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorInstallSoftFail").ToString()); - //****** "安装失败,官方脚本运行出错!" ****** - currentStatus = Application.Current.FindResource("MessageBoxShow_ErrorInstallSoftFail").ToString(); - MainWindowsShowInfo(currentStatus); - - //client.Disconnect(); - return false; - } - else - { - //****** "安装成功!" ******20 - SetUpProgressBarProcessing(43); - currentStatus = $"{soft}" + Application.Current.FindResource("DisplayInstallInfo_SoftInstallSuccess").ToString(); - MainWindowsShowInfo(currentStatus); - - //开机启动 - sshShellCommand = $"systemctl enable {soft}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - } - return true; - } - - - //生成服务端配置 44--46 - //functionResult = GenerateServerConfiguration(client); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - - - //上传服务配置 47--50 - private bool GenerateServerConfigurations(SshClient client) { return true; } - - //acme.sh安装与申请证书 51--57 - //functionResult = AcmeShInstall(client); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - private bool AcmeShInstall(SshClient client) - { - //****** "正在安装acme.sh......" ******22 - SetUpProgressBarProcessing(51); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstallAcmeSh").ToString(); - MainWindowsShowInfo(currentStatus); - - //安装所依赖的软件 - sshShellCommand = $"{sshCmdUpdate}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"{sshCmdInstall}socat"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //解决搬瓦工CentOS缺少问题 - sshShellCommand = $"{sshCmdInstall}automake autoconf libtool"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //sshShellCommand = $"curl https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh | INSTALLONLINE=1 sh"; - sshShellCommand = $"curl https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh | sh -s -- --install-online -m {acmeEmail}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - if (currentShellCommandResult.Contains("Install success") == true) - { - //****** "acme.sh安装成功!" ******23 - SetUpProgressBarProcessing(54); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_AcmeShInstallSuccess").ToString(); - MainWindowsShowInfo(currentStatus); - } - else - { - //****** "acme.sh安装失败!原因未知,请向开发者提问!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_ErrorAcmeShInstallFail").ToString(); - MainWindowsShowInfo(currentStatus); - return false; - } - - sshShellCommand = @"cd ~/.acme.sh/"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"alias acme.sh=~/.acme.sh/acme.sh"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //****** "申请域名证书......" ******24 - SetUpProgressBarProcessing(55); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartApplyCert").ToString(); - MainWindowsShowInfo(currentStatus); - - if (onlyIpv6 == true) - { - sshShellCommand = $"/root/.acme.sh/acme.sh --force --debug --issue --standalone -d {ReceiveConfigurationParameters[4]} --listen-v6"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - } - else - { - sshShellCommand = $"/root/.acme.sh/acme.sh --force --debug --issue --standalone -d {ReceiveConfigurationParameters[4]}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - } - - if (currentShellCommandResult.Contains("Cert success") == true) - { - //****** "证书申请成功!" ******25 - SetUpProgressBarProcessing(57); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_ApplyCertSuccess").ToString(); - MainWindowsShowInfo(currentStatus); - } - else - { - //****** "证书申请失败!原因未知,请向开发者提问!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_ApplyCertFail").ToString(); - MainWindowsShowInfo(currentStatus); - return false; - } - return true; - - } - - - - //安装证书到代理程序 58--60 - private bool CertInstallProxy(SshClient client) - { - return true; - } - - - //Caddy安装与检测安装是否成功 61--66 - //functionResult = CaddyInstall(client); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - private bool CaddyInstall(SshClient client) - { - //****** "安装Caddy......" ******28 - SetUpProgressBarProcessing(61); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstallCaddy").ToString(); - MainWindowsShowInfo(currentStatus); - - //为真则表示系统有相应的组件。 - if (getApt == true) - { - - sshShellCommand = @"echo ""deb [trusted=yes] https://apt.fury.io/caddy/ /"" | tee -a /etc/apt/sources.list.d/caddy-fury.list"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"apt-get install -y apt-transport-https"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"apt-get update"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"apt-get -y install caddy"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - } - else if (getDnf == true) - { - - sshShellCommand = @"dnf install 'dnf-command(copr)' -y"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"dnf copr enable @caddy/caddy -y"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //sshShellCommand = @"dnf makecache"; - //currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"dnf -y install caddy"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - } - else if (getYum == true) - { - - sshShellCommand = @"yum install yum-plugin-copr -y"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"yum copr enable @caddy/caddy -y"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //sshShellCommand = @"yum makecache"; - //currentShellCommandResult = MainWindowsShowCmd(client,sshShellCommand); - - sshShellCommand = @"yum -y install caddy"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - } - - string caddyService = @"/lib/systemd/system/caddy.service"; - functionResult = FileCheckExists(client, $"{caddyService}"); - if (functionResult == false) - { - caddyService = @"/usr/lib/systemd/system/caddy.service"; - } - sshShellCommand = $"sed -i 's/AmbientCapabilities/#AmbientCapabilities/g' {caddyService}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"sed -i 's/=caddy/=root/g' {caddyService}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"sed -i 's/LimitNPROC/#LimitNPROC/g' {caddyService}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"sed -i 's/LimitNOFILE/#LimitNOFILE/g' {caddyService}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"systemctl daemon-reload"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - - functionResult = FileCheckExists(client, @"/usr/bin/caddy"); - if (functionResult == true) - { - //****** "Caddy安装成功!" ******29 - SetUpProgressBarProcessing(66); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_InstalledCaddyOK").ToString(); - MainWindowsShowInfo(currentStatus); - - - sshShellCommand = @"systemctl enable caddy"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - return true; - - } - functionResult = ProxySoftInstall(client, @"Caddy", @"https://raw.githubusercontent.com/proxysu/shellscript/master/Caddy-Naive/caddy-naive-install.sh"); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return false; } - - functionResult = FileCheckExists(client, @"/usr/bin/caddy"); - if (functionResult == true) - { - //****** "Caddy安装成功!" ******29 - SetUpProgressBarProcessing(66); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_InstalledCaddyOK").ToString(); - MainWindowsShowInfo(currentStatus); - - - sshShellCommand = @"systemctl enable caddy"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - return true; - } - - //****** "安装Caddy失败!" ****** - MessageBox.Show(Application.Current.FindResource("DisplayInstallInfo_ErrorInstallCaddyFail").ToString()); - //****** "安装Caddy失败!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_ErrorInstallCaddyFail").ToString(); - MainWindowsShowInfo(currentStatus); - - //client.Disconnect(); - return false; - } - - - //上传Caddy配置文件67--70 - private bool UpConfigCaddy(SshClient client) - { - return true; - } - - //设置Caddy配置文件 - //functionResult = SetCaddyfile(client, @"/etc/caddy/Caddyfile"); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - private bool SetCaddyfile(SshClient client, string upLoadPath) - { - - //设置Caddyfile文件中的tls 邮箱,在caddy2中已经不需要设置。 - - //设置Caddy监听的随机端口 - string randomCaddyListenPortStr = randomCaddyListenPort.ToString(); - - sshShellCommand = $"sed -i 's/8800/{randomCaddyListenPortStr}/' {upLoadPath}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //设置域名 - ReceiveConfigurationParameters[4] = ReceiveConfigurationParameters[4].TrimEnd(' '); - sshShellCommand = $"sed -i 's/##domain##/{ReceiveConfigurationParameters[4]}/g' {upLoadPath}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //设置Path - sshShellCommand = $"sed -i 's/##path##/\\{ReceiveConfigurationParameters[6]}/' {upLoadPath}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //设置伪装网站/纯ipv6主机暂不设置 - // && onlyIpv6 == false - if (String.IsNullOrEmpty(ReceiveConfigurationParameters[7]) == false) - { - sshShellCommand = $"sed -i 's/##reverse_Proxy1##/reverse_proxy http:\\/\\/{ReceiveConfigurationParameters[7]} {{/ ' {upLoadPath}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"sed -i 's/##reverse_Proxy2##/header_up Host {ReceiveConfigurationParameters[7]}/' {upLoadPath}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = $"sed -i 's/##reverse_Proxy3##/}}/' {upLoadPath}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - } - return true; - } - - //程序启动检测 - //soft--要检测的程序 - //condition---成功启动的条件 - //functionResult = SoftStartDetect(client, "v2ray", @"/usr/local/bin/v2ray"); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - private bool SoftStartDetect(SshClient client, string soft, string condition) - { - //****** "正在启动......" ******33 - //SetUpProgressBarProcessing(87); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartSoft").ToString() + $"{soft}......"; - MainWindowsShowInfo(currentStatus); - - //启动服务 - sshShellCommand = $"systemctl restart {soft}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - Thread.Sleep(3000); - - sshShellCommand = $"ps aux | grep {soft}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - if (currentShellCommandResult.Contains($"{condition}") == true) - { - //****** "启动成功!" ******34 - //SetUpProgressBarProcessing(88); - currentStatus = $"{soft}" + Application.Current.FindResource("DisplayInstallInfo_StartSoftOK").ToString(); - MainWindowsShowInfo(currentStatus); - - } - else - { - //****** "启动失败!" ****** - currentStatus = $"{soft}" + Application.Current.FindResource("DisplayInstallInfo_StartSoftFail").ToString(); - MainWindowsShowInfo(currentStatus); - - Thread.Sleep(1000); - - //****** "正在启动(第二次尝试)!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartSoftSecond").ToString() + $"{soft}"; - MainWindowsShowInfo(currentStatus); - - Thread.Sleep(3000); - sshShellCommand = $"systemctl restart {soft}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - Thread.Sleep(3000); - - sshShellCommand = $"ps aux | grep {soft}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - if (currentShellCommandResult.Contains($"{condition}") == true) - { - //****** "启动成功!" ****** - currentStatus = $"{soft}" + Application.Current.FindResource("DisplayInstallInfo_StartSoftOK").ToString(); - MainWindowsShowInfo(currentStatus); - - } - else - { - //****** "启动失败(第二次)!退出安装!" ****** - currentStatus = $"{soft}" + Application.Current.FindResource("DisplayInstallInfo_StartSoftSecondFail").ToString(); - MainWindowsShowInfo(currentStatus); - - //显示启动失败原因 - sshShellCommand = $"journalctl -n50 --no-pager --boot -u {soft}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - //****** "启动失败,原因如上!请排查原因!" ****** - currentStatus = $"{soft}" + Application.Current.FindResource("DisplayInstallInfo_StartSoftFailedExit").ToString(); - MainWindowsShowInfo(currentStatus); - - //****** "启动失败,原因如上!请排查原因!" ****** - MessageBox.Show($"{soft}" + Application.Current.FindResource("DisplayInstallInfo_StartSoftFailedExit").ToString()); - return false; - } - } - return true; - } - - //检测BBR,满足条件并启动 90--95 - //functionResult = DetectBBRandEnable(client); - //if (functionResult == false) { FunctionResultErr(); client.Disconnect(); return; } - private bool DetectBBRandEnable(SshClient client) - { - //测试BBR条件,若满足提示是否启用 - //****** "BBR测试......" ******37 - SetUpProgressBarProcessing(90); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestBBR").ToString(); - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"uname -r"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - string[] linuxKernelVerStrBBR = currentShellCommandResult.Split('-'); - - bool detectResultBBR = DetectKernelVersionBBR(linuxKernelVerStrBBR[0]); - - sshShellCommand = @"sysctl net.ipv4.tcp_congestion_control | grep bbr"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - string resultCmdTestBBR = currentShellCommandResult; - //如果内核满足大于等于4.9,且还未启用BBR,则启用BBR - if (detectResultBBR == true && resultCmdTestBBR.Contains("bbr") == false) - { - //****** "正在启用BBR......" ******38 - SetUpProgressBarProcessing(93); - currentStatus = Application.Current.FindResource("DisplayInstallInfo_EnableBBR").ToString(); - MainWindowsShowInfo(currentStatus); - - sshShellCommand = @"bash -c 'echo ""net.core.default_qdisc=fq"" >> /etc/sysctl.conf'"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"bash -c 'echo ""net.ipv4.tcp_congestion_control=bbr"" >> /etc/sysctl.conf'"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"sysctl -p"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - sshShellCommand = @"sysctl net.ipv4.tcp_congestion_control | grep bbr"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - - if (currentShellCommandResult.Contains("bbr") == true) - { - //****** "BBR启用成功!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_BBREnabledSuccess").ToString(); - MainWindowsShowInfo(currentStatus); - } - else - { - //****** "系统不满足启用BBR的条件,启用失败!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_BBRFailed").ToString(); - MainWindowsShowInfo(currentStatus); - //return false; - } - } - else if (resultCmdTestBBR.Contains("bbr") == true) - { - //****** "BBR已经启用了!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_BBRisEnabled").ToString(); - MainWindowsShowInfo(currentStatus); - } - else - { - //****** "系统不满足启用BBR的条件,启用失败!" ****** - currentStatus = Application.Current.FindResource("DisplayInstallInfo_BBRFailed").ToString(); - MainWindowsShowInfo(currentStatus); - //return false; - } - - //如果是纯ipv6主机,则需要删除前面设置的Nat64网关 - if (onlyIpv6 == true) - { - SetUpNat64(client, false); - sshShellCommand = $"{sshCmdUpdate}"; - currentShellCommandResult = MainWindowsShowCmd(client, sshShellCommand); - } - - SetUpProgressBarProcessing(95); - return true; - } - - - - - - //生成客户端配置 96--98 - - - #endregion - - - } - -} diff --git a/ProxySU/ProofreadTimeWindow.xaml b/ProxySU/ProofreadTimeWindow.xaml deleted file mode 100644 index 01d9842..0000000 --- a/ProxySU/ProofreadTimeWindow.xaml +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ProxySU/ProofreadTimeWindow.xaml.cs b/ProxySU/ProofreadTimeWindow.xaml.cs deleted file mode 100644 index 0499216..0000000 --- a/ProxySU/ProofreadTimeWindow.xaml.cs +++ /dev/null @@ -1,258 +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 -{ - /// - /// ProofreadTimeWindow.xaml 的交互逻辑 - /// - 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 TextBlock_MouseDown(object sender, MouseButtonEventArgs e) - { - RadioButtonNetworkTime.IsChecked = true; - } - - private void TextBlock_MouseDown_1(object sender, MouseButtonEventArgs e) - { - RadioButtonLocalTime.IsChecked = true; - } - - private void TextBlock_MouseDown_2(object sender, MouseButtonEventArgs e) - { - RadioButtonUpDateLocalTime.IsChecked = true; - } - - //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()); - //} - - } - - /// - /// 网络时间 代码从网上复制,原网址:https://www.codeleading.com/article/23791981303/ - /// - public class NetTime - { - /// - /// 从国家授时中心获取标准GMT时间,读取https://www.tsa.cn - /// GMT时间与UTC时间没有差别,可以UTC=GMT - /// - /// 返回网络时间 - 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; - } - - } - - /// - /// 更新系统时间,代码从网上复制,原网址:https://www.open-open.com/code/view/1430552965599 - /// - 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; - } - - /// - /// 设置系统时间 - /// - /// 需要设置的时间 - /// 返回系统时间设置状态,true为成功,false为失败 - public static bool SetDate(DateTime dt) - { - SYSTEMTIME st; - - st.year = (short)dt.Year; - st.month = (short)dt.Month; - st.dayOfWeek = (short)dt.DayOfWeek; - st.day = (short)dt.Day; - st.hour = (short)dt.Hour; - st.minute = (short)dt.Minute; - st.second = (short)dt.Second; - st.milliseconds = (short)dt.Millisecond; - bool rt = SetLocalTime(ref st); - return rt; - } - } - -} diff --git a/ProxySU/Properties/AssemblyInfo.cs b/ProxySU/Properties/AssemblyInfo.cs deleted file mode 100644 index 75b945d..0000000 --- a/ProxySU/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System.Reflection; -using System.Resources; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Windows; - -// 有关程序集的一般信息由以下 -// 控制。更改这些特性值可修改 -// 与程序集关联的信息。 -[assembly: AssemblyTitle("ProxySU")] -[assembly: AssemblyDescription("V2ray,Trojan,NaiveProxy,Trojan-Go等一键安装工具")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("ProxySU")] -[assembly: AssemblyProduct("ProxySU")] -[assembly: AssemblyCopyright("Copyright © 2020")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// 将 ComVisible 设置为 false 会使此程序集中的类型 -//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 -//请将此类型的 ComVisible 特性设置为 true。 -[assembly: ComVisible(false)] - -//若要开始生成可本地化的应用程序,请设置 -//.csproj 文件中的 CultureYouAreCodingWith -//例如,如果您在源文件中使用的是美国英语, -//使用的是美国英语,请将 设置为 en-US。 然后取消 -//对以下 NeutralResourceLanguage 特性的注释。 更新 -//以下行中的“en-US”以匹配项目文件中的 UICulture 设置。 - -//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] - - -[assembly: ThemeInfo( - ResourceDictionaryLocation.None, //主题特定资源词典所处位置 - //(未在页面中找到资源时使用, - //或应用程序资源字典中找到时使用) - ResourceDictionaryLocation.SourceAssembly //常规资源词典所处位置 - //(未在页面中找到资源时使用, - //、应用程序或任何主题专用资源字典中找到时使用) -)] - - -// 程序集的版本信息由下列四个值组成: -// -// 主版本 -// 次版本 -// 生成号 -// 修订号 -// -// 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 -// 方法是按如下所示使用“*”: : -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.5.6.0")] -[assembly: AssemblyFileVersion("2.5.6.0")] diff --git a/ProxySU/Properties/Resources.Designer.cs b/ProxySU/Properties/Resources.Designer.cs deleted file mode 100644 index 50e1154..0000000 --- a/ProxySU/Properties/Resources.Designer.cs +++ /dev/null @@ -1,71 +0,0 @@ -//------------------------------------------------------------------------------ -// -// 此代码由工具生成。 -// 运行时版本: 4.0.30319.42000 -// -// 对此文件的更改可能导致不正确的行为,如果 -// 重新生成代码,则所做更改将丢失。 -// -//------------------------------------------------------------------------------ - -namespace ProxySU.Properties -{ - - - /// - /// 强类型资源类,用于查找本地化字符串等。 - /// - // 此类是由 StronglyTypedResourceBuilder - // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 - // 若要添加或删除成员,请编辑 .ResX 文件,然后重新运行 ResGen - // (以 /str 作为命令选项),或重新生成 VS 项目。 - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources - { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() - { - } - - /// - /// 返回此类使用的缓存 ResourceManager 实例。 - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager - { - get - { - if ((resourceMan == null)) - { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ProxySU.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// 覆盖当前线程的 CurrentUICulture 属性 - /// 使用此强类型的资源类的资源查找。 - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture - { - get - { - return resourceCulture; - } - set - { - resourceCulture = value; - } - } - } -} diff --git a/ProxySU/Properties/Resources.resx b/ProxySU/Properties/Resources.resx deleted file mode 100644 index af7dbeb..0000000 --- a/ProxySU/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/ProxySU/Properties/Settings.Designer.cs b/ProxySU/Properties/Settings.Designer.cs deleted file mode 100644 index 654607b..0000000 --- a/ProxySU/Properties/Settings.Designer.cs +++ /dev/null @@ -1,30 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace ProxySU.Properties -{ - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase - { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default - { - get - { - return defaultInstance; - } - } - } -} diff --git a/ProxySU/Properties/Settings.settings b/ProxySU/Properties/Settings.settings deleted file mode 100644 index 033d7a5..0000000 --- a/ProxySU/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/ProxySU/ProxySU.csproj b/ProxySU/ProxySU.csproj deleted file mode 100644 index 9ae9d06..0000000 --- a/ProxySU/ProxySU.csproj +++ /dev/null @@ -1,213 +0,0 @@ - - - - - Debug - AnyCPU - {DD5505BC-E7F1-4D03-ABC7-B636E893FC09} - WinExe - ProxySU - ProxySU - v4.0 - 512 - {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 4 - true - false - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 1 - 1.0.0.%2a - false - true - true - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - ProxySU.ico - - - 01AFC64B121E781F77B42A6E9F1B587DDBAD475A - - - ProxySU_TemporaryKey.pfx - - - true - - - true - - - - ..\json.net\net40\Newtonsoft.Json.dll - - - ..\qrcoder\net40\QRCoder.dll - - - ..\packages\SSH.NET.2020.0.1\lib\net40\Renci.SshNet.dll - - - - - - - - - - - - 4.0 - - - - - - - - MSBuild:Compile - Designer - - - - ProofreadTimeWindow.xaml - - - ResultClientInformation.xaml - - - SSpluginWindow.xaml - - - XayTemplateWindow.xaml - - - V2RayTemplateWindow.xaml - - - TrojanGoTemplateWindow.xaml - - - MSBuild:Compile - Designer - - - App.xaml - Code - - - MainWindow.xaml - Code - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - MSBuild:Compile - Designer - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - - - Code - - - True - True - Resources.resx - - - True - Settings.settings - True - - - ResXFileCodeGenerator - Resources.Designer.cs - - - .editorconfig - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - - - False - .NET Framework 3.5 SP1 - false - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ProxySU/ProxySU.csproj.user b/ProxySU/ProxySU.csproj.user deleted file mode 100644 index 0871ddf..0000000 --- a/ProxySU/ProxySU.csproj.user +++ /dev/null @@ -1,17 +0,0 @@ - - - - publish\ - - - - - - zh-CN - false - ProjectFiles - - - false - - \ No newline at end of file diff --git a/ProxySU/ProxySU.ico b/ProxySU/ProxySU.ico deleted file mode 100644 index 9d7a128c59c121d3e72c9d81575b05bde4971b2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16958 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 MX!L67IYICL0XR=#Gynhq diff --git a/ProxySU/ResultClientInformation.xaml b/ProxySU/ResultClientInformation.xaml deleted file mode 100644 index eede1c4..0000000 --- a/ProxySU/ResultClientInformation.xaml +++ /dev/null @@ -1,570 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ProxySU/ResultClientInformation.xaml.cs b/ProxySU/ResultClientInformation.xaml.cs deleted file mode 100644 index 719ece9..0000000 --- a/ProxySU/ResultClientInformation.xaml.cs +++ /dev/null @@ -1,4942 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Web; -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.IO; -using Renci.SshNet; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using Newtonsoft.Json.Serialization; -using System.Drawing; -using QRCoder; -using System.Runtime.InteropServices; - - -namespace ProxySU -{ - /// - /// ResultClientInformation.xaml 的交互逻辑 - /// - public partial class ResultClientInformation : Window - { - private static string saveFileFolder = ""; - private static string configDomainSavePath = ""; - private static string server = MainWindow.ReceiveConfigurationParameters[4]; - - private static string TextBoxURLDefault; - private static string TextBoxURLVlessTcp; - private static string TextBoxURLVlessWs; - private static string TextBoxURLVmessTcp; - private static string TextBoxURLVmessWs; - private static string TextBoxURLTrojanTcp; - - private static BitmapSource ImageShareQRcodeDefault; - private static BitmapSource ImageShareQRcodeVlessTcp; - private static BitmapSource ImageShareQRcodeVlessWs; - private static BitmapSource ImageShareQRcodeVmessTcp; - private static BitmapSource ImageShareQRcodeVmessWs; - private static BitmapSource ImageShareQRcodeTrojanTcp; - - - [DllImport("user32.dll")] - private static extern int MessageBoxTimeoutA(IntPtr hWnd, string msg, string Caps, int type, int Id, int time); //引用DLL - - public ResultClientInformation() - { - InitializeComponent(); - - if (String.Equals(MainWindow.proxyType, "V2Ray")) - { - //显示V2Ray参数,隐藏其他 - GroupBoxClientMTProto.Visibility = Visibility.Collapsed; - GroupBoxClientQRandURL.Visibility = Visibility.Visible; - GroupBoxClientSSpc.Visibility = Visibility.Collapsed; - GroupBoxV2rayClient.Visibility = Visibility.Visible; - GroupBoxXrayClient.Visibility = Visibility.Collapsed; - GroupBoxTrojanGoClient.Visibility = Visibility.Collapsed; - GroupBoxTrojanClient.Visibility = Visibility.Collapsed; - GroupBoxNaiveProxyClient.Visibility = Visibility.Collapsed; - GroupBoxSSRClient.Visibility = Visibility.Collapsed; - GroupBoxClientSS.Visibility = Visibility.Collapsed; - - //主机地址 - TextBoxHostAddress.Text = MainWindow.ReceiveConfigurationParameters[4]; - //主机端口 - TextBoxPort.Text = MainWindow.ReceiveConfigurationParameters[1]; - //用户ID(uuid)/Trojan密码 - TextBoxUUID.Text = MainWindow.ReceiveConfigurationParameters[2]; - //额外ID - TextBoxUUIDextra.Text = "0"; - //加密方式,一般都为auto - TextBoxEncryption.Text = "auto"; - - //传输协议 - TextBoxTransmission.Text = ""; - //伪装类型 - TextBoxCamouflageType.Text = MainWindow.ReceiveConfigurationParameters[5]; - - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryption.Text = ""; - - //QUIC密钥/mKCP Seed/路径Path - TextBoxQuicKeyMkcpSeedPath.Text = MainWindow.ReceiveConfigurationParameters[6]; - - //TLS设置 - TextBoxTLS.Text = "none"; - - //初始化时,隐藏多方案客户端选择面板 - GroupBoxSelectVlessVmessXtlsTcpWs.Visibility = Visibility.Collapsed; - //显示非Trojan的所有参数 - GridNotTrojanParameters.Visibility = Visibility.Visible; - - if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "VlessVmessXtlsTcpWebSocketWeb") == false) - { - #region 单模式方案 - if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "TCP") == true) - { - TextBoxTransmission.Text = "tcp"; - TextBoxCamouflageType.Text = "none"; - TextBoxTLS.Text = "none"; - ShowHostName(); - ShowPathV2ray(); - - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "TCPhttp") == true) - { - TextBoxTransmission.Text = "tcp"; - TextBoxCamouflageType.Text = "http"; - TextBoxTLS.Text = "none"; - ShowHostName(); - ShowPathV2ray(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "tcpTLS") == true) - { - TextBoxEncryption.Text = "none"; - TextBoxTransmission.Text = "tcp"; - TextBoxCamouflageType.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryption.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxTLS.Text = "tls"; - ShowHostName(); - ShowPathV2ray(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "tcpTLSselfSigned") == true) - { - TextBoxTransmission.Text = "tcp"; - TextBoxCamouflageType.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryption.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxTLS.Text = "tls"; - ShowHostName(); - ShowPathV2ray(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "VlessXtlsTcp") == true) - { - TextBlockVmessOrVless.Text = Application.Current.FindResource("TabItemHeaderV2RayVlessProtocol").ToString(); - - TextBoxTransmission.Text = "tcp"; - TextBoxCamouflageType.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryption.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxEncryption.Text = "none"; - TextBoxTLS.Text = "xtls"; - HideAlterId(); - ShowHostName(); - ShowPathV2ray(); - HideGroupBoxClientQRandURL(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "VlessTcpTlsWeb") == true) - { - TextBlockVmessOrVless.Text = Application.Current.FindResource("TabItemHeaderV2RayVlessProtocol").ToString(); - - TextBoxTransmission.Text = "tcp"; - TextBoxCamouflageType.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryption.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxEncryption.Text = "none"; - TextBoxTLS.Text = "tls"; - HideAlterId(); - ShowHostName(); - ShowPathV2ray(); - HideGroupBoxClientQRandURL(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "VlessWebSocketTlsWeb") == true) - { - TextBlockVmessOrVless.Text = Application.Current.FindResource("TabItemHeaderV2RayVlessProtocol").ToString(); - - TextBoxTransmission.Text = "ws"; - TextBoxCamouflageType.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryption.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxEncryption.Text = "none"; - TextBoxTLS.Text = "tls"; - HideAlterId(); - ShowHostName(); - ShowPathV2ray(); - HideGroupBoxClientQRandURL(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "VlessHttp2Web") == true) - { - TextBlockVmessOrVless.Text = Application.Current.FindResource("TabItemHeaderV2RayVlessProtocol").ToString(); - - TextBoxTransmission.Text = "h2"; - TextBoxCamouflageType.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryption.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxEncryption.Text = "none"; - TextBoxTLS.Text = "tls"; - HideAlterId(); - ShowHostName(); - ShowPathV2ray(); - HideGroupBoxClientQRandURL(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "webSocket") == true) - { - TextBoxTransmission.Text = "ws"; - TextBoxCamouflageType.Text = "none"; - TextBoxTLS.Text = "none"; - ShowHostName(); - ShowPathV2ray(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "WebSocketTLS") == true) - { - TextBoxEncryption.Text = "none"; - TextBoxTransmission.Text = "ws"; - TextBoxCamouflageType.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryption.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxTLS.Text = "tls"; - ShowHostName(); - ShowPathV2ray(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "WebSocketTLS2Web") == true) - { - TextBoxEncryption.Text = "none"; - TextBoxTransmission.Text = "ws"; - TextBoxCamouflageType.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryption.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxTLS.Text = "tls"; - ShowHostName(); - ShowPathV2ray(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "WebSocketTLSselfSigned") == true) - { - TextBoxTransmission.Text = "ws"; - TextBoxCamouflageType.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryption.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxTLS.Text = "tls"; - ShowHostName(); - ShowPathV2ray(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "Http2") == true) - { - TextBoxEncryption.Text = "none"; - TextBoxTransmission.Text = "h2"; - TextBoxCamouflageType.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryption.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxTLS.Text = "tls"; - ShowHostName(); - ShowPathV2ray(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "http2Web") == true) - { - TextBoxEncryption.Text = "none"; - TextBoxTransmission.Text = "h2"; - TextBoxCamouflageType.Text = "none"; - TextBoxHostQuicEncryption.Text = MainWindow.ReceiveConfigurationParameters[4];//获取Host - TextBoxTLS.Text = "tls"; - ShowHostName(); - ShowPathV2ray(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "http2selfSigned") == true) - { - TextBoxTransmission.Text = "h2"; - TextBoxCamouflageType.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryption.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxTLS.Text = "tls"; - ShowHostName(); - ShowPathV2ray(); - } - else if (MainWindow.ReceiveConfigurationParameters[0].Contains("mKCP") == true) - { - if(MainWindow.mKCPvlessIsSet == true) - { - TextBlockVmessOrVless.Text = Application.Current.FindResource("TabItemHeaderV2RayVlessProtocol").ToString(); - TextBoxEncryption.Text = "none"; - HideAlterId(); - HideGroupBoxClientQRandURL(); - } - if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "mKCPNone") == true) - { - TextBoxCamouflageType.Text = "none"; - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "mKCP2SRTP") == true) - { - TextBoxCamouflageType.Text = "srtp"; - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "mKCPuTP") == true) - { - TextBoxCamouflageType.Text = "utp"; - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "mKCP2WechatVideo") == true) - { - TextBoxCamouflageType.Text = "wechat-video"; - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "mKCP2DTLS") == true) - { - TextBoxCamouflageType.Text = "dtls"; - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "mKCP2WireGuard") == true) - { - TextBoxCamouflageType.Text = "wireguard"; - } - - TextBoxTransmission.Text = "kcp"; - TextBoxQuicKeyMkcpSeedPath.Text = MainWindow.ReceiveConfigurationParameters[6];//获取mkcp Seed - TextBoxTLS.Text = "none"; - ShowHostName(); - ShowMkcpSeed(); - } - else if (MainWindow.ReceiveConfigurationParameters[0].Contains("Quic") == true) - { - if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "QuicNone") == true) - { - TextBoxCamouflageType.Text = "none"; - - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "QuicSRTP") == true) - { - TextBoxCamouflageType.Text = "srtp"; - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "Quic2uTP") == true) - { - TextBoxCamouflageType.Text = "utp"; - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "QuicWechatVideo") == true) - { - TextBoxCamouflageType.Text = "wechat-video"; - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "QuicDTLS") == true) - { - TextBoxCamouflageType.Text = "dtls"; - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "QuicWireGuard") == true) - { - TextBoxCamouflageType.Text = "wireguard"; - } - - TextBoxTransmission.Text = "quic"; - TextBoxHostQuicEncryption.Text = MainWindow.ReceiveConfigurationParameters[3];//获取Quic加密方式 - TextBoxQuicKeyMkcpSeedPath.Text = MainWindow.ReceiveConfigurationParameters[6];//获取Quic加密密钥 - TextBoxTLS.Text = "none"; - ShowQuicEncryption(); - ShowQuicKey(); - } - - else - { - TextBoxTransmission.Text = "tcp"; - TextBoxCamouflageType.Text = "none"; - TextBoxTLS.Text = "none"; - ShowHostName(); - ShowPathV2ray(); - } - CheckDir("v2ray_config"); - - GenerateV2rayShareQRcodeAndBase64Url(); - #endregion - } - else - { - //显示多方案客户端选择面板 - GroupBoxSelectVlessVmessXtlsTcpWs.Visibility = Visibility.Visible; - - string proxyfolder = CheckDir("v2ray_config"); - configDomainSavePath = CreateConfigSaveDir(proxyfolder, TextBoxHostAddress.Text); - - V2raySetVlessTcpXtls(); - //GenerateV2rayVlessTcpXtlsShareQRcodeAndBase64Url(); - - V2raySetVlessTcpTls(); - GenerateV2rayVlessTcpTlsShareQRcodeAndBase64Url(); - - V2raySetVlessWsTls(); - GenerateV2rayVlessWsTlsShareQRcodeAndBase64Url(); - - V2raySetVmessTcpTls(); - GenerateV2rayVmessTcpTlsShareQRcodeAndBase64Url(); - - V2raySetVmessWsTls(); - GenerateV2rayVmessWsTlsShareQRcodeAndBase64Url(); - - GenerateV2rayTrojanShareQRcodeAndBase64Url(); - RadioButtonVlessTcpTls.IsChecked = true; - } - - } - else if (String.Equals(MainWindow.proxyType, "Xray")) - { - //显示Xray参数,隐藏其他 - GroupBoxClientMTProto.Visibility = Visibility.Collapsed; - GroupBoxClientQRandURL.Visibility = Visibility.Visible; - GroupBoxClientSSpc.Visibility = Visibility.Collapsed; - GroupBoxV2rayClient.Visibility = Visibility.Collapsed; - GroupBoxXrayClient.Visibility = Visibility.Visible; - GroupBoxTrojanGoClient.Visibility = Visibility.Collapsed; - GroupBoxTrojanClient.Visibility = Visibility.Collapsed; - GroupBoxNaiveProxyClient.Visibility = Visibility.Collapsed; - GroupBoxSSRClient.Visibility = Visibility.Collapsed; - GroupBoxClientSS.Visibility = Visibility.Collapsed; - - //主机地址 - TextBoxHostAddressXray.Text = MainWindow.ReceiveConfigurationParameters[4]; - //主机端口 - TextBoxPortXray.Text = MainWindow.ReceiveConfigurationParameters[1]; - //用户ID(uuid)/Trojan密码 - TextBoxUUIDXray.Text = MainWindow.ReceiveConfigurationParameters[2]; - //额外ID - TextBoxUUIDextraXray.Text = "0"; - //加密方式,一般都为auto - TextBoxEncryptionXray.Text = "auto"; - - //传输协议 - TextBoxTransmissionXray.Text = ""; - //伪装类型 - TextBoxCamouflageTypeXray.Text = MainWindow.ReceiveConfigurationParameters[5]; - - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryptionXray.Text = ""; - - //QUIC密钥/mKCP Seed/路径Path - TextBoxQuicKeyMkcpSeedPathXray.Text = MainWindow.ReceiveConfigurationParameters[6]; - - //TLS设置 - TextBoxTLSXray.Text = "none"; - - //初始化时,隐藏多方案客户端选择面板 - GroupBoxSelectVlessVmessXtlsTcpWsXray.Visibility = Visibility.Collapsed; - //显示非Trojan的所有参数 - GridNotTrojanParametersXray.Visibility = Visibility.Visible; - - if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "VlessVmessXtlsTcpWebSocketWeb") == false) - { - #region 单模式方案 - if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "TCP") == true) - { - TextBoxTransmissionXray.Text = "tcp"; - TextBoxCamouflageTypeXray.Text = "none"; - TextBoxTLSXray.Text = "none"; - ShowHostNameXray(); - ShowPathXray(); - - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "TCPhttp") == true) - { - TextBoxTransmissionXray.Text = "tcp"; - TextBoxCamouflageTypeXray.Text = "http"; - TextBoxTLSXray.Text = "none"; - ShowHostNameXray(); - ShowPathXray(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "tcpTLS") == true) - { - TextBoxEncryptionXray.Text = "none"; - TextBoxTransmissionXray.Text = "tcp"; - TextBoxCamouflageTypeXray.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryptionXray.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxTLSXray.Text = "tls"; - ShowHostNameXray(); - ShowPathXray(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "tcpTLSselfSigned") == true) - { - TextBoxTransmissionXray.Text = "tcp"; - TextBoxCamouflageTypeXray.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryptionXray.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxTLSXray.Text = "tls"; - ShowHostNameXray(); - ShowPathXray(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "VlessXtlsTcp") == true) - { - TextBlockVmessOrVlessXray.Text = Application.Current.FindResource("TabItemHeaderV2RayVlessProtocol").ToString(); - - TextBoxTransmissionXray.Text = "tcp"; - TextBoxCamouflageTypeXray.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryptionXray.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxEncryptionXray.Text = "none"; - TextBoxTLSXray.Text = "xtls"; - HideAlterIdXray(); - ShowHostNameXray(); - ShowPathXray(); - HideGroupBoxClientQRandURL(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "VlessTcpTlsWeb") == true) - { - TextBlockVmessOrVlessXray.Text = Application.Current.FindResource("TabItemHeaderV2RayVlessProtocol").ToString(); - - TextBoxTransmissionXray.Text = "tcp"; - TextBoxCamouflageTypeXray.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryptionXray.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxEncryptionXray.Text = "none"; - TextBoxTLSXray.Text = "tls"; - HideAlterIdXray(); - ShowHostNameXray(); - ShowPathXray(); - HideGroupBoxClientQRandURL(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "VlessWebSocketTlsWeb") == true) - { - TextBlockVmessOrVlessXray.Text = Application.Current.FindResource("TabItemHeaderV2RayVlessProtocol").ToString(); - - TextBoxTransmissionXray.Text = "ws"; - TextBoxCamouflageTypeXray.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryptionXray.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxEncryptionXray.Text = "none"; - TextBoxTLSXray.Text = "tls"; - HideAlterIdXray(); - ShowHostNameXray(); - ShowPathXray(); - HideGroupBoxClientQRandURL(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "VlessHttp2Web") == true) - { - TextBlockVmessOrVlessXray.Text = Application.Current.FindResource("TabItemHeaderV2RayVlessProtocol").ToString(); - - TextBoxTransmissionXray.Text = "h2"; - TextBoxCamouflageTypeXray.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryptionXray.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxEncryptionXray.Text = "none"; - TextBoxTLSXray.Text = "tls"; - HideAlterIdXray(); - ShowHostNameXray(); - ShowPathXray(); - HideGroupBoxClientQRandURL(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "webSocket") == true) - { - TextBoxTransmissionXray.Text = "ws"; - TextBoxCamouflageTypeXray.Text = "none"; - TextBoxTLSXray.Text = "none"; - ShowHostNameXray(); - ShowPathXray(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "WebSocketTLS") == true) - { - TextBoxEncryptionXray.Text = "none"; - TextBoxTransmissionXray.Text = "ws"; - TextBoxCamouflageType.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryptionXray.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxTLSXray.Text = "tls"; - ShowHostNameXray(); - ShowPathXray(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "WebSocketTLS2Web") == true) - { - TextBoxEncryptionXray.Text = "none"; - TextBoxTransmissionXray.Text = "ws"; - TextBoxCamouflageTypeXray.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryptionXray.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxTLSXray.Text = "tls"; - ShowHostNameXray(); - ShowPathXray(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "WebSocketTLSselfSigned") == true) - { - TextBoxTransmissionXray.Text = "ws"; - TextBoxCamouflageTypeXray.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryptionXray.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxTLSXray.Text = "tls"; - ShowHostNameXray(); - ShowPathXray(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "Http2") == true) - { - TextBoxEncryptionXray.Text = "none"; - TextBoxTransmissionXray.Text = "h2"; - TextBoxCamouflageTypeXray.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryptionXray.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxTLSXray.Text = "tls"; - ShowHostNameXray(); - ShowPathXray(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "http2Web") == true) - { - TextBoxEncryptionXray.Text = "none"; - TextBoxTransmissionXray.Text = "h2"; - TextBoxCamouflageTypeXray.Text = "none"; - TextBoxHostQuicEncryptionXray.Text = MainWindow.ReceiveConfigurationParameters[4];//获取Host - TextBoxTLSXray.Text = "tls"; - ShowHostNameXray(); - ShowPathXray(); - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "http2selfSigned") == true) - { - TextBoxTransmissionXray.Text = "h2"; - TextBoxCamouflageTypeXray.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryptionXray.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxTLSXray.Text = "tls"; - ShowHostNameXray(); - ShowPathXray(); - } - else if (MainWindow.ReceiveConfigurationParameters[0].Contains("mKCP") == true) - { - if (MainWindow.mKCPvlessIsSet == true) - { - TextBlockVmessOrVlessXray.Text = Application.Current.FindResource("TabItemHeaderV2RayVlessProtocol").ToString(); - TextBoxEncryptionXray.Text = "none"; - HideAlterIdXray(); - HideGroupBoxClientQRandURL(); - } - if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "mKCPNone") == true) - { - TextBoxCamouflageTypeXray.Text = "none"; - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "mKCP2SRTP") == true) - { - TextBoxCamouflageTypeXray.Text = "srtp"; - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "mKCPuTP") == true) - { - TextBoxCamouflageTypeXray.Text = "utp"; - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "mKCP2WechatVideo") == true) - { - TextBoxCamouflageTypeXray.Text = "wechat-video"; - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "mKCP2DTLS") == true) - { - TextBoxCamouflageTypeXray.Text = "dtls"; - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "mKCP2WireGuard") == true) - { - TextBoxCamouflageTypeXray.Text = "wireguard"; - } - - TextBoxTransmissionXray.Text = "kcp"; - TextBoxQuicKeyMkcpSeedPathXray.Text = MainWindow.ReceiveConfigurationParameters[6];//获取mkcp Seed - TextBoxTLSXray.Text = "none"; - ShowHostNameXray(); - ShowMkcpSeedXray(); - } - else if (MainWindow.ReceiveConfigurationParameters[0].Contains("Quic") == true) - { - if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "QuicNone") == true) - { - TextBoxCamouflageTypeXray.Text = "none"; - - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "QuicSRTP") == true) - { - TextBoxCamouflageTypeXray.Text = "srtp"; - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "Quic2uTP") == true) - { - TextBoxCamouflageTypeXray.Text = "utp"; - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "QuicWechatVideo") == true) - { - TextBoxCamouflageTypeXray.Text = "wechat-video"; - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "QuicDTLS") == true) - { - TextBoxCamouflageTypeXray.Text = "dtls"; - } - else if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "QuicWireGuard") == true) - { - TextBoxCamouflageTypeXray.Text = "wireguard"; - } - - TextBoxTransmissionXray.Text = "quic"; - TextBoxHostQuicEncryptionXray.Text = MainWindow.ReceiveConfigurationParameters[3];//获取Quic加密方式 - TextBoxQuicKeyMkcpSeedPathXray.Text = MainWindow.ReceiveConfigurationParameters[6];//获取Quic加密密钥 - TextBoxTLSXray.Text = "none"; - ShowQuicEncryptionXray(); - ShowQuicKeyXray(); - } - - else - { - TextBoxTransmissionXray.Text = "tcp"; - TextBoxCamouflageTypeXray.Text = "none"; - TextBoxTLSXray.Text = "none"; - ShowHostNameXray(); - ShowPathXray(); - } - CheckDir("xray_config"); - - GenerateXrayShareQRcodeAndBase64Url(); - #endregion - } - else - { - //显示多方案客户端选择面板 - GroupBoxSelectVlessVmessXtlsTcpWsXray.Visibility = Visibility.Visible; - - string proxyfolder = CheckDir("xray_config"); - configDomainSavePath = CreateConfigSaveDir(proxyfolder, TextBoxHostAddressXray.Text); - - XraySetVlessTcpXtls(); - GenerateXrayVlessTcpXtlsShareQRcodeAndBase64Url(); - - XraySetVlessTcpTls(); - GenerateXrayVlessTcpTlsShareQRcodeAndBase64Url(); - - XraySetVlessWsTls(); - GenerateXrayVlessWsTlsShareQRcodeAndBase64Url(); - - XraySetVmessTcpTls(); - GenerateXrayVmessTcpTlsShareQRcodeAndBase64Url(); - - XraySetVmessWsTls(); - GenerateXrayVmessWsTlsShareQRcodeAndBase64Url(); - - GenerateXrayTrojanShareQRcodeAndBase64Url(); - RadioButtonVlessTcpXtlsXray.IsChecked = true; - } - - } - else if (String.Equals(MainWindow.proxyType, "TrojanGo")) - { - //GroupBoxTrojanClient.Header = "Trojan-go 客户端配置参数"; - GroupBoxClientMTProto.Visibility = Visibility.Collapsed; - GroupBoxClientQRandURL.Visibility = Visibility.Visible; - GroupBoxClientSSpc.Visibility = Visibility.Collapsed; - GroupBoxV2rayClient.Visibility = Visibility.Collapsed; - GroupBoxXrayClient.Visibility = Visibility.Collapsed; - GroupBoxTrojanGoClient.Visibility = Visibility.Visible; - GroupBoxTrojanClient.Visibility = Visibility.Collapsed; - GroupBoxNaiveProxyClient.Visibility = Visibility.Collapsed; - GroupBoxSSRClient.Visibility = Visibility.Collapsed; - GroupBoxClientSS.Visibility = Visibility.Collapsed; - - TextBlockTrojanGoHost.Visibility = Visibility.Hidden; - TextBoxTrojanGoHost.Visibility = Visibility.Hidden; - TextBoxTrojanGoWSPath.Visibility = Visibility.Hidden; - TextBlockTrojanGoWebSocketPath.Visibility = Visibility.Hidden; - TextBlockTrojanGoCaption.Visibility = Visibility.Hidden; - - TextBlockMuxSelect.Visibility = Visibility.Hidden; - GridMuxSelect.Visibility = Visibility.Hidden; - TextBlockExplainCheckBoxMuxSelectResult.Visibility = Visibility.Hidden; - - //******"可用于ShadowRocket (ios)、igniter(Android)、Qv2ray (windows) 扫码和导入url。注意:有的客户端可能不支持WebSocket模式。" ****** - TextBlockQrURLexplain.Text = Application.Current.FindResource("TextBlockQrURLexplainTrojan-go").ToString(); - - //主机地址 - TextBoxTrojanGoServerHost.Text = MainWindow.ReceiveConfigurationParameters[4]; - //主机端口 - TextBoxTrojanGoServerPort.Text = "443"; - //密钥(uuid) - TextBoxTrojanGoServerPassword.Text = MainWindow.ReceiveConfigurationParameters[2]; - //SNI - TextBoxTrojanGoSNI.Text = MainWindow.ReceiveConfigurationParameters[4]; - //TrojanGo 使用类型 - TextBoxTrojanGoType.Text = "original"; - - //WebSocket设置 - if (MainWindow.ReceiveConfigurationParameters[0].Equals("TrojanGoWebSocketTLS2Web")) - { - TextBoxTrojanGoType.Text = "ws"; - //Host - TextBoxTrojanGoHost.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBlockTrojanGoHost.Visibility = Visibility.Visible; - TextBoxTrojanGoHost.Visibility = Visibility.Visible; - //Path - TextBoxTrojanGoWSPath.Text = MainWindow.ReceiveConfigurationParameters[6]; - TextBoxTrojanGoWSPath.Visibility = Visibility.Visible; - TextBlockTrojanGoWebSocketPath.Visibility = Visibility.Visible; - TextBlockTrojanGoCaption.Visibility = Visibility.Visible; - - } - if(String.Equals(MainWindow.ReceiveConfigurationParameters[9],"true") == true) - { - TextBoxConcurrency.Text = MainWindow.ReceiveConfigurationParameters[3]; - TextBoxIdle_timeout.Text = MainWindow.ReceiveConfigurationParameters[5]; - TextBlockMuxSelect.Visibility = Visibility.Visible; - GridMuxSelect.Visibility = Visibility.Visible; - TextBlockExplainCheckBoxMuxSelectResult.Visibility = Visibility.Visible; - } - CheckDir("trojan-go_config"); - GenerateTrojanGoShareQRcodeAndBase64Url(); - } - else if (String.Equals(MainWindow.proxyType, "Trojan")) - { - GroupBoxClientMTProto.Visibility = Visibility.Collapsed; - GroupBoxClientQRandURL.Visibility = Visibility.Visible; - GroupBoxClientSSpc.Visibility = Visibility.Collapsed; - GroupBoxV2rayClient.Visibility = Visibility.Collapsed; - GroupBoxXrayClient.Visibility = Visibility.Collapsed; - GroupBoxTrojanGoClient.Visibility = Visibility.Collapsed; - GroupBoxTrojanClient.Visibility = Visibility.Visible; - GroupBoxNaiveProxyClient.Visibility = Visibility.Collapsed; - GroupBoxSSRClient.Visibility = Visibility.Collapsed; - GroupBoxClientSS.Visibility = Visibility.Collapsed; - - TextBlockQrURLexplain.Text = Application.Current.FindResource("TextBlockQrURLexplainTrojan").ToString(); - - //主机地址 - TextBoxTrojanServerHost.Text = MainWindow.ReceiveConfigurationParameters[4]; - //主机端口 - TextBoxTrojanServerPort.Text = "443"; - //密钥(uuid) - TextBoxTrojanServerPassword.Text = MainWindow.ReceiveConfigurationParameters[2]; - - CheckDir("trojan_config"); - GenerateTrojanShareQRcodeAndBase64Url(); - } - else if (String.Equals(MainWindow.proxyType, "NaiveProxy")) - { - GroupBoxClientMTProto.Visibility = Visibility.Collapsed; - GroupBoxClientQRandURL.Visibility = Visibility.Visible; - GroupBoxClientSSpc.Visibility = Visibility.Collapsed; - GroupBoxV2rayClient.Visibility = Visibility.Collapsed; - GroupBoxXrayClient.Visibility = Visibility.Collapsed; - GroupBoxTrojanGoClient.Visibility = Visibility.Collapsed; - GroupBoxTrojanClient.Visibility = Visibility.Collapsed; - GroupBoxNaiveProxyClient.Visibility = Visibility.Visible; - GroupBoxSSRClient.Visibility = Visibility.Collapsed; - GroupBoxClientSS.Visibility = Visibility.Collapsed; - - TextBlockQrURLexplain.Text = Application.Current.FindResource("TextBlockQrURLexplainNaiveProxy").ToString(); - - TextBoxNaiveServerHost.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxNaiveUser.Text = MainWindow.ReceiveConfigurationParameters[3]; - TextBoxNaivePassword.Text = MainWindow.ReceiveConfigurationParameters[2]; - GenerateNaivePrxoyShareQRcodeAndBase64Url(); - } - else if (String.Equals(MainWindow.proxyType, "SSR")) - { - GroupBoxClientMTProto.Visibility = Visibility.Collapsed; - GroupBoxClientQRandURL.Visibility = Visibility.Visible; - GroupBoxClientSSpc.Visibility = Visibility.Collapsed; - GroupBoxV2rayClient.Visibility = Visibility.Collapsed; - GroupBoxXrayClient.Visibility = Visibility.Collapsed; - GroupBoxTrojanGoClient.Visibility = Visibility.Collapsed; - GroupBoxTrojanClient.Visibility = Visibility.Collapsed; - GroupBoxNaiveProxyClient.Visibility = Visibility.Collapsed; - GroupBoxSSRClient.Visibility = Visibility.Visible; - GroupBoxClientSS.Visibility = Visibility.Collapsed; - - TextBlockQrURLexplain.Text = Application.Current.FindResource("TextBlockQrURLexplainSSR").ToString(); - - //主机地址 - TextBoxSSRHostAddress.Text = MainWindow.ReceiveConfigurationParameters[4]; - //主机端口 - TextBoxSSRPort.Text = "443"; - //密码(uuid) - TextBoxSSRUUID.Text = MainWindow.ReceiveConfigurationParameters[2]; - //加密方式 - TextBoxSSREncryption.Text = "none"; - //传输协议 - TextBoxSSRTransmission.Text = "auth_chain_a"; - //混淆 - TextBoxSSRCamouflageType.Text = "tls1.2_ticket_auth"; - - //CheckDir("ssr_config"); - GenerateSSRShareQRcodeAndBase64Url(); - } - else if (String.Equals(MainWindow.proxyType, "SS")) - { - GroupBoxClientMTProto.Visibility = Visibility.Collapsed; - GroupBoxClientQRandURL.Visibility = Visibility.Visible; - GroupBoxClientSSpc.Visibility = Visibility.Collapsed; - GroupBoxV2rayClient.Visibility = Visibility.Collapsed; - GroupBoxXrayClient.Visibility = Visibility.Collapsed; - GroupBoxTrojanGoClient.Visibility = Visibility.Collapsed; - GroupBoxTrojanClient.Visibility = Visibility.Collapsed; - GroupBoxNaiveProxyClient.Visibility = Visibility.Collapsed; - GroupBoxSSRClient.Visibility = Visibility.Collapsed; - GroupBoxClientSS.Visibility = Visibility.Visible; - - //主机地址 - TextBoxHostAddressSS.Text = MainWindow.ReceiveConfigurationParameters[4]; - //主机端口 - TextBoxPortSS.Text = MainWindow.ReceiveConfigurationParameters[1]; - //密码(uuid) - TextBoxPasswordSS.Text = MainWindow.ReceiveConfigurationParameters[2]; - //加密方式 - TextBoxEncryptionSS.Text = MainWindow.ReceiveConfigurationParameters[3]; - //插件程序 - TextBoxPluginNameExplainSS.Text = MainWindow.ReceiveConfigurationParameters[5]; - //插件选项 - TextBoxPluginOptionExplainSS.Text = MainWindow.ReceiveConfigurationParameters[9]; - //创建ss配置文件总文件夹 - CheckDir("ss_config"); - - if (String.IsNullOrEmpty(TextBoxPluginNameExplainSS.Text) == true) - { - TextBlockPluginNameExplainSS.Visibility = Visibility.Collapsed; - TextBoxPluginNameExplainSS.Visibility = Visibility.Collapsed; - - //TextBoxPluginNameExplainSSpc.Visibility = Visibility.Collapsed; - TextBlockPluginOptionExplainSS.Visibility = Visibility.Collapsed; - TextBoxPluginOptionExplainSS.Visibility = Visibility.Collapsed; - - TextBlockClientPromptSS.Visibility = Visibility.Collapsed; - RadioButtonMobile.Visibility = Visibility.Collapsed; - RadioButtonPC.Visibility = Visibility.Collapsed; - TextBlockQrURLexplain.Text = Application.Current.FindResource("TextBlockQrURLexplainSS").ToString(); - } - else - { - //显示插件程序与插件选项 - TextBlockPluginNameExplainSS.Visibility = Visibility.Visible; - TextBoxPluginNameExplainSS.Visibility = Visibility.Visible; - - TextBlockPluginOptionExplainSS.Visibility = Visibility.Visible; - TextBoxPluginOptionExplainSS.Visibility = Visibility.Visible; - - TextBlockClientPromptSS.Visibility = Visibility.Visible; - RadioButtonMobile.Visibility = Visibility.Visible; - RadioButtonPC.Visibility = Visibility.Visible; - - TextBlockQrURLexplain.Text = Application.Current.FindResource("TextBlockQrURLexplainSSmobile").ToString(); - TextBlockQrURLexplainSSpc.Text = Application.Current.FindResource("TextBlockQrURLexplainSSpc").ToString(); - - //转换成PC版plugin格式 - if (String.Equals(TextBoxPluginNameExplainSS.Text, "obfs-local")) - { - TextBoxPluginNameExplainSSpc.Text = @"plugins\obfs-local.exe"; - } - else if (String.Equals(TextBoxPluginNameExplainSS.Text, "v2ray-plugin")) - { - TextBoxPluginNameExplainSSpc.Text = @"plugins\v2ray-plugin.exe"; - } - else if (String.Equals(TextBoxPluginNameExplainSS.Text, "kcptun")) - { - TextBoxPluginNameExplainSSpc.Text = @"plugins\kcptun-client.exe"; - } - else if (String.Equals(TextBoxPluginNameExplainSS.Text, "goquiet")) - { - TextBoxPluginNameExplainSSpc.Text = @"plugins\goquiet-client.exe"; - } - else if (String.Equals(TextBoxPluginNameExplainSS.Text, "cloak")) - { - TextBoxPluginNameExplainSSpc.Text = @"plugins\cloak-client.exe"; - } - } - - GenerateShareQRcodeAndBase64UrlSS(); - //选择手机端做为默认显示 - if (String.IsNullOrEmpty(TextBoxPluginNameExplainSS.Text) == false) - { - RadioButtonMobile.IsChecked = true; - if (String.Equals(TextBoxPluginNameExplainSS.Text, "goquiet")) - { - RadioButtonPC.IsChecked = true; - RadioButtonMobile.Visibility = Visibility.Collapsed; - TextBlockClientPromptSS.Visibility = Visibility.Collapsed; - //File.Delete($"ss_config\\{saveFileFolder}\\QR.bmp"); - //File.Delete($"ss_config\\{saveFileFolder}\\url.txt"); - } - else if (String.Equals(TextBoxPluginNameExplainSS.Text, "cloak")) - { - RadioButtonPC.IsChecked = true; - RadioButtonMobile.Visibility = Visibility.Collapsed; - TextBlockClientPromptSS.Visibility = Visibility.Collapsed; - //File.Delete($"ss_config\\{saveFileFolder}\\QR.bmp"); - //File.Delete($"ss_config\\{saveFileFolder}\\url.txt"); - } - - } - - } - else if (String.Equals(MainWindow.proxyType, "MTProto")) - { - //显示MTProto参数,隐藏其他 - GroupBoxClientMTProto.Visibility = Visibility.Visible; - GroupBoxClientQRandURL.Visibility = Visibility.Collapsed; - GroupBoxClientSSpc.Visibility = Visibility.Collapsed; - GroupBoxV2rayClient.Visibility = Visibility.Collapsed; - GroupBoxXrayClient.Visibility = Visibility.Collapsed; - GroupBoxTrojanGoClient.Visibility = Visibility.Collapsed; - GroupBoxTrojanClient.Visibility = Visibility.Collapsed; - GroupBoxNaiveProxyClient.Visibility = Visibility.Collapsed; - GroupBoxSSRClient.Visibility = Visibility.Collapsed; - GroupBoxClientSS.Visibility = Visibility.Collapsed; - - string proxyfolder = CheckDir("mtproto_config"); - configDomainSavePath = CreateConfigSaveDir(proxyfolder, MainWindow.ReceiveConfigurationParameters[4]); - string configSavePath = configDomainSavePath; - - RadioButtonMtgIpv4.IsChecked = true; - - JObject jObjectJson = JObject.Parse(MainWindow.ReceiveConfigurationParameters[9]); - - if (jObjectJson["ipv6"]["tg_url"].ToString().Contains("nil") == false) - { - RadioButtonMtgIpv6.Visibility = Visibility.Visible; - TextBoxURLMtgTgIpv6.Text = jObjectJson["ipv6"]["tg_url"].ToString(); - ImageShareQRcodeMtgTgIpv6.Source = CreateQRCode(TextBoxURLMtgTgIpv6.Text, $"{configSavePath}\\QRIpv6Tg.bmp"); - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\urlIpv6Tg.txt")) - { - sw.WriteLine(TextBoxURLMtgTgIpv6.Text); - } - - TextBoxURLMtgTmeIpv6.Text = jObjectJson["ipv6"]["tme_url"].ToString(); - ImageShareQRcodeMtgTmeIpv6.Source = CreateQRCode(TextBoxURLMtgTmeIpv6.Text, $"{configSavePath}\\QRIpv6Tme.bmp"); - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\urlIpv6Tme.txt")) - { - sw.WriteLine(TextBoxURLMtgTmeIpv6.Text); - } - RadioButtonMtgIpv6.IsChecked = true; - } - else - { - RadioButtonMtgIpv6.Visibility = Visibility.Collapsed; - } - - if (jObjectJson["ipv4"]["tg_url"].ToString().Contains("nil") == false) - { - RadioButtonMtgIpv4.Visibility = Visibility.Visible; - TextBoxURLMtgTgIpv4.Text = jObjectJson["ipv4"]["tg_url"].ToString(); - ImageShareQRcodeMtgTgIpv4.Source = CreateQRCode(TextBoxURLMtgTgIpv4.Text, $"{configSavePath}\\QRIpv4Tg.bmp"); - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\urlIpv4Tg.txt")) - { - sw.WriteLine(TextBoxURLMtgTgIpv4.Text); - } - - TextBoxURLMtgTmeIpv4.Text = jObjectJson["ipv4"]["tme_url"].ToString(); - ImageShareQRcodeMtgTmeIpv4.Source = CreateQRCode(TextBoxURLMtgTmeIpv4.Text, $"{configSavePath}\\QRIpv4Tme.bmp"); - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\urlIpv4Tme.txt")) - { - sw.WriteLine(TextBoxURLMtgTmeIpv4.Text); - } - RadioButtonMtgIpv4.IsChecked = true; - } - else - { - RadioButtonMtgIpv4.Visibility = Visibility.Collapsed; - } - - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\mtproto_info.json")) - { - sw.Write(MainWindow.ReceiveConfigurationParameters[9].ToString()); - } - - } - } - - #region V2Ray 相关 - - #region V2ray参数设置函数 - - //设置VLESS over TCP with XTLS - private void V2raySetVlessTcpXtls() - { - GridNotTrojanParameters.Visibility = Visibility.Visible; - TextBlockVmessOrVless.Text = Application.Current.FindResource("TabItemHeaderV2RayVlessProtocol").ToString(); - TextBlockVmessOrVless.Visibility = Visibility.Visible; - //隐藏下面的二维码显示 - HideGroupBoxClientQRandURL(); - //ImageShareQRcode.Source = ImageShareQRcodeDefault; - //TextBoxURL.Text = TextBoxURLDefault; - - TextBoxEncryption.Text = "none"; - TextBoxTransmission.Text = "tcp"; - TextBoxCamouflageType.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryption.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxTLS.Text = "xtls"; - HideAlterId(); - ShowHostName(); - ShowPathV2ray(); - TextBoxQuicKeyMkcpSeedPath.Text = ""; - - - } - - //设置VLESS over TCP with TLS - private void V2raySetVlessTcpTls() - { - GridNotTrojanParameters.Visibility = Visibility.Visible; - TextBlockVmessOrVless.Text = Application.Current.FindResource("TabItemHeaderV2RayVlessProtocol").ToString(); - TextBlockVmessOrVless.Visibility = Visibility.Visible; - //隐藏下面的二维码显示 - HideGroupBoxClientQRandURL(); - //TextBoxURL.Text = TextBoxURLVlessTcp; - //ImageShareQRcode.Source = ImageShareQRcodeVlessTcp; - - TextBoxEncryption.Text = "none"; - TextBoxTransmission.Text = "tcp"; - TextBoxCamouflageType.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryption.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxTLS.Text = "tls"; - HideAlterId(); - ShowHostName(); - ShowPathV2ray(); - TextBoxQuicKeyMkcpSeedPath.Text = ""; - } - - //设置VLESS over WS with TLS - private void V2raySetVlessWsTls() - { - GridNotTrojanParameters.Visibility = Visibility.Visible; - TextBlockVmessOrVless.Text = Application.Current.FindResource("TabItemHeaderV2RayVlessProtocol").ToString(); - TextBlockVmessOrVless.Visibility = Visibility.Visible; - //隐藏下面的二维码显示 - HideGroupBoxClientQRandURL(); - //TextBoxURL.Text = TextBoxURLVlessWs; - //ImageShareQRcode.Source = ImageShareQRcodeVlessWs; - - TextBoxEncryption.Text = "none"; - TextBoxTransmission.Text = "ws"; - TextBoxCamouflageType.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryption.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxTLS.Text = "tls"; - HideAlterId(); - ShowHostName(); - ShowPathV2ray(); - TextBoxQuicKeyMkcpSeedPath.Text = MainWindow.ReceiveConfigurationParameters[3]; - - } - - //设置VMess over TCP with TLS - private void V2raySetVmessTcpTls() - { - GridNotTrojanParameters.Visibility = Visibility.Visible; - TextBoxEncryption.Text = "none"; - TextBoxTransmission.Text = "tcp"; - TextBoxCamouflageType.Text = "http"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryption.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxTLS.Text = "tls"; - ShowAlterId(); - ShowHostName(); - ShowPathV2ray(); - TextBoxQuicKeyMkcpSeedPath.Text = MainWindow.ReceiveConfigurationParameters[9]; - TextBlockVmessOrVless.Visibility = Visibility.Collapsed; - //显示下面的二维码显示。 - //HideGroupBoxClientQRandURL(); - ShowGroupBoxClientQRandURL(); - TextBoxURL.Text = TextBoxURLVmessTcp; - ImageShareQRcode.Source = ImageShareQRcodeVmessTcp; - } - - //设置VMess over WS with TLS - private void V2raySetVmessWsTls() - { - GridNotTrojanParameters.Visibility = Visibility.Visible; - TextBoxEncryption.Text = "none"; - TextBoxTransmission.Text = "ws"; - TextBoxCamouflageType.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryption.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxTLS.Text = "tls"; - ShowAlterId(); - ShowHostName(); - ShowPathV2ray(); - TextBoxQuicKeyMkcpSeedPath.Text = MainWindow.ReceiveConfigurationParameters[6]; - TextBlockVmessOrVless.Visibility = Visibility.Collapsed; - ShowGroupBoxClientQRandURL(); - TextBoxURL.Text = TextBoxURLVmessWs; - ImageShareQRcode.Source = ImageShareQRcodeVmessWs; - } - - //设置Trojan over TCP with TLS - private void V2raySetTrojanTcpTls() - { - //隐藏所有不是Trojan的参数 - GridNotTrojanParameters.Visibility = Visibility.Collapsed; - //显示下面的二维码与分享链接 - ShowGroupBoxClientQRandURL(); - TextBoxURL.Text = TextBoxURLTrojanTcp; - ImageShareQRcode.Source = ImageShareQRcodeTrojanTcp; - } - #endregion - - #region 界面控制相关 - - //显示Quic 加密方式 - private void ShowQuicEncryption() - { - TextBlockQuicEncryption.Visibility = Visibility.Visible; - TextBlockHost.Visibility = Visibility.Collapsed; - } - - //显示Host隐藏Quic加密方式 - private void ShowHostName() - { - TextBlockHost.Visibility = Visibility.Visible; - TextBlockQuicEncryption.Visibility = Visibility.Collapsed; - } - - //显示路径Path,隐藏mKCP/Quic Key/复制按钮 - private void ShowPathV2ray() - { - TextBlockPath.Visibility = Visibility.Visible; - TextBlockMkcpSeed.Visibility = Visibility.Collapsed; - TextBlockQuicKey.Visibility = Visibility.Collapsed; - } - - //显示mKCP Seed/复制按钮,隐藏Path/Quic Key - private void ShowMkcpSeed() - { - TextBlockPath.Visibility = Visibility.Collapsed; - TextBlockMkcpSeed.Visibility = Visibility.Visible; - TextBlockQuicKey.Visibility = Visibility.Collapsed; - } - - //显示Quic Key/复制按钮 隐藏Path/mKcp Seed - private void ShowQuicKey() - { - TextBlockPath.Visibility = Visibility.Collapsed; - TextBlockMkcpSeed.Visibility = Visibility.Collapsed; - TextBlockQuicKey.Visibility = Visibility.Visible; - } - - //显示额外ID - private void ShowAlterId() - { - TextBlockUUIDextra.Visibility = Visibility.Visible; - TextBoxUUIDextra.Visibility = Visibility.Visible; - TextBlockUUIDextraExplanation.Visibility = Visibility.Visible; - - } - - //隐藏额外ID - private void HideAlterId() - { - TextBlockUUIDextra.Visibility = Visibility.Collapsed; - TextBoxUUIDextra.Visibility = Visibility.Collapsed; - TextBlockUUIDextraExplanation.Visibility = Visibility.Collapsed; - - } - - //显示加密方式 - private void ShowEncryption() - { - TextBlockEncryption.Visibility = Visibility.Visible; - TextBoxEncryption.Visibility = Visibility.Visible; - } - //隐藏加密方式 - private void HideEncryption() - { - TextBlockEncryption.Visibility = Visibility.Collapsed; - TextBoxEncryption.Visibility = Visibility.Collapsed; - } - - //显示传输协议 - private void ShowTransferProtocol() - { - TextBlockTransferProtocol.Visibility = Visibility.Visible; - TextBoxTransmission.Visibility = Visibility.Visible; - } - //隐藏传输协议 - private void HideTransferProtocol() - { - TextBlockTransferProtocol.Visibility = Visibility.Collapsed; - TextBoxTransmission.Visibility = Visibility.Collapsed; - } - //显示伪装类型 - private void ShowTextBlockCamouflageType() - { - TextBlockCamouflageType.Visibility = Visibility.Visible; - TextBoxCamouflageType.Visibility = Visibility.Visible; - } - //隐藏伪装类型 - private void HideTextBlockCamouflageType() - { - TextBlockCamouflageType.Visibility = Visibility.Collapsed; - TextBoxCamouflageType.Visibility = Visibility.Collapsed; - } - - //显示二维码与链接分享 - private void ShowGroupBoxClientQRandURL() - { - GroupBoxClientQRandURL.Visibility = Visibility.Visible; - } - //隐藏二维码与链接分享 - private void HideGroupBoxClientQRandURL() - { - GroupBoxClientQRandURL.Visibility = Visibility.Hidden; - } - - //以下几个为对RadioButton按钮的选中后,界面变化与参数显示 - private void RadioButtonVlessTcpXtls_Checked(object sender, RoutedEventArgs e) - { - V2raySetVlessTcpXtls(); - } - - private void RadioButtonVlessTcpTls_Checked(object sender, RoutedEventArgs e) - { - V2raySetVlessTcpTls(); - } - - private void RadioButtonVlessWsTls_Checked(object sender, RoutedEventArgs e) - { - V2raySetVlessWsTls(); - } - - private void RadioButtonVmessTcpTls_Checked(object sender, RoutedEventArgs e) - { - V2raySetVmessTcpTls(); - } - - private void RadioButtonVmessWsTls_Checked(object sender, RoutedEventArgs e) - { - V2raySetVmessWsTls(); - } - - private void RadioButtonTrojanTcpTls_Checked(object sender, RoutedEventArgs e) - { - V2raySetTrojanTcpTls(); - } - #endregion - - #region 复制参数到剪贴板中 - - //复制内容到剪贴板函数 - private void CopyToClipboard(string content) - { - if (content != "") - { - Clipboard.SetDataObject(content); - //MessageBox.Show(Application.Current.FindResource("MessageBoxShow_V2RayUUIDcopyedToClip").ToString()); - string message = Application.Current.FindResource("MessageBoxShow_V2RayUUIDcopyedToClip").ToString(); - MessageBoxTimeoutA((IntPtr)0, message, "", 0, 0, 600); // 直接调用 0.6秒后自动关闭 - } - else - { - //MessageBox.Show(Application.Current.FindResource("MessageBoxShow_V2RayEmptyToClip").ToString()); - string message = Application.Current.FindResource("MessageBoxShow_V2RayEmptyToClip").ToString(); - MessageBoxTimeoutA((IntPtr)0, message, "", 0, 0, 600); // 直接调用 0.6秒后自动关闭 - } - } - - //复制服务器地址到剪贴板 - private void TextBoxHostAddress_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxHostAddress.Text); - } - - - //复制服务器端口到剪贴板 - private void TextBoxPort_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxPort.Text); - } - - //复制UUID到剪贴板 - private void TextBoxUUID_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxUUID.Text); - } - - //复制额外ID到剪贴板 - private void TextBoxUUIDextra_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxUUIDextra.Text); - } - - //复制加密方式到剪贴板 - private void TextBoxEncryption_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxEncryption.Text); - } - - //复制传输协议到剪贴板 - private void TextBoxTransmission_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxTransmission.Text); - } - - //复制伪装方式到剪贴板 - private void TextBoxCamouflageType_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxCamouflageType.Text); - } - - //复制Host/Quic加密方法到剪贴板 - private void TextBoxHostQuicEncryption_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxHostQuicEncryption.Text); - } - - //复制Quic Key/mKCP Seed/路径Path 到剪贴板中 - private void TextBoxQuicKeyMkcpSeedPath_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxQuicKeyMkcpSeedPath.Text); - } - - //复制TLS 到剪贴板中 - private void TextBoxTLS_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxTLS.Text); - } - - //复制URL链接到剪贴板中 - private void TextBoxURL_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxURL.Text); - } - - #endregion - - #region V2Ray客户端生成 - //生成单方案v2rayN客户端导入文件 - private void GenerateV2rayShareQRcodeAndBase64Url() - { - //生成v2rayN的json文件 - string v2rayNjsonFile = @" -{ - ""v"": """", - ""ps"": """", - ""add"": """", - ""port"": """", - ""id"": """", - ""aid"": """", - ""net"": """", - ""type"": """", - ""host"": """", - ""path"": """", - ""tls"": """" -}"; - //MessageBox.Show(v2rayNjsonFile); - JObject v2rayNjsonObject = JObject.Parse(v2rayNjsonFile); - v2rayNjsonObject["v"] = "2"; - v2rayNjsonObject["add"] = TextBoxHostAddress.Text; //设置域名 - v2rayNjsonObject["port"] = TextBoxPort.Text; //设置端口 - v2rayNjsonObject["id"] = TextBoxUUID.Text; //设置uuid - v2rayNjsonObject["aid"] = TextBoxUUIDextra.Text; //设置额外ID - v2rayNjsonObject["net"] = TextBoxTransmission.Text; //设置传输模式 - v2rayNjsonObject["type"] = TextBoxCamouflageType.Text; //设置伪装类型 - - if (TextBoxTransmission.Text.Contains("kcp") == true) - { - v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text;//设置mKCP Seed - v2rayNjsonObject["host"] = "";//设置Host - } - else if (TextBoxTransmission.Text.Contains("quic")==true) - { - v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text;//设置quic密钥 - v2rayNjsonObject["host"] = TextBoxHostQuicEncryption.Text;//Quic加密方式 - } - else - { - v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text; //设置路径 - v2rayNjsonObject["host"] = TextBoxHostQuicEncryption.Text;//设置TLS的Host - } - - v2rayNjsonObject["tls"] = TextBoxTLS.Text; //设置是否启用TLS - v2rayNjsonObject["ps"] = v2rayNjsonObject["add"]; //设置备注 - //MessageBox.Show(v2rayNjsonObject["v"].ToString()); - //MessageBox.Show("step1"); - string proxyfolder = CheckDir("v2ray_config"); - //MessageBox.Show("step2"); - configDomainSavePath = CreateConfigSaveDir(proxyfolder, TextBoxHostAddress.Text); - //MessageBox.Show("step3"); - string configSavePath = configDomainSavePath; - - //生成二维码与URL,跳过VlessTcpTlsWeb暂时未有URL标准 - string vmessUrl = "vmess://" + ToBase64Encode(v2rayNjsonObject.ToString()); - TextBoxURL.Text = vmessUrl; - if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "VlessXtlsTcp") == false - && String.Equals(MainWindow.ReceiveConfigurationParameters[0], "VlessTcpTlsWeb") == false - && String.Equals(MainWindow.ReceiveConfigurationParameters[0], "VlessWebSocketTlsWeb") == false - && String.Equals(MainWindow.ReceiveConfigurationParameters[0], "VlessHttp2Web") == false - && MainWindow.mKCPvlessIsSet == false) - { - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\url.txt")) - { - sw.WriteLine(vmessUrl); - } - ImageShareQRcode.Source = CreateQRCode(vmessUrl, $"{configSavePath}\\QR.bmp"); - } - - if (File.Exists(@"v2ray_config\config.json")) - { - File.Move(@"v2ray_config\config.json", $"{configSavePath}\\config.json"); - //File.Delete(@"config\config.json");//删除该文件 - } - - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\readme.txt")) - { - ReadmeTxtWriteGenerate(sw); - //sw.WriteLine("config.json"); - ////****** "此文件为v2ray官方程序所使用的客户端配置文件,配置为全局模式,socks5地址:127.0.0.1:1080,http代理地址:127.0.0.1:1081" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine01").ToString()); - - ////****** "v2ray官方网站:https://www.v2ray.com/" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine02").ToString()); - - ////****** "v2ray官方程序下载地址:https://github.com/v2ray/v2ray-core/releases" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine03").ToString()); - - ////****** "下载相应版本,Windows选择v2ray-windows-64.zip或者v2ray-windows-32.zip,解压后提取v2ctl.exe和v2ray.exe。与config.json放在同一目录,运行v2ray.exe即可。" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine04").ToString()); - - //sw.WriteLine("-----------------------------------------"); - //sw.WriteLine("QR.bmp"); - - ////****** "此文件为v2rayN(windows)、Qv2ray(windows)、v2rayNG(Android)、Shadowrocket(ios)扫码导入节点" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine05").ToString()); - - ////****** "v2rayN下载网址:https://github.com/2dust/v2rayN/releases" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine06").ToString()); - - ////****** "Qv2ray下载网址:https://github.com/Qv2ray/Qv2ray/releases" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine07").ToString()); - - ////****** "v2rayNG(Android)下载网址:https://github.com/2dust/v2rayNG/releases" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine08").ToString()); - - ////****** "v2rayNG(Android)在Google Play下载网址:https://play.google.com/store/apps/details?id=com.v2ray.ang" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine09").ToString()); - - ////****** "Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine10").ToString()); - - //sw.WriteLine("-----------------------------------------"); - //sw.WriteLine("url.txt"); - - ////****** "此文件为v2rayN、Qv2ray、v2rayNG(Android)、Shadowrocket(ios)复制粘贴导入节点的vmess网址" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine11").ToString()); - - ////写入通用配置参数 - //TxtWriteGeneralParameters(sw); - } - } - - #region VLESS VMESS XTLS WS共存方案生成链接与说明文件 - - //生成VLESS Vmess Tcp Xtls Ws 配置保存(暂未有分享链接与二维码) - private void GenerateV2rayVlessVmessTcpXtlsWsShareQRcodeAndBase64Url(string plainSavePath) - { - #region 暂时不用内容 - // //生成v2rayN的json文件 - // string v2rayNjsonFile = @" - //{ - // ""v"": """", - // ""ps"": """", - // ""add"": """", - // ""port"": """", - // ""id"": """", - // ""aid"": """", - // ""net"": """", - // ""type"": """", - // ""host"": """", - // ""path"": """", - // ""tls"": """" - //}"; - // //MessageBox.Show(v2rayNjsonFile); - // JObject v2rayNjsonObject = JObject.Parse(v2rayNjsonFile); - // v2rayNjsonObject["v"] = "2"; - // v2rayNjsonObject["add"] = TextBoxHostAddress.Text; //设置域名 - // v2rayNjsonObject["port"] = TextBoxPort.Text; //设置端口 - // v2rayNjsonObject["id"] = TextBoxUUID.Text; //设置uuid - // v2rayNjsonObject["aid"] = TextBoxUUIDextra.Text; //设置额外ID - // v2rayNjsonObject["net"] = TextBoxTransmission.Text; //设置传输模式 - // v2rayNjsonObject["type"] = TextBoxCamouflageType.Text; //设置伪装类型 - - // if (TextBoxTransmission.Text.Contains("kcp") == true) - // { - // v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text;//设置mKCP Seed - // } - // else if (TextBoxTransmission.Text.Contains("quic") == true) - // { - // v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text;//设置quic密钥 - // v2rayNjsonObject["host"] = TextBoxHostQuicEncryption.Text;//Quic加密方式 - // } - // else - // { - // v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text; //设置路径 - // v2rayNjsonObject["host"] = TextBoxHostQuicEncryption.Text;//设置TLS的Host - // } - - // v2rayNjsonObject["tls"] = TextBoxTLS.Text; //设置是否启用TLS - // v2rayNjsonObject["ps"] = v2rayNjsonObject["add"]; //设置备注 - // //MessageBox.Show(v2rayNjsonObject["v"].ToString()); - - //string saveFileFolderFirst = TextBoxHostAddress.Text; - //int num = 1; - //saveFileFolder = saveFileFolderFirst; - //CheckDir(@"v2ray_config"); - //while (Directory.Exists(@"v2ray_config\" + saveFileFolder)) - //{ - // saveFileFolder = saveFileFolderFirst + "_copy_" + num.ToString(); - // num++; - //} - //CheckDir(@"v2ray_config\" + saveFileFolder); - - #endregion - - //创建保存目录 - //string plainSavePath = @""; - - //v2ray_config\${域名IP}\vless_tcp_xtls_client_config - string configSavePath = CheckDir($"{configDomainSavePath}\\{plainSavePath}"); - - - //生成二维码与URL,跳过VlessTcpTlsWeb暂时未有URL标准 - //string vmessUrl = "vmess://" + ToBase64Encode(v2rayNjsonObject.ToString()); - //TextBoxURL.Text = vmessUrl; - //using (StreamWriter sw = new StreamWriter($"{configSavePath}\\url.txt")) - //{ - // if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "VlessTcpTlsWeb") == false) - // { - // sw.WriteLine(vmessUrl); - // } - //} - //if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "VlessTcpTlsWeb") == false) - //{ - // ImageShareQRcode.Source = CreateQRCode(vmessUrl, $"v2ray_config\\{saveFileFolder}\\QR.bmp"); - //} - - - if (File.Exists($"v2ray_config\\{plainSavePath}\\config.json")) - { - File.Move($"v2ray_config\\{plainSavePath}\\config.json", $"{configSavePath}\\config.json"); - Directory.Delete($"v2ray_config\\{plainSavePath}"); - } - - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\readme.txt")) - { - sw.WriteLine("config.json"); - //****** "此文件为v2ray官方程序所使用的客户端配置文件,配置为全局模式,socks5地址:127.0.0.1:1080,http代理地址:127.0.0.1:1081" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine01").ToString()); - - //****** "v2ray官方网站:https://www.v2ray.com/" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine02").ToString()); - - //****** "v2ray官方程序下载地址:https://github.com/v2ray/v2ray-core/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine03").ToString()); - - //****** "下载相应版本,Windows选择v2ray-windows-64.zip或者v2ray-windows-32.zip,解压后提取v2ctl.exe和v2ray.exe。与config.json放在同一目录,运行v2ray.exe即可。" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine04").ToString()); - - sw.WriteLine("-----------------------------------------"); - //sw.WriteLine("QR.bmp"); - - //****** "此文件为v2rayN、Qv2ray、v2rayNG(Android)、Shadowrocket(ios)扫码导入节点" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine05").ToString()); - - //****** "v2rayN下载网址:https://github.com/2dust/v2rayN/releases" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine06").ToString()); - - //****** "Qv2ray:https://github.com/Qv2ray/Qv2ray/releases" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine07").ToString()); - - //****** "v2rayNG(Android)下载网址:https://github.com/2dust/v2rayNG/releases" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine08").ToString()); - - //****** "v2rayNG(Android)在Google Play下载网址:https://play.google.com/store/apps/details?id=com.v2ray.ang" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine09").ToString()); - - //****** "Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine10").ToString()); - - //sw.WriteLine("-----------------------------------------"); - //sw.WriteLine("url.txt"); - - //****** "此文件为v2rayN、Qv2ray、v2rayNG(Android)、Shadowrocket(ios)复制粘贴导入节点的vmess网址" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine11").ToString()); - - //写入通用配置参数 - TxtWriteGeneralParameters(sw); - } - } - - - //生成VLESS over TCP with XTLS的配置保存(暂未有分享链接与二维码) - private void GenerateV2rayVlessTcpXtlsShareQRcodeAndBase64Url() - { - #region 暂时不用内容 - // //生成v2rayN的json文件 - // string v2rayNjsonFile = @" - //{ - // ""v"": """", - // ""ps"": """", - // ""add"": """", - // ""port"": """", - // ""id"": """", - // ""aid"": """", - // ""net"": """", - // ""type"": """", - // ""host"": """", - // ""path"": """", - // ""tls"": """" - //}"; - // //MessageBox.Show(v2rayNjsonFile); - // JObject v2rayNjsonObject = JObject.Parse(v2rayNjsonFile); - // v2rayNjsonObject["v"] = "2"; - // v2rayNjsonObject["add"] = TextBoxHostAddress.Text; //设置域名 - // v2rayNjsonObject["port"] = TextBoxPort.Text; //设置端口 - // v2rayNjsonObject["id"] = TextBoxUUID.Text; //设置uuid - // v2rayNjsonObject["aid"] = TextBoxUUIDextra.Text; //设置额外ID - // v2rayNjsonObject["net"] = TextBoxTransmission.Text; //设置传输模式 - // v2rayNjsonObject["type"] = TextBoxCamouflageType.Text; //设置伪装类型 - - // if (TextBoxTransmission.Text.Contains("kcp") == true) - // { - // v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text;//设置mKCP Seed - // } - // else if (TextBoxTransmission.Text.Contains("quic") == true) - // { - // v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text;//设置quic密钥 - // v2rayNjsonObject["host"] = TextBoxHostQuicEncryption.Text;//Quic加密方式 - // } - // else - // { - // v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text; //设置路径 - // v2rayNjsonObject["host"] = TextBoxHostQuicEncryption.Text;//设置TLS的Host - // } - - // v2rayNjsonObject["tls"] = TextBoxTLS.Text; //设置是否启用TLS - // v2rayNjsonObject["ps"] = v2rayNjsonObject["add"]; //设置备注 - // //MessageBox.Show(v2rayNjsonObject["v"].ToString()); - - //string saveFileFolderFirst = TextBoxHostAddress.Text; - //int num = 1; - //saveFileFolder = saveFileFolderFirst; - //CheckDir(@"v2ray_config"); - //while (Directory.Exists(@"v2ray_config\" + saveFileFolder)) - //{ - // saveFileFolder = saveFileFolderFirst + "_copy_" + num.ToString(); - // num++; - //} - //CheckDir(@"v2ray_config\" + saveFileFolder); - - #endregion - - //创建保存目录 - string plainSavePath = @"vless_tcp_xtls_client_config"; - - //v2ray_config\${域名IP}\vless_tcp_xtls_client_config - string configSavePath = CheckDir($"{configDomainSavePath}\\{plainSavePath}"); - - - //生成二维码与URL,跳过VlessTcpTlsWeb暂时未有URL标准 - //TextBoxURLDefault = "vmess://" + ToBase64Encode(v2rayNjsonObject.ToString()); - //TextBoxURL.Text = TextBoxURLDefault; - //using (StreamWriter sw = new StreamWriter($"{configSavePath}\\url.txt")) - //{ - - // sw.WriteLine(TextBoxURLDefault); - - //} - - // ImageShareQRcodeDefault = CreateQRCode(TextBoxURLDefault, $"v2ray_config\\{saveFileFolder}\\QR.bmp"); - // ImageShareQRcode.Source = ImageShareQRcodeDefault; - - - if (File.Exists($"v2ray_config\\{plainSavePath}\\config.json")) - { - File.Move($"v2ray_config\\{plainSavePath}\\config.json", $"{configSavePath}\\config.json"); - Directory.Delete($"v2ray_config\\{plainSavePath}"); - } - - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\readme.txt")) - { - sw.WriteLine("config.json"); - //****** "此文件为v2ray官方程序所使用的客户端配置文件,配置为全局模式,socks5地址:127.0.0.1:1080,http代理地址:127.0.0.1:1081" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine01").ToString()); - - //****** "v2ray官方网站:https://www.v2ray.com/" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine02").ToString()); - - //****** "v2ray官方程序下载地址:https://github.com/v2ray/v2ray-core/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine03").ToString()); - - //****** "下载相应版本,Windows选择v2ray-windows-64.zip或者v2ray-windows-32.zip,解压后提取v2ctl.exe和v2ray.exe。与config.json放在同一目录,运行v2ray.exe即可。" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine04").ToString()); - - //sw.WriteLine("-----------------------------------------"); - //sw.WriteLine("QR.bmp"); - - //****** "此文件为v2rayN、Qv2ray、v2rayNG(Android)、Shadowrocket(ios)扫码导入节点" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine05").ToString()); - - //****** "v2rayN下载网址:https://github.com/2dust/v2rayN/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine06").ToString()); - - //****** "Qv2ray:https://github.com/Qv2ray/Qv2ray/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine07").ToString()); - - //****** "v2rayNG(Android)下载网址:https://github.com/2dust/v2rayNG/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine08").ToString()); - - //****** "v2rayNG(Android)在Google Play下载网址:https://play.google.com/store/apps/details?id=com.v2ray.ang" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine09").ToString()); - - //****** "Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine10").ToString()); - - //sw.WriteLine("-----------------------------------------"); - //sw.WriteLine("url.txt"); - - //****** "此文件为v2rayN、Qv2ray、v2rayNG(Android)、Shadowrocket(ios)复制粘贴导入节点的vmess网址" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine11").ToString()); - - //写入通用配置参数-- - TxtWriteGeneralParameters(sw,false); - - } - } - - //生成VLESS over TCP with TLS的配置保存(暂未有分享链接与二维码) - private void GenerateV2rayVlessTcpTlsShareQRcodeAndBase64Url() - { - #region 暂时不用内容 - // //生成v2rayN的json文件 - // string v2rayNjsonFile = @" - //{ - // ""v"": """", - // ""ps"": """", - // ""add"": """", - // ""port"": """", - // ""id"": """", - // ""aid"": """", - // ""net"": """", - // ""type"": """", - // ""host"": """", - // ""path"": """", - // ""tls"": """" - //}"; - // //MessageBox.Show(v2rayNjsonFile); - // JObject v2rayNjsonObject = JObject.Parse(v2rayNjsonFile); - // v2rayNjsonObject["v"] = "2"; - // v2rayNjsonObject["add"] = TextBoxHostAddress.Text; //设置域名 - // v2rayNjsonObject["port"] = TextBoxPort.Text; //设置端口 - // v2rayNjsonObject["id"] = TextBoxUUID.Text; //设置uuid - // v2rayNjsonObject["aid"] = TextBoxUUIDextra.Text; //设置额外ID - // v2rayNjsonObject["net"] = TextBoxTransmission.Text; //设置传输模式 - // v2rayNjsonObject["type"] = TextBoxCamouflageType.Text; //设置伪装类型 - - // if (TextBoxTransmission.Text.Contains("kcp") == true) - // { - // v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text;//设置mKCP Seed - // } - // else if (TextBoxTransmission.Text.Contains("quic") == true) - // { - // v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text;//设置quic密钥 - // v2rayNjsonObject["host"] = TextBoxHostQuicEncryption.Text;//Quic加密方式 - // } - // else - // { - // v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text; //设置路径 - // v2rayNjsonObject["host"] = TextBoxHostQuicEncryption.Text;//设置TLS的Host - // } - - // v2rayNjsonObject["tls"] = TextBoxTLS.Text; //设置是否启用TLS - // v2rayNjsonObject["ps"] = v2rayNjsonObject["add"]; //设置备注 - // //MessageBox.Show(v2rayNjsonObject["v"].ToString()); - - //string saveFileFolderFirst = TextBoxHostAddress.Text; - //int num = 1; - //saveFileFolder = saveFileFolderFirst; - //CheckDir(@"v2ray_config"); - //while (Directory.Exists(@"v2ray_config\" + saveFileFolder)) - //{ - // saveFileFolder = saveFileFolderFirst + "_copy_" + num.ToString(); - // num++; - //} - //CheckDir(@"v2ray_config\" + saveFileFolder); - - #endregion - - //创建保存目录 - string plainSavePath = @"vless_tcp_tls_client_config"; - //v2ray_config\${域名IP} - //string configDomainSavePath = CreateConfigSaveDir(@"v2ray_config", TextBoxHostAddressSS.Text); - //v2ray_config\${域名IP}\vless_tcp_xtls_client_config - string configSavePath = CheckDir($"{configDomainSavePath}\\{plainSavePath}"); - - - //生成二维码与URL,跳过VlessTcpTlsWeb暂时未有URL标准 - //TextBoxURLVlessTcp = "vmess://" + ToBase64Encode(v2rayNjsonObject.ToString()); - //TextBoxURL.Text = TextBoxURLVlessTcp; - //using (StreamWriter sw = new StreamWriter($"{configSavePath}\\url.txt")) - //{ - - // sw.WriteLine(TextBoxURLVlessTcp); - - //} - - // ImageShareQRcodeVlessTcp = CreateQRCode(TextBoxURLVlessTcp, $"v2ray_config\\{saveFileFolder}\\QR.bmp"); - // ImageShareQRcode.Source = ImageShareQRcodeVlessTcp; - - - if (File.Exists($"v2ray_config\\{plainSavePath}\\config.json")) - { - File.Move($"v2ray_config\\{plainSavePath}\\config.json", $"{configSavePath}\\config.json"); - Directory.Delete($"v2ray_config\\{plainSavePath}"); - } - - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\readme.txt")) - { - sw.WriteLine("config.json"); - //****** "此文件为v2ray官方程序所使用的客户端配置文件,配置为全局模式,socks5地址:127.0.0.1:1080,http代理地址:127.0.0.1:1081" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine01").ToString()); - - //****** "v2ray官方网站:https://www.v2ray.com/" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine02").ToString()); - - //****** "v2ray官方程序下载地址:https://github.com/v2ray/v2ray-core/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine03").ToString()); - - //****** "下载相应版本,Windows选择v2ray-windows-64.zip或者v2ray-windows-32.zip,解压后提取v2ctl.exe和v2ray.exe。与config.json放在同一目录,运行v2ray.exe即可。" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine04").ToString()); - - //sw.WriteLine("-----------------------------------------"); - //sw.WriteLine("QR.bmp"); - - //****** "此文件为v2rayN、Qv2ray、v2rayNG(Android)、Shadowrocket(ios)扫码导入节点" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine05").ToString()); - - //****** "v2rayN下载网址:https://github.com/2dust/v2rayN/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine06").ToString()); - - //****** "Qv2ray:https://github.com/Qv2ray/Qv2ray/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine07").ToString()); - - //****** "v2rayNG(Android)下载网址:https://github.com/2dust/v2rayNG/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine08").ToString()); - - //****** "v2rayNG(Android)在Google Play下载网址:https://play.google.com/store/apps/details?id=com.v2ray.ang" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine09").ToString()); - - //****** "Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine10").ToString()); - - //sw.WriteLine("-----------------------------------------"); - //sw.WriteLine("url.txt"); - - //****** "此文件为v2rayN、Qv2ray、v2rayNG(Android)、Shadowrocket(ios)复制粘贴导入节点的vmess网址" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine11").ToString()); - - //写入通用配置参数-- - TxtWriteGeneralParameters(sw,false); - - } - } - - //生成VLESS over WS with TLS的配置保存(暂未有分享链接与二维码) - private void GenerateV2rayVlessWsTlsShareQRcodeAndBase64Url() - { - #region 暂时不用内容 - // //生成v2rayN的json文件 - // string v2rayNjsonFile = @" - //{ - // ""v"": """", - // ""ps"": """", - // ""add"": """", - // ""port"": """", - // ""id"": """", - // ""aid"": """", - // ""net"": """", - // ""type"": """", - // ""host"": """", - // ""path"": """", - // ""tls"": """" - //}"; - // //MessageBox.Show(v2rayNjsonFile); - // JObject v2rayNjsonObject = JObject.Parse(v2rayNjsonFile); - // v2rayNjsonObject["v"] = "2"; - // v2rayNjsonObject["add"] = TextBoxHostAddress.Text; //设置域名 - // v2rayNjsonObject["port"] = TextBoxPort.Text; //设置端口 - // v2rayNjsonObject["id"] = TextBoxUUID.Text; //设置uuid - // v2rayNjsonObject["aid"] = TextBoxUUIDextra.Text; //设置额外ID - // v2rayNjsonObject["net"] = TextBoxTransmission.Text; //设置传输模式 - // v2rayNjsonObject["type"] = TextBoxCamouflageType.Text; //设置伪装类型 - - // if (TextBoxTransmission.Text.Contains("kcp") == true) - // { - // v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text;//设置mKCP Seed - // } - // else if (TextBoxTransmission.Text.Contains("quic") == true) - // { - // v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text;//设置quic密钥 - // v2rayNjsonObject["host"] = TextBoxHostQuicEncryption.Text;//Quic加密方式 - // } - // else - // { - // v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text; //设置路径 - // v2rayNjsonObject["host"] = TextBoxHostQuicEncryption.Text;//设置TLS的Host - // } - - // v2rayNjsonObject["tls"] = TextBoxTLS.Text; //设置是否启用TLS - // v2rayNjsonObject["ps"] = v2rayNjsonObject["add"]; //设置备注 - // //MessageBox.Show(v2rayNjsonObject["v"].ToString()); - - //string saveFileFolderFirst = TextBoxHostAddress.Text; - //int num = 1; - //saveFileFolder = saveFileFolderFirst; - //CheckDir(@"v2ray_config"); - //while (Directory.Exists(@"v2ray_config\" + saveFileFolder)) - //{ - // saveFileFolder = saveFileFolderFirst + "_copy_" + num.ToString(); - // num++; - //} - //CheckDir(@"v2ray_config\" + saveFileFolder); - - #endregion - - //创建保存目录 - string plainSavePath = @"vless_ws_tls_client_config"; - //v2ray_config\${域名IP} - //string configDomainSavePath = CreateConfigSaveDir(@"v2ray_config", TextBoxHostAddressSS.Text); - //v2ray_config\${域名IP}\vless_tcp_xtls_client_config - string configSavePath = CheckDir($"{configDomainSavePath}\\{plainSavePath}"); - - - //生成二维码与URL,跳过VlessTcpTlsWeb暂时未有URL标准 - //TextBoxURLVlessWs = "vmess://" + ToBase64Encode(v2rayNjsonObject.ToString()); - //TextBoxURL.Text = TextBoxURLVlessWs; - //using (StreamWriter sw = new StreamWriter($"{configSavePath}\\url.txt")) - //{ - - // sw.WriteLine(TextBoxURLVlessWs); - - //} - - // ImageShareQRcodeVlessWs = CreateQRCode(TextBoxURLVlessWs, $"v2ray_config\\{saveFileFolder}\\QR.bmp"); - //ImageShareQRcode.Source = ImageShareQRcodeVlessWs; - - - if (File.Exists($"v2ray_config\\{plainSavePath}\\config.json")) - { - File.Move($"v2ray_config\\{plainSavePath}\\config.json", $"{configSavePath}\\config.json"); - Directory.Delete($"v2ray_config\\{plainSavePath}"); - } - - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\readme.txt")) - { - sw.WriteLine("config.json"); - //****** "此文件为v2ray官方程序所使用的客户端配置文件,配置为全局模式,socks5地址:127.0.0.1:1080,http代理地址:127.0.0.1:1081" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine01").ToString()); - - //****** "v2ray官方网站:https://www.v2ray.com/" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine02").ToString()); - - //****** "v2ray官方程序下载地址:https://github.com/v2ray/v2ray-core/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine03").ToString()); - - //****** "下载相应版本,Windows选择v2ray-windows-64.zip或者v2ray-windows-32.zip,解压后提取v2ctl.exe和v2ray.exe。与config.json放在同一目录,运行v2ray.exe即可。" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine04").ToString()); - - //sw.WriteLine("-----------------------------------------"); - //sw.WriteLine("QR.bmp"); - - //****** "此文件为v2rayN、Qv2ray、v2rayNG(Android)、Shadowrocket(ios)扫码导入节点" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine05").ToString()); - - //****** "v2rayN下载网址:https://github.com/2dust/v2rayN/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine06").ToString()); - - //****** "Qv2ray:https://github.com/Qv2ray/Qv2ray/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine07").ToString()); - - //****** "v2rayNG(Android)下载网址:https://github.com/2dust/v2rayNG/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine08").ToString()); - - //****** "v2rayNG(Android)在Google Play下载网址:https://play.google.com/store/apps/details?id=com.v2ray.ang" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine09").ToString()); - - //****** "Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine10").ToString()); - - //sw.WriteLine("-----------------------------------------"); - //sw.WriteLine("url.txt"); - - //****** "此文件为v2rayN、Qv2ray、v2rayNG(Android)、Shadowrocket(ios)复制粘贴导入节点的vmess网址" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine11").ToString()); - - //写入通用配置参数-- - TxtWriteGeneralParameters(sw,false); - - } - } - - //生成VMess over TCP with TLS的配置保存 - private void GenerateV2rayVmessTcpTlsShareQRcodeAndBase64Url() - { - #region 暂时不用内容 - //生成v2rayN的json文件 - string v2rayNjsonFile = @" -{ - ""v"": """", - ""ps"": """", - ""add"": """", - ""port"": """", - ""id"": """", - ""aid"": """", - ""net"": """", - ""type"": """", - ""host"": """", - ""path"": """", - ""tls"": """" -}"; - //MessageBox.Show(v2rayNjsonFile); - JObject v2rayNjsonObject = JObject.Parse(v2rayNjsonFile); - v2rayNjsonObject["v"] = "2"; - v2rayNjsonObject["add"] = TextBoxHostAddress.Text; //设置域名 - v2rayNjsonObject["port"] = TextBoxPort.Text; //设置端口 - v2rayNjsonObject["id"] = TextBoxUUID.Text; //设置uuid - v2rayNjsonObject["aid"] = TextBoxUUIDextra.Text; //设置额外ID - v2rayNjsonObject["net"] = TextBoxTransmission.Text; //设置传输模式 - v2rayNjsonObject["type"] = TextBoxCamouflageType.Text; //设置伪装类型 - - if (TextBoxTransmission.Text.Contains("kcp") == true) - { - v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text;//设置mKCP Seed - v2rayNjsonObject["host"] = "";//设置Host - } - else if (TextBoxTransmission.Text.Contains("quic") == true) - { - v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text;//设置quic密钥 - v2rayNjsonObject["host"] = TextBoxHostQuicEncryption.Text;//Quic加密方式 - } - else - { - v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text; //设置路径 - v2rayNjsonObject["host"] = TextBoxHostQuicEncryption.Text;//设置TLS的Host - } - - v2rayNjsonObject["tls"] = TextBoxTLS.Text; //设置是否启用TLS - v2rayNjsonObject["ps"] = v2rayNjsonObject["add"]; //设置备注 - - - #endregion - - //创建保存目录 - string plainSavePath = @"vmess_tcp_tls_client_config"; - //v2ray_config\${域名IP} - //string configDomainSavePath = CreateConfigSaveDir(@"v2ray_config", TextBoxHostAddressSS.Text); - //v2ray_config\${域名IP}\vless_tcp_xtls_client_config - string configSavePath = CheckDir($"{configDomainSavePath}\\{plainSavePath}"); - - - //生成二维码与URL,跳过VlessTcpTlsWeb暂时未有URL标准 - TextBoxURLVmessTcp = "vmess://" + ToBase64Encode(v2rayNjsonObject.ToString()); - //TextBoxURL.Text = TextBoxURLVmessTcp; - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\url.txt")) - { - sw.WriteLine(TextBoxURLVmessTcp); - } - - ImageShareQRcodeVmessTcp = CreateQRCode(TextBoxURLVmessTcp, $"{configSavePath}\\QR.bmp"); - //ImageShareQRcode.Source = ImageShareQRcodeVmessTcp; - - - if (File.Exists($"v2ray_config\\{plainSavePath}\\config.json")) - { - File.Move($"v2ray_config\\{plainSavePath}\\config.json", $"{configSavePath}\\config.json"); - Directory.Delete($"v2ray_config\\{plainSavePath}"); - } - - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\readme.txt")) - { - ReadmeTxtWriteGenerate(sw); - - } - } - - //生成VMess over WS with TLS的配置保存 - private void GenerateV2rayVmessWsTlsShareQRcodeAndBase64Url() - { - #region 暂时不用内容 - //生成v2rayN的json文件 - string v2rayNjsonFile = @" -{ - ""v"": """", - ""ps"": """", - ""add"": """", - ""port"": """", - ""id"": """", - ""aid"": """", - ""net"": """", - ""type"": """", - ""host"": """", - ""path"": """", - ""tls"": """" -}"; - //MessageBox.Show(v2rayNjsonFile); - JObject v2rayNjsonObject = JObject.Parse(v2rayNjsonFile); - v2rayNjsonObject["v"] = "2"; - v2rayNjsonObject["add"] = TextBoxHostAddress.Text; //设置域名 - v2rayNjsonObject["port"] = TextBoxPort.Text; //设置端口 - v2rayNjsonObject["id"] = TextBoxUUID.Text; //设置uuid - v2rayNjsonObject["aid"] = TextBoxUUIDextra.Text; //设置额外ID - v2rayNjsonObject["net"] = TextBoxTransmission.Text; //设置传输模式 - v2rayNjsonObject["type"] = TextBoxCamouflageType.Text; //设置伪装类型 - - if (TextBoxTransmission.Text.Contains("kcp") == true) - { - v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text;//设置mKCP Seed - } - else if (TextBoxTransmission.Text.Contains("quic") == true) - { - v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text;//设置quic密钥 - v2rayNjsonObject["host"] = TextBoxHostQuicEncryption.Text;//Quic加密方式 - } - else - { - v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text; //设置路径 - v2rayNjsonObject["host"] = TextBoxHostQuicEncryption.Text;//设置TLS的Host - } - - v2rayNjsonObject["tls"] = "tls"; //设置是否启用TLS - v2rayNjsonObject["ps"] = v2rayNjsonObject["add"]; //设置备注 - - #endregion - - //创建保存目录 - string plainSavePath = @"vmess_ws_tls_client_config"; - //v2ray_config\${域名IP} - //string configDomainSavePath = CreateConfigSaveDir(@"v2ray_config", TextBoxHostAddressSS.Text); - //v2ray_config\${域名IP}\vless_tcp_xtls_client_config - string configSavePath = CheckDir($"{configDomainSavePath}\\{plainSavePath}"); - - - //生成二维码与URL,跳过VlessTcpTlsWeb暂时未有URL标准 - TextBoxURLVmessWs = "vmess://" + ToBase64Encode(v2rayNjsonObject.ToString()); - //TextBoxURL.Text = TextBoxURLVmessWs; - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\url.txt")) - { - - sw.WriteLine(TextBoxURLVmessWs); - - } - - ImageShareQRcodeVmessWs = CreateQRCode(TextBoxURLVmessWs, $"{configSavePath}\\QR.bmp"); - //ImageShareQRcode.Source = ImageShareQRcodeVmessWs; - - if (File.Exists($"v2ray_config\\{plainSavePath}\\config.json")) - { - File.Move($"v2ray_config\\{plainSavePath}\\config.json", $"{configSavePath}\\config.json"); - Directory.Delete($"v2ray_config\\{plainSavePath}"); - } - - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\readme.txt")) - { - ReadmeTxtWriteGenerate(sw); - - } - } - - //生成Trojan over TCP with TLS的配置保存 - private void GenerateV2rayTrojanShareQRcodeAndBase64Url() - { - //创建保存目录 - string plainSavePath = @"trojan_tcp_tls_client_config"; - string configSavePath = CheckDir($"{configDomainSavePath}\\{plainSavePath}"); - - TextBoxURLTrojanTcp = $"trojan://{TextBoxUUID.Text}@{TextBoxHostAddress.Text}:{TextBoxPort.Text}#{TextBoxHostAddress.Text}"; - - //TextBoxURL.Text = TextBoxURLTrojanTcp; - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\url.txt")) - { - sw.WriteLine(TextBoxURLTrojanTcp); - - } - //ImageShareQRcode.Source = CreateQRCode(TextBoxURLTrojanTcp, $"{configSavePath}\\QR.bmp"); - ImageShareQRcodeTrojanTcp = CreateQRCode(TextBoxURLTrojanTcp, $"{configSavePath}\\QR.bmp"); - //ImageShareQRcode.Source = ImageShareQRcodeTrojanTcp; - //移动官方程序配置文件到相应目录 - if (File.Exists($"v2ray_config\\{plainSavePath}\\config.json")) - { - File.Move($"v2ray_config\\{plainSavePath}\\config.json", $"{configSavePath}\\config.json"); - Directory.Delete($"v2ray_config\\{plainSavePath}"); - } - - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\readme.txt")) - { - //ReadmeTxtWriteGenerate(sw); - sw.WriteLine("config.json"); - //****** "此文件为v2ray官方程序所使用的客户端配置文件,配置为全局模式,socks5地址:127.0.0.1:1080,http代理地址:127.0.0.1:1081" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine01").ToString()); - - //****** "v2ray官方网站:https://www.v2ray.com/" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine02").ToString()); - - //****** "v2ray官方程序下载地址:https://github.com/v2ray/v2ray-core/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine03").ToString()); - - //****** "下载相应版本,Windows选择v2ray-windows-64.zip或者v2ray-windows-32.zip,解压后提取v2ctl.exe和v2ray.exe。与config.json放在同一目录,运行v2ray.exe即可。" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine04").ToString()); - - sw.WriteLine("-----------------------------------------"); - sw.WriteLine("QR.bmp"); - - //****** "此文件为v2rayN(windows)、Qv2ray(windows)、v2rayNG(Android)、Shadowrocket(ios)扫码导入节点" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine05").ToString()); - - //****** "v2rayN下载网址:https://github.com/2dust/v2rayN/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine06").ToString()); - - //****** "Qv2ray下载网址:https://github.com/Qv2ray/Qv2ray/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine07").ToString()); - - //****** "v2rayNG(Android)下载网址:https://github.com/2dust/v2rayNG/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine08").ToString()); - - //****** "v2rayNG(Android)在Google Play下载网址:https://play.google.com/store/apps/details?id=com.v2ray.ang" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine09").ToString()); - - //****** "Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine10").ToString()); - - sw.WriteLine("-----------------------------------------"); - sw.WriteLine("url.txt"); - - //****** "此文件为v2rayN、Qv2ray、v2rayNG(Android)、Shadowrocket(ios)复制粘贴导入节点的vmess网址" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine11").ToString()); - - sw.WriteLine("-----------------------------------------\n"); - - string strApplicat = ""; - string strParam = ""; - int strLenth = 20; - //****** "服务器通用连接配置参数:" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine12").ToString()); - sw.WriteLine(""); - - strApplicat = "TextBlockServerAddress"; - strParam = TextBoxHostAddress.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - strApplicat = "TextBlockServerPort"; - strParam = TextBoxPort.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - strApplicat = "TextBlockUserUUID"; - strParam = TextBoxUUID.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - } - - } - - //写入VMESS的readme.txt文件 - private void ReadmeTxtWriteGenerate(StreamWriter sw) - { - sw.WriteLine("config.json"); - //****** "此文件为v2ray官方程序所使用的客户端配置文件,配置为全局模式,socks5地址:127.0.0.1:1080,http代理地址:127.0.0.1:1081" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine01").ToString()); - - //****** "v2ray官方网站:https://www.v2ray.com/" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine02").ToString()); - - //****** "v2ray官方程序下载地址:https://github.com/v2ray/v2ray-core/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine03").ToString()); - - //****** "下载相应版本,Windows选择v2ray-windows-64.zip或者v2ray-windows-32.zip,解压后提取v2ctl.exe和v2ray.exe。与config.json放在同一目录,运行v2ray.exe即可。" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine04").ToString()); - - sw.WriteLine("-----------------------------------------"); - sw.WriteLine("QR.bmp"); - - //****** "此文件为v2rayN(windows)、Qv2ray(windows)、v2rayNG(Android)、Shadowrocket(ios)扫码导入节点" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine05").ToString()); - - //****** "v2rayN下载网址:https://github.com/2dust/v2rayN/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine06").ToString()); - - //****** "Qv2ray下载网址:https://github.com/Qv2ray/Qv2ray/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine07").ToString()); - - //****** "v2rayNG(Android)下载网址:https://github.com/2dust/v2rayNG/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine08").ToString()); - - //****** "v2rayNG(Android)在Google Play下载网址:https://play.google.com/store/apps/details?id=com.v2ray.ang" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine09").ToString()); - - //****** "Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine10").ToString()); - - sw.WriteLine("-----------------------------------------"); - sw.WriteLine("url.txt"); - - //****** "此文件为v2rayN、Qv2ray、v2rayNG(Android)、Shadowrocket(ios)复制粘贴导入节点的vmess网址" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine11").ToString()); - - //写入通用配置参数 - TxtWriteGeneralParameters(sw); - } - //TXT文件中写入通用配置参数--- - private void TxtWriteGeneralParameters(StreamWriter sw,bool alterId = true) - { - sw.WriteLine("-----------------------------------------\n"); - - string strApplicat = ""; - string strParam = ""; - int strLenth = 20; - //****** "服务器通用连接配置参数:" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine12").ToString()); - sw.WriteLine(""); - - strApplicat = "TextBlockServerAddress"; - strParam = TextBoxHostAddress.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - strApplicat = "TextBlockServerPort"; - strParam = TextBoxPort.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - strApplicat = "TextBlockUserUUID"; - strParam = TextBoxUUID.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - if (alterId == true) - { - strApplicat = "TextBlockV2RayAlterId"; - strParam = TextBoxUUIDextra.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - } - - strApplicat = "TextBlockEncryption"; - strParam = TextBoxEncryption.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - strApplicat = "TextBlockTransferProtocol"; - strParam = TextBoxTransmission.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - strApplicat = "TextBlockCamouflageType"; - strParam = TextBoxCamouflageType.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - strApplicat = "TextBlockIsOrNotTLS"; - strParam = TextBoxTLS.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - if (MainWindow.ReceiveConfigurationParameters[0].Contains("Quic") == true) - { - strParam = TextBoxHostQuicEncryption.Text; - sw.WriteLine(AlignmentStrFunc(TextBlockQuicEncryption.Text, strLenth) + strParam); - - strParam = TextBoxQuicKeyMkcpSeedPath.Text; - sw.WriteLine(AlignmentStrFunc(TextBlockQuicKey.Text, strLenth) + strParam); - - } - else if (MainWindow.ReceiveConfigurationParameters[0].Contains("mKCP") == true) - { - strParam = TextBoxHostQuicEncryption.Text; - sw.WriteLine(AlignmentStrFunc("host:", strLenth) + strParam); - - strParam = TextBoxQuicKeyMkcpSeedPath.Text; - sw.WriteLine(AlignmentStrFunc(TextBlockMkcpSeed.Text, strLenth) + strParam); - - } - else - { - strParam = TextBoxHostQuicEncryption.Text; - sw.WriteLine(AlignmentStrFunc("host:", strLenth) + strParam); - - strParam = TextBoxQuicKeyMkcpSeedPath.Text; - sw.WriteLine(AlignmentStrFunc(TextBlockPath.Text, strLenth) + strParam); - } - } - #endregion - - #endregion - - #endregion - - #region Xray 相关 - - #region Xray参数设置函数 - - //设置VLESS over TCP with XTLS - private void XraySetVlessTcpXtls() - { - GridNotTrojanParametersXray.Visibility = Visibility.Visible; - TextBlockVmessOrVlessXray.Text = Application.Current.FindResource("TabItemHeaderV2RayVlessProtocol").ToString(); - TextBlockVmessOrVlessXray.Visibility = Visibility.Visible; - //隐藏下面的二维码显示 - HideGroupBoxClientQRandURL(); - - TextBoxEncryptionXray.Text = "none"; - TextBoxTransmissionXray.Text = "tcp"; - TextBoxCamouflageTypeXray.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryptionXray.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxTLSXray.Text = "xtls"; - HideAlterIdXray(); - ShowHostNameXray(); - ShowPathXray(); - TextBoxQuicKeyMkcpSeedPathXray.Text = ""; - - - } - - //设置VLESS over TCP with TLS - private void XraySetVlessTcpTls() - { - GridNotTrojanParametersXray.Visibility = Visibility.Visible; - TextBlockVmessOrVlessXray.Text = Application.Current.FindResource("TabItemHeaderV2RayVlessProtocol").ToString(); - TextBlockVmessOrVlessXray.Visibility = Visibility.Visible; - //隐藏下面的二维码显示 - HideGroupBoxClientQRandURL(); - - TextBoxEncryptionXray.Text = "none"; - TextBoxTransmissionXray.Text = "tcp"; - TextBoxCamouflageTypeXray.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryptionXray.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxTLSXray.Text = "tls"; - HideAlterIdXray(); - ShowHostNameXray(); - ShowPathXray(); - TextBoxQuicKeyMkcpSeedPathXray.Text = ""; - } - - //设置VLESS over WS with TLS - private void XraySetVlessWsTls() - { - GridNotTrojanParametersXray.Visibility = Visibility.Visible; - TextBlockVmessOrVlessXray.Text = Application.Current.FindResource("TabItemHeaderV2RayVlessProtocol").ToString(); - TextBlockVmessOrVlessXray.Visibility = Visibility.Visible; - //隐藏下面的二维码显示 - HideGroupBoxClientQRandURL(); - - TextBoxEncryptionXray.Text = "none"; - TextBoxTransmissionXray.Text = "ws"; - TextBoxCamouflageTypeXray.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryptionXray.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxTLSXray.Text = "tls"; - HideAlterIdXray(); - ShowHostNameXray(); - ShowPathXray(); - TextBoxQuicKeyMkcpSeedPathXray.Text = MainWindow.ReceiveConfigurationParameters[3]; - - } - - //设置VMess over TCP with TLS - private void XraySetVmessTcpTls() - { - GridNotTrojanParametersXray.Visibility = Visibility.Visible; - TextBoxEncryptionXray.Text = "none"; - TextBoxTransmissionXray.Text = "tcp"; - TextBoxCamouflageTypeXray.Text = "http"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryptionXray.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxTLSXray.Text = "tls"; - ShowAlterIdXray(); - ShowHostNameXray(); - ShowPathXray(); - TextBoxQuicKeyMkcpSeedPathXray.Text = MainWindow.ReceiveConfigurationParameters[9]; - TextBlockVmessOrVlessXray.Visibility = Visibility.Collapsed; - //显示下面的二维码显示。 - //HideGroupBoxClientQRandURL(); - ShowGroupBoxClientQRandURL(); - TextBoxURL.Text = TextBoxURLVmessTcp; - ImageShareQRcode.Source = ImageShareQRcodeVmessTcp; - } - - //设置VMess over WS with TLS - private void XraySetVmessWsTls() - { - GridNotTrojanParametersXray.Visibility = Visibility.Visible; - TextBoxEncryptionXray.Text = "none"; - TextBoxTransmissionXray.Text = "ws"; - TextBoxCamouflageTypeXray.Text = "none"; - //TLS的Host /Quic 加密方式 - TextBoxHostQuicEncryptionXray.Text = MainWindow.ReceiveConfigurationParameters[4]; - TextBoxTLSXray.Text = "tls"; - ShowAlterIdXray(); - ShowHostNameXray(); - ShowPathXray(); - TextBoxQuicKeyMkcpSeedPathXray.Text = MainWindow.ReceiveConfigurationParameters[6]; - TextBlockVmessOrVlessXray.Visibility = Visibility.Collapsed; - //显示下面的二维码与分享链接 - ShowGroupBoxClientQRandURL(); - TextBoxURL.Text = TextBoxURLVmessWs; - ImageShareQRcode.Source = ImageShareQRcodeVmessWs; - } - - //设置Trojan over TCP with TLS - private void XraySetTrojanTcpTls() - { - //隐藏所有不是Trojan的参数 - GridNotTrojanParametersXray.Visibility = Visibility.Collapsed; - //显示下面的二维码与分享链接 - ShowGroupBoxClientQRandURL(); - TextBoxURL.Text = TextBoxURLTrojanTcp; - ImageShareQRcode.Source = ImageShareQRcodeTrojanTcp; - } - #endregion - - #region 界面控制相关 - - //显示Quic 加密方式 - private void ShowQuicEncryptionXray() - { - TextBlockQuicEncryptionXray.Visibility = Visibility.Visible; - TextBlockHostXray.Visibility = Visibility.Collapsed; - } - - //显示Host隐藏Quic加密方式 - private void ShowHostNameXray() - { - TextBlockHostXray.Visibility = Visibility.Visible; - TextBlockQuicEncryptionXray.Visibility = Visibility.Collapsed; - } - - //显示路径Path,隐藏mKCP/Quic Key/复制按钮 - private void ShowPathXray() - { - TextBlockPathXray.Visibility = Visibility.Visible; - TextBlockMkcpSeedXray.Visibility = Visibility.Collapsed; - TextBlockQuicKeyXray.Visibility = Visibility.Collapsed; - } - - //显示mKCP Seed/复制按钮,隐藏Path/Quic Key - private void ShowMkcpSeedXray() - { - TextBlockPathXray.Visibility = Visibility.Collapsed; - TextBlockMkcpSeedXray.Visibility = Visibility.Visible; - TextBlockQuicKeyXray.Visibility = Visibility.Collapsed; - } - - //显示Quic Key/复制按钮 隐藏Path/mKcp Seed - private void ShowQuicKeyXray() - { - TextBlockPathXray.Visibility = Visibility.Collapsed; - TextBlockMkcpSeedXray.Visibility = Visibility.Collapsed; - TextBlockQuicKeyXray.Visibility = Visibility.Visible; - } - - //显示额外ID - private void ShowAlterIdXray() - { - TextBlockUUIDextraXray.Visibility = Visibility.Visible; - TextBoxUUIDextraXray.Visibility = Visibility.Visible; - TextBlockUUIDextraExplanationXray.Visibility = Visibility.Visible; - - } - - //隐藏额外ID - private void HideAlterIdXray() - { - TextBlockUUIDextraXray.Visibility = Visibility.Collapsed; - TextBoxUUIDextraXray.Visibility = Visibility.Collapsed; - TextBlockUUIDextraExplanationXray.Visibility = Visibility.Collapsed; - - } - - //显示加密方式 - private void ShowEncryptionXray() - { - TextBlockEncryptionXray.Visibility = Visibility.Visible; - TextBoxEncryptionXray.Visibility = Visibility.Visible; - } - //隐藏加密方式 - private void HideEncryptionXray() - { - TextBlockEncryptionXray.Visibility = Visibility.Collapsed; - TextBoxEncryptionXray.Visibility = Visibility.Collapsed; - } - - //显示传输协议 - private void ShowTransferProtocolXray() - { - TextBlockTransferProtocolXray.Visibility = Visibility.Visible; - TextBoxTransmissionXray.Visibility = Visibility.Visible; - } - //隐藏传输协议 - private void HideTransferProtocolXray() - { - TextBlockTransferProtocolXray.Visibility = Visibility.Collapsed; - TextBoxTransmissionXray.Visibility = Visibility.Collapsed; - } - //显示伪装类型 - private void ShowTextBlockCamouflageTypeXray() - { - TextBlockCamouflageTypeXray.Visibility = Visibility.Visible; - TextBoxCamouflageTypeXray.Visibility = Visibility.Visible; - } - //隐藏伪装类型 - private void HideTextBlockCamouflageTypeXray() - { - TextBlockCamouflageTypeXray.Visibility = Visibility.Collapsed; - TextBoxCamouflageTypeXray.Visibility = Visibility.Collapsed; - } - - - //以下几个为对RadioButton按钮的选中后,界面变化与参数显示 - private void RadioButtonVlessTcpXtlsXray_Checked(object sender, RoutedEventArgs e) - { - XraySetVlessTcpXtls(); - } - - private void RadioButtonVlessTcpTlsXray_Checked(object sender, RoutedEventArgs e) - { - XraySetVlessTcpTls(); - } - - private void RadioButtonVlessWsTlsXray_Checked(object sender, RoutedEventArgs e) - { - XraySetVlessWsTls(); - } - - private void RadioButtonVmessTcpTlsXray_Checked(object sender, RoutedEventArgs e) - { - XraySetVmessTcpTls(); - } - - private void RadioButtonVmessWsTlsXray_Checked(object sender, RoutedEventArgs e) - { - XraySetVmessWsTls(); - } - - private void RadioButtonTrojanTcpTlsXray_Checked(object sender, RoutedEventArgs e) - { - XraySetTrojanTcpTls(); - } - #endregion - - #region 复制参数到剪贴板中 - - - - //复制服务器地址到剪贴板 - private void TextBoxHostAddressXray_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxHostAddressXray.Text); - } - - - //复制服务器端口到剪贴板 - private void TextBoxPortXray_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxPortXray.Text); - } - - //复制UUID到剪贴板 - private void TextBoxUUIDXray_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxUUIDXray.Text); - } - - //复制额外ID到剪贴板 - private void TextBoxUUIDextraXray_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxUUIDextraXray.Text); - } - - //复制加密方式到剪贴板 - private void TextBoxEncryptionXray_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxEncryptionXray.Text); - } - - //复制传输协议到剪贴板 - private void TextBoxTransmissionXray_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxTransmissionXray.Text); - } - - //复制伪装方式到剪贴板 - private void TextBoxCamouflageTypeXray_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxCamouflageTypeXray.Text); - } - - //复制Host/Quic加密方法到剪贴板 - private void TextBoxHostQuicEncryptionXray_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxHostQuicEncryptionXray.Text); - } - - //复制Quic Key/mKCP Seed/路径Path 到剪贴板中 - private void TextBoxQuicKeyMkcpSeedPathXray_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxQuicKeyMkcpSeedPathXray.Text); - } - - //复制TLS 到剪贴板中 - private void TextBoxTLSXray_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxTLSXray.Text); - } - - #endregion - - #region Xray客户端生成 - //生成单方案v2rayN客户端导入文件 - private void GenerateXrayShareQRcodeAndBase64Url() - { - //生成v2rayN的json文件 - string v2rayNjsonFile = @" -{ - ""v"": """", - ""ps"": """", - ""add"": """", - ""port"": """", - ""id"": """", - ""aid"": """", - ""net"": """", - ""type"": """", - ""host"": """", - ""path"": """", - ""tls"": """" -}"; - //MessageBox.Show(v2rayNjsonFile); - JObject v2rayNjsonObject = JObject.Parse(v2rayNjsonFile); - v2rayNjsonObject["v"] = "2"; - v2rayNjsonObject["add"] = TextBoxHostAddressXray.Text; //设置域名 - v2rayNjsonObject["port"] = TextBoxPortXray.Text; //设置端口 - v2rayNjsonObject["id"] = TextBoxUUIDXray.Text; //设置uuid - v2rayNjsonObject["aid"] = TextBoxUUIDextraXray.Text; //设置额外ID - v2rayNjsonObject["net"] = TextBoxTransmissionXray.Text; //设置传输模式 - v2rayNjsonObject["type"] = TextBoxCamouflageTypeXray.Text; //设置伪装类型 - - if (TextBoxTransmissionXray.Text.Contains("kcp") == true) - { - v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPathXray.Text;//设置mKCP Seed - v2rayNjsonObject["host"] = "";//设置Host - } - else if (TextBoxTransmissionXray.Text.Contains("quic") == true) - { - v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPathXray.Text;//设置quic密钥 - v2rayNjsonObject["host"] = TextBoxHostQuicEncryptionXray.Text;//Quic加密方式 - } - else - { - v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPathXray.Text; //设置路径 - v2rayNjsonObject["host"] = TextBoxHostQuicEncryptionXray.Text;//设置TLS的Host - } - - v2rayNjsonObject["tls"] = TextBoxTLSXray.Text; //设置是否启用TLS - v2rayNjsonObject["ps"] = v2rayNjsonObject["add"]; //设置备注 - //MessageBox.Show(v2rayNjsonObject["v"].ToString()); - //MessageBox.Show("step1"); - string proxyfolder = CheckDir("xray_config"); - //MessageBox.Show("step2"); - configDomainSavePath = CreateConfigSaveDir(proxyfolder, TextBoxHostAddressXray.Text); - //MessageBox.Show("step3"); - string configSavePath = configDomainSavePath; - - //生成二维码与URL,跳过VlessTcpTlsWeb暂时未有URL标准 - string vmessUrl = "vmess://" + ToBase64Encode(v2rayNjsonObject.ToString()); - TextBoxURL.Text = vmessUrl; - if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "VlessXtlsTcp") == false - && String.Equals(MainWindow.ReceiveConfigurationParameters[0], "VlessTcpTlsWeb") == false - && String.Equals(MainWindow.ReceiveConfigurationParameters[0], "VlessWebSocketTlsWeb") == false - && String.Equals(MainWindow.ReceiveConfigurationParameters[0], "VlessHttp2Web") == false - && MainWindow.mKCPvlessIsSet == false) - { - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\url.txt")) - { - sw.WriteLine(vmessUrl); - } - ImageShareQRcode.Source = CreateQRCode(vmessUrl, $"{configSavePath}\\QR.bmp"); - } - - if (File.Exists(@"xray_config\config.json")) - { - File.Move(@"xray_config\config.json", $"{configSavePath}\\config.json"); - //File.Delete(@"config\config.json");//删除该文件 - } - - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\readme.txt")) - { - ReadmeTxtWriteGenerateXray(sw); - - } - } - - #region VLESS VMESS XTLS WS共存方案生成链接与说明文件 - - //生成VLESS Vmess Tcp Xtls Ws 配置保存(暂未有分享链接与二维码) - private void GenerateXrayVlessVmessTcpXtlsWsShareQRcodeAndBase64Url(string plainSavePath) - { - #region 暂时不用内容 - // //生成v2rayN的json文件 - // string v2rayNjsonFile = @" - //{ - // ""v"": """", - // ""ps"": """", - // ""add"": """", - // ""port"": """", - // ""id"": """", - // ""aid"": """", - // ""net"": """", - // ""type"": """", - // ""host"": """", - // ""path"": """", - // ""tls"": """" - //}"; - // //MessageBox.Show(v2rayNjsonFile); - // JObject v2rayNjsonObject = JObject.Parse(v2rayNjsonFile); - // v2rayNjsonObject["v"] = "2"; - // v2rayNjsonObject["add"] = TextBoxHostAddress.Text; //设置域名 - // v2rayNjsonObject["port"] = TextBoxPort.Text; //设置端口 - // v2rayNjsonObject["id"] = TextBoxUUID.Text; //设置uuid - // v2rayNjsonObject["aid"] = TextBoxUUIDextra.Text; //设置额外ID - // v2rayNjsonObject["net"] = TextBoxTransmission.Text; //设置传输模式 - // v2rayNjsonObject["type"] = TextBoxCamouflageType.Text; //设置伪装类型 - - // if (TextBoxTransmission.Text.Contains("kcp") == true) - // { - // v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text;//设置mKCP Seed - // } - // else if (TextBoxTransmission.Text.Contains("quic") == true) - // { - // v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text;//设置quic密钥 - // v2rayNjsonObject["host"] = TextBoxHostQuicEncryption.Text;//Quic加密方式 - // } - // else - // { - // v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text; //设置路径 - // v2rayNjsonObject["host"] = TextBoxHostQuicEncryption.Text;//设置TLS的Host - // } - - // v2rayNjsonObject["tls"] = TextBoxTLS.Text; //设置是否启用TLS - // v2rayNjsonObject["ps"] = v2rayNjsonObject["add"]; //设置备注 - // //MessageBox.Show(v2rayNjsonObject["v"].ToString()); - - //string saveFileFolderFirst = TextBoxHostAddress.Text; - //int num = 1; - //saveFileFolder = saveFileFolderFirst; - //CheckDir(@"v2ray_config"); - //while (Directory.Exists(@"v2ray_config\" + saveFileFolder)) - //{ - // saveFileFolder = saveFileFolderFirst + "_copy_" + num.ToString(); - // num++; - //} - //CheckDir(@"v2ray_config\" + saveFileFolder); - - #endregion - - //创建保存目录 - //string plainSavePath = @""; - - //v2ray_config\${域名IP}\vless_tcp_xtls_client_config - string configSavePath = CheckDir($"{configDomainSavePath}\\{plainSavePath}"); - - - //生成二维码与URL,跳过VlessTcpTlsWeb暂时未有URL标准 - //string vmessUrl = "vmess://" + ToBase64Encode(v2rayNjsonObject.ToString()); - //TextBoxURL.Text = vmessUrl; - //using (StreamWriter sw = new StreamWriter($"{configSavePath}\\url.txt")) - //{ - // if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "VlessTcpTlsWeb") == false) - // { - // sw.WriteLine(vmessUrl); - // } - //} - //if (String.Equals(MainWindow.ReceiveConfigurationParameters[0], "VlessTcpTlsWeb") == false) - //{ - // ImageShareQRcode.Source = CreateQRCode(vmessUrl, $"v2ray_config\\{saveFileFolder}\\QR.bmp"); - //} - - - if (File.Exists($"xray_config\\{plainSavePath}\\config.json")) - { - File.Move($"xray_config\\{plainSavePath}\\config.json", $"{configSavePath}\\config.json"); - Directory.Delete($"xray_config\\{plainSavePath}"); - } - - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\readme.txt")) - { - sw.WriteLine("config.json"); - //****** "此文件为v2ray官方程序所使用的客户端配置文件,配置为全局模式,socks5地址:127.0.0.1:1080,http代理地址:127.0.0.1:1081" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtXrayExplainLine01").ToString()); - - //****** "v2ray官方网站:https://www.v2ray.com/" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtXrayExplainLine02").ToString()); - - //****** "v2ray官方程序下载地址:https://github.com/v2ray/v2ray-core/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtXrayExplainLine03").ToString()); - - //****** "下载相应版本,Windows选择v2ray-windows-64.zip或者v2ray-windows-32.zip,解压后提取v2ctl.exe和v2ray.exe。与config.json放在同一目录,运行v2ray.exe即可。" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtXrayExplainLine04").ToString()); - - sw.WriteLine("-----------------------------------------"); - //sw.WriteLine("QR.bmp"); - - //****** "此文件为v2rayN、Qv2ray、v2rayNG(Android)、Shadowrocket(ios)扫码导入节点" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine05").ToString()); - - //****** "v2rayN下载网址:https://github.com/2dust/v2rayN/releases" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine06").ToString()); - - //****** "Qv2ray:https://github.com/Qv2ray/Qv2ray/releases" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine07").ToString()); - - //****** "v2rayNG(Android)下载网址:https://github.com/2dust/v2rayNG/releases" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine08").ToString()); - - //****** "v2rayNG(Android)在Google Play下载网址:https://play.google.com/store/apps/details?id=com.v2ray.ang" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine09").ToString()); - - //****** "Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine10").ToString()); - - //sw.WriteLine("-----------------------------------------"); - //sw.WriteLine("url.txt"); - - //****** "此文件为v2rayN、Qv2ray、v2rayNG(Android)、Shadowrocket(ios)复制粘贴导入节点的vmess网址" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine11").ToString()); - - //写入通用配置参数 - TxtWriteGeneralParametersXray(sw); - } - } - - - //生成VLESS over TCP with XTLS的配置保存(暂未有分享链接与二维码) - private void GenerateXrayVlessTcpXtlsShareQRcodeAndBase64Url() - { - #region 暂时不用内容 - // //生成v2rayN的json文件 - // string v2rayNjsonFile = @" - //{ - // ""v"": """", - // ""ps"": """", - // ""add"": """", - // ""port"": """", - // ""id"": """", - // ""aid"": """", - // ""net"": """", - // ""type"": """", - // ""host"": """", - // ""path"": """", - // ""tls"": """" - //}"; - // //MessageBox.Show(v2rayNjsonFile); - // JObject v2rayNjsonObject = JObject.Parse(v2rayNjsonFile); - // v2rayNjsonObject["v"] = "2"; - // v2rayNjsonObject["add"] = TextBoxHostAddress.Text; //设置域名 - // v2rayNjsonObject["port"] = TextBoxPort.Text; //设置端口 - // v2rayNjsonObject["id"] = TextBoxUUID.Text; //设置uuid - // v2rayNjsonObject["aid"] = TextBoxUUIDextra.Text; //设置额外ID - // v2rayNjsonObject["net"] = TextBoxTransmission.Text; //设置传输模式 - // v2rayNjsonObject["type"] = TextBoxCamouflageType.Text; //设置伪装类型 - - // if (TextBoxTransmission.Text.Contains("kcp") == true) - // { - // v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text;//设置mKCP Seed - // } - // else if (TextBoxTransmission.Text.Contains("quic") == true) - // { - // v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text;//设置quic密钥 - // v2rayNjsonObject["host"] = TextBoxHostQuicEncryption.Text;//Quic加密方式 - // } - // else - // { - // v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text; //设置路径 - // v2rayNjsonObject["host"] = TextBoxHostQuicEncryption.Text;//设置TLS的Host - // } - - // v2rayNjsonObject["tls"] = TextBoxTLS.Text; //设置是否启用TLS - // v2rayNjsonObject["ps"] = v2rayNjsonObject["add"]; //设置备注 - // //MessageBox.Show(v2rayNjsonObject["v"].ToString()); - - //string saveFileFolderFirst = TextBoxHostAddress.Text; - //int num = 1; - //saveFileFolder = saveFileFolderFirst; - //CheckDir(@"v2ray_config"); - //while (Directory.Exists(@"v2ray_config\" + saveFileFolder)) - //{ - // saveFileFolder = saveFileFolderFirst + "_copy_" + num.ToString(); - // num++; - //} - //CheckDir(@"v2ray_config\" + saveFileFolder); - - #endregion - - //创建保存目录 - string plainSavePath = @"vless_tcp_xtls_client_config"; - - //v2ray_config\${域名IP}\vless_tcp_xtls_client_config - string configSavePath = CheckDir($"{configDomainSavePath}\\{plainSavePath}"); - - - //生成二维码与URL,跳过VlessTcpTlsWeb暂时未有URL标准 - //TextBoxURLDefault = "vmess://" + ToBase64Encode(v2rayNjsonObject.ToString()); - //TextBoxURL.Text = TextBoxURLDefault; - //using (StreamWriter sw = new StreamWriter($"{configSavePath}\\url.txt")) - //{ - - // sw.WriteLine(TextBoxURLDefault); - - //} - - // ImageShareQRcodeDefault = CreateQRCode(TextBoxURLDefault, $"v2ray_config\\{saveFileFolder}\\QR.bmp"); - // ImageShareQRcode.Source = ImageShareQRcodeDefault; - - - if (File.Exists($"xray_config\\{plainSavePath}\\config.json")) - { - File.Move($"xray_config\\{plainSavePath}\\config.json", $"{configSavePath}\\config.json"); - Directory.Delete($"xray_config\\{plainSavePath}"); - } - - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\readme.txt")) - { - sw.WriteLine("config.json"); - //****** "此文件为Xray官方程序所使用的客户端配置文件,配置为全局模式,socks5地址:127.0.0.1:1080,http代理地址:127.0.0.1:1081" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtXrayExplainLine01").ToString()); - - //****** "Xray官方网站:https://github.com/XTLS/Xray-core" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtXrayExplainLine02").ToString()); - - //****** "Xray官方程序下载地址:https://github.com/XTLS/Xray-core/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtXrayExplainLine03").ToString()); - - //****** "下载相应版本,Windows选择xray-windows-64.zip或者xray-windows-32.zip,解压后提取xray.exe。与config.json放在同一目录,运行xray.exe即可。" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtXrayExplainLine04").ToString()); - - //sw.WriteLine("-----------------------------------------"); - //sw.WriteLine("QR.bmp"); - - //****** "此文件为v2rayN(windows)、Qv2ray(windows)、v2rayNG(Android)、Shadowrocket(ios)扫码导入节点" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine05").ToString()); - - //****** "v2rayN下载网址:https://github.com/2dust/v2rayN/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine06").ToString()); - - //****** "Qv2ray下载网址:https://github.com/Qv2ray/Qv2ray/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine07").ToString()); - - //****** "v2rayNG(Android)下载网址:https://github.com/2dust/v2rayNG/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine08").ToString()); - - //****** "v2rayNG(Android)在Google Play下载网址:https://play.google.com/store/apps/details?id=com.v2ray.ang" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine09").ToString()); - - //****** "Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine10").ToString()); - - //sw.WriteLine("-----------------------------------------"); - //sw.WriteLine("url.txt"); - - //****** "此文件为v2rayN、Qv2ray、v2rayNG(Android)、Shadowrocket(ios)复制粘贴导入节点的vmess网址" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine11").ToString()); - - //写入通用配置参数-- - TxtWriteGeneralParametersXray(sw, false); - - } - } - - //生成VLESS over TCP with TLS的配置保存(暂未有分享链接与二维码) - private void GenerateXrayVlessTcpTlsShareQRcodeAndBase64Url() - { - #region 暂时不用内容 - // //生成v2rayN的json文件 - // string v2rayNjsonFile = @" - //{ - // ""v"": """", - // ""ps"": """", - // ""add"": """", - // ""port"": """", - // ""id"": """", - // ""aid"": """", - // ""net"": """", - // ""type"": """", - // ""host"": """", - // ""path"": """", - // ""tls"": """" - //}"; - // //MessageBox.Show(v2rayNjsonFile); - // JObject v2rayNjsonObject = JObject.Parse(v2rayNjsonFile); - // v2rayNjsonObject["v"] = "2"; - // v2rayNjsonObject["add"] = TextBoxHostAddress.Text; //设置域名 - // v2rayNjsonObject["port"] = TextBoxPort.Text; //设置端口 - // v2rayNjsonObject["id"] = TextBoxUUID.Text; //设置uuid - // v2rayNjsonObject["aid"] = TextBoxUUIDextra.Text; //设置额外ID - // v2rayNjsonObject["net"] = TextBoxTransmission.Text; //设置传输模式 - // v2rayNjsonObject["type"] = TextBoxCamouflageType.Text; //设置伪装类型 - - // if (TextBoxTransmission.Text.Contains("kcp") == true) - // { - // v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text;//设置mKCP Seed - // } - // else if (TextBoxTransmission.Text.Contains("quic") == true) - // { - // v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text;//设置quic密钥 - // v2rayNjsonObject["host"] = TextBoxHostQuicEncryption.Text;//Quic加密方式 - // } - // else - // { - // v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text; //设置路径 - // v2rayNjsonObject["host"] = TextBoxHostQuicEncryption.Text;//设置TLS的Host - // } - - // v2rayNjsonObject["tls"] = TextBoxTLS.Text; //设置是否启用TLS - // v2rayNjsonObject["ps"] = v2rayNjsonObject["add"]; //设置备注 - // //MessageBox.Show(v2rayNjsonObject["v"].ToString()); - - //string saveFileFolderFirst = TextBoxHostAddress.Text; - //int num = 1; - //saveFileFolder = saveFileFolderFirst; - //CheckDir(@"v2ray_config"); - //while (Directory.Exists(@"v2ray_config\" + saveFileFolder)) - //{ - // saveFileFolder = saveFileFolderFirst + "_copy_" + num.ToString(); - // num++; - //} - //CheckDir(@"v2ray_config\" + saveFileFolder); - - #endregion - - //创建保存目录 - string plainSavePath = @"vless_tcp_tls_client_config"; - //v2ray_config\${域名IP} - //string configDomainSavePath = CreateConfigSaveDir(@"v2ray_config", TextBoxHostAddressSS.Text); - //v2ray_config\${域名IP}\vless_tcp_xtls_client_config - string configSavePath = CheckDir($"{configDomainSavePath}\\{plainSavePath}"); - - - //生成二维码与URL,跳过VlessTcpTlsWeb暂时未有URL标准 - //TextBoxURLVlessTcp = "vmess://" + ToBase64Encode(v2rayNjsonObject.ToString()); - //TextBoxURL.Text = TextBoxURLVlessTcp; - //using (StreamWriter sw = new StreamWriter($"{configSavePath}\\url.txt")) - //{ - - // sw.WriteLine(TextBoxURLVlessTcp); - - //} - - // ImageShareQRcodeVlessTcp = CreateQRCode(TextBoxURLVlessTcp, $"v2ray_config\\{saveFileFolder}\\QR.bmp"); - // ImageShareQRcode.Source = ImageShareQRcodeVlessTcp; - - - if (File.Exists($"xray_config\\{plainSavePath}\\config.json")) - { - File.Move($"xray_config\\{plainSavePath}\\config.json", $"{configSavePath}\\config.json"); - Directory.Delete($"xray_config\\{plainSavePath}"); - } - - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\readme.txt")) - { - sw.WriteLine("config.json"); - //****** "此文件为Xray官方程序所使用的客户端配置文件,配置为全局模式,socks5地址:127.0.0.1:1080,http代理地址:127.0.0.1:1081" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtXrayExplainLine01").ToString()); - - //****** "Xray官方网站:https://github.com/XTLS/Xray-core" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtXrayExplainLine02").ToString()); - - //****** "Xray官方程序下载地址:https://github.com/XTLS/Xray-core/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtXrayExplainLine03").ToString()); - - //****** "下载相应版本,Windows选择xray-windows-64.zip或者xray-windows-32.zip,解压后提取v2ray.exe。与config.json放在同一目录,运行xray.exe即可。" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtXrayExplainLine04").ToString()); - - //sw.WriteLine("-----------------------------------------"); - //sw.WriteLine("QR.bmp"); - - //****** "此文件为v2rayN(windows)、Qv2ray(windows)、v2rayNG(Android)、Shadowrocket(ios)扫码导入节点" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine05").ToString()); - - //****** "v2rayN下载网址:https://github.com/2dust/v2rayN/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine06").ToString()); - - //****** "Qv2ray下载网址:https://github.com/Qv2ray/Qv2ray/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine07").ToString()); - - //****** "v2rayNG(Android)下载网址:https://github.com/2dust/v2rayNG/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine08").ToString()); - - //****** "v2rayNG(Android)在Google Play下载网址:https://play.google.com/store/apps/details?id=com.v2ray.ang" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine09").ToString()); - - //****** "Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine10").ToString()); - - //sw.WriteLine("-----------------------------------------"); - //sw.WriteLine("url.txt"); - - //****** "此文件为v2rayN、Qv2ray、v2rayNG(Android)、Shadowrocket(ios)复制粘贴导入节点的vmess网址" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine11").ToString()); - - //写入通用配置参数-- - TxtWriteGeneralParametersXray(sw, false); - - } - } - - //生成VLESS over WS with TLS的配置保存(暂未有分享链接与二维码) - private void GenerateXrayVlessWsTlsShareQRcodeAndBase64Url() - { - #region 暂时不用内容 - // //生成v2rayN的json文件 - // string v2rayNjsonFile = @" - //{ - // ""v"": """", - // ""ps"": """", - // ""add"": """", - // ""port"": """", - // ""id"": """", - // ""aid"": """", - // ""net"": """", - // ""type"": """", - // ""host"": """", - // ""path"": """", - // ""tls"": """" - //}"; - // //MessageBox.Show(v2rayNjsonFile); - // JObject v2rayNjsonObject = JObject.Parse(v2rayNjsonFile); - // v2rayNjsonObject["v"] = "2"; - // v2rayNjsonObject["add"] = TextBoxHostAddress.Text; //设置域名 - // v2rayNjsonObject["port"] = TextBoxPort.Text; //设置端口 - // v2rayNjsonObject["id"] = TextBoxUUID.Text; //设置uuid - // v2rayNjsonObject["aid"] = TextBoxUUIDextra.Text; //设置额外ID - // v2rayNjsonObject["net"] = TextBoxTransmission.Text; //设置传输模式 - // v2rayNjsonObject["type"] = TextBoxCamouflageType.Text; //设置伪装类型 - - // if (TextBoxTransmission.Text.Contains("kcp") == true) - // { - // v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text;//设置mKCP Seed - // } - // else if (TextBoxTransmission.Text.Contains("quic") == true) - // { - // v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text;//设置quic密钥 - // v2rayNjsonObject["host"] = TextBoxHostQuicEncryption.Text;//Quic加密方式 - // } - // else - // { - // v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPath.Text; //设置路径 - // v2rayNjsonObject["host"] = TextBoxHostQuicEncryption.Text;//设置TLS的Host - // } - - // v2rayNjsonObject["tls"] = TextBoxTLS.Text; //设置是否启用TLS - // v2rayNjsonObject["ps"] = v2rayNjsonObject["add"]; //设置备注 - // //MessageBox.Show(v2rayNjsonObject["v"].ToString()); - - //string saveFileFolderFirst = TextBoxHostAddress.Text; - //int num = 1; - //saveFileFolder = saveFileFolderFirst; - //CheckDir(@"v2ray_config"); - //while (Directory.Exists(@"v2ray_config\" + saveFileFolder)) - //{ - // saveFileFolder = saveFileFolderFirst + "_copy_" + num.ToString(); - // num++; - //} - //CheckDir(@"v2ray_config\" + saveFileFolder); - - #endregion - - //创建保存目录 - string plainSavePath = @"vless_ws_tls_client_config"; - //v2ray_config\${域名IP} - //string configDomainSavePath = CreateConfigSaveDir(@"v2ray_config", TextBoxHostAddressSS.Text); - //v2ray_config\${域名IP}\vless_tcp_xtls_client_config - string configSavePath = CheckDir($"{configDomainSavePath}\\{plainSavePath}"); - - - //生成二维码与URL,跳过VlessTcpTlsWeb暂时未有URL标准 - //TextBoxURLVlessWs = "vmess://" + ToBase64Encode(v2rayNjsonObject.ToString()); - //TextBoxURL.Text = TextBoxURLVlessWs; - //using (StreamWriter sw = new StreamWriter($"{configSavePath}\\url.txt")) - //{ - - // sw.WriteLine(TextBoxURLVlessWs); - - //} - - // ImageShareQRcodeVlessWs = CreateQRCode(TextBoxURLVlessWs, $"v2ray_config\\{saveFileFolder}\\QR.bmp"); - //ImageShareQRcode.Source = ImageShareQRcodeVlessWs; - - - if (File.Exists($"xray_config\\{plainSavePath}\\config.json")) - { - File.Move($"xray_config\\{plainSavePath}\\config.json", $"{configSavePath}\\config.json"); - Directory.Delete($"xray_config\\{plainSavePath}"); - } - - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\readme.txt")) - { - sw.WriteLine("config.json"); - //****** "此文件为Xray官方程序所使用的客户端配置文件,配置为全局模式,socks5地址:127.0.0.1:1080,http代理地址:127.0.0.1:1081" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtXrayExplainLine01").ToString()); - - //****** "Xray官方网站:https://github.com/XTLS/Xray-core" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtXrayExplainLine02").ToString()); - - //****** "Xray官方程序下载地址:https://github.com/XTLS/Xray-core/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtXrayExplainLine03").ToString()); - - //****** "下载相应版本,Windows选择xray-windows-64.zip或者xray-windows-32.zip,解压后提取v2ray.exe。与config.json放在同一目录,运行xray.exe即可。" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtXrayExplainLine04").ToString()); - - //sw.WriteLine("-----------------------------------------"); - //sw.WriteLine("QR.bmp"); - - //****** "此文件为v2rayN(windows)、Qv2ray(windows)、v2rayNG(Android)、Shadowrocket(ios)扫码导入节点" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine05").ToString()); - - //****** "v2rayN下载网址:https://github.com/2dust/v2rayN/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine06").ToString()); - - //****** "Qv2ray下载网址:https://github.com/Qv2ray/Qv2ray/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine07").ToString()); - - //****** "v2rayNG(Android)下载网址:https://github.com/2dust/v2rayNG/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine08").ToString()); - - //****** "v2rayNG(Android)在Google Play下载网址:https://play.google.com/store/apps/details?id=com.v2ray.ang" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine09").ToString()); - - //****** "Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine10").ToString()); - - //sw.WriteLine("-----------------------------------------"); - //sw.WriteLine("url.txt"); - - //****** "此文件为v2rayN、Qv2ray、v2rayNG(Android)、Shadowrocket(ios)复制粘贴导入节点的vmess网址" ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine11").ToString()); - - //写入通用配置参数-- - TxtWriteGeneralParametersXray(sw, false); - - } - } - - //生成VMess over TCP with TLS的配置保存 - private void GenerateXrayVmessTcpTlsShareQRcodeAndBase64Url() - { - #region 暂时不用内容 - //生成v2rayN的json文件 - string v2rayNjsonFile = @" -{ - ""v"": """", - ""ps"": """", - ""add"": """", - ""port"": """", - ""id"": """", - ""aid"": """", - ""net"": """", - ""type"": """", - ""host"": """", - ""path"": """", - ""tls"": """" -}"; - //MessageBox.Show(v2rayNjsonFile); - JObject v2rayNjsonObject = JObject.Parse(v2rayNjsonFile); - v2rayNjsonObject["v"] = "2"; - v2rayNjsonObject["add"] = TextBoxHostAddressXray.Text; //设置域名 - v2rayNjsonObject["port"] = TextBoxPortXray.Text; //设置端口 - v2rayNjsonObject["id"] = TextBoxUUIDXray.Text; //设置uuid - v2rayNjsonObject["aid"] = TextBoxUUIDextraXray.Text; //设置额外ID - v2rayNjsonObject["net"] = TextBoxTransmissionXray.Text; //设置传输模式 - v2rayNjsonObject["type"] = TextBoxCamouflageTypeXray.Text; //设置伪装类型 - - if (TextBoxTransmissionXray.Text.Contains("kcp") == true) - { - v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPathXray.Text;//设置mKCP Seed - v2rayNjsonObject["host"] = "";//设置Host - } - else if (TextBoxTransmissionXray.Text.Contains("quic") == true) - { - v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPathXray.Text;//设置quic密钥 - v2rayNjsonObject["host"] = TextBoxHostQuicEncryptionXray.Text;//Quic加密方式 - } - else - { - v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPathXray.Text; //设置路径 - v2rayNjsonObject["host"] = TextBoxHostQuicEncryptionXray.Text;//设置TLS的Host - } - - v2rayNjsonObject["tls"] = TextBoxTLSXray.Text; //设置是否启用TLS - v2rayNjsonObject["ps"] = v2rayNjsonObject["add"]; //设置备注 - - - #endregion - - //创建保存目录 - string plainSavePath = @"vmess_tcp_tls_client_config"; - //v2ray_config\${域名IP} - //string configDomainSavePath = CreateConfigSaveDir(@"v2ray_config", TextBoxHostAddressSS.Text); - //v2ray_config\${域名IP}\vless_tcp_xtls_client_config - string configSavePath = CheckDir($"{configDomainSavePath}\\{plainSavePath}"); - - - //生成二维码与URL,跳过VlessTcpTlsWeb暂时未有URL标准 - TextBoxURLVmessTcp = "vmess://" + ToBase64Encode(v2rayNjsonObject.ToString()); - //TextBoxURL.Text = TextBoxURLVmessTcp; - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\url.txt")) - { - sw.WriteLine(TextBoxURLVmessTcp); - } - - ImageShareQRcodeVmessTcp = CreateQRCode(TextBoxURLVmessTcp, $"{configSavePath}\\QR.bmp"); - //ImageShareQRcode.Source = ImageShareQRcodeVmessTcp; - - - if (File.Exists($"xray_config\\{plainSavePath}\\config.json")) - { - File.Move($"xray_config\\{plainSavePath}\\config.json", $"{configSavePath}\\config.json"); - Directory.Delete($"xray_config\\{plainSavePath}"); - } - - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\readme.txt")) - { - ReadmeTxtWriteGenerateXray(sw); - - } - } - - //生成VMess over WS with TLS的配置保存 - private void GenerateXrayVmessWsTlsShareQRcodeAndBase64Url() - { - #region 暂时不用内容 - //生成v2rayN的json文件 - string v2rayNjsonFile = @" -{ - ""v"": """", - ""ps"": """", - ""add"": """", - ""port"": """", - ""id"": """", - ""aid"": """", - ""net"": """", - ""type"": """", - ""host"": """", - ""path"": """", - ""tls"": """" -}"; - //MessageBox.Show(v2rayNjsonFile); - JObject v2rayNjsonObject = JObject.Parse(v2rayNjsonFile); - v2rayNjsonObject["v"] = "2"; - v2rayNjsonObject["add"] = TextBoxHostAddressXray.Text; //设置域名 - v2rayNjsonObject["port"] = TextBoxPortXray.Text; //设置端口 - v2rayNjsonObject["id"] = TextBoxUUIDXray.Text; //设置uuid - v2rayNjsonObject["aid"] = TextBoxUUIDextraXray.Text; //设置额外ID - v2rayNjsonObject["net"] = TextBoxTransmissionXray.Text; //设置传输模式 - v2rayNjsonObject["type"] = TextBoxCamouflageTypeXray.Text; //设置伪装类型 - - if (TextBoxTransmissionXray.Text.Contains("kcp") == true) - { - v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPathXray.Text;//设置mKCP Seed - } - else if (TextBoxTransmissionXray.Text.Contains("quic") == true) - { - v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPathXray.Text;//设置quic密钥 - v2rayNjsonObject["host"] = TextBoxHostQuicEncryptionXray.Text;//Quic加密方式 - } - else - { - v2rayNjsonObject["path"] = TextBoxQuicKeyMkcpSeedPathXray.Text; //设置路径 - v2rayNjsonObject["host"] = TextBoxHostQuicEncryptionXray.Text;//设置TLS的Host - } - - v2rayNjsonObject["tls"] = "tls"; //设置是否启用TLS - v2rayNjsonObject["ps"] = v2rayNjsonObject["add"]; //设置备注 - - #endregion - - //创建保存目录 - string plainSavePath = @"vmess_ws_tls_client_config"; - //v2ray_config\${域名IP} - //string configDomainSavePath = CreateConfigSaveDir(@"v2ray_config", TextBoxHostAddressSS.Text); - //v2ray_config\${域名IP}\vless_tcp_xtls_client_config - string configSavePath = CheckDir($"{configDomainSavePath}\\{plainSavePath}"); - - - //生成二维码与URL - TextBoxURLVmessWs = "vmess://" + ToBase64Encode(v2rayNjsonObject.ToString()); - //TextBoxURL.Text = TextBoxURLVmessWs; - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\url.txt")) - { - sw.WriteLine(TextBoxURLVmessWs); - } - - ImageShareQRcodeVmessWs = CreateQRCode(TextBoxURLVmessWs, $"{configSavePath}\\QR.bmp"); - //ImageShareQRcode.Source = ImageShareQRcodeVmessWs; - - if (File.Exists($"xray_config\\{plainSavePath}\\config.json")) - { - File.Move($"xray_config\\{plainSavePath}\\config.json", $"{configSavePath}\\config.json"); - Directory.Delete($"xray_config\\{plainSavePath}"); - } - - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\readme.txt")) - { - ReadmeTxtWriteGenerateXray(sw); - - } - } - - //生成Trojan over TCP with TLS的配置保存 - private void GenerateXrayTrojanShareQRcodeAndBase64Url() - { - //创建保存目录 - string plainSavePath = @"trojan_tcp_tls_client_config"; - string configSavePath = CheckDir($"{configDomainSavePath}\\{plainSavePath}"); - - TextBoxURLTrojanTcp = $"trojan://{TextBoxUUIDXray.Text}@{TextBoxHostAddressXray.Text}:{TextBoxPortXray.Text}#{TextBoxHostAddressXray.Text}"; - - //TextBoxURL.Text = TextBoxURLTrojanTcp; - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\url.txt")) - { - sw.WriteLine(TextBoxURLTrojanTcp); - - } - //ImageShareQRcode.Source = CreateQRCode(TextBoxURLTrojanTcp, $"{configSavePath}\\QR.bmp"); - ImageShareQRcodeTrojanTcp = CreateQRCode(TextBoxURLTrojanTcp, $"{configSavePath}\\QR.bmp"); - //ImageShareQRcode.Source = ImageShareQRcodeTrojanTcp; - //移动官方程序配置文件到相应目录 - if (File.Exists($"xray_config\\{plainSavePath}\\config.json")) - { - File.Move($"xray_config\\{plainSavePath}\\config.json", $"{configSavePath}\\config.json"); - Directory.Delete($"xray_config\\{plainSavePath}"); - } - - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\readme.txt")) - { - //ReadmeTxtWriteGenerate(sw); - sw.WriteLine("config.json"); - //****** "此文件为Xray官方程序所使用的客户端配置文件,配置为全局模式,socks5地址:127.0.0.1:1080,http代理地址:127.0.0.1:1081" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtXrayExplainLine01").ToString()); - - //****** "Xray官方网站:https://github.com/XTLS/Xray-core" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtXrayExplainLine02").ToString()); - - //****** "Xray官方程序下载地址:https://github.com/XTLS/Xray-core/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtXrayExplainLine03").ToString()); - - //****** "下载相应版本,Windows选择Xray-windows-64.zip或者Xray-windows-32.zip,解压后提取v2ctl.exe和v2ray.exe。与config.json放在同一目录,运行v2ray.exe即可。" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtXrayExplainLine04").ToString()); - - sw.WriteLine("-----------------------------------------"); - sw.WriteLine("QR.bmp"); - - //****** "此文件为v2rayN(windows)、Qv2ray(windows)、v2rayNG(Android)、Shadowrocket(ios)扫码导入节点" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine05").ToString()); - - //****** "v2rayN下载网址:https://github.com/2dust/v2rayN/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine06").ToString()); - - //****** "Qv2ray下载网址:https://github.com/Qv2ray/Qv2ray/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine07").ToString()); - - //****** "v2rayNG(Android)下载网址:https://github.com/2dust/v2rayNG/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine08").ToString()); - - //****** "v2rayNG(Android)在Google Play下载网址:https://play.google.com/store/apps/details?id=com.v2ray.ang" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine09").ToString()); - - //****** "Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine10").ToString()); - - sw.WriteLine("-----------------------------------------"); - sw.WriteLine("url.txt"); - - //****** "此文件为v2rayN、Qv2ray、v2rayNG(Android)、Shadowrocket(ios)复制粘贴导入节点的vmess网址" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine11").ToString()); - - sw.WriteLine("-----------------------------------------\n"); - - string strApplicat = ""; - string strParam = ""; - int strLenth = 20; - //****** "服务器通用连接配置参数:" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine12").ToString()); - sw.WriteLine(""); - - strApplicat = "TextBlockServerAddress"; - strParam = TextBoxHostAddressXray.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - strApplicat = "TextBlockServerPort"; - strParam = TextBoxPortXray.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - strApplicat = "TextBlockUserUUID"; - strParam = TextBoxUUIDXray.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - } - - } - - //写入VMESS的readme.txt文件 - private void ReadmeTxtWriteGenerateXray(StreamWriter sw) - { - sw.WriteLine("config.json"); - //****** "此文件为Xray官方程序所使用的客户端配置文件,配置为全局模式,socks5地址:127.0.0.1:1080,http代理地址:127.0.0.1:1081" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtXrayExplainLine01").ToString()); - - //****** "Xray官方网站:https://github.com/XTLS/Xray-core" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtXrayExplainLine02").ToString()); - - //****** "Xray官方程序下载地址:https://github.com/XTLS/Xray-core/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtXrayExplainLine03").ToString()); - - //****** "下载相应版本,Windows选择xray-windows-64.zip或者xray-windows-32.zip,解压后提取xray.exe。与config.json放在同一目录,运行xray.exe即可。" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtXrayExplainLine04").ToString()); - - sw.WriteLine("-----------------------------------------"); - sw.WriteLine("QR.bmp"); - - //****** "此文件为v2rayN(windows)、Qv2ray(windows)、v2rayNG(Android)、Shadowrocket(ios)扫码导入节点" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine05").ToString()); - - //****** "v2rayN下载网址:https://github.com/2dust/v2rayN/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine06").ToString()); - - //****** "Qv2ray下载网址:https://github.com/Qv2ray/Qv2ray/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine07").ToString()); - - //****** "v2rayNG(Android)下载网址:https://github.com/2dust/v2rayNG/releases" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine08").ToString()); - - //****** "v2rayNG(Android)在Google Play下载网址:https://play.google.com/store/apps/details?id=com.v2ray.ang" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine09").ToString()); - - //****** "Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine10").ToString()); - - sw.WriteLine("-----------------------------------------"); - sw.WriteLine("url.txt"); - - //****** "此文件为v2rayN、Qv2ray、v2rayNG(Android)、Shadowrocket(ios)复制粘贴导入节点的vmess网址" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine11").ToString()); - - //写入通用配置参数 - TxtWriteGeneralParametersXray(sw); - } - //TXT文件中写入通用配置参数--- - private void TxtWriteGeneralParametersXray(StreamWriter sw, bool alterId = true) - { - sw.WriteLine("-----------------------------------------\n"); - - string strApplicat = ""; - string strParam = ""; - int strLenth = 20; - //****** "服务器通用连接配置参数:" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtV2RayExplainLine12").ToString()); - sw.WriteLine(""); - - strApplicat = "TextBlockServerAddress"; - strParam = TextBoxHostAddressXray.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - strApplicat = "TextBlockServerPort"; - strParam = TextBoxPortXray.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - strApplicat = "TextBlockUserUUID"; - strParam = TextBoxUUIDXray.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - if (alterId == true) - { - strApplicat = "TextBlockV2RayAlterId"; - strParam = TextBoxUUIDextraXray.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - } - - strApplicat = "TextBlockEncryption"; - strParam = TextBoxEncryptionXray.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - strApplicat = "TextBlockTransferProtocol"; - strParam = TextBoxTransmissionXray.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - strApplicat = "TextBlockCamouflageType"; - strParam = TextBoxCamouflageTypeXray.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - strApplicat = "TextBlockIsOrNotTLS"; - strParam = TextBoxTLSXray.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - if (MainWindow.ReceiveConfigurationParameters[0].Contains("Quic") == true) - { - strParam = TextBoxHostQuicEncryptionXray.Text; - sw.WriteLine(AlignmentStrFunc(TextBlockQuicEncryptionXray.Text, strLenth) + strParam); - - strParam = TextBoxQuicKeyMkcpSeedPathXray.Text; - sw.WriteLine(AlignmentStrFunc(TextBlockQuicKeyXray.Text, strLenth) + strParam); - - } - else if (MainWindow.ReceiveConfigurationParameters[0].Contains("mKCP") == true) - { - strParam = TextBoxHostQuicEncryptionXray.Text; - sw.WriteLine(AlignmentStrFunc("host:", strLenth) + strParam); - - strParam = TextBoxQuicKeyMkcpSeedPathXray.Text; - sw.WriteLine(AlignmentStrFunc(TextBlockMkcpSeedXray.Text, strLenth) + strParam); - - } - else - { - strParam = TextBoxHostQuicEncryptionXray.Text; - sw.WriteLine(AlignmentStrFunc("host:", strLenth) + strParam); - - strParam = TextBoxQuicKeyMkcpSeedPathXray.Text; - sw.WriteLine(AlignmentStrFunc(TextBlockPathXray.Text, strLenth) + strParam); - } - } - #endregion - - #endregion - - #endregion - - #region TrojanGo 相关 - //生成TrojanGo客户端资料 - private void GenerateTrojanGoShareQRcodeAndBase64Url() - { - string proxyfolder = CheckDir("trojan-go_config"); - configDomainSavePath = CreateConfigSaveDir(proxyfolder, TextBoxTrojanGoServerHost.Text); - string configSavePath = configDomainSavePath; - - string trojanGoUrl = GetTrojanGoUrl(); - - TextBoxURL.Text = trojanGoUrl; - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\url.txt")) - { - sw.WriteLine(trojanGoUrl); - - } - ImageShareQRcode.Source = CreateQRCode(trojanGoUrl, $"{configSavePath}\\QR.bmp"); - - //移动Trojan官方程序配置文件到相应目录 - if (File.Exists(@"trojan-go_config\config.json")) - { - File.Move(@"trojan-go_config\config.json", $"{configSavePath}\\config.json"); - //File.Delete(@"config\config.json");//删除该文件 - } - - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\readme.txt")) - { - sw.WriteLine("config.json"); - - //****** "此文件为Trojan-go官方程序所使用的客户端配置文件,配置为全局模式,http与socks5地址:127.0.0.1:1080" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtTrojan-goExplainLine01").ToString()); - - //****** "Trojan-go官方网站:https://github.com/p4gefau1t/trojan-go" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtTrojan-goExplainLine02").ToString()); - - //sw.WriteLine("Trojan-go官方程序下载地址:https://github.com/p4gefau1t/trojan-go/releases"); - sw.WriteLine(Application.Current.FindResource("readmeTxtTrojan-goExplainLine03").ToString()); - - //sw.WriteLine("下载相应版本,Windows选择Trojan-go-x.xx-win.zip,解压后提取trojan-go.exe。与config.json放在同一目录,运行trojan-go.exe即可。"); - sw.WriteLine(Application.Current.FindResource("readmeTxtTrojan-goExplainLine04").ToString()); - - sw.WriteLine("-----------------------------------------\n"); - sw.WriteLine("QR.bmp"); - - //sw.WriteLine("此文件为Qv2ray (windows)、igniter(Android)扫码导入节点"); - sw.WriteLine(Application.Current.FindResource("readmeTxtTrojan-goExplainLine05").ToString()); - - //sw.WriteLine("Qv2ray (windows)下载网址:https://github.com/Qv2ray/Qv2ray/releases"); - sw.WriteLine(Application.Current.FindResource("readmeTxtTrojan-goExplainLine06").ToString()); - - //sw.WriteLine("igniter(Android)下载网址:https://github.com/trojan-gfw/igniter/releases"); - sw.WriteLine(Application.Current.FindResource("readmeTxtTrojan-goExplainLine07").ToString()); - - //sw.WriteLine("Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。"); - // sw.WriteLine(Application.Current.FindResource("readmeTxtTrojan-goExplainLine08").ToString()); - sw.WriteLine("-----------------------------------------\n"); - sw.WriteLine("url.txt"); - - //sw.WriteLine("此文件为Qv2ray (windows)、igniter(Android)复制粘贴导入节点的网址"); - sw.WriteLine(Application.Current.FindResource("readmeTxtTrojan-goExplainLine09").ToString()); - sw.WriteLine("-----------------------------------------\n"); - - string strApplicat = ""; - string strParam = ""; - int strLenth = 20; - - //sw.WriteLine("服务器通用连接配置参数"); - sw.WriteLine(Application.Current.FindResource("readmeTxtTrojan-goExplainLine10").ToString()); - sw.WriteLine(""); - - //****** 服务器地址(address): ****** - //sw.WriteLine(Application.Current.FindResource("TextBlockServerAddress").ToString() + $"{TextBoxTrojanGoServerHost.Text}"); - strApplicat = "TextBlockServerAddress"; - strParam = TextBoxTrojanGoServerHost.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - //****** 端口(port): ****** - //sw.WriteLine(Application.Current.FindResource("TextBlockServerPort").ToString() + $"{TextBoxTrojanGoServerPort.Text}"); - strApplicat = "TextBlockServerPort"; - strParam = TextBoxTrojanGoServerPort.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - //****** 密码: ****** - //sw.WriteLine(Application.Current.FindResource("TextBlockTrojanGoPassword").ToString() + $"{TextBoxTrojanGoServerPassword.Text}"); - strApplicat = "TextBlockTrojanGoPassword"; - strParam = TextBoxTrojanGoServerPassword.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - //****** Type: ****** - //sw.WriteLine(Application.Current.FindResource("TextBlockTrojanGoPassword").ToString() + $"{TextBoxTrojanGoServerPassword.Text}"); - //strApplicat = "TextBlockTrojanGoPassword"; - strParam = TextBoxTrojanGoType.Text; - sw.WriteLine(AlignmentStrFunc("Type:", strLenth) + strParam); - //sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - //****** WebSocket路径: ****** - //sw.WriteLine(Application.Current.FindResource("TextBlockTrojanGoWebSocketPath").ToString() + $"{TextBoxTrojanGoWSPath.Text}"); - strApplicat = "TextBlockTrojanGoWebSocketPath"; - strParam = TextBoxTrojanGoWSPath.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - //****** Mux多路复用 ****** - //sw.WriteLine(Application.Current.FindResource("TextBlockTrojanGoWebSocketPath").ToString() + $"{TextBoxTrojanGoWSPath.Text}"); - strApplicat = "CheckBoxMuxSelect"; - strParam = ":"; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - //****** concurrency: ****** - //sw.WriteLine(Application.Current.FindResource("TextBlockTrojanGoWebSocketPath").ToString() + $"{TextBoxTrojanGoWSPath.Text}"); - strApplicat = "concurrency:"; - strParam = TextBoxConcurrency.Text; - sw.WriteLine(AlignmentStrFunc(strApplicat, strLenth) + strParam); - - //****** idle_timeout: ****** - //sw.WriteLine(Application.Current.FindResource("TextBlockTrojanGoWebSocketPath").ToString() + $"{TextBoxTrojanGoWSPath.Text}"); - strApplicat = "idle_timeout:"; - strParam = TextBoxIdle_timeout.Text; - sw.WriteLine(AlignmentStrFunc(strApplicat, strLenth) + strParam); - - } - - } - - #region TrojanGo内容双击复制到剪贴板 - private void TextBoxTrojanGoServerHost_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxTrojanGoServerHost.Text); - } - - private void TextBoxTrojanGoServerPort_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxTrojanGoServerPort.Text); - } - - private void TextBoxTrojanGoServerPassword_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxTrojanGoServerPassword.Text); - } - private void TextBoxTrojanGoSNI_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxTrojanGoSNI.Text); - } - private void TextBoxTrojanGoType_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxTrojanGoType.Text); - } - private void TextBoxTrojanGoHost_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxTrojanGoHost.Text); - } - private void TextBoxTrojanGoWSPath_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxTrojanGoWSPath.Text); - } - private void TextBoxConcurrency_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxConcurrency.Text); - } - - private void TextBoxIdle_timeout_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxIdle_timeout.Text); - } - #endregion - - //生成TrojanGo的分享链接 - private string GetTrojanGoUrl() - { - string trojanGoPassword = EncodeURIComponent(TextBoxTrojanGoServerPassword.Text); - string trojanGoHost = TextBoxTrojanGoServerHost.Text; - string trojanGoPort = TextBoxTrojanGoServerPort.Text; - - string trojanGoSni = EncodeURIComponent(TextBoxTrojanGoSNI.Text); - string trojanGoType= EncodeURIComponent(TextBoxTrojanGoType.Text); - string trojanGohostName = EncodeURIComponent(TextBoxTrojanGoHost.Text); - - string trojanGoPath = EncodeURIComponent(TextBoxTrojanGoWSPath.Text); - string trojanGoEncryption = EncodeURIComponent(""); - string trojanGoPlugin = EncodeURIComponent(""); - - string trojanGoRemarks = EncodeURIComponent(trojanGoHost); - - //分享链接规范:https://github.com/p4gefau1t/trojan-go/issues/132 - //trojan-go://$(trojan-password)@trojan-host:port/?sni=$(update.microsoft.com)&type=$(original|ws|h2|h2+ws)&host=$(update-01.microsoft.com)&path=$(/update/whatever)&encryption=$(ss;aes-256-gcm:ss-password)&plugin=$(...)#$(descriptive-text) - //string trojanGoUrl = $"trojan-go://{trojanGoPassword}@{trojanGoHost}:{trojanGoPort}/?sni={trojanGoSni}&type={trojanGoType}&host={trojanGohostName}&path={trojanGoPath}&encryption={trojanGoEncryption}&plugin={trojanGoPlugin}#{trojanGoRemarks}"; - - //&path={trojanGoPath} - //&encryption={trojanGoEncryption} - //&plugin={trojanGoPlugin} - //#{trojanGoRemarks} - string trojanGoUrl = $"trojan-go://{trojanGoPassword}@{trojanGoHost}:{trojanGoPort}/?sni={trojanGoSni}&type={trojanGoType}"; - - if (String.IsNullOrEmpty(trojanGohostName) == false) - { - trojanGoUrl += $"&host={trojanGohostName}"; - } - if (String.IsNullOrEmpty(trojanGoPath) == false) - { - trojanGoUrl += $"&path={trojanGoPath}"; - } - if (String.IsNullOrEmpty(trojanGoEncryption) == false) - { - trojanGoUrl += $"&encryption={trojanGoEncryption}"; - } - if (String.IsNullOrEmpty(trojanGoPlugin) == false) - { - trojanGoUrl += $"&plugin={trojanGoPlugin}"; - } - - trojanGoUrl += $"#{trojanGoRemarks}"; - return trojanGoUrl; - } - private string EncodeURIComponent(string initialUri) - { - return Uri.EscapeDataString(initialUri); - } - - //生成Trojan客户端资料 - private void GenerateTrojanShareQRcodeAndBase64Url() - { - string proxyfolder = CheckDir("trojan_config"); - configDomainSavePath = CreateConfigSaveDir(proxyfolder, TextBoxTrojanServerHost.Text); - string configSavePath = configDomainSavePath; - - //string saveFileFolderFirst = TextBoxTrojanServerHost.Text; - //int num = 1; - //saveFileFolder = saveFileFolderFirst; - //CheckDir("trojan_config"); - //while (Directory.Exists(@"trojan_config\" + saveFileFolder)) - //{ - // saveFileFolder = saveFileFolderFirst + "_copy_" + num.ToString(); - // num++; - //} - //CheckDir(@"trojan_config\" + saveFileFolder); - string trojanUrl = $"trojan://{TextBoxTrojanServerPassword.Text}@{TextBoxTrojanServerHost.Text}:{TextBoxTrojanServerPort.Text}#{TextBoxTrojanServerHost.Text}"; - //MessageBox.Show(v2rayNjsonObject.ToString()); - //string trojanUrl = "trojan://" + ToBase64Encode(v2rayNjsonObject.ToString()); - TextBoxURL.Text = trojanUrl; - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\url.txt")) - { - sw.WriteLine(trojanUrl); - - } - ImageShareQRcode.Source = CreateQRCode(trojanUrl, $"{configSavePath}\\QR.bmp"); - - //移动Trojan官方程序配置文件到相应目录 - if (File.Exists(@"trojan_config\config.json")) - { - File.Move(@"trojan_config\config.json", $"{configSavePath}\\config.json"); - //File.Delete(@"config\config.json");//删除该文件 - } - - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\readme.txt")) - { - sw.WriteLine("config.json"); - - //****** "此文件为Trojan官方程序所使用的客户端配置文件,配置为全局模式,http与socks5地址:127.0.0.1:1080" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtTrojanExplainLine01").ToString()); - - //****** "Trojan官方网站:https://trojan-gfw.github.io/trojan/" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtTrojanExplainLine02").ToString()); - - //sw.WriteLine("Trojan官方程序下载地址:https://github.com/trojan-gfw/trojan/releases"); - sw.WriteLine(Application.Current.FindResource("readmeTxtTrojanExplainLine03").ToString()); - - //sw.WriteLine("下载相应版本,Windows选择Trojan-x.xx-win.zip,解压后提取trojan.exe。与config.json放在同一目录,运行trojan.exe即可。"); - sw.WriteLine(Application.Current.FindResource("readmeTxtTrojanExplainLine04").ToString()); - - sw.WriteLine("-----------------------------------------\n"); - sw.WriteLine("QR.bmp"); - - //sw.WriteLine("此文件为Qv2ray (windows)、igniter(Android)、Shadowrocket(ios)扫码导入节点"); - sw.WriteLine(Application.Current.FindResource("readmeTxtTrojanExplainLine05").ToString()); - - //sw.WriteLine("Qv2ray (windows)下载网址:https://github.com/Qv2ray/Qv2ray/releases"); - sw.WriteLine(Application.Current.FindResource("readmeTxtTrojanExplainLine06").ToString()); - - //sw.WriteLine("igniter(Android)下载网址:https://github.com/trojan-gfw/igniter/releases"); - sw.WriteLine(Application.Current.FindResource("readmeTxtTrojanExplainLine07").ToString()); - - //sw.WriteLine("Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。"); - sw.WriteLine(Application.Current.FindResource("readmeTxtTrojanExplainLine08").ToString()); - sw.WriteLine("-----------------------------------------\n"); - sw.WriteLine("url.txt"); - - //sw.WriteLine("此文件为Qv2ray (windows)、igniter(Android)、Shadowrocket(ios)复制粘贴导入节点的网址"); - sw.WriteLine(Application.Current.FindResource("readmeTxtTrojanExplainLine09").ToString()); - sw.WriteLine("-----------------------------------------\n"); - - string strApplicat = ""; - string strParam = ""; - int strLenth = 20; - - //sw.WriteLine("服务器通用连接配置参数"); - sw.WriteLine(Application.Current.FindResource("readmeTxtTrojanExplainLine10").ToString()); - sw.WriteLine(""); - - //****** 服务器地址(address): ****** - //sw.WriteLine(Application.Current.FindResource("TextBlockServerAddress").ToString() + $"{TextBoxTrojanGoServerHost.Text}"); - strApplicat = "TextBlockServerAddress"; - strParam = TextBoxTrojanServerHost.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - //****** 端口(port): ****** - //sw.WriteLine(Application.Current.FindResource("TextBlockServerPort").ToString() + $"{TextBoxTrojanGoServerPort.Text}"); - strApplicat = "TextBlockServerPort"; - strParam = TextBoxTrojanServerPort.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - //****** 密码: ****** - //sw.WriteLine(Application.Current.FindResource("TextBlockTrojanGoPassword").ToString() + $"{TextBoxTrojanGoServerPassword.Text}"); - //sw.WriteLine(Application.Current.FindResource("TextBlockTrojanGoWebSocketPath").ToString() + $"{TextBoxTrojanGoWSPath.Text}"); - strApplicat = "TextBlockTrojanGoPassword"; - strParam = TextBoxTrojanServerPassword.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - - } - - } - - #region Trojan内容双击复制到剪贴板 - - private void TextBoxTrojanServerHost_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxTrojanServerHost.Text); - } - - private void TextBoxTrojanServerPort_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxTrojanServerPort.Text); - } - - private void TextBoxTrojanServerPassword_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxTrojanServerPassword.Text); - } - - #endregion - - #endregion - - #region NaiveProxy 相关 - //生成NaiveProxy客户端资料 - private void GenerateNaivePrxoyShareQRcodeAndBase64Url() - { - string proxyfolder = CheckDir("naive_config"); - configDomainSavePath = CreateConfigSaveDir(proxyfolder, TextBoxNaiveServerHost.Text); - string configSavePath = configDomainSavePath; - - string naiveUrl = $"naive+https://{TextBoxNaiveUser.Text}:{TextBoxNaivePassword.Text}@{TextBoxNaiveServerHost.Text}:443?padding=true#{TextBoxNaiveServerHost.Text}"; - - TextBoxURL.Text = naiveUrl; - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\url.txt")) - { - sw.WriteLine(naiveUrl); - - } - ImageShareQRcode.Source = CreateQRCode(naiveUrl, $"{configSavePath}\\QR.bmp"); - - //移动NaiveProxy官方程序配置文件到相应目录 - if (File.Exists(@"naive_config\config.json")) - { - File.Move(@"naive_config\config.json", $"{configSavePath}\\config.json"); - //File.Delete(@"config\config.json");//删除该文件 - } - - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\readme.txt")) - { - sw.WriteLine("config.json"); - - //****** "此文件为NaiveProxy官方程序所使用的客户端配置文件,配置为全局模式,socks5地址:127.0.0.1:1080" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtNaiveProxyExplainLine01").ToString()); - - //****** "NaiveProxy官方网站:https://github.com/klzgrad/naiveproxy" ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtNaiveProxyExplainLine02").ToString()); - - //sw.WriteLine("NaiveProxy官方程序下载地址:https://github.com/klzgrad/naiveproxy/releases"); - sw.WriteLine(Application.Current.FindResource("readmeTxtNaiveProxyExplainLine03").ToString()); - - //sw.WriteLine("下载相应版本,Windows选择naiveproxy-x.xx-win.zip,解压后提取naive.exe。与config.json放在同一目录,运行naive.exe即可。"); - sw.WriteLine(Application.Current.FindResource("readmeTxtNaiveProxyExplainLine04").ToString()); - - sw.WriteLine("-----------------------------------------"); - sw.WriteLine("QR.bmp"); - - //sw.WriteLine("此文件为NaiveSharp(windows)复制粘贴导入节点的网址"); - sw.WriteLine(Application.Current.FindResource("readmeTxtNaiveProxyExplainLine05").ToString()); - - //sw.WriteLine("NaiveSharp(windows)下载网址:https://github.com/KevinZonda/NaiveSharp/releases"); - sw.WriteLine(Application.Current.FindResource("readmeTxtNaiveProxyExplainLine06").ToString()); - - sw.WriteLine("-----------------------------------------\n"); - - sw.WriteLine("url.txt"); - - //sw.WriteLine("此文件为NaiveSharp(windows)复制粘贴导入节点的网址"); - sw.WriteLine(Application.Current.FindResource("readmeTxtNaiveProxyExplainLine05").ToString()); - - //sw.WriteLine("NaiveSharp(windows)下载网址:https://github.com/KevinZonda/NaiveSharp/releases"); - sw.WriteLine(Application.Current.FindResource("readmeTxtNaiveProxyExplainLine06").ToString()); - - sw.WriteLine("-----------------------------------------\n"); - - string strApplicat = ""; - string strParam = ""; - int strLenth = 20; - - //sw.WriteLine("服务器通用连接配置参数"); - sw.WriteLine(Application.Current.FindResource("readmeTxtNaiveProxyExplainLine07").ToString()); - sw.WriteLine(""); - - //****** 服务器地址(address): ****** - //sw.WriteLine(Application.Current.FindResource("TextBlockServerAddress").ToString() + $"{TextBoxNaiveServerHost.Text}"); - strApplicat = "TextBlockServerAddress"; - strParam = TextBoxNaiveServerHost.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - //****** 用户名:****** - //sw.WriteLine(Application.Current.FindResource("TextBlockHostUser").ToString() + $"{TextBoxNaiveUser.Text}"); - strApplicat = "TextBlockHostUser"; - strParam = TextBoxNaiveUser.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - //****** 密码: ****** - //sw.WriteLine(Application.Current.FindResource("TextBlockTrojanGoPassword").ToString() + $"{TextBoxNaivePassword.Text}"); - strApplicat = "TextBlockTrojanGoPassword"; - strParam = TextBoxNaivePassword.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - } - - } - - #region NaiveProxy内容双击复制到剪贴板 - private void TextBoxNaiveServerHost_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxNaiveServerHost.Text); - } - - private void TextBoxNaivePort_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxNaivePort.Text); - } - - private void TextBoxNaiveUser_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxNaiveUser.Text); - } - - private void TextBoxNaivePassword_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxNaivePassword.Text); - } - - - - #endregion - - #endregion - - #region SSR 相关 - //生成SSR客户端资料 - private void GenerateSSRShareQRcodeAndBase64Url() - { - string proxyfolder = CheckDir("ssr_config"); - configDomainSavePath = CreateConfigSaveDir(proxyfolder, TextBoxSSRHostAddress.Text); - string configSavePath = configDomainSavePath; - //string saveFileFolderFirst = TextBoxSSRHostAddress.Text; - //int num = 1; - //saveFileFolder = saveFileFolderFirst; - //CheckDir("ssr_config"); - //while (Directory.Exists(@"ssr_config\" + saveFileFolder)) - //{ - // saveFileFolder = saveFileFolderFirst + "_copy_" + num.ToString(); - // num++; - //} - //CheckDir(@"ssr_config\" + saveFileFolder); - - string ssrUrl = GetSSRLinkForServer(); - TextBoxURL.Text = ssrUrl; - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\url.txt")) - { - sw.WriteLine(ssrUrl); - } - ImageShareQRcode.Source = CreateQRCode(ssrUrl, $"{configSavePath}\\QR.bmp"); - - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\readme.txt")) - { - //sw.WriteLine("-----------------------------------------\n"); - sw.WriteLine("QR.bmp"); - - //***"此文件为ShadowsocksR (windows)、SSRR(Android)、Shadowrocket(ios)扫码导入节点"*** - sw.WriteLine(Application.Current.FindResource("readmeTxtSSRExplainLine05").ToString()); - - //***"ShadowsocksR (windows)下载网址:https://github.com/shadowsocksrr/shadowsocksr-csharp/releases"*** - sw.WriteLine(Application.Current.FindResource("readmeTxtSSRExplainLine06").ToString()); - - //***"SSRR(Android)下载网址:https://github.com/shadowsocksrr/shadowsocksr-android/releases"*** - sw.WriteLine(Application.Current.FindResource("readmeTxtSSRExplainLine07").ToString()); - - //***"Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。"*** - sw.WriteLine(Application.Current.FindResource("readmeTxtSSRExplainLine08").ToString()); - sw.WriteLine("-----------------------------------------\n"); - sw.WriteLine("url.txt"); - - //***"此文件为ShadowsocksR (windows)、SSRR(Android)、Shadowrocket(ios)复制粘贴导入节点的网址"*** - sw.WriteLine(Application.Current.FindResource("readmeTxtSSRExplainLine09").ToString()); - sw.WriteLine("-----------------------------------------\n"); - - string strApplicat = ""; - string strParam = ""; - int strLenth = 20; - - //***"服务器通用连接配置参数"*** - sw.WriteLine(Application.Current.FindResource("readmeTxtTrojanExplainLine10").ToString()); - sw.WriteLine(""); - - //****** 服务器地址(address): ****** - //sw.WriteLine(Application.Current.FindResource("TextBlockServerAddress").ToString() + $"{ TextBoxSSRHostAddress.Text}"); - strApplicat = "TextBlockServerAddress"; - strParam = TextBoxSSRHostAddress.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - //****** 端口(port): ****** - //sw.WriteLine(Application.Current.FindResource("TextBlockServerPort").ToString() + $"{TextBoxSSRPort.Text}"); - strApplicat = "TextBlockServerPort"; - strParam = TextBoxSSRPort.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - //****** 密码: ****** - //sw.WriteLine(Application.Current.FindResource("TextBlockTrojanGoPassword").ToString() + $"{TextBoxSSRUUID.Text}"); - strApplicat = "TextBlockTrojanGoPassword"; - strParam = TextBoxSSRUUID.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - //****** 加密方式: ****** - //sw.WriteLine(Application.Current.FindResource("TextBlockEncryption").ToString() + $"{TextBoxSSREncryption.Text}"); - strApplicat = "TextBlockEncryption"; - strParam = TextBoxSSREncryption.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - //****** 传输协议: ****** - //sw.WriteLine(Application.Current.FindResource("TextBlockTransferProtocol").ToString() + $"{TextBoxSSRTransmission.Text}"); - strApplicat = "TextBlockTransferProtocol"; - strParam = TextBoxSSRTransmission.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - //****** 混淆: ****** - //sw.WriteLine(Application.Current.FindResource("TextBlockCamouflageType").ToString() + $"{TextBoxSSRCamouflageType.Text}"); - strApplicat = "TextBlockCamouflageType"; - strParam = TextBoxSSRCamouflageType.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - } - } - - #region SSR内容双击复制到剪贴板 - - private void TextBoxSSRHostAddress_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxSSRHostAddress.Text); - } - - private void TextBoxSSRPort_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxSSRPort.Text); - } - - private void TextBoxSSRUUID_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxSSRUUID.Text); - } - - private void TextBoxSSREncryption_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxSSREncryption.Text); - } - - private void TextBoxSSRTransmission_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxSSRTransmission.Text); - } - - private void TextBoxSSRCamouflageType_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxSSRCamouflageType.Text); - } - #endregion - - //生成SS客户端资料 - private void GenerateShareQRcodeAndBase64UrlSS() - { - //创建保存目录 - string proxyfolder = CheckDir("ss_config"); - configDomainSavePath = CreateConfigSaveDir(proxyfolder, TextBoxHostAddressSS.Text); - string configSavePath = configDomainSavePath; - //string configSavePath = CreateConfigSaveDir(@"ss_config", TextBoxHostAddressSS.Text); - string ssUrl; - - //生成手机端的URL(无插件时,为电脑手机通用) - if (String.Equals(TextBoxPluginNameExplainSS.Text, "goquiet")==false && String.Equals(TextBoxPluginNameExplainSS.Text, "cloak") == false) - { - ssUrl = GetSStoURL(TextBoxPluginNameExplainSS.Text); - TextBoxURL.Text = ssUrl; - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\url.txt")) - { - sw.WriteLine(ssUrl); - } - ImageShareQRcode.Source = CreateQRCode(ssUrl, $"{configSavePath}\\QR.bmp"); - } - - if (String.IsNullOrEmpty(TextBoxPluginNameExplainSS.Text) == false) - { - //生成电脑端 - ssUrl = GetSStoURL(TextBoxPluginNameExplainSSpc.Text); - TextBoxURLpcSS.Text = ssUrl; - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\url_pc.txt")) - { - sw.WriteLine(ssUrl); - } - ImageShareQRcodeSSpc.Source = CreateQRCode(ssUrl, $"{configSavePath}\\QR_pc.bmp"); - } - using (StreamWriter sw = new StreamWriter($"{configSavePath}\\readme.txt")) - { - if (String.Equals(TextBoxPluginNameExplainSS.Text, "goquiet") == false && String.Equals(TextBoxPluginNameExplainSS.Text, "cloak") == false) - { - //sw.WriteLine("-----------------------------------------\n"); - sw.WriteLine("QR.bmp"); - if (String.IsNullOrEmpty(TextBoxPluginNameExplainSS.Text) == true) - { - //***"此文件为Shadowsocks (windows)、shadowsocks(Android)、Shadowrocket(ios)扫码导入节点"*** - sw.WriteLine(Application.Current.FindResource("readmeTxtExplainLineSS05").ToString()); - - } - else - { - //***"此文件为shadowsocks(Android)、Shadowrocket(ios)扫码导入节点"*** - sw.WriteLine(Application.Current.FindResource("readmeTxtExplainLineSS05").ToString()); - } - - sw.WriteLine("-----------------------------------------\n"); - sw.WriteLine("url.txt"); - if (String.IsNullOrEmpty(TextBoxPluginNameExplainSS.Text) == true) - { - //***"此文件为Shadowsocks (windows)、shadowsocks(Android)、Shadowrocket(ios)复制粘贴导入节点的网址"*** - sw.WriteLine(Application.Current.FindResource("readmeTxtExplainLineSS09").ToString()); - } - else - { - //***"此文件为shadowsocks(Android)、Shadowrocket(ios)复制粘贴导入节点的网址"*** - sw.WriteLine(Application.Current.FindResource("readmeTxtExplainLineSS09").ToString()); - } - sw.WriteLine(""); - //***"shadowsocks(Android)下载网址:https://github.com/shadowsocks/shadowsocks-android/releases"*** - sw.WriteLine(Application.Current.FindResource("readmeTxtExplainLineSS07").ToString()); - - //***"Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。"*** - sw.WriteLine(Application.Current.FindResource("readmeTxtExplainLineSS08").ToString()); - } - if (String.IsNullOrEmpty(TextBoxPluginNameExplainSS.Text) == false) - { - sw.WriteLine(""); - sw.WriteLine("-----------------------------------------\n"); - sw.WriteLine("QR_pc.bmp"); - - //***"此文件为Shadowsocks (windows)扫码导入节点"*** - sw.WriteLine(Application.Current.FindResource("readmeTxtExplainLineSS01").ToString()); - sw.WriteLine("-----------------------------------------\n"); - sw.WriteLine("url_pc.txt"); - - //***"此文件为Shadowsocks (windows)复制粘贴导入节点的网址"*** - sw.WriteLine(Application.Current.FindResource("readmeTxtExplainLineSS02").ToString()); - sw.WriteLine(""); - - } - //***"Shadowsocks(windows)下载网址:https://github.com/shadowsocks/shadowsocks-windows/releases"*** - sw.WriteLine(Application.Current.FindResource("readmeTxtExplainLineSS06").ToString()); - sw.WriteLine("-----------------------------------------\n"); - - string strApplicat = ""; - string strParam = ""; - int strLenth = 20; - - //***"服务器通用连接配置参数"*** - sw.WriteLine(Application.Current.FindResource("readmeTxtTrojanExplainLine10").ToString()); - sw.WriteLine(""); - - //****** 服务器地址(address): ****** - //sw.WriteLine(Application.Current.FindResource("TextBlockServerAddress").ToString() + $"{TextBoxHostAddressSS.Text}"); - strApplicat = "TextBlockServerAddress"; - strParam = TextBoxHostAddressSS.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - //****** 端口(port): ****** - //sw.WriteLine(Application.Current.FindResource("TextBlockServerPort").ToString() + $"{TextBoxPortSS.Text}"); - strApplicat = "TextBlockServerPort"; - strParam = TextBoxPortSS.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - //****** 密码: ****** - //sw.WriteLine(Application.Current.FindResource("TextBlockTrojanGoPassword").ToString() + $"{TextBoxPasswordSS.Text}"); - strApplicat = "TextBlockTrojanGoPassword"; - strParam = TextBoxPasswordSS.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - //****** 加密方式: ****** - //sw.WriteLine(Application.Current.FindResource("TextBlockEncryption").ToString() + $"{TextBoxEncryptionSS.Text}"); - strApplicat = "TextBlockEncryption"; - strParam = TextBoxEncryptionSS.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - - if (String.IsNullOrEmpty(TextBoxPluginNameExplainSS.Text) == false) - { - //****** 插件程序:: ****** - //sw.WriteLine(Application.Current.FindResource("TextBlockPluginNameExplainSS").ToString() + $"{TextBoxPluginNameExplainSS.Text}"); - strApplicat = "TextBlockPluginNameExplainSS"; - strParam = TextBoxPluginNameExplainSS.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - //****** 插件选项: ****** - //sw.WriteLine(Application.Current.FindResource("TextBlockPluginOptionExplainSS").ToString() + $"{TextBoxPluginOptionExplainSS.Text}"); - strApplicat = "TextBlockPluginOptionExplainSS"; - strParam = TextBoxPluginOptionExplainSS.Text; - sw.WriteLine(AlignmentStrFunc(Application.Current.FindResource($"{strApplicat}").ToString(), strLenth) + strParam); - - sw.WriteLine("-----------------------------------------\n"); - //****** 插件使用说明 ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtPluginExplainSS").ToString()); - - //****** ProxySU默认所有插件,在Shadowsocks (windows)运行文件所在文件夹的子文件夹plugins下。 ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtPluginExplainSS01").ToString()); - - //****** 电脑端手动安装插件说明 ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtPluginExplainSS02").ToString()); - - //****** 先下载插件,各个插件Windows客户端下载地址为: ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtPluginExplainSS03").ToString()); - - //****** Simple-obfs: https://github.com/shadowsocks/simple-obfs/releases 只下载 obfs-local.zip ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtPluginExplainSS04").ToString()); - - //****** 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为数字,是版本号)****** - sw.WriteLine(Application.Current.FindResource("readmeTxtPluginExplainSS05").ToString()); - - //****** Kcptun-plugin: https://github.com/shadowsocks/kcptun/releases 64位系统选择:kcptun-windows-amd64-xxxxxx.tar.gz,32位系统选择:kcptun-plugin-windows-386-xxxxxx.tar.gz (x为数字,是版本号)****** - sw.WriteLine(Application.Current.FindResource("readmeTxtPluginExplainSS06").ToString()); - - ////****** 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为数字,是版本号)****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtPluginExplainSS07").ToString()); - - ////****** 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为数字,是版本号) ****** - //sw.WriteLine(Application.Current.FindResource("readmeTxtPluginExplainSS08").ToString()); - - //****** 在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 - //****** - sw.WriteLine(Application.Current.FindResource("readmeTxtPluginExplainSS09").ToString()); - //******安装完毕 ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtPluginExplainSS10").ToString()); - - sw.WriteLine("-----------------------------------------\n"); - - //******手机安卓客户端插件安装说明 ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtPluginExplainSSandroid02").ToString()); - - //****** 先下载插件,各个插件安卓客户端下载地址为: ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtPluginExplainSSandroid03").ToString()); - - //****** Simple-obfs: https://github.com/shadowsocks/simple-obfs-android/releases 只下载 obfs-local-nightly-x.x.x.apk(x为数字,是版本号) ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtPluginExplainSSandroid04").ToString()); - - //****** V2ray-plugin: https://github.com/shadowsocks/v2ray-plugin-android/releases 一般选择v2ray--universal-x.x.x.apk(x为数字,是版本号)****** - sw.WriteLine(Application.Current.FindResource("readmeTxtPluginExplainSSandroid05").ToString()); - - //****** Kcptun-plugin: https://github.com/shadowsocks/kcptun-android/releases 一般选择kcptun--universal-x.x.x.apk(x为数字,是版本号)****** - sw.WriteLine(Application.Current.FindResource("readmeTxtPluginExplainSSandroid06").ToString()); - //******将上述apk文件传到手机,安装即可! ****** - sw.WriteLine(Application.Current.FindResource("readmeTxtPluginExplainSSandroid07").ToString()); - - } - - } - - } - - #region SS内容双击复制到剪贴板 - private void TextBoxHostAddressSS_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxHostAddressSS.Text); - } - - private void TextBoxPortSS_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxPortSS.Text); - } - - private void TextBoxPasswordSS_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxPasswordSS.Text); - } - - private void TextBoxEncryptionSS_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxEncryptionSS.Text); - } - - private void TextBoxPluginNameExplainSS_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxPluginNameExplainSS.Text); - } - private void TextBoxPluginNameExplainSSpc_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxPluginNameExplainSSpc.Text); - } - - private void TextBoxPluginOptionExplainSS_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxPluginOptionExplainSS.Text); - } - - private void TextBoxURLpcSS_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxURLpcSS.Text); - } - - #endregion - - #endregion - - #region MTProto 界面控制 - private void RadioButtonMtgIpv4_Checked(object sender, RoutedEventArgs e) - { - GridMtgIpv4.Visibility = Visibility.Visible; - GridMtgIpv6.Visibility = Visibility.Collapsed; - } - - private void RadioButtonMtgIpv6_Checked(object sender, RoutedEventArgs e) - { - GridMtgIpv4.Visibility = Visibility.Collapsed; - GridMtgIpv6.Visibility = Visibility.Visible; - } - private void TextBoxURLMtgTgIpv4_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxURLMtgTgIpv4.Text); - } - - private void TextBoxURLMtgTmeIpv4_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxURLMtgTmeIpv4.Text); - } - - private void TextBoxURLMtgTgIpv6_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxURLMtgTgIpv6.Text); - } - - private void TextBoxURLMtgTmeIpv6_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - CopyToClipboard(TextBoxURLMtgTmeIpv6.Text); - } - - #endregion - - //生成base64 - private string ToBase64Encode(string text) - { - if (String.IsNullOrEmpty(text)) - { - return text; - } - - byte[] textBytes = Encoding.UTF8.GetBytes(text); - return Convert.ToBase64String(textBytes); - } - - //生成QRcoder图片,并按给出的路径与名称保存,返回窗口显示的图片源 - private BitmapSource CreateQRCode(string varBase64,string configPath) - { - QRCodeGenerator qrGenerator = new QRCodeGenerator(); - QRCodeData qrCodeData = qrGenerator.CreateQrCode(varBase64, QRCodeGenerator.ECCLevel.Q); - QRCode qrCode = new QRCode(qrCodeData); - Bitmap qrCodeImage = qrCode.GetGraphic(20); - IntPtr myImagePtr = qrCodeImage.GetHbitmap(); - BitmapSource imgsource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(myImagePtr, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); - //ImageShareQRcode.Source = imgsource; - //DeleteObject(myImagePtr); - qrCodeImage.Save(configPath); - return imgsource; - - } - - //判断目录是否存在,不存在则创建 - private string CheckDir(string folder) - { - try - { - if (!Directory.Exists(folder))//如果不存在就创建file文件夹 - Directory.CreateDirectory(folder);//创建该文件夹   - return folder; - } - catch (Exception) - { - return ""; - } - } - - //目录已存在则生成序号递增,并返回所创建的目录路径。 - private string CreateConfigSaveDir(string upperDir,string configDir) - { - try - { - //string saveFileFolderFirst = configDir; - int num = 1; - //saveFileFolder = EncodeURIComponent(configDir); - saveFileFolder = configDir.Replace(":","_"); - CheckDir(upperDir); - while (Directory.Exists(upperDir + @"\" + saveFileFolder) == true) - { - saveFileFolder = configDir + "_copy_" + num.ToString(); - num++; - } - CheckDir(upperDir + @"\" + saveFileFolder); - return upperDir + @"\" + saveFileFolder; - } - catch (Exception) - { - saveFileFolder = ""; - return upperDir + @"\" + saveFileFolder; - } - - } - - //打开文件夹 - private void ButtonOpenSaveDir_Click(object sender, RoutedEventArgs e) - { - string openFolderPath = configDomainSavePath; - System.Diagnostics.Process.Start("explorer.exe", openFolderPath); - this.Close(); - - } - - //SSR生成URL链接 - private string GetSSRLinkForServer() - { - string server = TextBoxSSRHostAddress.Text; - string server_port = TextBoxSSRPort.Text; - string password = TextBoxSSRUUID.Text; - string protocol = TextBoxSSRTransmission.Text; - string method = TextBoxSSREncryption.Text; - string obfs = TextBoxSSRCamouflageType.Text; - - string obfsparam=""; - string protocolparam = ""; - string remarks = TextBoxSSRHostAddress.Text; - string group = TextBoxSSRHostAddress.Text; - bool udp_over_tcp = true; - int server_udp_port = 0; - - string main_part = server + ":" + server_port + ":" + protocol + ":" + method + ":" + obfs + ":" + EncodeUrlSafeBase64(password); - string param_str = "obfsparam=" + EncodeUrlSafeBase64(obfsparam ?? ""); - if (!string.IsNullOrEmpty(protocolparam)) - { - param_str += "&protoparam=" + EncodeUrlSafeBase64(protocolparam); - } - if (!string.IsNullOrEmpty(remarks)) - { - param_str += "&remarks=" + EncodeUrlSafeBase64(remarks); - } - if (!string.IsNullOrEmpty(group)) - { - param_str += "&group=" + EncodeUrlSafeBase64(group); - } - if (udp_over_tcp) - { - param_str += "&uot=" + "1"; - } - if (server_udp_port > 0) - { - param_str += "&udpport=" + server_udp_port.ToString(); - } - string base64 = EncodeUrlSafeBase64(main_part + "/?" + param_str); - return "ssr://" + base64; - } - - //SS生成URL链接,需要给出plugin的内容,用于生成手机端或电脑端的URL - public string GetSStoURL(string plugin,bool legacyUrl = true) - { - string tag = string.Empty; - string url = string.Empty; - - server = TextBoxHostAddressSS.Text; - string server_port = TextBoxPortSS.Text; - - string password = TextBoxPasswordSS.Text; - string method = TextBoxEncryptionSS.Text; - - // plugin = TextBoxPluginNameExplainSS.Text; - string plugin_opts = TextBoxPluginOptionExplainSS.Text; - - string remarks = server; - - if (legacyUrl && string.IsNullOrWhiteSpace(plugin)) - { - // For backwards compatiblity, if no plugin, use old url format - string parts = $"{method}:{password}@{server}:{server_port}"; - string base64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(parts)); - url = base64; - } - else - { - // SIP002 - string parts = $"{method}:{password}"; - string base64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(parts)); - string websafeBase64 = base64.Replace('+', '-').Replace('/', '_').TrimEnd('='); - - url = string.Format( - "{0}@{1}:{2}/", - websafeBase64, - FormalHostName, - server_port - ); - - if (!String.IsNullOrWhiteSpace(plugin)) - { - - string pluginPart = plugin; - if (!String.IsNullOrWhiteSpace(plugin_opts)) - { - pluginPart += ";" + plugin_opts; - } - string pluginQuery = "?plugin=" + HttpUtility.UrlEncode(pluginPart, Encoding.UTF8); - url += pluginQuery; - } - } - - if (!String.IsNullOrEmpty(remarks)) - { - tag = $"#{HttpUtility.UrlEncode(remarks, Encoding.UTF8)}"; - } - return $"ss://{url}{tag}"; - } - - //格式化主机名称 - private string FormalHostName - { - get - { - // CheckHostName() won't do a real DNS lookup - switch (Uri.CheckHostName(server)) - { - case UriHostNameType.IPv6: // Add square bracket when IPv6 (RFC3986) - return $"[{server}]"; - default: // IPv4 or domain name - return server; - } - } - } - //编码安全Base64 - private string EncodeUrlSafeBase64(byte[] val, bool trim) - { - if (trim) - return Convert.ToBase64String(val).Replace('+', '-').Replace('/', '_').TrimEnd('='); - else - return Convert.ToBase64String(val).Replace('+', '-').Replace('/', '_'); - } - //编码安全Base64重载 - private string EncodeUrlSafeBase64(string val, bool trim = true) - { - return EncodeUrlSafeBase64(Encoding.UTF8.GetBytes(val), trim); - } - - private void RadioButtonMobile_Checked(object sender, RoutedEventArgs e) - { - TextBoxPluginNameExplainSS.Visibility = Visibility.Visible; - GroupBoxClientQRandURL.Visibility = Visibility.Visible; - - TextBoxPluginNameExplainSSpc.Visibility = Visibility.Collapsed; - GroupBoxClientSSpc.Visibility = Visibility.Collapsed; - - } - - private void RadioButtonPC_Checked(object sender, RoutedEventArgs e) - { - TextBoxPluginNameExplainSS.Visibility = Visibility.Collapsed; - GroupBoxClientQRandURL.Visibility = Visibility.Collapsed; - - TextBoxPluginNameExplainSSpc.Visibility = Visibility.Visible; - GroupBoxClientSSpc.Visibility = Visibility.Visible; - } - - /// - ///生成固定长度的空格字符串 - /// - /// - /// - - private string SpaceStrFunc(int length) - { - string strReturn = string.Empty; - if (length > 0) - { - for (int i = 0; i < length; i++) - { - strReturn += " "; - } - } - return strReturn; - } - - /// - ///将字符串生转化为固定长度左对齐,右补空格 - /// - ///需要补齐的字符串 - ///补齐后的长度 - /// - - private string AlignmentStrFunc(string strTemp, int length) - { - byte[] byteStr = System.Text.Encoding.Default.GetBytes(strTemp.Trim()); - int iLength = byteStr.Length; - int iNeed = length - iLength; - - byte[] spaceLen = Encoding.Default.GetBytes(" "); //一个空格的长度 - iNeed = iNeed / spaceLen.Length; - - string spaceString = SpaceStrFunc(iNeed); - //return strTemp + spaceString; - return spaceString + strTemp; - } - - - } - - -} diff --git a/ProxySU/SSpluginWindow.xaml b/ProxySU/SSpluginWindow.xaml deleted file mode 100644 index a3af977..0000000 --- a/ProxySU/SSpluginWindow.xaml +++ /dev/null @@ -1,279 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ProxySU/SSpluginWindow.xaml.cs b/ProxySU/SSpluginWindow.xaml.cs deleted file mode 100644 index f1f508b..0000000 --- a/ProxySU/SSpluginWindow.xaml.cs +++ /dev/null @@ -1,394 +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 -{ - /// - /// SSpluginWindow.xaml 的交互逻辑 - /// - 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 methodList = new List(); - - 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 string DisguiseURLprocessing(string fakeUrl) - //{ - //var uri = new Uri(fakeUrl); - //return uri.Host; - //处理伪装网站域名中的前缀 - //if (fakeUrl.Length >= 7) - //{ - // string testDomainMask = fakeUrl.Substring(0, 7); - // if (String.Equals(testDomainMask, "https:/") || String.Equals(testDomainMask, "http://")) - // { - // string[] tmpUrl = fakeUrl.Split('/'); - // fakeUrl = tmpUrl[2]; - // } - - //} - //return fakeUrl; - // } - - private void ButtondDecide_Click(object sender, RoutedEventArgs e) - { - bool preDomainMask = ClassModel.PreDomainMask(TextBoxMaskSites.Text); - bool domainNotEmpty = 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) - { - - domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomainSS.Text); - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "ObfsPluginHttpsWebSS"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonObfsPluginHttpsWebSS.Content.ToString(); - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomainSS.Text); - //传递伪装网站 - MainWindow.ReceiveConfigurationParameters[7] = ClassModel.DisguiseURLprocessing(PreTrim(TextBoxMaskSites.Text)); - - } - - //V2Ray-Plugin SS+WebSocket 无TLS模式被选中 - else if (RadioButtonWebSocketSS.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "WebSocketSS"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonWebSocketSS.Content.ToString(); - //传递路径 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxWebSocketPathSS.Text); - } - - //V2Ray-Plugin SS+WebSocket+TLS+Web模式被选中 - else if (RadioButtonWebSocketTLSWebFrontSS.IsChecked == true || RadioButtonWebSocketTLSWebFrontSSHot.IsChecked == true) - { - domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomainSS.Text); - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "WebSocketTLSWebFrontSS"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonWebSocketTLSWebFrontSS.Content.ToString(); - - //传递路径 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxWebSocketPathSS.Text); - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomainSS.Text); - //传递伪装网站 - MainWindow.ReceiveConfigurationParameters[7] = ClassModel.DisguiseURLprocessing(PreTrim(TextBoxMaskSites.Text)); - - } - //V2Ray-Plugin SS+QUIC模式被选中 - else if (RadioButtonQuicSS.IsChecked == true) - { - domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomainSS.Text); - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "QuicSS"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonQuicSS.Content.ToString(); - - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomainSS.Text); - - } - //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) - { - domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomainSS.Text); - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "GoQuietPluginSS"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonGoQuietPluginSS.Content.ToString(); - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomainSS.Text); - - } - //SS+Cloak-Plugin模式被选中 - else if (RadioButtonCloakPluginSS.IsChecked == true) - { - domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomainSS.Text); - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "CloakPluginSS"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonCloakPluginSS.Content.ToString(); - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomainSS.Text); - - } - - //传递服务端口 - MainWindow.ReceiveConfigurationParameters[1] = PreTrim(TextBoxServerListenPortSS.Text); - //传递uuid密码 - MainWindow.ReceiveConfigurationParameters[2] = PreTrim(TextBoxNewUUIDSS.Text); - //传递加密方式 - MainWindow.ReceiveConfigurationParameters[3] = GetEncryptionMethodSS(); - - if (domainNotEmpty == true && preDomainMask == true) - { - 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.Visible; - TextBoxMaskSites.Visibility = Visibility.Visible; - - //初始化密码 - 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.Visible; - TextBoxMaskSites.Visibility = Visibility.Visible; - - //初始化密码 - 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 - - //TextBox输入内容做预处理 - private string PreTrim(string preString) - { - return preString.Trim(); - } - - //域名检测是否为空 - //private bool TestDomainIsEmpty() - //{ - // if (string.IsNullOrEmpty(PreTrim(TextBoxDomainSS.Text)) == true) - // { - // //****** "域名不能为空,请检查相关参数设置!" ****** - // MessageBox.Show(Application.Current.FindResource("MessageBoxShow_DomainNotEmpty").ToString()); - // return false; - // } - // else - // { - // return true; - // } - //} - } -} diff --git a/ProxySU/Translations/ProxySU.en-US.xaml b/ProxySU/Translations/ProxySU.en-US.xaml deleted file mode 100644 index a7ff3f0..0000000 --- a/ProxySU/Translations/ProxySU.en-US.xaml +++ /dev/null @@ -1,619 +0,0 @@ - - - The new version has been released! - Downloading...Wait Prompt... - The download of the latest version failed, please try again later! - Download the latest version successfully, the file has been saved in the same directory of the current ProxySU.exe - Update - 界面語言: - Deployment - Resources - Free Wall URL - Common Error - Host: - IP or Domain (Not empty) - Port: - User: - Password: - Key: - Key file Path (Not Empty) - Open... - Password Login - Key Login - No Proxy - Not Login - Requires Login - Proxy Addr: - Email - Acme.sh SSL must an available email address. - Save Installation Log... - Waiting for installation and deployment - System Tools - - Xray template library - Xray one-click installation - Upgrade Xay - - V2Ray Templates - V2ray install - Upgrade V2Ray - Cancel - Trojan-Go Templates - Trojan-Go install - Upgrade Trojan-Go - Cancel - Currently selected plan: - No plan selected - - Parameter settings - Mode: Trojan+TLS+Caddy - Domain: - Port: 443 - Domain Not Empty - Password: - Change - Trojan install - Upgrade Trojan - Cancel - - Mode: NaiveProxy+TLS+Caddy - Random - NaiveProxy install - Cancel - - Mode: SSR+TLS+Caddy - SSR install - - - Mode: MTProto+TLS - MTProto install - Making domain name: - Recommended https ports 443, 2053, 2083, 2087, 2096, 8443 - The secret key will be randomly generated by the server. - - - SS install - SS plug-in library - Classic mode - Tip: This mode, long time, large traffic use, easy to be blocked and interfered, is not recommended! - SS Classic - 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! - Simple-obfs plug-in - 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! - SS+obfs+http+Web - 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. - SS+obfs+TLS(https)+Web - 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. - V2Ray plug-in - Reminder: ShadowRocket(ios) does not support SS+Quic mode - SS+WebSocket+TLS+Caddy (Web post) - SS+WebSocket+TLS+Caddy (Web front) - 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. - SS+QUIC - 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, - - kcptun Plugin - Reminder: Shadowrocket(ios) does not support GoQuiet-plugin. shadowsocks (Android) does not support GoQuiet-plugin and Cloak-plugin plug-ins - 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 . - 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 - 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. - Plugin program: - Plugin options: - Use the compilation method, it will take a little longer, please be patient... - - - Proofreading Time - Release 80/443 - Enable BBR - Uninstall Proxy - Enable root password login - root prohibits password login - Enable root certificate key login - 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? - This function requires that the currently logged-in account has sudo permissions. Is the root account enabled and password set for the remote host? - This function requires that the currently logged-in account has root or sudo authority. Is root certificate key login enabled for the remote host? - This function requires that the remote host has enabled other login methods, such as key mode, etc., otherwise the remote host may not be able to connect. Is the root account password login method of the remote host prohibited? - is closing the root account password login method..... - The remote host root account password login method is closed! - The root account certificate key login of the remote host has been enabled, and the key file rootuser.key is saved in the subsequent opened folder! - The current account already has root privileges, no need to set it up! - The current account cannot obtain sudo permission, the setting failed! - Generate a 20-digit random password! - Save password information! - Generating a key... - The key is being downloaded... - The remote host enables key login....... - The remote host Root account password login is enabled, and the password is saved in the folder opened afterwards! - Start uninstall...... - Detected installed - Uninstallation failed! Please ask the developer! - Uninstall successfully! - - Home - Forward - Back - Due to well-known reasons, loading is slow at certain times, please be patient - - Trojan-go template library - http/2 transmission, Caddy2 camouflage website, anti-recognition, CDN of CloudFlare is not currently supported - Use WebSocket transmission, Caddy2 camouflage website, anti-identification, support CloudFlare CDN - Parameter settings - Domain name: - Port: 443 - Password: - Use the existing password and paste it directly into the box - WebSocket Path: - Mux multiplexing - The settings here are only valid for the official client configuration file config.json, other clients need to be set manually, and the server automatically adapts. - This field does not appear in the QR code and sharing URL. The client needs to set it by itself, and the server enables automatic adaptation by default. - OK - Cancel - - V2Ray Templates - Recommend - EarlyPlan - VLESS - 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. - 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. - 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. - 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 - 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 - TCP - WebSocket - Http/2 - mKCP - QUIC - Parameter settings - Server port: - Random - If TLS encryption is used, please keep the default port 443 - Use the existing UUID and paste it directly into the box - QUIC Key: - mKCP Seed: - Enable the mKCP Seed key to enhance anti-recognition, leave it blank to disable it. Version 4.24.2+ - Path: - VLESS ws path: - VMESS tcp path: - VMESS ws path: - QUIC Encryption: - Domain name: - Trojan password is the same as V2ray UUID. - Mask a website: - Set this option to increase proxy concealment (can be empty) - Enter only the domain name, excluding "http" and "/" etc. - Only forbid root account to log in with password, please make sure that other login methods of root account have taken effect - The root account will be enabled and set to password login - will enable or set the root account as the key certificate login - The input format of the fake URL is wrong! please enter again! - 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 - 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 - Currently Xray is a superset of V2Ray, and it will have a different development direction from V2Ray in the future. - VLESS over TCP with XTLS + fallback and shunt to WHATEVER (ultimate configuration), configured and recommended by rprx boss (author of xtls), configure the following six solutions at the same time on the server side, sharing the same domain name and port 443, WS can pass through CDN. - 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.(If you want to add XTLS scheme, please use Xray configuration) - Encrypted data transmission will be recognized as unknown tcp traffic - TCP+Http camouflage - Encrypted data transmission and HTTP disguise will be recognized as http traffic, but not real http access - Data encrypted transmission, the transmission protocol uses TLS, it will be recognized as TLS traffic, not equivalent to https traffic characteristics (domain name required) - TCP+TLS (self-signed certificate) - 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) - Shadowrocket (ios) needs to manually open the "Allow Unsafe" option - Data encrypted transmission, the transmission protocol uses WebSocket, if TLS is not enabled, it will be recognized as WebSocket traffic. - Data encrypted transmission, the transmission protocol uses WebSocket, and TLS is enabled, it will be recognized as TLS traffic. (Domain name required),Support CDN. - WebSocket+TLS (self-signed certificate) - Data encrypted transmission, the transmission protocol uses WebSocket, and TLS is enabled, and it will be recognized as TLS traffic. (No domain name required) - The transmission method based on HTTP/2. It is fully implemented in accordance with the HTTP/2 standard and requires a domain name - HTTP2 (self-signed certificate) - 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 - mKCP (no camouflage) - Encrypted data transmission to increase bandwidth usage and reduce delay, udp protocol, no camouflage, will be recognized as udp traffic - Same as mKCP (without camouflage), add disguised as SRTP packet, it will be recognized as video call data (such as FaceTime) - Same as mKCP (without camouflage), adding a uTP packet disguised as a uTP data packet will be recognized as BT download data - Same as mKCP (no camouflage), adding data packets disguised as WeChat video calls - Same as mKCP (without camouflage), add disguised as DTLS 1.2 data packet - Same as mKCP (without camouflage), with the addition of disguised as WireGuard packets. (Not the real WireGuard protocol) - Reminder: Shadowrocket currently does not support QUIC transmission mode. - QUIC (no camouflage) - Encrypted data transmission, no pretense will be recognized as udp traffic, originally created by Google, advantages: reduced delay, multiplexing, connection migration - Same as QUIC (no camouflage), adding a packet disguised as SRTP, it will be recognized as video call data (such as FaceTime) - Same as QUIC (without camouflage), add disguised as uTP data packet, it will be recognized as BT download data - Same as QUIC (no camouflage), adding data packets disguised as WeChat video calls - Same as QUIC (without camouflage), add disguised as DTLS 1.2 packet - Same as QUIC (without camouflage), adding a pretend to be a WireGuard packet. (Not the real WireGuard protocol) - - Sync Network Time - 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 - Sync local time - 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 - Update the local time - Synchronize the local computer time with the network time. Note: To use this function, you must run this program as an administrator - Detection Time - Proofread - - Client configuration parameters - Server address: - Port: - User ID(uuid)/Password: - Copy - Copied to the clipboard! - Empty content! - alterId: - 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 - Encryption method: - Transfer Protocol: - Camouflage type(Confuse): - TLS Set: - Tip: Double-click the above content window to copy it to the clipboard. - Path: - mKCP Seed/QUIC key: - default auto - QR/URL - 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 - QR code and URL link can be used v2rayN(windows) Qv2ray(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 - " can be used for ShadowRocket (ios), ignore (Android), Qv2ray (windows) to scan codes and import URLs. Note: some clients may not support WebSocket mode ." - "Can be used for ShadowRocket (ios), ignore (Android), Qv2ray (windows) to scan codes and import URLs. Note: Some clients may not support WebSocket mode." - URL import link for NaiveSharp (windows) - Used to scan codes and import URL import links for ShadowsocksR (windows), SSRR (android), Shadowrocket (ios) - For mobile phone client shadowsocks(android), Shadowrocket(ios) scan code and URL import link - For the computer client Shadowsocks (windows) scan code and URL import link - Scan code and URL import link for Shadowsocks (windows), shadowsocks(android), Shadowrocket(ios) - 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. - Mobile phone - Computer side - TG format QR - TG format URL (double-click to copy to the clipboard) - T.ME format QR - T.ME format URL (double-click to copy to the clipboard) - - Host address, host port, and user name are required and cannot be empty!! - The connection port contains non-numeric characters! - The login password is required and cannot be empty!! - The key file is required and cannot be empty!! - If a proxy is selected, the proxy address and port cannot be empty! - If the proxy needs to log in, the user name and password for proxy login cannot be empty! - The remote host connection information is wrong, please check! - Please select a configuration template first! - An error occurred, the installation was interrupted... - Logging in to the remote host... - The host login is successful! - Detect whether it is running under root permissions... - Please use an account with root permissions to log in to the host! ! - Detection result: OK! - Check whether the system has been installed - The remote host has been installed - , it is recommended to uninstall first, or reinstall the system, if the forced installation may fail. Do you force a reinstallation? - installation canceled, exit - Selected mandatory installation - Test result: not installed - Check whether the system meets the installation requirements... - The current system kernel version is - , V2ray requires the kernel to be 2.6.23 and above. Please upgrade the kernel and install again! - The system kernel version does not meet the requirements, and the installation failed! ! - 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 - The system environment does not meet the requirements, and the installation fails! ! - Test result: OK! - 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... - The modification is complete! - Proofreading time... - 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 - Time comparison failed... - The time difference meets the requirements, OK! - is checking whether the domain name is resolved to the IP of the current VPS... - is detecting whether it is a pure ipv6 host... - A valid IP address was not detected... - Finding the fastest Nat64 gateway... - Failed to find a valid Nat64 gateway... - The fastest Nat64 gateway of the current host is: - Nat64 gateway is being set up...... - Nat64 gateway is being deleted... - The resolution is correct! OK! - detects that the current host is a pure ipv6 host, it is not currently supported! - The domain name could not be correctly resolved to the IP of the current VPS! Installation failed! - 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! - Detect port occupancy... - If one or all of the 80/443 ports are occupied, will the program occupying 80/443 ports be forcibly stopped? - The port is occupied and the installation failed... - is releasing port 80/443... - The release of port 80/443 is complete! - The port is occupied, will the program occupying this port be forcibly stopped? - Release the port... - The port is released! - Test result: Not occupied! - The system environment has been tested and the installation requirements are met, and the deployment begins... - Open the corresponding port of the firewall... - Installing - File download failed! - Compiling, please wait patiently............. - The installation failed, the script runs incorrectly! - The installation is successful! - After installation, upload the configuration file...... - Installing acme.sh...... - acme.sh is installed successfully! - acme.sh installation failed! The reason is unknown, please ask the developer! - Apply for domain name certificate... - The certificate application is successful! - Certificate application failed! The reason is unknown, please ask the developer! - Install the certificate to - The certificate is successfully installed to - The certificate is installed to - failed, the reason is unknown, you can ask the developer! - Install Caddy... - Test result: Caddy is not installed! - The installation of Caddy failed! - Caddy installed successfully! - is upgrading the Caddy v2.2.0 beta version for Http2Web mode! - Upload Caddy configuration file... - Caddy configuration file upload failed! - The Caddy configuration file is uploaded successfully, OK! - Starting Caddy... - Caddy started successfully! - Caddy failed to start! - Starting Caddy (second attempt)! - Caddy failed to start (second time)! Exit the installation! - Caddy failed to start, the reason is unknown! Please ask the developer! - Starting - Startup is successful! - Startup failed! - is trying to start the second time - failed to start (second time)! Exit the installation! - Startup failed, the reason is as above! Please troubleshoot the reason! - BBR test... - Enable BBR... - BBR has been enabled! - The system does not meet the conditions for enabling BBR, and the enabling failed! - BBR is successfully activated! - Generate client configuration... - Failed to obtain client configuration! - The installation is successful, Enjoy it!! - Installation Failed! - An error occurred! - Wrong password or wrong username! - Please check whether the host address and port are correct, if it passes the proxy, please check whether the proxy is working properly - The selected key file is wrong or the format is wrong! - Login using the key, the key file is wrong or the user name is wrong! - The host address is wrong. If a proxy is used, it may also be the wrong port to connect to the proxy! - Exit! Reason: The remote host is not installed - V2Ray using the old installation script is detected... - 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? - Uninstalling the old version... - Uninstall the old version, OK! - Install the new version... - Migrate the original configuration file. - has been updated to the latest version. - The current version of the remote host is: v - The latest version is: - Is it upgraded to the latest version? - Upgrading to the latest version - The upgrade is successful! It is currently the latest version! - The upgrade failed. The reason is unknown. Please ask the developer! - Upgrade is cancelled, exit! - The remote host is currently the latest version: - No need to upgrade! drop out! - The domain name cannot be empty, please check the relevant parameter settings! - Please install in x86_64 system - Back up the Trojan configuration file... - Restore the Trojan configuration file... - "Caddy has been installed on the remote host, but I’m not sure whether it supports forward proxy. Do I force a reinstallation?" - Please uninstall Caddy or reinstall the VPS system first! - Installing dependent software...... - The installation is complete! OK! - Installing Caddy..... - The server is being upgraded for NaiveProxy - The upgrade is complete, OK! - Optimizing network parameters... - Optimize network parameters, OK! - - This file is the client configuration file used by the official Xay program. It is configured in global mode, socks5 address: 127.0.0.1:1080, http proxy address: 127.0.0.1:1081 - Xray official website: https://github.com/XTLS/Xray-core - Xray official program download address: https://github.com/XTLS/Xray-core/releases - Download the corresponding version, select xray-windows-64.zip or xray-windows-32.zip for Windows, extract xray.exe after decompression. Put it in the same directory as config.json, just run xray.exe. - - 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 - v2ray official website: https://www.v2ray.com/ - v2ray official program download address: https://github.com/v2ray/v2ray-core/releases - 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. - This file is v2rayN, Qv2ray, v2rayNG(Android), Shadowrocket(ios) scan code import node - v2rayN download URL: https://github.com/2dust/v2rayN/releases - Qv2ray download URL: https://github.com/Qv2ray/Qv2ray/releases - v2rayNG(Android) download URL: https://github.com/2dust/v2rayNG/releases - v2rayNG (Android) download URL on Google Play: https://play.google.com/store/apps/details?id=com.v2ray.ang - Shadowrocket(ios) download, you need to use the AppleID of the foreign region. Please Google method yourself. - This file is v2rayN, Qv2ray, v2rayNG(Android), Shadowrocket(ios) copy and paste the vmess URL of the imported node - Server general connection configuration parameters - - 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 - Trojan-go official website: https://github.com/p4gefau1t/trojan-go - Trojan-go official program download address: https://github.com/p4gefau1t/trojan-go/releases - 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. - This file is for Qv2ray (windows), ignore (Android) scan code import node - Qv2ray (windows) download URL: https://github.com/Qv2ray/Qv2ray/releases - igniter (Android) download URL: https://github.com/trojan-gfw/igniter/releases - Shadowrocket(ios) download, you need to use the AppleID of the foreign region. Please Google method yourself. - This file is Qv2ray (windows), ignore (Android)copy and paste the URL of the imported node - Server general connection configuration parameters - - 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 - Trojan official website: https://trojan-gfw.github.io/trojan/ - Trojan official program download address: https://github.com/trojan-gfw/trojan/releases - 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. - This file is Qv2ray (windows), ignore (Android), Shadowrocket (ios) scan code import node - Qv2ray (windows) download URL: https://github.com/Qv2ray/Qv2ray/releases - igniter (Android) download URL: https://github.com/trojan-gfw/igniter/releases - Shadowrocket(ios) download, you need to use the AppleID of the foreign region. Please Google method yourself. - This file is Qv2ray (windows), ignore (Android), Shadowrocket (ios) copy and paste the URL of the imported node - Server general connection configuration parameters - - This file is the client configuration file used by the official NaiveProxy program, configured in global mode, socks5 address: 127.0.0.1:1080 - NaiveProxy official website: https://github.com/klzgrad/naiveproxy - NaiveProxy official program download address: https://github.com/klzgrad/naiveproxy/releases - 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. - This file is NaiveSharp (windows) copy and paste the URL of the imported node - NaiveSharp(windows) download URL: https://github.com/KevinZonda/NaiveSharp/releases - Server general connection configuration parameters - - This file is for ShadowsocksR (windows), SSRR (Android), Shadowrocket (ios) scan code import node - ShadowsocksR (windows) download URL: https://github.com/shadowsocksrr/shadowsocksr-csharp/releases - SSRR (Android) download URL: https://github.com/shadowsocksrr/shadowsocksr-android/releases - Shadowrocket(ios) download, you need to use the AppleID of the foreign region. Please Google method yourself. - This file is ShadowsocksR (windows), SSRR (Android), Shadowrocket (ios) copy and paste the URL of the imported node - Server general connection configuration parameters - - This file is a Shadowsocks (windows) scan code import node - This file is Shadowsocks (windows) copy and paste the URL of the imported node - This file is for shadowsocks (Android), Shadowrocket (ios) scan code to import nodes - Shadowsocks (windows) download URL: https://github.com/shadowsocks/shadowsocks-windows/releases - shadowsocks (Android) download URL: https://github.com/shadowsocks/shadowsocks-android/releases - Shadowrocket(ios) download, you need to use the AppleID of the foreign region. Please Google method yourself. - This file is shadowsocks (Android), Shadowrocket (ios) copy and paste the URL of the imported node - Server general connection configuration parameters - plug-in instructions - ProxySU defaults all plug-ins, under the subfolder plugins of the folder where the Shadowsocks (windows) run file is located. - Instructions for manually installing the plug-in on the computer - First download the plug-in, the download address of each plug-in Windows client is: - Simple-obfs: https://github.com/shadowsocks/simple-obfs/releases only download obfs-local.zip - 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) - 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) - 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) - 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) - 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 - installation completed - Mobile Android client plug-in installation instructions - first download the plug-in, the download address of each plug-in Android client is: - Simple-obfs: https://github.com/shadowsocks/simple-obfs-android/releases only download obfs-local-nightly-xxxapk (x is a number, is the version Number) - V2ray-plugin: https://github.com/shadowsocks/v2ray-plugin-android/releases Generally choose v2ray--universal-xxxapk (x is a number, is the version number ) - Kcptun-plugin: https://github.com/shadowsocks/kcptun-android/releases Generally choose kcptun--universal-xxxapk (x is a number, is the version number) - Transfer the above apk file to the phone and install it! - - - - - - \ No newline at end of file diff --git a/ProxySU/Translations/ProxySU.zh-CN.xaml b/ProxySU/Translations/ProxySU.zh-CN.xaml deleted file mode 100644 index 1db4354..0000000 --- a/ProxySU/Translations/ProxySU.zh-CN.xaml +++ /dev/null @@ -1,507 +0,0 @@ - - - 最新版本已发布了,快去更新一下吧! - 正在下载最新版,请等待完成提示.... - 最新版下载失败,请稍后重试! - 下载最新版成功,文件已存入当前ProxySU.exe同一目录 - 下载更新 - Languages: - 应用布署 - 资源工具 - 免翻网址资源 - 常见问题 - 主机: - IP或域名(不可为空) - 端口: - 用户: - 密码: - 密钥: - 密钥文件存放路径(不可为空) - 浏览... - 密码登录 - 密钥登录 - 无代理 - 不需登录 - 需要登录 - 代理地址: - Email - 申请SSL证书需要一个可用的Email地址 - 安装日志另存为... - 等待安装布署 - 系统工具 - - Xray模板库 - Xray一键安装 - 升级Xay - - V2Ray模板库 - V2ray一键安装 - 升级V2ray - 取消 - - Trojan-Go参数设置 - Trojan-Go一键安装 - 升级Trojan-Go - 取消 - 当前所选方案: - 未选择方案 - - 参数设置 - 模式:Trojan+TLS+Caddy - 服务器地址(域名): - 端口:443 - 域名不可为空 - 密码: - 更新 - Trojan一键安装 - 升级Trojan - 取消 - - 模式:NaiveProxy+TLS+Caddy - 随机 - NaiveProxy一键安装 - 取消 - - 模式:SSR+TLS+Caddy - SSR一键安装 - - - 模式:MTProto+TLS - MTProto一键安装 - 伪装域名: - 推荐用常见https端口443、2053、2083、2087、2096、8443 - 密钥将由服务端随机生成,这里无需设置。 - - - SS 一键安装 - SS 插件库 - 经典模式 - 提示:这种模式,长时间,大流量使用,容易被阻断和干扰,不推荐使用! - SS 经典 - SS经典使用模式,无需域名,数据高强度加密,数据被识别为未知数据。目前流量容易被识别,极易被干扰与阻断,慎重使用!放在这里仅仅只是一种情怀与致敬! - Simple-obfs 插件 - 提示:这是SS早期使用的流量混淆方案,插件已经长时间不再更新,不推荐使用! - SS+obfs+http+Web - 无需域名,数据高强度加密,流量混淆为http(并非真正的http),使用Web网站伪装,可在一定程度上增强抗识别!不支持CDN。 - SS+obfs+TLS(https)+Web - 需要域名,使用域名将很大增强抗识别,数据高强度加密,流量混淆为https(并非真正的https),使用Web网站伪装,进一步增强抗识别!不支持CDN。 - V2Ray 插件 - 提醒:ShadowRocket(ios)不支持SS+Quic模式 - SS+WebSocket+TLS+Caddy(Web后置) - SS+WebSocket+TLS+Caddy(Web前置) - 提示:上面方案中的Web前置与Web后置,使用效果上没有差别,Web后置方案,TLS证书由acme.sh申请,证书到期后,acme.sh会自动续期,但是需要手动重启SS加载新证书。而Web前置方案中的证书由Caddy自动申请并加载,不需要重启SS。 - SS+QUIC - 通过V2Ray-Plugin使用QUIC协议传输,强制使用TLS加密。数据加密传输,被识别为udp流量,最初由谷歌创始,优点:减少延迟、多路复用、连接迁移,需要域名, - - kcptun 插件 - 提醒:Shadowrocket(ios)不支持GoQuiet-plugin插件。shadowsocks(Android)不支持GoQuiet-plugin与Cloak-plugin插件 - KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。使用UDP协议传输,数据高强度加密,传输同样的内容,kcp 一般比 TCP 消耗更多的流量,在丢包率高的线路下将极大提高网速,在个别运营商处可能会被QOS限制。 - 基本原理为模拟TLS的流量同时将服务器伪装成一个正常的网站服务器,这个混淆思路并非首创:simple-obfs和ShadowsocksR的tls1.2_ticket_auth模式证明这条道是行得通的。此插件对现有的方法进行了改善,其目标为让大规模封锁HTTPS服务器(甚至IP段)成为封锁SS的唯一有效手段 - 通过加密方式将代理流量混淆为合法的HTTPS流量,并将代理服务器伪装成普通的Web服务器以规避互联网审查。可以看成是上面GoQuiet升级版,优化网络连接速度,并且不是混淆https而是真正的https流量。 - 插件程序: - 插件选项: - 使用编译方式,时间稍长,请耐心等待...... - - - 校对时间 - 释放80/443端口 - 启用BBR - 卸载代理 - 启用root密码登录 - 启用root证书密钥登录 - root禁止密码登录 - 仅支持卸载由ProxySU安装的代理软件及相关配置,请确保重要配置已备份。不支持卸载使用其他方法或脚本安装的代理。确定要卸载远程主机上的代理软件吗? - 本功能需要当前登录的账户具有sudo权限,是否为远程主机启用root账户并设置密码? - 本功能需要当前登录的账户具有root或者sudo权限,是否为远程主机启用root证书密钥登录? - 本功能需要远程主机已经开启了其他登录方式,如密钥方式等,否则将可能造成远程主机无法连接,是否禁止远程主机的root账户密码登录方式? - 正在关闭root账户密码登录方式..... - 远程主机root账户密码登录方式已关闭! - 远程主机root账户证书密钥登录已启用,密钥文件rootuser.key保存在随后打开的文件夹中! - 当前账户已经具有root权限,无需再设置! - 当前账户无法获取sudo权限,设置失败! - 生成20位随机密码! - 保存密码信息! - 正在生成密钥...... - 正在下载密钥...... - 远程主机启用密钥登录....... - 远程主机Root账户密码登录已启用,密码保存在随后打开的文件夹中! - 开始卸载 - 检测到已安装 - 卸载失败!请向开发者问询! - 卸载成功! - - - 主页 - 前进 - 后退 - 由于众所周知的原因,在某些时候,加载缓慢,请耐心等待一下 - - Trojan-go 模板库 - http/2传输,Caddy2伪装网站,抗识别,暂不支持CloudFlare的CDN - 使用WebSocket传输,Caddy2伪装网站,抗识别,支持CloudFlare的CDN - 参数设置 - 域名: - 端口: 443 - 密码: - 使用已有密码,直接粘贴到框中 - WebSocket路径: - Mux多路复用 - 此处设置只对官方客户端配置文件config.json有效,其他客户端需手动设置,服务端自动适配。 - 此字段不出现在QR码及分享URL中,客户端需自行设置,服务端默认启用自动适配。 - 确定 - 取消 - - V2Ray 模板库 - 推荐方案 - 尝鲜方案 - VLESS协议 - VLESS 是一个无状态的轻量传输协议,与 VMess 不同,VLESS 不依赖于系统时间,认证方式同样为 UUID,但不需要 alterId。目前 VLESS 没有自带加密,请用于可靠信道,如 TLS。优点:可以有效的降低主机资源消耗。目前 VLESS 不支持分享。VLESS 处于公测阶段,测试期间请确保客户端与服务端的 v2ray-core 均为最新版本。 - XTLS 在低性能或没有 AES 硬解的设备上效果出众,如在硬路由上换用 XTLS,同样跑满 CPU 时实现网速 翻倍,或是相同网速时 CPU 占用率减半,而对于移动设备,计算量减少意味着省电。服务端客户端版本要求4.29+ (需域名)不支持CDN。 - 轻量协议VLESS,占用更少主机资源,数据TLS加密传输,用Caddy2在节点上做伪装网站。适合配置低的VPS,或多人共用节点,服务端客户端版本要求4.27+ (需域名)不支持CDN。 - 使用VLESS协议,与VMESS的此类型方案,更轻量。稳定性强,Caddy2做前置,隐藏代理特征,被识别为访问网站的https流量,抗封锁识别最强,需要域名,支持CDN - 使用VLESS协议,与VMESS的此类型方案,更轻量。基于 HTTP/2 传输。完整按 HTTP/2 标准实现,Caddy2做前置,隐藏代理特征,H2C协议转发到V2Ray,需要域名,暂不支持CloudFlare的CDN - - TCP传输协议 - WebSocket传输协议 - Http/2传输协议 - mKCP传输协议 - QUIC传输协议 - 参数设置 - 服务器端口: - 随机选择 - 若使用TLS加密,请保持默认的443端口 - 使用已有UUID,直接粘贴到框中 - QUIC密钥: - mKCP Seed: - 启用mKCP Seed密钥,可增强抗识别,留空则禁用,要求版本4.24.2+ - 路径: - VLESS ws路径: - VMESS tcp路径: - VMESS ws路径: - - QUIC加密方式: - 域名: - Trojan密码与UUID相同。 - 伪装网站: - 设置此项可增加代理的隐蔽(可为空) - 仅仅输入域名,不包括"http"及"/"等 - 仅仅禁止root账户使用密码登录,请确保root账户其他登录方式已生效 - 将启用root账户,并设置为密码登录 - 将启用或设置root账户为密钥证书登录 - 伪装网址输入格式错误!请重新输入! - 稳定性强,Caddy2做前置,隐藏代理特征,被识别为访问网站的https流量,抗封锁识别最强,需要域名,支持CDN - 基于 HTTP/2 传输。完整按 HTTP/2 标准实现,Caddy2做前置,隐藏代理特征,H2C协议转发到V2Ray,需要域名,暂不支持CloudFlare的CDN - 当前Xray是V2Ray的超集,未来与V2Ray会有不同的发展方向。 - VLESS over TCP with XTLS + 回落 and 分流 to WHATEVER(终极配置),由rprx大佬 (xtls作者) 配置并推荐,在服务端同时配置以下六种方案,共用同一域名与443端口,其中 WS 都可以通过 CDN。 - VLESS over TCP with XTLS + 回落 and 分流 to WHATEVER(终极配置),由rprx大佬 (xtls作者) 配置并推荐,在服务端同时配置以下五种方案,共用同一域名与443端口,其中 WS 都可以通过 CDN。(想增加XTLS方案请使用Xray配置) - TCP+Http伪装 - 数据加密传输,会被识别为未知的tcp流量 - 数据加密传输,并做http伪装,会被识别为http流量,但并不是真正的http访问 - 数据加密传输,传输协议使用TLS,会被识别为TLS流量,不等同于https流量特征 (需域名) - TCP+TLS(自签证书) - 数据加密传输,传输协议使用TLS,会被识别为TLS流量,不等同于https流量特征 (无需域名) - Shadowrocket (ios)需要手动打开“允许不安全”选项 - 数据加密传输,传输协议使用WebSocket,未启用TLS,将被识别为WebSocket流量。 - 数据加密传输,传输协议使用WebSocket,启用TLS,将被识别为TLS流量。(需要域名)支持CDN。 - WebSocket+TLS(自签证书) - 数据加密传输,传输协议使用WebSocket,启用TLS,将被识别为TLS流量。(无需域名) - 基于 HTTP/2 的传输方式。它完整按照 HTTP/2 标准实现,需要域名 - HTTP2(自签证书) - 基于 HTTP/2 的传输方式。它完整按照 HTTP/2 标准实现,使用自签名证书,不需要域名 - mKCP(无伪装) - 数据加密传输,以增加带宽占用,减少延迟,udp协议,无伪装,会被识别为udp流量 - 同mKCP(无伪装),增加伪装成 SRTP 数据包,会被识别为视频通话数据(如 FaceTime) - 同mKCP(无伪装),增加伪装成 uTP 数据包,会被识别为 BT 下载数据 - 同mKCP(无伪装),增加伪装成微信视频通话的数据包 - 同mKCP(无伪装),增加伪装成 DTLS 1.2 数据包 - 同mKCP(无伪装),增加伪装成 WireGuard 数据包。(并不是真正的 WireGuard 协议) - 提醒:Shadowrocket目前暂不支持QUIC的传输模式。 - QUIC(无伪装) - 数据加密传输,无伪装会被识别为udp流量,最初由谷歌创始,优点:减少延迟、多路复用、连接迁移 - 同QUIC(无伪装),增加伪装成 SRTP 数据包,会被识别为视频通话数据(如 FaceTime) - 同QUIC(无伪装),增加伪装成 uTP 数据包,会被识别为 BT 下载数据 - 同QUIC(无伪装),增加伪装成微信视频通话的数据包 - 同QUIC(无伪装),增加伪装成 DTLS 1.2 数据包 - 同QUIC(无伪装),增加伪装成 WireGuard 数据包。(并不是真正的 WireGuard 协议) - - 同步网络时间 - 将远程主机时间校正为网络时间,注意:本机电脑的时间必须也是与网络时间同步的,否则本机电脑V2ray有可能连接出错 推荐:优先使用此方法校对时间 - 同步本机时间 - 将远程主机时间同步为本地时间,注意:本机电脑的时间必须是准确的,与网络时间同步的,否则其他客户端中,有可能连接出错 使用网络校时无法校对时间时,使用此种方法 - 更新本机时间 - 将本机电脑时间与网络时间同步。 注意:使用此项功能,必须以管理员身份运行本程序 - 检测时间误差 - 校对时间 - - 客户端配置参数 - 服务器地址(address): - 端口(port): - 用户ID(uuid)/密码: - 复制 - 已复制到剪贴板中! - 空内容! - 额外ID: - 不超过64,客户端没此项可不填 - 加密方式: - 传输协议: - 伪装类型(混淆): - TLS设置: - 提示:双击以上内容窗,即可复制到剪贴板中。 - 路径(Path): - QUIC密钥: - mKCP Seed: - 默认auto - 二维码/URL - 以上参数可以手动或扫描输入客户端,用于官方客户端的配置和相关文件已经存放入目录下,点击 确定 按扭可打开 - 二维码和URL链接可用于 v2rayN(windows) Qv2ray(windows) Qv2ray(windows) Shadowrocket(ios) v2rayNG(Android) 导入v2ray节点 注意:Vless协议需要手动输入配置参数,二维码和URL无效 - "可用于ShadowRocket (ios)、igniter(Android)、Qv2ray (windows) 扫码和导入url。注意:有的客户端可能不支持WebSocket模式。" - "可用于ShadowRocket (ios)、igniter(Android)、Qv2ray (windows) 扫码和导入url。注意:有的客户端可能不支持WebSocket模式。" - 用于NaiveSharp(windows)的URL导入链接 - 用于ShadowsocksR(windows)、SSRR(android)、Shadowrocket(ios)的扫码和URL导入链接 - 用于手机客户端shadowsocks(android)、Shadowrocket(ios)的扫码和URL导入链接 - 用于电脑客户端Shadowsocks (windows)的扫码和URL导入链接 - 用于Shadowsocks (windows)、shadowsocks(android)、Shadowrocket(ios)的扫码和URL导入链接 - 提醒: 电脑客户端Shadowsocks (windows)与手机客户端shadowsocks(android)、Shadowrocket(ios)的导入格式不兼容,请选择相应格式。 - 手机端 - 电脑端 - TG格式QR - TG格式URL(双击复制到剪切板中) - T.ME格式QR - T.ME格式URL(双击复制到剪切板中) - - - 主机地址、主机端口、用户名为必填项,不能为空!! - 连接端口含有非数字字符! - 登录密码为必填项,不能为空!! - 密钥文件为必填项,不能为空!! - 如果选择了代理,则代理地址与端口不能为空! - 如果代理需要登录,则代理登录的用户名与密码不能为空! - 远程主机连接信息有误,请检查! - 请先选择配置模板! - 发生错误,安装中断...... - 正在登录远程主机...... - 主机登录成功! - 检测是否运行在root权限下... - 请使用具有root权限的账户登录主机!! - 检测结果:OK! - 检测系统是否已经安装 - 远程主机已安装 - ,建议先执行卸载,或者重装系统,若强制安装有一定机率失败。是否强制重新安装? - 安装取消,退出 - 已选择强制安装 - 检测结果:未安装 - 检测系统是否符合安装要求...... - 当前系统内核版本为 - ,V2ray要求内核为2.6.23及以上。请升级内核再安装! - 系统内核版本不符合要求,安装失败!! - 系统缺乏必要的安装组件如:apt||dnf||yum||zypper||Syetemd,主机系统推荐使用:CentOS 7/8,Debian 8/9/10,Ubuntu 16.04及以上版本 - 系统环境不满足要求,安装失败!! - 检测结果:OK! - 检测到系统启用SELinux,且工作在严格模式下,需改为宽松模式!修改中...... - 修改完毕! - 校对时间...... - 本地时间与远程主机时间相差超过限制(90秒),请先用 '系统工具-->时间校对' 校对时间后再设置 - 时间较对失败...... - 时间差符合要求,OK! - 正在检测域名是否解析到当前VPS的IP上...... - 正在检测是否为纯ipv6主机...... - 未检测到有效的IP地址...... - 正在查找最快的Nat64网关...... - 未能找到有效的Nat64网关...... - 当前主机最快的Nat64网关为: - 正在设置Nat64网关...... - 正在删除Nat64网关...... - 解析正确!OK! - 检测当前主机为纯ipv6主机,目前暂不支持! - 域名未能正确解析到当前VPS的IP上!安装失败! - 域名未能正确解析到当前VPS的IP上,请检查!若解析设置正确,请等待生效后再重试安装。如果域名使用了CDN,请先关闭! - 检测端口占用情况...... - 80/443端口之一,或全部被占用,将强制停止占用80/443端口的程序? - 端口被占用,安装失败...... - 正在释放80/443端口...... - 80/443端口释放完毕! - 端口被占用,将强制停止占用此端口的程序? - 正在释放端口...... - 端口释放完毕! - 检测结果:未被占用! - 系统环境检测完毕,符合安装要求,开始布署...... - 开启防火墙相应端口...... - 正在安装 - 文件下载失败! - 编译中,请耐心等待............. - 安装失败,脚本运行出错! - 安装成功! - 安装完毕,上传配置文件...... - 正在安装acme.sh...... - acme.sh安装成功! - acme.sh安装失败!原因未知,请向开发者提问! - 申请域名证书...... - 证书申请成功! - 证书申请失败!原因未知,请向开发者提问! - 安装证书到 - 证书成功安装到 - 证书安装到 - 失败,原因未知,可以向开发者提问! - 安装Caddy...... - 检测结果:未安装Caddy! - 安装Caddy失败! - Caddy安装成功! - 正在为Http2Web模式升级Caddy v2.2.0测试版! - 上传Caddy配置文件...... - Caddy配置文件上传失败! - Caddy配置文件上传成功,OK! - 正在启动Caddy...... - Caddy启动成功! - Caddy启动失败! - 正在启动Caddy(第二次尝试)! - Caddy启动失败(第二次)!退出安装! - Caddy启动失败,原因未知!请向开发者问询! - 正在启动 - 启动成功! - 启动失败! - 正在第二次尝试启动 - 启动失败(第二次)!退出安装! - 启动失败,原因如上!请排查原因! - BBR测试...... - 正在启用BBR...... - BBR已经启用了! - 系统不满足启用BBR的条件,启用失败! - BBR 启用成功! - 生成客户端配置...... - 客户端配置获取失败! - 安装成功,祝你玩的愉快!! - 安装失败! - 发生错误! - 密码错误或用户名错误! - 请检查主机地址及端口是否正确,如果通过代理,请检查代理是否正常工作 - 所选密钥文件错误或者格式不对! - 使用密钥登录,密钥文件错误或用户名错误! - 主机地址错误,如果使用了代理,也可能是连接代理的端口错误! - 退出!原因:远程主机未安装 - 检测到使用旧安装脚本的V2Ray...... - 检测到使用旧安装脚本的V2Ray,是否卸载旧版本并使用新安装脚本重新安装? - 正在卸载旧版本...... - 卸载旧版本,OK! - 安装新版本...... - 迁移原配置文件。 - 已更新到最新版本。 - 远程主机当前版本为:v - 最新版本为: - 是否升级为最新版本? - 正在升级到最新版本 - 升级成功!当前已是最新版本! - 升级失败,原因未知,请向开发者提问! - 升级取消,退出! - 远程主机当前已是最新版本: - 无需升级!退出! - 域名不能为空,请检查相关参数设置! - 请在x86_64系统中安装 - 备份Trojan配置文件...... - 恢复Trojan配置文件...... - "远程主机已安装Caddy,但不确定是否支持forward proxy,是否强制重新安装?" - 请先行卸载Caddy或重装VPS系统! - 正在安装依赖的软件...... - 安装完毕!OK! - 正在安装Caddy..... - 正在为NaiveProxy升级服务端 - 升级完毕,OK! - 正在优化网络参数...... - 优化网络参数,OK! - - 此文件为Xay官方程序所使用的客户端配置文件,配置为全局模式,socks5地址:127.0.0.1:1080,http代理地址:127.0.0.1:1081 - Xray官方网站:https://github.com/XTLS/Xray-core - Xray官方程序下载地址:https://github.com/XTLS/Xray-core/releases - 下载相应版本,Windows选择xray-windows-64.zip或者xray-windows-32.zip,解压后提取xray.exe。与config.json放在同一目录,运行xray.exe即可。 - - - 此文件为V2Ray官方程序所使用的客户端配置文件,配置为全局模式,socks5地址:127.0.0.1:1080,http代理地址:127.0.0.1:1081 - v2ray官方网站:https://www.v2ray.com/ - v2ray官方程序下载地址:https://github.com/v2ray/v2ray-core/releases - 下载相应版本,Windows选择v2ray-windows-64.zip或者v2ray-windows-32.zip,解压后提取v2ctl.exe和v2ray.exe。与config.json放在同一目录,运行v2ray.exe即可。 - - 此文件为v2rayN(windows)、Qv2ray(windows)、v2rayNG(Android)、Shadowrocket(ios)扫码导入节点 - v2rayN下载网址:https://github.com/2dust/v2rayN/releases - Qv2ray下载网址:https://github.com/Qv2ray/Qv2ray/releases - v2rayNG(Android)下载网址:https://github.com/2dust/v2rayNG/releases - v2rayNG(Android)在Google Play下载网址:https://play.google.com/store/apps/details?id=com.v2ray.ang - Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。 - 此文件为v2rayN、Qv2ray、v2rayNG(Android)、Shadowrocket(ios)复制粘贴导入节点的vmess网址 - 服务器通用连接配置参数: - - 此文件为Trojan-go官方程序所使用的客户端配置文件,配置为全局模式,http与socks5地址:127.0.0.1:1080 - Trojan-go官方网站:https://github.com/p4gefau1t/trojan-go - Trojan-go官方程序下载地址:https://github.com/p4gefau1t/trojan-go/releases - 下载相应版本,Windows选择Trojan-go-x.xx-win.zip,解压后提取trojan-go.exe。与config.json放在同一目录,运行trojan-go.exe即可。 - 此文件为Qv2ray (windows)、igniter(Android)扫码导入节点 - Qv2ray (windows)下载网址:https://github.com/Qv2ray/Qv2ray/releases - igniter(Android)下载网址:https://github.com/trojan-gfw/igniter/releases - Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。 - 此文件为Qv2ray (windows)、igniter(Android)复制粘贴导入节点的网址 - 服务器通用连接配置参数 - - 此文件为Trojan官方程序所使用的客户端配置文件,配置为全局模式,http与socks5地址:127.0.0.1:1080 - Trojan官方网站:https://trojan-gfw.github.io/trojan/ - Trojan官方程序下载地址:https://github.com/trojan-gfw/trojan/releases - 下载相应版本,Windows选择Trojan-x.xx-win.zip,解压后提取trojan.exe。与config.json放在同一目录,运行trojan.exe即可。 - 此文件为Qv2ray (windows)、igniter(Android)、Shadowrocket(ios)扫码导入节点 - Qv2ray (windows)下载网址:https://github.com/Qv2ray/Qv2ray/releases - igniter(Android)下载网址:https://github.com/trojan-gfw/igniter/releases - Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。 - 此文件为Qv2ray (windows)、igniter(Android)、Shadowrocket(ios)复制粘贴导入节点的网址 - 服务器通用连接配置参数 - - 此文件为NaiveProxy官方程序所使用的客户端配置文件,配置为全局模式,socks5地址:127.0.0.1:1080 - NaiveProxy官方网站:https://github.com/klzgrad/naiveproxy - NaiveProxy官方程序下载地址:https://github.com/klzgrad/naiveproxy/releases - 下载相应版本,Windows选择naiveproxy-x.xx-win.zip,解压后提取naive.exe。与config.json放在同一目录,运行naive.exe即可。 - 此文件为NaiveSharp(windows)复制粘贴导入节点的网址 - NaiveSharp(windows)下载网址:https://github.com/KevinZonda/NaiveSharp/releases - 服务器通用连接配置参数 - - 此文件为ShadowsocksR (windows)、SSRR(Android)、Shadowrocket(ios)扫码导入节点 - ShadowsocksR (windows)下载网址:https://github.com/shadowsocksrr/shadowsocksr-csharp/releases - SSRR(Android)下载网址:https://github.com/shadowsocksrr/shadowsocksr-android/releases - Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。 - 此文件为ShadowsocksR (windows)、SSRR(Android)、Shadowrocket(ios)复制粘贴导入节点的网址 - 服务器通用连接配置参数 - - 此文件为Shadowsocks (windows)扫码导入节点 - 此文件为Shadowsocks (windows)复制粘贴导入节点的网址 - 此文件为shadowsocks(Android)、Shadowrocket(ios)扫码导入节点 - Shadowsocks (windows)下载网址:https://github.com/shadowsocks/shadowsocks-windows/releases - shadowsocks(Android)下载网址:https://github.com/shadowsocks/shadowsocks-android/releases - Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。 - 此文件为shadowsocks(Android)、Shadowrocket(ios)复制粘贴导入节点的网址 - 服务器通用连接配置参数 - 插件使用说明 - ProxySU默认所有插件,在Shadowsocks (windows)运行文件所在文件夹的子文件夹plugins下。 - 电脑端手动安装插件说明 - 先下载插件,各个插件Windows客户端下载地址为: - Simple-obfs: https://github.com/shadowsocks/simple-obfs/releases 只下载 obfs-local.zip - 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为数字,是版本号) - Kcptun-plugin: https://github.com/shadowsocks/kcptun/releases 64位系统选择:kcptun-windows-amd64-xxxxxx.tar.gz,32位系统选择:kcptun-plugin-windows-386-xxxxxx.tar.gz (x为数字,是版本号) - 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为数字,是版本号) - 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为数字,是版本号) - 在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 - 安装完毕 - 手机安卓客户端插件安装说明 - 先下载插件,各个插件安卓客户端下载地址为: - Simple-obfs: https://github.com/shadowsocks/simple-obfs-android/releases 只下载 obfs-local-nightly-x.x.x.apk(x为数字,是版本号) - V2ray-plugin: https://github.com/shadowsocks/v2ray-plugin-android/releases 一般选择v2ray--universal-x.x.x.apk(x为数字,是版本号) - Kcptun-plugin: https://github.com/shadowsocks/kcptun-android/releases 一般选择kcptun--universal-x.x.x.apk(x为数字,是版本号) - 将上述apk文件传到手机,安装即可! - - - - \ No newline at end of file diff --git a/ProxySU/Translations/ProxySU.zh-TW.xaml b/ProxySU/Translations/ProxySU.zh-TW.xaml deleted file mode 100644 index 3b98e2e..0000000 --- a/ProxySU/Translations/ProxySU.zh-TW.xaml +++ /dev/null @@ -1,488 +0,0 @@ - - - 最新版本已發布了,快去更新一下吧! - 正在下載最新版,請等待完成提示.... - 最新版下載失敗,請稍後重試! - 下載最新版成功,文件已存入當前ProxySU.exe同一目錄 - 下載更新 - Languages: - 應用佈署 - 資源工具 - 免翻網址資源 - 常見問題 - 主機: - IP或域名(不可為空) - 端口: - 用戶: - 密碼: - 密鑰:: - 密鑰文件存放路徑(不可為空) - 瀏覽... - 密碼登錄 - 密鑰登錄 - 無代理 - 不需登錄 - 需要登錄 - 代理地址: - Email - 申請SSL證書需要一個可用的Email地址 - 安裝日誌另存為... - 等待安裝佈署 - 系統工具 - - Xray模板庫 - Xray一鍵安裝 - 升級Xay - - V2Ray模板庫 - V2ray一鍵安裝 - 升級V2Ray - 取消 - Trojan-Go參數設置 - Trojan-Go一鍵安裝 - 升級Trojan-Go - 取消 - 當前所選方案: - 未選擇方案 - - 參數設置 - 模式:Trojan+TLS+Caddy - 服務器地址(域名): - 端口:443 - 域名不可為空 - 密碼: - 更新 - Trojan一鍵安裝 - 升級Trojan - 取消 - - 模式:NaiveProxy+TLS+Caddy - 隨機 - NaiveProxy一鍵安裝 - 取消 - - 模式:SSR+TLS+Caddy - SSR一鍵安裝 - - - 模式:MTProto+TLS - MTProto一鍵安裝 - 偽裝域名: - 推薦用常見https端口443、2053、2083、2087、2096、8443 - 密鑰將由服務端隨機生成,這裡無需設置。 - - - SS 一鍵安裝 - SS 插件庫 - 經典模式 - 提示:這種模式,長時間,大流量使用,容易被阻斷和乾擾,不推薦使用! - SS 經典 - SS經典使用模式,無需域名,數據高強度加密,數據被識別為未知數據。目前流量容易被識別,極易被干擾與阻斷,慎重使用!放在這裡僅僅只是一種情懷與致敬! - Simple-obfs 插件 - 提示:這是SS早期使用的流量混淆方案,插件已經長時間不再更新,不推薦使用! - SS+obfs+http+Web - 無需域名,數據高強度加密,流量混淆為http(並非真正的http),使用Web網站偽裝,可在一定程度上增強抗識別!不支持CDN。 - SS+obfs+TLS(https)+Web - 需要域名,使用域名將很大增強抗識別,數據高強度加密,流量混淆為https(並非真正的https),​​使用Web網站偽裝,進一步增強抗識別!不支持CDN。 - V2Ray 插件 - 提醒:ShadowRocket(ios)不支持SS+Quic模式 - SS+WebSocket+TLS+Caddy(Web後置) - SS+WebSocket+TLS+Caddy(Web前置) - 提示:上面方案中的Web前置與Web後置,使用效果上沒有差別,Web後置方案,TLS證書由acme.sh申請,證書到期後, acme.sh會自動續期,但是需要手動重啟SS加載新證書。而Web前置方案中的證書由Caddy自動申請並加載,不需要重啟SS。 - SS+QUIC - 通過V2Ray-Plugin使用QUIC協議傳輸,強制使用TLS加密。數據加密傳輸,被識別為udp流量,最初由谷歌創始,優點:減少延遲、多路復用、連接遷移,需要域名, - - kcptun 插件 - 提醒:Shadowrocket(ios)不支持GoQuiet-plugin插件。 shadowsocks(Android)不支持GoQuiet-plugin與Cloak-plugin插件 - KCP是一個快速可靠協議,能以比TCP浪費10%-20%的帶寬的代價,換取平均延遲降低30%-40%,且最大延遲降低三倍的傳輸效果。使用UDP協議傳輸,數據高強度加密,傳輸同樣的內容,kcp 一般比TCP 消耗更多的流量,在丟包率高的線路下將極大提高網速,在個別運營商處可能會被QOS限制。 - 基本原理為模擬TLS的流量同時將服務器偽裝成一個正常的網站服務器,這個混淆思路並非首創:simple-obfs和ShadowsocksR的tls1.2_ticket_auth模式證明這條道是行得通的。此插件對現有的方法進行了改善,其目標為讓大規模封鎖HTTPS服務器(甚至IP段)成為封鎖SS的唯一有效手段 - 通過加密方式將代理流量混淆為合法的HTTPS流量,並將代理服務器偽裝成普通的Web服務器以規避互聯網審查。可以看成是上面GoQuiet升級版,優化網絡連接速度,並且不是混淆https而是真正的https流量。 - 插件程序: - 插件選項: - 使用編譯方式,時間稍長,請耐心等待...... - - - 校對時間 - 釋放80/443端口 - 啟用BBR - 卸載代理 - 啟用root密碼登錄 - root禁止密碼登錄 - 啟用root證書密鑰登錄 - 僅支持卸載由ProxySU安裝的代理軟件及相關配置,請確保重要配置已備份。不支持卸載使用其他方法或腳本安裝的代理。確定要卸載遠程主機上的代理軟件嗎? - 本功能需要當前登錄的賬戶具有sudo權限,是否為遠程主機啟用root賬戶並設置密碼? - 本功能需要當前登錄的賬戶具有root或者sudo權限,是否為遠程主機啟用root證書密鑰登錄? - 本功能需要遠程主機已經開啟了其他登錄方式,如密鑰方式等,否則將可能造成遠程主機無法連接,是否禁止遠程主機的root賬戶密碼登錄方式? - 正在關閉root賬戶密碼登錄方式..... - 遠程主機root賬戶密碼登錄方式已關閉! - 遠程主機root賬戶證書密鑰登錄已啟用,密鑰文件rootuser.key保存在隨後打開的文件夾中! - 當前賬戶已經具有root權限,無需再設置! - 當前賬戶無法獲取sudo權限,設置失敗! - 生成20位隨機密碼! - 保存密碼信息! - 正在生成密鑰...... - 正在下載密鑰...... - 遠程主機啟用密鑰登錄....... - 遠程主機Root賬戶密碼登錄已啟用,密碼保存在隨後打開的文件夾中! - 開始卸載...... - 檢測到已安裝 - 卸載失敗!請向開發者問詢! - 卸載成功! - - 主頁 - 前進 - 後退 - 由於眾所周知的原因,在某些時候,加載緩慢,請耐心等待一下 - - Trojan-go 模板庫 - http/2傳輸,Caddy2偽裝網站,抗識別,暫不支持CloudFlare的CDN - 使用WebSocket傳輸,Caddy2偽裝網站,抗識別,支持CloudFlare的CDN - 參數設置 - 域名: - 端口: 443 - 密碼: - 使用已有密碼,直接粘貼到框中 - WebSocket路徑: - Mux多路復用 - 此處設置只對官方客戶端配置文件config.json有效,其他客戶端需手動設置,服務端自動適配。 - 此字段不出現在QR碼及分享URL中,客戶端需自行設置,服務端默認啟用自動適配。 - 確定 - 取消 - - V2Ray 模板庫 - 推薦方案 - 嚐鮮方案 - VLESS協議 - VLESS 是一個無狀態的輕量傳輸協議,與 VMess 不同,VLESS 不依賴於系統時間,認證方式同樣為 UUID,但不需要 alterId。目前 VLESS 沒有自帶加密,請用於可靠信道,如 TLS。優點:可以有效的降低主機資源消耗。目前 VLESS 不支持分享。 VLESS 處於公測階段,測試期間請確保客戶端與服務端的 v2ray-core 均為最新版本。 - XTLS 在低性能或沒有AES 硬解的設備上效果出眾,如在硬路由上換用XTLS,同樣跑滿CPU 時實現網速翻倍,或是相同網速時CPU 佔用率減半,而對於移動設備,計算量減少意味著省電。服務端客戶端版本要求4.29+ (需域名)不支持CDN。 - 輕量協議VLESS,佔用更少主機資源,數據TLS加密傳輸,用Caddy2在節點上做偽裝網站。適合配置低的VPS,或多人共用節點,服務端客戶端版本要求4.27+ (需域名)不支持CDN。 - 使用VLESS協議,與VMESS的此類型方案,更輕量。穩定性強,Caddy2做前置,隱藏代理特徵,被識別為訪問網站的https流量,抗封鎖識別最強,需要域名,支持CDN - 使用VLESS協議,與VMESS的此類型方案,更輕量。基於 HTTP/2 傳輸。完整按 HTTP/2 標準實現,Caddy2做前置,隱藏代理特徵,H2C協議轉發到V2Ray,需要域名,暫不支持CloudFlare的CDN - TCP傳輸協議 - WebSocket傳輸協議 - Http/2傳輸協議 - mKCP傳輸協議 - QUIC傳輸協議 - 參數設置 - 服務器端口: - 隨機選擇 - 若使用TLS加密,請保持默認的443端口 - 使用已有UUID,直接粘貼到框中 - QUIC密鑰: - mKCP Seed: - 啟用mKCP Seed密鑰,可增強抗識別,留空則禁用,要求版本4.24.2+ - 路徑: - VLESS ws路徑: - VMESS tcp路徑: - VMESS ws路徑: - QUIC加密方式: - 域名: - Trojan密碼與V2ray的UUID相同。 - 偽裝網站: - 設置此項可增加代理的隱蔽(可為空) - 僅僅輸入域名,不包括"http"及"/"等 - 僅僅禁止root賬戶使用密碼登錄,請確保root賬戶其他登錄方式已生效 - 將啟用root賬戶,並設置為密碼登錄 - 將啟用或設置root賬戶為密鑰證書登錄 - 偽裝網址輸入格式錯誤!請重新輸入! - 穩定性強,Caddy2做前置,隱藏代理特徵,被識別為訪問網站的https流量,抗封鎖識別最強,需要域名,支持CDN - 基於 HTTP/2 傳輸。完整按 HTTP/2 標準實現,Caddy2做前置,隱藏代理特徵,H2C協議轉發到V2Ray,需要域名,暫不支持CloudFlare的CDN - 當前Xray是V2Ray的超集,未來與V2Ray會有不同的發展方向。 - VLESS over TCP with XTLS + 回落and 分流to WHATEVER(終極配置),由rprx大佬(xtls作者)配置並推薦,在服務端同時配置以下六種方案,共用同一域名與443端口,其中 WS 都可以通過 CDN。 - VLESS over TCP with XTLS + 回落and 分流to WHATEVER(終極配置),由rprx大佬(xtls作者)配置並推薦,在服務端同時配置以下五種方案,共用同一域名與443端口,其中 WS 都可以通過 CDN。(想增加XTLS方案請使用Xray配置) - 數據加密傳輸,會被識別為未知的tcp流量 - TCP+Http偽裝 - 數據加密傳輸,並做http偽裝,會被識別為http流量,但並不是真正的http訪問 - 數據加密傳輸,傳輸協議使用TLS,會被識別為TLS流量,不等同於https流量特徵 (需域名) - TCP+TLS(自簽證書) - 數據加密傳輸,傳輸協議使用TLS,會被識別為TLS流量,不等同於https流量特徵 (無需域名) - Shadowrocket (ios)需要手動打開“允許不安全”選項 - 數據加密傳輸,傳輸協議使用WebSocket,未啟用TLS,將被識別為WebSocket流量。 - 數據加密傳輸,傳輸協議使用WebSocket,啟用TLS,將被識別為TLS流量。 (需要域名)支持CDN。 - WebSocket+TLS(自簽證書) - 數據加密傳輸,傳輸協議使用WebSocket,啟用TLS,將被識別為TLS流量。 (無需域名) - 基於 HTTP/2 的傳輸方式。它完整​​按照 HTTP/2 標準實現,需要域名 - HTTP2(自簽證書) - 基於 HTTP/2 的傳輸方式。它完整​​按照 HTTP/2 標準實現,使用自簽名證書,不需要域名 - mKCP(無偽裝) - 數據加密傳輸,以增加帶寬佔用,減少延遲,udp協議,無偽裝,會被識別為udp流量 - 同mKCP(無偽裝),增加偽裝成 SRTP 數據包,會被識別為視頻通話數據(如 FaceTime) - 同mKCP(無偽裝),增加偽裝成 uTP 數據包,會被識別為 BT 下載數據 - 同mKCP(無偽裝),增加偽裝成微信視頻通話的數據包 - 同mKCP(無偽裝),增加偽裝成 DTLS 1.2 數據包 - 同mKCP(無偽裝),增加偽裝成 WireGuard 數據包。 (並不是真正的 WireGuard 協議) - 提醒:Shadowrocket目前暫不支持QUIC的傳輸模式。 - QUIC(無偽裝) - 數據加密傳輸,無偽裝會被識別為udp流量,最初由谷歌創始,優點:減少延遲、多路復用、連接遷移 - 同QUIC(無偽裝),增加偽裝成 SRTP 數據包,會被識別為視頻通話數據(如 FaceTime) - 同QUIC(無偽裝),增加偽裝成 uTP 數據包,會被識別為 BT 下載數據 - 同QUIC(無偽裝),增加偽裝成微信視頻通話的數據包 - 同QUIC(無偽裝),增加偽裝成 DTLS 1.2 數據包 - 同QUIC(無偽裝),增加偽裝成 WireGuard 數據包。 (並不是真正的 WireGuard 協議) - - 同步網絡時間 - 將遠程主機時間校正為網絡時間,注意:本機電腦的時間必須也是與網絡時間同步的,否則本機電腦V2ray有可能連接出錯 推薦:優先使用此方法校對時間 - 同步本機時間 - 將遠程主機時間同步為本地時間,注意:本機電腦的時間必須是準確的,與網絡時間同步的,否則其他客戶端中,有可能連接出錯 使用網絡校時無法校對時間時,使用此種方法 - 更新本機時間 - 將本機電腦時間與網絡時間同步。 注意:使用此項功能,必須以管理員身份運行本程序 - 檢測時間誤差 - 校對時間 - - 客戶端配置參數 - 服務器地址(address): - 端口(port): - 用戶ID(uuid)/密碼: - 複製 - 已復製到剪貼板中! - 空內容! - 額外ID: - 不超過64,客戶端沒此項可不填 - 加密方式: - 傳輸協議: - 偽裝類型(混淆): - TLS設置: - 提示:雙擊以上內容窗,即可複製到剪貼板中。 - 路徑(Path): - mKCP Seed/QUIC密鑰: - 默認auto - 二維碼/URL - 以上參數可以手動或掃描輸入客戶端,用於官方客戶端的配置和相關文件已經存放入目錄下,點擊 確定 按扭可打開 - 二維碼和URL鏈接可用於 v2rayN(windows) Qv2ray(windows) Qv2ray(windows) Shadowrocket(ios) v2rayNG(Android) 導入v2ray節點 注意:Vless協議需要手動輸入配置參數,二維碼和URL無效 - "可用於ShadowRocket (ios)、igniter(Android)、Qv2ray (windows) 掃碼和導入url。注意:有的客戶端可能不支持WebSocket模式。" - "可用於ShadowRocket (ios)、igniter(Android)、Qv2ray (windows) 掃碼和導入url。注意:有的客戶端可能不支持WebSocket模式。" - 用於NaiveSharp(windows)的URL導入鏈接 - 用於ShadowsocksR(windows)、SSRR(android)、Shadowrocket(ios)的掃碼和導入URL導入鏈接 - 用於手機客戶端shadowsocks(android)、Shadowrocket(ios)的掃碼和URL導入鏈接 - 用於電腦客戶端Shadowsocks (windows)的掃碼和URL導入鏈接 - 用於Shadowsocks (windows)、shadowsocks(android)、Shadowrocket(ios)的掃碼和URL導入鏈接 - 提醒: 電腦客戶端Shadowsocks (windows)與手機客戶端shadowsocks(android)、Shadowrocket(ios)的導入格式不兼容,請選擇相應格式。 - 手機端 - 電腦端 - TG格式QR - TG格式URL(雙擊複製到剪切板中) - T.ME格式QR - T.ME格式URL(雙擊複製到剪切板中) - - 主機地址、主機端口、用戶名為必填項,不能為空!! - 連接端口含有非數字字符! - 登錄密碼為必填項,不能為空!! - 密鑰文件為必填項,不能為空!! - 如果選擇了代理,則代理地址與端口不能為空! - 如果代理需要登錄,則代理登錄的用戶名與密碼不能為空! - 遠程主機連接信息有誤,請檢查! - 請先選擇配置模板! - 發生錯誤,安裝中斷...... - 正在登錄遠程主機...... - 主機登錄成功! - 檢測是否運行在root權限下... - 請使用具有root權限的賬戶登錄主機! ! - 檢測結果:OK! - 檢測系統是否已經安裝 - 遠程主機已安裝 - ,建議先執行卸載,或者重裝系統,若強制安裝有一定機率失敗。是否強制重新安裝? - 安裝取消,退出 - 已選擇強制安裝 - 檢測結果:未安裝 - 檢測系統是否符合安裝要求...... - 當前系統內核版本為 - ,V2ray要求內核為2.6.23及以上。請升級內核再安裝! - 系統內核版本不符合要求,安裝失敗! ! - 系統缺乏必要的安裝組件如:apt||dnf||yum||zypper||Syetemd,主機系統推薦使用:CentOS 7/8,Debian 8/9/10 ,Ubuntu 16.04及以上版本 - 系統環境不滿足要求,安裝失敗! ! - 檢測結果:OK! - 檢測到系統啟用SELinux,且工作在嚴格模式下,需改為寬鬆模式!修改中...... - 修改完畢! - 校對時間...... - 本地時間與遠程主機時間相差超過限制(90秒),請先用 '系統工具-->時間校對' 校對時間後再設置 - 時間較對失敗...... - 時間差符合要求,OK! - 正在檢測域名是否解析到當前VPS的IP上...... - 正在檢測是否為純ipv6主機...... - 未檢測到有效的IP地址...... - 正在查找最快的Nat64網關...... - 未能找到有效的Nat64網關...... - 當前主機最快的Nat64網關為: - 正在設置Nat64網關...... - 正在刪除Nat64網關...... - 解析正確! OK! - 檢測當前主機為純ipv6主機,目前暫不支持! - 域名未能正確解析到當前VPS的IP上!安裝失敗! - 域名未能正確解析到當前VPS的IP上,請檢查!若解析設置正確,請等待生效後再重試安裝。如果域名使用了CDN,請先關閉! - 檢測端口占用情況...... - 80/443端口之一,或全部被佔用,將強制停止佔用80/443端口的程序? - 端口被佔用,安裝失敗...... - 正在釋放80/443端口...... - 80/443端口釋放完畢! - 端口被佔用,將強制停止佔用此端口的程序? - 正在釋放端口...... - 端口釋放完畢! - 檢測結果:未被佔用! - 系統環境檢測完畢,符合安裝要求,開始佈署...... - 開啟防火牆相應端口...... - 正在安裝 - 文件下載失敗! - 編譯中,請耐心等待............. - 安裝失敗,腳本運行出錯! - 安裝成功! - 安裝完畢,上傳配置文件...... - 正在安裝acme.sh...... - acme.sh安裝成功! - acme.sh安裝失敗!原因未知,請向開發者提問! - 申請域名證書...... - 證書申請成功! - 證書申請失敗!原因未知,請向開發者提問! - 安裝證書到 - 證書成功安裝到 - 證書安裝到 - 失敗,原因未知,可以向開發者提問! - 安裝Caddy...... - 檢測結果:未安裝Caddy! - 安裝Caddy失敗! - Caddy安裝成功! - 正在為Http2Web模式升級Caddy v2.2.0測試版! - 上傳Caddy配置文件...... - Caddy配置文件上傳失敗! - Caddy配置文件上傳成功,OK! - 正在啟動Caddy...... - Caddy啟動成功! - Caddy啟動失敗! - 正在啟動Caddy(第二次嘗試)! - Caddy啟動失敗(第二次)!退出安裝! - Caddy啟動失敗,原因未知!請向開發者問詢! - 正在啟動 - 啟動成功! - 啟動失敗! - 正在第二次嘗試啟動 - 啟動失敗(第二次)!退出安裝! - 啟動失敗,原因如上!請排查原因! - BBR測試...... - 正在啟用BBR...... - BBR已經啟用了! - 系統不滿足啟用BBR的條件,啟用失敗! - BBR 啟用成功! - 生成客戶端配置...... - 客戶端配置獲取失敗! - 安裝成功,祝你玩的愉快! ! - 安裝失敗! - 發生錯誤! - 密碼錯誤或用戶名錯誤! - 請檢查主機地址及端口是否正確,如果通過代理,請檢查代理是否正常工作 - 所選密鑰文件錯誤或者格式不對! - 使用密鑰登錄,密鑰文件錯誤或用戶名錯誤! - 主機地址錯誤,如果使用了代理,也可能是連接代理的端口錯誤! - 退出!原因:遠程主機未安裝 - 檢測到使用舊安裝腳本的V2Ray...... - 檢測到使用舊安裝腳本的V2Ray,是否卸載舊版本並使用新安裝腳本重新安裝? - 正在卸載舊版本...... - 卸載舊版本,OK! - 安裝新版本...... - 遷移原配置文件。 - 已更新到最新版本。 - 遠程主機當前版本為:v - 最新版本為: - 是否升級為最新版本? - 正在升級到最新版本 - 升級成功!當前已是最新版本! - 升級失敗,原因未知,請向開發者提問! - 升級取消,退出! - 遠程主機當前已是最新版本: - 無需升級!退出! - 域名不能為空,請檢查相關參數設置! - 請在x86_64系統中安裝 - 備份Trojan配置文件...... - 恢復Trojan配置文件...... - "遠程主機已安裝Caddy,但不確定是否支持forward proxy,是否強制重新安裝?" - 請先行卸載Caddy或重裝VPS系統! - 正在安裝依賴的軟件...... - 安裝完畢! OK! - 正在安裝Caddy..... - 正在為NaiveProxy升級服務端 - 升級完畢,OK! - 正在優化網絡參數...... - 優化網絡參數,OK! - - 此文件為Xay官方程序所使用的客戶端配置文件,配置為全局模式,socks5地址:127.0.0.1:1080,http代理地址:127.0.0.1:1081 - Xray官方網站:https://github.com/XTLS/Xray-core - Xray官方程序下載地址:https://github.com/XTLS/Xray-core/releases - 下載相應版本,Windows選擇xray-windows-64.zip或者xray-windows-32.zip,解壓後提取xray.exe。與config.json放在同一目錄,運行xray.exe即可。 - - 此文件為V2Ray官方程序所使用的客戶端配置文件,配置為全局模式,socks5地址:127.0.0.1:1080,http代理地址:127.0.0.1:1081 - v2ray官方網站:https://www.v2ray.com/ - v2ray官方程序下載地址:https://github.com/v2ray/v2ray-core/releases - 下載相應版本,Windows選擇v2ray-windows-64.zip或者v2ray-windows-32.zip,解壓後提取v2ctl.exe和v2ray.exe。與config.json放在同一目錄,運行v2ray.exe即可。 - 此文件為v2rayN、Qv2ray、v2rayNG(Android)、Shadowrocket(ios)掃碼導入節點 - v2rayN下載網址:https://github.com/2dust/v2rayN/releases - Qv2ray下載網址:https://github.com/Qv2ray/Qv2ray/releases - v2rayNG(Android)下載網址:https://github.com/2dust/v2rayNG/releases - v2rayNG(Android)在Google Play下載網址:https://play.google.com/store/apps/details?id=com.v2ray.ang - Shadowrocket(ios)下載,需要使用國外區的AppleID。請自行谷歌方法。 - 此文件為v2rayN、Qv2ray、v2rayNG(Android)、Shadowrocket(ios)複製粘貼導入節點的vmess網址 - 服務器通用連接配置參數 - - 此文件為Trojan-go官方程序所使用的客戶端配置文件,配置為全局模式,http與socks5地址:127.0.0.1:1080 - Trojan-go官方網站:https://github.com/p4gefau1t/trojan-go - Trojan-go官方程序下載地址:https://github.com/p4gefau1t/trojan-go/releases - 下載相應版本,Windows選擇Trojan-go-x.xx-win.zip,解壓後提取trojan-go.exe。與config.json放在同一目錄,運行trojan-go.exe即可。 - 此文件為Qv2ray (windows)、igniter(Android)掃碼導入節點 - Qv2ray (windows)下載網址:https://github.com/Qv2ray/Qv2ray/releases - igniter(Android)下載網址:https://github.com/trojan-gfw/igniter/releases - Shadowrocket(ios)下載,需要使用國外區的AppleID。請自行谷歌方法。 - 此文件為Qv2ray (windows)、igniter(Android)複製粘貼導入節點的網址 - 服務器通用連接配置參數 - - 此文件為Trojan官方程序所使用的客戶端配置文件,配置為全局模式,http與socks5地址:127.0.0.1:1080 - Trojan官方網站:https://trojan-gfw.github.io/trojan/ - Trojan官方程序下載地址:https://github.com/trojan-gfw/trojan/releases - 下載相應版本,Windows選擇Trojan-x.xx-win.zip,解壓後提取trojan.exe。與config.json放在同一目錄,運行trojan.exe即可。 - 此文件為Qv2ray (windows)、igniter(Android)、Shadowrocket(ios)掃碼導入節點 - Qv2ray (windows)下載網址:https://github.com/Qv2ray/Qv2ray/releases - igniter(Android)下載網址:https://github.com/trojan-gfw/igniter/releases - Shadowrocket(ios)下載,需要使用國外區的AppleID。請自行谷歌方法。 - 此文件為Qv2ray (windows)、igniter(Android)、Shadowrocket(ios)複製粘貼導入節點的網址 - 服務器通用連接配置參數 - - 此文件為NaiveProxy官方程序所使用的客戶端配置文件,配置為全局模式,socks5地址:127.0.0.1:1080 - NaiveProxy官方網站:https://github.com/klzgrad/naiveproxy - NaiveProxy官方程序下載地址:https://github.com/klzgrad/naiveproxy/releases - 下載相應版本,Windows選擇naiveproxy-x.xx-win.zip,解壓後提取naive.exe。與config.json放在同一目錄,運行naive.exe即可。 - 此文件為NaiveSharp(windows)複製粘貼導入節點的網址 - NaiveSharp(windows)下載網址:https://github.com/KevinZonda/NaiveSharp/releases - 服務器通用連接配置參數 - - 此文件為ShadowsocksR (windows)、SSRR(Android)、Shadowrocket(ios)掃碼導入節點 - ShadowsocksR (windows)下載網址:https://github.com/shadowsocksrr/shadowsocksr-csharp/releases - SSRR(Android)下載網址:https://github.com/shadowsocksrr/shadowsocksr-android/releases - Shadowrocket(ios)下載,需要使用國外區的AppleID。請自行谷歌方法。 - 此文件為ShadowsocksR (windows)、SSRR(Android)、Shadowrocket(ios)複製粘貼導入節點的網址 - 服務器通用連接配置參數 - - 此文件為Shadowsocks (windows)掃碼導入節點 - 此文件為Shadowsocks (windows)複製粘貼導入節點的網址 - 此文件為shadowsocks(Android)、Shadowrocket(ios)掃碼導入節點 - Shadowsocks (windows)下載網址:https://github.com/shadowsocks/shadowsocks-windows/releases - shadowsocks(Android)下載網址:https://github.com/shadowsocks/shadowsocks-android/releases - Shadowrocket(ios)下載,需要使用國外區的AppleID。請自行谷歌方法。 - 此文件為shadowsocks(Android)、Shadowrocket(ios)複製粘貼導入節點的網址 - 服務器通用連接配置參數 - 插件使用說明 - ProxySU默認所有插件,在Shadowsocks (windows)運行文件所在文件夾的子文件夾plugins下。 - 電腦端手動安裝插件說明 - 先下載插件,各個插件Windows客戶端下載地址為: - Simple-obfs: https://github.com/shadowsocks/simple-obfs/releases 只下載 obfs-local.zip - 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為數字,是版本號) - Kcptun-plugin: https://github.com/shadowsocks/kcptun/releases 64位系統選擇:kcptun-windows-amd64-xxxxxx.tar.gz,32位系統選擇:kcptun-plugin-windows-386-xxxxxx.tar.gz (x為數字,是版本號) - GoQuiet-plugin: https://github.com/cbeuw/GoQuiet/releases 64位系統選擇:gq-client-windows-amd64-xxxexe,32位系統選擇: gq-client-windows-386-xxxexe(x為數字,是版本號) - Cloak-plugin: https://github.com/cbeuw/Cloak/releases 64位系統選擇:ck-client-windows-amd64-xxxexe,32位系統選擇: ck-client-windows-386-xxxexe(x為數字,是版本號) - 在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 - 安裝完畢 - 手機安卓客戶端插件安裝說明 - 先下載插件,各個插件安卓客戶端下載地址為: - Simple-obfs: https://github.com/shadowsocks/simple-obfs-android/releases 只下載obfs-local-nightly-xxxapk(x為數字,是版本號) - V2ray-plugin: https://github.com/shadowsocks/v2ray-plugin-android/releases 一般選擇v2ray--universal-xxxapk(x為數字,是版本號) - Kcptun-plugin: https://github.com/shadowsocks/kcptun-android/releases 一般選擇kcptun--universal-xxxapk(x為數字,是版本號) - 將上述apk文件傳到手機,安裝即可! - \ No newline at end of file diff --git a/ProxySU/TrojanGoTemplateWindow.xaml b/ProxySU/TrojanGoTemplateWindow.xaml deleted file mode 100644 index 1c59fa4..0000000 --- a/ProxySU/TrojanGoTemplateWindow.xaml +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ProxySU/TrojanGoTemplateWindow.xaml.cs b/ProxySU/TrojanGoTemplateWindow.xaml.cs deleted file mode 100644 index 59816c7..0000000 --- a/ProxySU/TrojanGoTemplateWindow.xaml.cs +++ /dev/null @@ -1,194 +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 -{ - /// - /// TrojanGoTemplateWindow.xaml 的交互逻辑 - /// - public partial class TrojanGoTemplateWindow : Window - { - public TrojanGoTemplateWindow() - { - InitializeComponent(); - RadioButtonTrojanGoTLS2Web.IsChecked = true; - CheckBoxMuxSelect.IsChecked = false; - GridTrojanGoMuxSelected.Visibility = Visibility.Collapsed; - TextBlockExplainCheckBoxMuxSelect.Visibility = Visibility.Collapsed; - } - private void ButtondDecide_Click(object sender, RoutedEventArgs e) - { - bool preDomainMask = ClassModel.PreDomainMask(TextBoxMaskSites.Text); - bool domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomain.Text); - - //if (string.IsNullOrEmpty(PreTrim(TextBoxDomain.Text)) == true) - //{ - // //****** "域名不能为空,请检查相关参数设置!" ****** - // MessageBox.Show(Application.Current.FindResource("MessageBoxShow_DomainNotEmpty").ToString()); - // return; - //} - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - //传递伪装网站 - MainWindow.ReceiveConfigurationParameters[7] = ClassModel.DisguiseURLprocessing(PreTrim(TextBoxMaskSites.Text)); - - //传递服务端口 - MainWindow.ReceiveConfigurationParameters[1] = "443"; - //传递密码(uuid) - MainWindow.ReceiveConfigurationParameters[2] = PreTrim(TextBoxNewUUID.Text); - 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] = PreTrim(TextBoxPath.Text); - } - //传递Mux的concurrency与idle_timeout - if (CheckBoxMuxSelect.IsChecked == true) - { - MainWindow.ReceiveConfigurationParameters[9] = "true"; - MainWindow.ReceiveConfigurationParameters[3] = PreTrim(TextBoxConcurrency.Text); - MainWindow.ReceiveConfigurationParameters[5] = PreTrim(TextBoxIdle_timeout.Text); - } - if (domainNotEmpty == true && preDomainMask == true) - { - 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(PreTrim(TextBoxDomain.Text)) == true) - // { - // //****** "域名不能为空,请检查相关参数设置!" ****** - // MessageBox.Show(Application.Current.FindResource("MessageBoxShow_DomainNotEmpty").ToString()); - // return false; - // } - // else - // { - // return true; - // } - //} - - private void CheckBoxMuxSelect_Checked(object sender, RoutedEventArgs e) - { - GridTrojanGoMuxSelected.Visibility = Visibility.Visible; - TextBlockExplainCheckBoxMuxSelect.Visibility = Visibility.Visible; - } - - private void CheckBoxMuxSelect_Unchecked(object sender, RoutedEventArgs e) - { - GridTrojanGoMuxSelected.Visibility = Visibility.Collapsed; - TextBlockExplainCheckBoxMuxSelect.Visibility = Visibility.Collapsed; - } - - //TextBox输入内容做预处理 - private string PreTrim(string preString) - { - return preString.Trim(); - } - - //处理伪装网站域名中的前缀 - //private string DisguiseURLprocessing(string fakeUrl) - //{ - //var uri = new Uri(fakeUrl); - //return uri.Host; - //if (fakeUrl.Length >= 7) - //{ - // string testDomainMask = fakeUrl.Substring(0, 7); - // if (String.Equals(testDomainMask, "https:/") || String.Equals(testDomainMask, "http://")) - // { - // string[] tmpUrl = fakeUrl.Split('/'); - // fakeUrl = tmpUrl[2]; - // } - - //} - //return fakeUrl; - // } - } -} diff --git a/ProxySU/V2RayTemplateWindow.xaml b/ProxySU/V2RayTemplateWindow.xaml deleted file mode 100644 index a3e0577..0000000 --- a/ProxySU/V2RayTemplateWindow.xaml +++ /dev/null @@ -1,390 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ProxySU/V2RayTemplateWindow.xaml.cs b/ProxySU/V2RayTemplateWindow.xaml.cs deleted file mode 100644 index 0b171a6..0000000 --- a/ProxySU/V2RayTemplateWindow.xaml.cs +++ /dev/null @@ -1,1146 +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.Windows.Forms; - -namespace ProxySU -{ - /// - /// WindowTemplateConfiguration.xaml 的交互逻辑 - /// - public partial class WindowTemplateConfiguration : Window - { - //QUIC 加密方法 - public class EncryptionMethodInfo - { - public string Name { get; set; } - public string Value { get; set; } - } - - public WindowTemplateConfiguration() - { - InitializeComponent(); - - #region 加密方法选择 初始设置为chacha20-poly1305 - List methodList = new List(); - - methodList.Add(new EncryptionMethodInfo { Name = "chacha20-poly1305", Value = "chacha20-poly1305" }); - methodList.Add(new EncryptionMethodInfo { Name = "aes-128-gcm", Value = "aes-128-gcm" }); - methodList.Add(new EncryptionMethodInfo { Name = "none", Value = "none" }); - - ComboBoxEncryptionMethodInfo.ItemsSource = methodList; - - ComboBoxEncryptionMethodInfo.DisplayMemberPath = "Name";//显示出来的值 - ComboBoxEncryptionMethodInfo.SelectedValuePath = "Value";//实际选中后获取的结果的值 - ComboBoxEncryptionMethodInfo.SelectedIndex = 0; - - DataContext = this; - #endregion - - //隐藏QUIC密钥 - FirstQuicHideEncryption(); - RadioButtonVMESSmKCP.IsChecked = true; - } - //取消不在当前活动选项卡中的其他所有选项卡中的所有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 ButtondDecide_Click(object sender, RoutedEventArgs e) - { - bool preDomainMask = ClassModel.PreDomainMask(TextBoxMaskSites.Text); - bool domainNotEmpty = true; - - #region TCP 传输协议(VMESS) - - //TCP模式被选中 - if (RadioButtonTCP.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "TCP"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonTCP.Content.ToString(); - - } - - //TCP+http伪装模式被选中 - else if (RadioButtonTCPhttp.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "TCPhttp"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonTCPhttp.Content.ToString(); - //伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "http"; - - } - - //TCP+TLS模式被选中 - else if (RadioButtonTCP2TLS.IsChecked == true) - { - domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomain.Text); - - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "tcpTLS"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonTCP2TLS.Content.ToString(); - - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - - } - - //tcp+TLS(自签证书)模式被选中 - else if (RadioButtonTcpTLS2SelfSigned.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "tcpTLSselfSigned"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonTcpTLS2SelfSigned.Content.ToString(); - - //传递域名 - // MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - - } - - #endregion - - #region VLESS协议 - - //VLESS+TCP+XTLS+Web模式选中 - else if (RadioButtonVlessXtlsTcp.IsChecked == true) - { - domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomain.Text); - - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "VlessXtlsTcp"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonVlessXtlsTcp.Content.ToString(); - - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - //传递伪装网站 - MainWindow.ReceiveConfigurationParameters[7] = ClassModel.DisguiseURLprocessing(PreTrim(TextBoxMaskSites.Text)); - - } - - //VLESS+TCP+TLS+Web模式选中 - else if (RadioButtonVlessTcpTlsWeb.IsChecked == true) - { - domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomain.Text); - - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "VlessTcpTlsWeb"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonVlessTcpTlsWeb.Content.ToString(); - - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - //传递伪装网站 - MainWindow.ReceiveConfigurationParameters[7] = ClassModel.DisguiseURLprocessing(PreTrim(TextBoxMaskSites.Text)); - - } - - //VLESS+WebSocket+TLS+Web模式选中 - else if (RadioButtonVlessWebSocketTlsWeb.IsChecked == true) - { - domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomain.Text); - - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "VlessWebSocketTlsWeb"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonVlessWebSocketTlsWeb.Content.ToString(); - - //传递路径 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxPath.Text); - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - //传递伪装网站 - MainWindow.ReceiveConfigurationParameters[7] = ClassModel.DisguiseURLprocessing(PreTrim(TextBoxMaskSites.Text)); - } - - //VLESS+http2+TLS+Web模式选中 - else if (RadioButtonVlessHttp2Web.IsChecked == true) - { - domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomain.Text); - - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "VlessHttp2Web"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonVlessHttp2Web.Content.ToString(); - - //传递路径 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxPath.Text); - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - //传递伪装网站 - MainWindow.ReceiveConfigurationParameters[7] = ClassModel.DisguiseURLprocessing(PreTrim(TextBoxMaskSites.Text)); - } - - //VLESS+VMESS+Trojan+XTLS+TCP+WebSocket+Web模式被选中 - else if (RadioButtonVlessVmessXtlsTcpWebSocketHot.IsChecked == true) - { - domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomain.Text); - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "VlessVmessXtlsTcpWebSocketWeb"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonVlessVmessXtlsTcpWebSocketHot.Content.ToString(); - //传递路径 - MainWindow.ReceiveConfigurationParameters[3] = PreTrim(TextBoxPathVlessWS.Text);//VLESS ws Path - MainWindow.ReceiveConfigurationParameters[9] = PreTrim(TextBoxPathVmessTcp.Text);//VMESS tcp Path - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxPathVmessWS.Text);//VMESS ws Path - - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - //传递混淆方式(VMESS TCP Path方式所用) - MainWindow.ReceiveConfigurationParameters[5] = "http"; - //传递伪装网站 - MainWindow.ReceiveConfigurationParameters[7] = ClassModel.DisguiseURLprocessing(PreTrim(TextBoxMaskSites.Text)); - - } - - #endregion - - #region WebSocket传输协议(VMESS) - - //webSocket模式被选中 - else if (RadioButtonWebSocket.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "webSocket"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonWebSocket.Content.ToString(); - - } - - //WebSocket+TLS模式被选中 - else if (RadioButtonWebSocketTLS.IsChecked == true) - { - domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomain.Text); - - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "WebSocketTLS"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonWebSocketTLS.Content.ToString(); - //传递路径 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxPath.Text); - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - - } - - //WebSocket+TLS+Web模式被选中 - else if (RadioButtonWebSocketTLS2Web.IsChecked == true|| RadioButtonWebSocketTLS2WebHot.IsChecked==true) - { - domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomain.Text); - - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "WebSocketTLS2Web"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonWebSocketTLS2Web.Content.ToString(); - - //传递路径 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxPath.Text); - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - //传递伪装网站 - MainWindow.ReceiveConfigurationParameters[7] = ClassModel.DisguiseURLprocessing(PreTrim(TextBoxMaskSites.Text)); - - } - - //WebSocket+TLS(自签证书)模式被选中 - else if (RadioButtonWebSocketTLSselfSigned.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "WebSocketTLSselfSigned"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonWebSocketTLSselfSigned.Content.ToString(); - - //传递路径 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxPath.Text); - //传递域名 - //MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - - } - - #endregion - - #region http2传输协议(VMESS) - - //http2模式被选中 - else if (RadioButtonHTTP2.IsChecked == true) - { - domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomain.Text); - - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "Http2"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonHTTP2.Content.ToString(); - - //传递路径 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxPath.Text); - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - - } - - //http2+TLS+Web模式被选中 - else if (RadioButtonHTTP2Web.IsChecked == true || RadioButtonHTTP2WebHot.IsChecked == true) - { - domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomain.Text); - - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "http2Web"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonHTTP2Web.Content.ToString(); - - //传递路径 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxPath.Text); - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - //传递伪装网站 - MainWindow.ReceiveConfigurationParameters[7] = ClassModel.DisguiseURLprocessing(PreTrim(TextBoxMaskSites.Text)); - - } - - //http2(自签证书)模式被选中 - else if (RadioButtonHTTP2selfSigned.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "http2selfSigned"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonHTTP2selfSigned.Content.ToString(); - - //传递路径 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxPath.Text); - //传递域名 - //MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - - } - - #endregion - - #region mKCP 传输协议 (VMESS) - - //mKCP无伪装模式被选中 - else if (RadioButtonMkcpNone.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "mKCPNone"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonMkcpNone.Content.ToString(); - //传递伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "none"; - //传递mKCP Seed - if (String.IsNullOrEmpty(PreTrim(TextBoxQuicAndMkcpSeedUUID.Text)) ==false) - { - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxQuicAndMkcpSeedUUID.Text); - } - } - - //mKCP+srtp伪装模式被选中 - else if (RadioButton2mKCP2SRTP.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "mKCP2SRTP"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButton2mKCP2SRTP.Content.ToString(); - //传递伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "srtp"; - //传递mKCP Seed - if (String.IsNullOrEmpty(PreTrim(TextBoxQuicAndMkcpSeedUUID.Text)) == false) - { - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxQuicAndMkcpSeedUUID.Text); - } - } - - //mKCP+utp伪装模式被选中 - else if (RadioButton2mKCPuTP.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "mKCPuTP"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButton2mKCPuTP.Content.ToString(); - //传递伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "utp"; - //传递mKCP Seed - if (String.IsNullOrEmpty(PreTrim(TextBoxQuicAndMkcpSeedUUID.Text)) == false) - { - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxQuicAndMkcpSeedUUID.Text); - } - } - - //mKCP+wechat-video伪装模式被选中 - else if (RadioButton2mKCP2WechatVideo.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "mKCP2WechatVideo"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButton2mKCP2WechatVideo.Content.ToString(); - //传递伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "wechat-video"; - //传递mKCP Seed - if (String.IsNullOrEmpty(PreTrim(TextBoxQuicAndMkcpSeedUUID.Text)) == false) - { - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxQuicAndMkcpSeedUUID.Text); - } - } - - //mKCP+dtls伪装模式被选中 - else if (RadioButton2mKCP2DTLS.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "mKCP2DTLS"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButton2mKCP2DTLS.Content.ToString(); - //传递伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "dtls"; - //传递mKCP Seed - if (String.IsNullOrEmpty(PreTrim(TextBoxQuicAndMkcpSeedUUID.Text)) == false) - { - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxQuicAndMkcpSeedUUID.Text); - } - } - - //mKCP+wireguard伪装模式被选中 - else if (RadioButton2mKCP2WireGuard.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "mKCP2WireGuard"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButton2mKCP2WireGuard.Content.ToString(); - //传递伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "wireguard"; - //传递mKCP Seed - if (String.IsNullOrEmpty(PreTrim(TextBoxQuicAndMkcpSeedUUID.Text)) == false) - { - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxQuicAndMkcpSeedUUID.Text); - } - } - - #endregion - - #region QUIC传输协议(VMESS) - - //QUIC无伪装模式被选中 - else if (RadioButtonQuicNone.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "QuicNone"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonQuicNone.Content.ToString(); - //传递伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "none"; - //QUIC 密钥 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxQuicAndMkcpSeedUUID.Text); - //QUIC加密方法 - MainWindow.ReceiveConfigurationParameters[3] = GetEncryptionMethodSS(); - } - - //QUIC+srtp伪装模式被选中 - else if (RadioButtonQuicSRTP.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "QuicSRTP"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonQuicSRTP.Content.ToString(); - //传递伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "srtp"; - //QUIC 密钥 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxQuicAndMkcpSeedUUID.Text); - //QUIC加密方法 - MainWindow.ReceiveConfigurationParameters[3] = GetEncryptionMethodSS(); - } - - //QUIC+utp伪装模式被选中 - else if (RadioButtonQuic2uTP.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "Quic2uTP"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonQuic2uTP.Content.ToString(); - //传递伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "utp"; - //QUIC 密钥 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxQuicAndMkcpSeedUUID.Text); - //QUIC加密方法 - MainWindow.ReceiveConfigurationParameters[3] = GetEncryptionMethodSS(); - } - - //QUIC+wechat-video伪装模式被选中 - else if (RadioButtonQuicWechatVideo.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "QuicWechatVideo"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonQuicWechatVideo.Content.ToString(); - //传递伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "wechat-video"; - //QUIC 密钥 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxQuicAndMkcpSeedUUID.Text); - //QUIC加密方法 - MainWindow.ReceiveConfigurationParameters[3] = GetEncryptionMethodSS(); - } - - //QUIC+dtls伪装模式被选中 - else if (RadioButtonQuicDTLS.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "QuicDTLS"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonQuicDTLS.Content.ToString(); - //传递伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "dtls"; - //QUIC 密钥 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxQuicAndMkcpSeedUUID.Text); - //QUIC加密方法 - MainWindow.ReceiveConfigurationParameters[3] = GetEncryptionMethodSS(); - } - - //QUIC+wireguard伪装模式被选中 - else if (RadioButtonQuicWireGuard.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "QuicWireGuard"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonQuicWireGuard.Content.ToString(); - //传递伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "wireguard"; - //QUIC 密钥 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxQuicAndMkcpSeedUUID.Text); - //QUIC加密方法 - MainWindow.ReceiveConfigurationParameters[3] = GetEncryptionMethodSS(); - } - - #endregion - - //传递服务端口 - MainWindow.ReceiveConfigurationParameters[1] = PreTrim(TextBoxServerListenPort.Text); - //传递uuid - MainWindow.ReceiveConfigurationParameters[2] = PreTrim(TextBoxNewUUID.Text); - - if (RadioButtonVLESSmKCP.IsChecked == true) - { - MainWindow.mKCPvlessIsSet = true; - } - else - { - MainWindow.mKCPvlessIsSet = false; - } - - if (domainNotEmpty == true && preDomainMask == true) - { - this.Close(); - } - - } - - //取消选择返回主窗口 - private void ButtondCancel_Click(object sender, RoutedEventArgs e) => Close(); - - - //伪装网站处理 - //DisguiseURLprocessing(string fakeUrl); - // private string DisguiseURLprocessing(string fakeUrl) - //{ - //var uri = new Uri(fakeUrl); - //return uri.Host; - //Console.WriteLine(uri.Host); - - ////处理伪装网站域名中的前缀 - //if (fakeUrl.Length >= 7) - //{ - // string testDomainMask = fakeUrl.Substring(0, 7); - // if (String.Equals(testDomainMask, "https:/") || String.Equals(testDomainMask, "http://")) - // { - // string[] tmpUrl = fakeUrl.Split('/'); - // fakeUrl = tmpUrl[2]; - // } - - //} - - //} - - #region 其他设置中的界面控制 - - private void RadioButtonTCP_Checked(object sender, RoutedEventArgs e) - { - //隐藏mKCP项 - HideMkcpSeed(); - - //隐藏QUIC密钥 - HideQuic(); - - //隐藏Path - HidePath(); - HideVlessVmessMultiplePath(); - - //隐藏域名 - HideDomain(); - - //隐藏伪装网站 - HideMaskSites(); - - - //Guid uuid = Guid.NewGuid(); - TextBoxNewUUID.Text = GenerateRandomUUID(); - //Random random = new Random(); - int randomServerPort = GetRandomPort(); - TextBoxServerListenPort.Text = randomServerPort.ToString(); - //清除其他选项卡中的选项 - UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); - } - private void RadioButtonTCPhttp_Checked(object sender, RoutedEventArgs e) - { - TextBoxServerListenPort.Text = "80"; - - //隐藏mKCP项 - HideMkcpSeed(); - - //隐藏QUIC密钥 - HideQuic(); - - //隐藏Path - HidePath(); - HideVlessVmessMultiplePath(); - - //隐藏域名 - HideDomain(); - - //隐藏伪装网站 - HideMaskSites(); - - //Guid uuid = Guid.NewGuid(); - TextBoxNewUUID.Text = GenerateRandomUUID(); - //清除其他选项卡中的选项 - UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); - } - private void RadioButtonTCP2TLS_Checked(object sender, RoutedEventArgs e) - { - TextBoxServerListenPort.Text = "443"; - - //隐藏mKCP项 - HideMkcpSeed(); - - //隐藏QUIC密钥 - HideQuic(); - - //隐藏Path - HidePath(); - HideVlessVmessMultiplePath(); - - //显示域名 - ShowDomain(); - - //隐藏伪装网站 - HideMaskSites(); - - //Guid uuid = Guid.NewGuid(); - TextBoxNewUUID.Text = GenerateRandomUUID(); - //清除其他选项卡中的选项 - UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); - } - private void RadioButtonVlessTcpTlsWeb_Checked(object sender, RoutedEventArgs e) - { - TextBoxServerListenPort.Text = "443"; - - //隐藏mKCP项 - HideMkcpSeed(); - - //隐藏QUIC密钥 - HideQuic(); - - //隐藏Path - HidePath(); - HideVlessVmessMultiplePath(); - - //显示域名 - ShowDomain(); - - //显示伪装网站 - ShowMaskSites(); - - //Guid uuid = Guid.NewGuid(); - TextBoxNewUUID.Text = GenerateRandomUUID(); - //清除其他选项卡中的选项 - UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); - } - private void RadioButtonVlessVmessXtlsTcpWebSocketHot_Checked(object sender, RoutedEventArgs e) - { - TextBoxServerListenPort.Text = "443"; - - //隐藏mKCP项 - HideMkcpSeed(); - - //隐藏QUIC密钥 - HideQuic(); - - //显示复合路径 - ShowVlessVmessMultiplePath(); - - //显示域名 - ShowDomain(); - - //显示伪装网站 - ShowMaskSites(); - - //生成UUID - TextBoxNewUUID.Text = GenerateRandomUUID(); - - //清除其他选项卡中的选项 - UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); - } - //单击TextBlockVlessVmessXtlsTcpWebSocket标签则选中RadioButtonVlessVmessXtlsTcpWebSocketHot - private void TextBlockVlessVmessXtlsTcpWebSocket_MouseDown(object sender, MouseButtonEventArgs e) - { - RadioButtonVlessVmessXtlsTcpWebSocketHot.IsChecked = true; - } - private void RadioButtonTCP2TLSnoDomain_Checked(object sender, RoutedEventArgs e) - { - TextBoxServerListenPort.Text = "443"; - - //隐藏mKCP项 - HideMkcpSeed(); - - //隐藏QUIC密钥 - HideQuic(); - - //隐藏Path - HidePath(); - HideVlessVmessMultiplePath(); - - //隐藏域名 - HideDomain(); - - //隐藏伪装网站 - HideMaskSites(); - - //Guid uuid = Guid.NewGuid(); - TextBoxNewUUID.Text = GenerateRandomUUID(); - //清除其他选项卡中的选项 - UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); - } - private void RadioButtonWebSocketTLS2Web_Checked(object sender, RoutedEventArgs e) - { - TextBoxServerListenPort.Text = "443"; - - //隐藏mKCP项 - HideMkcpSeed(); - - //隐藏QUIC密钥 - HideQuic(); - - //显示Path - ShowPath(); - - //显示域名 - ShowDomain(); - - //显示伪装网站 - ShowMaskSites(); - - //Guid uuid = Guid.NewGuid(); - TextBoxNewUUID.Text = GenerateRandomUUID(); - //清除其他选项卡中的选项 - UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); - } - private void RadioButtonWebSocketTLSselfSigned_Checked(object sender, RoutedEventArgs e) - { - TextBoxServerListenPort.Text = "443"; - - //隐藏mKCP项 - HideMkcpSeed(); - - //隐藏QUIC密钥 - HideQuic(); - - //显示Path - ShowPath(); - - //隐藏域名 - HideDomain(); - - //隐藏伪装网站 - HideMaskSites(); - - //Guid uuid = Guid.NewGuid(); - TextBoxNewUUID.Text = GenerateRandomUUID(); - //清除其他选项卡中的选项 - UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); - } - private void RadioButtonHTTP2_Checked(object sender, RoutedEventArgs e) - { - TextBoxServerListenPort.Text = "443"; - - //隐藏mKCP项 - HideMkcpSeed(); - - //隐藏QUIC密钥 - HideQuic(); - - //显示Path - ShowPath(); - - //显示域名 - ShowDomain(); - - //隐藏伪装网站 - HideMaskSites(); - - //Guid uuid = Guid.NewGuid(); - TextBoxNewUUID.Text = GenerateRandomUUID(); - //清除其他选项卡中的选项 - UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); - } - - //mKCP显示界面 - private void RadioButtonMkcp_Checked(object sender, RoutedEventArgs e) - { - //隐藏QUIC密钥 - HideQuic(); - - //显示mKCP Seed - ShowMkcpSeed(); - - //隐藏Path - HidePath(); - HideVlessVmessMultiplePath(); - - //隐藏域名 - HideDomain(); - - //隐藏伪装网站 - HideMaskSites(); - - //Guid uuid = Guid.NewGuid(); - TextBoxNewUUID.Text = GenerateRandomUUID(); - - //uuid = Guid.NewGuid(); - TextBoxQuicAndMkcpSeedUUID.Text = GenerateRandomUUID(); - - //Random random = new Random(); - int randomServerPort = GetRandomPort(); - TextBoxServerListenPort.Text = randomServerPort.ToString(); - //清除其他选项卡中的选项 - UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); - } - - //QUIC显示界面 - private void RadioButtonQuicNone_Checked(object sender, RoutedEventArgs e) - { - //隐藏mKCP项 - HideMkcpSeed(); - - //显示QUIC密钥 - ShowQuic(); - - //隐藏Path - HidePath(); - HideVlessVmessMultiplePath(); - - //隐藏域名 - HideDomain(); - - //隐藏伪装网站 - HideMaskSites(); - - //Guid uuid = Guid.NewGuid(); - TextBoxNewUUID.Text = GenerateRandomUUID(); - - //uuid = Guid.NewGuid(); - TextBoxQuicAndMkcpSeedUUID.Text = GenerateRandomUUID(); - - //Random random = new Random(); - int randomServerPort = GetRandomPort(); - TextBoxServerListenPort.Text = randomServerPort.ToString(); - //清除其他选项卡中的选项 - UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); - } - - - //隐藏QUIC相关项 - private void HideQuic() - { - TextBlockQuicUUID.Visibility = Visibility.Collapsed; - TextBoxQuicAndMkcpSeedUUID.Visibility = Visibility.Collapsed; - ButtonQuicAndmKcpSeedUUID.Visibility = Visibility.Collapsed; - TextBlockQuicEncryption.Visibility = Visibility.Collapsed; - ComboBoxEncryptionMethodInfo.Visibility = Visibility.Collapsed; - //TextBlockMkcpUUID.Visibility = Visibility.Collapsed; - } - //如果加密方法选择none,则隐藏只QUIC密钥 - private void NoneEncryptionHideQuicKey() - { - TextBlockQuicUUID.Visibility = Visibility.Collapsed; - TextBoxQuicAndMkcpSeedUUID.Visibility = Visibility.Collapsed; - ButtonQuicAndmKcpSeedUUID.Visibility = Visibility.Collapsed; - } - //窗口初始化时,需要做一次隐藏QUIC加密方法 - private void FirstQuicHideEncryption() - { - TextBlockQuicEncryption.Visibility = Visibility.Collapsed; - ComboBoxEncryptionMethodInfo.Visibility = Visibility.Collapsed; - } - //显示QUIC相关项 - private void ShowQuic() - { - TextBlockQuicUUID.Visibility = Visibility.Visible; - TextBoxQuicAndMkcpSeedUUID.Visibility = Visibility.Visible; - ButtonQuicAndmKcpSeedUUID.Visibility = Visibility.Visible; - TextBlockQuicEncryption.Visibility = Visibility.Visible; - ComboBoxEncryptionMethodInfo.Visibility = Visibility.Visible; - - //隐藏mKCP相关项 - TextBlockMkcpSeedUUID.Visibility = Visibility.Collapsed; - TextBlockMkcpUUID.Visibility = Visibility.Collapsed; - } - //隐藏mKCP Seed相关项 - private void HideMkcpSeed() - { - TextBlockMkcpSeedUUID.Visibility = Visibility.Collapsed; - TextBoxQuicAndMkcpSeedUUID.Visibility = Visibility.Collapsed; - ButtonQuicAndmKcpSeedUUID.Visibility = Visibility.Collapsed; - TextBlockMkcpUUID.Visibility = Visibility.Collapsed; - - } - //显示mKCP Seed相关项 - private void ShowMkcpSeed() - { - TextBlockMkcpSeedUUID.Visibility = Visibility.Visible; - TextBoxQuicAndMkcpSeedUUID.Visibility = Visibility.Visible; - ButtonQuicAndmKcpSeedUUID.Visibility = Visibility.Visible; - TextBlockMkcpUUID.Visibility = Visibility.Visible; - //隐藏QUIC标示 - TextBlockQuicUUID.Visibility = Visibility.Collapsed; - } - //隐藏路径相关项 - private void HidePath() - { - //隐藏Path - TextBlockPath.Visibility = Visibility.Collapsed; - TextBoxPath.Visibility = Visibility.Collapsed; - ButtonPath.Visibility = Visibility.Collapsed; - } - //显示路径相关项 - private void ShowPath() - { - HideVlessVmessMultiplePath();//隐藏VLESS VMESS多种方案的路径Path - //显示Path - TextBlockPath.Visibility = Visibility.Visible; - TextBoxPath.Visibility = Visibility.Visible; - TextBoxPath.Text = "/ray"; - ButtonPath.Visibility = Visibility.Visible; - } - //隐藏VLESS VMESS复合方案路径 - private void HideVlessVmessMultiplePath() - { - TextBlockPathVlessWs.Visibility = Visibility.Collapsed; - TextBoxPathVlessWS.Visibility = Visibility.Collapsed; - TextBlockPathVmessTcp.Visibility = Visibility.Collapsed; - TextBoxPathVmessTcp.Visibility = Visibility.Collapsed; - TextBlockPathVmessWs.Visibility = Visibility.Collapsed; - TextBoxPathVmessWS.Visibility = Visibility.Collapsed; - ButtonVlessVmessPath.Visibility = Visibility.Collapsed; - TextBlockTrojanPassword.Visibility = Visibility.Collapsed; - - } - //显示VLESS VMESS复合方案路径 - private void ShowVlessVmessMultiplePath() - { - HidePath();//隐藏普通路径Path - TextBlockPathVlessWs.Visibility = Visibility.Visible; - TextBoxPathVlessWS.Visibility = Visibility.Visible; - TextBoxPathVlessWS.Text = "/vlessws"; - - TextBlockPathVmessTcp.Visibility = Visibility.Visible; - TextBoxPathVmessTcp.Visibility = Visibility.Visible; - TextBoxPathVmessTcp.Text = "/vmesstcp"; - - TextBlockPathVmessWs.Visibility = Visibility.Visible; - TextBoxPathVmessWS.Visibility = Visibility.Visible; - TextBoxPathVmessWS.Text = "/vmessws"; - - ButtonVlessVmessPath.Visibility = Visibility.Visible; - TextBlockTrojanPassword.Visibility = Visibility.Visible; - } - //隐藏域名相关项 - private void HideDomain() - { - //隐藏域名 - TextBlockDomain.Visibility = Visibility.Collapsed; - TextBoxDomain.Visibility = Visibility.Collapsed; - ButtonDomain.Visibility = Visibility.Collapsed; - } - //显示域名相关项 - private void ShowDomain() - { - //显示域名 - TextBlockDomain.Visibility = Visibility.Visible; - TextBoxDomain.Visibility = Visibility.Visible; - //ButtonDomain.Visibility = Visibility.Visible; - } - //隐藏伪装网站 - private void HideMaskSites() - { - TextBlockMaskSites.Visibility = Visibility.Collapsed; - TextBoxMaskSites.Visibility = Visibility.Collapsed; - } - //显示伪装网站 - private void ShowMaskSites() - { - TextBlockMaskSites.Visibility = Visibility.Visible; - TextBoxMaskSites.Visibility = Visibility.Visible; - } - #endregion - - //产生随机的uuid - private void ButtonNewUUID_Click(object sender, RoutedEventArgs e) - { - TextBoxNewUUID.Text = GenerateRandomUUID(); - } - - //产生QUIC密钥/mKCP Seed所用的UUID - private void ButtonQuicAndMkcpSeedUUID_Click(object sender, RoutedEventArgs e) - { - TextBoxQuicAndMkcpSeedUUID.Text = GenerateRandomUUID(); - } - - //更新随机服务端口 - private void ButtonServerListenPort_Click(object sender, RoutedEventArgs e) - { - int randomServerPort = GetRandomPort(); - TextBoxServerListenPort.Text = randomServerPort.ToString(); - } - - //更新单方案随机的Path - private void ButtonPath_Click(object sender, RoutedEventArgs e) - { - string path = GenerateRandomPath(); - TextBoxPath.Text = $"/{path}"; - } - - //更新多方案共存的Path - private void ButtonVlessVmessPath_Click(object sender, RoutedEventArgs e) - { - string path = GenerateRandomPath(); - TextBoxPathVlessWS.Text = $"/{path}"; - - path = GenerateRandomPath(); - TextBoxPathVmessTcp.Text = $"/{path}"; - - path = GenerateRandomPath(); - TextBoxPathVmessWS.Text = $"/{path}"; - } - //TextBox输入内容做预处理 - private string PreTrim(string preString) - { - return preString.Trim(); - } - //生成随机端口 - private int GetRandomPort() - { - Random random = new Random(); - return random.Next(10001, 60000); - } - - //生成随机UUID - private string GenerateRandomUUID() - { - Guid uuid = Guid.NewGuid(); - return uuid.ToString(); - } - - //生成随机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(PreTrim(TextBoxDomain.Text)) == true) - // { - // //****** "域名不能为空,请检查相关参数设置!" ****** - // MessageBox.Show(Application.Current.FindResource("MessageBoxShow_DomainNotEmpty").ToString()); - // return false; - // } - // else - // { - // return true; - // } - //} - - //加密方法更改后的动作 - private void ComboBoxEncryptionMethodInfo_SelectionChanged(object sender, SelectionChangedEventArgs e) - { - string getMethond = GetEncryptionMethodSS(); - //传递加密方式 - MainWindow.ReceiveConfigurationParameters[3] = getMethond; - if (String.Equals(getMethond,"none")) - { - NoneEncryptionHideQuicKey(); - } - else - { - ShowQuic(); - } - - } - - //读取加密方式 - private string GetEncryptionMethodSS() - { - return ComboBoxEncryptionMethodInfo.SelectedValue.ToString(); - } - private void ButtonDomain_Click(object sender, RoutedEventArgs e) - { - - } - - - - - - - - - - //private void ButtonTestChecked_Click(object sender, RoutedEventArgs e) - //{ - // UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); - - //} - } -} diff --git a/ProxySU/XayTemplateWindow.xaml b/ProxySU/XayTemplateWindow.xaml deleted file mode 100644 index 0daad4e..0000000 --- a/ProxySU/XayTemplateWindow.xaml +++ /dev/null @@ -1,390 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ProxySU/XayTemplateWindow.xaml.cs b/ProxySU/XayTemplateWindow.xaml.cs deleted file mode 100644 index 1079966..0000000 --- a/ProxySU/XayTemplateWindow.xaml.cs +++ /dev/null @@ -1,1146 +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.Windows.Forms; - -namespace ProxySU -{ - /// - /// WindowTemplateConfiguration.xaml 的交互逻辑 - /// - public partial class XrayWindowTemplateConfiguration : Window - { - //QUIC 加密方法 - public class EncryptionMethodInfo - { - public string Name { get; set; } - public string Value { get; set; } - } - - public XrayWindowTemplateConfiguration() - { - InitializeComponent(); - - #region 加密方法选择 初始设置为chacha20-poly1305 - List methodList = new List(); - - methodList.Add(new EncryptionMethodInfo { Name = "chacha20-poly1305", Value = "chacha20-poly1305" }); - methodList.Add(new EncryptionMethodInfo { Name = "aes-128-gcm", Value = "aes-128-gcm" }); - methodList.Add(new EncryptionMethodInfo { Name = "none", Value = "none" }); - - ComboBoxEncryptionMethodInfo.ItemsSource = methodList; - - ComboBoxEncryptionMethodInfo.DisplayMemberPath = "Name";//显示出来的值 - ComboBoxEncryptionMethodInfo.SelectedValuePath = "Value";//实际选中后获取的结果的值 - ComboBoxEncryptionMethodInfo.SelectedIndex = 0; - - DataContext = this; - #endregion - - //隐藏QUIC密钥 - FirstQuicHideEncryption(); - RadioButtonVMESSmKCP.IsChecked = true; - } - //取消不在当前活动选项卡中的其他所有选项卡中的所有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 ButtondDecide_Click(object sender, RoutedEventArgs e) - { - bool preDomainMask = ClassModel.PreDomainMask(TextBoxMaskSites.Text); - bool domainNotEmpty = true; - - #region TCP 传输协议(VMESS) - - //TCP模式被选中 - if (RadioButtonTCP.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "TCP"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonTCP.Content.ToString(); - - } - - //TCP+http伪装模式被选中 - else if (RadioButtonTCPhttp.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "TCPhttp"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonTCPhttp.Content.ToString(); - //伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "http"; - - } - - //TCP+TLS模式被选中 - else if (RadioButtonTCP2TLS.IsChecked == true) - { - domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomain.Text); - - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "tcpTLS"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonTCP2TLS.Content.ToString(); - - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - - } - - //tcp+TLS(自签证书)模式被选中 - else if (RadioButtonTcpTLS2SelfSigned.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "tcpTLSselfSigned"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonTcpTLS2SelfSigned.Content.ToString(); - - //传递域名 - // MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - - } - - #endregion - - #region VLESS协议 - - //VLESS+TCP+XTLS+Web模式选中 - else if (RadioButtonVlessXtlsTcp.IsChecked == true) - { - domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomain.Text); - - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "VlessXtlsTcp"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonVlessXtlsTcp.Content.ToString(); - - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - //传递伪装网站 - MainWindow.ReceiveConfigurationParameters[7] = ClassModel.DisguiseURLprocessing(PreTrim(TextBoxMaskSites.Text)); - - } - - //VLESS+TCP+TLS+Web模式选中 - else if (RadioButtonVlessTcpTlsWeb.IsChecked == true) - { - domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomain.Text); - - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "VlessTcpTlsWeb"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonVlessTcpTlsWeb.Content.ToString(); - - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - //传递伪装网站 - MainWindow.ReceiveConfigurationParameters[7] = ClassModel.DisguiseURLprocessing(PreTrim(TextBoxMaskSites.Text)); - - } - - //VLESS+WebSocket+TLS+Web模式选中 - else if (RadioButtonVlessWebSocketTlsWeb.IsChecked == true) - { - domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomain.Text); - - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "VlessWebSocketTlsWeb"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonVlessWebSocketTlsWeb.Content.ToString(); - - //传递路径 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxPath.Text); - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - //传递伪装网站 - MainWindow.ReceiveConfigurationParameters[7] = ClassModel.DisguiseURLprocessing(PreTrim(TextBoxMaskSites.Text)); - } - - //VLESS+http2+TLS+Web模式选中 - else if (RadioButtonVlessHttp2Web.IsChecked == true) - { - domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomain.Text); - - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "VlessHttp2Web"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonVlessHttp2Web.Content.ToString(); - - //传递路径 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxPath.Text); - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - //传递伪装网站 - MainWindow.ReceiveConfigurationParameters[7] = ClassModel.DisguiseURLprocessing(PreTrim(TextBoxMaskSites.Text)); - } - - //VLESS+VMESS+Trojan+XTLS+TCP+WebSocket+Web模式被选中 - else if (RadioButtonVlessVmessXtlsTcpWebSocketHot.IsChecked == true) - { - domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomain.Text); - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "VlessVmessXtlsTcpWebSocketWeb"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonVlessVmessXtlsTcpWebSocketHot.Content.ToString(); - //传递路径 - MainWindow.ReceiveConfigurationParameters[3] = PreTrim(TextBoxPathVlessWS.Text);//VLESS ws Path - MainWindow.ReceiveConfigurationParameters[9] = PreTrim(TextBoxPathVmessTcp.Text);//VMESS tcp Path - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxPathVmessWS.Text);//VMESS ws Path - - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - //传递混淆方式(VMESS TCP Path方式所用) - MainWindow.ReceiveConfigurationParameters[5] = "http"; - //传递伪装网站 - MainWindow.ReceiveConfigurationParameters[7] = ClassModel.DisguiseURLprocessing(PreTrim(TextBoxMaskSites.Text)); - - } - - #endregion - - #region WebSocket传输协议(VMESS) - - //webSocket模式被选中 - else if (RadioButtonWebSocket.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "webSocket"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonWebSocket.Content.ToString(); - - } - - //WebSocket+TLS模式被选中 - else if (RadioButtonWebSocketTLS.IsChecked == true) - { - domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomain.Text); - - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "WebSocketTLS"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonWebSocketTLS.Content.ToString(); - //传递路径 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxPath.Text); - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - - } - - //WebSocket+TLS+Web模式被选中 - else if (RadioButtonWebSocketTLS2Web.IsChecked == true|| RadioButtonWebSocketTLS2WebHot.IsChecked==true) - { - domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomain.Text); - - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "WebSocketTLS2Web"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonWebSocketTLS2Web.Content.ToString(); - - //传递路径 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxPath.Text); - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - //传递伪装网站 - MainWindow.ReceiveConfigurationParameters[7] = ClassModel.DisguiseURLprocessing(PreTrim(TextBoxMaskSites.Text)); - - } - - //WebSocket+TLS(自签证书)模式被选中 - else if (RadioButtonWebSocketTLSselfSigned.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "WebSocketTLSselfSigned"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonWebSocketTLSselfSigned.Content.ToString(); - - //传递路径 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxPath.Text); - //传递域名 - //MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - - } - - #endregion - - #region http2传输协议(VMESS) - - //http2模式被选中 - else if (RadioButtonHTTP2.IsChecked == true) - { - domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomain.Text); - - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "Http2"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonHTTP2.Content.ToString(); - - //传递路径 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxPath.Text); - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - - } - - //http2+TLS+Web模式被选中 - else if (RadioButtonHTTP2Web.IsChecked == true || RadioButtonHTTP2WebHot.IsChecked == true) - { - domainNotEmpty = ClassModel.TestDomainIsEmpty(TextBoxDomain.Text); - - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "http2Web"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonHTTP2Web.Content.ToString(); - - //传递路径 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxPath.Text); - //传递域名 - MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - //传递伪装网站 - MainWindow.ReceiveConfigurationParameters[7] = ClassModel.DisguiseURLprocessing(PreTrim(TextBoxMaskSites.Text)); - - } - - //http2(自签证书)模式被选中 - else if (RadioButtonHTTP2selfSigned.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "http2selfSigned"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonHTTP2selfSigned.Content.ToString(); - - //传递路径 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxPath.Text); - //传递域名 - //MainWindow.ReceiveConfigurationParameters[4] = PreTrim(TextBoxDomain.Text); - - } - - #endregion - - #region mKCP 传输协议 (VMESS) - - //mKCP无伪装模式被选中 - else if (RadioButtonMkcpNone.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "mKCPNone"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonMkcpNone.Content.ToString(); - //传递伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "none"; - //传递mKCP Seed - if (String.IsNullOrEmpty(PreTrim(TextBoxQuicAndMkcpSeedUUID.Text)) ==false) - { - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxQuicAndMkcpSeedUUID.Text); - } - } - - //mKCP+srtp伪装模式被选中 - else if (RadioButton2mKCP2SRTP.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "mKCP2SRTP"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButton2mKCP2SRTP.Content.ToString(); - //传递伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "srtp"; - //传递mKCP Seed - if (String.IsNullOrEmpty(PreTrim(TextBoxQuicAndMkcpSeedUUID.Text)) == false) - { - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxQuicAndMkcpSeedUUID.Text); - } - } - - //mKCP+utp伪装模式被选中 - else if (RadioButton2mKCPuTP.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "mKCPuTP"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButton2mKCPuTP.Content.ToString(); - //传递伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "utp"; - //传递mKCP Seed - if (String.IsNullOrEmpty(PreTrim(TextBoxQuicAndMkcpSeedUUID.Text)) == false) - { - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxQuicAndMkcpSeedUUID.Text); - } - } - - //mKCP+wechat-video伪装模式被选中 - else if (RadioButton2mKCP2WechatVideo.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "mKCP2WechatVideo"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButton2mKCP2WechatVideo.Content.ToString(); - //传递伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "wechat-video"; - //传递mKCP Seed - if (String.IsNullOrEmpty(PreTrim(TextBoxQuicAndMkcpSeedUUID.Text)) == false) - { - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxQuicAndMkcpSeedUUID.Text); - } - } - - //mKCP+dtls伪装模式被选中 - else if (RadioButton2mKCP2DTLS.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "mKCP2DTLS"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButton2mKCP2DTLS.Content.ToString(); - //传递伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "dtls"; - //传递mKCP Seed - if (String.IsNullOrEmpty(PreTrim(TextBoxQuicAndMkcpSeedUUID.Text)) == false) - { - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxQuicAndMkcpSeedUUID.Text); - } - } - - //mKCP+wireguard伪装模式被选中 - else if (RadioButton2mKCP2WireGuard.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "mKCP2WireGuard"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButton2mKCP2WireGuard.Content.ToString(); - //传递伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "wireguard"; - //传递mKCP Seed - if (String.IsNullOrEmpty(PreTrim(TextBoxQuicAndMkcpSeedUUID.Text)) == false) - { - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxQuicAndMkcpSeedUUID.Text); - } - } - - #endregion - - #region QUIC传输协议(VMESS) - - //QUIC无伪装模式被选中 - else if (RadioButtonQuicNone.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "QuicNone"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonQuicNone.Content.ToString(); - //传递伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "none"; - //QUIC 密钥 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxQuicAndMkcpSeedUUID.Text); - //QUIC加密方法 - MainWindow.ReceiveConfigurationParameters[3] = GetEncryptionMethodSS(); - } - - //QUIC+srtp伪装模式被选中 - else if (RadioButtonQuicSRTP.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "QuicSRTP"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonQuicSRTP.Content.ToString(); - //传递伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "srtp"; - //QUIC 密钥 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxQuicAndMkcpSeedUUID.Text); - //QUIC加密方法 - MainWindow.ReceiveConfigurationParameters[3] = GetEncryptionMethodSS(); - } - - //QUIC+utp伪装模式被选中 - else if (RadioButtonQuic2uTP.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "Quic2uTP"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonQuic2uTP.Content.ToString(); - //传递伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "utp"; - //QUIC 密钥 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxQuicAndMkcpSeedUUID.Text); - //QUIC加密方法 - MainWindow.ReceiveConfigurationParameters[3] = GetEncryptionMethodSS(); - } - - //QUIC+wechat-video伪装模式被选中 - else if (RadioButtonQuicWechatVideo.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "QuicWechatVideo"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonQuicWechatVideo.Content.ToString(); - //传递伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "wechat-video"; - //QUIC 密钥 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxQuicAndMkcpSeedUUID.Text); - //QUIC加密方法 - MainWindow.ReceiveConfigurationParameters[3] = GetEncryptionMethodSS(); - } - - //QUIC+dtls伪装模式被选中 - else if (RadioButtonQuicDTLS.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "QuicDTLS"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonQuicDTLS.Content.ToString(); - //传递伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "dtls"; - //QUIC 密钥 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxQuicAndMkcpSeedUUID.Text); - //QUIC加密方法 - MainWindow.ReceiveConfigurationParameters[3] = GetEncryptionMethodSS(); - } - - //QUIC+wireguard伪装模式被选中 - else if (RadioButtonQuicWireGuard.IsChecked == true) - { - //传递模板类型 - MainWindow.ReceiveConfigurationParameters[0] = "QuicWireGuard"; - //传递方案名称 - MainWindow.ReceiveConfigurationParameters[8] = RadioButtonQuicWireGuard.Content.ToString(); - //传递伪装类型 - MainWindow.ReceiveConfigurationParameters[5] = "wireguard"; - //QUIC 密钥 - MainWindow.ReceiveConfigurationParameters[6] = PreTrim(TextBoxQuicAndMkcpSeedUUID.Text); - //QUIC加密方法 - MainWindow.ReceiveConfigurationParameters[3] = GetEncryptionMethodSS(); - } - - #endregion - - //传递服务端口 - MainWindow.ReceiveConfigurationParameters[1] = PreTrim(TextBoxServerListenPort.Text); - //传递uuid - MainWindow.ReceiveConfigurationParameters[2] = PreTrim(TextBoxNewUUID.Text); - - if (RadioButtonVLESSmKCP.IsChecked == true) - { - MainWindow.mKCPvlessIsSet = true; - } - else - { - MainWindow.mKCPvlessIsSet = false; - } - - if (domainNotEmpty == true && preDomainMask == true) - { - this.Close(); - } - - } - - //取消选择返回主窗口 - private void ButtondCancel_Click(object sender, RoutedEventArgs e) => Close(); - - - //伪装网站处理 - //DisguiseURLprocessing(string fakeUrl); - // private string DisguiseURLprocessing(string fakeUrl) - //{ - //var uri = new Uri(fakeUrl); - //return uri.Host; - //Console.WriteLine(uri.Host); - - ////处理伪装网站域名中的前缀 - //if (fakeUrl.Length >= 7) - //{ - // string testDomainMask = fakeUrl.Substring(0, 7); - // if (String.Equals(testDomainMask, "https:/") || String.Equals(testDomainMask, "http://")) - // { - // string[] tmpUrl = fakeUrl.Split('/'); - // fakeUrl = tmpUrl[2]; - // } - - //} - - //} - - #region 其他设置中的界面控制 - - private void RadioButtonTCP_Checked(object sender, RoutedEventArgs e) - { - //隐藏mKCP项 - HideMkcpSeed(); - - //隐藏QUIC密钥 - HideQuic(); - - //隐藏Path - HidePath(); - HideVlessVmessMultiplePath(); - - //隐藏域名 - HideDomain(); - - //隐藏伪装网站 - HideMaskSites(); - - - //Guid uuid = Guid.NewGuid(); - TextBoxNewUUID.Text = GenerateRandomUUID(); - //Random random = new Random(); - int randomServerPort = GetRandomPort(); - TextBoxServerListenPort.Text = randomServerPort.ToString(); - //清除其他选项卡中的选项 - UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); - } - private void RadioButtonTCPhttp_Checked(object sender, RoutedEventArgs e) - { - TextBoxServerListenPort.Text = "80"; - - //隐藏mKCP项 - HideMkcpSeed(); - - //隐藏QUIC密钥 - HideQuic(); - - //隐藏Path - HidePath(); - HideVlessVmessMultiplePath(); - - //隐藏域名 - HideDomain(); - - //隐藏伪装网站 - HideMaskSites(); - - //Guid uuid = Guid.NewGuid(); - TextBoxNewUUID.Text = GenerateRandomUUID(); - //清除其他选项卡中的选项 - UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); - } - private void RadioButtonTCP2TLS_Checked(object sender, RoutedEventArgs e) - { - TextBoxServerListenPort.Text = "443"; - - //隐藏mKCP项 - HideMkcpSeed(); - - //隐藏QUIC密钥 - HideQuic(); - - //隐藏Path - HidePath(); - HideVlessVmessMultiplePath(); - - //显示域名 - ShowDomain(); - - //隐藏伪装网站 - HideMaskSites(); - - //Guid uuid = Guid.NewGuid(); - TextBoxNewUUID.Text = GenerateRandomUUID(); - //清除其他选项卡中的选项 - UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); - } - private void RadioButtonVlessTcpTlsWeb_Checked(object sender, RoutedEventArgs e) - { - TextBoxServerListenPort.Text = "443"; - - //隐藏mKCP项 - HideMkcpSeed(); - - //隐藏QUIC密钥 - HideQuic(); - - //隐藏Path - HidePath(); - HideVlessVmessMultiplePath(); - - //显示域名 - ShowDomain(); - - //显示伪装网站 - ShowMaskSites(); - - //Guid uuid = Guid.NewGuid(); - TextBoxNewUUID.Text = GenerateRandomUUID(); - //清除其他选项卡中的选项 - UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); - } - private void RadioButtonVlessVmessXtlsTcpWebSocketHot_Checked(object sender, RoutedEventArgs e) - { - TextBoxServerListenPort.Text = "443"; - - //隐藏mKCP项 - HideMkcpSeed(); - - //隐藏QUIC密钥 - HideQuic(); - - //显示复合路径 - ShowVlessVmessMultiplePath(); - - //显示域名 - ShowDomain(); - - //显示伪装网站 - ShowMaskSites(); - - //生成UUID - TextBoxNewUUID.Text = GenerateRandomUUID(); - - //清除其他选项卡中的选项 - UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); - } - //单击TextBlockVlessVmessXtlsTcpWebSocket标签则选中RadioButtonVlessVmessXtlsTcpWebSocketHot - private void TextBlockVlessVmessXtlsTcpWebSocket_MouseDown(object sender, MouseButtonEventArgs e) - { - RadioButtonVlessVmessXtlsTcpWebSocketHot.IsChecked = true; - } - private void RadioButtonTCP2TLSnoDomain_Checked(object sender, RoutedEventArgs e) - { - TextBoxServerListenPort.Text = "443"; - - //隐藏mKCP项 - HideMkcpSeed(); - - //隐藏QUIC密钥 - HideQuic(); - - //隐藏Path - HidePath(); - HideVlessVmessMultiplePath(); - - //隐藏域名 - HideDomain(); - - //隐藏伪装网站 - HideMaskSites(); - - //Guid uuid = Guid.NewGuid(); - TextBoxNewUUID.Text = GenerateRandomUUID(); - //清除其他选项卡中的选项 - UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); - } - private void RadioButtonWebSocketTLS2Web_Checked(object sender, RoutedEventArgs e) - { - TextBoxServerListenPort.Text = "443"; - - //隐藏mKCP项 - HideMkcpSeed(); - - //隐藏QUIC密钥 - HideQuic(); - - //显示Path - ShowPath(); - - //显示域名 - ShowDomain(); - - //显示伪装网站 - ShowMaskSites(); - - //Guid uuid = Guid.NewGuid(); - TextBoxNewUUID.Text = GenerateRandomUUID(); - //清除其他选项卡中的选项 - UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); - } - private void RadioButtonWebSocketTLSselfSigned_Checked(object sender, RoutedEventArgs e) - { - TextBoxServerListenPort.Text = "443"; - - //隐藏mKCP项 - HideMkcpSeed(); - - //隐藏QUIC密钥 - HideQuic(); - - //显示Path - ShowPath(); - - //隐藏域名 - HideDomain(); - - //隐藏伪装网站 - HideMaskSites(); - - //Guid uuid = Guid.NewGuid(); - TextBoxNewUUID.Text = GenerateRandomUUID(); - //清除其他选项卡中的选项 - UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); - } - private void RadioButtonHTTP2_Checked(object sender, RoutedEventArgs e) - { - TextBoxServerListenPort.Text = "443"; - - //隐藏mKCP项 - HideMkcpSeed(); - - //隐藏QUIC密钥 - HideQuic(); - - //显示Path - ShowPath(); - - //显示域名 - ShowDomain(); - - //隐藏伪装网站 - HideMaskSites(); - - //Guid uuid = Guid.NewGuid(); - TextBoxNewUUID.Text = GenerateRandomUUID(); - //清除其他选项卡中的选项 - UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); - } - - //mKCP显示界面 - private void RadioButtonMkcp_Checked(object sender, RoutedEventArgs e) - { - //隐藏QUIC密钥 - HideQuic(); - - //显示mKCP Seed - ShowMkcpSeed(); - - //隐藏Path - HidePath(); - HideVlessVmessMultiplePath(); - - //隐藏域名 - HideDomain(); - - //隐藏伪装网站 - HideMaskSites(); - - //Guid uuid = Guid.NewGuid(); - TextBoxNewUUID.Text = GenerateRandomUUID(); - - //uuid = Guid.NewGuid(); - TextBoxQuicAndMkcpSeedUUID.Text = GenerateRandomUUID(); - - //Random random = new Random(); - int randomServerPort = GetRandomPort(); - TextBoxServerListenPort.Text = randomServerPort.ToString(); - //清除其他选项卡中的选项 - UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); - } - - //QUIC显示界面 - private void RadioButtonQuicNone_Checked(object sender, RoutedEventArgs e) - { - //隐藏mKCP项 - HideMkcpSeed(); - - //显示QUIC密钥 - ShowQuic(); - - //隐藏Path - HidePath(); - HideVlessVmessMultiplePath(); - - //隐藏域名 - HideDomain(); - - //隐藏伪装网站 - HideMaskSites(); - - //Guid uuid = Guid.NewGuid(); - TextBoxNewUUID.Text = GenerateRandomUUID(); - - //uuid = Guid.NewGuid(); - TextBoxQuicAndMkcpSeedUUID.Text = GenerateRandomUUID(); - - //Random random = new Random(); - int randomServerPort = GetRandomPort(); - TextBoxServerListenPort.Text = randomServerPort.ToString(); - //清除其他选项卡中的选项 - UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); - } - - - //隐藏QUIC相关项 - private void HideQuic() - { - TextBlockQuicUUID.Visibility = Visibility.Collapsed; - TextBoxQuicAndMkcpSeedUUID.Visibility = Visibility.Collapsed; - ButtonQuicAndmKcpSeedUUID.Visibility = Visibility.Collapsed; - TextBlockQuicEncryption.Visibility = Visibility.Collapsed; - ComboBoxEncryptionMethodInfo.Visibility = Visibility.Collapsed; - //TextBlockMkcpUUID.Visibility = Visibility.Collapsed; - } - //如果加密方法选择none,则隐藏只QUIC密钥 - private void NoneEncryptionHideQuicKey() - { - TextBlockQuicUUID.Visibility = Visibility.Collapsed; - TextBoxQuicAndMkcpSeedUUID.Visibility = Visibility.Collapsed; - ButtonQuicAndmKcpSeedUUID.Visibility = Visibility.Collapsed; - } - //窗口初始化时,需要做一次隐藏QUIC加密方法 - private void FirstQuicHideEncryption() - { - TextBlockQuicEncryption.Visibility = Visibility.Collapsed; - ComboBoxEncryptionMethodInfo.Visibility = Visibility.Collapsed; - } - //显示QUIC相关项 - private void ShowQuic() - { - TextBlockQuicUUID.Visibility = Visibility.Visible; - TextBoxQuicAndMkcpSeedUUID.Visibility = Visibility.Visible; - ButtonQuicAndmKcpSeedUUID.Visibility = Visibility.Visible; - TextBlockQuicEncryption.Visibility = Visibility.Visible; - ComboBoxEncryptionMethodInfo.Visibility = Visibility.Visible; - - //隐藏mKCP相关项 - TextBlockMkcpSeedUUID.Visibility = Visibility.Collapsed; - TextBlockMkcpUUID.Visibility = Visibility.Collapsed; - } - //隐藏mKCP Seed相关项 - private void HideMkcpSeed() - { - TextBlockMkcpSeedUUID.Visibility = Visibility.Collapsed; - TextBoxQuicAndMkcpSeedUUID.Visibility = Visibility.Collapsed; - ButtonQuicAndmKcpSeedUUID.Visibility = Visibility.Collapsed; - TextBlockMkcpUUID.Visibility = Visibility.Collapsed; - - } - //显示mKCP Seed相关项 - private void ShowMkcpSeed() - { - TextBlockMkcpSeedUUID.Visibility = Visibility.Visible; - TextBoxQuicAndMkcpSeedUUID.Visibility = Visibility.Visible; - ButtonQuicAndmKcpSeedUUID.Visibility = Visibility.Visible; - TextBlockMkcpUUID.Visibility = Visibility.Visible; - //隐藏QUIC标示 - TextBlockQuicUUID.Visibility = Visibility.Collapsed; - } - //隐藏路径相关项 - private void HidePath() - { - //隐藏Path - TextBlockPath.Visibility = Visibility.Collapsed; - TextBoxPath.Visibility = Visibility.Collapsed; - ButtonPath.Visibility = Visibility.Collapsed; - } - //显示路径相关项 - private void ShowPath() - { - HideVlessVmessMultiplePath();//隐藏VLESS VMESS多种方案的路径Path - //显示Path - TextBlockPath.Visibility = Visibility.Visible; - TextBoxPath.Visibility = Visibility.Visible; - TextBoxPath.Text = "/ray"; - ButtonPath.Visibility = Visibility.Visible; - } - //隐藏VLESS VMESS复合方案路径 - private void HideVlessVmessMultiplePath() - { - TextBlockPathVlessWs.Visibility = Visibility.Collapsed; - TextBoxPathVlessWS.Visibility = Visibility.Collapsed; - TextBlockPathVmessTcp.Visibility = Visibility.Collapsed; - TextBoxPathVmessTcp.Visibility = Visibility.Collapsed; - TextBlockPathVmessWs.Visibility = Visibility.Collapsed; - TextBoxPathVmessWS.Visibility = Visibility.Collapsed; - ButtonVlessVmessPath.Visibility = Visibility.Collapsed; - TextBlockTrojanPassword.Visibility = Visibility.Collapsed; - - } - //显示VLESS VMESS复合方案路径 - private void ShowVlessVmessMultiplePath() - { - HidePath();//隐藏普通路径Path - TextBlockPathVlessWs.Visibility = Visibility.Visible; - TextBoxPathVlessWS.Visibility = Visibility.Visible; - TextBoxPathVlessWS.Text = "/vlessws"; - - TextBlockPathVmessTcp.Visibility = Visibility.Visible; - TextBoxPathVmessTcp.Visibility = Visibility.Visible; - TextBoxPathVmessTcp.Text = "/vmesstcp"; - - TextBlockPathVmessWs.Visibility = Visibility.Visible; - TextBoxPathVmessWS.Visibility = Visibility.Visible; - TextBoxPathVmessWS.Text = "/vmessws"; - - ButtonVlessVmessPath.Visibility = Visibility.Visible; - TextBlockTrojanPassword.Visibility = Visibility.Visible; - } - //隐藏域名相关项 - private void HideDomain() - { - //隐藏域名 - TextBlockDomain.Visibility = Visibility.Collapsed; - TextBoxDomain.Visibility = Visibility.Collapsed; - ButtonDomain.Visibility = Visibility.Collapsed; - } - //显示域名相关项 - private void ShowDomain() - { - //显示域名 - TextBlockDomain.Visibility = Visibility.Visible; - TextBoxDomain.Visibility = Visibility.Visible; - //ButtonDomain.Visibility = Visibility.Visible; - } - //隐藏伪装网站 - private void HideMaskSites() - { - TextBlockMaskSites.Visibility = Visibility.Collapsed; - TextBoxMaskSites.Visibility = Visibility.Collapsed; - } - //显示伪装网站 - private void ShowMaskSites() - { - TextBlockMaskSites.Visibility = Visibility.Visible; - TextBoxMaskSites.Visibility = Visibility.Visible; - } - #endregion - - //产生随机的uuid - private void ButtonNewUUID_Click(object sender, RoutedEventArgs e) - { - TextBoxNewUUID.Text = GenerateRandomUUID(); - } - - //产生QUIC密钥/mKCP Seed所用的UUID - private void ButtonQuicAndMkcpSeedUUID_Click(object sender, RoutedEventArgs e) - { - TextBoxQuicAndMkcpSeedUUID.Text = GenerateRandomUUID(); - } - - //更新随机服务端口 - private void ButtonServerListenPort_Click(object sender, RoutedEventArgs e) - { - int randomServerPort = GetRandomPort(); - TextBoxServerListenPort.Text = randomServerPort.ToString(); - } - - //更新单方案随机的Path - private void ButtonPath_Click(object sender, RoutedEventArgs e) - { - string path = GenerateRandomPath(); - TextBoxPath.Text = $"/{path}"; - } - - //更新多方案共存的Path - private void ButtonVlessVmessPath_Click(object sender, RoutedEventArgs e) - { - string path = GenerateRandomPath(); - TextBoxPathVlessWS.Text = $"/{path}"; - - path = GenerateRandomPath(); - TextBoxPathVmessTcp.Text = $"/{path}"; - - path = GenerateRandomPath(); - TextBoxPathVmessWS.Text = $"/{path}"; - } - //TextBox输入内容做预处理 - private string PreTrim(string preString) - { - return preString.Trim(); - } - //生成随机端口 - private int GetRandomPort() - { - Random random = new Random(); - return random.Next(10001, 60000); - } - - //生成随机UUID - private string GenerateRandomUUID() - { - Guid uuid = Guid.NewGuid(); - return uuid.ToString(); - } - - //生成随机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(PreTrim(TextBoxDomain.Text)) == true) - // { - // //****** "域名不能为空,请检查相关参数设置!" ****** - // MessageBox.Show(Application.Current.FindResource("MessageBoxShow_DomainNotEmpty").ToString()); - // return false; - // } - // else - // { - // return true; - // } - //} - - //加密方法更改后的动作 - private void ComboBoxEncryptionMethodInfo_SelectionChanged(object sender, SelectionChangedEventArgs e) - { - string getMethond = GetEncryptionMethodSS(); - //传递加密方式 - MainWindow.ReceiveConfigurationParameters[3] = getMethond; - if (String.Equals(getMethond,"none")) - { - NoneEncryptionHideQuicKey(); - } - else - { - ShowQuic(); - } - - } - - //读取加密方式 - private string GetEncryptionMethodSS() - { - return ComboBoxEncryptionMethodInfo.SelectedValue.ToString(); - } - private void ButtonDomain_Click(object sender, RoutedEventArgs e) - { - - } - - - - - - - - - - //private void ButtonTestChecked_Click(object sender, RoutedEventArgs e) - //{ - // UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); - - //} - } -} diff --git a/ProxySU/bin/Beta/Beta.zip b/ProxySU/bin/Beta/Beta.zip deleted file mode 100644 index 500116a7eeb6680480b5778b3c1c4853bc141e9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 795020 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K~PCXV@rMHh+KP(n+3mx@5cxs^}^75?4f&i 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
p+ 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≀q7W~ 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%0D55292Sq6MC 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
SWl-rA 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

e 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 R0RHXbNJh3WZxQ(P{{TRwxB>tG diff --git a/ProxySU/packages.config b/ProxySU/packages.config deleted file mode 100644 index cd7f780..0000000 --- a/ProxySU/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/ProxySU_Core/App.config b/ProxySU_Core/App.config deleted file mode 100644 index 824190f..0000000 --- a/ProxySU_Core/App.config +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/ProxySU_Core/App.xaml b/ProxySU_Core/App.xaml deleted file mode 100644 index d59fcda..0000000 --- a/ProxySU_Core/App.xaml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ProxySU_Core/App.xaml.cs b/ProxySU_Core/App.xaml.cs deleted file mode 100644 index 2ccb782..0000000 --- a/ProxySU_Core/App.xaml.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Configuration; -using System.Data; -using System.Linq; -using System.Threading.Tasks; -using System.Windows; - -namespace ProxySU_Core -{ - ///

- /// Interaction logic for App.xaml - /// - public partial class App : Application - { - } -} diff --git a/ProxySU_Core/AssemblyInfo.cs b/ProxySU_Core/AssemblyInfo.cs deleted file mode 100644 index 8b5504e..0000000 --- a/ProxySU_Core/AssemblyInfo.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Windows; - -[assembly: ThemeInfo( - ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located - //(used if a resource is not found in the page, - // or application resource dictionaries) - ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located - //(used if a resource is not found in the page, - // app, or any theme specific resource dictionaries) -)] diff --git a/ProxySU_Core/Common/Base64.cs b/ProxySU_Core/Common/Base64.cs deleted file mode 100644 index 0a61841..0000000 --- a/ProxySU_Core/Common/Base64.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ProxySU_Core.Common -{ - public class Base64 - { - public static string Encode(string plainText) - { - var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); - return System.Convert.ToBase64String(plainTextBytes); - } - - public static string Decode(string base64EncodedData) - { - var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData); - return System.Text.Encoding.UTF8.GetString(base64EncodedBytes); - } - } -} diff --git a/ProxySU_Core/Converters/LoginSecretTypeConverter.cs b/ProxySU_Core/Converters/LoginSecretTypeConverter.cs deleted file mode 100644 index be26ed8..0000000 --- a/ProxySU_Core/Converters/LoginSecretTypeConverter.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Text; -using System.Windows.Data; - -namespace ProxySU_Core.Converters -{ - public class LoginSecretTypeConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return value != null && value.Equals(parameter); - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value == null) - { - return Binding.DoNothing; - } - - if (!value.Equals(true)) - { - return Binding.DoNothing; - } - - return parameter; - - } - } -} diff --git a/ProxySU_Core/Converters/ProxyTypeConverter.cs b/ProxySU_Core/Converters/ProxyTypeConverter.cs deleted file mode 100644 index 771cb62..0000000 --- a/ProxySU_Core/Converters/ProxyTypeConverter.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Text; -using System.Windows.Data; - -namespace ProxySU_Core.Converters -{ - public class ProxyTypeConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return value != null && value.Equals(parameter); - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value == null) - { - return Binding.DoNothing; - } - - if (!value.Equals(true)) - { - return Binding.DoNothing; - } - - return parameter; - } - } -} diff --git a/ProxySU_Core/Converters/VisibleConverter.cs b/ProxySU_Core/Converters/VisibleConverter.cs deleted file mode 100644 index f52a08d..0000000 --- a/ProxySU_Core/Converters/VisibleConverter.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Data; - -namespace ProxySU_Core.Converters -{ - public class VisibleConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - return value.Equals(true) ? Visibility.Visible : Visibility.Collapsed; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value == null) - { - return false; - } - - if (value.Equals(Visibility.Visible)) - { - return true; - } - - return false; - } - } -} diff --git a/ProxySU_Core/Models/AppSettings.cs b/ProxySU_Core/Models/AppSettings.cs deleted file mode 100644 index 0b42488..0000000 --- a/ProxySU_Core/Models/AppSettings.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ProxySU_Core.Models -{ - public class AppSettings - { - public string Language { get; set; } - } -} diff --git a/ProxySU_Core/Models/Developers/IParameters.cs b/ProxySU_Core/Models/Developers/IParameters.cs deleted file mode 100644 index f80f33a..0000000 --- a/ProxySU_Core/Models/Developers/IParameters.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace ProxySU_Core.Models.Developers -{ - public interface IParameters - { - int Port { get; set; } - - string Domain { get; set; } - - List FreePorts { get; } - } -} diff --git a/ProxySU_Core/Models/Developers/Project.cs b/ProxySU_Core/Models/Developers/Project.cs deleted file mode 100644 index 5aaa233..0000000 --- a/ProxySU_Core/Models/Developers/Project.cs +++ /dev/null @@ -1,740 +0,0 @@ -using ProxySU_Core.Tools; -using ProxySU_Core.ViewModels; -using Renci.SshNet; -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; - -namespace ProxySU_Core.Models.Developers -{ - public enum CmdType - { - None, - Apt, - Dnf, - Yum - } - - public abstract class Project : BaseViewModel where TParameters : IParameters - { - private SshClient _sshClient; - - protected Action WriteOutput; - - protected CmdType CmdType { get; set; } - - protected bool IsSELinux { get; set; } - - protected bool OnlyIpv6 { get; set; } - - protected string IPv4 { get; set; } - - protected string IPv6 { get; set; } - - protected TParameters Parameters { get; set; } - - public Project(SshClient sshClient, TParameters parameters, Action writeOutput) - { - _sshClient = sshClient; - WriteOutput = writeOutput; - Parameters = parameters; - } - - protected string RunCmd(string cmdStr) - { - var cmd = _sshClient.CreateCommand(cmdStr); - WriteOutput(cmdStr); - - var result = cmd.Execute(); - WriteOutput(result); - return result; - } - - /// - /// 执行安装命令 - /// - public abstract void Install(); - - /// - /// 配置系统基础环境 - /// - protected void EnsureSystemEnv() - { - string cmd; - - // 确认安装命令 - if (CmdType == CmdType.None) - { - cmd = RunCmd("command -v apt-get"); - if (!string.IsNullOrEmpty(cmd)) - { - CmdType = CmdType.Apt; - } - } - - if (CmdType == CmdType.None) - { - cmd = RunCmd("command -v dnf"); - if (!string.IsNullOrEmpty(cmd)) - { - CmdType = CmdType.Dnf; - } - } - - if (CmdType == CmdType.None) - { - cmd = RunCmd("command -v yum"); - if (!string.IsNullOrEmpty(cmd)) - { - CmdType = CmdType.Yum; - } - } - - // systemctl - cmd = RunCmd("command -v systemctl"); - var hasSystemCtl = !string.IsNullOrEmpty(cmd); - - // SELinux - cmd = RunCmd("command -v getenforce"); - IsSELinux = !string.IsNullOrEmpty(cmd); - - if (CmdType == CmdType.None || !hasSystemCtl) - { - throw new Exception("系统缺乏必要的安装组件如:apt-get||dnf||yum||Syetemd,主机系统推荐使用:CentOS 7/8,Debian 8/9/10,Ubuntu 16.04及以上版本"); - } - - - // 判断是否启用了SELinux,如果启用了,并且工作在Enforcing模式下,则改为Permissive模式 - if (IsSELinux) - { - cmd = RunCmd("getenforce"); - - // 检测到系统启用SELinux,且工作在严格模式下,需改为宽松模式 - if (cmd.Contains("Enforcing")) - { - RunCmd("setenforce 0"); - RunCmd(@"sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config"); - } - } - } - - /// - /// 确保Root账户登陆 - /// - protected void EnsureRootAuth() - { - // 禁止一些可能产生的干扰信息 - RunCmd(@"sed -i 's/echo/#echo/g' ~/.bashrc"); - RunCmd(@"sed -i 's/echo/#echo/g' ~/.profile"); - - - // 检测是否运行在Root权限下 - var cmd = RunCmd("id -u"); - if (!cmd.Equals("0\n")) - { - throw new Exception("请使用Root账户登陆主机"); - } - } - - /// - /// 配置IPV6环境 - /// - protected void ConfigureIPv6() - { - if (IsOnlyIpv6()) - { - SetNat64(); - } - } - - /// - /// 配置必要的软件 - /// - protected void ConfigureSoftware() - { - string cmd = RunCmd("command -v sudo"); - if (string.IsNullOrEmpty(cmd)) - { - RunCmd(GetInstallCmd("sudo")); - } - - // 安装curl,wget,unzip - cmd = RunCmd("command -v curl"); - if (string.IsNullOrEmpty(cmd)) - { - RunCmd(GetInstallCmd("curl")); - } - - cmd = RunCmd("command -v wget"); - if (string.IsNullOrEmpty(cmd)) - { - RunCmd(GetInstallCmd("wget")); - } - - cmd = RunCmd("command -v unzip"); - if (string.IsNullOrEmpty(cmd)) - { - RunCmd(GetInstallCmd("unzip")); - } - - // 安装dig - cmd = RunCmd("command -v dig"); - if (string.IsNullOrEmpty(cmd)) - { - if (CmdType == CmdType.Apt) - { - RunCmd(GetUpdateCmd()); - RunCmd(GetInstallCmd("dnsutils")); - } - else if (CmdType == CmdType.Dnf) - { - RunCmd(GetUpdateCmd()); - RunCmd(GetInstallCmd("bind-utils")); - } - else if (CmdType == CmdType.Yum) - { - RunCmd(GetUpdateCmd()); - RunCmd(GetInstallCmd("bind-utils")); - } - } - - - // 处理极其少见的xz-utils未安装的情况 - if (CmdType == CmdType.Apt) - { - RunCmd(GetInstallCmd("xz-utils")); - } - else - { - RunCmd(GetInstallCmd("xz-devel")); - } - - // 检测是否安装lsof - cmd = RunCmd("command -v lsof"); - if (string.IsNullOrEmpty(cmd)) - { - RunCmd(GetInstallCmd("lsof")); - } - } - - protected void ClosePort(params int[] portList) - { - string cmd; - - cmd = RunCmd("command -v firewall-cmd"); - if (!string.IsNullOrEmpty(cmd)) - { - //有很奇怪的vps主机,在firewalld未运行时,端口是关闭的,无法访问。所以要先启动firewalld - //用于保证acme.sh申请证书成功 - cmd = RunCmd("firewall-cmd --state"); - if (cmd.Trim() != "running") - { - RunCmd("systemctl restart firewalld"); - } - - foreach (var port in portList) - { - RunCmd($"firewall-cmd --zone=public --remove-port={port}/tcp --permanent"); - RunCmd($"firewall-cmd --zone=public --remove-port={port}/udp --permanent"); - } - RunCmd("yes | firewall-cmd --reload"); - } - else - { - cmd = RunCmd("command -v ufw"); - if (!string.IsNullOrEmpty(cmd)) - { - foreach (var port in portList) - { - RunCmd($"ufw delete allow {port}/tcp"); - RunCmd($"ufw delete allow {port}/udp"); - } - RunCmd("yes | ufw reload"); - } - } - } - - protected void OpenPort(params int[] portList) - { - - string cmd; - - cmd = RunCmd("command -v firewall-cmd"); - if (!string.IsNullOrEmpty(cmd)) - { - //有很奇怪的vps主机,在firewalld未运行时,端口是关闭的,无法访问。所以要先启动firewalld - //用于保证acme.sh申请证书成功 - cmd = RunCmd("firewall-cmd --state"); - if (cmd.Trim() != "running") - { - RunCmd("systemctl restart firewalld"); - } - - foreach (var port in portList) - { - RunCmd($"firewall-cmd --zone=public --add-port={port}/tcp --permanent"); - RunCmd($"firewall-cmd --zone=public --add-port={port}/udp --permanent"); - } - RunCmd("yes | firewall-cmd --reload"); - } - else - { - cmd = RunCmd("command -v ufw"); - if (!string.IsNullOrEmpty(cmd)) - { - foreach (var port in portList) - { - RunCmd($"ufw allow {port}/tcp"); - RunCmd($"ufw allow {port}/udp"); - } - RunCmd("yes | ufw reload"); - } - } - } - - /// - /// 配置防火墙 - /// - protected void ConfigureFirewall() - { - var portList = new List(); - portList.Add(80); - portList.Add(Parameters.Port); - portList.AddRange(Parameters.FreePorts); - - OpenPort(portList.ToArray()); - } - - /// - /// 配置同步时间差 - /// - 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() - { - if (OnlyIpv6) - { - string cmdFilter = @"| grep -oE '(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))' | head -n 1"; - var cmd = $"dig @resolver1.opendns.com AAAA {Parameters.Domain} +short -6 {cmdFilter}"; - var result = RunCmd(cmd).TrimEnd('\r', '\n'); - - if (result == IPv6) return; - } - - else - { - string cmdFilter = @"| grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | head -n 1"; - var cmd = $"dig @resolver1.opendns.com A {Parameters.Domain} +short -4 {cmdFilter}"; - var result = RunCmd(cmd).TrimEnd('\r', '\n'); - - if (result == IPv4) return; - - } - - - var btnResult = MessageBox.Show( - $"{Parameters.Domain}未能正常解析到服务器的IP,如果您使用了CDN请忽略,是否继续安装?", "提示", MessageBoxButton.YesNo); - - if (btnResult == MessageBoxResult.No) - { - throw new Exception($"域名解析失败,安装停止!"); - } - - } - - /// - /// 判断是否安装某个软件 - /// - /// - /// - 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"; - } - - /// - /// 安装 Caddy - /// - protected void InstallCaddy() - { - RunCmd("rm -rf caddy_install.sh"); - RunCmd("curl -o caddy_install.sh https://raw.githubusercontent.com/proxysu/shellscript/master/Caddy-Naive/caddy-naive-install.sh"); - RunCmd("yes | bash caddy_install.sh"); - RunCmd("rm -rf caddy_install.sh"); - RunCmd("systemctl enable caddy.service"); - } - - /// - /// 卸载 Caddy - /// - protected void UninstallCaddy() - { - RunCmd("rm -rf caddy_install.sh"); - RunCmd("curl -o caddy_install.sh https://raw.githubusercontent.com/proxysu/shellscript/master/Caddy-Naive/caddy-naive-install.sh"); - RunCmd("yes | bash caddy_install.sh uninstall"); - RunCmd("rm -rf caddy_install.sh"); - RunCmd("rm -rf /usr/share/caddy"); - } - - - #region 检测系统环境 - - private bool IsOnlyIpv6() - { - string cmd; - - cmd = RunCmd(@"curl -s https://api.ip.sb/ip --ipv4 --max-time 8"); - IPv4 = cmd.TrimEnd('\r', '\n'); - - if (!string.IsNullOrEmpty(IPv4)) - { - OnlyIpv6 = false; - return false; - } - - cmd = RunCmd(@"curl -s https://api.ip.sb/ip --ipv6 --max-time 8"); - IPv6 = cmd.TrimEnd('\r', '\n'); - - if (string.IsNullOrEmpty(IPv6)) - { - throw new Exception("未检测可用的的IP地址"); - } - - OnlyIpv6 = true; - return OnlyIpv6; - } - - private bool SetPortFree(int port, bool force = true) - { - string result = RunCmd($"lsof -n -P -i :{port} | grep LISTEN"); - - if (!string.IsNullOrEmpty(result)) - { - if (force) - { - var btnResult = MessageBox.Show($"{port}端口被占用,将强制停止占用{port}端口的程序?", "提示", MessageBoxButton.YesNo); - if (btnResult == MessageBoxResult.No) - { - throw new Exception($"{port}端口被占用,安装停止!"); - } - - string[] process = result.Split(' '); - RunCmd($"systemctl stop {process[0]}"); - RunCmd($"systemctl disable {process[0]}"); - RunCmd($"pkill {process[0]}"); - return SetPortFree(port, force: false); - } - else - { - return false; - } - } - - return true; - } - - public void ConfigurePort() - { - if (Parameters.Port == 80 || Parameters.Port == 443) - { - SetPortFree(80); - SetPortFree(443); - } - else - { - SetPortFree(80); - SetPortFree(443); - SetPortFree(Parameters.Port); - - Parameters.FreePorts.ForEach(port => - { - SetPortFree(port); - }); - } - } - - protected void SetNat64() - { - var dns64List = FilterFastestIP(); - if (dns64List.Count == 0) - { - throw new Exception("未找到有效的Nat64网关"); - } - - var exists = FileExists("/etc/resolv.conf.proxysu"); - if (!exists) - { - var cmdStr = @"mv /etc/resolv.conf /etc/resolv.conf.proxysu"; - RunCmd(cmdStr); - } - - foreach (var gateip in dns64List) - { - RunCmd($"echo \"nameserver {gateip}\" > /etc/resolv.conf"); - } - } - - protected void RemoveNat64() - { - RunCmd("rm /etc/resolv.conf"); - RunCmd("mv /etc/resolv.conf.proxysu /etc/resolv.conf"); - } - - private List 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 dns64List = new Dictionary(); - foreach (var gateip in gateNat64) - { - var cmdStr = $"ping6 -c4 {gateip} | grep avg | awk '{{print $4}}'|cut -d/ -f2"; - var cmd = RunCmd(cmdStr); - if (!string.IsNullOrEmpty(cmd)) - { - if (float.TryParse(cmd, out float delay)) - { - dns64List.Add(gateip, delay); - } - } - } - - return dns64List.Keys.ToList(); - } - - #endregion - - - #region BBR - private bool CheckKernelVersionBBR(string kernelVer) - { - string[] linuxKernelCompared = kernelVer.Split('.'); - if (int.Parse(linuxKernelCompared[0]) > 4) - { - return true; - } - else if (int.Parse(linuxKernelCompared[0]) < 4) - { - return false; - } - else if (int.Parse(linuxKernelCompared[0]) == 4) - { - if (int.Parse(linuxKernelCompared[1]) >= 9) - { - return true; - } - else if (int.Parse(linuxKernelCompared[1]) < 9) - { - return false; - } - - } - return false; - - } - - protected void EnableBBR() - { - var osVersion = RunCmd("uname -r"); - var canInstallBBR = CheckKernelVersionBBR(osVersion.Split('-')[0]); - - var bbrInfo = RunCmd("sysctl net.ipv4.tcp_congestion_control | grep bbr"); - var installed = bbrInfo.Contains("bbr"); - if (canInstallBBR && !installed) - { - RunCmd(@"bash -c 'echo ""net.core.default_qdisc=fq"" >> /etc/sysctl.conf'"); - RunCmd(@"bash -c 'echo ""net.ipv4.tcp_congestion_control=bbr"" >> /etc/sysctl.conf'"); - RunCmd(@"sysctl -p"); - - if (OnlyIpv6) - { - RemoveNat64(); - } - WriteOutput("BBR启动成功"); - } - - if (!canInstallBBR) - { - WriteOutput("****** 系统不满足启用BBR条件,启动失败。 ******"); - } - - } - #endregion - - /// - /// 安装证书 - /// - /// - /// - protected void InstallCert(string dirPath, string certName, string keyName) - { - string certPath = Path.Combine(dirPath, certName); - string keyPath = Path.Combine(dirPath, keyName); - - // 安装依赖 - RunCmd(GetInstallCmd("socat")); - - // 解决搬瓦工CentOS缺少问题 - RunCmd(GetInstallCmd("automake autoconf libtool")); - - // 安装Acme - var result = RunCmd($"curl https://get.acme.sh yes | sh"); - if (result.Contains("Install success")) - { - WriteOutput("安装 acme.sh 成功"); - } - else - { - WriteOutput("安装 acme.sh 失败,请联系开发者!"); - throw new Exception("安装 acme.sh 失败,请联系开发者!"); - } - - RunCmd("cd ~/.acme.sh/"); - RunCmd("alias acme.sh=~/.acme.sh/acme.sh"); - - // 申请证书 - if (OnlyIpv6) - { - var cmd = $"/root/.acme.sh/acme.sh --force --debug --issue --standalone -d {Parameters.Domain} --listen-v6"; - result = RunCmd(cmd); - } - else - { - var cmd = $"/root/.acme.sh/acme.sh --force --debug --issue --standalone -d {Parameters.Domain}"; - result = RunCmd(cmd); - } - - if (result.Contains("success")) - { - WriteOutput("申请证书成功"); - } - else - { - WriteOutput("申请证书失败,如果申请次数过多请更换二级域名,或联系开发者!"); - throw new Exception("申请证书失败,如果申请次数过多请更换二级域名,或联系开发者!"); - } - - // 安装证书 - RunCmd($"mkdir -p {dirPath}"); - RunCmd($"/root/.acme.sh/acme.sh --installcert -d {Parameters.Domain} --certpath {certPath} --keypath {keyPath} --capath {certPath}"); - - result = RunCmd($@"if [ ! -f ""{keyPath}"" ]; then echo ""0""; else echo ""1""; fi | head -n 1"); - - if (result.Contains("1")) - { - WriteOutput("安装证书成功"); - } - else - { - WriteOutput("安装证书失败,请联系开发者!"); - throw new Exception("安装证书失败,请联系开发者!"); - } - - RunCmd($"chmod 755 {dirPath}"); - } - - /// - /// 上传文件 - /// - /// - /// - protected void UploadFile(Stream stream, string path) - { - using (var sftp = new SftpClient(_sshClient.ConnectionInfo)) - { - sftp.Connect(); - sftp.UploadFile(stream, path, true); - sftp.Disconnect(); - } - } - - /// - /// 根据系统环境匹配更新命令 - /// - /// - protected string GetUpdateCmd() - { - if (CmdType == CmdType.Apt) - { - return "apt-get update"; - } - else if (CmdType == CmdType.Dnf) - { - return "dnf clean all;dnf makecache"; - } - else if (CmdType == CmdType.Yum) - { - return "yum clean all;yum makecache"; - } - - throw new Exception("未识别的系统"); - } - - /// - /// 根据系统匹配安装命令 - /// - /// - /// - protected string GetInstallCmd(string soft) - { - if (CmdType == CmdType.Apt) - { - return "echo y | apt-get install " + soft; - } - else if (CmdType == CmdType.Dnf) - { - return "echo y | dnf -y install " + soft; - } - else if (CmdType == CmdType.Yum) - { - return "echo y | yum -y install " + soft; - } - - throw new Exception("未识别的系统"); - } - - } -} diff --git a/ProxySU_Core/Models/Developers/TrojanGoConfigBuilder.cs b/ProxySU_Core/Models/Developers/TrojanGoConfigBuilder.cs deleted file mode 100644 index c02a9d0..0000000 --- a/ProxySU_Core/Models/Developers/TrojanGoConfigBuilder.cs +++ /dev/null @@ -1,63 +0,0 @@ -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ProxySU_Core.Models.Developers -{ - public class TrojanGoConfigBuilder - { - public static readonly int WebPort = 8088; - - public static readonly string TrojanGoSettingPath = @"Templates\trojan-go\trojan-go.json"; - - public static readonly string CaddyFilePath = @"Templates\trojan-go\base.caddyfile"; - - public static string BuildTrojanGoConfig(TrojanGoSettings parameters) - { - var jsonStr = File.ReadAllText(TrojanGoSettingPath); - var settings = JToken.FromObject(JsonConvert.DeserializeObject(jsonStr)); - - settings["remote_port"] = WebPort; - settings["password"][0] = parameters.Password; - settings["ssl"]["sni"] = parameters.Domain; - - return JsonConvert.SerializeObject(settings, Formatting.Indented, new JsonSerializerSettings() - { - NullValueHandling = NullValueHandling.Ignore - }); - } - - public static string BuildCaddyConfig(TrojanGoSettings parameters, bool useCustomWeb = false) - { - var caddyStr = File.ReadAllText(CaddyFilePath); - caddyStr.Replace("##domain##", parameters.Domain); - caddyStr.Replace("##port##", WebPort.ToString()); - - if (!useCustomWeb && !string.IsNullOrEmpty(parameters.MaskDomain)) - { - var prefix = "http://"; - if (parameters.MaskDomain.StartsWith("https://")) - { - prefix = "https://"; - } - var domain = parameters.MaskDomain - .TrimStart("http://".ToCharArray()) - .TrimStart("https://".ToCharArray()); - - caddyStr = caddyStr.Replace("##reverse_proxy##", $"reverse_proxy {prefix}{domain} {{ \n header_up Host {domain} \n }}"); - } - else - { - caddyStr = caddyStr.Replace("##reverse_proxy##", ""); - } - - return caddyStr; - } - } - -} diff --git a/ProxySU_Core/Models/Developers/TrojanGoProject.cs b/ProxySU_Core/Models/Developers/TrojanGoProject.cs deleted file mode 100644 index bf6cf19..0000000 --- a/ProxySU_Core/Models/Developers/TrojanGoProject.cs +++ /dev/null @@ -1,135 +0,0 @@ -using Renci.SshNet; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; - -namespace ProxySU_Core.Models.Developers -{ - public class TrojanGoProject : Project - { - public TrojanGoProject(SshClient sshClient, TrojanGoSettings parameters, Action writeOutput) : base(sshClient, parameters, writeOutput) - { - } - - public override void Install() - { - try - { - EnsureRootAuth(); - - if (FileExists("/usr/local/bin/xray")) - { - var btnResult = MessageBox.Show("已经安装Xray,是否需要重装?", "提示", MessageBoxButton.YesNo); - if (btnResult == MessageBoxResult.No) - { - MessageBox.Show("安装终止", "提示"); - return; - } - } - - WriteOutput("检测安装系统环境..."); - EnsureSystemEnv(); - WriteOutput("检测安装系统环境完成"); - - WriteOutput("配置服务器端口..."); - ConfigurePort(); - WriteOutput("端口配置完成"); - - WriteOutput("安装必要的系统工具..."); - ConfigureSoftware(); - WriteOutput("系统工具安装完成"); - - WriteOutput("检测IP6..."); - ConfigureIPv6(); - WriteOutput("检测IP6完成"); - - WriteOutput("配置防火墙..."); - ConfigureFirewall(); - WriteOutput("防火墙配置完成"); - - WriteOutput("同步系统和本地时间..."); - SyncTimeDiff(); - WriteOutput("时间同步完成"); - - WriteOutput("检测域名是否绑定本机IP..."); - ValidateDomain(); - WriteOutput("域名检测完成"); - - WriteOutput("安装Trojan-Go..."); - InstallTrojanGo(); - WriteOutput("Trojan-Go安装完成"); - - WriteOutput("安装Caddy..."); - InstallCaddy(); - WriteOutput("Caddy安装完成"); - - WriteOutput("启动BBR"); - EnableBBR(); - - UploadCaddyFile(); - WriteOutput("************"); - WriteOutput("安装完成,尽情享用吧......"); - WriteOutput("************"); - } - catch (Exception ex) - { - var errorLog = "安装终止," + ex.Message; - WriteOutput(errorLog); - MessageBox.Show(errorLog); - } - } - - private void InstallTrojanGo() - { - WriteOutput("安装Trojan-Go"); - RunCmd(@"curl https://raw.githubusercontent.com/proxysu/shellscript/master/trojan-go.sh yes | bash"); - var success = FileExists("/usr/local/etc/trojan-go"); - if (success == false) - { - throw new Exception("trojan-go 安装失败,请联系开发者!"); - } - - RunCmd($"sed -i 's/User=nobody/User=root/g' /etc/systemd/system/xray.service"); - RunCmd($"sed -i 's/CapabilityBoundingSet=/#CapabilityBoundingSet=/g' /etc/systemd/system/xray.service"); - RunCmd($"sed -i 's/AmbientCapabilities=/#AmbientCapabilities=/g' /etc/systemd/system/xray.service"); - RunCmd($"systemctl daemon-reload"); - - RunCmd("systemctl enable trojan-go"); - RunCmd("systemctl start trojan-go"); - WriteOutput("Trojan-Go 安装完成"); - - InstallCert( - dirPath: "/usr/local/etc/trojan-go", - certName: "trojan-go.crt", - keyName: "trojan-go.key"); - - if (FileExists("/usr/local/etc/trojan-go/config.json")) - { - RunCmd("mv /usr/local/etc/trojan-go/config.json config.json.old"); - } - - // 上传配置 - var settings = TrojanGoConfigBuilder.BuildTrojanGoConfig(Parameters); - var stream = new MemoryStream(Encoding.UTF8.GetBytes(settings)); - UploadFile(stream, "/usr/local/etc/trojan-go/config.json"); - RunCmd("systemctl restart trojan-go"); - } - - private void UploadCaddyFile(bool useCustomWeb = false) - { - var config = TrojanGoConfigBuilder.BuildCaddyConfig(Parameters, useCustomWeb); - var stream = new MemoryStream(Encoding.UTF8.GetBytes(config)); - if (FileExists("/etc/caddy/Caddyfile")) - { - RunCmd("mv /etc/caddy/Caddyfile /etc/caddy/Caddyfile.back"); - } - UploadFile(stream, "/etc/caddy/Caddyfile"); - RunCmd("systemctl restart caddy"); - } - } - -} diff --git a/ProxySU_Core/Models/Developers/TrojanGoSettings.cs b/ProxySU_Core/Models/Developers/TrojanGoSettings.cs deleted file mode 100644 index 6dd2102..0000000 --- a/ProxySU_Core/Models/Developers/TrojanGoSettings.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ProxySU_Core.Models.Developers -{ - public class TrojanGoSettings : IParameters - { - public int Port { get; set; } - - public List FreePorts - { - get - { - return new List(); - } - } - - public string Domain { get; set; } - - public List Types { get; set; } - - public string Password { get; set; } - - public string MaskDomain { get; set; } - } -} diff --git a/ProxySU_Core/Models/Developers/XrayConfigBuilder.cs b/ProxySU_Core/Models/Developers/XrayConfigBuilder.cs deleted file mode 100644 index d7eb4be..0000000 --- a/ProxySU_Core/Models/Developers/XrayConfigBuilder.cs +++ /dev/null @@ -1,232 +0,0 @@ -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using ProxySU_Core.Models; -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; - -namespace ProxySU_Core.Models.Developers -{ - public class XrayConfigBuilder - { - private const string ServerLogDir = @"Templates\xray\server\00_log"; - private const string ServerApiDir = @"Templates\xray\server\01_api"; - private const string ServerDnsDir = @"Templates\xray\server\02_dns"; - private const string ServerRoutingDir = @"Templates\xray\server\03_routing"; - private const string ServerPolicyDir = @"Templates\xray\server\04_policy"; - private const string ServerInboundsDir = @"Templates\xray\server\05_inbounds"; - private const string ServerOutboundsDir = @"Templates\xray\server\06_outbounds"; - private const string ServerTransportDir = @"Templates\xray\server\07_transport"; - private const string ServerStatsDir = @"Templates\xray\server\08_stats"; - private const string ServerReverseDir = @"Templates\xray\server\09_reverse"; - private const string CaddyFileDir = @"Templates\xray\caddy"; - - public static int VLESS_TCP_Port = 1110; - public static int VLESS_WS_Port = 1111; - public static int VLESS_H2_Port = 1112; - public static int VLESS_mKCP_Port = 1113; - - public static int VMESS_TCP_Port = 1210; - public static int VMESS_WS_Port = 1211; - public static int VMESS_H2_Port = 1212; - - public static int Trojan_TCP_Port = 1310; - public static int Trojan_WS_Port = 1311; - - public static int FullbackPort = 8080; - - - - public static dynamic LoadXrayConfig() - { - dynamic logObj = LoadJsonObj(Path.Combine(ServerLogDir, "00_log.json")); - dynamic apiObj = LoadJsonObj(Path.Combine(ServerApiDir, "01_api.json")); - dynamic dnsObj = LoadJsonObj(Path.Combine(ServerDnsDir, "02_dns.json")); - dynamic routingObj = LoadJsonObj(Path.Combine(ServerRoutingDir, "03_routing.json")); - dynamic policyObj = LoadJsonObj(Path.Combine(ServerPolicyDir, "04_policy.json")); - dynamic inboundsObj = LoadJsonObj(Path.Combine(ServerInboundsDir, "05_inbounds.json")); - dynamic outboundsObj = LoadJsonObj(Path.Combine(ServerOutboundsDir, "06_outbounds.json")); - dynamic transportObj = LoadJsonObj(Path.Combine(ServerTransportDir, "07_transport.json")); - dynamic statsObj = LoadJsonObj(Path.Combine(ServerStatsDir, "08_stats.json")); - dynamic reverseObj = LoadJsonObj(Path.Combine(ServerReverseDir, "09_reverse.json")); - - return new - { - log = logObj["log"], - //api = apiObj["api"], api不能为空 - dns = dnsObj["dns"], - routing = routingObj["routing"], - policy = policyObj["policy"], - inbounds = inboundsObj["inbounds"], - outbounds = outboundsObj["outbounds"], - transport = transportObj["transport"], - stats = statsObj["stats"], - reverse = reverseObj["reverse"] - }; - } - - public static string BuildCaddyConfig(XraySettings parameters, bool useCustomWeb = false) - { - var caddyStr = File.ReadAllText(Path.Combine(CaddyFileDir, "base.caddyfile")); - caddyStr = caddyStr.Replace("##domain##", parameters.Domain); - caddyStr = caddyStr.Replace("##port##", FullbackPort.ToString()); - - if (!useCustomWeb && !string.IsNullOrEmpty(parameters.MaskDomain)) - { - var prefix = "http://"; - if (parameters.MaskDomain.StartsWith("https://")) - { - prefix = "https://"; - } - var domain = parameters.MaskDomain - .TrimStart("http://".ToCharArray()) - .TrimStart("https://".ToCharArray()); - - caddyStr = caddyStr.Replace("##reverse_proxy##", $"reverse_proxy {prefix}{domain} {{ \n header_up Host {domain} \n }}"); - } - else - { - caddyStr = caddyStr.Replace("##reverse_proxy##", ""); - } - - return caddyStr; - } - - public static string BuildXrayConfig(XraySettings parameters) - { - var xrayConfig = LoadXrayConfig(); - var baseBound = GetBound("VLESS_TCP_XTLS.json"); - baseBound.port = parameters.Port; - baseBound.settings.fallbacks.Add(JToken.FromObject(new - { - dest = FullbackPort - })); - xrayConfig.inbounds.Add(baseBound); - baseBound.settings.clients[0].id = parameters.UUID; - - if (parameters.Types.Contains(XrayType.VLESS_WS)) - { - var wsInbound = GetBound("VLESS_WS.json"); - wsInbound.port = VLESS_WS_Port; - wsInbound.settings.clients[0].id = parameters.UUID; - wsInbound.streamSettings.wsSettings.path = parameters.VLESS_WS_Path; - baseBound.settings.fallbacks.Add(JToken.FromObject(new - { - dest = VLESS_WS_Port, - path = parameters.VLESS_WS_Path, - xver = 1, - })); - xrayConfig.inbounds.Add(JToken.FromObject(wsInbound)); - } - - if (parameters.Types.Contains(XrayType.VLESS_gRPC)) - { - var gRPCInBound = GetBound("VLESS_gRPC.json"); - gRPCInBound.port = parameters.VLESS_gRPC_Port; - gRPCInBound.settings.clients[0].id = parameters.UUID; - gRPCInBound.streamSettings.grpcSettings.serviceName = parameters.VLESS_gRPC_ServiceName; - xrayConfig.inbounds.Add(JToken.FromObject(gRPCInBound)); - } - - if (parameters.Types.Contains(XrayType.VLESS_KCP)) - { - var kcpBound = GetBound("VLESS_KCP.json"); - kcpBound.port = parameters.VLESS_KCP_Port; - kcpBound.settings.clients[0].id = parameters.UUID; - kcpBound.streamSettings.kcpSettings.header.type = parameters.VLESS_KCP_Type; - kcpBound.streamSettings.kcpSettings.seed = parameters.VLESS_KCP_Seed; - xrayConfig.inbounds.Add(JToken.FromObject(kcpBound)); - } - - if (parameters.Types.Contains(XrayType.VMESS_TCP)) - { - var mtcpBound = GetBound("VMESS_TCP.json"); - mtcpBound.port = VMESS_TCP_Port; - mtcpBound.settings.clients[0].id = parameters.UUID; - mtcpBound.streamSettings.tcpSettings.header.request.path = parameters.VMESS_TCP_Path; - baseBound.settings.fallbacks.Add(JToken.FromObject(new - { - dest = VMESS_TCP_Port, - path = parameters.VMESS_TCP_Path, - xver = 1, - })); - xrayConfig.inbounds.Add(JToken.FromObject(mtcpBound)); - } - - if (parameters.Types.Contains(XrayType.VMESS_WS)) - { - var mwsBound = GetBound("VMESS_WS.json"); - mwsBound.port = VMESS_WS_Port; - mwsBound.settings.clients[0].id = parameters.UUID; - mwsBound.streamSettings.wsSettings.path = parameters.VMESS_WS_Path; - baseBound.settings.fallbacks.Add(JToken.FromObject(new - { - dest = VMESS_WS_Port, - path = parameters.VMESS_WS_Path, - xver = 1, - })); - xrayConfig.inbounds.Add(JToken.FromObject(mwsBound)); - } - - if (parameters.Types.Contains(XrayType.VMESS_KCP)) - { - var kcpBound = GetBound("VMESS_KCP.json"); - kcpBound.port = parameters.VMESS_KCP_Port; - kcpBound.settings.clients[0].id = parameters.UUID; - kcpBound.streamSettings.kcpSettings.header.type = parameters.VMESS_KCP_Type; - kcpBound.streamSettings.kcpSettings.seed = parameters.VMESS_KCP_Seed; - xrayConfig.inbounds.Add(JToken.FromObject(kcpBound)); - } - - if (parameters.Types.Contains(XrayType.Trojan_TCP)) - { - var trojanTcpBound = GetBound("Trojan_TCP.json"); - trojanTcpBound.port = Trojan_TCP_Port; - trojanTcpBound.settings.clients[0].password = parameters.TrojanPassword; - trojanTcpBound.settings.fallbacks[0].dest = FullbackPort; - baseBound.settings.fallbacks[0] = JToken.FromObject(new - { - dest = Trojan_TCP_Port, - xver = 1, - }); - xrayConfig.inbounds.Add(JToken.FromObject(trojanTcpBound)); - } - - - if (parameters.Types.Contains(XrayType.ShadowsocksAEAD)) - { - var ssBound = GetBound("Shadowsocks-AEAD.json"); - ssBound.port = parameters.ShadowSocksPort; - ssBound.settings.clients[0].password = parameters.ShadowsocksPassword; - ssBound.settings.clients[0].method = parameters.ShadowsocksMethod; - xrayConfig.inbounds.Add(JToken.FromObject(ssBound)); - } - - return JsonConvert.SerializeObject( - xrayConfig, - Formatting.Indented, - new JsonSerializerSettings() - { - NullValueHandling = NullValueHandling.Ignore - }); - } - - private static dynamic GetBound(string name) - { - return LoadJsonObj(Path.Combine(ServerInboundsDir, name)); - } - - private static dynamic LoadJsonObj(string path) - { - if (File.Exists(path)) - { - var jsonStr = File.ReadAllText(path, Encoding.UTF8); - return JToken.FromObject(JsonConvert.DeserializeObject(jsonStr)); - } - return null; - } - - } - -} diff --git a/ProxySU_Core/Models/Developers/XrayProject.cs b/ProxySU_Core/Models/Developers/XrayProject.cs deleted file mode 100644 index f0678af..0000000 --- a/ProxySU_Core/Models/Developers/XrayProject.cs +++ /dev/null @@ -1,321 +0,0 @@ -using Renci.SshNet; -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using System.Windows; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using ProxySU_Core.Models; - -namespace ProxySU_Core.Models.Developers -{ - public class XrayProject : Project - { - - private const string ServerLogDir = @"Templates\xray\server\00_log"; - private const string ServerApiDir = @"Templates\xray\server\01_api"; - private const string ServerDnsDir = @"Templates\xray\server\02_dns"; - private const string ServerRoutingDir = @"Templates\xray\server\03_routing"; - private const string ServerPolicyDir = @"Templates\xray\server\04_policy"; - private const string ServerInboundsDir = @"Templates\xray\server\05_inbounds"; - private const string ServerOutboundsDir = @"Templates\xray\server\06_outbounds"; - private const string ServerTransportDir = @"Templates\xray\server\07_transport"; - private const string ServerStatsDir = @"Templates\xray\server\08_stats"; - private const string ServerReverseDir = @"Templates\xray\server\09_reverse"; - private const string CaddyFileDir = @"Templates\xray\caddy"; - - public XrayProject(SshClient sshClient, XraySettings parameters, Action writeOutput) : base(sshClient, parameters, writeOutput) - { - } - - - /// - /// 安装Xray - /// - public override void Install() - { - try - { - EnsureRootAuth(); - - if (FileExists("/usr/local/bin/xray")) - { - var btnResult = MessageBox.Show("已经安装Xray,是否需要重装?", "提示", MessageBoxButton.YesNo); - if (btnResult == MessageBoxResult.No) - { - MessageBox.Show("安装终止", "提示"); - return; - } - } - - WriteOutput("检测安装系统环境..."); - EnsureSystemEnv(); - WriteOutput("检测安装系统环境完成"); - - WriteOutput("配置服务器端口..."); - ConfigurePort(); - WriteOutput("端口配置完成"); - - WriteOutput("安装必要的系统工具..."); - ConfigureSoftware(); - WriteOutput("系统工具安装完成"); - - WriteOutput("检测IP6..."); - ConfigureIPv6(); - WriteOutput("检测IP6完成"); - - WriteOutput("配置防火墙..."); - ConfigureFirewall(); - WriteOutput("防火墙配置完成"); - - WriteOutput("同步系统和本地时间..."); - SyncTimeDiff(); - WriteOutput("时间同步完成"); - - WriteOutput("检测域名是否绑定本机IP..."); - ValidateDomain(); - WriteOutput("域名检测完成"); - - WriteOutput("安装Xray-Core..."); - InstallXrayWithCert(); - WriteOutput("Xray-Core安装完成"); - - WriteOutput("安装Caddy..."); - InstallCaddy(); - WriteOutput("Caddy安装完成"); - - WriteOutput("启动BBR"); - EnableBBR(); - - UploadCaddyFile(); - WriteOutput("************"); - WriteOutput("安装完成,尽情享用吧......"); - WriteOutput("************"); - } - catch (Exception ex) - { - var errorLog = "安装终止," + ex.Message; - WriteOutput(errorLog); - MessageBox.Show(errorLog); - } - } - - public void UninstallProxy() - { - EnsureRootAuth(); - WriteOutput("卸载Caddy"); - UninstallCaddy(); - WriteOutput("卸载Xray"); - UninstallXray(); - WriteOutput("卸载证书"); - UninstallAcme(); - WriteOutput("关闭端口"); - ClosePort(Parameters.ShadowSocksPort, Parameters.VMESS_KCP_Port); - - WriteOutput("************ 卸载完成 ************"); - } - - /// - /// 更新xray内核 - /// - public void UpdateXrayCore() - { - EnsureRootAuth(); - EnsureSystemEnv(); - RunCmd("bash -c \"$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)\" @ install"); - RunCmd("systemctl restart xray"); - WriteOutput("************ 更新xray内核完成 ************"); - } - - /// - /// 更新xray配置 - /// - public void UpdateXraySettings() - { - EnsureRootAuth(); - EnsureSystemEnv(); - ConfigureFirewall(); - var configJson = XrayConfigBuilder.BuildXrayConfig(Parameters); - var stream = new MemoryStream(Encoding.UTF8.GetBytes(configJson)); - RunCmd("rm -rf /usr/local/etc/xray/config.json"); - UploadFile(stream, "/usr/local/etc/xray/config.json"); - ConfigurePort(); - UploadCaddyFile(string.IsNullOrEmpty(Parameters.MaskDomain)); - RunCmd("systemctl restart xray"); - WriteOutput("************ 更新Xray配置成功,更新配置不包含域名,如果域名更换请重新安装。 ************"); - } - - /// - /// 重装Caddy - /// - public void DoUninstallCaddy() - { - EnsureRootAuth(); - UninstallCaddy(); - WriteOutput("************ 卸载Caddy完成 ************"); - } - - /// - /// 安装证书 - /// - public void InstallCertToXray() - { - EnsureRootAuth(); - EnsureSystemEnv(); - InstallCert( - dirPath: "/usr/local/etc/xray/ssl", - certName: "xray_ssl.crt", - keyName: "xray_ssl.key"); - - RunCmd("systemctl restart xray"); - WriteOutput("************ 安装证书完成 ************"); - } - - /// - /// 上传证书 - /// - /// - /// - public void UploadCert(Stream stream) - { - EnsureRootAuth(); - EnsureSystemEnv(); - - // 转移旧文件 - var oldFileName = $"ssl_{DateTime.Now.Ticks}"; - RunCmd($"mv /usr/local/etc/xray/ssl /usr/local/etc/xray/{oldFileName}"); - - // 上传新文件 - RunCmd("mkdir /usr/local/etc/xray/ssl"); - UploadFile(stream, "/usr/local/etc/xray/ssl/ssl.zip"); - RunCmd("unzip /usr/local/etc/xray/ssl/ssl.zip -d /usr/local/etc/xray/ssl"); - - // 改名 - var crtFiles = RunCmd("find /usr/local/etc/xray/ssl/*.crt").Split("\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); - if (crtFiles.Length > 0) - { - RunCmd($"mv {crtFiles[0]} /usr/local/etc/xray/ssl/xray_ssl.crt"); - } - else - { - WriteOutput("************ 上传证书失败,请联系开发者 ************"); - RunCmd("rm -rf /usr/local/etc/xray/ssl"); - RunCmd($"mv /usr/local/etc/xray/ssl{oldFileName} /usr/local/etc/xray/ssl"); - WriteOutput("操作已回滚"); - return; - } - - var keyFiles = RunCmd("find /usr/local/etc/xray/ssl/*.key").Split("\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); - if (keyFiles.Length > 0) - { - RunCmd($"mv {keyFiles[0]} /usr/local/etc/xray/ssl/xray_ssl.key"); - } - else - { - WriteOutput("************ 上传证书失败,请联系开发者 ************"); - RunCmd("rm -rf /usr/local/etc/xray/ssl"); - RunCmd($"mv /usr/local/etc/xray/ssl{oldFileName} /usr/local/etc/xray/ssl"); - WriteOutput("操作已回滚"); - return; - } - - RunCmd("systemctl restart xray"); - WriteOutput("************ 上传证书完成 ************"); - } - - /// - /// 上传静态网站 - /// - /// - public void UploadWeb(Stream stream) - { - EnsureRootAuth(); - EnsureSystemEnv(); - if (!FileExists("/usr/share/caddy")) - { - RunCmd("mkdir /usr/share/caddy"); - } - RunCmd("rm -rf /usr/share/caddy/*"); - UploadFile(stream, "/usr/share/caddy/caddy.zip"); - RunCmd("unzip /usr/share/caddy/caddy.zip -d /usr/share/caddy"); - RunCmd("chmod -R 777 /usr/share/caddy"); - UploadCaddyFile(useCustomWeb: true); - WriteOutput("************ 上传网站模板完成 ************"); - } - - - private void UploadCaddyFile(bool useCustomWeb = false) - { - var configJson = XrayConfigBuilder.BuildCaddyConfig(Parameters, useCustomWeb); - var stream = new MemoryStream(Encoding.UTF8.GetBytes(configJson)); - if (FileExists("/etc/caddy/Caddyfile")) - { - RunCmd("mv /etc/caddy/Caddyfile /etc/caddy/Caddyfile.back"); - } - UploadFile(stream, "/etc/caddy/Caddyfile"); - RunCmd("systemctl restart caddy"); - } - - - - private void UninstallXray() - { - RunCmd("bash -c \"$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)\" @ remove"); - } - - private void UninstallAcme() - { - RunCmd("acme.sh --uninstall"); - RunCmd("rm -r ~/.acme.sh"); - } - - private void InstallXrayWithCert() - { - RunCmd("bash -c \"$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)\" @ install"); - - if (!FileExists("/usr/local/bin/xray")) - { - WriteOutput("Xray-Core安装失败,请联系开发者"); - throw new Exception("Xray-Core安装失败,请联系开发者"); - } - - RunCmd($"sed -i 's/User=nobody/User=root/g' /etc/systemd/system/xray.service"); - RunCmd($"sed -i 's/CapabilityBoundingSet=/#CapabilityBoundingSet=/g' /etc/systemd/system/xray.service"); - RunCmd($"sed -i 's/AmbientCapabilities=/#AmbientCapabilities=/g' /etc/systemd/system/xray.service"); - RunCmd($"systemctl daemon-reload"); - - if (FileExists("/usr/local/etc/xray/config.json")) - { - RunCmd(@"mv /usr/local/etc/xray/config.json /usr/local/etc/xray/config.json.1"); - } - - WriteOutput("安装TLS证书"); - InstallCertToXray(); - WriteOutput("TLS证书安装完成"); - - - var configJson = XrayConfigBuilder.BuildXrayConfig(Parameters); - var stream = new MemoryStream(Encoding.UTF8.GetBytes(configJson)); - UploadFile(stream, "/usr/local/etc/xray/config.json"); - RunCmd("systemctl restart xray"); - } - - private int GetRandomPort() - { - var random = new Random(); - return random.Next(10001, 60000); - } - - private dynamic LoadJsonObj(string path) - { - if (File.Exists(path)) - { - var jsonStr = File.ReadAllText(path, Encoding.UTF8); - return JsonConvert.DeserializeObject(jsonStr); - } - return null; - } - - } -} diff --git a/ProxySU_Core/Models/Developers/XraySettings.cs b/ProxySU_Core/Models/Developers/XraySettings.cs deleted file mode 100644 index 0b6e274..0000000 --- a/ProxySU_Core/Models/Developers/XraySettings.cs +++ /dev/null @@ -1,220 +0,0 @@ -using Newtonsoft.Json; -using ProxySU_Core.Common; -using ProxySU_Core.Models.Developers; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Web; - -namespace ProxySU_Core.Models -{ - public class XraySettings : IParameters - { - - public XraySettings() - { - var guid = Guid.NewGuid().ToString(); - Port = 443; - VLESS_KCP_Port = 2001; - VLESS_gRPC_Port = 2002; - VMESS_KCP_Port = 3001; - ShadowSocksPort = 4001; - - UUID = guid; - Types = new List(); - - VLESS_WS_Path = "/vlessws"; - VLESS_H2_Path = "/vlessh2"; - VLESS_KCP_Type = "none"; - VLESS_KCP_Seed = guid; - VLESS_gRPC_ServiceName = "xray_gRPC"; - - VMESS_WS_Path = "/vmessws"; - VMESS_TCP_Path = "/vmesstcp"; - VMESS_H2_Path = "/vmessh2"; - VMESS_KCP_Seed = guid; - VMESS_KCP_Type = "none"; - - TrojanPassword = guid; - Trojan_WS_Path = "/trojanws"; - - ShadowsocksPassword = guid; - ShadowsocksMethod = "aes-128-gcm"; - } - - /// - /// 访问端口 - /// - public int Port { get; set; } - - - /// - /// UUID - /// - public string UUID { get; set; } - - #region vless - - - /// - /// vless ws路径 - /// - public string VLESS_WS_Path { get; set; } - - /// - /// vless http2 path - /// - public string VLESS_H2_Path { get; set; } - - /// - /// vless kcp seed - /// - public string VLESS_KCP_Seed { get; set; } - - /// - /// vless kcp type - /// - public string VLESS_KCP_Type { get; set; } - - /// - /// vless kcp端口 - /// - public int VLESS_KCP_Port { get; set; } - - /// - /// grpc service name - /// - public string VLESS_gRPC_ServiceName { get; set; } - - /// - /// grpc port - /// - public int VLESS_gRPC_Port { get; set; } - - #endregion - - #region vmess - /// - /// vmess ws路径 - /// - public string VMESS_WS_Path { get; set; } - - /// - /// vmess tcp路径 - /// - public string VMESS_TCP_Path { get; set; } - - /// - /// vmess http2 path - /// - public string VMESS_H2_Path { get; set; } - - /// - /// vmess kcp seed - /// - public string VMESS_KCP_Seed { get; set; } - - /// - /// vmess kcp type - /// - public string VMESS_KCP_Type { get; set; } - - /// - /// vmess kcp端口 - /// - public int VMESS_KCP_Port { get; set; } - #endregion - - #region Trojan - /// - /// trojan密码 - /// - public string TrojanPassword { get; set; } - - /// - /// trojan ws path - /// - public string Trojan_WS_Path { get; set; } - #endregion - - #region ShadowsocksAEAD - /// - /// ss password - /// - public string ShadowsocksPassword { get; set; } - - /// - /// ss method - /// - public string ShadowsocksMethod { get; set; } - - /// - /// ss端口 - /// - public int ShadowSocksPort { get; set; } - #endregion - - - /// - /// 域名 - /// - public string Domain { get; set; } - - /// - /// 伪装域名 - /// - public string MaskDomain { get; set; } - - /// - /// 安装类型 - /// - public List Types { get; set; } - - public List FreePorts - { - get - { - return new List - { - VLESS_gRPC_Port, - VLESS_KCP_Port, - VMESS_KCP_Port, - ShadowSocksPort, - }; - } - } - - public string GetPath(XrayType type) - { - switch (type) - { - case XrayType.VLESS_WS: - return VLESS_WS_Path; - case XrayType.VLESS_H2: - return VLESS_H2_Path; - - case XrayType.VMESS_TCP: - return VMESS_TCP_Path; - case XrayType.VMESS_WS: - return VMESS_WS_Path; - case XrayType.Trojan_WS: - return Trojan_WS_Path; - - // no path - case XrayType.VLESS_TCP_XTLS: - case XrayType.VLESS_TCP: - case XrayType.VLESS_KCP: - case XrayType.VMESS_KCP: - case XrayType.Trojan_TCP: - return string.Empty; - default: - return string.Empty; - } - } - - } - - -} diff --git a/ProxySU_Core/Models/Host.cs b/ProxySU_Core/Models/Host.cs deleted file mode 100644 index c4d3fc8..0000000 --- a/ProxySU_Core/Models/Host.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ProxySU_Core.Models -{ - public class Host - { - - - public Host() - { - Proxy = new LocalProxy(); - } - - - public string Tag { get; set; } - - public string Address { get; set; } - - public string UserName { get; set; } - - public string Password { get; set; } - - public int Port { get; set; } = 22; - - public string PrivateKeyPath { get; set; } - - public LocalProxy Proxy { get; set; } - - public LoginSecretType SecretType { get; set; } - } -} diff --git a/ProxySU_Core/Models/LocalProxy.cs b/ProxySU_Core/Models/LocalProxy.cs deleted file mode 100644 index 7e71c8b..0000000 --- a/ProxySU_Core/Models/LocalProxy.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace ProxySU_Core.Models -{ - public class LocalProxy - { - public string Address { get; set; } = "127.0.0.1"; - - public int Port { get; set; } = 1080; - - public LocalProxyType Type { get; set; } - - public string UserName { get; set; } - - public string Password { get; set; } - - } -} diff --git a/ProxySU_Core/Models/LocalProxyType.cs b/ProxySU_Core/Models/LocalProxyType.cs deleted file mode 100644 index c74da49..0000000 --- a/ProxySU_Core/Models/LocalProxyType.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace ProxySU_Core.Models -{ - public enum LocalProxyType - { - None = 0, - // - // 摘要: - // A SOCKS4 proxy server. - Socks4 = 1, - // - // 摘要: - // A SOCKS5 proxy server. - Socks5 = 2, - // - // 摘要: - // A HTTP proxy server. - Http = 3 - } -} diff --git a/ProxySU_Core/Models/LoginSecretType.cs b/ProxySU_Core/Models/LoginSecretType.cs deleted file mode 100644 index 66c2602..0000000 --- a/ProxySU_Core/Models/LoginSecretType.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace ProxySU_Core.Models -{ - public enum LoginSecretType - { - Password = 0, - PrivateKey = 1 - } -} diff --git a/ProxySU_Core/Models/Record.cs b/ProxySU_Core/Models/Record.cs deleted file mode 100644 index 091ac2f..0000000 --- a/ProxySU_Core/Models/Record.cs +++ /dev/null @@ -1,24 +0,0 @@ -using ProxySU_Core.Models; -using System; -using System.Collections.Generic; -using System.Text; - -namespace ProxySU_Core.Models -{ - public class Record - { - public Record() - { - - } - - public Record(Host host) - { - this.Host = host; - } - - public Host Host { get; set; } = new Host(); - - public XraySettings Settings { get; set; } = new XraySettings(); - } -} diff --git a/ProxySU_Core/Models/ShareLink.cs b/ProxySU_Core/Models/ShareLink.cs deleted file mode 100644 index 8c606a4..0000000 --- a/ProxySU_Core/Models/ShareLink.cs +++ /dev/null @@ -1,196 +0,0 @@ -using Newtonsoft.Json; -using ProxySU_Core.Common; -using ProxySU_Core.Models.Developers; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Web; - -namespace ProxySU_Core.Models -{ - public class ShareLink - { - public static string Build(XrayType xrayType, XraySettings settings) - { - - switch (xrayType) - { - case XrayType.VLESS_TCP: - case XrayType.VLESS_TCP_XTLS: - case XrayType.VLESS_WS: - case XrayType.VLESS_KCP: - case XrayType.VLESS_gRPC: - case XrayType.Trojan_TCP: - return BuildVlessShareLink(xrayType, settings); - case XrayType.VMESS_TCP: - case XrayType.VMESS_WS: - case XrayType.VMESS_KCP: - return BuildVmessShareLink(xrayType, settings); - case XrayType.ShadowsocksAEAD: - return BuildShadowSocksShareLink(settings); - default: - return string.Empty; - } - } - - private static string BuildShadowSocksShareLink(XraySettings settings) - { - var _method = settings.ShadowsocksMethod; - var _password = settings.ShadowsocksPassword; - var _server = settings.Domain; - var _port = settings.ShadowSocksPort; - - var base64URL = Base64.Encode($"{_method}:{_password}@{_server}:{_port}"); - return "ss://" + base64URL + "#ShadowSocks"; - } - - private static string BuildVmessShareLink(XrayType xrayType, XraySettings settings) - { - var vmess = new Vmess - { - v = "2", - add = settings.Domain, - port = settings.Port.ToString(), - id = settings.UUID, - aid = "0", - net = "", - type = "none", - host = settings.Domain, - path = "", - tls = "tls", - ps = "", - }; - - switch (xrayType) - { - case XrayType.VMESS_TCP: - vmess.ps = "vmess-tcp-tls"; - vmess.net = "tcp"; - vmess.type = "http"; - vmess.path = settings.VMESS_TCP_Path; - break; - case XrayType.VMESS_WS: - vmess.ps = "vmess-ws-tls"; - vmess.net = "ws"; - vmess.type = "none"; - vmess.path = settings.VMESS_WS_Path; - break; - case XrayType.VMESS_KCP: - vmess.ps = "vmess-mKCP"; - vmess.port = settings.VMESS_KCP_Port.ToString(); - vmess.net = "kcp"; - vmess.type = settings.VMESS_KCP_Type; - vmess.path = settings.VMESS_KCP_Seed; - vmess.tls = ""; - break; - default: - return string.Empty; - } - - var base64Url = Base64.Encode(JsonConvert.SerializeObject(vmess)); - return $"vmess://" + base64Url; - } - - private static string BuildVlessShareLink(XrayType xrayType, XraySettings settings) - { - var _protocol = string.Empty; - var _uuid = settings.UUID; - var _domain = settings.Domain; - var _port = settings.Port; - var _type = string.Empty; - var _encryption = "none"; - var _security = "tls"; - var _path = "/"; - var _host = settings.Domain; - var _descriptiveText = string.Empty; - var _headerType = "none"; - var _seed = string.Empty; - - switch (xrayType) - { - case XrayType.VLESS_TCP: - _protocol = "vless"; - _type = "tcp"; - _descriptiveText = "vless-tcp-tls"; - break; - case XrayType.VLESS_TCP_XTLS: - _protocol = "vless"; - _type = "tcp"; - _security = "xtls"; - _descriptiveText = "vless-tcp-xtls"; - break; - case XrayType.VLESS_WS: - _protocol = "vless"; - _type = "ws"; - _path = settings.VLESS_WS_Path; - _descriptiveText = "vless-ws-tls"; - break; - case XrayType.VLESS_KCP: - _protocol = "vless"; - _type = "kcp"; - _headerType = settings.VLESS_KCP_Type; - _seed = settings.VLESS_KCP_Seed; - _port = settings.VLESS_KCP_Port; - _security = "none"; - _descriptiveText = "vless-mKCP"; - break; - case XrayType.VLESS_gRPC: - _protocol = "vless"; - _type = "grpc"; - _path = settings.VLESS_gRPC_ServiceName; - _descriptiveText = "vless-gRPC"; - break; - case XrayType.Trojan_TCP: - _protocol = "trojan"; - _uuid = settings.TrojanPassword; - _descriptiveText = "trojan-tcp"; - break; - default: - throw new Exception("暂未实现的协议"); - } - - - string parametersURL = string.Empty; - if (xrayType != XrayType.Trojan_TCP) - { - // 4.3 传输层相关段 - parametersURL = $"?type={_type}&encryption={_encryption}&security={_security}&path={HttpUtility.UrlEncode(_path)}&headerType={_headerType}"; - - // kcp - if (xrayType == XrayType.VLESS_KCP) - { - parametersURL += $"&seed={_seed}"; - } - - // 4.4 TLS 相关段 - if (xrayType == XrayType.VLESS_TCP_XTLS) - { - parametersURL += "&flow=xtls-rprx-direct"; - } - } - - - return $"{_protocol}://{HttpUtility.UrlEncode(_uuid)}@{_domain}:{_port}{parametersURL}#{HttpUtility.UrlEncode(_descriptiveText)}"; - } - - } - - - - class Vmess - { - public string v { get; set; } - public string ps { get; set; } - public string add { get; set; } - public string port { get; set; } - public string id { get; set; } - public string aid { get; set; } - public string net { get; set; } - public string type { get; set; } - public string host { get; set; } - public string path { get; set; } - public string tls { get; set; } - } -} diff --git a/ProxySU_Core/Models/XrayType.cs b/ProxySU_Core/Models/XrayType.cs deleted file mode 100644 index 6611113..0000000 --- a/ProxySU_Core/Models/XrayType.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ProxySU_Core.Models -{ - public enum XrayType - { - // 入口 - VLESS_TCP_XTLS = 100, - - // VLESS 101开头 - VLESS_TCP = 101, - VLESS_WS = 102, - VLESS_H2 = 103, - VLESS_KCP = 104, - VLESS_gRPC = 110, - - // VMESS 201开头 - VMESS_TCP = 201, - VMESS_WS = 202, - VMESS_H2 = 203, - VMESS_KCP = 204, - - // Trojan 301开头 - Trojan_TCP = 301, - Trojan_WS = 302, - - // SS - ShadowsocksAEAD = 401 - } -} diff --git a/ProxySU_Core/Properties/AssemblyInfo.cs b/ProxySU_Core/Properties/AssemblyInfo.cs deleted file mode 100644 index 2107e9b..0000000 --- a/ProxySU_Core/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System.Reflection; -using System.Resources; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Windows; - -// 有关程序集的一般信息由以下 -// 控制。更改这些特性值可修改 -// 与程序集关联的信息。 -[assembly: AssemblyTitle("ProxySU_Core")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("ProxySU_Core")] -[assembly: AssemblyCopyright("Copyright © 2021")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// 将 ComVisible 设置为 false 会使此程序集中的类型 -//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 -//请将此类型的 ComVisible 特性设置为 true。 -[assembly: ComVisible(false)] - -//若要开始生成可本地化的应用程序,请设置 -//.csproj 文件中的 CultureYouAreCodingWith -//例如,如果您在源文件中使用的是美国英语, -//使用的是美国英语,请将 设置为 en-US。 然后取消 -//对以下 NeutralResourceLanguage 特性的注释。 更新 -//以下行中的“en-US”以匹配项目文件中的 UICulture 设置。 - -//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] - - -[assembly: ThemeInfo( - ResourceDictionaryLocation.None, //主题特定资源词典所处位置 - //(未在页面中找到资源时使用, - //或应用程序资源字典中找到时使用) - ResourceDictionaryLocation.SourceAssembly //常规资源词典所处位置 - //(未在页面中找到资源时使用, - //、应用程序或任何主题专用资源字典中找到时使用) -)] - - -// 程序集的版本信息由下列四个值组成: -// -// 主版本 -// 次版本 -// 生成号 -// 修订号 -// -//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 -//通过使用 "*",如下所示: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("3.1.3.0")] -[assembly: AssemblyFileVersion("3.1.3.0")] diff --git a/ProxySU_Core/Properties/Resources.Designer.cs b/ProxySU_Core/Properties/Resources.Designer.cs deleted file mode 100644 index e7f1775..0000000 --- a/ProxySU_Core/Properties/Resources.Designer.cs +++ /dev/null @@ -1,63 +0,0 @@ -//------------------------------------------------------------------------------ -// -// 此代码由工具生成。 -// 运行时版本:4.0.30319.42000 -// -// 对此文件的更改可能会导致不正确的行为,并且如果 -// 重新生成代码,这些更改将会丢失。 -// -//------------------------------------------------------------------------------ - -namespace ProxySU_Core.Properties { - using System; - - - /// - /// 一个强类型的资源类,用于查找本地化的字符串等。 - /// - // 此类是由 StronglyTypedResourceBuilder - // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 - // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen - // (以 /str 作为命令选项),或重新生成 VS 项目。 - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// 返回此类使用的缓存的 ResourceManager 实例。 - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ProxySU_Core.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// 重写当前线程的 CurrentUICulture 属性,对 - /// 使用此强类型资源类的所有资源查找执行重写。 - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - } -} diff --git a/ProxySU_Core/Properties/Resources.resx b/ProxySU_Core/Properties/Resources.resx deleted file mode 100644 index af7dbeb..0000000 --- a/ProxySU_Core/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/ProxySU_Core/Properties/Settings.Designer.cs b/ProxySU_Core/Properties/Settings.Designer.cs deleted file mode 100644 index a45c35e..0000000 --- a/ProxySU_Core/Properties/Settings.Designer.cs +++ /dev/null @@ -1,26 +0,0 @@ -//------------------------------------------------------------------------------ -// -// 此代码由工具生成。 -// 运行时版本:4.0.30319.42000 -// -// 对此文件的更改可能会导致不正确的行为,并且如果 -// 重新生成代码,这些更改将会丢失。 -// -//------------------------------------------------------------------------------ - -namespace ProxySU_Core.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.8.1.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - } -} diff --git a/ProxySU_Core/Properties/Settings.settings b/ProxySU_Core/Properties/Settings.settings deleted file mode 100644 index 033d7a5..0000000 --- a/ProxySU_Core/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/ProxySU_Core/ProxySU.ico b/ProxySU_Core/ProxySU.ico deleted file mode 100644 index 9d7a128c59c121d3e72c9d81575b05bde4971b2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16958 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 MX!L67IYICL0XR=#Gynhq diff --git a/ProxySU_Core/ProxySU_Core.csproj b/ProxySU_Core/ProxySU_Core.csproj deleted file mode 100644 index aeca57f..0000000 --- a/ProxySU_Core/ProxySU_Core.csproj +++ /dev/null @@ -1,463 +0,0 @@ - - - - - Debug - AnyCPU - {B066015C-D347-4493-92F1-6556D3863996} - WinExe - ProxySU_Core - ProxySU_Core - v4.7.2 - 512 - {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 4 - true - true - - - false - C:\Users\huife\Desktop\publish_new\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 1 - 1.0.0.%2a - false - true - true - - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - D529B8E43BC86188988D830C545B400612900BB3 - - - ProxySU_Core_TemporaryKey.pfx - - - true - - - false - - - ProxySU.ico - - - - ..\packages\ControlzEx.5.0.0\lib\net452\ControlzEx.dll - - - ..\packages\MahApps.Metro.2.4.5\lib\net46\MahApps.Metro.dll - - - ..\packages\MaterialDesignColors.2.0.1\lib\net452\MaterialDesignColors.dll - - - ..\packages\MaterialDesignThemes.MahApps.0.1.7\lib\net452\MaterialDesignThemes.MahApps.dll - - - ..\packages\MaterialDesignThemes.4.1.0\lib\net452\MaterialDesignThemes.Wpf.dll - - - ..\packages\Microsoft.Xaml.Behaviors.Wpf.1.1.31\lib\net45\Microsoft.Xaml.Behaviors.dll - - - ..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll - - - ..\packages\QRCoder.1.4.1\lib\net40\QRCoder.dll - - - ..\packages\SSH.NET.2020.0.1\lib\net40\Renci.SshNet.dll - - - - - - - - - - - - - - - - 4.0 - - - - - - - - MSBuild:Compile - Designer - - - App.xaml - Code - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ClientInfoWindow.xaml - - - ShadowSocksControl.xaml - - - Trojan_TCP_Control.xaml - - - VLESS_gRPC_Control.xaml - - - VLESS_KCP_Control.xaml - - - VLESS_TCP_TLS_Control.xaml - - - VLESS_WS_TLS_Control.xaml - - - VLESS_XTLS_Control.xaml - - - VMESS_KCP_Control.xaml - - - VMESS_TCP_TLS_Control.xaml - - - VMESS_WS_TLS_Control.xaml - - - MainWindow.xaml - - - RecordEditorWindow.xaml - - - ServerInfoControl.xaml - - - XrayEditorControl.xaml - - - TerminalWindow.xaml - - - TextBoxWindow.xaml - - - - - - Code - - - True - True - Resources.resx - - - True - Settings.settings - True - - - ResXFileCodeGenerator - Resources.Designer.cs - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - - - - - - MSBuild:Compile - Designer - - - MSBuild:Compile - Designer - - - MSBuild:Compile - Designer - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - MSBuild:Compile - Designer - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - MSBuild:Compile - Designer - - - Designer - MSBuild:Compile - - - - - - - - False - Microsoft .NET Framework 4.6.1 %28x86 和 x64%29 - true - - - False - .NET Framework 3.5 SP1 - false - - - - - - - - - - - - - - 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 - - - - \ No newline at end of file diff --git a/ProxySU_Core/Resources/Languages/en.xaml b/ProxySU_Core/Resources/Languages/en.xaml deleted file mode 100644 index dc9d5ab..0000000 --- a/ProxySU_Core/Resources/Languages/en.xaml +++ /dev/null @@ -1,122 +0,0 @@ - - Deployment - Readme - - Language(语言) - Chinese - English - Hosts - Add Host - Export Config - Export Sub - Random - - - - Selection - Remark - Host - Port - Proxy - Actions - Cnsole - Config - Edit - Delete - - - Actions - Connect - Edit - Edit Xray - Delete - Install - Save - Save as - Info - Warning - Error - - - - Server Editor - Connection - User - Password - Tag - Host - Port - Method - Password Login - KeyLogin - Key - Upload - Proxy - Method - None - Http - Socks5 - Host - Port - User - Password - Please enter host - Please enter port - Please enter proxy host - Please enter proxy port - - - VLESS over TCP With XTLS Preferred - VLESS over TCP with TLS XTLS is Preferred - VLESS over WS with TLS Support CDN - VLESS mKCP low delay - VMESS over WS with TLS Support CDN - VMESS mKCP low delay - ShadowSocks Support CDN - Trojan over TCP with TLS Trojan - - Address - GuiseHost - UUID - VLESS WS Path - VLESS KCP Seed - VLESS KCP Type - VLESS KCP Port - VMESS WS Path - VMESS KCP Seed - VMESS KCP Type - VMESS KCP Port - SS Pwd - SS Method - Trojan Pwd - xray Port - default port is 443 - - - Console - xray/settings - Install - UpdateSettings - UpdateXray - UninstallXray - - cert/web - UpdateCert - UploadSelfCert - UploadWebite - UninstallCaddy - - Install: Finally output "please enjoy" to indicate completion, go to [Configuration] or [Config] to view the node - Update Settings: After modifying the node configuration information, there is no need to reinstall, this function can update the configuration - Update Cert: The certificate is automatically updated by default, but it is not guaranteed to be updated successfully. If it fails, please use [Update Cert] to update manually - Upload website: Disguise the website, the correct static webpage must have an index.html file (please check), and then upload the website compressed package. - The following is a static web page connection provided by netizens, please check whether there is an index.html file by yourself - - - - - View Settings - - \ No newline at end of file diff --git a/ProxySU_Core/Resources/Languages/zh_cn.xaml b/ProxySU_Core/Resources/Languages/zh_cn.xaml deleted file mode 100644 index dc13120..0000000 --- a/ProxySU_Core/Resources/Languages/zh_cn.xaml +++ /dev/null @@ -1,120 +0,0 @@ - - 应用布署 - 说明文档 - - 语言(Language) - 中文 - 英文 - 主机列表 - 添加主机 - 导出配置 - 导出订阅 - 随机 - - - 选择 - 别名 - 主机 - 端口 - 代理 - 操作 - 控制台 - 查看配置 - 编辑 - 删除 - - - 连接 - 安装 - 编辑 - 编辑模板 - 删除 - 保存 - 另存为 - 消息 - 提示 - 错误 - - - 服务器管理 - 连接 - 用户名 - 密码 - 别名 - 主机 - 端口 - 登陆方式 - 密码登陆 - 密钥登陆 - 密钥 - 上传 - 代理 - 类型 - - Http - Socks5 - 代理地址 - 代理端口 - 用户名 - 密码 - 请输入主机 - 请输入端口号 - 请输入代理地址 - 请输入代理端口号 - - VLESS Over TCP With XTLS 性能数倍,首选方式。 - VLESS over TCP with TLS 仍推荐XTLS。 - VLESS over WS with TLS 推荐,支持CDN。 - VLESS mKCP 游戏推荐,延迟低。 - VMESS over WS with TLS 推荐,支持CDN。 - VMESS mKCP 游戏推荐,延迟低。 - ShadowSocks SS,支持udp。 - Trojan over TCP with TLS Trojan。 - - - 域名 - 伪装域名 - UUID - VLESS WS路径 - VLESS KCP Seed - VLESS KCP伪装 - VLESS KCP端口 - VMESS WS路径 - VMESS KCP Seed - VMESS KCP伪装 - VMESS KCP端口 - SS密码 - SS加密方式 - Trojan密码 - xray端口 - 默认端口443,不建议修改 - - - - - 控制台 - 内核/配置 - 一键安装 - 更新配置 - 更新xray内核 - 卸载代理 - - 证书/网站 - 续签证书 - 上传自有证书 - 上传网站 - 卸载Caddy - - 一键安装: 最后输出 “请尽情享用” 表示完成,到[查看配置]或[导出配置]查看节点 - 更新配置: 修改节点配置信息后,不需要重新安装,这个功能就可以更新配置了 - 续签证书: 证书默认是自动续签,但不保证都能续签成功,如果失败请用[续签证书]手动续签 - 上传网站: 伪装网站,正确的静态网页要有index.html文件(请检查),然后将网站压缩包上传。 - 如下是网友提供的静态网页连接,请自行检查是否有index.html文件 - - - - 查看配置信息 - - \ No newline at end of file diff --git a/ProxySU_Core/Resources/ProxySU.ico b/ProxySU_Core/Resources/ProxySU.ico deleted file mode 100644 index 9d7a128c59c121d3e72c9d81575b05bde4971b2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16958 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 MX!L67IYICL0XR=#Gynhq diff --git a/ProxySU_Core/Resources/Styles/MaterialDesignThemes.Overrides.xaml b/ProxySU_Core/Resources/Styles/MaterialDesignThemes.Overrides.xaml deleted file mode 100644 index 5909ff8..0000000 --- a/ProxySU_Core/Resources/Styles/MaterialDesignThemes.Overrides.xaml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/ProxySU_Core/Templates/trojan-go/base.caddyfile b/ProxySU_Core/Templates/trojan-go/base.caddyfile deleted file mode 100644 index 7975d73..0000000 --- a/ProxySU_Core/Templates/trojan-go/base.caddyfile +++ /dev/null @@ -1,9 +0,0 @@ -:##port## { - root * /usr/share/caddy - file_server - ##reverse_proxy## -} - -##domain##:80 { - redir https://##domain##{uri} -} \ No newline at end of file diff --git a/ProxySU_Core/Templates/trojan-go/trojan-go.json b/ProxySU_Core/Templates/trojan-go/trojan-go.json deleted file mode 100644 index acb0207..0000000 --- a/ProxySU_Core/Templates/trojan-go/trojan-go.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "run_type": "server", - "local_addr": "0.0.0.0", - "local_port": 443, - "remote_addr": "127.0.0.1", - "remote_port": 80, - "password": [ - "" - ], - "ssl": { - "cert": "/usr/local/etc/trojan-go/trojan-go.crt", - "key": "/usr/local/etc/trojan-go/trojan-go.key", - "sni": "" - } - -} diff --git a/ProxySU_Core/Templates/xray/base.json b/ProxySU_Core/Templates/xray/base.json deleted file mode 100644 index 84a9d1f..0000000 --- a/ProxySU_Core/Templates/xray/base.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "log": {}, - "api": {}, - "dns": {}, - "routing": {}, - "policy": {}, - "inbounds": [], - "outbounds": [], - "transport": {}, - "stats": {}, - "reverse": {} -} \ No newline at end of file diff --git a/ProxySU_Core/Templates/xray/caddy/base.caddyfile b/ProxySU_Core/Templates/xray/caddy/base.caddyfile deleted file mode 100644 index 7975d73..0000000 --- a/ProxySU_Core/Templates/xray/caddy/base.caddyfile +++ /dev/null @@ -1,9 +0,0 @@ -:##port## { - root * /usr/share/caddy - file_server - ##reverse_proxy## -} - -##domain##:80 { - redir https://##domain##{uri} -} \ No newline at end of file diff --git a/ProxySU_Core/Templates/xray/client/00_log/00_log.json b/ProxySU_Core/Templates/xray/client/00_log/00_log.json deleted file mode 100644 index 6a4cf00..0000000 --- a/ProxySU_Core/Templates/xray/client/00_log/00_log.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "log": { - "loglevel": "warning" - } -} \ No newline at end of file diff --git a/ProxySU_Core/Templates/xray/client/01_api/01_api.json b/ProxySU_Core/Templates/xray/client/01_api/01_api.json deleted file mode 100644 index aa1982b..0000000 --- a/ProxySU_Core/Templates/xray/client/01_api/01_api.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "api": null -} \ No newline at end of file diff --git a/ProxySU_Core/Templates/xray/client/02_dns/02_dns.json b/ProxySU_Core/Templates/xray/client/02_dns/02_dns.json deleted file mode 100644 index 63472d2..0000000 --- a/ProxySU_Core/Templates/xray/client/02_dns/02_dns.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "dns": {} -} \ No newline at end of file diff --git a/ProxySU_Core/Templates/xray/client/03_routing/03_routing.json b/ProxySU_Core/Templates/xray/client/03_routing/03_routing.json deleted file mode 100644 index a187d31..0000000 --- a/ProxySU_Core/Templates/xray/client/03_routing/03_routing.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "routing": {} -} \ No newline at end of file diff --git a/ProxySU_Core/Templates/xray/client/04_policy/04_policy.json b/ProxySU_Core/Templates/xray/client/04_policy/04_policy.json deleted file mode 100644 index 4beed61..0000000 --- a/ProxySU_Core/Templates/xray/client/04_policy/04_policy.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "policy": {} -} \ No newline at end of file diff --git a/ProxySU_Core/Templates/xray/client/05_inbounds/05_inbounds.json b/ProxySU_Core/Templates/xray/client/05_inbounds/05_inbounds.json deleted file mode 100644 index c402972..0000000 --- a/ProxySU_Core/Templates/xray/client/05_inbounds/05_inbounds.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "inbounds": [ - { - "protocol": "http", - "port": 1081 - }, - { - "port": 1080, - "protocol": "socks", - "sniffing": { - "enabled": true, - "destOverride": [ - "http", - "tls" - ] - }, - "settings": { - "udp": true, - "auth": "noauth" - } - } - ] -} \ No newline at end of file diff --git a/ProxySU_Core/Templates/xray/client/06_outbounds/06_outbounds.json b/ProxySU_Core/Templates/xray/client/06_outbounds/06_outbounds.json deleted file mode 100644 index 20e2beb..0000000 --- a/ProxySU_Core/Templates/xray/client/06_outbounds/06_outbounds.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "outbounds": [] -} \ No newline at end of file diff --git a/ProxySU_Core/Templates/xray/client/06_outbounds/VLESS_HTTP2_TLS.json b/ProxySU_Core/Templates/xray/client/06_outbounds/VLESS_HTTP2_TLS.json deleted file mode 100644 index 8718383..0000000 --- a/ProxySU_Core/Templates/xray/client/06_outbounds/VLESS_HTTP2_TLS.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "outbounds": [ - { - "protocol": "vless", - "settings": { - "vnext": [ - { - "address": "", - "port": 443, - "users": [ - { - "id": "", - "encryption": "none" - } - ] - } - ] - }, - "streamSettings": { - "network": "h2", - "security": "tls", - "httpSettings": { - "host": [ - "" - ], - "path": null - } - } - } - ] -} diff --git a/ProxySU_Core/Templates/xray/client/06_outbounds/VLESS_TCP_TLS_WS.json b/ProxySU_Core/Templates/xray/client/06_outbounds/VLESS_TCP_TLS_WS.json deleted file mode 100644 index 7a3c871..0000000 --- a/ProxySU_Core/Templates/xray/client/06_outbounds/VLESS_TCP_TLS_WS.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "outbounds": [ - { - "protocol": "vless", - "settings": { - "vnext": [ - { - "address": "", - "port": 443, - "users": [ - { - "id": "", - "encryption": "none", - "level": 0 - } - ] - } - ] - }, - "streamSettings": { - "network": "ws", - "security": "tls", - "tlsSettings": { - "serverName": "" - }, - "wsSettings": { - "path": "" - } - } - } - ] -} diff --git a/ProxySU_Core/Templates/xray/client/07_transport/07_transport.json b/ProxySU_Core/Templates/xray/client/07_transport/07_transport.json deleted file mode 100644 index 6269103..0000000 --- a/ProxySU_Core/Templates/xray/client/07_transport/07_transport.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "transport": {} -} \ No newline at end of file diff --git a/ProxySU_Core/Templates/xray/client/08_stats/08_stats.json b/ProxySU_Core/Templates/xray/client/08_stats/08_stats.json deleted file mode 100644 index 02c9ed0..0000000 --- a/ProxySU_Core/Templates/xray/client/08_stats/08_stats.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "stats": null -} \ No newline at end of file diff --git a/ProxySU_Core/Templates/xray/client/09_reverse/09_reverse.json b/ProxySU_Core/Templates/xray/client/09_reverse/09_reverse.json deleted file mode 100644 index 6fa38a4..0000000 --- a/ProxySU_Core/Templates/xray/client/09_reverse/09_reverse.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "reverse": {} -} \ No newline at end of file diff --git a/ProxySU_Core/Templates/xray/server/00_log/00_log.json b/ProxySU_Core/Templates/xray/server/00_log/00_log.json deleted file mode 100644 index 40c2cd5..0000000 --- a/ProxySU_Core/Templates/xray/server/00_log/00_log.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "log": { - "access": "none", - "loglevel": "none" - } -} \ No newline at end of file diff --git a/ProxySU_Core/Templates/xray/server/01_api/01_api.json b/ProxySU_Core/Templates/xray/server/01_api/01_api.json deleted file mode 100644 index 34c6b17..0000000 --- a/ProxySU_Core/Templates/xray/server/01_api/01_api.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "api": {} -} \ No newline at end of file diff --git a/ProxySU_Core/Templates/xray/server/02_dns/02_dns.json b/ProxySU_Core/Templates/xray/server/02_dns/02_dns.json deleted file mode 100644 index 63472d2..0000000 --- a/ProxySU_Core/Templates/xray/server/02_dns/02_dns.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "dns": {} -} \ No newline at end of file diff --git a/ProxySU_Core/Templates/xray/server/03_routing/03_routing.json b/ProxySU_Core/Templates/xray/server/03_routing/03_routing.json deleted file mode 100644 index 0aa4964..0000000 --- a/ProxySU_Core/Templates/xray/server/03_routing/03_routing.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "routing": { - "domainStrategy": "AsIs", - "rules": [ - { - "type": "field", - "ip": [ - "geoip:private" - ], - "outboundTag": "block" - } - ] - } -} \ No newline at end of file diff --git a/ProxySU_Core/Templates/xray/server/04_policy/04_policy.json b/ProxySU_Core/Templates/xray/server/04_policy/04_policy.json deleted file mode 100644 index 4beed61..0000000 --- a/ProxySU_Core/Templates/xray/server/04_policy/04_policy.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "policy": {} -} \ No newline at end of file diff --git a/ProxySU_Core/Templates/xray/server/05_inbounds/05_inbounds.json b/ProxySU_Core/Templates/xray/server/05_inbounds/05_inbounds.json deleted file mode 100644 index 24465ae..0000000 --- a/ProxySU_Core/Templates/xray/server/05_inbounds/05_inbounds.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "inbounds": [] -} diff --git a/ProxySU_Core/Templates/xray/server/05_inbounds/Shadowsocks-AEAD.json b/ProxySU_Core/Templates/xray/server/05_inbounds/Shadowsocks-AEAD.json deleted file mode 100644 index e7179e5..0000000 --- a/ProxySU_Core/Templates/xray/server/05_inbounds/Shadowsocks-AEAD.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "port": 12345, - "protocol": "shadowsocks", - "settings": { - "clients": [ - { - "password": "", - "method": "aes-128-gcm" - } - ], - "network": "tcp,udp" - } -} \ No newline at end of file diff --git a/ProxySU_Core/Templates/xray/server/05_inbounds/Trojan_TCP.json b/ProxySU_Core/Templates/xray/server/05_inbounds/Trojan_TCP.json deleted file mode 100644 index 8ea5ad9..0000000 --- a/ProxySU_Core/Templates/xray/server/05_inbounds/Trojan_TCP.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "port": 1310, - "listen": "127.0.0.1", - "protocol": "trojan", - "settings": { - "clients": [ - { - "password": "" - } - ], - "fallbacks": [ - { - "dest": 8080 - } - ] - }, - "streamSettings": { - "network": "tcp", - "security": "none", - "tcpSettings": { - "acceptProxyProtocol": true - } - } -} diff --git a/ProxySU_Core/Templates/xray/server/05_inbounds/Trojan_WS.json b/ProxySU_Core/Templates/xray/server/05_inbounds/Trojan_WS.json deleted file mode 100644 index 51d725c..0000000 --- a/ProxySU_Core/Templates/xray/server/05_inbounds/Trojan_WS.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "port": 1320, - "listen": "127.0.0.1", - "protocol": "trojan", - "settings": { - "clients": [ - { - "password": "" - } - ], - "fallbacks": [ - { - "dest": 80 - } - ] - }, - - "streamSettings": { - "network": "ws", - "security": "none", - "wsSettings": { - "acceptProxyProtocol": true, - "path": "/trojanws" - } - } -} diff --git a/ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_HTTP2.json b/ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_HTTP2.json deleted file mode 100644 index a99e848..0000000 --- a/ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_HTTP2.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "port": 1234, - "listen": "127.0.0.1", - "protocol": "vmess", - "settings": { - "decryption": "none", - "clients": [ - { - "id": "" - } - ] - }, - "streamSettings": { - "network": "h2", - "httpSettings": { - "path": "" - } - } -} \ No newline at end of file diff --git a/ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_KCP.json b/ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_KCP.json deleted file mode 100644 index a619549..0000000 --- a/ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_KCP.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "port": 3456, - "protocol": "vless", - "settings": { - "clients": [ - { - "id": "" - } - ], - "decryption": "none" - }, - "streamSettings": { - "network": "mkcp", - "kcpSettings": { - "uplinkCapacity": 100, - "downlinkCapacity": 100, - "congestion": true, - "header": { - "type": "none" - }, - "seed": null - } - } -} diff --git a/ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_TCP_XTLS.json b/ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_TCP_XTLS.json deleted file mode 100644 index eab8363..0000000 --- a/ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_TCP_XTLS.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "port": 443, - "protocol": "vless", - "settings": { - "clients": [ - { - "id": "", - "flow": "xtls-rprx-direct" - } - ], - "decryption": "none", - "fallbacks": [] - }, - "streamSettings": { - "network": "tcp", - "security": "xtls", - "xtlsSettings": { - "allowInsecure": false, - "minVersion": "1.2", - "alpn": [ - "http/1.1" - ], - "certificates": [ - { - "certificateFile": "/usr/local/etc/xray/ssl/xray_ssl.crt", - "keyFile": "/usr/local/etc/xray/ssl/xray_ssl.key" - } - ] - } - } -} \ No newline at end of file diff --git a/ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_WS.json b/ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_WS.json deleted file mode 100644 index 0abf2e8..0000000 --- a/ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_WS.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "port": 1234, - "listen": "127.0.0.1", - "protocol": "vless", - "settings": { - "clients": [ - { - "id": "" - } - ], - "decryption": "none" - }, - "streamSettings": { - "network": "ws", - "security": "none", - "wsSettings": { - "acceptProxyProtocol": true, - "path": "/websocket" - } - } -} diff --git a/ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_gRPC.json b/ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_gRPC.json deleted file mode 100644 index 319888d..0000000 --- a/ProxySU_Core/Templates/xray/server/05_inbounds/VLESS_gRPC.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "port": 2002, - "listen": "127.0.0.1", - "protocol": "vless", - "settings": { - "clients": [ - { - "id": "" - } - ], - "decryption": "none" - }, - "streamSettings": { - "network": "grpc", - "grpcSettings": { - "serviceName": "", - "certificates": [ - { - "certificateFile": "/usr/local/etc/xray/ssl/xray_ssl.crt", - "keyFile": "/usr/local/etc/xray/ssl/xray_ssl.key" - } - ] - } - } -} diff --git a/ProxySU_Core/Templates/xray/server/05_inbounds/VMESS_HTTP2.json b/ProxySU_Core/Templates/xray/server/05_inbounds/VMESS_HTTP2.json deleted file mode 100644 index 9957e76..0000000 --- a/ProxySU_Core/Templates/xray/server/05_inbounds/VMESS_HTTP2.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "port": 1234, - "listen": "127.0.0.1", - "protocol": "vmess", - "settings": { - "clients": [ - { - "id": "" - } - ] - }, - "streamSettings": { - "network": "h2", - "httpSettings": { - "path": "" - } - } -} \ No newline at end of file diff --git a/ProxySU_Core/Templates/xray/server/05_inbounds/VMESS_KCP.json b/ProxySU_Core/Templates/xray/server/05_inbounds/VMESS_KCP.json deleted file mode 100644 index 0c3ea2b..0000000 --- a/ProxySU_Core/Templates/xray/server/05_inbounds/VMESS_KCP.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "port": 3456, - "protocol": "vmess", - "settings": { - "clients": [ - { - "id": "" - } - ] - }, - "streamSettings": { - "network": "mkcp", - "kcpSettings": { - "uplinkCapacity": 100, - "downlinkCapacity": 100, - "congestion": true, - "header": { - "type": "none" - }, - "seed": null - } - } -} diff --git a/ProxySU_Core/Templates/xray/server/05_inbounds/VMESS_TCP.json b/ProxySU_Core/Templates/xray/server/05_inbounds/VMESS_TCP.json deleted file mode 100644 index b14181e..0000000 --- a/ProxySU_Core/Templates/xray/server/05_inbounds/VMESS_TCP.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "port": 443, - "listen": "127.0.0.1", - "protocol": "vmess", - "settings": { - "clients": [ - { - "id": "" - } - ] - }, - "streamSettings": { - "network": "tcp", - "security": "none", - "tcpSettings": { - "acceptProxyProtocol": true, - "header": { - "type": "http", - "request": { - "path": [ - "/vmesstcp" - ] - } - } - } - } -} diff --git a/ProxySU_Core/Templates/xray/server/05_inbounds/VMESS_WS.json b/ProxySU_Core/Templates/xray/server/05_inbounds/VMESS_WS.json deleted file mode 100644 index 2e863a4..0000000 --- a/ProxySU_Core/Templates/xray/server/05_inbounds/VMESS_WS.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "port": 3456, - "listen": "127.0.0.1", - "protocol": "vmess", - "settings": { - "clients": [ - { - "id": "" - } - ] - }, - "streamSettings": { - "network": "ws", - "security": "none", - "wsSettings": { - "acceptProxyProtocol": true, - "path": "/vmessws" - } - } -} diff --git a/ProxySU_Core/Templates/xray/server/06_outbounds/06_outbounds.json b/ProxySU_Core/Templates/xray/server/06_outbounds/06_outbounds.json deleted file mode 100644 index 467a4e1..0000000 --- a/ProxySU_Core/Templates/xray/server/06_outbounds/06_outbounds.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "outbounds": [ - { - "protocol": "freedom", - "tag": "direct" - }, - { - "protocol": "blackhole", - "tag": "block" - } - ] -} \ No newline at end of file diff --git a/ProxySU_Core/Templates/xray/server/07_transport/07_transport.json b/ProxySU_Core/Templates/xray/server/07_transport/07_transport.json deleted file mode 100644 index 6269103..0000000 --- a/ProxySU_Core/Templates/xray/server/07_transport/07_transport.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "transport": {} -} \ No newline at end of file diff --git a/ProxySU_Core/Templates/xray/server/08_stats/08_stats.json b/ProxySU_Core/Templates/xray/server/08_stats/08_stats.json deleted file mode 100644 index b406e15..0000000 --- a/ProxySU_Core/Templates/xray/server/08_stats/08_stats.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "stats": {} -} \ No newline at end of file diff --git a/ProxySU_Core/Templates/xray/server/09_reverse/09_reverse.json b/ProxySU_Core/Templates/xray/server/09_reverse/09_reverse.json deleted file mode 100644 index 6fa38a4..0000000 --- a/ProxySU_Core/Templates/xray/server/09_reverse/09_reverse.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "reverse": {} -} \ No newline at end of file diff --git a/ProxySU_Core/Tools/DateTimeUtils.cs b/ProxySU_Core/Tools/DateTimeUtils.cs deleted file mode 100644 index 32cb7b5..0000000 --- a/ProxySU_Core/Tools/DateTimeUtils.cs +++ /dev/null @@ -1,83 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Net; -using System.Runtime.InteropServices; -using System.Text; - -namespace ProxySU_Core.Tools -{ - public static class DateTimeUtils - { - /// - /// 从国家授时中心获取标准GMT时间,读取https://www.tsa.cn - /// GMT时间与UTC时间没有差别,可以UTC=GMT - /// - /// 返回网络时间 - public static DateTime GetUTCTime() - { - DateTime time; - try - { - HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.tsa.cn"); - request.Method = "HEAD"; - request.AllowAutoRedirect = false; - HttpWebResponse reponse = (HttpWebResponse)request.GetResponse(); - string cc = reponse.GetResponseHeader("date"); - reponse.Close(); - - bool s = GMTStrParse(cc, out time); - return time; - } - catch - { - return new DateTime(1970, 1, 1, 0, 0, 0, 0); - } - } - - public static bool GMTStrParse(string gmtStr, out DateTime gmtTime) //抓取的date是GMT格式的字符串,这里转成datetime - { - CultureInfo enUS = new CultureInfo("en-US"); - bool s = DateTime.TryParseExact(gmtStr, "r", enUS, DateTimeStyles.None, out gmtTime); - return s; - } - - //设置系统时间的API函数 - [DllImport("kernel32.dll")] - private static extern bool SetLocalTime(ref SYSTEMTIME time); - - [StructLayout(LayoutKind.Sequential)] - private struct SYSTEMTIME - { - public short year; - public short month; - public short dayOfWeek; - public short day; - public short hour; - public short minute; - public short second; - public short milliseconds; - } - - /// - /// 设置系统时间 - /// - /// 需要设置的时间 - /// 返回系统时间设置状态,true为成功,false为失败 - public static bool SetDate(DateTime dt) - { - SYSTEMTIME st; - - st.year = (short)dt.Year; - st.month = (short)dt.Month; - st.dayOfWeek = (short)dt.DayOfWeek; - st.day = (short)dt.Day; - st.hour = (short)dt.Hour; - st.minute = (short)dt.Minute; - st.second = (short)dt.Second; - st.milliseconds = (short)dt.Millisecond; - bool rt = SetLocalTime(ref st); - return rt; - } - } -} diff --git a/ProxySU_Core/Tools/Extensions.cs b/ProxySU_Core/Tools/Extensions.cs deleted file mode 100644 index 1c4af48..0000000 --- a/ProxySU_Core/Tools/Extensions.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Runtime.Serialization.Formatters.Binary; -using System.Text; -using System.Threading.Tasks; - -namespace System -{ - public static class Extensions - { - // Deep clone - public static T DeepClone(this T obj) - { - if (obj == null) - throw new ArgumentNullException("Object cannot be null"); - return (T)Process(obj); - } - - static object Process(object obj) - { - if (obj == null) - return null; - Type type = obj.GetType(); - if (type.IsValueType || type == typeof(string)) - { - return obj; - } - else if (type.IsArray) - { - Type elementType = Type.GetType( - type.FullName.Replace("[]", string.Empty)); - var array = obj as Array; - Array copied = Array.CreateInstance(elementType, array.Length); - for (int i = 0; i < array.Length; i++) - { - copied.SetValue(Process(array.GetValue(i)), i); - } - return Convert.ChangeType(copied, obj.GetType()); - } - else if (type.IsClass) - { - object toret = Activator.CreateInstance(obj.GetType()); - FieldInfo[] fields = type.GetFields(BindingFlags.Public | - BindingFlags.NonPublic | BindingFlags.Instance); - foreach (FieldInfo field in fields) - { - object fieldValue = field.GetValue(obj); - if (fieldValue == null) - continue; - field.SetValue(toret, Process(fieldValue)); - } - return toret; - } - else - throw new ArgumentException("Unknown type"); - } - - } -} diff --git a/ProxySU_Core/ViewModels/BaseCommand.cs b/ProxySU_Core/ViewModels/BaseCommand.cs deleted file mode 100644 index 21860cd..0000000 --- a/ProxySU_Core/ViewModels/BaseCommand.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Input; - -namespace ProxySU_Core.ViewModels -{ - public class BaseCommand : ICommand - { - private readonly Action _execution; - private readonly Func _canExecute; - - public BaseCommand(Action execution, Func canExecute = null) - { - _execution = execution; - _canExecute = canExecute; - } - - - - public event EventHandler CanExecuteChanged; - - public bool CanExecute(object parameter) - { - if (_canExecute == null) - { - return true; - } - - return _canExecute(parameter); - } - - public void Execute(object parameter) - { - if (_execution != null && CanExecute(parameter)) - { - _execution.Invoke(parameter); - } - } - } -} diff --git a/ProxySU_Core/ViewModels/BaseModel.cs b/ProxySU_Core/ViewModels/BaseModel.cs deleted file mode 100644 index 5255ebb..0000000 --- a/ProxySU_Core/ViewModels/BaseModel.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ProxySU_Core.ViewModels -{ - public class BaseViewModel2 : INotifyPropertyChanged - { - - protected bool SetProperty(ref T backingStore, T value, - string propertyName = "", - Action onChanged = null) - { - if (EqualityComparer.Default.Equals(backingStore, value)) - return false; - - backingStore = value; - onChanged?.Invoke(); - OnPropertyChanged(propertyName); - return true; - } - - #region INotifyPropertyChanged - public event PropertyChangedEventHandler PropertyChanged; - protected void OnPropertyChanged(string propertyName = "") - { - var changed = PropertyChanged; - if (changed == null) - return; - - changed.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } - #endregion - } -} diff --git a/ProxySU_Core/ViewModels/BaseViewModel.cs b/ProxySU_Core/ViewModels/BaseViewModel.cs deleted file mode 100644 index 1aa2f1c..0000000 --- a/ProxySU_Core/ViewModels/BaseViewModel.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Text; - -namespace ProxySU_Core.ViewModels -{ - public abstract class BaseViewModel : INotifyPropertyChanged - { - public event PropertyChangedEventHandler PropertyChanged; - - public void Notify(string propertyName) - { - if (PropertyChanged != null) - { - PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } - } - } -} diff --git a/ProxySU_Core/ViewModels/HostViewModel.cs b/ProxySU_Core/ViewModels/HostViewModel.cs deleted file mode 100644 index 04ceb62..0000000 --- a/ProxySU_Core/ViewModels/HostViewModel.cs +++ /dev/null @@ -1,144 +0,0 @@ -using Microsoft.Win32; -using Newtonsoft.Json; -using ProxySU_Core.Models; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Windows; -using System.Windows.Input; - -namespace ProxySU_Core.ViewModels -{ - public class HostViewModel : BaseViewModel - { - public Host host; - - private readonly ICommand _selectKeyCommand; - - - public HostViewModel(Host host) - { - _selectKeyCommand = new BaseCommand(obj => OpenFileDialog(obj)); - this.host = host; - } - - - public string Tag - { - get => host.Tag; - set - { - host.Tag = value; - Notify("Tag"); - } - } - - public string Address - { - get => host.Address; - set - { - host.Address = value; - Notify("Address"); - } - } - - public string UserName - { - get => host.UserName; - set => host.UserName = value; - } - - public string Password - { - get => host.Password; - set => host.Password = value; - } - - public int Port - { - get => host.Port; - set => host.Port = value; - } - - public string PrivateKeyPath - { - get => host.PrivateKeyPath; - set => host.PrivateKeyPath = value; - } - - public LocalProxy Proxy - { - get => host.Proxy; - set - { - host.Proxy = value; - Notify("Proxy"); - } - } - - public LoginSecretType SecretType - { - get => host.SecretType; - set - { - host.SecretType = value; - Notify("SecretType"); - Notify("KeyUploaderVisiblity"); - Notify("PasswordVisiblity"); - } - } - - [JsonIgnore] - public Visibility PasswordVisiblity - { - get - { - if (SecretType == LoginSecretType.Password) - { - return Visibility.Visible; - } - return Visibility.Collapsed; - } - } - - [JsonIgnore] - public Visibility KeyUploaderVisiblity - { - get - { - if (SecretType == LoginSecretType.PrivateKey) - { - return Visibility.Visible; - } - return Visibility.Collapsed; - } - } - - - [JsonIgnore] - public ICommand SelectKeyCommand - { - get - { - return _selectKeyCommand; - } - } - - - private void OpenFileDialog(object obj) - { - var fileDialog = new OpenFileDialog(); - fileDialog.FileOk += OnFileOk; - fileDialog.ShowDialog(); - } - - private void OnFileOk(object sender, CancelEventArgs e) - { - var file = sender as OpenFileDialog; - PrivateKeyPath = file.FileName; - } - } - - -} diff --git a/ProxySU_Core/ViewModels/IdValueViewModel.cs b/ProxySU_Core/ViewModels/IdValueViewModel.cs deleted file mode 100644 index d7b8fbf..0000000 --- a/ProxySU_Core/ViewModels/IdValueViewModel.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ProxySU_Core.ViewModels -{ - public class IdValueViewModel - { - public IdValueViewModel(int id, string value) - { - Id = id; - Value = value; - } - - public int Id { get; set; } - - public string Value { get; set; } - } -} diff --git a/ProxySU_Core/ViewModels/RecordViewModel.cs b/ProxySU_Core/ViewModels/RecordViewModel.cs deleted file mode 100644 index e2270be..0000000 --- a/ProxySU_Core/ViewModels/RecordViewModel.cs +++ /dev/null @@ -1,58 +0,0 @@ -using ProxySU_Core.Models; -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ProxySU_Core.ViewModels -{ - public class RecordViewModel : BaseViewModel - { - public Record record; - private bool _isChecked; - - public RecordViewModel(Record record) - { - this.record = record; - this._isChecked = false; - } - - public bool IsChecked - { - get => _isChecked; - set - { - _isChecked = value; - Notify("IsChecked"); - } - } - - public Host Host - { - get => record.Host; - set - { - record.Host = value; - Notify("Host"); - } - } - - public XraySettings Settings - { - get => record.Settings; - set - { - record.Settings = value; - Notify("Settings"); - } - } - - public void Notify() - { - Notify("Host"); - Notify("Settings"); - } - } -} diff --git a/ProxySU_Core/ViewModels/Terminal.cs b/ProxySU_Core/ViewModels/Terminal.cs deleted file mode 100644 index 1f2a92a..0000000 --- a/ProxySU_Core/ViewModels/Terminal.cs +++ /dev/null @@ -1,38 +0,0 @@ -using ProxySU_Core.Models; -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Text; - -namespace ProxySU_Core.ViewModels -{ - public class Terminal : BaseViewModel - { - private bool hasConnected; - - public Terminal(Host host) - { - Host = host; - HasConnected = false; - } - - public bool HasConnected - { - get - { - return hasConnected; - } - set - { - hasConnected = value; - Notify("HasConnected"); - } - } - - public Host Host { get; set; } - - public string CommandText { get; set; } - - public string OutputText { get; set; } - } -} diff --git a/ProxySU_Core/ViewModels/XraySettingsViewModel.cs b/ProxySU_Core/ViewModels/XraySettingsViewModel.cs deleted file mode 100644 index 78826a8..0000000 --- a/ProxySU_Core/ViewModels/XraySettingsViewModel.cs +++ /dev/null @@ -1,399 +0,0 @@ -using Newtonsoft.Json; -using ProxySU_Core.Common; -using ProxySU_Core.Models; -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Web; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Input; - -namespace ProxySU_Core.ViewModels -{ - public partial class XraySettingsViewModel : BaseViewModel - { - public XraySettings settings; - private readonly ICommand _randomUuid; - - public XraySettingsViewModel(XraySettings parameters) - { - _randomUuid = new BaseCommand((obj) => GetUuid()); - this.settings = parameters; - Notify("VMESS_KCP_Type"); - } - - public ICommand RandomUuid - { - get - { - return _randomUuid; - } - } - - - public int Port - { - get => settings.Port; - set - { - settings.Port = value; - Notify("Port"); - } - } - - public int VLESS_KCP_Port - { - get => settings.VLESS_KCP_Port; - set - { - settings.VLESS_KCP_Port = value; - Notify("VLESS_KCP_Port"); - } - } - - public int VMESS_KCP_Port - { - get => settings.VMESS_KCP_Port; - set - { - settings.VMESS_KCP_Port = value; - Notify("VMESS_KCP_Port"); - } - } - - public int ShadowSocksPort - { - get => settings.ShadowSocksPort; - set - { - settings.VMESS_KCP_Port = value; - Notify("ShadowSocksPort"); - } - } - - - public string UUID - { - get => settings.UUID; - set - { - settings.UUID = value; - Notify("UUID"); - } - } - - public string Domain - { - get => settings.Domain; - set - { - settings.Domain = value; - Notify("Domain"); - } - } - - public string MaskDomain - { - get => settings.MaskDomain; - set - { - settings.MaskDomain = value; - Notify("MaskDomain"); - } - } - - public string TrojanPassword - { - get => settings.TrojanPassword; - set => settings.TrojanPassword = value; - } - public bool Checked_Trojan_TCP - { - get - { - return settings.Types.Contains(XrayType.Trojan_TCP); - } - set - { - if (value == true) - { - if (!settings.Types.Contains(XrayType.Trojan_TCP)) - settings.Types.Add(XrayType.Trojan_TCP); - } - else - { - settings.Types.Remove(XrayType.Trojan_TCP); - } - Notify("Checked_Trojan_TCP"); - } - } - public string Trojan_TCP_ShareLink - { - get => ShareLink.Build(XrayType.Trojan_TCP, settings); - } - - private List _ssMethods = new List { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305" }; - public List ShadowSocksMethods => _ssMethods; - public bool CheckedShadowSocks - { - - get => settings.Types.Contains(XrayType.ShadowsocksAEAD); - set - { - CheckBoxChanged(value, XrayType.ShadowsocksAEAD); - Notify("CheckedShadowSocks"); - } - } - public string ShadowSocksPassword - { - get => settings.ShadowsocksPassword; - set => settings.ShadowsocksPassword = value; - } - public string ShadowSocksMethod - { - get => settings.ShadowsocksMethod; - set - { - var namespaceStr = typeof(ComboBoxItem).FullName + ":"; - var trimValue = value.Replace(namespaceStr, ""); - trimValue = trimValue.Trim(); - settings.ShadowsocksMethod = trimValue; - Notify("ShadowSocksMethod"); - } - } - public string ShadowSocksShareLink - { - get => ShareLink.Build(XrayType.ShadowsocksAEAD, settings); - } - - - private void CheckBoxChanged(bool value, XrayType type) - { - if (value == true) - { - if (!settings.Types.Contains(type)) - { - settings.Types.Add(type); - } - } - else - { - settings.Types.RemoveAll(x => x == type); - } - } - - - - private void GetUuid() - { - UUID = Guid.NewGuid().ToString(); - Notify("UUID"); - } - - } - - /// - /// VMESS - /// - public partial class XraySettingsViewModel - { - // vmess tcp - public bool Checked_VMESS_TCP - { - get => settings.Types.Contains(XrayType.VMESS_TCP); - set - { - CheckBoxChanged(value, XrayType.VMESS_TCP); - Notify("Checked_VMESS_TCP"); - } - } - public string VMESS_TCP_Path - { - get => settings.VMESS_TCP_Path; - set => settings.VMESS_TCP_Path = value; - } - public string VMESS_TCP_ShareLink - { - get => ShareLink.Build(XrayType.VMESS_TCP, settings); - } - - // vmess ws - public bool Checked_VMESS_WS - { - get => settings.Types.Contains(XrayType.VMESS_WS); - set - { - CheckBoxChanged(value, XrayType.VMESS_WS); - Notify("Checked_VMESS_WS"); - } - } - public string VMESS_WS_Path - { - get => settings.VMESS_WS_Path; - set => settings.VMESS_WS_Path = value; - } - public string VMESS_WS_ShareLink - { - get => ShareLink.Build(XrayType.VMESS_WS, settings); - } - - // vmess kcp - public string VMESS_KCP_Seed - { - get => settings.VMESS_KCP_Seed; - set => settings.VMESS_KCP_Seed = value; - } - public string VMESS_KCP_Type - { - get => settings.VMESS_KCP_Type; - set - { - var namespaceStr = typeof(ComboBoxItem).FullName + ":"; - var trimValue = value.Replace(namespaceStr, ""); - trimValue = trimValue.Trim(); - settings.VMESS_KCP_Type = trimValue; - Notify("VMESS_KCP_Type"); - } - } - public bool Checked_VMESS_KCP - { - get => settings.Types.Contains(XrayType.VMESS_KCP); - set - { - CheckBoxChanged(value, XrayType.VMESS_KCP); - Notify("Checked_VMESS_KCP"); - } - } - public string VMESS_KCP_ShareLink - { - get => ShareLink.Build(XrayType.VMESS_KCP, settings); - } - - - private List _kcpTypes = new List { "none", "srtp", "utp", "wechat-video", "dtls", "wireguard", }; - public List KcpTypes => _kcpTypes; - } - - /// - /// VLESS - /// - public partial class XraySettingsViewModel - { - - // vless xtls - public bool Checked_VLESS_TCP_XTLS - { - get => settings.Types.Contains(XrayType.VLESS_TCP_XTLS); - set - { - CheckBoxChanged(value, XrayType.VLESS_TCP_XTLS); - Notify("Checked_VLESS_TCP_XTLS"); - } - } - public string VLESS_TCP_XTLS_ShareLink - { - get => ShareLink.Build(XrayType.VLESS_TCP_XTLS, settings); - } - - // vless tcp - public bool Checked_VLESS_TCP - { - get => settings.Types.Contains(XrayType.VLESS_TCP); - set - { - CheckBoxChanged(value, XrayType.VLESS_TCP); - Notify("Checked_VLESS_TCP"); - } - } - public string VLESS_TCP_ShareLink - { - get => ShareLink.Build(XrayType.VLESS_TCP, settings); - } - - - // vless ws - public string VLESS_WS_Path - { - get => settings.VLESS_WS_Path; - set => settings.VLESS_WS_Path = value; - } - public bool Checked_VLESS_WS - { - get - { - return settings.Types.Contains(XrayType.VLESS_WS); - } - set - { - CheckBoxChanged(value, XrayType.VLESS_WS); - Notify("Checked_VLESS_WS"); - } - } - public string VLESS_WS_ShareLink - { - get => ShareLink.Build(XrayType.VLESS_WS, settings); - } - - // vless kcp - public string VLESS_KCP_Seed - { - get => settings.VLESS_KCP_Seed; - set => settings.VLESS_KCP_Seed = value; - } - public string VLESS_KCP_Type - { - get => settings.VLESS_KCP_Type; - set - { - var namespaceStr = typeof(ComboBoxItem).FullName + ":"; - var trimValue = value.Replace(namespaceStr, ""); - trimValue = trimValue.Trim(); - settings.VLESS_KCP_Type = trimValue; - Notify("VLESS_KCP_Type"); - } - } - public bool Checked_VLESS_KCP - { - get => settings.Types.Contains(XrayType.VLESS_KCP); - set - { - CheckBoxChanged(value, XrayType.VLESS_KCP); - Notify("Checked_VLESS_KCP"); - } - } - public string VLESS_KCP_ShareLink - { - get => ShareLink.Build(XrayType.VLESS_KCP, settings); - } - - // vless grpc - public string VLESS_gRPC_ServiceName - { - get => settings.VLESS_gRPC_ServiceName; - set => settings.VLESS_gRPC_ServiceName = value; - } - public int VLESS_gRPC_Port - { - get => settings.VLESS_gRPC_Port; - set => settings.VLESS_gRPC_Port = value; - } - public bool Checked_VLESS_gRPC - { - get => settings.Types.Contains(XrayType.VLESS_gRPC); - set - { - CheckBoxChanged(value, XrayType.VLESS_gRPC); - Notify("Checked_VLESS_gRPC"); - } - } - public string VLESS_gRPC_ShareLink - { - get => ShareLink.Build(XrayType.VLESS_gRPC, settings); - } - } - -} diff --git a/ProxySU_Core/Views/ClientInfo/ClientInfoWindow.xaml b/ProxySU_Core/Views/ClientInfo/ClientInfoWindow.xaml deleted file mode 100644 index d95b8cb..0000000 --- a/ProxySU_Core/Views/ClientInfo/ClientInfoWindow.xaml +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

BMr;2(;Y^bVL*WS5Cau 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 `I0KX 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¥d6Z00fdMB*s8Y$y$yvgHD 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

`vp@>^9@LHskm{M`5* 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 z