From ec8e407cde566e5d9f11b19e260e053aca515966 Mon Sep 17 00:00:00 2001 From: snltty <1069410172@qq.com> Date: Sun, 29 Dec 2024 20:38:37 +0800 Subject: [PATCH] sync --- .github/workflows/nuget.yml | 3 + README.md | 1 + linker.doc.web/docs/1、首页.md | 1 + .../docs/3、打洞和中继/3.2、中继.md | 2 +- .../docs/8、集成/8.1、使用打洞和中继.md | 108 +++++++++ .../8.2、独立使用虚拟网卡.md} | 4 +- .../8.3、组网和内网穿透流程图.md} | 4 +- linker.doc.web/docs/8、集成/_category_.json | 8 + .../docs/{ => 8、集成}/img/network.drawio | 0 .../docs/{ => 8、集成}/img/network.jpg | Bin .../docs/{ => 8、集成}/img/transfer.drawio | 0 .../docs/{ => 8、集成}/img/transfer.jpg | Bin linker.doc.web/docs/8、集成打洞到你的项目.md | 65 ----- linker.doc.web/docusaurus.config.js | 6 +- .../src/components/HomepageFeatures/index.js | 8 +- linker.doc.web/src/pages/index.js | 2 +- linker.gen/InterfaceSourceGenerator.cs | 167 ------------- .../PublishProfiles/FolderProfile.pubxml | 14 -- .../PublishProfiles/FolderProfile.pubxml.user | 10 - linker.gen/linker.gen.csproj | 21 -- linker.gen/linker.gen.csproj.user | 6 - linker.libs/api/ApiServer.cs | 2 +- linker.libs/extends/SocketExtends.cs | 4 + linker.libs/socks5/Socks5Parser.cs | 25 +- linker.libs/websocket/WebSocketClient.cs | 2 +- linker.libs/websocket/WebSocketServer.cs | 8 +- .../AccessApiController.cs | 40 ++-- linker.messenger.access/AccessDecenter.cs | 55 +++++ .../AccessMessenger.cs | 36 ++- .../AccessMessengerIds.cs | 2 +- linker.messenger.access/Config.cs | 170 +++++++++++++ linker.messenger.access/Entry.cs | 39 +++ linker.messenger.access/IAccessStore.cs | 15 ++ .../linker.messenger.access.csproj | 41 ++++ .../ActionApiController.cs | 29 +++ linker.messenger.action/ActionTransfer.cs | 35 +++ linker.messenger.action/Entry.cs | 38 +++ linker.messenger.action/IActionStore.cs | 18 ++ .../SignInArgsAction.cs | 52 ++-- .../linker.messenger.action.csproj | 41 ++++ .../ApiServer.cs | 26 +- linker.messenger.api/Entry.cs | 35 +++ linker.messenger.api/IApiController.cs | 10 + .../IApiStore.cs | 18 +- linker.messenger.api/WebServer.cs | 12 + .../linker.messenger.api.csproj | 39 +++ .../Channel.cs | 33 ++- .../linker.messenger.channel.csproj | 42 ++++ .../DecenterClientTransfer.cs | 38 ++- linker.messenger.decenter/Entry.cs | 39 +++ .../IDecenter.cs | 2 +- .../linker.messenger.decenter.csproj | 39 +++ .../messenger/DecenterMessenger.cs | 22 +- .../messenger/DecenterMessengerIds.cs | 2 +- .../linker.messenger.entry.csproj | 33 +++ linker.messenger.example/Program.cs | 164 +++++++------ linker.messenger.exroute/Entry.cs | 18 ++ linker.messenger.exroute/ExRouteTransfer.cs | 29 +++ .../IExRoute.cs | 4 +- .../linker.messenger.exroute.csproj | 37 +++ linker.messenger.listen/Entry.cs | 32 +++ linker.messenger.listen/IListenStore.cs | 13 + .../TcpServer.cs | 3 +- .../linker.messenger.listen.csproj | 38 +++ linker.messenger.pcp/Entry.cs | 33 +++ linker.messenger.pcp/IPcpStore.cs | 17 ++ linker.messenger.pcp/PcpDecenter.cs | 65 +++++ .../PcpMessenger.cs | 22 +- .../PcpMessengerIds.cs | 2 +- .../PcpTransfer.cs | 10 +- .../linker.messenger.pcp.csproj | 41 ++++ linker.messenger.relay/Entry.cs | 83 +++++++ .../client/IRelayClientStore.cs | 35 +-- .../client/RelayApiController.cs | 20 +- .../client/RelayClientTestTransfer.cs | 26 +- .../client/RelayClientTransfer.cs | 13 +- linker.messenger.relay/client/RelaySync.cs | 28 +++ .../client/transport/IRelayClientTransport.cs | 22 +- .../transport/RelayClientTransportSelfHost.cs | 23 +- .../linker.messenger.relay.csproj | 3 +- .../messenger/RelayMessenger.cs | 4 +- .../server/IRelayServerNodeStore.cs | 4 - .../server/IRelayServerStore.cs | 13 + .../server/RelayServerNodeTransfer.cs | 5 +- .../server/RelayServerReportResolver.cs | 4 +- .../server/RelayServerResolver.cs | 5 +- .../RelayServerValidatorSecretKey.cs | 24 ++ .../validator/RelayServerValidatorTransfer.cs | 21 +- .../AccessSerializer.cs | 111 +++++++++ .../ConnectionFormatter.cs | 2 +- .../DecenterSerializer.cs | 57 +++++ .../Entry.cs | 69 ++++++ .../IPAddressFormatter.cs | 2 +- .../IPEndPointFormatter.cs | 2 +- .../MemoryPackSerializer.cs | 17 +- .../RelaySerializer.cs | 2 +- .../SignInSerializer.cs | 81 +++++-- .../Socks5Serializer.cs | 129 ++++++++++ .../SyncSerializer.cs | 59 +++++ .../TunnelConnectionFormatter.cs | 2 +- .../TunnelSerializer.cs | 124 +++++++++- .../UpdaterSerializer.cs | 226 ++++++++++++++++++ ...ker.messenger.serializer.memorypack.csproj | 50 ++++ linker.messenger.signin/Config.cs | 58 +++++ linker.messenger.signin/Entry.cs | 84 +++++++ linker.messenger.signin/ISignInClientStore.cs | 18 ++ .../ISignInServerStore.cs | 4 +- .../SignInApiController.cs | 129 ++++++++++ .../SignInClientState.cs | 11 +- .../SignInClientTransfer.cs | 50 ++-- linker.messenger.signin/SignInExRoute.cs | 18 ++ .../SignInMessenger.cs | 47 +++- .../SignInMessengerIds.cs | 0 .../SignInServerCaching.cs | 7 +- .../args}/ISignInArgs.cs | 2 +- .../args}/SignInArgsGroupPassword.cs | 13 +- .../args/SignInArgsMachineKey.cs | 3 +- .../args}/SignInArgsSecretKey.cs | 28 +-- .../args}/SignInArgsTransfer.cs | 10 +- .../args/SignInArgsVersion.cs | 3 +- .../linker.messenger.signin.csproj | 2 + linker.messenger.socks5/Entry.cs | 57 +++++ .../ISocks5Store.cs | 51 +--- .../Socks5ApiController.cs | 67 ++---- .../Socks5Decenter.cs | 56 ++--- linker.messenger.socks5/Socks5ExRoute.cs | 18 ++ .../Socks5Messenger.cs | 38 ++- .../Socks5MessengerIds.cs | 2 +- .../Socks5Proxy.cs | 28 +-- linker.messenger.socks5/Socks5Transfer.cs | 61 +++++ .../TunnelProxy.cs | 2 +- .../TunnelProxyTcp.cs | 6 +- .../TunnelProxyUdp.cs | 2 +- .../linker.messenger.socks5.csproj | 42 ++++ .../ConfigApiController.cs | 58 +---- linker.messenger.store.file/Entry.cs | 79 ++++++ .../FileConfig.cs | 46 +++- .../RunningConfig.cs | 10 +- .../Storefactory.cs | 17 +- .../action/ActionStore.cs | 45 +--- .../action}/Config.cs | 11 +- .../api/AccessStore.cs | 19 +- linker.messenger.store.file/api/ApiStore.cs | 19 ++ linker.messenger.store.file/api/Config.cs | 45 ++++ .../linker.messenger.store.file.csproj | 51 ++++ .../messenger/Config.cs | 14 ++ .../messenger/MessengerStore.cs | 13 + linker.messenger.store.file/pcp/Config.cs | 12 + linker.messenger.store.file/pcp/PcpStore.cs | 22 ++ .../relay}/Config.cs | 38 +-- .../relay/RelayClientStore.cs | 26 +- .../relay/RelayServerMasterStore.cs | 16 ++ .../relay/RelayServerNodeStore.cs | 31 +++ .../relay/RelayServerStore.cs | 14 ++ linker.messenger.store.file/server/Config.cs | 8 + .../server/ListenStore.cs | 15 ++ linker.messenger.store.file/signIn/Config.cs | 79 ++++++ .../signIn/SignInClientStore.cs | 19 +- .../signIn/SignInServerStore.cs | 12 +- .../signIn/SignInSync.cs | 48 ++++ linker.messenger.store.file/socks5/Config.cs | 24 ++ .../socks5/Socks5Store.cs | 37 +++ linker.messenger.store.file/tunnel/Config.cs | 38 +++ .../tunnel/TunnelClientStore.cs | 60 +++++ linker.messenger.store.file/updater/Config.cs | 24 ++ .../updater/UpdaterClientStore.cs | 26 ++ .../updater/UpdaterCommonStore.cs | 13 +- .../updater/UpdaterServerStore.cs | 16 ++ linker.messenger.sync/Entry.cs | 39 +++ linker.messenger.sync/ISync.cs | 22 ++ linker.messenger.sync/SyncApiController.cs | 34 +++ .../SyncMessenger.cs | 26 +- .../SyncMessengerIds.cs | 2 +- .../SyncTreansfer.cs | 49 ++-- .../linker.messenger.sync.csproj | 42 ++++ linker.messenger.tunnel/Config.cs | 22 ++ linker.messenger.tunnel/Entry.cs | 75 ++++++ ...ExcludeIP.cs => ITunnelClientExcludeIP.cs} | 2 +- .../TunnelApiController.cs | 62 ++--- ...er.cs => TunnelClientExcludeIPTransfer.cs} | 10 +- ...ter.cs => TunnelClientMessengerAdapter.cs} | 50 ++-- linker.messenger.tunnel/TunnelDecenter.cs | 70 ++++++ linker.messenger.tunnel/TunnelExRoute.cs | 21 ++ linker.messenger.tunnel/TunnelMessenger.cs | 33 ++- .../TunnelNetworkTransfer.cs | 92 +++++++ ...ver.cs => TunnelServerExternalResolver.cs} | 4 +- linker.messenger.tunnel/TunnelSync.cs | 29 +++ .../linker.messenger.tunnel.csproj | 6 +- linker.messenger.updater/Config.cs | 89 +++++++ linker.messenger.updater/Entry.cs | 55 +++++ .../IUpdaterClientStore.cs | 9 + .../IUpdaterCommonStore.cs | 10 + .../IUpdaterServerStore.cs | 7 + .../UpdaterApiController.cs | 115 ++++----- .../UpdaterClientTransfer.cs | 66 ++--- linker.messenger.updater/UpdaterConfigSync.cs | 29 +++ .../UpdaterHelper.cs | 84 ++----- .../UpdaterMessenger.cs | 57 +++-- .../UpdaterMessengerIds.cs | 2 +- .../UpdaterServerTransfer.cs | 15 +- .../linker.messenger.updater.csproj | 41 ++++ linker.messenger/Entry.cs | 24 ++ linker.messenger/IMessengerStore.cs | 19 ++ .../IResolver.cs | 15 +- linker.messenger/MessengerResolver.cs | 75 ++++-- linker.messenger/MessengerSender.cs | 23 +- linker.messenger/MessengerWrap.cs | 6 +- .../ResolverTransfer.cs | 25 +- linker.messenger/linker.messenger.csproj | 3 + linker.sln | 214 +++++++++++++++-- linker.tray.win/default.aproj | 2 +- linker.tray.win/dist/linker.tray.win.exe | Bin 5931520 -> 5931008 bytes linker.tray.win/web/css/402.bc681d99.css | 1 + linker.tray.win/web/css/424.a59dc963.css | 1 - linker.tray.win/web/css/509.8ac32231.css | 1 - .../{827.8be8ee26.css => 734.19603134.css} | 2 +- linker.tray.win/web/css/76.a8147928.css | 1 - linker.tray.win/web/css/855.f4293598.css | 1 + .../{256.4e351ac8.css => 857.4e351ac8.css} | 0 linker.tray.win/web/css/966.149bc7b3.css | 1 + linker.tray.win/web/css/app.1dca501b.css | 1 + linker.tray.win/web/css/app.e2cbd3ed.css | 1 - linker.tray.win/web/index.html | 2 +- linker.tray.win/web/js/110.0106ebd8.js | 1 - linker.tray.win/web/js/183.9a80af0b.js | 1 - linker.tray.win/web/js/256.8161f834.js | 1 - linker.tray.win/web/js/402.024283d6.js | 1 + linker.tray.win/web/js/424.f2a1d18e.js | 1 - linker.tray.win/web/js/509.b1ccc755.js | 1 - linker.tray.win/web/js/642.8d1a79df.js | 1 + .../js/{827.ca8f5e05.js => 734.bccc9e7e.js} | 2 +- linker.tray.win/web/js/76.61170c94.js | 1 - linker.tray.win/web/js/848.33bffbdc.js | 1 + linker.tray.win/web/js/855.46fe678b.js | 1 + linker.tray.win/web/js/857.f520b520.js | 1 + linker.tray.win/web/js/966.bd0145e0.js | 1 + linker.tray.win/web/js/app.1a3b60a6.js | 1 + linker.tray.win/web/js/app.1dbd8a85.js | 1 - linker.tun/ILinkerTunDevice.cs | 6 + linker.tun/LinkerLinuxTunDevice.cs | 6 + linker.tun/LinkerOsxTunDevice.cs | 5 + linker.tun/LinkerTunDeviceAdapter.cs | 6 + linker.tun/LinkerWinTunDevice.cs | 42 ++++ linker.tunnel/TunnelTransfer.cs | 33 +-- linker.tunnel/transport/ITunnelTransport.cs | 4 - linker.tunnel/transport/TransportTcpNutssb.cs | 6 +- linker.tunnel/transport/TransportTcpP2PNAT.cs | 9 +- .../transport/TransportTcpPortMap.cs | 104 ++++---- .../transport/TransportUdpPortMap.cs | 101 ++++---- .../wanport/ITunnelWanPortProtocol.cs | 3 +- .../wanport/TunnelWanPortProtocolLinker.cs | 9 +- .../wanport/TunnelWanPortProtocolStun.cs | 4 +- .../wanport/TunnelWanPortTransfer.cs | 12 +- linker/Program.cs | 6 + linker/linker.csproj | 13 +- linker/plugins/access/AccessDecenter.cs | 54 ----- linker/plugins/access/AccessStartup.cs | 42 ---- linker/plugins/access/config/Config.cs | 207 ---------------- linker/plugins/action/ActionApiController.cs | 37 --- linker/plugins/action/ActionStartup.cs | 48 ---- linker/plugins/capi/ApiClientTypesLoader.cs | 17 -- linker/plugins/capi/CApiStartup.cs | 57 ----- linker/plugins/capi/IApiClientController.cs | 15 -- linker/plugins/capi/WebClientServer.cs | 16 -- linker/plugins/client/ClientConfigSync.cs | 49 ---- linker/plugins/client/ClientStartup.cs | 54 ----- linker/plugins/client/RouteExcludeIP.cs | 18 -- linker/plugins/client/config/Config.cs | 144 ----------- linker/plugins/config/ConfigStartup.cs | 52 ---- .../plugins/config/ConfigSyncTypesLoader.cs | 17 -- linker/plugins/decenter/DecenterStartup.cs | 43 ---- .../plugins/decenter/DecenterTypesLoader.cs | 17 -- linker/plugins/firewall/FireWallStartup.cs | 36 --- linker/plugins/flow/ExternalFlow.cs | 3 +- .../plugins/flow/FlowClientApiController.cs | 30 +-- linker/plugins/flow/FlowResolver.cs | 6 +- linker/plugins/flow/FlowStartup.cs | 8 +- linker/plugins/flow/MessengerFlow.cs | 1 - linker/plugins/flow/RelayFlow.cs | 5 +- .../plugins/flow/messenger/FlowMessenger.cs | 18 +- .../plugins/forward/ForwardApiController.cs | 33 +-- linker/plugins/forward/ForwardDecenter.cs | 19 +- linker/plugins/forward/ForwardTransfer.cs | 30 +-- .../forward/messenger/ForwardMessenger.cs | 21 +- .../forward/proxy/ForwardProxyTunnel.cs | 5 +- .../messenger/MessengerResolverResolver.cs | 26 -- .../messenger/MessengerResolverTypesLoader.cs | 19 -- linker/plugins/messenger/MessengerStartup.cs | 73 ------ linker/plugins/pcp/PcpConfigTransfer.cs | 80 ------- linker/plugins/pcp/PcpStartup.cs | 44 ---- linker/plugins/pcp/config/Config.cs | 18 -- linker/plugins/relay/RelayStartup.cs | 100 -------- .../relay/client/PlusRelayClientStore.cs | 36 --- linker/plugins/relay/client/RelaConfigSync.cs | 26 -- .../relay/client/RelayClientTypesLoader.cs | 13 - .../relay/messenger/PlusRelayMessenger.cs | 33 --- .../server/PlusRelayServerMasterStore.cs | 16 -- .../relay/server/PlusRelayServerNodeStore.cs | 38 --- .../server/PlusRelayServerReportResolver.cs | 15 -- .../relay/server/PlusRelayServerResolver.cs | 18 -- .../relay/server/RelayServerConfigTransfer.cs | 32 --- .../RelayServerValidatorSecretKey.cs | 28 --- .../RelayServerValidatorTypeLoader.cs | 18 -- linker/plugins/resolver/ResolverStartup.cs | 54 ----- .../plugins/resolver/ResolverTypesLoader.cs | 17 -- .../plugins/route/RouteExcludeIPTransfer.cs | 29 --- .../route/RouteExcludeIPTypesLoader.cs | 17 -- linker/plugins/route/RouteStartup.cs | 40 ---- linker/plugins/server/ServerConfigTransfer.cs | 16 -- linker/plugins/server/ServerStartup.cs | 51 ---- linker/plugins/server/config/Config.cs | 31 --- .../plugins/sforward/SForwardApiController.cs | 40 ++-- linker/plugins/sforward/SForwardConfigSync.cs | 6 +- linker/plugins/sforward/SForwardDecenter.cs | 20 +- linker/plugins/sforward/SForwardTransfer.cs | 27 ++- .../sforward/config/SForwardServerCahing.cs | 4 +- .../sforward/messenger/SForwardMessenger.cs | 43 ++-- .../sforward/proxy/SForwardProxyTcp.cs | 4 +- linker/plugins/signIn/PlusSignInMessenger.cs | 60 ----- linker/plugins/signIn/SignInApiController.cs | 150 ------------ linker/plugins/signIn/SignInConfigTransfer.cs | 31 --- linker/plugins/signIn/SignInStartup.cs | 81 ------- .../signIn/args/SignInArgsTypesLoader.cs | 19 -- linker/plugins/socks5/RouteExcludeIP.cs | 18 -- linker/plugins/socks5/Socks5ConfigTransfer.cs | 76 ------ linker/plugins/socks5/Socks5Startup.cs | 51 ---- .../tunnel/PlusTunnelExternalResolver.cs | 17 -- linker/plugins/tunnel/PlusTunnelMessenger.cs | 67 ------ .../tunnel/PlusTunnelMessengerAdapter.cs | 14 -- .../tunnel/PlusTunnelMessengerAdapterStore.cs | 40 ---- linker/plugins/tunnel/TunnelConfigSync.cs | 26 -- linker/plugins/tunnel/TunnelConfigTransfer.cs | 200 ---------------- linker/plugins/tunnel/TunnelDecenter.cs | 51 ---- .../tunnel/TunnelExcludeIPTypesLoader.cs | 18 -- linker/plugins/tunnel/TunnelRouteExcludeIP.cs | 20 -- linker/plugins/tunnel/TunnelStartup.cs | 81 ------- linker/plugins/tuntap/ExcludeIP.cs | 2 +- linker/plugins/tuntap/TuntapAdapter.cs | 66 +++-- linker/plugins/tuntap/TuntapApiController.cs | 41 ++-- linker/plugins/tuntap/TuntapConfigTransfer.cs | 21 +- linker/plugins/tuntap/TuntapDecenter.cs | 25 +- .../tuntap/TuntapDeviceStatusTransfer.cs | 91 ------- linker/plugins/tuntap/TuntapPingTransfer.cs | 9 +- linker/plugins/tuntap/TuntapProxy.cs | 8 +- linker/plugins/tuntap/TuntapStartup.cs | 2 - linker/plugins/tuntap/TuntapTransfer.cs | 5 +- linker/plugins/tuntap/config/config.cs | 1 - .../tuntap/lease/LeaseClientTreansfer.cs | 28 +-- .../tuntap/messenger/TuntapMessenger.cs | 28 +-- linker/plugins/updater/UpdaterConfigSync.cs | 25 -- linker/plugins/updater/UpdaterStartup.cs | 56 ----- linker/plugins/updater/config/config.cs | 81 ------- linker/serializer/SerializerStartup.cs | 49 ---- linker/startup/IStartup.cs | 74 ------ linker/startup/StartupTransfer.cs | 63 ----- linker/store/StoreStartup.cs | 46 ---- version.txt | 2 +- ymls/nuget.yml | 3 + 358 files changed, 5909 insertions(+), 5231 deletions(-) create mode 100644 linker.doc.web/docs/8、集成/8.1、使用打洞和中继.md rename linker.doc.web/docs/{9、集成tun网卡到你的项目.md => 8、集成/8.2、独立使用虚拟网卡.md} (98%) rename linker.doc.web/docs/{10、组网和内网穿透流程图.md => 8、集成/8.3、组网和内网穿透流程图.md} (71%) create mode 100644 linker.doc.web/docs/8、集成/_category_.json rename linker.doc.web/docs/{ => 8、集成}/img/network.drawio (100%) rename linker.doc.web/docs/{ => 8、集成}/img/network.jpg (100%) rename linker.doc.web/docs/{ => 8、集成}/img/transfer.drawio (100%) rename linker.doc.web/docs/{ => 8、集成}/img/transfer.jpg (100%) delete mode 100644 linker.doc.web/docs/8、集成打洞到你的项目.md delete mode 100644 linker.gen/InterfaceSourceGenerator.cs delete mode 100644 linker.gen/Properties/PublishProfiles/FolderProfile.pubxml delete mode 100644 linker.gen/Properties/PublishProfiles/FolderProfile.pubxml.user delete mode 100644 linker.gen/linker.gen.csproj delete mode 100644 linker.gen/linker.gen.csproj.user rename {linker/plugins/access => linker.messenger.access}/AccessApiController.cs (55%) create mode 100644 linker.messenger.access/AccessDecenter.cs rename {linker/plugins/access/messenger => linker.messenger.access}/AccessMessenger.cs (61%) rename {linker/plugins/access/messenger => linker.messenger.access}/AccessMessengerIds.cs (83%) create mode 100644 linker.messenger.access/Config.cs create mode 100644 linker.messenger.access/Entry.cs create mode 100644 linker.messenger.access/IAccessStore.cs create mode 100644 linker.messenger.access/linker.messenger.access.csproj create mode 100644 linker.messenger.action/ActionApiController.cs create mode 100644 linker.messenger.action/ActionTransfer.cs create mode 100644 linker.messenger.action/Entry.cs create mode 100644 linker.messenger.action/IActionStore.cs rename {linker/plugins/action => linker.messenger.action}/SignInArgsAction.cs (84%) create mode 100644 linker.messenger.action/linker.messenger.action.csproj rename linker/plugins/capi/ApiClientServer.cs => linker.messenger.api/ApiServer.cs (73%) create mode 100644 linker.messenger.api/Entry.cs create mode 100644 linker.messenger.api/IApiController.cs rename linker/plugins/capi/config/Config.cs => linker.messenger.api/IApiStore.cs (66%) create mode 100644 linker.messenger.api/WebServer.cs create mode 100644 linker.messenger.api/linker.messenger.api.csproj rename linker/plugins/tunnel/TunnelBase.cs => linker.messenger.channel/Channel.cs (85%) create mode 100644 linker.messenger.channel/linker.messenger.channel.csproj rename linker/plugins/decenter/DecenterTransfer.cs => linker.messenger.decenter/DecenterClientTransfer.cs (69%) create mode 100644 linker.messenger.decenter/Entry.cs rename {linker/plugins/decenter => linker.messenger.decenter}/IDecenter.cs (96%) create mode 100644 linker.messenger.decenter/linker.messenger.decenter.csproj rename {linker/plugins/decenter => linker.messenger.decenter}/messenger/DecenterMessenger.cs (75%) rename {linker/plugins/decenter => linker.messenger.decenter}/messenger/DecenterMessengerIds.cs (76%) create mode 100644 linker.messenger.entry/linker.messenger.entry.csproj create mode 100644 linker.messenger.exroute/Entry.cs create mode 100644 linker.messenger.exroute/ExRouteTransfer.cs rename linker/plugins/route/IRouteExcludeIP.cs => linker.messenger.exroute/IExRoute.cs (52%) create mode 100644 linker.messenger.exroute/linker.messenger.exroute.csproj create mode 100644 linker.messenger.listen/Entry.cs create mode 100644 linker.messenger.listen/IListenStore.cs rename {linker/plugins/server => linker.messenger.listen}/TcpServer.cs (98%) create mode 100644 linker.messenger.listen/linker.messenger.listen.csproj create mode 100644 linker.messenger.pcp/Entry.cs create mode 100644 linker.messenger.pcp/IPcpStore.cs create mode 100644 linker.messenger.pcp/PcpDecenter.cs rename {linker/plugins/pcp/messenger => linker.messenger.pcp}/PcpMessenger.cs (80%) rename {linker/plugins/pcp/messenger => linker.messenger.pcp}/PcpMessengerIds.cs (85%) rename {linker/plugins/pcp => linker.messenger.pcp}/PcpTransfer.cs (91%) create mode 100644 linker.messenger.pcp/linker.messenger.pcp.csproj create mode 100644 linker.messenger.relay/Entry.cs rename {linker/plugins/relay => linker.messenger.relay}/client/RelayApiController.cs (72%) rename {linker/plugins/relay => linker.messenger.relay}/client/RelayClientTestTransfer.cs (69%) create mode 100644 linker.messenger.relay/client/RelaySync.cs create mode 100644 linker.messenger.relay/server/IRelayServerStore.cs create mode 100644 linker.messenger.relay/server/validator/RelayServerValidatorSecretKey.cs create mode 100644 linker.messenger.serializer.memorypack/AccessSerializer.cs rename {linker/serializer => linker.messenger.serializer.memorypack}/ConnectionFormatter.cs (93%) create mode 100644 linker.messenger.serializer.memorypack/DecenterSerializer.cs create mode 100644 linker.messenger.serializer.memorypack/Entry.cs rename {linker/serializer => linker.messenger.serializer.memorypack}/IPAddressFormatter.cs (96%) rename {linker/serializer => linker.messenger.serializer.memorypack}/IPEndPointFormatter.cs (97%) rename {linker/serializer => linker.messenger.serializer.memorypack}/MemoryPackSerializer.cs (53%) rename linker/plugins/relay/PlusRelaySerializer.cs => linker.messenger.serializer.memorypack/RelaySerializer.cs (99%) rename linker/plugins/signIn/PlusSignInSerializer.cs => linker.messenger.serializer.memorypack/SignInSerializer.cs (87%) create mode 100644 linker.messenger.serializer.memorypack/Socks5Serializer.cs create mode 100644 linker.messenger.serializer.memorypack/SyncSerializer.cs rename {linker/serializer => linker.messenger.serializer.memorypack}/TunnelConnectionFormatter.cs (93%) rename linker/plugins/tunnel/PlusTunnelSerializer.cs => linker.messenger.serializer.memorypack/TunnelSerializer.cs (71%) create mode 100644 linker.messenger.serializer.memorypack/UpdaterSerializer.cs create mode 100644 linker.messenger.serializer.memorypack/linker.messenger.serializer.memorypack.csproj create mode 100644 linker.messenger.signin/Config.cs create mode 100644 linker.messenger.signin/Entry.cs create mode 100644 linker.messenger.signin/ISignInClientStore.cs rename linker.signin/ISignInStore.cs => linker.messenger.signin/ISignInServerStore.cs (63%) create mode 100644 linker.messenger.signin/SignInApiController.cs rename linker/plugins/client/ClientSignInState.cs => linker.messenger.signin/SignInClientState.cs (87%) rename linker/plugins/client/ClientSignInTransfer.cs => linker.messenger.signin/SignInClientTransfer.cs (81%) create mode 100644 linker.messenger.signin/SignInExRoute.cs rename {linker.signin => linker.messenger.signin}/SignInMessenger.cs (83%) rename {linker.signin => linker.messenger.signin}/SignInMessengerIds.cs (100%) rename linker.signin/SignCaching.cs => linker.messenger.signin/SignInServerCaching.cs (96%) rename {linker.signin => linker.messenger.signin/args}/ISignInArgs.cs (94%) rename {linker/plugins/client => linker.messenger.signin/args}/SignInArgsGroupPassword.cs (80%) rename {linker/plugins/signIn => linker.messenger.signin}/args/SignInArgsMachineKey.cs (96%) rename {linker/plugins/client => linker.messenger.signin/args}/SignInArgsSecretKey.cs (58%) rename {linker.signin => linker.messenger.signin/args}/SignInArgsTransfer.cs (83%) rename {linker/plugins/signIn => linker.messenger.signin}/args/SignInArgsVersion.cs (95%) rename {linker.signin => linker.messenger.signin}/linker.messenger.signin.csproj (89%) create mode 100644 linker.messenger.socks5/Entry.cs rename linker/plugins/socks5/config/config.cs => linker.messenger.socks5/ISocks5Store.cs (66%) rename {linker/plugins/socks5 => linker.messenger.socks5}/Socks5ApiController.cs (62%) rename {linker/plugins/socks5 => linker.messenger.socks5}/Socks5Decenter.cs (76%) create mode 100644 linker.messenger.socks5/Socks5ExRoute.cs rename {linker/plugins/socks5/messenger => linker.messenger.socks5}/Socks5Messenger.cs (75%) rename {linker/plugins/socks5/messenger => linker.messenger.socks5}/Socks5MessengerIds.cs (83%) rename {linker/plugins/socks5 => linker.messenger.socks5}/Socks5Proxy.cs (91%) create mode 100644 linker.messenger.socks5/Socks5Transfer.cs rename {linker/plugins/socks5 => linker.messenger.socks5}/TunnelProxy.cs (99%) rename {linker/plugins/socks5 => linker.messenger.socks5}/TunnelProxyTcp.cs (98%) rename {linker/plugins/socks5 => linker.messenger.socks5}/TunnelProxyUdp.cs (99%) create mode 100644 linker.messenger.socks5/linker.messenger.socks5.csproj rename {linker/plugins/config => linker.messenger.store.file}/ConfigApiController.cs (80%) create mode 100644 linker.messenger.store.file/Entry.cs rename linker/config/Config.cs => linker.messenger.store.file/FileConfig.cs (82%) rename {linker/plugins/config => linker.messenger.store.file}/RunningConfig.cs (91%) rename {linker/store => linker.messenger.store.file}/Storefactory.cs (77%) rename linker/plugins/action/ActionTransfer.cs => linker.messenger.store.file/action/ActionStore.cs (51%) rename {linker/plugins/action/config => linker.messenger.store.file/action}/Config.cs (70%) rename linker/plugins/access/AccessTransfer.cs => linker.messenger.store.file/api/AccessStore.cs (73%) create mode 100644 linker.messenger.store.file/api/ApiStore.cs create mode 100644 linker.messenger.store.file/api/Config.cs create mode 100644 linker.messenger.store.file/linker.messenger.store.file.csproj create mode 100644 linker.messenger.store.file/messenger/Config.cs create mode 100644 linker.messenger.store.file/messenger/MessengerStore.cs create mode 100644 linker.messenger.store.file/pcp/Config.cs create mode 100644 linker.messenger.store.file/pcp/PcpStore.cs rename {linker/plugins/relay/config => linker.messenger.store.file/relay}/Config.cs (62%) rename linker/plugins/relay/client/RelayClientConfigTransfer.cs => linker.messenger.store.file/relay/RelayClientStore.cs (52%) create mode 100644 linker.messenger.store.file/relay/RelayServerMasterStore.cs create mode 100644 linker.messenger.store.file/relay/RelayServerNodeStore.cs create mode 100644 linker.messenger.store.file/relay/RelayServerStore.cs create mode 100644 linker.messenger.store.file/server/Config.cs create mode 100644 linker.messenger.store.file/server/ListenStore.cs create mode 100644 linker.messenger.store.file/signIn/Config.cs rename linker/plugins/client/ClientConfigTransfer.cs => linker.messenger.store.file/signIn/SignInClientStore.cs (69%) rename linker/plugins/signIn/SignInStore.cs => linker.messenger.store.file/signIn/SignInServerStore.cs (72%) create mode 100644 linker.messenger.store.file/signIn/SignInSync.cs create mode 100644 linker.messenger.store.file/socks5/Config.cs create mode 100644 linker.messenger.store.file/socks5/Socks5Store.cs create mode 100644 linker.messenger.store.file/tunnel/Config.cs create mode 100644 linker.messenger.store.file/tunnel/TunnelClientStore.cs create mode 100644 linker.messenger.store.file/updater/Config.cs create mode 100644 linker.messenger.store.file/updater/UpdaterClientStore.cs rename linker/plugins/updater/UpdaterCommonTransfer.cs => linker.messenger.store.file/updater/UpdaterCommonStore.cs (69%) create mode 100644 linker.messenger.store.file/updater/UpdaterServerStore.cs create mode 100644 linker.messenger.sync/Entry.cs create mode 100644 linker.messenger.sync/ISync.cs create mode 100644 linker.messenger.sync/SyncApiController.cs rename linker/plugins/config/messenger/ConfigMessenger.cs => linker.messenger.sync/SyncMessenger.cs (60%) rename linker/plugins/config/messenger/ConfigMessengerIds.cs => linker.messenger.sync/SyncMessengerIds.cs (76%) rename linker/plugins/config/ConfigSyncTreansfer.cs => linker.messenger.sync/SyncTreansfer.cs (54%) create mode 100644 linker.messenger.sync/linker.messenger.sync.csproj create mode 100644 linker.messenger.tunnel/Config.cs create mode 100644 linker.messenger.tunnel/Entry.cs rename linker.messenger.tunnel/{ITunnelExcludeIP.cs => ITunnelClientExcludeIP.cs} (79%) rename {linker/plugins/tunnel => linker.messenger.tunnel}/TunnelApiController.cs (51%) rename linker.messenger.tunnel/{TunnelExcludeIPTransfer.cs => TunnelClientExcludeIPTransfer.cs} (62%) rename linker.messenger.tunnel/{TunnelMessengerAdapter.cs => TunnelClientMessengerAdapter.cs} (72%) create mode 100644 linker.messenger.tunnel/TunnelDecenter.cs create mode 100644 linker.messenger.tunnel/TunnelExRoute.cs create mode 100644 linker.messenger.tunnel/TunnelNetworkTransfer.cs rename linker.messenger.tunnel/{TunnelExternalResolver.cs => TunnelServerExternalResolver.cs} (96%) create mode 100644 linker.messenger.tunnel/TunnelSync.cs create mode 100644 linker.messenger.updater/Config.cs create mode 100644 linker.messenger.updater/Entry.cs create mode 100644 linker.messenger.updater/IUpdaterClientStore.cs create mode 100644 linker.messenger.updater/IUpdaterCommonStore.cs create mode 100644 linker.messenger.updater/IUpdaterServerStore.cs rename linker/plugins/updater/UpdaterClientApiController.cs => linker.messenger.updater/UpdaterApiController.cs (50%) rename {linker/plugins/updater => linker.messenger.updater}/UpdaterClientTransfer.cs (61%) create mode 100644 linker.messenger.updater/UpdaterConfigSync.cs rename {linker/plugins/updater => linker.messenger.updater}/UpdaterHelper.cs (76%) rename {linker/plugins/updater/messenger => linker.messenger.updater}/UpdaterMessenger.cs (78%) rename {linker/plugins/updater/messenger => linker.messenger.updater}/UpdaterMessengerIds.cs (90%) rename {linker/plugins/updater => linker.messenger.updater}/UpdaterServerTransfer.cs (56%) create mode 100644 linker.messenger.updater/linker.messenger.updater.csproj create mode 100644 linker.messenger/Entry.cs create mode 100644 linker.messenger/IMessengerStore.cs rename {linker/plugins/resolver => linker.messenger}/IResolver.cs (69%) rename {linker/plugins/resolver => linker.messenger}/ResolverTransfer.cs (72%) create mode 100644 linker.tray.win/web/css/402.bc681d99.css delete mode 100644 linker.tray.win/web/css/424.a59dc963.css delete mode 100644 linker.tray.win/web/css/509.8ac32231.css rename linker.tray.win/web/css/{827.8be8ee26.css => 734.19603134.css} (87%) delete mode 100644 linker.tray.win/web/css/76.a8147928.css create mode 100644 linker.tray.win/web/css/855.f4293598.css rename linker.tray.win/web/css/{256.4e351ac8.css => 857.4e351ac8.css} (100%) create mode 100644 linker.tray.win/web/css/966.149bc7b3.css create mode 100644 linker.tray.win/web/css/app.1dca501b.css delete mode 100644 linker.tray.win/web/css/app.e2cbd3ed.css delete mode 100644 linker.tray.win/web/js/110.0106ebd8.js delete mode 100644 linker.tray.win/web/js/183.9a80af0b.js delete mode 100644 linker.tray.win/web/js/256.8161f834.js create mode 100644 linker.tray.win/web/js/402.024283d6.js delete mode 100644 linker.tray.win/web/js/424.f2a1d18e.js delete mode 100644 linker.tray.win/web/js/509.b1ccc755.js create mode 100644 linker.tray.win/web/js/642.8d1a79df.js rename linker.tray.win/web/js/{827.ca8f5e05.js => 734.bccc9e7e.js} (56%) delete mode 100644 linker.tray.win/web/js/76.61170c94.js create mode 100644 linker.tray.win/web/js/848.33bffbdc.js create mode 100644 linker.tray.win/web/js/855.46fe678b.js create mode 100644 linker.tray.win/web/js/857.f520b520.js create mode 100644 linker.tray.win/web/js/966.bd0145e0.js create mode 100644 linker.tray.win/web/js/app.1a3b60a6.js delete mode 100644 linker.tray.win/web/js/app.1dbd8a85.js delete mode 100644 linker/plugins/access/AccessDecenter.cs delete mode 100644 linker/plugins/access/AccessStartup.cs delete mode 100644 linker/plugins/access/config/Config.cs delete mode 100644 linker/plugins/action/ActionApiController.cs delete mode 100644 linker/plugins/action/ActionStartup.cs delete mode 100644 linker/plugins/capi/ApiClientTypesLoader.cs delete mode 100644 linker/plugins/capi/CApiStartup.cs delete mode 100644 linker/plugins/capi/IApiClientController.cs delete mode 100644 linker/plugins/capi/WebClientServer.cs delete mode 100644 linker/plugins/client/ClientConfigSync.cs delete mode 100644 linker/plugins/client/ClientStartup.cs delete mode 100644 linker/plugins/client/RouteExcludeIP.cs delete mode 100644 linker/plugins/client/config/Config.cs delete mode 100644 linker/plugins/config/ConfigStartup.cs delete mode 100644 linker/plugins/config/ConfigSyncTypesLoader.cs delete mode 100644 linker/plugins/decenter/DecenterStartup.cs delete mode 100644 linker/plugins/decenter/DecenterTypesLoader.cs delete mode 100644 linker/plugins/firewall/FireWallStartup.cs delete mode 100644 linker/plugins/messenger/MessengerResolverResolver.cs delete mode 100644 linker/plugins/messenger/MessengerResolverTypesLoader.cs delete mode 100644 linker/plugins/messenger/MessengerStartup.cs delete mode 100644 linker/plugins/pcp/PcpConfigTransfer.cs delete mode 100644 linker/plugins/pcp/PcpStartup.cs delete mode 100644 linker/plugins/pcp/config/Config.cs delete mode 100644 linker/plugins/relay/RelayStartup.cs delete mode 100644 linker/plugins/relay/client/PlusRelayClientStore.cs delete mode 100644 linker/plugins/relay/client/RelaConfigSync.cs delete mode 100644 linker/plugins/relay/client/RelayClientTypesLoader.cs delete mode 100644 linker/plugins/relay/messenger/PlusRelayMessenger.cs delete mode 100644 linker/plugins/relay/server/PlusRelayServerMasterStore.cs delete mode 100644 linker/plugins/relay/server/PlusRelayServerNodeStore.cs delete mode 100644 linker/plugins/relay/server/PlusRelayServerReportResolver.cs delete mode 100644 linker/plugins/relay/server/PlusRelayServerResolver.cs delete mode 100644 linker/plugins/relay/server/RelayServerConfigTransfer.cs delete mode 100644 linker/plugins/relay/server/validator/RelayServerValidatorSecretKey.cs delete mode 100644 linker/plugins/relay/server/validator/RelayServerValidatorTypeLoader.cs delete mode 100644 linker/plugins/resolver/ResolverStartup.cs delete mode 100644 linker/plugins/resolver/ResolverTypesLoader.cs delete mode 100644 linker/plugins/route/RouteExcludeIPTransfer.cs delete mode 100644 linker/plugins/route/RouteExcludeIPTypesLoader.cs delete mode 100644 linker/plugins/route/RouteStartup.cs delete mode 100644 linker/plugins/server/ServerConfigTransfer.cs delete mode 100644 linker/plugins/server/ServerStartup.cs delete mode 100644 linker/plugins/server/config/Config.cs delete mode 100644 linker/plugins/signIn/PlusSignInMessenger.cs delete mode 100644 linker/plugins/signIn/SignInApiController.cs delete mode 100644 linker/plugins/signIn/SignInConfigTransfer.cs delete mode 100644 linker/plugins/signIn/SignInStartup.cs delete mode 100644 linker/plugins/signIn/args/SignInArgsTypesLoader.cs delete mode 100644 linker/plugins/socks5/RouteExcludeIP.cs delete mode 100644 linker/plugins/socks5/Socks5ConfigTransfer.cs delete mode 100644 linker/plugins/socks5/Socks5Startup.cs delete mode 100644 linker/plugins/tunnel/PlusTunnelExternalResolver.cs delete mode 100644 linker/plugins/tunnel/PlusTunnelMessenger.cs delete mode 100644 linker/plugins/tunnel/PlusTunnelMessengerAdapter.cs delete mode 100644 linker/plugins/tunnel/PlusTunnelMessengerAdapterStore.cs delete mode 100644 linker/plugins/tunnel/TunnelConfigSync.cs delete mode 100644 linker/plugins/tunnel/TunnelConfigTransfer.cs delete mode 100644 linker/plugins/tunnel/TunnelDecenter.cs delete mode 100644 linker/plugins/tunnel/TunnelExcludeIPTypesLoader.cs delete mode 100644 linker/plugins/tunnel/TunnelRouteExcludeIP.cs delete mode 100644 linker/plugins/tunnel/TunnelStartup.cs delete mode 100644 linker/plugins/tuntap/TuntapDeviceStatusTransfer.cs delete mode 100644 linker/plugins/updater/UpdaterConfigSync.cs delete mode 100644 linker/plugins/updater/UpdaterStartup.cs delete mode 100644 linker/plugins/updater/config/config.cs delete mode 100644 linker/serializer/SerializerStartup.cs delete mode 100644 linker/startup/IStartup.cs delete mode 100644 linker/startup/StartupTransfer.cs delete mode 100644 linker/store/StoreStartup.cs diff --git a/.github/workflows/nuget.yml b/.github/workflows/nuget.yml index 120f54f2..42b6923d 100644 --- a/.github/workflows/nuget.yml +++ b/.github/workflows/nuget.yml @@ -28,6 +28,7 @@ jobs: dotnet build ./linker.messenger.relay -c release dotnet build ./linker.messenger.signin -c release dotnet build ./linker.messenger.tunnel -c release + dotnet build ./linker.messenger.decenter -c release - name: Pack run: | @@ -38,6 +39,7 @@ jobs: dotnet pack ./linker.messenger.relay -c release dotnet pack ./linker.messenger.signin -c release dotnet pack ./linker.messenger.tunnel -c release + dotnet pack ./linker.messenger.decenter -c release - name: Install Nuget uses: nuget/setup-nuget@v1 @@ -53,3 +55,4 @@ jobs: nuget push ./linker.messenger/bin/release/linker.messenger.relay.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol nuget push ./linker.messenger/bin/release/linker.messenger.signin.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol nuget push ./linker.messenger/bin/release/linker.messenger.tunnel.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol + nuget push ./linker.messenger/bin/release/linker.messenger.decenter.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol diff --git a/README.md b/README.md index a8cf08d0..43afda06 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,7 @@ - [x] 网络配置,主客户端设置网络,所有客户端自动分配IP - [x] 分布式,多中继服务器节点,承载海量设备 - [x] socks5代理,端口转发需要指定端口,而socks5代理可以代理所有端口 +- [x] 集成linker,使用`linker.messenger`信标,`linker.messenger.signin`登录,`linker.messenger.tunnel`打洞,`linker.messenger.relay`中继,轻松在你的项目中集成打洞和中继,`linker.messenger.example`是一个完整的登录打洞中继demo ## 大概长这个样子 diff --git a/linker.doc.web/docs/1、首页.md b/linker.doc.web/docs/1、首页.md index 77d7f918..40b0f85f 100644 --- a/linker.doc.web/docs/1、首页.md +++ b/linker.doc.web/docs/1、首页.md @@ -34,6 +34,7 @@ sidebar_position: 1 - [x] 网络配置,主客户端设置网络,所有客户端自动分配IP - [x] 分布式,多中继服务器节点,承载海量设备 - [x] socks5代理,端口转发需要指定端口,而socks5代理可以代理所有端口 +- [x] 集成linker,使用`linker.messenger`信标,`linker.messenger.signin`登录,`linker.messenger.tunnel`打洞,`linker.messenger.relay`中继,轻松在你的项目中集成打洞和中继,`linker.messenger.example`是一个完整的登录打洞中继demo #### 1.3、加入组织 diff --git a/linker.doc.web/docs/3、打洞和中继/3.2、中继.md b/linker.doc.web/docs/3、打洞和中继/3.2、中继.md index 8743c85b..8d6bbac0 100644 --- a/linker.doc.web/docs/3、打洞和中继/3.2、中继.md +++ b/linker.doc.web/docs/3、打洞和中继/3.2、中继.md @@ -46,7 +46,7 @@ sidebar_position: 2 //主服务器地址 "MasterHost": "linker.snltty.com:1802", - //主服务器的密钥 + //主服务器的密钥,主服务里的,Master里的SecretKey "MasterSecretKey": "" }, //我是主服务器,接收其它中继节点服务器的信息 diff --git a/linker.doc.web/docs/8、集成/8.1、使用打洞和中继.md b/linker.doc.web/docs/8、集成/8.1、使用打洞和中继.md new file mode 100644 index 00000000..06acf470 --- /dev/null +++ b/linker.doc.web/docs/8、集成/8.1、使用打洞和中继.md @@ -0,0 +1,108 @@ +--- +sidebar_position: 1 +--- + +# 8.1、使用打洞和中继 +:::tip[说明] +1. 在你的.NET8.0+项目中,集成linker的打洞和中继 +2. 分别在服务端和客户端使用nuget安装`linker.messenger`,`linker.messenger.signin`,`linker.messenger.tunnel`,`linker.messenger.relay` +3. 然后参照样例[https://github.com/snltty/linker/tree/master/linker.messenger.example](https://github.com/snltty/linker/tree/master/linker.messenger.example) + +::: + +## 1、自定义登录参数和验证 + +:::tip[说明] +实现自定义的登录参数验证, +``` +//在客户端和服务端操作 +SignInArgsTransfer signInArgsTransfer = new SignInArgsTransfer(); +//加载你写的类 +signInArgsTransfer.LoadArgs(new List { + new MySignInArgs() +}); + + +//在客户端,登录操作事情执行一下,然后把 argsDic 传过去就行 +Dictionary argsDic = new Dictionary(); +await signInArgsTransfer.Invoke(string.Empty, argsDic); +//像这样传过去 +MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap +{ + Connection = 与服务器的连接对象, + MessengerId = (ushort)SignInMessengerIds.SignIn_V_1_3_1, + Timeout = 2000, + Payload = serializer.Serialize(new SignInfo + { + MachineName = Dns.GetHostName(), + MachineId = string.Empty, + Version = VersionHelper.version, + Args = argsDic, + GroupId = "default" + }) +}).ConfigureAwait(false); + + +public sealed class MySignInArgs : ISignInArgs +{ + /// + /// 客户端调用 + /// + /// + /// + /// + public async Task Invoke(string host, Dictionary args) + { + //在这里加入你喜欢的数据 + + //返回空字符串,表示成功,不空为错误信息 + return await Task.FromResult(string.Empty); + } + + /// + /// 服务端调用 + /// + /// 本次登录的信息 + /// 如果以前登录过就有信息,否则MachineId为空 + /// + /// + public async Task Validate(SignInfo signInfo, SignCacheInfo cache) + { + //在这里进行你的验证 + + //返回空字符串,表示成功,不空为错误信息则登录失败 + return await Task.FromResult(string.Empty); + } +} +``` +::: + +## 1、自定义中继认证 + +:::tip[说明] +实现自定义的中继验证, +``` +//在服务端操作 +RelayServerValidatorTransfer relayServerValidatorTransfer = new RelayServerValidatorTransfer(); +//加载你写的类 +relayServerValidatorTransfer.LoadValidators(new List { + new MyRelayServerValidator() +}); + +public sealed class MyRelayServerValidator : IRelayServerValidator +{ + /// + /// 验证,服务端会调用 + /// + /// 中继参数 + /// 来源客户端 + /// 目标客户端 + /// + public async Task Validate(RelayInfo relayInfo, SignCacheInfo fromMachine, SignCacheInfo toMachine) + { + //返回空字符串,表示成功,不空为错误信息则登录失败 + return await Task.FromResult(string.Empty); + } +} +``` +::: \ No newline at end of file diff --git a/linker.doc.web/docs/9、集成tun网卡到你的项目.md b/linker.doc.web/docs/8、集成/8.2、独立使用虚拟网卡.md similarity index 98% rename from linker.doc.web/docs/9、集成tun网卡到你的项目.md rename to linker.doc.web/docs/8、集成/8.2、独立使用虚拟网卡.md index b1557c19..279adbaa 100644 --- a/linker.doc.web/docs/9、集成tun网卡到你的项目.md +++ b/linker.doc.web/docs/8、集成/8.2、独立使用虚拟网卡.md @@ -1,8 +1,8 @@ --- -sidebar_position: 9 +sidebar_position: 2 --- -# 9、集成tun网卡到你的项目 +# 8.2、独立使用虚拟网卡 ## 1、说明 diff --git a/linker.doc.web/docs/10、组网和内网穿透流程图.md b/linker.doc.web/docs/8、集成/8.3、组网和内网穿透流程图.md similarity index 71% rename from linker.doc.web/docs/10、组网和内网穿透流程图.md rename to linker.doc.web/docs/8、集成/8.3、组网和内网穿透流程图.md index 6c760c8d..625cc345 100644 --- a/linker.doc.web/docs/10、组网和内网穿透流程图.md +++ b/linker.doc.web/docs/8、集成/8.3、组网和内网穿透流程图.md @@ -1,8 +1,8 @@ --- -sidebar_position: 10 +sidebar_position: 3 --- -# 10、组网和内网穿透流程图 +# 8.3、组网和内网穿透流程图 :::tip[说明] diff --git a/linker.doc.web/docs/8、集成/_category_.json b/linker.doc.web/docs/8、集成/_category_.json new file mode 100644 index 00000000..943ddf4d --- /dev/null +++ b/linker.doc.web/docs/8、集成/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "8、集成", + "position": 8, + "link": { + "type": "generated-index", + "description": "这里是一些高级用法,如果你不懂代码,就不用看" + } +} \ No newline at end of file diff --git a/linker.doc.web/docs/img/network.drawio b/linker.doc.web/docs/8、集成/img/network.drawio similarity index 100% rename from linker.doc.web/docs/img/network.drawio rename to linker.doc.web/docs/8、集成/img/network.drawio diff --git a/linker.doc.web/docs/img/network.jpg b/linker.doc.web/docs/8、集成/img/network.jpg similarity index 100% rename from linker.doc.web/docs/img/network.jpg rename to linker.doc.web/docs/8、集成/img/network.jpg diff --git a/linker.doc.web/docs/img/transfer.drawio b/linker.doc.web/docs/8、集成/img/transfer.drawio similarity index 100% rename from linker.doc.web/docs/img/transfer.drawio rename to linker.doc.web/docs/8、集成/img/transfer.drawio diff --git a/linker.doc.web/docs/img/transfer.jpg b/linker.doc.web/docs/8、集成/img/transfer.jpg similarity index 100% rename from linker.doc.web/docs/img/transfer.jpg rename to linker.doc.web/docs/8、集成/img/transfer.jpg diff --git a/linker.doc.web/docs/8、集成打洞到你的项目.md b/linker.doc.web/docs/8、集成打洞到你的项目.md deleted file mode 100644 index 217af57b..00000000 --- a/linker.doc.web/docs/8、集成打洞到你的项目.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -sidebar_position: 8 ---- - -# 8、集成打洞到你的项目 -:::tip[说明] -1. 你需要自己实现信标服务器,用于交换打洞信息 -2. `linker.tunnel`源码在[https://github.com/snltty/linker/tree/master/linker.tunnel](https://github.com/snltty/linker/tree/master/linker.tunnel) -3. 使用nuget安装`linker.tunnel` - -## 1、初始化 -```c# - //实现你的适配器 - ITunnelAdapter tunnelAdapter = new MyTunnelAdapter(); - - //获取外网端口类列表 - List tunnelWanPorts = new List{ - new MyWanPort(),//你自己的获取外网端口的方法 - }; - //创建一个获取外网端口处理器 - TunnelWanPortTransfer tunnelWanPortTransfer = new TunnelWanPortTransfer(); - tunnelWanPortTransfer.Init(tunnelWanPorts); - - //打洞协议列表 - List transports = new List{ - new TransportUdp(),//udp打洞 - new TransportTcpP2PNAT()//tcp打洞 - }; - //创建一个打洞处理器 - TunnelTransfer tunnelTransfer = new TunnelTransfer(); - tunnelTransfer.Init(tunnelWanPortTransfer, tunnelAdapter, transports); -``` - -## 2、监听打洞成功事件 -```c# -//监听打洞成功事件 -tunnelTransfer.SetConnectedCallback("你的事务名",Action callback); -//移除打洞成功事件 -tunnelTransfer.RemoveConnectedCallback("你的事务名",Action callback) -``` - -## 3、处理打洞消息 -```c# - -//开始打洞会调用ITunnelAdapter.SendConnectBegin 发送给对方,你需要实现这个方法 -//对方收到消息,你应该调用 -tunnelTransfer.OnBegin(); - -//打洞失败则会调用 ITunnelAdapter.SendConnectFail 发送给对方,你需要实现这个方法 -//对方收到消息,你应该调用 -tunnelTransfer.OnFail(); - -//打洞成功则会调用 ITunnelAdapter.SendConnectSuccess 发送给对方,你需要实现这个方法 -//对方收到消息,你应该调用 -tunnelTransfer.OnSuccess(); - -``` - -## 4、开始打洞 -```c# - -//会通过 ITunnelAdapter.SendConnectBegin 发送给对方,你需要实现这个方法 -tunnelTransfer.ConnectAsync("对方的名字或编号,取决于的你信标服务器实现","事务名",TunnelProtocolType.None); -``` -::: \ No newline at end of file diff --git a/linker.doc.web/docusaurus.config.js b/linker.doc.web/docusaurus.config.js index 6badf7a6..b40c4b1e 100644 --- a/linker.doc.web/docusaurus.config.js +++ b/linker.doc.web/docusaurus.config.js @@ -9,7 +9,7 @@ import { themes as prismThemes } from 'prism-react-renderer'; /** @type {import('@docusaurus/types').Config} */ const config = { title: 'linker-doc', - tagline: 'linker、一个免费开源的P2P内网穿透内核', + tagline: 'linker、一个免费开源的P2P异地组网和内网穿透内核', favicon: 'img/favicon.ico', // Set the production url of your site here @@ -20,7 +20,7 @@ const config = { // GitHub pages deployment config. // If you aren't using GitHub pages, you don't need these. - organizationName: 'facebook', // Usually your GitHub org/user name. + organizationName: 'snltty', // Usually your GitHub org/user name. projectName: 'linker.doc.web', // Usually your repo name. onBrokenLinks: 'throw', @@ -93,6 +93,8 @@ const config = { footer: { style: 'light', links: [ + { href: 'https://mi-d.cn', label: '米多贝克', position: 'left' }, + { href: 'https://www.wpe64.com', label: 'WPE64代理和抓包', position: 'left' }, ], copyright: `Copyright © ${new Date().getFullYear()} linker, Inc. Built with Docusaurus.`, }, diff --git a/linker.doc.web/src/components/HomepageFeatures/index.js b/linker.doc.web/src/components/HomepageFeatures/index.js index 1c024fe5..4fd1119d 100644 --- a/linker.doc.web/src/components/HomepageFeatures/index.js +++ b/linker.doc.web/src/components/HomepageFeatures/index.js @@ -4,11 +4,11 @@ import styles from './styles.module.css'; const FeatureList = [ { - title: '跨平台、易操作、且安全', + title: '跨平台、高性能、可视化', Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, description: ( <> - .NET8,高性能MemoryPack序列化,易操作web管理页面,所有通信均SSL加密 + 跨平台高性能的.NET8,简洁明了的web管理页面,安全的SSL加密通信 ), }, @@ -17,12 +17,12 @@ const FeatureList = [ Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default, description: ( <> - 3TCP打洞 + 1UDP打洞 + 1TCP端口映射连接 + 1TCP服务器中继连接 + 1TCP+UDP服务器穿透穿透 + TCP+UDP打洞、服务器中继、服务器穿透,简单几步,将打洞和中继集成到你自己的项目中 ), }, { - title: 'TCP、UDP、什么P', + title: '组网和转发', Svg: require('@site/static/img/undraw_docusaurus_react.svg').default, description: ( <> diff --git a/linker.doc.web/src/pages/index.js b/linker.doc.web/src/pages/index.js index 3406207e..bd974872 100644 --- a/linker.doc.web/src/pages/index.js +++ b/linker.doc.web/src/pages/index.js @@ -33,7 +33,7 @@ export default function Home() { return ( + description="linker、一个免费开源的P2P异地组网和内网穿透内核">
diff --git a/linker.gen/InterfaceSourceGenerator.cs b/linker.gen/InterfaceSourceGenerator.cs deleted file mode 100644 index 5b494800..00000000 --- a/linker.gen/InterfaceSourceGenerator.cs +++ /dev/null @@ -1,167 +0,0 @@ -using Microsoft.CodeAnalysis.CSharp.Syntax; -using Microsoft.CodeAnalysis; -using System.Linq; -using System.Collections.Generic; -using Microsoft.CodeAnalysis.Text; -using System.Text; -using System.Diagnostics; - -namespace linker.gen -{ - - [Generator(LanguageNames.CSharp)] - public class InterfaceSourceGenerator : IIncrementalGenerator - { - private List generators = new List { - new GeneratorInfo{ ClassName="linker.plugins.flow.FlowTypesLoader", InterfaceName="linker.plugins.flow.IFlow" }, - new GeneratorInfo{ ClassName="linker.plugins.relay.client.RelayClientTypesLoader", InterfaceName="linker.messenger.relay.client.transport.IRelayClientTransport" }, - new GeneratorInfo{ ClassName="linker.plugins.relay.server.validator.RelayServerValidatorTypeLoader", InterfaceName="linker.messenger.relay.server.validator.IRelayServerValidator" }, - new GeneratorInfo{ ClassName="linker.plugins.signIn.args.SignInArgsTypesLoader", InterfaceName="linker.messenger.signin.ISignInArgs" }, - new GeneratorInfo{ ClassName="linker.plugins.resolver.ResolverTypesLoader", InterfaceName="linker.plugins.resolver.IResolver" }, - new GeneratorInfo{ ClassName="linker.plugins.tunnel.TunnelExcludeIPTypesLoader", InterfaceName="linker.messenger.tunnel.ITunnelExcludeIP" }, - new GeneratorInfo{ ClassName="linker.startup.StartupTransfer", InterfaceName="linker.startup.IStartup", Instance=true }, - new GeneratorInfo{ ClassName="linker.plugins.messenger.MessengerResolverTypesLoader", InterfaceName="linker.messenger.IMessenger"}, - new GeneratorInfo{ ClassName="linker.plugins.capi.ApiClientTypesLoader",InterfaceName="linker.plugins.capi.IApiClientController"}, - new GeneratorInfo{ ClassName="linker.plugins.config.ConfigSyncTypesLoader", InterfaceName="linker.plugins.config.IConfigSync"}, - new GeneratorInfo{ ClassName="linker.plugins.decenter.DecenterTypesLoader", InterfaceName="linker.plugins.decenter.IDecenter"}, - new GeneratorInfo{ ClassName="linker.plugins.route.RouteExcludeIPTypesLoader", InterfaceName="linker.plugins.route.IRouteExcludeIP" }, - }; - - public void Initialize(IncrementalGeneratorInitializationContext context) - { - IncrementalValueProvider compilations = context.CompilationProvider.Select((compilation, cancellationToken) => compilation); - - context.RegisterSourceOutput(compilations, (sourceProductionContext, compilation) => - { - - - foreach (GeneratorInfo info in generators) - { - var iFlowSymbol = compilation.GetTypeByMetadataName(info.InterfaceName); - List types = new List { }; - List classs = new List { }; - List namespaces = new List { }; - - foreach (var syntaxTree in compilation.SyntaxTrees) - { - if (syntaxTree == null) - { - continue; - } - var root = syntaxTree.GetRoot(sourceProductionContext.CancellationToken); - var classDeclarationSyntaxs = root - .DescendantNodes(descendIntoTrivia: true) - .OfType(); - - foreach (var classDeclarationSyntax in classDeclarationSyntaxs) - { - var model = compilation.GetSemanticModel(classDeclarationSyntax.SyntaxTree); - var classSymbol = model.GetDeclaredSymbol(classDeclarationSyntax) as INamedTypeSymbol; - if (classSymbol.AllInterfaces.Contains(iFlowSymbol)) - { - types.Add($"typeof({classDeclarationSyntax.Identifier.Text})"); - - if (info.Instance) - classs.Add($"new {classDeclarationSyntax.Identifier.Text}()"); - - var namespaceDecl = classDeclarationSyntax.FirstAncestorOrSelf(); - if (namespaceDecl != null) - { - namespaces.Add($"using {namespaceDecl.Name.ToString()};"); - } - } - } - } - - - /* - var referencedAssemblySymbols = compilation.SourceModule.ReferencedAssemblySymbols; - foreach (IAssemblySymbol referencedAssemblySymbol in referencedAssemblySymbols) - { - var allTypeSymbol = GetAllTypeSymbol(referencedAssemblySymbol.GlobalNamespace).SelectMany(c=>c.DeclaringSyntaxReferences).Select(c=>c.SyntaxTree).ToList(); - foreach (var item in allTypeSymbol) - { - var root = item.GetRoot(sourceProductionContext.CancellationToken); - var classDeclarationSyntaxs = root - .DescendantNodes(descendIntoTrivia: true) - .OfType(); - - foreach (var classDeclarationSyntax in classDeclarationSyntaxs) - { - var model = compilation.GetSemanticModel(classDeclarationSyntax.SyntaxTree); - var classSymbol = model.GetDeclaredSymbol(classDeclarationSyntax) as INamedTypeSymbol; - if (classSymbol.AllInterfaces.Contains(iFlowSymbol)) - { - types.Add($"typeof({classDeclarationSyntax.Identifier.Text})"); - - if (info.Instance) - classs.Add($"new {classDeclarationSyntax.Identifier.Text}()"); - - var namespaceDecl = classDeclarationSyntax.FirstAncestorOrSelf(); - if (namespaceDecl != null) - { - namespaces.Add($"using {namespaceDecl.Name.ToString()};"); - } - } - } - } - } - */ - - var spaces = info.ClassName.Split('.'); - - var source = $@" - using System; - using System.Collections.Generic; - {string.Join("\r\n", namespaces.Distinct())} - - namespace {string.Join(".", spaces.Take(spaces.Count() - 1))} - {{ - public partial class {spaces.LastOrDefault()} - {{ - public static List GetSourceGeneratorTypes() - {{ - return new List {{ - {string.Join(",", types)} - }}; - }} - public static List<{info.InterfaceName}> GetSourceGeneratorInstances() - {{ - return new List<{info.InterfaceName}> {{ - {string.Join(",", classs)} - }}; - }} - }} - }}"; - - var sourceText = SourceText.From(source, Encoding.UTF8); - sourceProductionContext.AddSource($"{info.ClassName}Instances.g.cs", sourceText); - } - }); - } - private static IEnumerable GetAllTypeSymbol(INamespaceSymbol namespaceSymbol) - { - var typeMemberList = namespaceSymbol.GetTypeMembers(); - - foreach (var typeSymbol in typeMemberList) - { - yield return typeSymbol; - } - - foreach (var namespaceMember in namespaceSymbol.GetNamespaceMembers()) - { - foreach (var typeSymbol in GetAllTypeSymbol(namespaceMember)) - { - yield return typeSymbol; - } - } - } - - public sealed class GeneratorInfo - { - public string ClassName { get; set; } - public string InterfaceName { get; set; } - public bool Instance { get; set; } - } - } -} diff --git a/linker.gen/Properties/PublishProfiles/FolderProfile.pubxml b/linker.gen/Properties/PublishProfiles/FolderProfile.pubxml deleted file mode 100644 index 482d3990..00000000 --- a/linker.gen/Properties/PublishProfiles/FolderProfile.pubxml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - Release - Any CPU - bin\Release\publish\ - FileSystem - <_TargetId>Folder - netstandard2.0 - - \ No newline at end of file diff --git a/linker.gen/Properties/PublishProfiles/FolderProfile.pubxml.user b/linker.gen/Properties/PublishProfiles/FolderProfile.pubxml.user deleted file mode 100644 index 8848cac2..00000000 --- a/linker.gen/Properties/PublishProfiles/FolderProfile.pubxml.user +++ /dev/null @@ -1,10 +0,0 @@ - - - - - True|2024-10-10T09:23:14.3539248Z||; - - - \ No newline at end of file diff --git a/linker.gen/linker.gen.csproj b/linker.gen/linker.gen.csproj deleted file mode 100644 index 3bfffa58..00000000 --- a/linker.gen/linker.gen.csproj +++ /dev/null @@ -1,21 +0,0 @@ - - - - netstandard2.0 - cs - true - false - true - true - false - false - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - diff --git a/linker.gen/linker.gen.csproj.user b/linker.gen/linker.gen.csproj.user deleted file mode 100644 index 21a72e68..00000000 --- a/linker.gen/linker.gen.csproj.user +++ /dev/null @@ -1,6 +0,0 @@ - - - - <_LastSelectedProfileId>C:\Users\snltty\Desktop\linker\linker.gen\Properties\PublishProfiles\FolderProfile.pubxml - - \ No newline at end of file diff --git a/linker.libs/api/ApiServer.cs b/linker.libs/api/ApiServer.cs index 531e9afb..eb76e086 100644 --- a/linker.libs/api/ApiServer.cs +++ b/linker.libs/api/ApiServer.cs @@ -38,7 +38,7 @@ namespace linker.libs.api server = new WebSocketServer(); try { - server.Start(System.Net.IPAddress.Any, port); + server.Start( port); } catch (Exception ex) { diff --git a/linker.libs/extends/SocketExtends.cs b/linker.libs/extends/SocketExtends.cs index b04f7895..455b9cac 100644 --- a/linker.libs/extends/SocketExtends.cs +++ b/linker.libs/extends/SocketExtends.cs @@ -70,6 +70,10 @@ namespace linker.libs.extends } public static void ReuseBind(this Socket socket, IPEndPoint ip) { + if(ip.AddressFamily == AddressFamily.InterNetworkV6) + { + socket.IPv6Only(ip.AddressFamily,false); + } socket.Reuse(true); socket.Bind(ip); } diff --git a/linker.libs/socks5/Socks5Parser.cs b/linker.libs/socks5/Socks5Parser.cs index 55edf167..b6d7c534 100644 --- a/linker.libs/socks5/Socks5Parser.cs +++ b/linker.libs/socks5/Socks5Parser.cs @@ -141,7 +141,6 @@ namespace linker.libs.socks5 res[^1] = *pp; } - return res; } /// @@ -212,21 +211,13 @@ namespace linker.libs.socks5 { /* * VERSION METHODS_COUNT METHODS - 1字节 1字节 1到255字节,长度由METHODS_COUNT值决定 - 0x05 0x03 0x00 0x01 0x02 + * 1字节 1字节 1到255字节,长度由METHODS_COUNT值决定 + * 0x05 0x03 0x00 0x01 0x02 */ - - if (data.Length < 2 || data.Length < 2 + data.Span[1]) { return EnumProxyValidateDataResult.TooShort; } - /* - if (data.Length > 2 + data.Span[1]) - { - return EnumProxyValidateDataResult.TooLong; - }*/ - return EnumProxyValidateDataResult.Equal; } /// @@ -255,12 +246,6 @@ namespace linker.libs.socks5 { return EnumProxyValidateDataResult.TooShort; } - /* - if (data.Length > 4 + addrLength) - { - return EnumProxyValidateDataResult.TooLong; - } - */ return EnumProxyValidateDataResult.Equal; } /// @@ -309,12 +294,6 @@ namespace linker.libs.socks5 { return EnumProxyValidateDataResult.TooShort; } - /* - if (span.Length > 1 + 1 + nameLength + passwordLength) - { - return EnumProxyValidateDataResult.TooLong; - } - */ return EnumProxyValidateDataResult.Equal; } diff --git a/linker.libs/websocket/WebSocketClient.cs b/linker.libs/websocket/WebSocketClient.cs index 4b2c85c0..2184cd35 100644 --- a/linker.libs/websocket/WebSocketClient.cs +++ b/linker.libs/websocket/WebSocketClient.cs @@ -97,7 +97,7 @@ namespace linker.libs.websocket } var socket = new Socket(ep.AddressFamily, SocketType.Stream, ProtocolType.Tcp); - socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + //socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); socket.KeepAlive(); AsyncServerUserToken token = new AsyncServerUserToken diff --git a/linker.libs/websocket/WebSocketServer.cs b/linker.libs/websocket/WebSocketServer.cs index 4060978d..7f4b740b 100644 --- a/linker.libs/websocket/WebSocketServer.cs +++ b/linker.libs/websocket/WebSocketServer.cs @@ -83,12 +83,12 @@ namespace linker.libs.websocket { WebSocketFrameInfo.EnumOpcode.Pong,HandlePong}, }; } - public void Start(IPAddress bindip, int port) + public void Start(int port) { - IPEndPoint localEndPoint = new IPEndPoint(bindip, port); + IPEndPoint localEndPoint = new IPEndPoint(IPAddress.IPv6Any, port); socket = new Socket(localEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); - socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + socket.IPv6Only(localEndPoint.AddressFamily,false); socket.Bind(localEndPoint); socket.Listen(int.MaxValue); @@ -351,7 +351,7 @@ namespace linker.libs.websocket private void HandleConnect(AsyncUserToken token, Memory data) { WebsocketHeaderInfo header = WebsocketHeaderInfo.Parse(data); - if (header.TryGetHeaderValue(WebsocketHeaderKey.SecWebSocketKey,out string key) == false) + if (header.TryGetHeaderValue(WebsocketHeaderKey.SecWebSocketKey, out string key) == false) { header.StatusCode = HttpStatusCode.MethodNotAllowed; token.Connectrion.ConnectResponse(header); diff --git a/linker/plugins/access/AccessApiController.cs b/linker.messenger.access/AccessApiController.cs similarity index 55% rename from linker/plugins/access/AccessApiController.cs rename to linker.messenger.access/AccessApiController.cs index e321af0e..1653c419 100644 --- a/linker/plugins/access/AccessApiController.cs +++ b/linker.messenger.access/AccessApiController.cs @@ -1,29 +1,25 @@ -using linker.config; -using linker.libs.api; +using linker.libs.api; using linker.libs.extends; -using linker.plugins.capi; using linker.libs; -using linker.plugins.client; -using linker.plugins.messenger; -using MemoryPack; -using linker.plugins.access.messenger; -using linker.messenger; +using linker.messenger.signin; -namespace linker.plugins.access +namespace linker.messenger.access { - public sealed class AccessApiController : IApiClientController + public sealed class AccessApiController : IApiController { private readonly IMessengerSender sender; - private readonly ClientSignInState clientSignInState; + private readonly SignInClientState signInClientState; private readonly AccessDecenter accessDecenter; - private readonly ClientConfigTransfer clientConfigTransfer; + private readonly ISignInClientStore signInClientStore; + private readonly ISerializer serializer; - public AccessApiController(IMessengerSender sender, ClientSignInState clientSignInState, AccessDecenter accessDecenter, ClientConfigTransfer clientConfigTransfer) + public AccessApiController(IMessengerSender sender, SignInClientState signInClientState, AccessDecenter accessDecenter, ISignInClientStore signInClientStore, ISerializer serializer) { this.sender = sender; - this.clientSignInState = clientSignInState; + this.signInClientState = signInClientState; this.accessDecenter = accessDecenter; - this.clientConfigTransfer = clientConfigTransfer; + this.signInClientStore = signInClientStore; + this.serializer = serializer; } public void Refresh(ApiControllerParamsInfo param) @@ -45,20 +41,20 @@ namespace linker.plugins.access return new AccessListInfo { HashCode = version }; } - [ClientApiAccessAttribute(ClientApiAccess.Access)] + [Access(AccessValue.Access)] public async Task SetAccess(ApiControllerParamsInfo param) { - ConfigUpdateAccessInfo configUpdateAccessInfo = param.Content.DeJson(); - if (configUpdateAccessInfo.ToMachineId == clientConfigTransfer.Id) + AccessUpdateInfo configUpdateAccessInfo = param.Content.DeJson(); + if (configUpdateAccessInfo.ToMachineId == signInClientStore.Id) { return false; } - configUpdateAccessInfo.FromMachineId = clientConfigTransfer.Id; + configUpdateAccessInfo.FromMachineId = signInClientStore.Id; MessageResponeInfo resp = await sender.SendReply(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)AccessMessengerIds.AccessUpdateForward, - Payload = MemoryPackSerializer.Serialize(configUpdateAccessInfo) + Payload = serializer.Serialize(configUpdateAccessInfo) }); return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray); } @@ -68,7 +64,7 @@ namespace linker.plugins.access public sealed class AccessListInfo { - public Dictionary List { get; set; } + public Dictionary List { get; set; } public ulong HashCode { get; set; } } } diff --git a/linker.messenger.access/AccessDecenter.cs b/linker.messenger.access/AccessDecenter.cs new file mode 100644 index 00000000..e93b6013 --- /dev/null +++ b/linker.messenger.access/AccessDecenter.cs @@ -0,0 +1,55 @@ +using linker.libs; +using linker.messenger.decenter; +using linker.messenger.signin; + +namespace linker.messenger.access +{ + public sealed class AccessDecenter : IDecenter + { + public string Name => "access"; + public VersionManager SyncVersion { get; } = new VersionManager(); + public VersionManager DataVersion { get; } = new VersionManager(); + + public Dictionary Accesss { get; } = new Dictionary(); + + private readonly ISignInClientStore signInClientStore; + private readonly IAccessStore accessStore; + private readonly ISerializer serializer; + public AccessDecenter(SignInClientState signInClientState, ISignInClientStore signInClientStore, IAccessStore accessStore, ISerializer serializer) + { + this.signInClientStore = signInClientStore; + this.accessStore = accessStore; + this.serializer = serializer; + + signInClientState.NetworkEnabledHandle += (times) => SyncVersion.Add(); + accessStore.OnChanged += SyncVersion.Add; + + } + public void Refresh() + { + SyncVersion.Add(); + } + public Memory GetData() + { + AccessInfo info = new AccessInfo { MachineId = signInClientStore.Id, Access = accessStore.Access }; + Accesss[info.MachineId] = info.Access; + DataVersion.Add(); + return serializer.Serialize(info); + } + public void SetData(Memory data) + { + AccessInfo access = serializer.Deserialize(data.Span); + Accesss[access.MachineId] = access.Access; + DataVersion.Add(); + } + public void SetData(List> data) + { + List list = data.Select(c => serializer.Deserialize(c.Span)).ToList(); + foreach (var item in list) + { + Accesss[item.MachineId] = item.Access; + } + DataVersion.Add(); + } + } +} diff --git a/linker/plugins/access/messenger/AccessMessenger.cs b/linker.messenger.access/AccessMessenger.cs similarity index 61% rename from linker/plugins/access/messenger/AccessMessenger.cs rename to linker.messenger.access/AccessMessenger.cs index a7e96f81..7a5a6348 100644 --- a/linker/plugins/access/messenger/AccessMessenger.cs +++ b/linker.messenger.access/AccessMessenger.cs @@ -1,27 +1,24 @@ -using linker.config; -using linker.libs; -using linker.messenger; +using linker.libs; using linker.messenger.signin; -using linker.plugins.client; -using MemoryPack; -namespace linker.plugins.access.messenger +namespace linker.messenger.access { public sealed class AccessServerMessenger : IMessenger { private readonly IMessengerSender sender; - private readonly SignCaching signCaching; - - public AccessServerMessenger(IMessengerSender sender, SignCaching signCaching) + private readonly SignInServerCaching signCaching; + private readonly ISerializer serializer; + public AccessServerMessenger(IMessengerSender sender, SignInServerCaching signCaching, ISerializer serializer) { this.sender = sender; this.signCaching = signCaching; + this.serializer = serializer; } [MessengerId((ushort)AccessMessengerIds.AccessUpdateForward)] public void AccessUpdateForward(IConnection connection) { - ConfigUpdateAccessInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + AccessUpdateInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); info.FromMachineId = connection.Id; if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) && signCaching.TryGet(info.ToMachineId, out SignCacheInfo cache1) && cache1.GroupId == cache.GroupId) { @@ -31,7 +28,7 @@ namespace linker.plugins.access.messenger { Connection = cache1.Connection, MessengerId = (ushort)AccessMessengerIds.AccessUpdate, - Payload = MemoryPackSerializer.Serialize(info), + Payload = serializer.Serialize(info), Timeout = 3000, }).ContinueWith(async (result) => { @@ -49,21 +46,18 @@ namespace linker.plugins.access.messenger public sealed class AccessClientMessenger : IMessenger { - private readonly AccessTransfer accessTransfer; - private readonly FileConfig fileConfig; - private readonly ClientSignInTransfer clientSignInTransfer; - - public AccessClientMessenger(AccessTransfer accessTransfer, FileConfig fileConfig, ClientSignInTransfer clientSignInTransfer) + private readonly IAccessStore accessStore; + private readonly ISerializer serializer; + public AccessClientMessenger(IAccessStore accessStore, ISerializer serializer) { - this.accessTransfer = accessTransfer; - this.fileConfig = fileConfig; - this.clientSignInTransfer = clientSignInTransfer; + this.accessStore = accessStore; + this.serializer = serializer; } [MessengerId((ushort)AccessMessengerIds.AccessUpdate)] public void AccessUpdate(IConnection connection) { - ConfigUpdateAccessInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); - accessTransfer.SetAccess(info); + AccessUpdateInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + accessStore.SetAccess(info); connection.Write(Helper.TrueArray); } } diff --git a/linker/plugins/access/messenger/AccessMessengerIds.cs b/linker.messenger.access/AccessMessengerIds.cs similarity index 83% rename from linker/plugins/access/messenger/AccessMessengerIds.cs rename to linker.messenger.access/AccessMessengerIds.cs index bf03b786..68263ded 100644 --- a/linker/plugins/access/messenger/AccessMessengerIds.cs +++ b/linker.messenger.access/AccessMessengerIds.cs @@ -1,4 +1,4 @@ -namespace linker.plugins.access.messenger +namespace linker.messenger.access { public enum AccessMessengerIds : ushort { diff --git a/linker.messenger.access/Config.cs b/linker.messenger.access/Config.cs new file mode 100644 index 00000000..3ff41254 --- /dev/null +++ b/linker.messenger.access/Config.cs @@ -0,0 +1,170 @@ +namespace linker.messenger.access +{ + [AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)] + public sealed class AccessAttribute : Attribute + { + public AccessValue Value { get; set; } + + public AccessAttribute(AccessValue value) + { + Value = value; + } + } + + [AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)] + public sealed class AccessDisplayAttribute : Attribute + { + public string Value { get; set; } + + public AccessDisplayAttribute(string value) + { + Value = value; + } + } + + [Flags] + public enum AccessValue : ulong + { + None = 0, + + [AccessDisplay("简单管理")] + NetManager = 1, + [AccessDisplay("专业管理")] + FullManager = 1 << 1, + + [AccessDisplay("服务器配置")] + Config = 1 << 2, + + [AccessDisplay("日志列表")] + LoggerShow = 1 << 3, + [AccessDisplay("日志配置")] + LoggerLevel = 1 << 4, + + [AccessDisplay("修改本机设备名")] + RenameSelf = 1 << 5, + [AccessDisplay("修改所有设备名")] + RenameOther = 1 << 6, + [AccessDisplay("显示公网信息")] + ExternalShow = 1 << 7, + + [AccessDisplay("升级本机")] + UpdateSelf = 1 << 8, + [AccessDisplay("升级所有设备")] + UpdateOther = 1 << 9, + [AccessDisplay("升级服务器")] + UpdateServer = 1 << 10, + + [AccessDisplay("开关本机网卡")] + TuntapStatusSelf = 1 << 11, + [AccessDisplay("开关所有网卡")] + TuntapStatusOther = 1 << 12, + [AccessDisplay("修改本机网卡")] + TuntapChangeSelf = 1 << 13, + [AccessDisplay("修改所有网卡")] + TuntapChangeOther = 1 << 14, + + [AccessDisplay("显示本机端口转发")] + ForwardShowSelf = 1 << 15, + [AccessDisplay("显示所有设备端口转发")] + ForwardShowOther = 1 << 16, + [AccessDisplay("配置本机端口转发")] + ForwardSelf = 1 << 17, + [AccessDisplay("配置所有设备端口转发")] + ForwardOther = 1 << 18, + + [AccessDisplay("重启其它设备")] + Reboot = 1 << 19, + [AccessDisplay("删除其它设备")] + Remove = 1 << 20, + + [AccessDisplay("修改本机网关")] + TunnelChangeSelf = 1 << 21, + [AccessDisplay("修改所有设备网关")] + TunnelChangeOther = 1 << 22, + [AccessDisplay("删除隧道连接")] + TunnelRemove = 1 << 23, + + [AccessDisplay("开启管理API")] + Api = 1 << 24, + [AccessDisplay("开启管理网页")] + Web = 1 << 25, + + [AccessDisplay("导出配置")] + Export = 1 << 26, + + [AccessDisplay("修改权限")] + Access = 1 << 27, + + [AccessDisplay("修改打洞协议")] + Transport = 1 << 28, + + [AccessDisplay("修改验证参数")] + Action = 1 << 29, + + [AccessDisplay("查看内网穿透流量")] + SForwardFlow = 1 << 30, + + [AccessDisplay("查看中继流量")] + RelayFlow = (ulong)1 << 31, + + [AccessDisplay("查看信标流量")] + SigninFlow = (ulong)1 << 32, + + [AccessDisplay("查看流量")] + Flow = (ulong)1 << 33, + + [AccessDisplay("同步配置")] + Sync = (ulong)1 << 34, + + [AccessDisplay("配置组网网络")] + Lease = (ulong)1 << 35, + + [AccessDisplay("开关本机socks5")] + Socks5StatusSelf = (ulong)1 << 36, + [AccessDisplay("开关所有socks5")] + Socks5StatusOther = (ulong)1 << 37, + [AccessDisplay("修改本机socks5")] + Socks5ChangeSelf = (ulong)1 << 38, + [AccessDisplay("修改所有socks5")] + Socks5ChangeOther = (ulong)1 << 39, + + [AccessDisplay("配置分组")] + Group = (ulong)1 << 40, + + Full = ulong.MaxValue >> 64 - 52, + } + + public sealed class AccessTextInfo + { + public ulong Value { get; set; } + public string Text { get; set; } + } + + public sealed partial class AccessUpdateInfo + { + /// + /// 设备 + /// + public string FromMachineId { get; set; } + /// + /// 设备 + /// + public string ToMachineId { get; set; } + /// + /// 权限 + /// + public ulong Access { get; set; } + } + + public sealed partial class AccessInfo + { + /// + /// 设备 + /// + public string MachineId { get; set; } + /// + /// 权限 + /// + public AccessValue Access { get; set; } + } +} diff --git a/linker.messenger.access/Entry.cs b/linker.messenger.access/Entry.cs new file mode 100644 index 00000000..a59cda88 --- /dev/null +++ b/linker.messenger.access/Entry.cs @@ -0,0 +1,39 @@ +using linker.libs; +using linker.libs.web; +using linker.messenger.access; +using linker.messenger.decenter; +using Microsoft.Extensions.DependencyInjection; +namespace linker.messenger.api +{ + public static class Entry + { + public static ServiceCollection AddAccessClient(this ServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + return serviceCollection; + } + public static ServiceProvider UseAccessClient(this ServiceProvider serviceProvider) + { + IApiServer apiServer = serviceProvider.GetService(); + apiServer.AddPlugins(new List { serviceProvider.GetService() }); + + DecenterClientTransfer decenterClientTransfer = serviceProvider.GetService(); + decenterClientTransfer.AddDecenters(new List { serviceProvider.GetService() }); + + return serviceProvider; + } + + public static ServiceCollection AddAccessServer(this ServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + return serviceCollection; + } + public static ServiceProvider UseAccessServer(this ServiceProvider serviceProvider) + { + + return serviceProvider; + } + } +} diff --git a/linker.messenger.access/IAccessStore.cs b/linker.messenger.access/IAccessStore.cs new file mode 100644 index 00000000..402dba1f --- /dev/null +++ b/linker.messenger.access/IAccessStore.cs @@ -0,0 +1,15 @@ +namespace linker.messenger.access +{ + public interface IAccessStore + { + public AccessValue Access { get; } + + public Action OnChanged { get; set; } + + public void SetAccess(AccessUpdateInfo info); + + public AccessValue AssignAccess(AccessValue access); + + public bool HasAccess(AccessValue clientManagerAccess); + } +} diff --git a/linker.messenger.access/linker.messenger.access.csproj b/linker.messenger.access/linker.messenger.access.csproj new file mode 100644 index 00000000..caf17e9e --- /dev/null +++ b/linker.messenger.access/linker.messenger.access.csproj @@ -0,0 +1,41 @@ + + + + net8.0 + enable + disable + true + false + true + True + linker messenger api access + snltty + snltty + linker messenger api access + snltty + https://github.com/snltty/linker + https://github.com/snltty/linker + linker messenger api access + 1.6.4 + 1.6.4 + 1.6.4 + + + + full + true + + + none + false + True + + + + + + + + + + diff --git a/linker.messenger.action/ActionApiController.cs b/linker.messenger.action/ActionApiController.cs new file mode 100644 index 00000000..ad37b845 --- /dev/null +++ b/linker.messenger.action/ActionApiController.cs @@ -0,0 +1,29 @@ +using linker.libs.api; +using linker.libs.extends; + +namespace linker.messenger.action +{ + public sealed class ActionApiController : IApiController + { + private readonly IActionStore actionStore; + + public ActionApiController(IActionStore actionStore) + { + this.actionStore = actionStore; + } + + + public bool SetArgs(ApiControllerParamsInfo param) + { + actionStore.SetActionArg(param.Content); + return true; + } + + public bool SetServerArgs(ApiControllerParamsInfo param) + { + actionStore.SetActionArgs(param.Content.DeJson>()); + return true; + } + } + +} diff --git a/linker.messenger.action/ActionTransfer.cs b/linker.messenger.action/ActionTransfer.cs new file mode 100644 index 00000000..655b493f --- /dev/null +++ b/linker.messenger.action/ActionTransfer.cs @@ -0,0 +1,35 @@ +using System.Net.Http.Json; +using System.Text.Json.Nodes; +namespace linker.messenger.action +{ + public sealed class ActionTransfer + { + public async Task ExcuteActions(string actionJson, string url) + { + if (string.IsNullOrWhiteSpace(url)) return string.Empty; + try + { + using HttpClient client = new HttpClient(); + JsonContent json = JsonContent.Create(JsonObject.Parse(actionJson)); + HttpResponseMessage resp = await client.PostAsync(url, json); + if (resp.IsSuccessStatusCode) + { + string result = await resp.Content.ReadAsStringAsync(); + if (result.Equals("ok", StringComparison.CurrentCultureIgnoreCase) == false) + { + return $"post {url} fail->{result}"; + } + } + else + { + return $"post {url} fail->{resp.StatusCode}"; + } + } + catch (Exception ex) + { + return $"post {url} fail->{ex.Message}"; + } + return string.Empty; + } + } +} \ No newline at end of file diff --git a/linker.messenger.action/Entry.cs b/linker.messenger.action/Entry.cs new file mode 100644 index 00000000..f149b185 --- /dev/null +++ b/linker.messenger.action/Entry.cs @@ -0,0 +1,38 @@ +using linker.messenger.action; +using Microsoft.Extensions.DependencyInjection; +namespace linker.messenger.api +{ + public static class Entry + { + public static ServiceCollection AddActionClient(this ServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + return serviceCollection; + } + public static ServiceProvider UseActionClient(this ServiceProvider serviceProvider) + { + ApiServer apiServer=serviceProvider.GetService(); + apiServer.AddPlugins(new List { serviceProvider.GetService() }); + + return serviceProvider; + } + + public static ServiceCollection AddActionServer(this ServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + return serviceCollection; + } + public static ServiceProvider UseActionServer(this ServiceProvider serviceProvider) + { + return serviceProvider; + } + } +} diff --git a/linker.messenger.action/IActionStore.cs b/linker.messenger.action/IActionStore.cs new file mode 100644 index 00000000..74a2f01a --- /dev/null +++ b/linker.messenger.action/IActionStore.cs @@ -0,0 +1,18 @@ +namespace linker.messenger.action +{ + public sealed class ActionInfo + { + public string Arg { get; set; } + public Dictionary Args { get; set; } = new Dictionary(); + } + public interface IActionStore + { + public string SignInActionUrl{ get; } + public string RelayActionUrl { get; } + public string SForwardActionUrl { get; } + public void SetActionArg(string action); + public void SetActionArgs(Dictionary actions); + public bool TryAddActionArg(string host, Dictionary args); + public bool TryGetActionArg(Dictionary args, out string str, out string machineKey); + } +} diff --git a/linker/plugins/action/SignInArgsAction.cs b/linker.messenger.action/SignInArgsAction.cs similarity index 84% rename from linker/plugins/action/SignInArgsAction.cs rename to linker.messenger.action/SignInArgsAction.cs index 9b476cd4..f03b300c 100644 --- a/linker/plugins/action/SignInArgsAction.cs +++ b/linker.messenger.action/SignInArgsAction.cs @@ -1,13 +1,11 @@ -using linker.config; -using linker.libs.extends; -using linker.messenger.signin; -using linker.plugins.sforward.config; -using linker.plugins.sforward.validator; +using linker.libs.extends; using linker.messenger.relay.server.validator; +using linker.messenger.signin; +using linker.messenger.signin.args; using System.Net; using System.Text.Json.Nodes; -namespace linker.plugins.action +namespace linker.messenger.action { public sealed class JsonArgInfo { @@ -104,26 +102,26 @@ namespace linker.plugins.action public sealed class SignInArgsAction : JsonArgReplace, ISignInArgs { private readonly ActionTransfer actionTransfer; - private readonly FileConfig fileConfig; + private readonly IActionStore actionStore; - public SignInArgsAction(ActionTransfer actionTransfer, FileConfig fileConfig) + public SignInArgsAction(ActionTransfer actionTransfer, IActionStore actionStore) { this.actionTransfer = actionTransfer; - this.fileConfig = fileConfig; + this.actionStore = actionStore; } public async Task Invoke(string host, Dictionary args) { - actionTransfer.TryAddActionArg(host, args); + actionStore.TryAddActionArg(host, args); await Task.CompletedTask; return string.Empty; } public async Task Validate(SignInfo signInfo, SignCacheInfo cache) { - if (string.IsNullOrWhiteSpace(actionTransfer.SignInActionUrl) == false) + if (string.IsNullOrWhiteSpace(actionStore.SignInActionUrl) == false) { - if (actionTransfer.TryGetActionArg(signInfo.Args, out string str, out string machineKey) == false) + if (actionStore.TryGetActionArg(signInfo.Args, out string str, out string machineKey) == false) { return $"singin action URL exists, but [{signInfo.MachineName}] action value is not configured"; } @@ -139,7 +137,7 @@ namespace linker.plugins.action IPAddress = signInfo.Connection.Address.Address } }; - return await actionTransfer.ExcuteActions(Replace(replace, str), actionTransfer.SignInActionUrl); + return await actionTransfer.ExcuteActions(Replace(replace, str), actionStore.SignInActionUrl); } return string.Empty; @@ -149,23 +147,22 @@ namespace linker.plugins.action public sealed class RelayValidatorAction : JsonArgReplace, IRelayServerValidator { private readonly ActionTransfer actionTransfer; - private readonly FileConfig fileConfig; - - public RelayValidatorAction(ActionTransfer actionTransfer, FileConfig fileConfig) + private readonly IActionStore actionStore; + public RelayValidatorAction(ActionTransfer actionTransfer, IActionStore actionStore) { this.actionTransfer = actionTransfer; - this.fileConfig = fileConfig; + this.actionStore = actionStore; } public async Task Validate(linker.messenger.relay.client.transport.RelayInfo relayInfo, SignCacheInfo fromMachine, SignCacheInfo toMachine) { - if (string.IsNullOrWhiteSpace(actionTransfer.RelayActionUrl) == false) + if (string.IsNullOrWhiteSpace(actionStore.RelayActionUrl) == false) { - if (actionTransfer.TryGetActionArg(fromMachine.Args, out string str, out string machineKey) == false) + if (actionStore.TryGetActionArg(fromMachine.Args, out string str, out string machineKey) == false) { return $"relay action URL exists, but [{fromMachine.MachineName}] action value is not configured"; } - if (toMachine != null && actionTransfer.TryGetActionArg(toMachine.Args, out string str1, out string machineKey1) == false) + if (toMachine != null && actionStore.TryGetActionArg(toMachine.Args, out string str1, out string machineKey1) == false) { return $"relay action URL exists, but [{toMachine.MachineName}]e action value is not configured"; } @@ -190,7 +187,7 @@ namespace linker.plugins.action IPAddress = fromMachine.Connection.Address.Address, } }; - return await actionTransfer.ExcuteActions(Replace(replace, str), actionTransfer.RelayActionUrl); + return await actionTransfer.ExcuteActions(Replace(replace, str), actionStore.RelayActionUrl); } return string.Empty; } @@ -199,19 +196,18 @@ namespace linker.plugins.action public sealed class SForwardValidatorAction : JsonArgReplace, ISForwardValidator { private readonly ActionTransfer actionTransfer; - private readonly FileConfig fileConfig; - - public SForwardValidatorAction(ActionTransfer actionTransfer, FileConfig fileConfig) + private readonly IActionStore actionStore; + public SForwardValidatorAction(ActionTransfer actionTransfer, IActionStore actionStore) { this.actionTransfer = actionTransfer; - this.fileConfig = fileConfig; + this.actionStore = actionStore; } public async Task Validate(SignCacheInfo cache, SForwardAddInfo sForwardAddInfo) { - if (string.IsNullOrWhiteSpace(actionTransfer.SForwardActionUrl) == false) + if (string.IsNullOrWhiteSpace(actionStore.SForwardActionUrl) == false) { - if (actionTransfer.TryGetActionArg(cache.Args, out string str, out string machineKey) == false) + if (actionStore.TryGetActionArg(cache.Args, out string str, out string machineKey) == false) { return $"sforward action URL exists, but [{cache.MachineName}] action value is not configured"; } @@ -232,7 +228,7 @@ namespace linker.plugins.action IPAddress = cache.Connection.Address.Address } }; - return await actionTransfer.ExcuteActions(Replace(replace, str), actionTransfer.SForwardActionUrl); + return await actionTransfer.ExcuteActions(Replace(replace, str), actionStore.SForwardActionUrl); } return string.Empty; } diff --git a/linker.messenger.action/linker.messenger.action.csproj b/linker.messenger.action/linker.messenger.action.csproj new file mode 100644 index 00000000..626f4b1d --- /dev/null +++ b/linker.messenger.action/linker.messenger.action.csproj @@ -0,0 +1,41 @@ + + + + net8.0 + enable + disable + true + false + true + True + linker messenger api access + snltty + snltty + linker messenger api access + snltty + https://github.com/snltty/linker + https://github.com/snltty/linker + linker messenger api access + 1.6.4 + 1.6.4 + 1.6.4 + + + + full + true + + + none + false + True + + + + + + + + + + diff --git a/linker/plugins/capi/ApiClientServer.cs b/linker.messenger.api/ApiServer.cs similarity index 73% rename from linker/plugins/capi/ApiClientServer.cs rename to linker.messenger.api/ApiServer.cs index 32cfbe71..243c95c9 100644 --- a/linker/plugins/capi/ApiClientServer.cs +++ b/linker.messenger.api/ApiServer.cs @@ -1,31 +1,25 @@ -using linker.config; -using linker.libs.api; -using linker.plugins.access; +using linker.libs.api; using System.Reflection; -namespace linker.plugins.capi +namespace linker.messenger.api { /// /// 前段接口服务 /// - public sealed partial class ApiClientServer : ApiServer, IApiClientServer + public sealed partial class ApiServer : libs.api.ApiServer, IApiServer { - private readonly FileConfig config; - private readonly AccessTransfer accessTransfer; - public ApiClientServer(FileConfig config, AccessTransfer accessTransfer) + public ApiServer() { - this.config = config; - this.accessTransfer = accessTransfer; } /// /// 加载插件 /// - public void LoadPlugins(List list) + public void AddPlugins(List list) { Type voidType = typeof(void); - foreach (object obj in list) + foreach (IApiController obj in list) { Type type = obj.GetType(); string path = type.Name.Replace("ApiController", "").Replace("ApiController", ""); @@ -36,13 +30,14 @@ namespace linker.plugins.capi { bool istask = method.ReturnType.GetProperty("IsCompleted") != null && method.ReturnType.GetMethod("GetAwaiter") != null; bool isTaskResult = method.ReturnType.GetProperty("Result") != null; + /* ClientApiAccessAttribute accessAttr = method.GetCustomAttribute(); ulong access = 0; if (accessAttr != null) { access = (ulong)accessAttr.Value; } - + */ plugins.TryAdd(key, new PluginPathCacheInfo { IsVoid = method.ReturnType == voidType, @@ -50,7 +45,7 @@ namespace linker.plugins.capi Target = obj, IsTask = istask, IsTaskResult = isTaskResult, - Access = access, + Access = 0, HasAccess = HasAccess, }); } @@ -59,7 +54,8 @@ namespace linker.plugins.capi } private bool HasAccess(ulong access) { - return accessTransfer.HasAccess((ClientApiAccess)access); + return true; + //return accessTransfer.HasAccess((ClientApiAccess)access); } } } diff --git a/linker.messenger.api/Entry.cs b/linker.messenger.api/Entry.cs new file mode 100644 index 00000000..00dc38fd --- /dev/null +++ b/linker.messenger.api/Entry.cs @@ -0,0 +1,35 @@ +using linker.libs; +using linker.libs.web; +using Microsoft.Extensions.DependencyInjection; +namespace linker.messenger.api +{ + public static class Entry + { + public static ServiceCollection AddApiClient(this ServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + return serviceCollection; + } + public static ServiceProvider UseApiClient(this ServiceProvider serviceProvider) + { + IApiStore apiStore = serviceProvider.GetService(); + if (apiStore.Info.ApiPort > 0) + { + LoggerHelper.Instance.Info($"start client api server"); + IApiServer server = serviceProvider.GetService(); + server.Websocket(apiStore.Info.ApiPort, apiStore.Info.ApiPassword); + LoggerHelper.Instance.Warning($"client api listen:{apiStore.Info.ApiPort}"); + LoggerHelper.Instance.Warning($"client api password:{apiStore.Info.ApiPassword}"); + } + + if (apiStore.Info.WebPort > 0) + { + IWebServer webServer = serviceProvider.GetService(); + webServer.Start(apiStore.Info.WebPort, apiStore.Info.WebRoot); + LoggerHelper.Instance.Warning($"client web listen:{apiStore.Info.WebPort}"); + } + return serviceProvider; + } + } +} diff --git a/linker.messenger.api/IApiController.cs b/linker.messenger.api/IApiController.cs new file mode 100644 index 00000000..26753f0f --- /dev/null +++ b/linker.messenger.api/IApiController.cs @@ -0,0 +1,10 @@ +using linker.libs.api; + +namespace linker.messenger.api +{ + public interface IApiServer : libs.api.IApiServer + { + public void AddPlugins(List list); + } + +} diff --git a/linker/plugins/capi/config/Config.cs b/linker.messenger.api/IApiStore.cs similarity index 66% rename from linker/plugins/capi/config/Config.cs rename to linker.messenger.api/IApiStore.cs index 0a418d46..d2b80390 100644 --- a/linker/plugins/capi/config/Config.cs +++ b/linker.messenger.api/IApiStore.cs @@ -1,16 +1,7 @@ using linker.libs; - -namespace linker.config +namespace linker.messenger.api { - public partial class ConfigClientInfo - { - /// - /// 客户端管理接口配置 - /// - public CApiConfigClientInfo CApi { get; set; } = new CApiConfigClientInfo(); - } - - public sealed class CApiConfigClientInfo + public sealed class ApiClientInfo { /// /// 管理接口端口 @@ -30,4 +21,9 @@ namespace linker.config /// public string WebRoot { get; set; } = "./web/"; } + + public interface IApiStore + { + public ApiClientInfo Info { get; } + } } diff --git a/linker.messenger.api/WebServer.cs b/linker.messenger.api/WebServer.cs new file mode 100644 index 00000000..41cc4aca --- /dev/null +++ b/linker.messenger.api/WebServer.cs @@ -0,0 +1,12 @@ +using linker.libs.web; + +namespace linker.messenger.api +{ + /// + /// 本地web管理端服务器 + /// + public sealed class WebServer : libs.web.WebServer, IWebServer + { + } + +} diff --git a/linker.messenger.api/linker.messenger.api.csproj b/linker.messenger.api/linker.messenger.api.csproj new file mode 100644 index 00000000..9050e774 --- /dev/null +++ b/linker.messenger.api/linker.messenger.api.csproj @@ -0,0 +1,39 @@ + + + + + net8.0 + enable + disable + true + false + true + True + linker messenger api + snltty + snltty + linker messenger api + snltty + https://github.com/snltty/linker + https://github.com/snltty/linker + linker messenger api + 1.6.4 + 1.6.4 + 1.6.4 + + + + full + true + + + none + false + True + + + + + + + diff --git a/linker/plugins/tunnel/TunnelBase.cs b/linker.messenger.channel/Channel.cs similarity index 85% rename from linker/plugins/tunnel/TunnelBase.cs rename to linker.messenger.channel/Channel.cs index 910209cd..db197a88 100644 --- a/linker/plugins/tunnel/TunnelBase.cs +++ b/linker.messenger.channel/Channel.cs @@ -1,16 +1,15 @@ using linker.libs; using linker.libs.extends; -using linker.plugins.client; using linker.tunnel; using linker.tunnel.connection; using System.Collections.Concurrent; -using linker.plugins.relay.client; -using linker.plugins.pcp; using linker.messenger.relay.client; +using linker.messenger.pcp; +using linker.messenger.signin; -namespace linker.plugins.tunnel +namespace linker.messenger.channel { - public class TunnelBase + public class Channel { public VersionManager Version { get; } = new VersionManager(); protected virtual string TransactionId { get; } @@ -19,20 +18,18 @@ namespace linker.plugins.tunnel private readonly TunnelTransfer tunnelTransfer; private readonly RelayClientTransfer relayTransfer; private readonly PcpTransfer pcpTransfer; - private readonly ClientSignInTransfer clientSignInTransfer; - private readonly ClientSignInState clientSignInState; - private readonly ClientConfigTransfer clientConfigTransfer; - private readonly RelayClientConfigTransfer relayClientConfigTransfer; + private readonly SignInClientTransfer signInClientTransfer; + private readonly ISignInClientStore signInClientStore; + private readonly IRelayClientStore relayClientStore; - public TunnelBase(TunnelTransfer tunnelTransfer, RelayClientTransfer relayTransfer, PcpTransfer pcpTransfer, ClientSignInTransfer clientSignInTransfer, ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer, RelayClientConfigTransfer relayClientConfigTransfer) + public Channel(TunnelTransfer tunnelTransfer, RelayClientTransfer relayTransfer, PcpTransfer pcpTransfer, SignInClientTransfer signInClientTransfer, ISignInClientStore signInClientStore, IRelayClientStore relayClientStore) { this.tunnelTransfer = tunnelTransfer; this.relayTransfer = relayTransfer; this.pcpTransfer = pcpTransfer; - this.clientSignInTransfer = clientSignInTransfer; - this.clientSignInState = clientSignInState; - this.clientConfigTransfer = clientConfigTransfer; - this.relayClientConfigTransfer = relayClientConfigTransfer; + this.signInClientTransfer = signInClientTransfer; + this.signInClientStore = signInClientStore; + this.relayClientStore = relayClientStore; //监听打洞成功 tunnelTransfer.SetConnectedCallback(TransactionId, OnConnected); @@ -40,7 +37,7 @@ namespace linker.plugins.tunnel relayTransfer.SetConnectedCallback(TransactionId, OnConnected); //监听节点中继成功回调 pcpTransfer.SetConnectedCallback(TransactionId, OnConnected); - + } protected virtual void Connected(ITunnelConnection connection) { @@ -76,7 +73,7 @@ namespace linker.plugins.tunnel } protected async ValueTask ConnectTunnel(string machineId, TunnelProtocolType denyProtocols) { - if (clientConfigTransfer.Id == machineId) + if (signInClientStore.Id == machineId) { return null; } @@ -99,7 +96,7 @@ namespace linker.plugins.tunnel return connection; } //不在线就不必连了 - if (await clientSignInTransfer.GetOnline(machineId) == false) + if (await signInClientTransfer.GetOnline(machineId) == false) { return null; } @@ -126,7 +123,7 @@ namespace linker.plugins.tunnel { //中继 if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"{TransactionId} relay to {machineId}"); - ITunnelConnection connection = await relayTransfer.ConnectAsync(clientConfigTransfer.Id, machineId, TransactionId, relayClientConfigTransfer.DefaultNodeId).ConfigureAwait(false); + ITunnelConnection connection = await relayTransfer.ConnectAsync(signInClientStore.Id, machineId, TransactionId, relayClientStore.DefaultNodeId).ConfigureAwait(false); if (connection != null) { if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"{TransactionId} relay success,{connection.ToString()}"); diff --git a/linker.messenger.channel/linker.messenger.channel.csproj b/linker.messenger.channel/linker.messenger.channel.csproj new file mode 100644 index 00000000..35803e25 --- /dev/null +++ b/linker.messenger.channel/linker.messenger.channel.csproj @@ -0,0 +1,42 @@ + + + + net8.0 + enable + disable + true + false + true + True + linker messenger channel + snltty + snltty + linker messenger channel + snltty + https://github.com/snltty/linker + https://github.com/snltty/linker + linker messenger channel + 1.6.4 + 1.6.4 + 1.6.4 + + + + full + true + + + none + false + True + + + + + + + + + + + diff --git a/linker/plugins/decenter/DecenterTransfer.cs b/linker.messenger.decenter/DecenterClientTransfer.cs similarity index 69% rename from linker/plugins/decenter/DecenterTransfer.cs rename to linker.messenger.decenter/DecenterClientTransfer.cs index d6a5bd49..7434da27 100644 --- a/linker/plugins/decenter/DecenterTransfer.cs +++ b/linker.messenger.decenter/DecenterClientTransfer.cs @@ -1,14 +1,8 @@ -using linker.plugins.client; -using linker.plugins.messenger; -using MemoryPack; -using linker.libs; -using linker.plugins.decenter.messenger; -using linker.messenger; +using linker.libs; +using linker.messenger.signin; -namespace linker.plugins.decenter +namespace linker.messenger.decenter { - - [MemoryPackable] public sealed partial class DecenterSyncInfo { public DecenterSyncInfo() { } @@ -16,22 +10,24 @@ namespace linker.plugins.decenter public Memory Data { get; set; } } - public sealed class DecenterTransfer + public sealed class DecenterClientTransfer { private List syncs = new List(); private readonly IMessengerSender messengerSender; - private readonly ClientSignInState clientSignInState; - public DecenterTransfer(IMessengerSender messengerSender, ClientSignInState clientSignInState) + private readonly SignInClientState signInClientState; + private readonly ISerializer serializer; + public DecenterClientTransfer(IMessengerSender messengerSender, SignInClientState signInClientState, ISerializer serializer) { this.messengerSender = messengerSender; - this.clientSignInState = clientSignInState; + this.signInClientState = signInClientState; + this.serializer = serializer; SyncTask(); } - public void LoadDecenters(List list) + public void AddDecenters(List list) { - syncs = list; + syncs = syncs.Concat(list).Distinct().ToList(); } public Memory Sync(DecenterSyncInfo decenterSyncInfo) @@ -59,9 +55,9 @@ namespace linker.plugins.decenter Time = Environment.TickCount64, Task = messengerSender.SendReply(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)DecenterMessengerIds.SyncForward, - Payload = MemoryPackSerializer.Serialize(new DecenterSyncInfo { Name = c.Name, Data = c.GetData() }), + Payload = serializer.Serialize(new DecenterSyncInfo { Name = c.Name, Data = c.GetData() }), Timeout = 15000 }) }; @@ -71,7 +67,7 @@ namespace linker.plugins.decenter { if (task.Task.Result.Code == MessageResponeCodes.OK) { - List> list = MemoryPackSerializer.Deserialize>>(task.Task.Result.Data.Span); + List> list = serializer.Deserialize>>(task.Task.Result.Data.Span); task.Decenter.SetData(list); } else @@ -81,12 +77,6 @@ namespace linker.plugins.decenter LoggerHelper.Instance.Error($"decenter {task.Decenter.Name}->{task.Task.Result.Code}"); } } - /* - if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) - { - LoggerHelper.Instance.Debug($"decenter {task.Decenter.Name}->{Environment.TickCount64 - task.Time}ms"); - } - */ } } catch (Exception ex) diff --git a/linker.messenger.decenter/Entry.cs b/linker.messenger.decenter/Entry.cs new file mode 100644 index 00000000..d213e07a --- /dev/null +++ b/linker.messenger.decenter/Entry.cs @@ -0,0 +1,39 @@ +using Microsoft.Extensions.DependencyInjection; +namespace linker.messenger.decenter +{ + public static class Entry + { + public static ServiceCollection AddDecenterClient(this ServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + + return serviceCollection; + } + public static ServiceProvider UseDecenterClient(this ServiceProvider serviceProvider) + { + DecenterClientTransfer decenterClientTransfer = serviceProvider.GetService(); + + IMessengerResolver messengerResolver = serviceProvider.GetService(); + messengerResolver.AddMessenger(new List { serviceProvider.GetService() }); + + return serviceProvider; + } + + + public static ServiceCollection AddDecenterServer(this ServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + + return serviceCollection; + } + public static ServiceProvider UseDecenterServer(this ServiceProvider serviceProvider) + { + IMessengerResolver messengerResolver = serviceProvider.GetService(); + messengerResolver.AddMessenger(new List { serviceProvider.GetService() }); + + return serviceProvider; + } + } +} diff --git a/linker/plugins/decenter/IDecenter.cs b/linker.messenger.decenter/IDecenter.cs similarity index 96% rename from linker/plugins/decenter/IDecenter.cs rename to linker.messenger.decenter/IDecenter.cs index cf9a61ac..60a4ea4b 100644 --- a/linker/plugins/decenter/IDecenter.cs +++ b/linker.messenger.decenter/IDecenter.cs @@ -1,6 +1,6 @@ using linker.libs; -namespace linker.plugins.decenter +namespace linker.messenger.decenter { public interface IDecenter { diff --git a/linker.messenger.decenter/linker.messenger.decenter.csproj b/linker.messenger.decenter/linker.messenger.decenter.csproj new file mode 100644 index 00000000..b7ba5d52 --- /dev/null +++ b/linker.messenger.decenter/linker.messenger.decenter.csproj @@ -0,0 +1,39 @@ + + + + net8.0 + enable + disable + true + false + true + True + linker messenger decenter + snltty + snltty + linker messenger decenter + snltty + https://github.com/snltty/linker + https://github.com/snltty/linker + linker messenger decenter + 1.6.4 + 1.6.4 + 1.6.4 + + + + full + true + + + none + false + True + + + + + + + + diff --git a/linker/plugins/decenter/messenger/DecenterMessenger.cs b/linker.messenger.decenter/messenger/DecenterMessenger.cs similarity index 75% rename from linker/plugins/decenter/messenger/DecenterMessenger.cs rename to linker.messenger.decenter/messenger/DecenterMessenger.cs index 7392ca04..1066719d 100644 --- a/linker/plugins/decenter/messenger/DecenterMessenger.cs +++ b/linker.messenger.decenter/messenger/DecenterMessenger.cs @@ -1,26 +1,26 @@ using linker.libs; -using linker.messenger; using linker.messenger.signin; -using MemoryPack; -namespace linker.plugins.decenter.messenger +namespace linker.messenger.decenter { public sealed class DecenterServerMessenger : IMessenger { private readonly IMessengerSender sender; - private readonly SignCaching signCaching; + private readonly SignInServerCaching signCaching; + private readonly ISerializer serializer; - public DecenterServerMessenger(IMessengerSender sender, SignCaching signCaching) + public DecenterServerMessenger(IMessengerSender sender, SignInServerCaching signCaching, ISerializer serializer) { this.sender = sender; this.signCaching = signCaching; + this.serializer = serializer; } [MessengerId((ushort)DecenterMessengerIds.SyncForward)] public void SyncForward(IConnection connection) { - DecenterSyncInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + DecenterSyncInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (signCaching.TryGet(connection.Id, out SignCacheInfo cache)) { uint requiestid = connection.ReceiveRequestWrap.RequestId; @@ -47,7 +47,7 @@ namespace linker.plugins.decenter.messenger { RequestId = requiestid, Connection = connection, - Payload = MemoryPackSerializer.Serialize(results) + Payload = serializer.Serialize(results) }, (ushort)DecenterMessengerIds.SyncForward).ConfigureAwait(false); } @@ -62,17 +62,19 @@ namespace linker.plugins.decenter.messenger public sealed class DecenterClientMessenger : IMessenger { - private readonly DecenterTransfer syncTreansfer; + private readonly DecenterClientTransfer syncTreansfer; + private readonly ISerializer serializer; - public DecenterClientMessenger(DecenterTransfer syncTreansfer) + public DecenterClientMessenger(DecenterClientTransfer syncTreansfer, ISerializer serializer) { this.syncTreansfer = syncTreansfer; + this.serializer = serializer; } [MessengerId((ushort)DecenterMessengerIds.Sync)] public void Sync(IConnection connection) { - DecenterSyncInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + DecenterSyncInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); connection.Write(syncTreansfer.Sync(info)); } diff --git a/linker/plugins/decenter/messenger/DecenterMessengerIds.cs b/linker.messenger.decenter/messenger/DecenterMessengerIds.cs similarity index 76% rename from linker/plugins/decenter/messenger/DecenterMessengerIds.cs rename to linker.messenger.decenter/messenger/DecenterMessengerIds.cs index dd8ffb5b..0e338a63 100644 --- a/linker/plugins/decenter/messenger/DecenterMessengerIds.cs +++ b/linker.messenger.decenter/messenger/DecenterMessengerIds.cs @@ -1,4 +1,4 @@ -namespace linker.plugins.decenter.messenger +namespace linker.messenger.decenter { public enum DecenterMessengerIds : ushort { diff --git a/linker.messenger.entry/linker.messenger.entry.csproj b/linker.messenger.entry/linker.messenger.entry.csproj new file mode 100644 index 00000000..5f73c79d --- /dev/null +++ b/linker.messenger.entry/linker.messenger.entry.csproj @@ -0,0 +1,33 @@ + + + + net8.0 + enable + disable + true + false + true + True + linker messenger entry + snltty + snltty + linker messenger entry + snltty + https://github.com/snltty/linker + https://github.com/snltty/linker + linker messenger entry + 1.6.4 + 1.6.4 + 1.6.4 + + + + full + true + + + none + false + True + + diff --git a/linker.messenger.example/Program.cs b/linker.messenger.example/Program.cs index a9268b08..0bd0e852 100644 --- a/linker.messenger.example/Program.cs +++ b/linker.messenger.example/Program.cs @@ -7,6 +7,7 @@ using linker.messenger.relay.server; using linker.messenger.relay.server.caching; using linker.messenger.relay.server.validator; using linker.messenger.signin; +using linker.messenger.signin.args; using linker.messenger.tunnel; using linker.plugins.tunnel; using linker.tunnel; @@ -26,9 +27,11 @@ namespace linker.messenger.example Certificate = new X509Certificate2("./snltty.pfx", "oeq9tw1o"), TunnelTransports = new List { - new TunnelTransportItemInfo{ BufferSize=3, Disabled=false, DisableReverse=false, DisableSSL=false, Name="udp", Order=0, ProtocolType= TunnelProtocolType.Udp.ToString(), Reverse=true, SSL=true }, - new TunnelTransportItemInfo{ BufferSize=3, Disabled=false, DisableReverse=false, DisableSSL=false, Name="TcpP2PNAT", Order=1, ProtocolType= TunnelProtocolType.Tcp.ToString(), Reverse=true, SSL=true }, - new TunnelTransportItemInfo{ BufferSize=3, Disabled=false, DisableReverse=false, DisableSSL=false, Name="TcpNutssb", Order=2, ProtocolType= TunnelProtocolType.Tcp.ToString(), Reverse=true, SSL=true }, + new TunnelTransportItemInfo{ BufferSize=3, Disabled=false, DisableReverse=false, DisableSSL=false, Name="udp", Order=1, ProtocolType= TunnelProtocolType.Udp.ToString(), Reverse=true, SSL=true }, + // new TunnelTransportItemInfo{ BufferSize=3, Disabled=false, DisableReverse=false, DisableSSL=false, Name="UdpPortMap", Order=2, ProtocolType= TunnelProtocolType.Udp.ToString(), Reverse=true, SSL=true }, + new TunnelTransportItemInfo{ BufferSize=3, Disabled=false, DisableReverse=false, DisableSSL=false, Name="TcpP2PNAT", Order=3, ProtocolType= TunnelProtocolType.Tcp.ToString(), Reverse=true, SSL=true }, + // new TunnelTransportItemInfo{ BufferSize=3, Disabled=false, DisableReverse=false, DisableSSL=false, Name="TransportUdpPortMap", Order=4, ProtocolType= TunnelProtocolType.Tcp.ToString(), Reverse=true, SSL=true }, + // new TunnelTransportItemInfo{ BufferSize=3, Disabled=false, DisableReverse=false, DisableSSL=false, Name="TcpPortMap", Order=5, ProtocolType= TunnelProtocolType.Tcp.ToString(), Reverse=true, SSL=true }, } }; @@ -75,9 +78,9 @@ namespace linker.messenger.example IMessengerResolver messengerResolver = new MessengerResolver(messengerSender); //打洞相关 - TunnelExcludeIPTransfer tunnelExcludeIPTransfer = new TunnelExcludeIPTransfer(); + TunnelClientExcludeIPTransfer tunnelExcludeIPTransfer = new TunnelClientExcludeIPTransfer(); //tunnelExcludeIPTransfer.LoadTunnelExcludeIPs(new List()); - TunnelMessengerAdapter tunnelMessengerAdapter = new TunnelMessengerAdapter(messengerSender, tunnelExcludeIPTransfer, serializer, new TunnelMessengerAdapterStore()); + TunnelClientMessengerAdapter tunnelMessengerAdapter = new TunnelClientMessengerAdapter(messengerSender, tunnelExcludeIPTransfer, serializer, new TunnelMessengerAdapterStore()); TunnelTransfer tunnelTransfer = new TunnelTransfer(tunnelMessengerAdapter); tunnelTransfer.SetConnectedCallback("default", (connection) => { @@ -98,13 +101,21 @@ namespace linker.messenger.example RelayClientMessenger relayClientMessenger = new RelayClientMessenger(relayClientTransfer, serializer); //加载这些信标处理器 - messengerResolver.LoadMessenger(new List + messengerResolver.AddMessenger(new List { tunnelClientMessenger, relayClientMessenger }); + //加载登录参数 + SignInArgsTransfer signInArgsTransfer = new SignInArgsTransfer(); + signInArgsTransfer.AddArgs(new List { + new MySignInArgs() + }); + Dictionary argsDic = new Dictionary(); + await signInArgsTransfer.Invoke(string.Empty, argsDic); + Console.WriteLine($"输入服务端ip端口:"); publicConfigInfo.Host = Console.ReadLine(); @@ -113,7 +124,7 @@ namespace linker.messenger.example Socket socket = new Socket(server.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp); socket.KeepAlive(); await socket.ConnectAsync(server).WaitAsync(TimeSpan.FromMilliseconds(5000)).ConfigureAwait(false); - publicConfigInfo.SignConnection = await messengerResolver.BeginReceiveClient(socket, true, 1).ConfigureAwait(false); + publicConfigInfo.SignConnection = await messengerResolver.BeginReceiveClient(socket, true, (byte)ResolverType.Messenger).ConfigureAwait(false); Console.WriteLine($"开始登录"); MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap @@ -126,7 +137,7 @@ namespace linker.messenger.example MachineName = Dns.GetHostName(), MachineId = string.Empty, Version = VersionHelper.version, - Args = new Dictionary(), + Args = argsDic, GroupId = "default" }) }).ConfigureAwait(false); @@ -180,12 +191,16 @@ namespace linker.messenger.example { case "1": { + Console.WriteLine($"正在打洞......."); tunnelConnection = await tunnelTransfer.ConnectAsync(id, "default", TunnelProtocolType.None); + Console.WriteLine($"打洞==》{(tunnelConnection == null ? "失败" : "成功")}"); } break; case "2": { + Console.WriteLine($"正在中继......."); tunnelConnection = await relayClientTransfer.ConnectAsync(publicConfigInfo.SignConnection.Id, id, "default"); + Console.WriteLine($"中继==》{(tunnelConnection == null ? "失败" : "成功")}"); } break; default: @@ -196,6 +211,7 @@ namespace linker.messenger.example for (int i = 0; i < 10; i++) { string msg = $"hello {i}"; + Console.WriteLine($"发送:{msg}"); var msgBytes = msg.ToBytes(); //首部4字节存长度,剩下的才是真实数据 @@ -221,16 +237,19 @@ namespace linker.messenger.example IMessengerSender messengerSender = new MessengerSender(); IMessengerResolver messengerResolver = new MessengerResolver(messengerSender); messengerResolver.Initialize(publicConfigInfo.Certificate); + MessengerResolverResolver messengerResolverResolver = new MessengerResolverResolver(messengerResolver); //登录相关 SignInArgsTransfer signInArgsTransfer = new SignInArgsTransfer(); - //signInArgsTransfer.LoadArgs(new List()); - ISignInStore signInStore = new SignInStore(); - SignCaching signCaching = new SignCaching(signInStore, signInArgsTransfer); + signInArgsTransfer.AddArgs(new List { + new MySignInArgs() + }); + ISignInServerStore signInStore = new SignInStore(); + SignInServerCaching signCaching = new SignInServerCaching(signInStore, signInArgsTransfer); SignInServerMessenger signInServerMessenger = new SignInServerMessenger(messengerSender, signCaching, serializer); //打洞相关 - TunnelExternalResolver tunnelExternalResolver = new TunnelExternalResolver(); + TunnelServerExternalResolver tunnelExternalResolver = new TunnelServerExternalResolver(); TunnelServerMessenger tunnelServerMessenger = new TunnelServerMessenger(messengerSender, signCaching, serializer); //中继相关 @@ -246,14 +265,24 @@ namespace linker.messenger.example //relayServerValidatorTransfer.LoadValidators(new List { }); RelayServerMessenger relayServerMessenger = new RelayServerMessenger(messengerSender, signCaching, serializer, relayServerMasterTransfer, relayServerValidatorTransfer); - //加载这些信标处理器 - messengerResolver.LoadMessenger(new List + //加载信标处理器 + messengerResolver.AddMessenger(new List { signInServerMessenger, tunnelServerMessenger, relayServerMessenger }); + + //加载消息分发器 + ResolverTransfer resolverTransfer = new ResolverTransfer(); + resolverTransfer.AddResolvers(new List { + messengerResolverResolver, + tunnelExternalResolver, + relayServerReportResolver, + relayServerResolver + }); + //TCP var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Bind(new IPEndPoint(IPAddress.Any, publicConfigInfo.Port)); @@ -263,38 +292,7 @@ namespace linker.messenger.example while (true) { var client = await socket.AcceptAsync(); - TimerHelper.Async(async () => - { - try - { - var bytes = new byte[1024]; - int length = await client.ReceiveAsync(bytes.AsMemory(0, 1)); - //外网端口 - if (bytes[0] == 0) - { - await tunnelExternalResolver.Resolve(client, Helper.EmptyArray); - } - //信标 - else if (bytes[0] == 1) - { - await messengerResolver.BeginReceiveServer(client, Helper.EmptyArray); - } - //中继 - else if (bytes[0] == 2) - { - await relayServerResolver.Resolve(client, Helper.EmptyArray); - } - //中继节点报告 - else if (bytes[0] == 3) - { - await relayServerReportResolver.Resolve(client, Helper.EmptyArray); - } - } - catch (Exception ex) - { - LoggerHelper.Instance.Error(ex); - } - }); + _ = resolverTransfer.BeginReceive(client); } }); @@ -312,23 +310,7 @@ namespace linker.messenger.example { SocketReceiveFromResult result = await socketUdp.ReceiveFromAsync(buffer, SocketFlags.None, endPoint).ConfigureAwait(false); IPEndPoint ep = result.RemoteEndPoint as IPEndPoint; - try - { - //外网端口 - if (buffer[0] == 0) - { - await tunnelExternalResolver.Resolve(socketUdp, ep, buffer.AsMemory(1, result.ReceivedBytes - 1)); - } - //中继节点报告 - else if (buffer[0] == 3) - { - await relayServerReportResolver.Resolve(socketUdp, ep, buffer.AsMemory(1, result.ReceivedBytes - 1)); - } - } - catch (Exception ex) - { - LoggerHelper.Instance.Error(ex); - } + _ = resolverTransfer.BeginReceive(socketUdp, ep, buffer.AsMemory(0, result.ReceivedBytes)); } catch (Exception ex) { @@ -368,6 +350,54 @@ namespace linker.messenger.example } } + public sealed class MyRelayServerValidator : IRelayServerValidator + { + /// + /// 验证,服务端会调用 + /// + /// 中继参数 + /// 来源客户端 + /// 目标客户端 + /// + public async Task Validate(RelayInfo relayInfo, SignCacheInfo fromMachine, SignCacheInfo toMachine) + { + //返回空字符串,表示成功,不空为错误信息则登录失败 + return await Task.FromResult(string.Empty); + } + } + + public sealed class MySignInArgs : ISignInArgs + { + /// + /// 客户端调用 + /// + /// + /// + /// + public async Task Invoke(string host, Dictionary args) + { + //在这里加入你喜欢的数据 + + //返回空字符串,表示成功,不空为错误信息 + return await Task.FromResult(string.Empty); + } + + /// + /// 服务端调用 + /// + /// 本次登录的信息 + /// 如果以前登录过就有信息,否则MachineId为空 + /// + /// + public async Task Validate(SignInfo signInfo, SignCacheInfo cache) + { + //在这里进行你的验证 + + //返回空字符串,表示成功,不空为错误信息则登录失败 + return await Task.FromResult(string.Empty); + } + } + public sealed class PublicConfigInfo { public IConnection SignConnection { get; set; } @@ -383,8 +413,6 @@ namespace linker.messenger.example /// public sealed class RelayClientStore : IRelayClientStore { - public byte Flag => 2; - public X509Certificate2 Certificate => Program.publicConfigInfo.Certificate; public IConnection SigninConnection => Program.publicConfigInfo.SignConnection; @@ -403,8 +431,6 @@ namespace linker.messenger.example /// public sealed class RelayServerNodeStore : IRelayServerNodeStore { - public byte Flag => 3; - public int ServicePort => Program.publicConfigInfo.Port; public RelayServerNodeInfo Node => new RelayServerNodeInfo { }; @@ -432,7 +458,7 @@ namespace linker.messenger.example /// /// 自定义打洞的存储库 /// - public sealed class TunnelMessengerAdapterStore : ITunnelMessengerAdapterStore + public sealed class TunnelMessengerAdapterStore : ITunnelClientStore { public IConnection SignConnection => Program.publicConfigInfo.SignConnection; public X509Certificate2 Certificate => Program.publicConfigInfo.Certificate; @@ -473,7 +499,7 @@ namespace linker.messenger.example /// /// 自定义登录持久化存储 /// - public sealed class SignInStore : ISignInStore + public sealed class SignInStore : ISignInServerStore { public void Confirm() { diff --git a/linker.messenger.exroute/Entry.cs b/linker.messenger.exroute/Entry.cs new file mode 100644 index 00000000..a2b9965f --- /dev/null +++ b/linker.messenger.exroute/Entry.cs @@ -0,0 +1,18 @@ +using Microsoft.Extensions.DependencyInjection; +namespace linker.messenger.exroute +{ + public static class Entry + { + public static ServiceCollection AddExRoute(this ServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + + return serviceCollection; + } + public static ServiceProvider UseExRoute(this ServiceProvider serviceProvider) + { + ExRouteTransfer exRouteTransfer = serviceProvider.GetService(); + return serviceProvider; + } + } +} diff --git a/linker.messenger.exroute/ExRouteTransfer.cs b/linker.messenger.exroute/ExRouteTransfer.cs new file mode 100644 index 00000000..93791bd1 --- /dev/null +++ b/linker.messenger.exroute/ExRouteTransfer.cs @@ -0,0 +1,29 @@ +using System.Net; + +namespace linker.messenger.exroute +{ + public sealed partial class ExRouteTransfer + { + private List excludes = new List(); + + public ExRouteTransfer() + { + } + + public void AddExRoutes(List list) + { + excludes = excludes.Concat(list).Distinct().ToList(); + + } + + public List Get() + { + List result = new List(); + foreach (var item in excludes) + { + result.AddRange(item.Get()); + } + return result; + } + } +} diff --git a/linker/plugins/route/IRouteExcludeIP.cs b/linker.messenger.exroute/IExRoute.cs similarity index 52% rename from linker/plugins/route/IRouteExcludeIP.cs rename to linker.messenger.exroute/IExRoute.cs index ed874c93..9fd538be 100644 --- a/linker/plugins/route/IRouteExcludeIP.cs +++ b/linker.messenger.exroute/IExRoute.cs @@ -1,8 +1,8 @@ using System.Net; -namespace linker.plugins.route +namespace linker.messenger.exroute { - public interface IRouteExcludeIP + public interface IExRoute { public List Get(); } diff --git a/linker.messenger.exroute/linker.messenger.exroute.csproj b/linker.messenger.exroute/linker.messenger.exroute.csproj new file mode 100644 index 00000000..e0b10375 --- /dev/null +++ b/linker.messenger.exroute/linker.messenger.exroute.csproj @@ -0,0 +1,37 @@ + + + + net8.0 + enable + disable + true + false + true + True + linker messenger exroute + snltty + snltty + linker messenger exroute + snltty + https://github.com/snltty/linker + https://github.com/snltty/linker + linker messenger exroute + 1.6.4 + 1.6.4 + 1.6.4 + + + + full + true + + + none + false + True + + + + + + diff --git a/linker.messenger.listen/Entry.cs b/linker.messenger.listen/Entry.cs new file mode 100644 index 00000000..3f925582 --- /dev/null +++ b/linker.messenger.listen/Entry.cs @@ -0,0 +1,32 @@ +using linker.libs; +using Microsoft.Extensions.DependencyInjection; +using System.Security.Cryptography.X509Certificates; +namespace linker.messenger.listen +{ + public static class Entry + { + public static ServiceCollection AddListen(this ServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + return serviceCollection; + } + public static ServiceProvider UseListen(this ServiceProvider serviceProvider, X509Certificate2 certificate) + { + TcpServer tcpServer = serviceProvider.GetService(); + IListenStore listenStore = serviceProvider.GetService(); + + LoggerHelper.Instance.Info($"start server"); + try + { + tcpServer.Start(listenStore.Port); + } + catch (Exception ex) + { + LoggerHelper.Instance.Error(ex); + } + LoggerHelper.Instance.Warning($"server listen:{listenStore.Port}"); + + return serviceProvider; + } + } +} diff --git a/linker.messenger.listen/IListenStore.cs b/linker.messenger.listen/IListenStore.cs new file mode 100644 index 00000000..84723d6d --- /dev/null +++ b/linker.messenger.listen/IListenStore.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace linker.messenger.listen +{ + public interface IListenStore + { + public int Port { get; } + } +} diff --git a/linker/plugins/server/TcpServer.cs b/linker.messenger.listen/TcpServer.cs similarity index 98% rename from linker/plugins/server/TcpServer.cs rename to linker.messenger.listen/TcpServer.cs index fda74b38..73943f21 100644 --- a/linker/plugins/server/TcpServer.cs +++ b/linker.messenger.listen/TcpServer.cs @@ -1,9 +1,8 @@ using linker.libs.extends; -using linker.plugins.resolver; using System.Net; using System.Net.Sockets; -namespace linker.plugins.server +namespace linker.messenger.listen { public sealed class TcpServer { diff --git a/linker.messenger.listen/linker.messenger.listen.csproj b/linker.messenger.listen/linker.messenger.listen.csproj new file mode 100644 index 00000000..2353da70 --- /dev/null +++ b/linker.messenger.listen/linker.messenger.listen.csproj @@ -0,0 +1,38 @@ + + + + + net8.0 + enable + disable + true + false + true + True + linker messenger listen + snltty + snltty + linker messenger listen + snltty + https://github.com/snltty/linker + https://github.com/snltty/linker + linker messenger listen + 1.6.4 + 1.6.4 + 1.6.4 + + + + full + true + + + none + false + True + + + + + + diff --git a/linker.messenger.pcp/Entry.cs b/linker.messenger.pcp/Entry.cs new file mode 100644 index 00000000..3bae3047 --- /dev/null +++ b/linker.messenger.pcp/Entry.cs @@ -0,0 +1,33 @@ +using Microsoft.Extensions.DependencyInjection; +namespace linker.messenger.pcp +{ + public static class Entry + { + public static ServiceCollection AddRelayClient(this ServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + return serviceCollection; + } + public static ServiceProvider UseRelayClient(this ServiceProvider serviceProvider) + { + IMessengerResolver messengerResolver = serviceProvider.GetService(); + messengerResolver.AddMessenger(new List { serviceProvider.GetService() }); + return serviceProvider; + } + + + public static ServiceCollection AddRelayServer(this ServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + return serviceCollection; + } + public static ServiceProvider UseRelayServer(this ServiceProvider serviceProvider) + { + IMessengerResolver messengerResolver = serviceProvider.GetService(); + messengerResolver.AddMessenger(new List { serviceProvider.GetService() }); + + return serviceProvider; + } + } +} diff --git a/linker.messenger.pcp/IPcpStore.cs b/linker.messenger.pcp/IPcpStore.cs new file mode 100644 index 00000000..8fbb94ec --- /dev/null +++ b/linker.messenger.pcp/IPcpStore.cs @@ -0,0 +1,17 @@ +using linker.tunnel.connection; + +namespace linker.messenger.pcp +{ + public sealed class PcpHistoryInfo + { + public PcpHistoryInfo() { } + + public List History { get; set; } = new List(); + } + + public interface IPcpStore + { + public PcpHistoryInfo PcpHistory { get; } + public void AddHistory(ITunnelConnection connection); + } +} diff --git a/linker.messenger.pcp/PcpDecenter.cs b/linker.messenger.pcp/PcpDecenter.cs new file mode 100644 index 00000000..34714c8b --- /dev/null +++ b/linker.messenger.pcp/PcpDecenter.cs @@ -0,0 +1,65 @@ +using linker.libs; +using linker.messenger.decenter; +using linker.messenger.signin; +using System.Collections.Concurrent; + +namespace linker.messenger.pcp +{ + public sealed class PcpDecenter : IDecenter + { + public string Name => "pcp"; + public VersionManager SyncVersion { get; } = new VersionManager(); + public VersionManager DataVersion { get; } = new VersionManager(); + + private ConcurrentDictionary> history = new ConcurrentDictionary>(); + private readonly SignInClientState signInClientState; + private readonly ISignInClientStore signInClientStore; + private readonly IPcpStore pcpStore; + private readonly ISerializer serializer; + public PcpDecenter( SignInClientState signInClientState, ISignInClientStore signInClientStore, IPcpStore pcpStore, ISerializer serializer) + { + this.signInClientState = signInClientState; + this.signInClientStore = signInClientStore; + this.pcpStore = pcpStore; + this.serializer = serializer; + + signInClientState.NetworkEnabledHandle += (times) => SyncVersion.Add(); + } + + public List GetNodes(string fromMachineId, string toMachineId) + { + if (history.TryGetValue(fromMachineId, out List from) && history.TryGetValue(toMachineId, out List to)) + { + + } + return new List(); + } + + public Memory GetData() + { + HistoryDecenterInfo historyDecenterInfo = new HistoryDecenterInfo { MachineId = signInClientStore.Id, List = pcpStore.PcpHistory.History }; + history.AddOrUpdate(historyDecenterInfo.MachineId, historyDecenterInfo.List, (a, b) => historyDecenterInfo.List); + return serializer.Serialize(historyDecenterInfo); + } + public void SetData(Memory data) + { + HistoryDecenterInfo historyDecenterInfo = serializer.Deserialize(data.Span); + history.AddOrUpdate(historyDecenterInfo.MachineId, historyDecenterInfo.List, (a, b) => historyDecenterInfo.List); + } + public void SetData(List> data) + { + List list = data.Select(c => serializer.Deserialize(c.Span)).ToList(); + foreach (var historyDecenterInfo in list) + { + history.AddOrUpdate(historyDecenterInfo.MachineId, historyDecenterInfo.List, (a, b) => historyDecenterInfo.List); + } + } + + } + + public sealed partial class HistoryDecenterInfo + { + public string MachineId { get; set; } + public List List { get; set; } + } +} diff --git a/linker/plugins/pcp/messenger/PcpMessenger.cs b/linker.messenger.pcp/PcpMessenger.cs similarity index 80% rename from linker/plugins/pcp/messenger/PcpMessenger.cs rename to linker.messenger.pcp/PcpMessenger.cs index 8f188cfb..e583966c 100644 --- a/linker/plugins/pcp/messenger/PcpMessenger.cs +++ b/linker.messenger.pcp/PcpMessenger.cs @@ -1,11 +1,9 @@ using linker.tunnel; using linker.tunnel.transport; using linker.libs; -using MemoryPack; -using linker.messenger; using linker.messenger.signin; -namespace linker.plugins.pcp.messenger +namespace linker.messenger.pcp { public sealed class PcpClientMessenger : IMessenger { @@ -40,17 +38,19 @@ namespace linker.plugins.pcp.messenger public sealed class PcpServerMessenger : IMessenger { private readonly IMessengerSender messengerSender; - private readonly SignCaching signCaching; - public PcpServerMessenger(IMessengerSender messengerSender, SignCaching signCaching) + private readonly SignInServerCaching signCaching; + private readonly ISerializer serializer; + public PcpServerMessenger(IMessengerSender messengerSender, SignInServerCaching signCaching, ISerializer serializer) { this.messengerSender = messengerSender; this.signCaching = signCaching; + this.serializer = serializer; } [MessengerId((ushort)PcpMessengerIds.BeginForward)] public async Task BeginForward(IConnection connection) { - TunnelTransportInfo tunnelTransportInfo = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + TunnelTransportInfo tunnelTransportInfo = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (signCaching.TryGet(tunnelTransportInfo.Remote.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId) { @@ -61,7 +61,7 @@ namespace linker.plugins.pcp.messenger { Connection = cacheTo.Connection, MessengerId = (ushort)PcpMessengerIds.Begin, - Payload = MemoryPackSerializer.Serialize(tunnelTransportInfo) + Payload = serializer.Serialize(tunnelTransportInfo) }).ConfigureAwait(false); connection.Write(Helper.TrueArray); } @@ -71,7 +71,7 @@ namespace linker.plugins.pcp.messenger [MessengerId((ushort)PcpMessengerIds.FailForward)] public async Task FailForward(IConnection connection) { - TunnelTransportInfo tunnelTransportInfo = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + TunnelTransportInfo tunnelTransportInfo = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (signCaching.TryGet(tunnelTransportInfo.Remote.MachineId, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId) { tunnelTransportInfo.Local.MachineName = cache1.MachineName; @@ -80,7 +80,7 @@ namespace linker.plugins.pcp.messenger { Connection = cache.Connection, MessengerId = (ushort)PcpMessengerIds.Fail, - Payload = MemoryPackSerializer.Serialize(tunnelTransportInfo) + Payload = serializer.Serialize(tunnelTransportInfo) }).ConfigureAwait(false); } } @@ -89,7 +89,7 @@ namespace linker.plugins.pcp.messenger [MessengerId((ushort)PcpMessengerIds.SuccessForward)] public async Task SuccessForward(IConnection connection) { - TunnelTransportInfo tunnelTransportInfo = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + TunnelTransportInfo tunnelTransportInfo = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (signCaching.TryGet(tunnelTransportInfo.Remote.MachineId, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId) { tunnelTransportInfo.Local.MachineName = cache1.MachineName; @@ -98,7 +98,7 @@ namespace linker.plugins.pcp.messenger { Connection = cache.Connection, MessengerId = (ushort)PcpMessengerIds.Success, - Payload = MemoryPackSerializer.Serialize(tunnelTransportInfo) + Payload = serializer.Serialize(tunnelTransportInfo) }).ConfigureAwait(false); } } diff --git a/linker/plugins/pcp/messenger/PcpMessengerIds.cs b/linker.messenger.pcp/PcpMessengerIds.cs similarity index 85% rename from linker/plugins/pcp/messenger/PcpMessengerIds.cs rename to linker.messenger.pcp/PcpMessengerIds.cs index 09bef0ae..7fb3f4e8 100644 --- a/linker/plugins/pcp/messenger/PcpMessengerIds.cs +++ b/linker.messenger.pcp/PcpMessengerIds.cs @@ -1,4 +1,4 @@ -namespace linker.plugins.pcp.messenger +namespace linker.messenger.pcp { public enum PcpMessengerIds : ushort { diff --git a/linker/plugins/pcp/PcpTransfer.cs b/linker.messenger.pcp/PcpTransfer.cs similarity index 91% rename from linker/plugins/pcp/PcpTransfer.cs rename to linker.messenger.pcp/PcpTransfer.cs index 4ed4c652..e800e6c0 100644 --- a/linker/plugins/pcp/PcpTransfer.cs +++ b/linker.messenger.pcp/PcpTransfer.cs @@ -3,17 +3,17 @@ using linker.libs.extends; using linker.tunnel; using linker.tunnel.connection; -namespace linker.plugins.pcp +namespace linker.messenger.pcp { public sealed class PcpTransfer { private readonly string transactionId = "pcp"; - private readonly PcpConfigTransfer pcpConfigTransfer; + private readonly IPcpStore pcpStore; private readonly TunnelTransfer tunnelTransfer; - public PcpTransfer(PcpConfigTransfer pcpConfigTransfer, TunnelTransfer tunnelTransfer) + public PcpTransfer(IPcpStore pcpStore, TunnelTransfer tunnelTransfer) { - this.pcpConfigTransfer = pcpConfigTransfer; + this.pcpStore = pcpStore; this.tunnelTransfer = tunnelTransfer; tunnelTransfer.SetConnectedCallback(transactionId, OnConnected); @@ -77,7 +77,7 @@ namespace linker.plugins.pcp public void AddConnection(ITunnelConnection connection) { - pcpConfigTransfer.AddHistory(connection); + pcpStore.AddHistory(connection); } sealed class TunnelTagInfo diff --git a/linker.messenger.pcp/linker.messenger.pcp.csproj b/linker.messenger.pcp/linker.messenger.pcp.csproj new file mode 100644 index 00000000..6ecec686 --- /dev/null +++ b/linker.messenger.pcp/linker.messenger.pcp.csproj @@ -0,0 +1,41 @@ + + + + + net8.0 + enable + disable + true + false + true + True + linker messenger pcp + snltty + snltty + linker messenger pcp + snltty + https://github.com/snltty/linker + https://github.com/snltty/linker + linker messenger pcp + 1.6.4 + 1.6.4 + 1.6.4 + + + + full + true + + + none + false + True + + + + + + + + + diff --git a/linker.messenger.relay/Entry.cs b/linker.messenger.relay/Entry.cs new file mode 100644 index 00000000..c9135dd6 --- /dev/null +++ b/linker.messenger.relay/Entry.cs @@ -0,0 +1,83 @@ +using linker.messenger.api; +using linker.messenger.relay.client; +using linker.messenger.relay.messenger; +using linker.messenger.relay.server; +using linker.messenger.relay.server.caching; +using linker.messenger.relay.server.validator; +using linker.messenger.sync; +using Microsoft.Extensions.DependencyInjection; +using System.Security.Cryptography.X509Certificates; +namespace linker.messenger.relay +{ + public static class Entry + { + public static X509Certificate2 certificate; + public static ServiceCollection AddRelayClient(this ServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + + return serviceCollection; + } + public static ServiceProvider UseRelayClient(this ServiceProvider serviceProvider, X509Certificate2 certificate) + { + Entry.certificate = certificate; + + IMessengerResolver messengerResolver = serviceProvider.GetService(); + messengerResolver.AddMessenger(new List { serviceProvider.GetService() }); + + SyncTreansfer syncTreansfer = serviceProvider.GetService(); + syncTreansfer.AddSyncs(new List { serviceProvider.GetService() }); + + IApiServer apiServer = serviceProvider.GetService(); + apiServer.AddPlugins(new List { serviceProvider.GetService() }); + + RelayClientTestTransfer relayClientTestTransfer = serviceProvider.GetService(); + + return serviceProvider; + } + + + public static ServiceCollection AddRelayServer(this ServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + + return serviceCollection; + } + public static ServiceProvider UseRelayServer(this ServiceProvider serviceProvider) + { + IMessengerResolver messengerResolver = serviceProvider.GetService(); + messengerResolver.AddMessenger(new List { serviceProvider.GetService() }); + + ResolverTransfer resolverTransfer = serviceProvider.GetService(); + resolverTransfer.AddResolvers(new List + { + serviceProvider.GetService(), + serviceProvider.GetService(), + }); + + RelayServerNodeTransfer relayServerNodeTransfer = serviceProvider.GetService(); + RelayServerMasterTransfer relayServerMasterTransfer = serviceProvider.GetService(); + + RelayServerValidatorTransfer relayServerValidatorTransfer = serviceProvider.GetService(); + relayServerValidatorTransfer.AddValidators(new List { serviceProvider.GetService() }); + + return serviceProvider; + } + } +} diff --git a/linker.messenger.relay/client/IRelayClientStore.cs b/linker.messenger.relay/client/IRelayClientStore.cs index 58e46e8f..c257e74e 100644 --- a/linker.messenger.relay/client/IRelayClientStore.cs +++ b/linker.messenger.relay/client/IRelayClientStore.cs @@ -1,5 +1,4 @@ using linker.messenger.relay.client.transport; -using System.Security.Cryptography.X509Certificates; namespace linker.messenger.relay.client { @@ -9,34 +8,18 @@ namespace linker.messenger.relay.client public interface IRelayClientStore { /// - /// 标志,当所有业务使用同一端口时,flag区分,0则不发送 + /// 默认中继节点 /// - public byte Flag { get; } - /// - /// 加密证书 - /// - public X509Certificate2 Certificate { get; } - /// - /// 登录连接 - /// - public IConnection SigninConnection { get; } - + public string DefaultNodeId { get; } /// - /// 密钥 + /// 服务器配置 /// - public string SecretKey { get; } - /// - /// 禁用 - /// - public bool Disabled { get; } - /// - /// 开启ssl - /// - public bool SSL { get;} - /// - /// 中继类型 - /// - public RelayClientType RelayType { get; } + public RelayServerInfo Server { get; } + + + public void SetDefaultNodeId(string defaultNodeId); + public void SetServer(RelayServerInfo server); + public void SetServerSecretKey(string secretKey); } } diff --git a/linker/plugins/relay/client/RelayApiController.cs b/linker.messenger.relay/client/RelayApiController.cs similarity index 72% rename from linker/plugins/relay/client/RelayApiController.cs rename to linker.messenger.relay/client/RelayApiController.cs index 829e9f3f..47897d63 100644 --- a/linker/plugins/relay/client/RelayApiController.cs +++ b/linker.messenger.relay/client/RelayApiController.cs @@ -1,26 +1,25 @@ -using linker.config; -using linker.libs.api; +using linker.libs.api; using linker.libs.extends; using linker.messenger.relay.client; +using linker.messenger.relay.client.transport; using linker.messenger.relay.server; -using linker.plugins.capi; -namespace linker.plugins.relay.client +namespace linker.messenger.relay { /// /// 中继管理接口 /// - public sealed class RelayApiController : IApiClientController + public sealed class RelayApiController : IApiController { private readonly RelayClientTestTransfer relayTestTransfer; private readonly RelayClientTransfer relayTransfer; - private readonly RelayClientConfigTransfer relayClientConfigTransfer; + private readonly IRelayClientStore relayClientStore; - public RelayApiController(RelayClientTestTransfer relayTestTransfer, RelayClientTransfer relayTransfer, RelayClientConfigTransfer relayClientConfigTransfer) + public RelayApiController(RelayClientTestTransfer relayTestTransfer, RelayClientTransfer relayTransfer, IRelayClientStore relayClientStore) { this.relayTestTransfer = relayTestTransfer; this.relayTransfer = relayTransfer; - this.relayClientConfigTransfer = relayClientConfigTransfer; + this.relayClientStore = relayClientStore; } /// @@ -28,11 +27,10 @@ namespace linker.plugins.relay.client /// /// /// - [ClientApiAccess(ClientApiAccess.Config)] public bool SetServers(ApiControllerParamsInfo param) { RelayServerInfo info = param.Content.DeJson(); - relayClientConfigTransfer.SetServer(info); + relayClientStore.SetServer(info); return true; } @@ -46,7 +44,7 @@ namespace linker.plugins.relay.client { RelayConnectInfo relayConnectInfo = param.Content.DeJson(); _ = relayTransfer.ConnectAsync(relayConnectInfo.FromMachineId, relayConnectInfo.ToMachineId, relayConnectInfo.TransactionId, relayConnectInfo.NodeId); - relayClientConfigTransfer.SetDefaultNodeId(relayConnectInfo.NodeId); + relayClientStore.SetDefaultNodeId(relayConnectInfo.NodeId); return true; } diff --git a/linker/plugins/relay/client/RelayClientTestTransfer.cs b/linker.messenger.relay/client/RelayClientTestTransfer.cs similarity index 69% rename from linker/plugins/relay/client/RelayClientTestTransfer.cs rename to linker.messenger.relay/client/RelayClientTestTransfer.cs index 31a1af74..1148a7c1 100644 --- a/linker/plugins/relay/client/RelayClientTestTransfer.cs +++ b/linker.messenger.relay/client/RelayClientTestTransfer.cs @@ -2,11 +2,11 @@ using linker.messenger.relay.client; using linker.messenger.relay.client.transport; using linker.messenger.relay.server; -using linker.plugins.client; +using linker.messenger.signin; using System.Net; using System.Net.NetworkInformation; -namespace linker.plugins.relay.client +namespace linker.messenger.relay { /// /// 中继 @@ -14,18 +14,18 @@ namespace linker.plugins.relay.client public sealed class RelayClientTestTransfer { private readonly RelayClientTransfer relayTransfer; - private readonly ClientSignInState clientSignInState; - private readonly ClientConfigTransfer clientConfigTransfer; - private readonly RelayClientConfigTransfer relayClientConfigTransfer; + private readonly SignInClientState signInClientState; + private readonly ISignInClientStore signInClientStore; + private readonly IRelayClientStore relayClientStore; public List Nodes { get; private set; } = new List(); - public RelayClientTestTransfer(RelayClientTransfer relayTransfer, ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer, RelayClientConfigTransfer relayClientConfigTransfer) + public RelayClientTestTransfer(RelayClientTransfer relayTransfer, SignInClientState signInClientState, ISignInClientStore signInClientStore, IRelayClientStore relayClientStore) { this.relayTransfer = relayTransfer; - this.clientSignInState = clientSignInState; - this.clientConfigTransfer = clientConfigTransfer; - this.relayClientConfigTransfer = relayClientConfigTransfer; + this.signInClientState = signInClientState; + this.signInClientStore = signInClientStore; + this.relayClientStore = relayClientStore; TestTask(); } @@ -40,17 +40,17 @@ namespace linker.plugins.relay.client { try { - IRelayClientTransport transport = relayTransfer.Transports.FirstOrDefault(d => d.Type == relayClientConfigTransfer.Server.RelayType); + IRelayClientTransport transport = relayTransfer.Transports.FirstOrDefault(d => d.Type == relayClientStore.Server.RelayType); if (transport != null) { Nodes = await transport.RelayTestAsync(new RelayTestInfo { - MachineId = clientConfigTransfer.Id, - SecretKey = relayClientConfigTransfer.Server.SecretKey + MachineId = signInClientStore.Id, + SecretKey = relayClientStore.Server.SecretKey }); var tasks = Nodes.Select(async (c) => { - IPEndPoint ep = c.EndPoint == null || c.EndPoint.Address.Equals(IPAddress.Any) ? clientSignInState.Connection.Address : c.EndPoint; + IPEndPoint ep = c.EndPoint == null || c.EndPoint.Address.Equals(IPAddress.Any) ? signInClientState.Connection.Address : c.EndPoint; using Ping ping = new Ping(); var resp = await ping.SendPingAsync(ep.Address, 1000); diff --git a/linker.messenger.relay/client/RelayClientTransfer.cs b/linker.messenger.relay/client/RelayClientTransfer.cs index a7a17997..a8a5b3be 100644 --- a/linker.messenger.relay/client/RelayClientTransfer.cs +++ b/linker.messenger.relay/client/RelayClientTransfer.cs @@ -3,6 +3,7 @@ using linker.tunnel.connection; using linker.libs; using linker.libs.extends; using System.Collections.Concurrent; +using linker.messenger.signin; namespace linker.messenger.relay.client { @@ -17,11 +18,11 @@ namespace linker.messenger.relay.client private Dictionary>> OnConnected { get; } = new Dictionary>>(); private readonly IRelayClientStore relayClientStore; - public RelayClientTransfer(IMessengerSender messengerSender,ISerializer serializer,IRelayClientStore relayClientStore) + public RelayClientTransfer(IMessengerSender messengerSender,ISerializer serializer,IRelayClientStore relayClientStore,SignInClientState signInClientState) { this.relayClientStore = relayClientStore; Transports = new List { - new RelayClientTransportSelfHost(messengerSender,serializer,relayClientStore), + new RelayClientTransportSelfHost(messengerSender,serializer,relayClientStore,signInClientState), }; LoggerHelper.Instance.Info($"load relay transport:{string.Join(",", Transports.Select(c => c.GetType().Name))}"); } @@ -67,11 +68,11 @@ namespace linker.messenger.relay.client } try { - IRelayClientTransport transport = Transports.FirstOrDefault(c => c.Type == relayClientStore.RelayType && relayClientStore.Disabled == false); + IRelayClientTransport transport = Transports.FirstOrDefault(c => c.Type == relayClientStore.Server.RelayType && relayClientStore.Server.Disabled == false); if (transport == null) { if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) - LoggerHelper.Instance.Error($"relay to {remoteMachineId} fail,transport not found {relayClientStore.RelayType},{relayClientStore.Disabled}"); + LoggerHelper.Instance.Error($"relay to {remoteMachineId} fail,transport not found {relayClientStore.Server.RelayType},{relayClientStore.Server.Disabled}"); return null; } @@ -82,10 +83,10 @@ namespace linker.messenger.relay.client FromMachineName = string.Empty, RemoteMachineId = remoteMachineId, RemoteMachineName = string.Empty, - SecretKey = relayClientStore.SecretKey, + SecretKey = relayClientStore.Server.SecretKey, TransactionId = transactionId, TransportName = transport.Name, - SSL = relayClientStore.SSL, + SSL = relayClientStore.Server.SSL, NodeId = nodeId }; diff --git a/linker.messenger.relay/client/RelaySync.cs b/linker.messenger.relay/client/RelaySync.cs new file mode 100644 index 00000000..dbd414a8 --- /dev/null +++ b/linker.messenger.relay/client/RelaySync.cs @@ -0,0 +1,28 @@ +using linker.libs; +using linker.messenger.sync; + +namespace linker.messenger.relay.client +{ + public sealed class RelaySyncSecretKey : ISync + { + public string Name => "RelaySecretKey"; + + private readonly IRelayClientStore relayClientStore; + private readonly ISerializer serializer; + public RelaySyncSecretKey(IRelayClientStore relayClientStore, ISerializer serializer) + { + this.relayClientStore = relayClientStore; + this.serializer = serializer; + } + public Memory GetData() + { + return serializer.Serialize(relayClientStore.Server.SecretKey); + } + + public void SetData(Memory data) + { + string value = serializer.Deserialize(data.Span); + relayClientStore.SetServerSecretKey(value); + } + } +} diff --git a/linker.messenger.relay/client/transport/IRelayClientTransport.cs b/linker.messenger.relay/client/transport/IRelayClientTransport.cs index 778f9c61..edd1779a 100644 --- a/linker.messenger.relay/client/transport/IRelayClientTransport.cs +++ b/linker.messenger.relay/client/transport/IRelayClientTransport.cs @@ -1,4 +1,5 @@ -using linker.messenger.relay.server; +using linker.libs; +using linker.messenger.relay.server; using linker.tunnel.connection; using System.Net; @@ -113,4 +114,23 @@ namespace linker.messenger.relay.client.transport public bool SSL { get; set; } = true; } + + public sealed partial class RelayServerInfo + { + public RelayServerInfo() { } + /// + /// 密钥 + /// + public string SecretKey { get; set; } = Helper.GlobalString; + /// + /// 禁用 + /// + public bool Disabled { get; set; } + /// + /// 开启ssl + /// + public bool SSL { get; set; } = true; + + public RelayClientType RelayType { get; set; } = RelayClientType.Linker; + } } diff --git a/linker.messenger.relay/client/transport/RelayClientTransportSelfHost.cs b/linker.messenger.relay/client/transport/RelayClientTransportSelfHost.cs index 4f0f4144..ac5e46a6 100644 --- a/linker.messenger.relay/client/transport/RelayClientTransportSelfHost.cs +++ b/linker.messenger.relay/client/transport/RelayClientTransportSelfHost.cs @@ -10,6 +10,7 @@ using System.Security.Authentication; using System.Security.Cryptography.X509Certificates; using System.Buffers; using linker.messenger.relay.server; +using linker.messenger.signin; namespace linker.messenger.relay.client.transport { @@ -25,11 +26,13 @@ namespace linker.messenger.relay.client.transport private readonly IMessengerSender messengerSender; private readonly ISerializer serializer; private readonly IRelayClientStore relayClientStore; - public RelayClientTransportSelfHost(IMessengerSender messengerSender, ISerializer serializer, IRelayClientStore relayClientStore) + private readonly SignInClientState signInClientState; + public RelayClientTransportSelfHost(IMessengerSender messengerSender, ISerializer serializer, IRelayClientStore relayClientStore, SignInClientState signInClientState) { this.messengerSender = messengerSender; this.serializer = serializer; this.relayClientStore = relayClientStore; + this.signInClientState = signInClientState; } public async Task RelayAsync(RelayInfo relayInfo) @@ -117,7 +120,7 @@ namespace linker.messenger.relay.client.transport { MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap { - Connection = relayClientStore.SigninConnection, + Connection = signInClientState.Connection, MessengerId = (ushort)RelayMessengerIds.RelayAsk, Payload = serializer.Serialize(relayInfo), Timeout = 2000 @@ -145,7 +148,7 @@ namespace linker.messenger.relay.client.transport IPEndPoint ep = node.EndPoint; if (ep == null || ep.Address.Equals(IPAddress.Any)) { - ep = relayClientStore.SigninConnection.Address; + ep = signInClientState.Connection.Address; } if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) @@ -165,8 +168,7 @@ namespace linker.messenger.relay.client.transport ToId = relayInfo.RemoteMachineId, NodeId = node.Id, }; - if (relayClientStore.Flag > 0) - await socket.SendAsync(new byte[] { relayClientStore.Flag }); + await socket.SendAsync(new byte[] { (byte)ResolverType.Relay }); await socket.SendAsync(serializer.Serialize(relayMessage)); if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"relay connected {ep}"); @@ -211,7 +213,7 @@ namespace linker.messenger.relay.client.transport //通知对方去确认中继 var resp = await messengerSender.SendReply(new MessageRequestWrap { - Connection = relayClientStore.SigninConnection, + Connection = signInClientState.Connection, MessengerId = (ushort)RelayMessengerIds.RelayForward, Payload = serializer.Serialize(relayInfo), }); @@ -227,7 +229,7 @@ namespace linker.messenger.relay.client.transport { try { - IPEndPoint ep = relayInfo.Server == null || relayInfo.Server.Address.Equals(IPAddress.Any) ? relayClientStore.SigninConnection.Address : relayInfo.Server; + IPEndPoint ep = relayInfo.Server == null || relayInfo.Server.Address.Equals(IPAddress.Any) ? signInClientState.Connection.Address : relayInfo.Server; Socket socket = new Socket(ep.AddressFamily, SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); socket.KeepAlive(); @@ -241,8 +243,7 @@ namespace linker.messenger.relay.client.transport ToId = relayInfo.RemoteMachineId, NodeId = relayInfo.NodeId, }; - if (relayClientStore.Flag > 0) - await socket.SendAsync(new byte[] { relayClientStore.Flag }); + await socket.SendAsync(new byte[] { (byte)ResolverType.Relay }); await socket.SendAsync(serializer.Serialize(relayMessage)); _ = WaitSSL(socket, relayInfo).ContinueWith((result) => @@ -271,7 +272,7 @@ namespace linker.messenger.relay.client.transport if (relayInfo.SSL) { sslStream = new SslStream(new NetworkStream(socket, false), false); - await sslStream.AuthenticateAsServerAsync(relayClientStore.Certificate, false, SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13, false).ConfigureAwait(false); + await sslStream.AuthenticateAsServerAsync(Entry.certificate, false, SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13, false).ConfigureAwait(false); } return new TunnelConnectionTcp { @@ -308,7 +309,7 @@ namespace linker.messenger.relay.client.transport { MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap { - Connection = relayClientStore.SigninConnection, + Connection = signInClientState.Connection, MessengerId = (ushort)RelayMessengerIds.RelayTest, Payload = serializer.Serialize(relayTestInfo), Timeout = 2000 diff --git a/linker.messenger.relay/linker.messenger.relay.csproj b/linker.messenger.relay/linker.messenger.relay.csproj index f482aaa1..ad172e2f 100644 --- a/linker.messenger.relay/linker.messenger.relay.csproj +++ b/linker.messenger.relay/linker.messenger.relay.csproj @@ -37,8 +37,9 @@ + + - diff --git a/linker.messenger.relay/messenger/RelayMessenger.cs b/linker.messenger.relay/messenger/RelayMessenger.cs index db5d3d24..1bd60341 100644 --- a/linker.messenger.relay/messenger/RelayMessenger.cs +++ b/linker.messenger.relay/messenger/RelayMessenger.cs @@ -41,12 +41,12 @@ namespace linker.messenger.relay.messenger public class RelayServerMessenger : IMessenger { private readonly IMessengerSender messengerSender; - private readonly SignCaching signCaching; + private readonly SignInServerCaching signCaching; private readonly RelayServerMasterTransfer relayServerTransfer; private readonly RelayServerValidatorTransfer relayValidatorTransfer; private readonly ISerializer serializer; - public RelayServerMessenger(IMessengerSender messengerSender, SignCaching signCaching, ISerializer serializer, RelayServerMasterTransfer relayServerTransfer, RelayServerValidatorTransfer relayValidatorTransfer) + public RelayServerMessenger(IMessengerSender messengerSender, SignInServerCaching signCaching, ISerializer serializer, RelayServerMasterTransfer relayServerTransfer, RelayServerValidatorTransfer relayValidatorTransfer) { this.messengerSender = messengerSender; this.signCaching = signCaching; diff --git a/linker.messenger.relay/server/IRelayServerNodeStore.cs b/linker.messenger.relay/server/IRelayServerNodeStore.cs index 411aa0fe..6a01f299 100644 --- a/linker.messenger.relay/server/IRelayServerNodeStore.cs +++ b/linker.messenger.relay/server/IRelayServerNodeStore.cs @@ -9,10 +9,6 @@ namespace linker.messenger.relay.server /// public interface IRelayServerNodeStore { - /// - /// 标志,0不发送,大于0发送,当一个端口用于多个服务时使用,用于区分不同业务 - /// - public byte Flag { get; } /// /// 服务端端口 /// diff --git a/linker.messenger.relay/server/IRelayServerStore.cs b/linker.messenger.relay/server/IRelayServerStore.cs new file mode 100644 index 00000000..cd1b22c8 --- /dev/null +++ b/linker.messenger.relay/server/IRelayServerStore.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace linker.messenger.relay.server +{ + public interface IRelayServerStore + { + public string SecretKey { get; } + } +} diff --git a/linker.messenger.relay/server/RelayServerNodeTransfer.cs b/linker.messenger.relay/server/RelayServerNodeTransfer.cs index 90088ef4..1b8f28f4 100644 --- a/linker.messenger.relay/server/RelayServerNodeTransfer.cs +++ b/linker.messenger.relay/server/RelayServerNodeTransfer.cs @@ -51,8 +51,7 @@ namespace linker.messenger.relay.server await socket.ConnectAsync(server).ConfigureAwait(false); long time = Environment.TickCount64 - start; - if (relayServerNodeStore.Flag > 0) - await socket.SendAsync(new byte[] { relayServerNodeStore.Flag }); + await socket.SendAsync(new byte[] { (byte)ResolverType.RelayReport }); await socket.SendAsync(key.ToBytes()); int length = await socket.ReceiveAsync(buffer.AsMemory(), SocketFlags.None).AsTask().WaitAsync(TimeSpan.FromMilliseconds(Math.Max(time * 2, 5000))).ConfigureAwait(false); socket.SafeClose(); @@ -234,7 +233,7 @@ namespace linker.messenger.relay.server byte[] content = crypto.Encode(serializer.Serialize(relayNodeReportInfo)); byte[] data = new byte[content.Length + 1]; - data[0] = relayServerNodeStore.Flag; + data[0] = (byte)ResolverType.RelayReport; content.AsMemory().CopyTo(data.AsMemory(1)); using UdpClient udpClient = new UdpClient(AddressFamily.InterNetwork); diff --git a/linker.messenger.relay/server/RelayServerReportResolver.cs b/linker.messenger.relay/server/RelayServerReportResolver.cs index ff8dc09a..7426e7db 100644 --- a/linker.messenger.relay/server/RelayServerReportResolver.cs +++ b/linker.messenger.relay/server/RelayServerReportResolver.cs @@ -8,8 +8,10 @@ namespace linker.messenger.relay.server /// /// 中继节点报告处理器 /// - public class RelayServerReportResolver + public class RelayServerReportResolver: IResolver { + public ResolverType Type => ResolverType.RelayReport; + private readonly RelayServerMasterTransfer relayServerTransfer; public RelayServerReportResolver(RelayServerMasterTransfer relayServerTransfer) { diff --git a/linker.messenger.relay/server/RelayServerResolver.cs b/linker.messenger.relay/server/RelayServerResolver.cs index 9a0bbad8..99dc7c86 100644 --- a/linker.messenger.relay/server/RelayServerResolver.cs +++ b/linker.messenger.relay/server/RelayServerResolver.cs @@ -10,8 +10,10 @@ namespace linker.messenger.relay.server /// /// 中继连接处理 /// - public class RelayServerResolver + public class RelayServerResolver: IResolver { + public ResolverType Type => ResolverType.Relay; + private readonly RelayServerNodeTransfer relayServerNodeTransfer; private readonly ISerializer serializer; public RelayServerResolver(RelayServerNodeTransfer relayServerNodeTransfer, ISerializer serializer) @@ -22,6 +24,7 @@ namespace linker.messenger.relay.server private readonly ConcurrentDictionary relayDic = new ConcurrentDictionary(); + public virtual void AddReceive(string key, string from, string to, string groupid, ulong bytes) { diff --git a/linker.messenger.relay/server/validator/RelayServerValidatorSecretKey.cs b/linker.messenger.relay/server/validator/RelayServerValidatorSecretKey.cs new file mode 100644 index 00000000..ce7a8716 --- /dev/null +++ b/linker.messenger.relay/server/validator/RelayServerValidatorSecretKey.cs @@ -0,0 +1,24 @@ +using linker.messenger.signin; + +namespace linker.messenger.relay.server.validator +{ + public sealed class RelayServerValidatorSecretKey : IRelayServerValidator + { + private readonly IRelayServerStore relayServerStore; + public RelayServerValidatorSecretKey(IRelayServerStore relayServerStore) + { + this.relayServerStore = relayServerStore; + } + + public async Task Validate(linker.messenger.relay.client.transport.RelayInfo relayInfo, SignCacheInfo fromMachine, SignCacheInfo toMachine) + { + if (relayInfo.SecretKey != relayServerStore.SecretKey) + { + return $"SecretKey validate fail"; + } + + await Task.CompletedTask; + return string.Empty; + } + } +} diff --git a/linker.messenger.relay/server/validator/RelayServerValidatorTransfer.cs b/linker.messenger.relay/server/validator/RelayServerValidatorTransfer.cs index 5ec7174f..e0b81b28 100644 --- a/linker.messenger.relay/server/validator/RelayServerValidatorTransfer.cs +++ b/linker.messenger.relay/server/validator/RelayServerValidatorTransfer.cs @@ -1,6 +1,7 @@ using linker.messenger.signin; using linker.messenger.relay.client.transport; using linker.libs; +using System.Diagnostics.CodeAnalysis; namespace linker.messenger.relay.server.validator { @@ -19,10 +20,11 @@ namespace linker.messenger.relay.server.validator /// 加载中继验证实现类 /// /// - public void LoadValidators(List list) + public void AddValidators(List list) { - validators = list; - LoggerHelper.Instance.Info($"load relay server validator :{string.Join(",", validators.Select(c => c.GetType().Name))}"); + if (list == null) return; + validators = validators.Concat(list).Distinct(new RelayServerValidatorEqualityComparer()).ToList(); + LoggerHelper.Instance.Info($"load relay server validator :{string.Join(",", list.Select(c => c.GetType().Name))}"); } /// @@ -44,5 +46,18 @@ namespace linker.messenger.relay.server.validator } return string.Empty; } + + public sealed class RelayServerValidatorEqualityComparer : IEqualityComparer + { + public bool Equals(IRelayServerValidator x, IRelayServerValidator y) + { + return x.GetType().FullName == y.GetType().FullName; + } + + public int GetHashCode([DisallowNull] IRelayServerValidator obj) + { + return obj.GetHashCode(); + } + } } } diff --git a/linker.messenger.serializer.memorypack/AccessSerializer.cs b/linker.messenger.serializer.memorypack/AccessSerializer.cs new file mode 100644 index 00000000..3315872f --- /dev/null +++ b/linker.messenger.serializer.memorypack/AccessSerializer.cs @@ -0,0 +1,111 @@ +using MemoryPack; +using linker.messenger.access; + +namespace linker.messenger.serializer.memorypack +{ + [MemoryPackable] + public readonly partial struct SerializableAccessUpdateInfo + { + [MemoryPackIgnore] + public readonly AccessUpdateInfo info; + + [MemoryPackInclude] + string FromMachineId => info.FromMachineId; + + [MemoryPackInclude] + string ToMachineId => info.ToMachineId; + + [MemoryPackInclude] + ulong Access => info.Access; + + [MemoryPackConstructor] + SerializableAccessUpdateInfo(string fromMachineId, string toMachineId, ulong access) + { + var info = new AccessUpdateInfo { FromMachineId = fromMachineId, ToMachineId = toMachineId, Access = access }; + this.info = info; + } + + public SerializableAccessUpdateInfo(AccessUpdateInfo info) + { + this.info = info; + } + } + public class AccessUpdateInfoFormatter : MemoryPackFormatter + { + public override void Serialize(ref MemoryPackWriter writer, scoped ref AccessUpdateInfo value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WritePackable(new SerializableAccessUpdateInfo(value)); + } + + public override void Deserialize(ref MemoryPackReader reader, scoped ref AccessUpdateInfo value) + { + if (reader.PeekIsNull()) + { + reader.Advance(1); // skip null block + value = null; + return; + } + + var wrapped = reader.ReadPackable(); + value = wrapped.info; + } + } + + + [MemoryPackable] + public readonly partial struct SerializableAccessInfo + { + [MemoryPackIgnore] + public readonly AccessInfo info; + + [MemoryPackInclude] + string MachineId => info.MachineId; + + [MemoryPackInclude] + AccessValue Access => info.Access; + + [MemoryPackConstructor] + SerializableAccessInfo(string machineId, AccessValue access) + { + var info = new AccessInfo { MachineId= machineId, Access = access }; + this.info = info; + } + + public SerializableAccessInfo(AccessInfo info) + { + this.info = info; + } + } + public class AccessInfoFormatter : MemoryPackFormatter + { + public override void Serialize(ref MemoryPackWriter writer, scoped ref AccessInfo value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WritePackable(new SerializableAccessInfo(value)); + } + + public override void Deserialize(ref MemoryPackReader reader, scoped ref AccessInfo value) + { + if (reader.PeekIsNull()) + { + reader.Advance(1); // skip null block + value = null; + return; + } + + var wrapped = reader.ReadPackable(); + value = wrapped.info; + } + } +} diff --git a/linker/serializer/ConnectionFormatter.cs b/linker.messenger.serializer.memorypack/ConnectionFormatter.cs similarity index 93% rename from linker/serializer/ConnectionFormatter.cs rename to linker.messenger.serializer.memorypack/ConnectionFormatter.cs index 432ce74c..ff2ff12b 100644 --- a/linker/serializer/ConnectionFormatter.cs +++ b/linker.messenger.serializer.memorypack/ConnectionFormatter.cs @@ -1,7 +1,7 @@ using linker.messenger; using MemoryPack; -namespace linker.serializer +namespace linker.messenger.serializer.memorypack { /// /// MemoryPack 的IConnection序列化扩展 diff --git a/linker.messenger.serializer.memorypack/DecenterSerializer.cs b/linker.messenger.serializer.memorypack/DecenterSerializer.cs new file mode 100644 index 00000000..9ff5c670 --- /dev/null +++ b/linker.messenger.serializer.memorypack/DecenterSerializer.cs @@ -0,0 +1,57 @@ +using MemoryPack; +using linker.messenger.decenter; + +namespace linker.messenger.serializer.memorypack +{ + [MemoryPackable] + public readonly partial struct SerializableDecenterSyncInfo + { + [MemoryPackIgnore] + public readonly DecenterSyncInfo info; + + [MemoryPackInclude] + string Name => info.Name; + + [MemoryPackInclude] + Memory Data => info.Data; + + [MemoryPackConstructor] + SerializableDecenterSyncInfo(string name, Memory data) + { + var info = new DecenterSyncInfo { Name = name, Data = data }; + this.info = info; + } + + public SerializableDecenterSyncInfo(DecenterSyncInfo tunnelCompactInfo) + { + this.info = tunnelCompactInfo; + } + } + public class DecenterSyncInfoFormatter : MemoryPackFormatter + { + public override void Serialize(ref MemoryPackWriter writer, scoped ref DecenterSyncInfo value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WritePackable(new SerializableDecenterSyncInfo(value)); + } + + public override void Deserialize(ref MemoryPackReader reader, scoped ref DecenterSyncInfo value) + { + if (reader.PeekIsNull()) + { + reader.Advance(1); // skip null block + value = null; + return; + } + + var wrapped = reader.ReadPackable(); + value = wrapped.info; + } + } + +} diff --git a/linker.messenger.serializer.memorypack/Entry.cs b/linker.messenger.serializer.memorypack/Entry.cs new file mode 100644 index 00000000..a1fd44dc --- /dev/null +++ b/linker.messenger.serializer.memorypack/Entry.cs @@ -0,0 +1,69 @@ +using linker.libs; +using MemoryPack; +using Microsoft.Extensions.DependencyInjection; +namespace linker.messenger.serializer.memorypack +{ + public static class Entry + { + public static ServiceCollection AddSerializerMemoryPack(this ServiceCollection serviceCollection) + { + MemoryPackFormatterProvider.Register(new IPEndPointFormatter()); + MemoryPackFormatterProvider.Register(new IPAddressFormatter()); + MemoryPackFormatterProvider.Register(new TunnelConnectionFormatter()); + MemoryPackFormatterProvider.Register(new ConnectionFormatter()); + + + serviceCollection.AddSingleton(); + + MemoryPackFormatterProvider.Register(new SignInfoFormatter()); + MemoryPackFormatterProvider.Register(new SignCacheInfoFormatter()); + MemoryPackFormatterProvider.Register(new SignInListRequestInfoFormatter()); + MemoryPackFormatterProvider.Register(new SignInListResponseInfoFormatter()); + MemoryPackFormatterProvider.Register(new SignInIdsRequestInfoFormatter()); + MemoryPackFormatterProvider.Register(new SignInIdsResponseInfoFormatter()); + MemoryPackFormatterProvider.Register(new SignInIdsResponseItemInfoFormatter()); + MemoryPackFormatterProvider.Register(new SignInResponseInfoFormatter()); + MemoryPackFormatterProvider.Register(new SignInConfigSetNameInfoFormatter()); + + + MemoryPackFormatterProvider.Register(new SyncInfoFormatter()); + + + MemoryPackFormatterProvider.Register(new TunnelTransportWanPortInfoFormatter()); + MemoryPackFormatterProvider.Register(new TunnelTransportItemInfoFormatter()); + MemoryPackFormatterProvider.Register(new TunnelTransportInfoFormatter()); + MemoryPackFormatterProvider.Register(new TunnelWanPortProtocolInfoFormatter()); + MemoryPackFormatterProvider.Register(new TunnelRouteLevelInfoFormatter()); + MemoryPackFormatterProvider.Register(new TunnelSetRouteLevelInfoFormatter()); + + + MemoryPackFormatterProvider.Register(new DecenterSyncInfoFormatter()); + + + MemoryPackFormatterProvider.Register(new UpdaterConfirmInfoFormatter()); + MemoryPackFormatterProvider.Register(new UpdaterConfirmServerInfoFormatter()); + MemoryPackFormatterProvider.Register(new UpdaterClientInfoFormatter()); + MemoryPackFormatterProvider.Register(new UpdaterInfoFormatter()); + + + MemoryPackFormatterProvider.Register(new RelayTestInfoFormatter()); + MemoryPackFormatterProvider.Register(new RelayInfoFormatter()); + MemoryPackFormatterProvider.Register(new RelayServerNodeReportInfoFormatter()); + MemoryPackFormatterProvider.Register(new RelayAskResultInfoFormatter()); + MemoryPackFormatterProvider.Register(new RelayCacheInfoFormatter()); + MemoryPackFormatterProvider.Register(new RelayMessageInfoFormatter()); + + MemoryPackFormatterProvider.Register(new AccessUpdateInfoFormatter()); + MemoryPackFormatterProvider.Register(new AccessInfoFormatter()); + + MemoryPackFormatterProvider.Register(new Socks5LanInfoFormatter()); + MemoryPackFormatterProvider.Register(new Socks5InfoFormatter()); + + return serviceCollection; + } + public static ServiceProvider UseSerializerMemoryPack(this ServiceProvider serviceProvider) + { + return serviceProvider; + } + } +} diff --git a/linker/serializer/IPAddressFormatter.cs b/linker.messenger.serializer.memorypack/IPAddressFormatter.cs similarity index 96% rename from linker/serializer/IPAddressFormatter.cs rename to linker.messenger.serializer.memorypack/IPAddressFormatter.cs index feb6b70f..ea37a280 100644 --- a/linker/serializer/IPAddressFormatter.cs +++ b/linker.messenger.serializer.memorypack/IPAddressFormatter.cs @@ -1,7 +1,7 @@ using MemoryPack; using System.Net; -namespace linker.serializer +namespace linker.messenger.serializer.memorypack { /// /// MemoryPack 的 IPAddress序列化扩展 diff --git a/linker/serializer/IPEndPointFormatter.cs b/linker.messenger.serializer.memorypack/IPEndPointFormatter.cs similarity index 97% rename from linker/serializer/IPEndPointFormatter.cs rename to linker.messenger.serializer.memorypack/IPEndPointFormatter.cs index b01116e1..42cd1250 100644 --- a/linker/serializer/IPEndPointFormatter.cs +++ b/linker.messenger.serializer.memorypack/IPEndPointFormatter.cs @@ -2,7 +2,7 @@ using MemoryPack; using System.Net; -namespace linker.serializer +namespace linker.messenger.serializer.memorypack { /// /// MemoryPack 的 IPEndPoint序列化扩展 diff --git a/linker/serializer/MemoryPackSerializer.cs b/linker.messenger.serializer.memorypack/MemoryPackSerializer.cs similarity index 53% rename from linker/serializer/MemoryPackSerializer.cs rename to linker.messenger.serializer.memorypack/MemoryPackSerializer.cs index 05c2e5c6..0b2dc7b1 100644 --- a/linker/serializer/MemoryPackSerializer.cs +++ b/linker.messenger.serializer.memorypack/MemoryPackSerializer.cs @@ -2,18 +2,31 @@ using MemoryPack; using System.Diagnostics.CodeAnalysis; -namespace linker.serializer +namespace linker.messenger.serializer.memorypack { public sealed class PlusMemoryPackSerializer : ISerializer { public T Deserialize<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] T>(ReadOnlySpan buffer) { - return MemoryPackSerializer.Deserialize(buffer); + return Serializer.Deserialize(buffer); } public byte[] Serialize(T value) { return MemoryPackSerializer.Serialize(value); } + + } + public sealed class Serializer + { + public static T Deserialize<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] T>(ReadOnlySpan buffer) + { + return MemoryPackSerializer.Deserialize(buffer); + } + + public static byte[] Serialize(T value) + { + return MemoryPackSerializer.Serialize(value); + } } } diff --git a/linker/plugins/relay/PlusRelaySerializer.cs b/linker.messenger.serializer.memorypack/RelaySerializer.cs similarity index 99% rename from linker/plugins/relay/PlusRelaySerializer.cs rename to linker.messenger.serializer.memorypack/RelaySerializer.cs index 73cca051..6605c8ba 100644 --- a/linker/plugins/relay/PlusRelaySerializer.cs +++ b/linker.messenger.serializer.memorypack/RelaySerializer.cs @@ -3,7 +3,7 @@ using linker.messenger.relay.server; using MemoryPack; using System.Net; -namespace linker.plugins.relay +namespace linker.messenger.serializer.memorypack { [MemoryPackable] public readonly partial struct SerializableRelayTestInfo diff --git a/linker/plugins/signIn/PlusSignInSerializer.cs b/linker.messenger.serializer.memorypack/SignInSerializer.cs similarity index 87% rename from linker/plugins/signIn/PlusSignInSerializer.cs rename to linker.messenger.serializer.memorypack/SignInSerializer.cs index d9a294f9..c18dbbff 100644 --- a/linker/plugins/signIn/PlusSignInSerializer.cs +++ b/linker.messenger.serializer.memorypack/SignInSerializer.cs @@ -2,7 +2,7 @@ using MemoryPack; using System.Net; -namespace linker.plugins.signIn +namespace linker.messenger.serializer.memorypack { [MemoryPackable] public readonly partial struct SerializableSignInfo @@ -72,8 +72,6 @@ namespace linker.plugins.signIn [MemoryPackIgnore] public readonly SignCacheInfo info; - [MemoryPackInclude] - string Id => info.Id; [MemoryPackInclude] string MachineId => info.MachineId; [MemoryPackInclude] @@ -85,10 +83,10 @@ namespace linker.plugins.signIn string GroupId => info.GroupId; [MemoryPackInclude] - Dictionary Args => info.Args; + DateTime LastSignIn => info.LastSignIn; [MemoryPackInclude] - DateTime LastSignIn => info.LastSignIn; + Dictionary Args => info.Args; [MemoryPackInclude, MemoryPackAllowSerialize] IPEndPoint IP => info.IP; @@ -96,16 +94,13 @@ namespace linker.plugins.signIn [MemoryPackInclude, MemoryPackAllowSerialize] bool Connected => info.Connected; - [MemoryPackInclude, MemoryPackAllowSerialize] - uint Order => info.Order; - [MemoryPackConstructor] - SerializableSignCacheInfo(string id, string machineId, string machineName, string version, string groupId, Dictionary args, DateTime lastSignIn, IPEndPoint ip, bool connected, uint order) + SerializableSignCacheInfo(string machineId, string machineName, string version, string groupId, DateTime lastSignIn, Dictionary args, IPEndPoint ip, bool connected) { var info = new SignCacheInfo { - Id = id, + Id = string.Empty, MachineId = machineId, MachineName = machineName, GroupId = groupId, @@ -114,7 +109,7 @@ namespace linker.plugins.signIn LastSignIn = lastSignIn, IP = ip, Connected = connected, - Order = order + Order = 0 }; this.info = info; } @@ -277,7 +272,6 @@ namespace linker.plugins.signIn - [MemoryPackable] public readonly partial struct SerializableSignInIdsRequestInfo { @@ -394,7 +388,6 @@ namespace linker.plugins.signIn - [MemoryPackable] public readonly partial struct SerializableSignInIdsResponseItemInfo { @@ -409,9 +402,9 @@ namespace linker.plugins.signIn [MemoryPackConstructor] - SerializableSignInIdsResponseItemInfo(string machineId, string machineName ) + SerializableSignInIdsResponseItemInfo(string machineId, string machineName) { - var info = new SignInIdsResponseItemInfo { MachineId = machineId, MachineName = machineName}; + var info = new SignInIdsResponseItemInfo { MachineId = machineId, MachineName = machineName }; this.info = info; } @@ -466,9 +459,9 @@ namespace linker.plugins.signIn [MemoryPackConstructor] - SerializableSignInResponseInfo(bool status,string machineId, string msg) + SerializableSignInResponseInfo(bool status, string machineId, string msg) { - var info = new SignInResponseInfo { Status= status, MachineId = machineId, Msg = msg }; + var info = new SignInResponseInfo { Status = status, MachineId = machineId, Msg = msg }; this.info = info; } @@ -503,4 +496,58 @@ namespace linker.plugins.signIn value = wrapped.info; } } + + + + [MemoryPackable] + public readonly partial struct SerializableSignInConfigSetNameInfo + { + [MemoryPackIgnore] + public readonly SignInConfigSetNameInfo info; + + [MemoryPackInclude] + string Id => info.Id; + + [MemoryPackInclude] + string NewName => info.NewName; + + + [MemoryPackConstructor] + SerializableSignInConfigSetNameInfo(string id, string newName) + { + var info = new SignInConfigSetNameInfo { Id = id, NewName = newName }; + this.info = info; + } + + public SerializableSignInConfigSetNameInfo(SignInConfigSetNameInfo signInfo) + { + this.info = signInfo; + } + } + public class SignInConfigSetNameInfoFormatter : MemoryPackFormatter + { + public override void Serialize(ref MemoryPackWriter writer, scoped ref SignInConfigSetNameInfo value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WritePackable(new SerializableSignInConfigSetNameInfo(value)); + } + + public override void Deserialize(ref MemoryPackReader reader, scoped ref SignInConfigSetNameInfo value) + { + if (reader.PeekIsNull()) + { + reader.Advance(1); // skip null block + value = null; + return; + } + + var wrapped = reader.ReadPackable(); + value = wrapped.info; + } + } } diff --git a/linker.messenger.serializer.memorypack/Socks5Serializer.cs b/linker.messenger.serializer.memorypack/Socks5Serializer.cs new file mode 100644 index 00000000..7a97eabc --- /dev/null +++ b/linker.messenger.serializer.memorypack/Socks5Serializer.cs @@ -0,0 +1,129 @@ +using MemoryPack; +using linker.messenger.access; +using linker.messenger.socks5; +using System.Net; + +namespace linker.messenger.serializer.memorypack +{ + [MemoryPackable] + public readonly partial struct SerializableSocks5LanInfo + { + [MemoryPackIgnore] + public readonly Socks5LanInfo info; + + [MemoryPackInclude, MemoryPackAllowSerialize] + IPAddress IP => info.IP; + + [MemoryPackInclude] + byte PrefixLength => info.PrefixLength; + + [MemoryPackInclude] + bool Disabled => info.Disabled; + + [MemoryPackInclude] + bool Exists => info.Exists; + + [MemoryPackInclude] + string Error => info.Error; + + [MemoryPackConstructor] + SerializableSocks5LanInfo(IPAddress ip, byte prefixLength, bool disabled, bool exists, string error) + { + var info = new Socks5LanInfo { Disabled = disabled, Error = error, Exists = exists, IP = ip, PrefixLength = prefixLength }; + this.info = info; + } + + public SerializableSocks5LanInfo(Socks5LanInfo info) + { + this.info = info; + } + } + public class Socks5LanInfoFormatter : MemoryPackFormatter + { + public override void Serialize(ref MemoryPackWriter writer, scoped ref Socks5LanInfo value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WritePackable(new SerializableSocks5LanInfo(value)); + } + + public override void Deserialize(ref MemoryPackReader reader, scoped ref Socks5LanInfo value) + { + if (reader.PeekIsNull()) + { + reader.Advance(1); // skip null block + value = null; + return; + } + + var wrapped = reader.ReadPackable(); + value = wrapped.info; + } + } + + + [MemoryPackable] + public readonly partial struct SerializableSocks5Info + { + [MemoryPackIgnore] + public readonly Socks5Info info; + + [MemoryPackInclude] + string MachineId => info.MachineId; + + [MemoryPackInclude] + Socks5Status Status => info.Status; + + [MemoryPackInclude] + int Port => info.Port; + + [MemoryPackInclude] + List Lans => info.Lans; + + [MemoryPackInclude] + string SetupError => info.SetupError; + + + [MemoryPackConstructor] + SerializableSocks5Info(string machineId, Socks5Status status, int port, List lans, string setupError) + { + var info = new Socks5Info { MachineId = machineId, Lans = lans, Port = port, SetupError = setupError, Status = status }; + this.info = info; + } + + public SerializableSocks5Info(Socks5Info info) + { + this.info = info; + } + } + public class Socks5InfoFormatter : MemoryPackFormatter + { + public override void Serialize(ref MemoryPackWriter writer, scoped ref Socks5Info value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WritePackable(new SerializableSocks5Info(value)); + } + + public override void Deserialize(ref MemoryPackReader reader, scoped ref Socks5Info value) + { + if (reader.PeekIsNull()) + { + reader.Advance(1); // skip null block + value = null; + return; + } + + var wrapped = reader.ReadPackable(); + value = wrapped.info; + } + } +} diff --git a/linker.messenger.serializer.memorypack/SyncSerializer.cs b/linker.messenger.serializer.memorypack/SyncSerializer.cs new file mode 100644 index 00000000..c2674bd4 --- /dev/null +++ b/linker.messenger.serializer.memorypack/SyncSerializer.cs @@ -0,0 +1,59 @@ +using linker.messenger.sync; +using MemoryPack; + +namespace linker.messenger.serializer.memorypack +{ + + + [MemoryPackable] + public readonly partial struct SerializableSyncInfo + { + [MemoryPackIgnore] + public readonly SyncInfo info; + + [MemoryPackInclude] + string Name => info.Name; + + [MemoryPackInclude] + Memory Data => info.Data; + + + [MemoryPackConstructor] + SerializableSyncInfo(string name, Memory data) + { + var info = new SyncInfo { Name = name, Data = data }; + this.info = info; + } + + public SerializableSyncInfo(SyncInfo signInfo) + { + this.info = signInfo; + } + } + public class SyncInfoFormatter : MemoryPackFormatter + { + public override void Serialize(ref MemoryPackWriter writer, scoped ref SyncInfo value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WritePackable(new SerializableSyncInfo(value)); + } + + public override void Deserialize(ref MemoryPackReader reader, scoped ref SyncInfo value) + { + if (reader.PeekIsNull()) + { + reader.Advance(1); // skip null block + value = null; + return; + } + + var wrapped = reader.ReadPackable(); + value = wrapped.info; + } + } +} diff --git a/linker/serializer/TunnelConnectionFormatter.cs b/linker.messenger.serializer.memorypack/TunnelConnectionFormatter.cs similarity index 93% rename from linker/serializer/TunnelConnectionFormatter.cs rename to linker.messenger.serializer.memorypack/TunnelConnectionFormatter.cs index 20297269..8d627680 100644 --- a/linker/serializer/TunnelConnectionFormatter.cs +++ b/linker.messenger.serializer.memorypack/TunnelConnectionFormatter.cs @@ -1,7 +1,7 @@ using linker.tunnel.connection; using MemoryPack; -namespace linker.serializer +namespace linker.messenger.serializer.memorypack { /// /// MemoryPack 的ITunnelConnection序列化扩展 diff --git a/linker/plugins/tunnel/PlusTunnelSerializer.cs b/linker.messenger.serializer.memorypack/TunnelSerializer.cs similarity index 71% rename from linker/plugins/tunnel/PlusTunnelSerializer.cs rename to linker.messenger.serializer.memorypack/TunnelSerializer.cs index f651a290..3a57a6c9 100644 --- a/linker/plugins/tunnel/PlusTunnelSerializer.cs +++ b/linker.messenger.serializer.memorypack/TunnelSerializer.cs @@ -1,10 +1,11 @@ using linker.tunnel.connection; using linker.tunnel.transport; using linker.tunnel.wanport; -using MemoryPack; using System.Net; +using MemoryPack; +using linker.messenger.tunnel; -namespace linker.plugins.tunnel +namespace linker.messenger.serializer.memorypack { [MemoryPackable] public readonly partial struct SerializableTunnelWanPortProtocolInfo @@ -296,4 +297,123 @@ namespace linker.plugins.tunnel value = wrapped.tunnelTransportInfo; } } + + + + [MemoryPackable] + public readonly partial struct SerializableTunnelRouteLevelInfo + { + [MemoryPackIgnore] + public readonly TunnelRouteLevelInfo info; + + [MemoryPackInclude] + string MachineId => info.MachineId; + + [MemoryPackInclude] + int RouteLevel => info.RouteLevel; + [MemoryPackInclude] + int RouteLevelPlus => info.RouteLevelPlus; + + [MemoryPackInclude] + bool NeedReboot => info.NeedReboot; + + [MemoryPackInclude] + int PortMapWan => info.PortMapWan; + [MemoryPackInclude] + int PortMapLan => info.PortMapLan; + + [MemoryPackConstructor] + SerializableTunnelRouteLevelInfo(string machineId, int routeLevel, int routeLevelPlus, bool needReboot, int portMapWan, int portMapLan) + { + var info = new TunnelRouteLevelInfo { MachineId = machineId, NeedReboot = needReboot, PortMapWan = portMapWan, PortMapLan = portMapLan, RouteLevel = routeLevel, RouteLevelPlus = routeLevelPlus }; + this.info = info; + } + + public SerializableTunnelRouteLevelInfo(TunnelRouteLevelInfo tunnelCompactInfo) + { + this.info = tunnelCompactInfo; + } + } + public class TunnelRouteLevelInfoFormatter : MemoryPackFormatter + { + public override void Serialize(ref MemoryPackWriter writer, scoped ref TunnelRouteLevelInfo value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WritePackable(new SerializableTunnelRouteLevelInfo(value)); + } + + public override void Deserialize(ref MemoryPackReader reader, scoped ref TunnelRouteLevelInfo value) + { + if (reader.PeekIsNull()) + { + reader.Advance(1); // skip null block + value = null; + return; + } + + var wrapped = reader.ReadPackable(); + value = wrapped.info; + } + } + + [MemoryPackable] + public readonly partial struct SerializableTunnelSetRouteLevelInfo + { + [MemoryPackIgnore] + public readonly TunnelSetRouteLevelInfo info; + + [MemoryPackInclude] + string MachineId => info.MachineId; + + [MemoryPackInclude] + int RouteLevelPlus => info.RouteLevelPlus; + + [MemoryPackInclude] + int PortMapWan => info.PortMapWan; + [MemoryPackInclude] + int PortMapLan => info.PortMapLan; + + [MemoryPackConstructor] + SerializableTunnelSetRouteLevelInfo(string machineId, int routeLevelPlus, int portMapWan, int portMapLan) + { + var info = new TunnelSetRouteLevelInfo { MachineId = machineId, PortMapWan = portMapWan, PortMapLan = portMapLan, RouteLevelPlus = routeLevelPlus }; + this.info = info; + } + + public SerializableTunnelSetRouteLevelInfo(TunnelSetRouteLevelInfo tunnelCompactInfo) + { + this.info = tunnelCompactInfo; + } + } + public class TunnelSetRouteLevelInfoFormatter : MemoryPackFormatter + { + public override void Serialize(ref MemoryPackWriter writer, scoped ref TunnelSetRouteLevelInfo value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WritePackable(new SerializableTunnelSetRouteLevelInfo(value)); + } + + public override void Deserialize(ref MemoryPackReader reader, scoped ref TunnelSetRouteLevelInfo value) + { + if (reader.PeekIsNull()) + { + reader.Advance(1); // skip null block + value = null; + return; + } + + var wrapped = reader.ReadPackable(); + value = wrapped.info; + } + } } diff --git a/linker.messenger.serializer.memorypack/UpdaterSerializer.cs b/linker.messenger.serializer.memorypack/UpdaterSerializer.cs new file mode 100644 index 00000000..4dacd7c7 --- /dev/null +++ b/linker.messenger.serializer.memorypack/UpdaterSerializer.cs @@ -0,0 +1,226 @@ +using MemoryPack; +using linker.messenger.updater; + +namespace linker.messenger.serializer.memorypack +{ + [MemoryPackable] + public readonly partial struct SerializableUpdaterConfirmInfo + { + [MemoryPackIgnore] + public readonly UpdaterConfirmInfo info; + + [MemoryPackInclude] + string MachineId => info.MachineId; + + [MemoryPackInclude] + string Version => info.Version; + + [MemoryPackInclude] + string SecretKey => info.SecretKey; + + [MemoryPackInclude] + bool GroupAll => info.GroupAll; + + [MemoryPackInclude] + bool All => info.All; + + [MemoryPackConstructor] + SerializableUpdaterConfirmInfo(string machineId, string version, string secretKey, bool groupAll, bool all) + { + var info = new UpdaterConfirmInfo { MachineId = machineId, SecretKey = secretKey, All = all, GroupAll = groupAll, Version = version }; + this.info = info; + } + + public SerializableUpdaterConfirmInfo(UpdaterConfirmInfo info) + { + this.info = info; + } + } + public class UpdaterConfirmInfoFormatter : MemoryPackFormatter + { + public override void Serialize(ref MemoryPackWriter writer, scoped ref UpdaterConfirmInfo value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WritePackable(new SerializableUpdaterConfirmInfo(value)); + } + + public override void Deserialize(ref MemoryPackReader reader, scoped ref UpdaterConfirmInfo value) + { + if (reader.PeekIsNull()) + { + reader.Advance(1); // skip null block + value = null; + return; + } + + var wrapped = reader.ReadPackable(); + value = wrapped.info; + } + } + + + [MemoryPackable] + public readonly partial struct SerializableUpdaterConfirmServerInfo + { + [MemoryPackIgnore] + public readonly UpdaterConfirmServerInfo info; + + [MemoryPackInclude] + string Version => info.Version; + + [MemoryPackInclude] + string SecretKey => info.SecretKey; + + [MemoryPackConstructor] + SerializableUpdaterConfirmServerInfo(string version, string secretKey) + { + var info = new UpdaterConfirmServerInfo { SecretKey = secretKey, Version = version }; + this.info = info; + } + + public SerializableUpdaterConfirmServerInfo(UpdaterConfirmServerInfo info) + { + this.info = info; + } + } + public class UpdaterConfirmServerInfoFormatter : MemoryPackFormatter + { + public override void Serialize(ref MemoryPackWriter writer, scoped ref UpdaterConfirmServerInfo value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WritePackable(new SerializableUpdaterConfirmServerInfo(value)); + } + + public override void Deserialize(ref MemoryPackReader reader, scoped ref UpdaterConfirmServerInfo value) + { + if (reader.PeekIsNull()) + { + reader.Advance(1); // skip null block + value = null; + return; + } + + var wrapped = reader.ReadPackable(); + value = wrapped.info; + } + } + + + [MemoryPackable] + public readonly partial struct SerializableUpdateClientInfo + { + [MemoryPackIgnore] + public readonly UpdaterClientInfo info; + + [MemoryPackInclude] + string[] ToMachines => info.ToMachines; + + [MemoryPackInclude, MemoryPackAllowSerialize] + UpdaterInfo Info => info.Info; + + [MemoryPackConstructor] + SerializableUpdateClientInfo(string[] toMachines, UpdaterInfo info) + { + this.info = new UpdaterClientInfo { ToMachines = ToMachines, Info = info }; + } + + public SerializableUpdateClientInfo(UpdaterClientInfo info) + { + this.info = info; + } + } + public class UpdaterClientInfoFormatter : MemoryPackFormatter + { + public override void Serialize(ref MemoryPackWriter writer, scoped ref UpdaterClientInfo value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WritePackable(new SerializableUpdateClientInfo(value)); + } + + public override void Deserialize(ref MemoryPackReader reader, scoped ref UpdaterClientInfo value) + { + if (reader.PeekIsNull()) + { + reader.Advance(1); // skip null block + value = null; + return; + } + + var wrapped = reader.ReadPackable(); + value = wrapped.info; + } + } + + + + [MemoryPackable] + public readonly partial struct SerializableUpdateInfo + { + [MemoryPackIgnore] + public readonly UpdaterInfo info; + + [MemoryPackInclude] + string MachineId => info.MachineId; + + [MemoryPackInclude] + UpdaterStatus Status => info.Status; + + [MemoryPackInclude] + long Length => info.Length; + + [MemoryPackInclude] + long Current => info.Current; + + [MemoryPackConstructor] + SerializableUpdateInfo(string machineId, UpdaterStatus status, long length, long current) + { + this.info = new UpdaterInfo { MachineId = machineId, Status = status, Length = length, Current = current }; + } + + public SerializableUpdateInfo(UpdaterInfo info) + { + this.info = info; + } + } + public class UpdaterInfoFormatter : MemoryPackFormatter + { + public override void Serialize(ref MemoryPackWriter writer, scoped ref UpdaterInfo value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WritePackable(new SerializableUpdateInfo(value)); + } + + public override void Deserialize(ref MemoryPackReader reader, scoped ref UpdaterInfo value) + { + if (reader.PeekIsNull()) + { + reader.Advance(1); // skip null block + value = null; + return; + } + + var wrapped = reader.ReadPackable(); + value = wrapped.info; + } + } +} diff --git a/linker.messenger.serializer.memorypack/linker.messenger.serializer.memorypack.csproj b/linker.messenger.serializer.memorypack/linker.messenger.serializer.memorypack.csproj new file mode 100644 index 00000000..214114f3 --- /dev/null +++ b/linker.messenger.serializer.memorypack/linker.messenger.serializer.memorypack.csproj @@ -0,0 +1,50 @@ + + + + net8.0 + enable + disable + true + false + true + True + linker messenger serializer memorypack + snltty + snltty + linker messenger serializer memorypack + snltty + https://github.com/snltty/linker + https://github.com/snltty/linker + linker messenger serializer memorypack + 1.6.4 + 1.6.4 + 1.6.4 + + + + full + true + + + none + false + True + + + + + + + + + + + + + + + + + + + diff --git a/linker.messenger.signin/Config.cs b/linker.messenger.signin/Config.cs new file mode 100644 index 00000000..1599912e --- /dev/null +++ b/linker.messenger.signin/Config.cs @@ -0,0 +1,58 @@ +using linker.libs; +using linker.libs.extends; + +namespace linker.messenger.signin +{ + public sealed partial class SignInClientGroupInfo + { + public SignInClientGroupInfo() { } + + public string Name { get; set; } = Helper.GlobalString; + +#if DEBUG + private string id = Helper.GlobalString; +#else + private string id = string.Empty; +#endif + public string Id + { + get => id; set + { + id = value.SubStr(0, 36); + } + } + +#if DEBUG + private string passord = Helper.GlobalString; +#else + private string passord = string.Empty; +#endif + public string Password + { + get => passord; set + { + passord = value.SubStr(0, 36); + } + } + } + + public sealed partial class SignInClientServerInfo + { + public SignInClientServerInfo() { } + public string Name { get; set; } = string.Empty; + public string Host { get; set; } = string.Empty; + public string SecretKey { get; set; } = string.Empty; + + } + + public sealed class SignInConfigServerInfo + { + public string SecretKey { get; set; } = string.Empty; + } + + public sealed partial class SignInConfigSetNameInfo + { + public string Id { get; set; } + public string NewName { get; set; } + } +} diff --git a/linker.messenger.signin/Entry.cs b/linker.messenger.signin/Entry.cs new file mode 100644 index 00000000..243e5c69 --- /dev/null +++ b/linker.messenger.signin/Entry.cs @@ -0,0 +1,84 @@ +using linker.libs; +using linker.libs.api; +using linker.messenger.exroute; +using linker.messenger.signin.args; +using Microsoft.Extensions.DependencyInjection; +namespace linker.messenger.signin +{ + public static class Entry + { + public static ServiceCollection AddSignInClient(this ServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + + return serviceCollection; + } + public static ServiceProvider UseSignInClient(this ServiceProvider serviceProvider) + { + SignInArgsTransfer signInArgsTransfer = serviceProvider.GetService(); + signInArgsTransfer.AddArgs(new List { + serviceProvider.GetService(), + serviceProvider.GetService(), + serviceProvider.GetService(), + serviceProvider.GetService(), + }); + + linker.messenger.api.IApiServer apiServer = serviceProvider.GetService(); + apiServer.AddPlugins(new List { + serviceProvider.GetService() + }); + + ExRouteTransfer exRouteTransfer= serviceProvider.GetService(); + exRouteTransfer.AddExRoutes(new List { serviceProvider.GetService() }); + + LoggerHelper.Instance.Info($"start signin"); + LoggerHelper.Instance.Info($"start signin transfer"); + SignInClientTransfer clientTransfer = serviceProvider.GetService(); + clientTransfer.SignInTask(); + + return serviceProvider; + } + + + public static ServiceCollection AddSignInServer(this ServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + return serviceCollection; + } + public static ServiceProvider UseSignInServer(this ServiceProvider serviceProvider) + { + IMessengerResolver messengerResolver = serviceProvider.GetService(); + messengerResolver.AddMessenger(new List { serviceProvider.GetService() }); + + SignInServerCaching signInServerCaching = serviceProvider.GetService(); + + SignInArgsTransfer signInArgsTransfer = serviceProvider.GetService(); + signInArgsTransfer.AddArgs(new List { + serviceProvider.GetService(), + serviceProvider.GetService(), + serviceProvider.GetService(), + serviceProvider.GetService(), + }); + + return serviceProvider; + } + } +} diff --git a/linker.messenger.signin/ISignInClientStore.cs b/linker.messenger.signin/ISignInClientStore.cs new file mode 100644 index 00000000..9ddacd09 --- /dev/null +++ b/linker.messenger.signin/ISignInClientStore.cs @@ -0,0 +1,18 @@ +namespace linker.messenger.signin +{ + public interface ISignInClientStore + { + public SignInClientServerInfo Server { get; } + public SignInClientGroupInfo Group { get; } + public string Id { get; } + public string Name { get; } + + public void SetName(string newName); + public void SetGroup(SignInClientGroupInfo groups); + public void SetGroupPassword(string password); + public void SetServer(SignInClientServerInfo servers); + public void SetSecretKey(string secretKey); + public void SetId(string id); + } + +} diff --git a/linker.signin/ISignInStore.cs b/linker.messenger.signin/ISignInServerStore.cs similarity index 63% rename from linker.signin/ISignInStore.cs rename to linker.messenger.signin/ISignInServerStore.cs index 89915110..9e2e854d 100644 --- a/linker.signin/ISignInStore.cs +++ b/linker.messenger.signin/ISignInServerStore.cs @@ -5,8 +5,8 @@ namespace linker.messenger.signin /// /// 登录持久化,不想保存可以不存,实现接口就行 /// - public interface ISignInStore : IStore + public interface ISignInServerStore : IStore { - + public string SecretKey { get; } } } diff --git a/linker.messenger.signin/SignInApiController.cs b/linker.messenger.signin/SignInApiController.cs new file mode 100644 index 00000000..cbee7603 --- /dev/null +++ b/linker.messenger.signin/SignInApiController.cs @@ -0,0 +1,129 @@ +using linker.libs; +using linker.libs.api; +using linker.libs.extends; + +namespace linker.messenger.signin +{ + public sealed class SignInApiController : IApiController + { + private readonly SignInClientState signInClientState; + private readonly ISignInClientStore signInClientStore; + private readonly IMessengerSender messengerSender; + private readonly SignInClientTransfer signInClientTransfer; + private readonly ISerializer serializer; + + public SignInApiController( SignInClientState signInClientState, ISignInClientStore signInClientStore, IMessengerSender messengerSender,SignInClientTransfer signInClientTransfer, ISerializer serializer) + { + this.signInClientState = signInClientState; + this.signInClientStore = signInClientStore; + this.messengerSender = messengerSender; + this.signInClientTransfer = signInClientTransfer; + this.serializer = serializer; + } + + public void Set(ApiControllerParamsInfo param) + { + ConfigSetInfo info = param.Content.DeJson(); + signInClientStore.SetName(info.Name); + signInClientStore.SetGroup(info.Groups[0]); + signInClientTransfer.ReSignIn(); + } + + public async Task SetName(ApiControllerParamsInfo param) + { + SignInConfigSetNameInfo info = param.Content.DeJson(); + + if (info.Id == signInClientStore.Id) + { + signInClientStore.SetName(info.NewName); + signInClientTransfer.ReSignIn(); + } + else + { + await messengerSender.SendOnly(new MessageRequestWrap + { + Connection = signInClientState.Connection, + MessengerId = (ushort)SignInMessengerIds.SetNameForward, + Payload = serializer.Serialize(info) + }).ConfigureAwait(false); + } + return true; + } + public void SetGroups(ApiControllerParamsInfo param) + { + SignInClientGroupInfo[] info = param.Content.DeJson(); + signInClientStore.SetGroup(info[0]); + //signInClientTransfer.ReSignIn(); + } + + public bool SetServers(ApiControllerParamsInfo param) + { + SignInClientServerInfo servers = param.Content.DeJson(); + signInClientStore.SetServer(servers); + //signInClientTransfer.ReSignIn(); + return true; + } + + public SignInClientState Info(ApiControllerParamsInfo param) + { + return signInClientState; + } + + public async Task Del(ApiControllerParamsInfo param) + { + await messengerSender.SendOnly(new MessageRequestWrap + { + Connection = signInClientState.Connection, + MessengerId = (ushort)SignInMessengerIds.Delete, + Payload = serializer.Serialize(param.Content) + }).ConfigureAwait(false); + } + public async Task SetOrder(ApiControllerParamsInfo param) + { + await messengerSender.SendOnly(new MessageRequestWrap + { + Connection = signInClientState.Connection, + MessengerId = (ushort)SignInMessengerIds.SetOrder, + Payload = serializer.Serialize(param.Content.DeJson()) + }).ConfigureAwait(false); + } + public async Task List(ApiControllerParamsInfo param) + { + SignInListRequestInfo request = param.Content.DeJson(); + MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap + { + Connection = signInClientState.Connection, + MessengerId = (ushort)SignInMessengerIds.List, + Payload = serializer.Serialize(request) + }).ConfigureAwait(false); + if (resp.Code == MessageResponeCodes.OK) + { + return serializer.Deserialize(resp.Data.Span); + } + return new SignInListResponseInfo { }; + } + public async Task Ids(ApiControllerParamsInfo param) + { + SignInIdsRequestInfo request = param.Content.DeJson(); + MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap + { + Connection = signInClientState.Connection, + MessengerId = (ushort)SignInMessengerIds.Ids, + Payload = serializer.Serialize(request) + }).ConfigureAwait(false); + if (resp.Code == MessageResponeCodes.OK) + { + return serializer.Deserialize(resp.Data.Span); + } + return new SignInIdsResponseInfo { }; + } + + } + + public sealed class ConfigSetInfo + { + public string Name { get; set; } + public SignInClientGroupInfo[] Groups { get; set; } + } + +} diff --git a/linker/plugins/client/ClientSignInState.cs b/linker.messenger.signin/SignInClientState.cs similarity index 87% rename from linker/plugins/client/ClientSignInState.cs rename to linker.messenger.signin/SignInClientState.cs index 9e2b74d2..f5e01db7 100644 --- a/linker/plugins/client/ClientSignInState.cs +++ b/linker.messenger.signin/SignInClientState.cs @@ -1,16 +1,13 @@ -using linker.messenger; -using linker.plugins.messenger; -using System.Text.Json.Serialization; - -namespace linker.plugins.client +using System.Text.Json.Serialization; +namespace linker.messenger.signin { /// /// 登入对象 /// - public sealed class ClientSignInState + public sealed class SignInClientState { - public ClientSignInState() + public SignInClientState() { AppDomain.CurrentDomain.ProcessExit += (s, e) => Disponse(); Console.CancelKeyPress += (s, e) => Disponse(); diff --git a/linker/plugins/client/ClientSignInTransfer.cs b/linker.messenger.signin/SignInClientTransfer.cs similarity index 81% rename from linker/plugins/client/ClientSignInTransfer.cs rename to linker.messenger.signin/SignInClientTransfer.cs index 4f0345e2..3729d15c 100644 --- a/linker/plugins/client/ClientSignInTransfer.cs +++ b/linker.messenger.signin/SignInClientTransfer.cs @@ -1,32 +1,32 @@ using linker.libs; using linker.libs.extends; -using MemoryPack; using System.Net; using System.Net.Sockets; -using linker.messenger; -using linker.plugins.resolver; -using linker.messenger.signin; +using linker.messenger.signin.args; -namespace linker.plugins.client +namespace linker.messenger.signin { /// /// 登入 /// - public sealed class ClientSignInTransfer + public sealed class SignInClientTransfer { - private readonly ClientSignInState clientSignInState; + private readonly SignInClientState clientSignInState; private readonly IMessengerSender messengerSender; private readonly IMessengerResolver messengerResolver; private readonly SignInArgsTransfer signInArgsTransfer; - private readonly ClientConfigTransfer clientConfigTransfer; + private readonly ISignInClientStore signInClientStore; + private readonly ISerializer serializer; - public ClientSignInTransfer(ClientSignInState clientSignInState, IMessengerSender messengerSender, IMessengerResolver messengerResolver, SignInArgsTransfer signInArgsTransfer, ClientConfigTransfer clientConfigTransfer) + public SignInClientTransfer(SignInClientState clientSignInState, IMessengerSender messengerSender, IMessengerResolver messengerResolver, + SignInArgsTransfer signInArgsTransfer, ISignInClientStore signInClientStore, ISerializer serializer) { this.clientSignInState = clientSignInState; this.messengerSender = messengerSender; this.messengerResolver = messengerResolver; this.signInArgsTransfer = signInArgsTransfer; - this.clientConfigTransfer = clientConfigTransfer; + this.signInClientStore = signInClientStore; + this.serializer = serializer; } /// @@ -64,7 +64,7 @@ namespace linker.plugins.client /// public async Task SignIn() { - if (string.IsNullOrWhiteSpace(clientConfigTransfer.Group.Id)) + if (string.IsNullOrWhiteSpace(signInClientStore.Group.Id)) { LoggerHelper.Instance.Error($"please configure group id"); return; @@ -77,13 +77,13 @@ namespace linker.plugins.client try { if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) - LoggerHelper.Instance.Info($"connect to signin server:{clientConfigTransfer.Server.Host}"); + LoggerHelper.Instance.Info($"connect to signin server:{signInClientStore.Server.Host}"); - IPEndPoint ip = await NetworkHelper.GetEndPointAsync(clientConfigTransfer.Server.Host, 1802); + IPEndPoint ip = await NetworkHelper.GetEndPointAsync(signInClientStore.Server.Host, 1802); if (ip == null) { if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) - LoggerHelper.Instance.Error($"get domain ip fail:{clientConfigTransfer.Server.Host}"); + LoggerHelper.Instance.Error($"get domain ip fail:{signInClientStore.Server.Host}"); return; } @@ -133,7 +133,7 @@ namespace linker.plugins.client private async Task SignIn2Server() { Dictionary args = []; - string argResult = await signInArgsTransfer.Invoke(clientConfigTransfer.Server.Host, args); + string argResult = await signInArgsTransfer.Invoke(signInClientStore.Server.Host, args); if (string.IsNullOrWhiteSpace(argResult) == false) { LoggerHelper.Instance.Error(argResult); @@ -145,13 +145,13 @@ namespace linker.plugins.client { Connection = clientSignInState.Connection, MessengerId = (ushort)SignInMessengerIds.SignIn_V_1_3_1, - Payload = MemoryPackSerializer.Serialize(new SignInfo + Payload = serializer.Serialize(new SignInfo { - MachineName = clientConfigTransfer.Name, - MachineId = clientConfigTransfer.Id, + MachineName = signInClientStore.Name, + MachineId = signInClientStore.Id, Version = VersionHelper.version, Args = args, - GroupId = clientConfigTransfer.Group.Id, + GroupId = signInClientStore.Group.Id, }) }).ConfigureAwait(false); if (resp.Code != MessageResponeCodes.OK) @@ -161,14 +161,16 @@ namespace linker.plugins.client return false; } - SignInResponseInfo signResp = MemoryPackSerializer.Deserialize(resp.Data.Span).DeJson(); + SignInResponseInfo signResp = serializer.Deserialize(resp.Data.Span).DeJson(); if (signResp.Status == false) { LoggerHelper.Instance.Error($"sign in fail : {signResp.Msg}"); clientSignInState.Connection?.Disponse(6); return false; } - clientConfigTransfer.SetId(signResp.MachineId); + clientSignInState.Connection.Id = signResp.MachineId; + clientSignInState.Connection.Name = signInClientStore.Name; + signInClientStore.SetId(signResp.MachineId); return true; } @@ -194,7 +196,7 @@ namespace linker.plugins.client }).ConfigureAwait(false); if (resp.Code == MessageResponeCodes.OK) { - clientSignInState.Version = MemoryPackSerializer.Deserialize(resp.Data.Span); + clientSignInState.Version = serializer.Deserialize(resp.Data.Span); } else { @@ -218,7 +220,7 @@ namespace linker.plugins.client { Connection = clientSignInState.Connection, MessengerId = (ushort)SignInMessengerIds.Online, - Payload = MemoryPackSerializer.Serialize(machineId), + Payload = serializer.Serialize(machineId), Timeout = 3000 }); @@ -238,7 +240,7 @@ namespace linker.plugins.client }); if (resp.Code == MessageResponeCodes.OK) { - return MemoryPackSerializer.Deserialize(resp.Data.Span); + return serializer.Deserialize(resp.Data.Span); } return string.Empty; diff --git a/linker.messenger.signin/SignInExRoute.cs b/linker.messenger.signin/SignInExRoute.cs new file mode 100644 index 00000000..34087a35 --- /dev/null +++ b/linker.messenger.signin/SignInExRoute.cs @@ -0,0 +1,18 @@ +using linker.messenger.exroute; +using System.Net; + +namespace linker.messenger.signin +{ + public sealed class SignInExRoute : IExRoute + { + private readonly SignInClientState signInClientState; + public SignInExRoute(SignInClientState signInClientState) + { + this.signInClientState = signInClientState; + } + public List Get() + { + return new List { signInClientState.Connection?.Address.Address ?? IPAddress.Any }; + } + } +} diff --git a/linker.signin/SignInMessenger.cs b/linker.messenger.signin/SignInMessenger.cs similarity index 83% rename from linker.signin/SignInMessenger.cs rename to linker.messenger.signin/SignInMessenger.cs index 096dbb03..2edca3b7 100644 --- a/linker.signin/SignInMessenger.cs +++ b/linker.messenger.signin/SignInMessenger.cs @@ -3,16 +3,40 @@ using linker.libs.extends; namespace linker.messenger.signin { + /// + /// + /// + public sealed class SignInClientMessenger : IMessenger + { + private readonly ISignInClientStore signInClientStore; + private readonly SignInClientTransfer signInClientTransfer; + private readonly ISerializer serializer; + public SignInClientMessenger(ISignInClientStore signInClientStore, SignInClientTransfer signInClientTransfer, ISerializer serializer) + { + this.signInClientStore = signInClientStore; + this.signInClientTransfer = signInClientTransfer; + this.serializer = serializer; + } + + [MessengerId((ushort)SignInMessengerIds.SetName)] + public void Name(IConnection connection) + { + SignInConfigSetNameInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + signInClientStore.SetName(info.NewName); + signInClientTransfer.ReSignIn(); + } + + } /// /// 登录的服务端信标 /// public class SignInServerMessenger : IMessenger { - private readonly SignCaching signCaching; + private readonly SignInServerCaching signCaching; private readonly IMessengerSender messengerSender; private readonly ISerializer serializer; - public SignInServerMessenger(IMessengerSender messengerSender, SignCaching signCaching, ISerializer serializer) + public SignInServerMessenger(IMessengerSender messengerSender, SignInServerCaching signCaching, ISerializer serializer) { this.signCaching = signCaching; this.messengerSender = messengerSender; @@ -197,6 +221,25 @@ namespace linker.messenger.signin { connection.Write(serializer.Serialize(signCaching.NewId())); } + + + [MessengerId((ushort)SignInMessengerIds.SetNameForward)] + public async Task NameForward(IConnection connection) + { + SignInConfigSetNameInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + if (signCaching.TryGet(info.Id, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId) + { + if (info.Id != connection.Id) + { + await messengerSender.SendOnly(new MessageRequestWrap + { + Connection = cache.Connection, + MessengerId = (ushort)SignInMessengerIds.SetName, + Payload = connection.ReceiveRequestWrap.Payload, + }).ConfigureAwait(false); + } + } + } } /// diff --git a/linker.signin/SignInMessengerIds.cs b/linker.messenger.signin/SignInMessengerIds.cs similarity index 100% rename from linker.signin/SignInMessengerIds.cs rename to linker.messenger.signin/SignInMessengerIds.cs diff --git a/linker.signin/SignCaching.cs b/linker.messenger.signin/SignInServerCaching.cs similarity index 96% rename from linker.signin/SignCaching.cs rename to linker.messenger.signin/SignInServerCaching.cs index b187535e..79465156 100644 --- a/linker.signin/SignCaching.cs +++ b/linker.messenger.signin/SignInServerCaching.cs @@ -1,4 +1,5 @@ using linker.libs; +using linker.messenger.signin.args; using System.Collections.Concurrent; using System.Net; @@ -7,14 +8,14 @@ namespace linker.messenger.signin /// /// 登录缓存 /// - public sealed class SignCaching + public sealed class SignInServerCaching { private readonly SignInArgsTransfer signInArgsTransfer; - private readonly ISignInStore signInStore; + private readonly ISignInServerStore signInStore; public ConcurrentDictionary Clients { get; set; } = new ConcurrentDictionary(); - public SignCaching(ISignInStore signInStore, SignInArgsTransfer signInArgsTransfer) + public SignInServerCaching(ISignInServerStore signInStore, SignInArgsTransfer signInArgsTransfer) { this.signInStore = signInStore; this.signInArgsTransfer = signInArgsTransfer; diff --git a/linker.signin/ISignInArgs.cs b/linker.messenger.signin/args/ISignInArgs.cs similarity index 94% rename from linker.signin/ISignInArgs.cs rename to linker.messenger.signin/args/ISignInArgs.cs index 6546079c..78fb5a1b 100644 --- a/linker.signin/ISignInArgs.cs +++ b/linker.messenger.signin/args/ISignInArgs.cs @@ -1,4 +1,4 @@ -namespace linker.messenger.signin +namespace linker.messenger.signin.args { /// /// 登录参数处理 diff --git a/linker/plugins/client/SignInArgsGroupPassword.cs b/linker.messenger.signin/args/SignInArgsGroupPassword.cs similarity index 80% rename from linker/plugins/client/SignInArgsGroupPassword.cs rename to linker.messenger.signin/args/SignInArgsGroupPassword.cs index a8467cf1..94f1c388 100644 --- a/linker/plugins/client/SignInArgsGroupPassword.cs +++ b/linker.messenger.signin/args/SignInArgsGroupPassword.cs @@ -1,21 +1,18 @@ - -using linker.messenger.signin; - -namespace linker.plugins.client +namespace linker.messenger.signin.args { /// /// 添加分组密码 /// public sealed class SignInArgsGroupPasswordClient : ISignInArgs { - private readonly ClientConfigTransfer clientConfigTransfer; - public SignInArgsGroupPasswordClient( ClientConfigTransfer clientConfigTransfer) + private readonly ISignInClientStore signInClientStore; + public SignInArgsGroupPasswordClient(ISignInClientStore signInClientStore) { - this.clientConfigTransfer = clientConfigTransfer; + this.signInClientStore = signInClientStore; } public async Task Invoke(string host, Dictionary args) { - args.TryAdd("signin-gpwd", clientConfigTransfer.Group.Password); + args.TryAdd("signin-gpwd", signInClientStore.Group.Password); await Task.CompletedTask; return string.Empty; } diff --git a/linker/plugins/signIn/args/SignInArgsMachineKey.cs b/linker.messenger.signin/args/SignInArgsMachineKey.cs similarity index 96% rename from linker/plugins/signIn/args/SignInArgsMachineKey.cs rename to linker.messenger.signin/args/SignInArgsMachineKey.cs index 7075734c..eb175113 100644 --- a/linker/plugins/signIn/args/SignInArgsMachineKey.cs +++ b/linker.messenger.signin/args/SignInArgsMachineKey.cs @@ -1,7 +1,8 @@ using linker.libs; using linker.messenger.signin; +using linker.messenger.signin.args; -namespace linker.plugins.signIn.args +namespace linker.messenger.signin.args { /// /// 给登录加一个唯一ID的参数 diff --git a/linker/plugins/client/SignInArgsSecretKey.cs b/linker.messenger.signin/args/SignInArgsSecretKey.cs similarity index 58% rename from linker/plugins/client/SignInArgsSecretKey.cs rename to linker.messenger.signin/args/SignInArgsSecretKey.cs index 5c82f8b7..de557373 100644 --- a/linker/plugins/client/SignInArgsSecretKey.cs +++ b/linker.messenger.signin/args/SignInArgsSecretKey.cs @@ -1,24 +1,18 @@ -using linker.config; -using linker.plugins.signIn; -using linker.messenger.signin; - -namespace linker.plugins.client +namespace linker.messenger.signin.args { /// /// 给登录加一个唯一ID的参数 /// public sealed class SignInArgsSecretKeyClient : ISignInArgs { - private readonly FileConfig fileConfig; - private readonly ClientConfigTransfer clientConfigTransfer; - public SignInArgsSecretKeyClient(FileConfig fileConfig, ClientConfigTransfer clientConfigTransfer) + private readonly ISignInClientStore signInClientStore; + public SignInArgsSecretKeyClient(ISignInClientStore signInClientStore) { - this.fileConfig = fileConfig; - this.clientConfigTransfer = clientConfigTransfer; + this.signInClientStore = signInClientStore; } public async Task Invoke(string host, Dictionary args) { - args.TryAdd("signin-secretkey", clientConfigTransfer.Server.SecretKey); + args.TryAdd("signin-secretkey", signInClientStore.Server.SecretKey); await Task.CompletedTask; return string.Empty; } @@ -35,12 +29,10 @@ namespace linker.plugins.client /// public sealed class SignInArgsSecretKeyServer : ISignInArgs { - private readonly FileConfig fileConfig; - private readonly SignInConfigTransfer signInConfigTransfer; - public SignInArgsSecretKeyServer(FileConfig fileConfig, SignInConfigTransfer signInConfigTransfer) + private readonly ISignInServerStore signInServerStore; + public SignInArgsSecretKeyServer(ISignInServerStore signInServerStore) { - this.fileConfig = fileConfig; - this.signInConfigTransfer = signInConfigTransfer; + this.signInServerStore = signInServerStore; } public async Task Invoke(string host, Dictionary args) { @@ -56,9 +48,9 @@ namespace linker.plugins.client /// public async Task Validate(SignInfo signInfo, SignCacheInfo cache) { - if (string.IsNullOrWhiteSpace(signInConfigTransfer.SecretKey) == false) + if (string.IsNullOrWhiteSpace(signInServerStore.SecretKey) == false) { - if (signInfo.Args.TryGetValue("signin-secretkey", out string secretkey) == false || secretkey != signInConfigTransfer.SecretKey) + if (signInfo.Args.TryGetValue("signin-secretkey", out string secretkey) == false || secretkey != signInServerStore.SecretKey) { return $"server secretkey validate fail"; } diff --git a/linker.signin/SignInArgsTransfer.cs b/linker.messenger.signin/args/SignInArgsTransfer.cs similarity index 83% rename from linker.signin/SignInArgsTransfer.cs rename to linker.messenger.signin/args/SignInArgsTransfer.cs index 2a6aaec3..47e120ef 100644 --- a/linker.signin/SignInArgsTransfer.cs +++ b/linker.messenger.signin/args/SignInArgsTransfer.cs @@ -1,11 +1,11 @@ -namespace linker.messenger.signin +namespace linker.messenger.signin.args { /// /// 登录参数处理 /// public sealed partial class SignInArgsTransfer { - private List startups =new List(); + private List startups = new List(); public SignInArgsTransfer() { @@ -15,9 +15,9 @@ /// 加载所有登录参数实现类 /// /// - public void LoadArgs(List list) + public void AddArgs(List list) { - startups = list; + startups = startups.Concat(list).Distinct().ToList(); } /// @@ -30,7 +30,7 @@ { foreach (var item in startups) { - string result = await item.Invoke(host,args); + string result = await item.Invoke(host, args); if (string.IsNullOrWhiteSpace(result) == false) { return result; diff --git a/linker/plugins/signIn/args/SignInArgsVersion.cs b/linker.messenger.signin/args/SignInArgsVersion.cs similarity index 95% rename from linker/plugins/signIn/args/SignInArgsVersion.cs rename to linker.messenger.signin/args/SignInArgsVersion.cs index 22b19dbc..50ebe730 100644 --- a/linker/plugins/signIn/args/SignInArgsVersion.cs +++ b/linker.messenger.signin/args/SignInArgsVersion.cs @@ -1,7 +1,8 @@ using linker.libs; using linker.messenger.signin; +using linker.messenger.signin.args; -namespace linker.plugins.signIn.args +namespace linker.messenger.signin.args { /// /// 版本限制 diff --git a/linker.signin/linker.messenger.signin.csproj b/linker.messenger.signin/linker.messenger.signin.csproj similarity index 89% rename from linker.signin/linker.messenger.signin.csproj rename to linker.messenger.signin/linker.messenger.signin.csproj index 7227dd9f..aca9c33f 100644 --- a/linker.signin/linker.messenger.signin.csproj +++ b/linker.messenger.signin/linker.messenger.signin.csproj @@ -33,6 +33,8 @@ + + diff --git a/linker.messenger.socks5/Entry.cs b/linker.messenger.socks5/Entry.cs new file mode 100644 index 00000000..bad9b168 --- /dev/null +++ b/linker.messenger.socks5/Entry.cs @@ -0,0 +1,57 @@ +using linker.messenger.api; +using linker.messenger.decenter; +using linker.messenger.exroute; +using Microsoft.Extensions.DependencyInjection; +namespace linker.messenger.socks5 +{ + public static class Entry + { + public static ServiceCollection AddSocks5Client(this ServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + + return serviceCollection; + } + public static ServiceProvider UseSocks5Client(this ServiceProvider serviceProvider) + { + TunnelProxy socks5Proxy = serviceProvider.GetService(); + Socks5Transfer socks5Transfer = serviceProvider.GetService(); + + IMessengerResolver messengerResolver = serviceProvider.GetService(); + messengerResolver.AddMessenger(new List { serviceProvider.GetService() }); + + IApiServer apiServer = serviceProvider.GetService(); + apiServer.AddPlugins(new List { serviceProvider.GetService() }); + + DecenterClientTransfer decenterClientTransfer = serviceProvider.GetService(); + decenterClientTransfer.AddDecenters(new List { serviceProvider.GetService() }); + + ExRouteTransfer exRouteTransfer = serviceProvider.GetService(); + exRouteTransfer.AddExRoutes(new List { serviceProvider.GetService() }); + + return serviceProvider; + } + + + public static ServiceCollection AddSocks5Server(this ServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + return serviceCollection; + } + public static ServiceProvider UseSocks5Server(this ServiceProvider serviceProvider) + { + IMessengerResolver messengerResolver = serviceProvider.GetService(); + messengerResolver.AddMessenger(new List { serviceProvider.GetService() }); + + return serviceProvider; + } + } +} diff --git a/linker/plugins/socks5/config/config.cs b/linker.messenger.socks5/ISocks5Store.cs similarity index 66% rename from linker/plugins/socks5/config/config.cs rename to linker.messenger.socks5/ISocks5Store.cs index 332c618c..8a77b226 100644 --- a/linker/plugins/socks5/config/config.cs +++ b/linker.messenger.socks5/ISocks5Store.cs @@ -1,27 +1,8 @@ using linker.libs; -using linker.plugins.socks5.config; -using MemoryPack; using System.Net; -namespace linker.plugins.socks5.config +namespace linker.messenger.socks5 { - [MemoryPackable] - public sealed partial class Socks5ConfigInfo - { - public Socks5ConfigInfo() { } - public int Port { get; set; } = 1805; - /// - /// 局域网配置列表 - /// - public List Lans { get; set; } = new List(); - - /// - /// 是否在运行中 - /// - public bool Running { get; set; } - } - - [MemoryPackable] public sealed partial class Socks5LanIPAddress { /// @@ -33,15 +14,12 @@ namespace linker.plugins.socks5.config public uint NetWork { get; set; } public uint Broadcast { get; set; } - [MemoryPackIgnore] public string MachineId { get; set; } - - [MemoryPackIgnore] public IPAddress OriginIPAddress { get; set; } } - [MemoryPackable] + public sealed partial class Socks5LanIPAddressList { public string MachineId { get; set; } @@ -49,8 +27,6 @@ namespace linker.plugins.socks5.config } - - [MemoryPackable] public sealed partial class Socks5Info { /// @@ -77,19 +53,16 @@ namespace linker.plugins.socks5.config /// public string SetupError { get; set; } - [MemoryPackIgnore] public LastTicksManager LastTicks { get; set; } = new LastTicksManager(); } - [MemoryPackable] public sealed partial class Socks5LanInfo { - [MemoryPackAllowSerialize] public IPAddress IP { get; set; } public byte PrefixLength { get; set; } = 24; public bool Disabled { get; set; } - public bool Exists { get; set; } + public bool Exists { get; set; } public string Error { get; set; } = string.Empty; } @@ -108,16 +81,14 @@ namespace linker.plugins.socks5.config /// Running = 2 } -} - - -namespace linker.client.config -{ - public sealed partial class RunningConfigInfo + public interface ISocks5Store { - /// - /// 虚拟网卡配置 - /// - public Socks5ConfigInfo Socks5 { get; set; } = new Socks5ConfigInfo(); + public List Lans { get; } + public int Port { get; } + public bool Running { get;} + + public void SetLans(List lans); + public void SetPort(int port); + public void SetRunning(bool running); } } diff --git a/linker/plugins/socks5/Socks5ApiController.cs b/linker.messenger.socks5/Socks5ApiController.cs similarity index 62% rename from linker/plugins/socks5/Socks5ApiController.cs rename to linker.messenger.socks5/Socks5ApiController.cs index a28c4690..3ac23a68 100644 --- a/linker/plugins/socks5/Socks5ApiController.cs +++ b/linker.messenger.socks5/Socks5ApiController.cs @@ -1,39 +1,30 @@ using linker.libs.api; -using MemoryPack; using linker.libs.extends; using System.Collections.Concurrent; -using linker.config; using linker.tunnel.connection; -using linker.plugins.client; -using linker.plugins.capi; -using linker.plugins.messenger; -using linker.client.config; -using linker.plugins.socks5.config; -using linker.plugins.socks5.messenger; -using linker.plugins.access; -using linker.messenger; +using linker.messenger.signin; +using linker.libs; -namespace linker.plugins.socks5 +namespace linker.messenger.socks5 { - public sealed class Socks5ClientApiController : IApiClientController + public sealed class Socks5ClientApiController : IApiController { private readonly IMessengerSender messengerSender; - private readonly Socks5ConfigTransfer socks5ConfigTransfer; - private readonly ClientSignInState clientSignInState; + private readonly Socks5Transfer socks5Transfer; + private readonly SignInClientState signInClientState; private readonly TunnelProxy tunnelProxy; - private readonly AccessTransfer accessTransfer; - private readonly ClientConfigTransfer clientConfigTransfer; + private readonly ISignInClientStore signInClientStore; private readonly Socks5Decenter socks5Decenter; - - public Socks5ClientApiController(IMessengerSender messengerSender, Socks5ConfigTransfer socks5ConfigTransfer, ClientSignInState clientSignInState, TunnelProxy tunnelProxy, Socks5ConfigTransfer Socks5ConfigTransfer, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer, Socks5Decenter socks5Decenter) + private readonly ISerializer serializer; + public Socks5ClientApiController(IMessengerSender messengerSender, SignInClientState signInClientState, TunnelProxy tunnelProxy, Socks5Transfer socks5Transfer, ISignInClientStore signInClientStore, Socks5Decenter socks5Decenter, ISerializer serializer) { this.messengerSender = messengerSender; - this.socks5ConfigTransfer = socks5ConfigTransfer; - this.clientSignInState = clientSignInState; + this.socks5Transfer = socks5Transfer; + this.signInClientState = signInClientState; this.tunnelProxy = tunnelProxy; - this.accessTransfer = accessTransfer; - this.clientConfigTransfer = clientConfigTransfer; + this.signInClientStore = signInClientStore; this.socks5Decenter = socks5Decenter; + this.serializer = serializer; } public ConnectionListInfo Connections(ApiControllerParamsInfo param) @@ -50,7 +41,6 @@ namespace linker.plugins.socks5 return new ConnectionListInfo { HashCode = version }; } - [ClientApiAccess(ClientApiAccess.TunnelRemove)] public void RemoveConnection(ApiControllerParamsInfo param) { tunnelProxy.RemoveConnection(param.Content); @@ -91,21 +81,18 @@ namespace linker.plugins.socks5 public async Task Run(ApiControllerParamsInfo param) { //运行自己的 - if (param.Content == clientConfigTransfer.Id) + if (param.Content == signInClientStore.Id) { - if (accessTransfer.HasAccess(ClientApiAccess.Socks5StatusSelf) == false) return false; - - socks5ConfigTransfer.Retstart(); + socks5Transfer.Retstart(); } else { - if (accessTransfer.HasAccess(ClientApiAccess.Socks5StatusOther) == false) return false; //运行别人的 await messengerSender.SendOnly(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)Socks5MessengerIds.RunForward, - Payload = MemoryPackSerializer.Serialize(param.Content) + Payload = serializer.Serialize(param.Content) }).ConfigureAwait(false); } return true; @@ -118,20 +105,18 @@ namespace linker.plugins.socks5 public async Task Stop(ApiControllerParamsInfo param) { //停止自己的 - if (param.Content == clientConfigTransfer.Id) + if (param.Content == signInClientStore.Id) { - if (accessTransfer.HasAccess(ClientApiAccess.Socks5StatusSelf) == false) return false; - socks5ConfigTransfer.Stop(); + socks5Transfer.Stop(); } else { - if (accessTransfer.HasAccess(ClientApiAccess.Socks5StatusOther) == false) return false; //停止别人的 await messengerSender.SendOnly(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)Socks5MessengerIds.StopForward, - Payload = MemoryPackSerializer.Serialize(param.Content) + Payload = serializer.Serialize(param.Content) }).ConfigureAwait(false); } return true; @@ -147,20 +132,18 @@ namespace linker.plugins.socks5 Socks5Info info = param.Content.DeJson(); //更新自己的 - if (info.MachineId == clientConfigTransfer.Id) + if (info.MachineId == signInClientStore.Id) { - if (accessTransfer.HasAccess(ClientApiAccess.Socks5ChangeSelf) == false) return false; - socks5ConfigTransfer.UpdateConfig(info); + socks5Transfer.UpdateConfig(info); } else { - if (accessTransfer.HasAccess(ClientApiAccess.Socks5ChangeOther) == false) return false; //更新别人的 await messengerSender.SendOnly(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)Socks5MessengerIds.UpdateForward, - Payload = MemoryPackSerializer.Serialize(info) + Payload = serializer.Serialize(info) }).ConfigureAwait(false); } return true; diff --git a/linker/plugins/socks5/Socks5Decenter.cs b/linker.messenger.socks5/Socks5Decenter.cs similarity index 76% rename from linker/plugins/socks5/Socks5Decenter.cs rename to linker.messenger.socks5/Socks5Decenter.cs index 5fb6a538..eadcb321 100644 --- a/linker/plugins/socks5/Socks5Decenter.cs +++ b/linker.messenger.socks5/Socks5Decenter.cs @@ -1,15 +1,11 @@ using linker.libs; -using linker.plugins.client; -using linker.plugins.decenter; -using linker.plugins.route; -using linker.plugins.socks5.config; -using linker.plugins.tunnel; -using linker.plugins.tuntap; -using MemoryPack; +using linker.messenger.decenter; using System.Collections.Concurrent; using System.Net; +using linker.messenger.signin; +using linker.messenger.exroute; -namespace linker.plugins.socks5 +namespace linker.messenger.socks5 { public sealed class Socks5Decenter : IDecenter { @@ -19,24 +15,28 @@ namespace linker.plugins.socks5 private readonly ConcurrentDictionary socks5Infos = new ConcurrentDictionary(); public ConcurrentDictionary Infos => socks5Infos; - private readonly ClientSignInState clientSignInState; + private readonly SignInClientState signInClientState; private readonly TunnelProxy tunnelProxy; - private readonly ClientConfigTransfer clientConfigTransfer; - private readonly Socks5ConfigTransfer socks5ConfigTransfer; - private readonly RouteExcludeIPTransfer routeExcludeIPTransfer; + private readonly ISignInClientStore signInClientStore; + private readonly Socks5Transfer socks5Transfer; + private readonly ExRouteTransfer exRouteTransfer; + private readonly ISerializer serializer; + private readonly ISocks5Store socks5Store; private readonly SemaphoreSlim slim = new SemaphoreSlim(1); - public Socks5Decenter( ClientSignInState clientSignInState, TunnelProxy tunnelProxy, ClientConfigTransfer clientConfigTransfer, Socks5ConfigTransfer socks5ConfigTransfer, RouteExcludeIPTransfer routeExcludeIPTransfer) + public Socks5Decenter(SignInClientState signInClientState, TunnelProxy tunnelProxy, ISignInClientStore signInClientStore, Socks5Transfer socks5Transfer, ExRouteTransfer exRouteTransfer, ISerializer serializer, ISocks5Store socks5Store) { - this.clientSignInState = clientSignInState; + this.signInClientState = signInClientState; this.tunnelProxy = tunnelProxy; - this.clientConfigTransfer = clientConfigTransfer; - this.socks5ConfigTransfer = socks5ConfigTransfer; - this.routeExcludeIPTransfer = routeExcludeIPTransfer; + this.signInClientStore = signInClientStore; + this.socks5Transfer = socks5Transfer; + this.exRouteTransfer = exRouteTransfer; + this.serializer = serializer; + this.socks5Store = socks5Store; - clientSignInState.NetworkEnabledHandle += (times) => Refresh(); + signInClientState.NetworkEnabledHandle += (times) => Refresh(); tunnelProxy.RefreshConfig += Refresh; - socks5ConfigTransfer.OnChanged += Refresh; + socks5Transfer.OnChanged += Refresh; } @@ -52,19 +52,19 @@ namespace linker.plugins.socks5 { Socks5Info info = new Socks5Info { - Lans = socks5ConfigTransfer.Lans.Where(c => c.IP != null && c.IP.Equals(IPAddress.Any) == false).Select(c => { c.Exists = false; return c; }).ToList(), - MachineId = clientConfigTransfer.Id, + Lans = socks5Store.Lans.Where(c => c.IP != null && c.IP.Equals(IPAddress.Any) == false).Select(c => { c.Exists = false; return c; }).ToList(), + MachineId = signInClientStore.Id, Status = tunnelProxy.Running ? Socks5Status.Running : Socks5Status.Normal, - Port = socks5ConfigTransfer.Port, + Port = socks5Store.Port, SetupError = tunnelProxy.Error }; socks5Infos.AddOrUpdate(info.MachineId, info, (a, b) => info); DataVersion.Add(); - return MemoryPackSerializer.Serialize(info); + return serializer.Serialize(info); } public void SetData(Memory data) { - Socks5Info info = MemoryPackSerializer.Deserialize(data.Span); + Socks5Info info = serializer.Deserialize(data.Span); TimerHelper.Async(async () => { await slim.WaitAsync(); @@ -86,7 +86,7 @@ namespace linker.plugins.socks5 } public void SetData(List> data) { - List list = data.Select(c => MemoryPackSerializer.Deserialize(c.Span)).ToList(); + List list = data.Select(c => serializer.Deserialize(c.Span)).ToList(); TimerHelper.Async(async () => { await slim.WaitAsync(); @@ -98,7 +98,7 @@ namespace linker.plugins.socks5 socks5Infos.AddOrUpdate(item.MachineId, item, (a, b) => item); item.LastTicks.Update(); } - var removes = socks5Infos.Keys.Except(list.Select(c => c.MachineId)).Where(c => c != clientConfigTransfer.Id).ToList(); + var removes = socks5Infos.Keys.Except(list.Select(c => c.MachineId)).Where(c => c != signInClientStore.Id).ToList(); foreach (var item in removes) { if (socks5Infos.TryGetValue(item, out Socks5Info socks5Info)) @@ -139,14 +139,14 @@ namespace linker.plugins.socks5 private List ParseIPs(List infos) { //排除的IP, - uint[] excludeIps = routeExcludeIPTransfer.Get().Concat(socks5ConfigTransfer.Lans.Select(c => c.IP)) + uint[] excludeIps = exRouteTransfer.Get().Concat(socks5Store.Lans.Select(c => c.IP)) .Select(NetworkHelper.IP2Value) .ToArray(); HashSet hashSet = new HashSet(); return infos - .Where(c => c.MachineId != clientConfigTransfer.Id) + .Where(c => c.MachineId != signInClientStore.Id) .OrderByDescending(c => c.Status) .OrderByDescending(c => c.MachineId) diff --git a/linker.messenger.socks5/Socks5ExRoute.cs b/linker.messenger.socks5/Socks5ExRoute.cs new file mode 100644 index 00000000..9233bd4f --- /dev/null +++ b/linker.messenger.socks5/Socks5ExRoute.cs @@ -0,0 +1,18 @@ +using linker.messenger.exroute; +using System.Net; + +namespace linker.messenger.socks5 +{ + public sealed class Socks5ExRoute : IExRoute + { + private readonly ISocks5Store socks5Store; + public Socks5ExRoute(ISocks5Store socks5Store) + { + this.socks5Store = socks5Store; + } + public List Get() + { + return socks5Store.Lans.Select(c => c.IP).ToList(); + } + } +} diff --git a/linker/plugins/socks5/messenger/Socks5Messenger.cs b/linker.messenger.socks5/Socks5Messenger.cs similarity index 75% rename from linker/plugins/socks5/messenger/Socks5Messenger.cs rename to linker.messenger.socks5/Socks5Messenger.cs index 30332442..204847a6 100644 --- a/linker/plugins/socks5/messenger/Socks5Messenger.cs +++ b/linker.messenger.socks5/Socks5Messenger.cs @@ -1,19 +1,18 @@ -using linker.config; -using linker.messenger; +using linker.libs; using linker.messenger.signin; -using linker.plugins.socks5.config; -using MemoryPack; -namespace linker.plugins.socks5.messenger +namespace linker.messenger.socks5 { public sealed class Socks5ClientMessenger : IMessenger { - private readonly Socks5ConfigTransfer socks5ConfigTransfer; + private readonly Socks5Transfer socks5Transfer; private readonly TunnelProxy socks5Proxy; - public Socks5ClientMessenger(Socks5ConfigTransfer socks5ConfigTransfer, TunnelProxy socks5Proxy) + private readonly ISerializer serializer; + public Socks5ClientMessenger(Socks5Transfer socks5Transfer, TunnelProxy socks5Proxy, ISerializer serializer) { - this.socks5ConfigTransfer = socks5ConfigTransfer; + this.socks5Transfer = socks5Transfer; this.socks5Proxy = socks5Proxy; + this.serializer = serializer; } /// @@ -23,7 +22,7 @@ namespace linker.plugins.socks5.messenger [MessengerId((ushort)Socks5MessengerIds.Run)] public void Run(IConnection connection) { - socks5ConfigTransfer.Retstart(); + socks5Transfer.Retstart(); } /// @@ -33,7 +32,7 @@ namespace linker.plugins.socks5.messenger [MessengerId((ushort)Socks5MessengerIds.Stop)] public void Stop(IConnection connection) { - socks5ConfigTransfer.Stop(); + socks5Transfer.Stop(); } /// @@ -43,8 +42,8 @@ namespace linker.plugins.socks5.messenger [MessengerId((ushort)Socks5MessengerIds.Update)] public void Update(IConnection connection) { - Socks5Info info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); - socks5ConfigTransfer.UpdateConfig(info); + Socks5Info info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + socks5Transfer.UpdateConfig(info); } } @@ -53,14 +52,13 @@ namespace linker.plugins.socks5.messenger public sealed class Socks5ServerMessenger : IMessenger { private readonly IMessengerSender messengerSender; - private readonly SignCaching signCaching; - private readonly FileConfig config; - - public Socks5ServerMessenger(IMessengerSender messengerSender, SignCaching signCaching, FileConfig config) + private readonly SignInServerCaching signCaching; + private readonly ISerializer serializer; + public Socks5ServerMessenger(IMessengerSender messengerSender, SignInServerCaching signCaching, ISerializer serializer) { this.messengerSender = messengerSender; this.signCaching = signCaching; - this.config = config; + this.serializer = serializer; } /// @@ -71,7 +69,7 @@ namespace linker.plugins.socks5.messenger [MessengerId((ushort)Socks5MessengerIds.RunForward)] public async Task RunForward(IConnection connection) { - string name = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + string name = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (signCaching.TryGet(name, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId) { await messengerSender.SendOnly(new MessageRequestWrap @@ -91,7 +89,7 @@ namespace linker.plugins.socks5.messenger [MessengerId((ushort)Socks5MessengerIds.StopForward)] public async Task StopForward(IConnection connection) { - string name = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + string name = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (signCaching.TryGet(name, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId) { await messengerSender.SendOnly(new MessageRequestWrap @@ -111,7 +109,7 @@ namespace linker.plugins.socks5.messenger [MessengerId((ushort)Socks5MessengerIds.UpdateForward)] public async Task UpdateForward(IConnection connection) { - Socks5Info info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + Socks5Info info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (signCaching.TryGet(info.MachineId, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId) { await messengerSender.SendOnly(new MessageRequestWrap diff --git a/linker/plugins/socks5/messenger/Socks5MessengerIds.cs b/linker.messenger.socks5/Socks5MessengerIds.cs similarity index 83% rename from linker/plugins/socks5/messenger/Socks5MessengerIds.cs rename to linker.messenger.socks5/Socks5MessengerIds.cs index 2e74b0b7..2171182e 100644 --- a/linker/plugins/socks5/messenger/Socks5MessengerIds.cs +++ b/linker.messenger.socks5/Socks5MessengerIds.cs @@ -1,4 +1,4 @@ -namespace linker.plugins.socks5.messenger +namespace linker.messenger.socks5 { public enum Socks5MessengerIds : ushort { diff --git a/linker/plugins/socks5/Socks5Proxy.cs b/linker.messenger.socks5/Socks5Proxy.cs similarity index 91% rename from linker/plugins/socks5/Socks5Proxy.cs rename to linker.messenger.socks5/Socks5Proxy.cs index fbd387d1..87a1f76d 100644 --- a/linker/plugins/socks5/Socks5Proxy.cs +++ b/linker.messenger.socks5/Socks5Proxy.cs @@ -6,35 +6,32 @@ using System.Buffers.Binary; using System.Collections.Concurrent; using System.Net; using System.Net.Sockets; -using linker.plugins.tunnel; -using linker.plugins.client; -using linker.plugins.socks5.config; using System.Text; -using linker.plugins.relay.client; -using linker.plugins.pcp; using linker.messenger.relay.client; +using linker.messenger.channel; +using linker.messenger.signin; +using linker.messenger.pcp; -namespace linker.plugins.socks5 +namespace linker.messenger.socks5 { - public sealed partial class TunnelProxy : TunnelBase + public sealed partial class TunnelProxy : Channel { private IPEndPoint proxyEP; private uint[] maskValues = Array.Empty(); private readonly ConcurrentDictionary ip2MachineDic = new ConcurrentDictionary(); - private readonly ClientSignInTransfer clientSignInTransfer; + private readonly SignInClientTransfer signInClientTransfer; protected override string TransactionId => "socks5"; - public TunnelProxy(ClientConfigTransfer clientConfigTransfer, TunnelTransfer tunnelTransfer, RelayClientTransfer relayTransfer, PcpTransfer pcpTransfer, ClientSignInTransfer clientSignInTransfer, ClientSignInState clientSignInState, RelayClientConfigTransfer relayClientConfigTransfer) - : base(tunnelTransfer, relayTransfer, pcpTransfer, clientSignInTransfer, clientSignInState, clientConfigTransfer, relayClientConfigTransfer) + public TunnelProxy(ISignInClientStore signInClientStore, TunnelTransfer tunnelTransfer, RelayClientTransfer relayTransfer, PcpTransfer pcpTransfer, SignInClientTransfer signInClientTransfer, IRelayClientStore relayClientStore) + : base(tunnelTransfer, relayTransfer, pcpTransfer, signInClientTransfer, signInClientStore, relayClientStore) { - this.clientSignInTransfer = clientSignInTransfer; + this.signInClientTransfer = signInClientTransfer; TaskUdp(); } - /// /// 设置IP,等下有连接进来,用IP匹配,才能知道这个连接是要连谁 /// @@ -251,12 +248,7 @@ namespace linker.plugins.socks5 validate = ValidateData(token.Proxy); } - //不短,又不相等,直接关闭连接 - if ((validate & EnumProxyValidateDataResult.Equal) != EnumProxyValidateDataResult.Equal) - { - return false; - } - return true; + return (validate & EnumProxyValidateDataResult.Equal) == EnumProxyValidateDataResult.Equal; } /// /// 验证socks5数据包完整性 diff --git a/linker.messenger.socks5/Socks5Transfer.cs b/linker.messenger.socks5/Socks5Transfer.cs new file mode 100644 index 00000000..170a46d4 --- /dev/null +++ b/linker.messenger.socks5/Socks5Transfer.cs @@ -0,0 +1,61 @@ +using linker.libs; + +namespace linker.messenger.socks5 +{ + public sealed class Socks5Transfer + { + public Action OnChanged { get; set; } = () => { }; + + private readonly TunnelProxy tunnelProxy; + private readonly ISocks5Store socks5Store; + private readonly SemaphoreSlim slim = new SemaphoreSlim(1); + public Socks5Transfer( TunnelProxy tunnelProxy, ISocks5Store socks5Store) + { + this.tunnelProxy = tunnelProxy; + this.socks5Store = socks5Store; + if (socks5Store.Running) Retstart(); + + } + + /// + /// 重启 + /// + /// + public void Retstart() + { + tunnelProxy.Start(socks5Store.Port); + socks5Store.SetRunning(tunnelProxy.Running); + OnChanged(); + } + /// + /// 网卡 + /// + public void Stop() + { + tunnelProxy.Stop(); + socks5Store.SetRunning(tunnelProxy.Running); + OnChanged(); + } + + /// + /// 更新本机信息 + /// + /// + public void UpdateConfig(Socks5Info info) + { + TimerHelper.Async(() => + { + int port = socks5Store.Port; + + socks5Store.SetPort(info.Port); + socks5Store.SetLans(info.Lans); + + if ((port != socks5Store.Port && socks5Store.Running) || (socks5Store.Running && tunnelProxy.Running == false)) + { + Retstart(); + } + OnChanged(); + }); + } + } +} diff --git a/linker/plugins/socks5/TunnelProxy.cs b/linker.messenger.socks5/TunnelProxy.cs similarity index 99% rename from linker/plugins/socks5/TunnelProxy.cs rename to linker.messenger.socks5/TunnelProxy.cs index 159cd493..c3fd4299 100644 --- a/linker/plugins/socks5/TunnelProxy.cs +++ b/linker.messenger.socks5/TunnelProxy.cs @@ -5,7 +5,7 @@ using System.Buffers; using System.Net; using System.Net.Sockets; -namespace linker.plugins.socks5 +namespace linker.messenger.socks5 { public partial class TunnelProxy : ITunnelConnectionReceiveCallback { diff --git a/linker/plugins/socks5/TunnelProxyTcp.cs b/linker.messenger.socks5/TunnelProxyTcp.cs similarity index 98% rename from linker/plugins/socks5/TunnelProxyTcp.cs rename to linker.messenger.socks5/TunnelProxyTcp.cs index e14c440b..84020efd 100644 --- a/linker/plugins/socks5/TunnelProxyTcp.cs +++ b/linker.messenger.socks5/TunnelProxyTcp.cs @@ -6,7 +6,7 @@ using System.Collections.Concurrent; using System.Net; using System.Net.Sockets; -namespace linker.plugins.socks5 +namespace linker.messenger.socks5 { public partial class TunnelProxy { @@ -38,8 +38,8 @@ namespace linker.plugins.socks5 BufferSize = bufferSize }; - userToken.Socket.IPv6Only(_localEndPoint.AddressFamily, false); - userToken.Socket.ReuseBind(_localEndPoint); + //userToken.Socket.IPv6Only(_localEndPoint.AddressFamily, false); + userToken.Socket.Bind(_localEndPoint); userToken.Socket.Listen(int.MaxValue); LocalEndpoint = userToken.Socket.LocalEndPoint as IPEndPoint; diff --git a/linker/plugins/socks5/TunnelProxyUdp.cs b/linker.messenger.socks5/TunnelProxyUdp.cs similarity index 99% rename from linker/plugins/socks5/TunnelProxyUdp.cs rename to linker.messenger.socks5/TunnelProxyUdp.cs index a1117d3e..accaa73c 100644 --- a/linker/plugins/socks5/TunnelProxyUdp.cs +++ b/linker.messenger.socks5/TunnelProxyUdp.cs @@ -5,7 +5,7 @@ using System.Collections.Concurrent; using System.Net; using System.Net.Sockets; -namespace linker.plugins.socks5 +namespace linker.messenger.socks5 { public partial class TunnelProxy { diff --git a/linker.messenger.socks5/linker.messenger.socks5.csproj b/linker.messenger.socks5/linker.messenger.socks5.csproj new file mode 100644 index 00000000..27ccf66c --- /dev/null +++ b/linker.messenger.socks5/linker.messenger.socks5.csproj @@ -0,0 +1,42 @@ + + + + net8.0 + enable + disable + true + false + true + True + linker messenger socks5 + snltty + snltty + linker messenger socks5 + snltty + https://github.com/snltty/linker + https://github.com/snltty/linker + linker messenger socks5 + 1.6.4 + 1.6.4 + 1.6.4 + + + + full + true + + + none + false + True + + + + + + + + + + + diff --git a/linker/plugins/config/ConfigApiController.cs b/linker.messenger.store.file/ConfigApiController.cs similarity index 80% rename from linker/plugins/config/ConfigApiController.cs rename to linker.messenger.store.file/ConfigApiController.cs index 4982b6f5..c0352bc6 100644 --- a/linker/plugins/config/ConfigApiController.cs +++ b/linker.messenger.store.file/ConfigApiController.cs @@ -1,35 +1,25 @@ -using linker.config; -using linker.libs.api; +using linker.libs.api; using linker.libs.extends; -using linker.client.config; -using linker.plugins.capi; using System.IO.Compression; using linker.libs; -using linker.plugins.client; -using linker.plugins.messenger; -using linker.plugins.access; -using linker.messenger; -namespace linker.plugins.config +using linker.messenger.signin; +namespace linker.messenger.store.file { - public sealed class ConfigClientApiController : IApiClientController + public sealed class ConfigApiController : IApiController { private readonly RunningConfig runningConfig; private readonly FileConfig config; - private readonly ClientSignInTransfer clientSignInTransfer; + private readonly SignInClientTransfer signInClientTransfer; private readonly IMessengerSender sender; - private readonly ClientSignInState clientSignInState; - private readonly ConfigSyncTreansfer configSyncTreansfer; - private readonly AccessTransfer accessTransfer; + private readonly SignInClientState signInClientState; - public ConfigClientApiController(RunningConfig runningConfig, FileConfig config, ClientSignInTransfer clientSignInTransfer, IMessengerSender sender, ClientSignInState clientSignInState, ConfigSyncTreansfer configSyncTreansfer, AccessTransfer accessTransfer) + public ConfigApiController(RunningConfig runningConfig, FileConfig config, SignInClientTransfer signInClientTransfer, IMessengerSender sender, SignInClientState signInClientState) { this.runningConfig = runningConfig; this.config = config; - this.clientSignInTransfer = clientSignInTransfer; + this.signInClientTransfer = signInClientTransfer; this.sender = sender; - this.clientSignInState = clientSignInState; - this.configSyncTreansfer = configSyncTreansfer; - this.accessTransfer = accessTransfer; + this.signInClientState = signInClientState; } public object Get(ApiControllerParamsInfo param) @@ -44,7 +34,7 @@ namespace linker.plugins.config if (info.Common.Modes.Contains("client")) { config.Data.Client.Name = info.Client.Name; - config.Data.Client.Groups = new ClientGroupInfo[] { new ClientGroupInfo { Id = info.Client.GroupId, Name = info.Client.GroupId, Password = info.Client.GroupPassword } }; + config.Data.Client.Groups = new SignInClientGroupInfo[] { new SignInClientGroupInfo { Id = info.Client.GroupId, Name = info.Client.GroupId, Password = info.Client.GroupPassword } }; config.Data.Client.CApi.WebPort = info.Client.Web; config.Data.Client.CApi.ApiPort = info.Client.Api; config.Data.Client.CApi.ApiPassword = info.Client.Password; @@ -86,8 +76,6 @@ namespace linker.plugins.config return true; } - - [ClientApiAccessAttribute(ClientApiAccess.Export)] public async Task Export(ApiControllerParamsInfo param) { try @@ -118,7 +106,7 @@ namespace linker.plugins.config client.Name = string.Empty; if (configExportInfo.Single || client.OnlyNode) { - client.Id = await clientSignInTransfer.GetNewId(); + client.Id = await signInClientTransfer.GetNewId(); client.Name = configExportInfo.Name; } if (client.OnlyNode == false) @@ -189,25 +177,6 @@ namespace linker.plugins.config } - public List SyncNames(ApiControllerParamsInfo param) - { - return configSyncTreansfer.GetNames(); - } - [ClientApiAccessAttribute(ClientApiAccess.Sync)] - public async Task Sync(ApiControllerParamsInfo param) - { - string[] names = param.Content.DeJson(); - if (names.Length == 1) - { - await configSyncTreansfer.Sync(names[0]); - } - else - { - configSyncTreansfer.Sync(names); - } - - return true; - } } public sealed class ConfigInstallInfo @@ -274,9 +243,4 @@ namespace linker.plugins.config public ulong Access { get; set; } } - public sealed class AccessListInfo - { - public Dictionary List { get; set; } - public ulong HashCode { get; set; } - } } diff --git a/linker.messenger.store.file/Entry.cs b/linker.messenger.store.file/Entry.cs new file mode 100644 index 00000000..4b60dcfe --- /dev/null +++ b/linker.messenger.store.file/Entry.cs @@ -0,0 +1,79 @@ +using linker.messenger.access; +using linker.messenger.action; +using linker.messenger.api; +using linker.messenger.listen; +using linker.messenger.pcp; +using linker.messenger.relay.client; +using linker.messenger.relay.server; +using linker.messenger.signin; +using linker.messenger.socks5; +using linker.messenger.store.file.action; +using linker.messenger.store.file.api; +using linker.messenger.store.file.messenger; +using linker.messenger.store.file.pcp; +using linker.messenger.store.file.relay; +using linker.messenger.store.file.server; +using linker.messenger.store.file.signIn; +using linker.messenger.store.file.socks5; +using linker.messenger.store.file.tunnel; +using linker.messenger.store.file.updater; +using linker.messenger.sync; +using linker.messenger.updater; +using linker.plugins.tunnel; +using Microsoft.Extensions.DependencyInjection; +namespace linker.messenger.store.file +{ + public static class Entry + { + public static ServiceCollection AddStoreFile(this ServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + + + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + + + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + + return serviceCollection; + } + public static ServiceProvider UseStoreFile(this ServiceProvider serviceProvider) + { + IApiServer apiServer = serviceProvider.GetService(); + apiServer.AddPlugins(new List { serviceProvider.GetService() }); + + SyncTreansfer syncTreansfer = serviceProvider.GetService(); + syncTreansfer.AddSyncs(new List { + serviceProvider.GetService(), + serviceProvider.GetService(), + }); + + return serviceProvider; + } + } +} diff --git a/linker/config/Config.cs b/linker.messenger.store.file/FileConfig.cs similarity index 82% rename from linker/config/Config.cs rename to linker.messenger.store.file/FileConfig.cs index dc9957ac..c029c089 100644 --- a/linker/config/Config.cs +++ b/linker.messenger.store.file/FileConfig.cs @@ -2,9 +2,10 @@ using linker.libs.extends; using LiteDB; using System.Reflection; +using System.Text; using System.Text.Json.Serialization; -namespace linker.config +namespace linker.messenger.store.file { public sealed class FileConfig { @@ -155,6 +156,8 @@ namespace linker.config { public ConfigInfo() { } public ConfigCommonInfo Common { get; set; } = new ConfigCommonInfo(); + public ConfigClientInfo Client { get; set; } = new ConfigClientInfo(); + public ConfigServerInfo Server { get; set; } = new ConfigServerInfo(); [JsonIgnore, BsonIgnore] public uint Updated { get; set; } = 1; @@ -165,6 +168,47 @@ namespace linker.config } } + [JsonAotAttribute] + public sealed partial class ConfigClientInfo : IConfig + { + private ICrypto crypto; + public ConfigClientInfo() + { + crypto = CryptoFactory.CreateSymmetric(Helper.GlobalString); + } + + public string Serialize(object obj) + { +#if DEBUG + return obj.ToJsonFormat(); +#else + return Convert.ToBase64String(crypto.Encode(Encoding.UTF8.GetBytes(obj.ToJson()))); +#endif + } + public object Deserialize(string text) + { + if (text.Contains("ApiPassword")) + { + return text.DeJson(); + } + return Encoding.UTF8.GetString(crypto.Decode(Convert.FromBase64String(text)).ToArray()).DeJson(); + } + } + + [JsonAotAttribute] + public sealed partial class ConfigServerInfo : IConfig + { + public ConfigServerInfo() { } + public object Deserialize(string text) + { + return text.DeJson(); + } + public string Serialize(object obj) + { + return obj.ToJsonFormat(); + } + } + [JsonAotAttribute] public sealed partial class ConfigCommonInfo : IConfig { diff --git a/linker/plugins/config/RunningConfig.cs b/linker.messenger.store.file/RunningConfig.cs similarity index 91% rename from linker/plugins/config/RunningConfig.cs rename to linker.messenger.store.file/RunningConfig.cs index 44d4b178..ea7eca0b 100644 --- a/linker/plugins/config/RunningConfig.cs +++ b/linker.messenger.store.file/RunningConfig.cs @@ -1,10 +1,8 @@ -using linker.store; -using linker.libs; +using linker.libs; using LiteDB; using System.Text.Json.Serialization; -using linker.config; -namespace linker.client.config +namespace linker.messenger.store.file { /// /// 运行时配置 @@ -18,11 +16,9 @@ namespace linker.client.config public RunningConfigInfo Data { get; private set; } = new RunningConfigInfo(); private readonly Storefactory dBfactory; - private readonly FileConfig fileConfig; - public RunningConfig(Storefactory dBfactory, FileConfig fileConfig) + public RunningConfig(Storefactory dBfactory) { this.dBfactory = dBfactory; - this.fileConfig = fileConfig; liteCollection = dBfactory.GetCollection("running"); diff --git a/linker/store/Storefactory.cs b/linker.messenger.store.file/Storefactory.cs similarity index 77% rename from linker/store/Storefactory.cs rename to linker.messenger.store.file/Storefactory.cs index 358736fd..13795eac 100644 --- a/linker/store/Storefactory.cs +++ b/linker.messenger.store.file/Storefactory.cs @@ -1,12 +1,10 @@ using linker.libs; using linker.libs.extends; -using linker.messenger; using linker.tunnel.connection; using LiteDB; -using LiteDB.Engine; using System.Net; -namespace linker.store +namespace linker.messenger.store.file { /// @@ -27,19 +25,6 @@ namespace linker.store database = new LiteDatabase(new ConnectionString($"Filename=./configs/db.db; Password={Helper.GlobalString}"), bsonMapper); } - private bool Encoded() - { - try - { - string text = File.ReadAllText("./configs/db.db"); - return text.Contains("This is a LiteDB file") == false; - } - catch (Exception) - { - } - return false; - } - public ILiteCollection GetCollection(string name) { return database.GetCollection(name); diff --git a/linker/plugins/action/ActionTransfer.cs b/linker.messenger.store.file/action/ActionStore.cs similarity index 51% rename from linker/plugins/action/ActionTransfer.cs rename to linker.messenger.store.file/action/ActionStore.cs index 1df2a799..aa71dd4f 100644 --- a/linker/plugins/action/ActionTransfer.cs +++ b/linker.messenger.store.file/action/ActionStore.cs @@ -1,20 +1,16 @@ -using linker.config; -using System.Net.Http.Json; -using System.Text.Json.Nodes; -namespace linker.plugins.action +using linker.messenger.action; +namespace linker.messenger.store.file.action { - public sealed class ActionTransfer + public sealed class ActionStore : IActionStore { public const string ACTION_ARG_KEY = "ACTION_ARGS"; - public string SignInActionUrl => config.Data.Action.SignInActionUrl; public string RelayActionUrl => config.Data.Action.SignInActionUrl; public string SForwardActionUrl => config.Data.Action.SignInActionUrl; - private readonly FileConfig config; - public ActionTransfer(FileConfig config) + public ActionStore(FileConfig config) { this.config = config; } @@ -48,39 +44,6 @@ namespace linker.plugins.action return args.TryGetValue(ACTION_ARG_KEY, out str) && string.IsNullOrWhiteSpace(str) == false; } - - public async Task ExcuteActions(string actionJson, string url) - { - if (string.IsNullOrWhiteSpace(url)) return string.Empty; - try - { - using HttpClient client = new HttpClient(); - JsonContent json = JsonContent.Create(JsonObject.Parse(actionJson)); - HttpResponseMessage resp = await client.PostAsync(url, json); - if (resp.IsSuccessStatusCode) - { - string result = await resp.Content.ReadAsStringAsync(); - if (result.Equals("ok", StringComparison.CurrentCultureIgnoreCase) == false) - { - return $"post {url} fail->{result}"; - } - } - else - { - return $"post {url} fail->{resp.StatusCode}"; - } - } - catch (Exception ex) - { - return $"post {url} fail->{ex.Message}"; - } - return string.Empty; - } } - public sealed class ActionInfo - { - public string Key { get; set; } = string.Empty; - public string Value { get; set; } = string.Empty; - } } \ No newline at end of file diff --git a/linker/plugins/action/config/Config.cs b/linker.messenger.store.file/action/Config.cs similarity index 70% rename from linker/plugins/action/config/Config.cs rename to linker.messenger.store.file/action/Config.cs index fc15cc22..5e3929a9 100644 --- a/linker/plugins/action/config/Config.cs +++ b/linker.messenger.store.file/action/Config.cs @@ -1,6 +1,7 @@ using linker.libs.extends; +using linker.messenger.action; -namespace linker.config +namespace linker.messenger.store.file { public sealed partial class ConfigInfo { @@ -25,12 +26,6 @@ namespace linker.config public sealed partial class ConfigClientInfo { - public ConfigClientActionInfo Action { get; set; } = new ConfigClientActionInfo(); - } - - public sealed partial class ConfigClientActionInfo - { - public string Arg { get; set; } - public Dictionary Args { get; set; } = new Dictionary(); + public ActionInfo Action { get; set; } = new ActionInfo(); } } diff --git a/linker/plugins/access/AccessTransfer.cs b/linker.messenger.store.file/api/AccessStore.cs similarity index 73% rename from linker/plugins/access/AccessTransfer.cs rename to linker.messenger.store.file/api/AccessStore.cs index e4fc39f7..3f3cff61 100644 --- a/linker/plugins/access/AccessTransfer.cs +++ b/linker.messenger.store.file/api/AccessStore.cs @@ -1,16 +1,16 @@ using linker.config; using linker.libs; +using linker.messenger.access; -namespace linker.plugins.access +namespace linker.messenger.store.file.api { - public sealed class AccessTransfer + public sealed class AccessStore : IAccessStore { - public ClientApiAccess Access => fileConfig.Data.Client.Access; - + public AccessValue Access => fileConfig.Data.Client.Access; public Action OnChanged { get; set; } = () => { }; private readonly FileConfig fileConfig; - public AccessTransfer(FileConfig fileConfig) + public AccessStore(FileConfig fileConfig) { this.fileConfig = fileConfig; } @@ -19,15 +19,16 @@ namespace linker.plugins.access /// 设置权限 /// /// - public void SetAccess(ConfigUpdateAccessInfo info) + public void SetAccess(AccessUpdateInfo info) { if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"from {info.FromMachineId} set access to {info.Access},my access {(ulong)fileConfig.Data.Client.Access}"); if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"from {info.FromMachineId} set access to {info.Access} success"); - fileConfig.Data.Client.Access = (ClientApiAccess)info.Access; + fileConfig.Data.Client.Access = (AccessValue)info.Access; fileConfig.Data.Update(); + OnChanged(); } @@ -36,7 +37,7 @@ namespace linker.plugins.access /// /// /// - public ClientApiAccess AssignAccess(ClientApiAccess access) + public AccessValue AssignAccess(AccessValue access) { return fileConfig.Data.Client.Access & access; } @@ -46,7 +47,7 @@ namespace linker.plugins.access /// /// /// - public bool HasAccess(ClientApiAccess clientManagerAccess) + public bool HasAccess(AccessValue clientManagerAccess) { return (fileConfig.Data.Client.Access & clientManagerAccess) == clientManagerAccess; } diff --git a/linker.messenger.store.file/api/ApiStore.cs b/linker.messenger.store.file/api/ApiStore.cs new file mode 100644 index 00000000..a9723d77 --- /dev/null +++ b/linker.messenger.store.file/api/ApiStore.cs @@ -0,0 +1,19 @@ +using linker.config; +using linker.libs; +using linker.messenger.api; + +namespace linker.messenger.store.file.api +{ + public sealed class ApiStore : IApiStore + { + public ApiClientInfo Info => fileConfig.Data.Client.CApi; + + private readonly FileConfig fileConfig; + public ApiStore(FileConfig fileConfig) + { + this.fileConfig = fileConfig; + } + + + } +} diff --git a/linker.messenger.store.file/api/Config.cs b/linker.messenger.store.file/api/Config.cs new file mode 100644 index 00000000..7a1f292e --- /dev/null +++ b/linker.messenger.store.file/api/Config.cs @@ -0,0 +1,45 @@ +using linker.libs; +using linker.messenger.access; +using linker.messenger.api; +using System.Reflection; + +namespace linker.config +{ + public partial class ConfigClientInfo + { + /// + /// 客户端管理接口配置 + /// + public ApiClientInfo CApi { get; set; } = new ApiClientInfo(); + + private Dictionary accesss; + public Dictionary Accesss + { + get + { + if (accesss == null) + { + accesss = new Dictionary(); + Type enumType = typeof(AccessValue); + // 获取所有字段值 + foreach (var value in Enum.GetValues(enumType)) + { + // 获取字段信息 + FieldInfo fieldInfo = enumType.GetField(value.ToString()); + var attribute = fieldInfo.GetCustomAttribute(false); + if (attribute != null) + { + accesss.TryAdd(fieldInfo.Name, new AccessTextInfo { Text = attribute.Value, Value = (ulong)value }); + } + } + } + + return accesss; + } + } + /// + /// 管理权限 + /// + public AccessValue Access { get; set; } = AccessValue.Full; + } +} diff --git a/linker.messenger.store.file/linker.messenger.store.file.csproj b/linker.messenger.store.file/linker.messenger.store.file.csproj new file mode 100644 index 00000000..6fefffdc --- /dev/null +++ b/linker.messenger.store.file/linker.messenger.store.file.csproj @@ -0,0 +1,51 @@ + + + + net8.0 + enable + disable + true + false + true + True + linker messenger store file + snltty + snltty + linker messenger store file + snltty + https://github.com/snltty/linker + https://github.com/snltty/linker + linker messenger store file + 1.6.4 + 1.6.4 + 1.6.4 + + + + full + true + + + none + false + True + + + + + + + + + + + + + + + + + + + + diff --git a/linker.messenger.store.file/messenger/Config.cs b/linker.messenger.store.file/messenger/Config.cs new file mode 100644 index 00000000..46d709c2 --- /dev/null +++ b/linker.messenger.store.file/messenger/Config.cs @@ -0,0 +1,14 @@ +using linker.libs.extends; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace linker.messenger.store.file +{ + public sealed partial class ConfigServerInfo + { + public ServerCertificateInfo SSL { get; set; } = new ServerCertificateInfo(); + } +} diff --git a/linker.messenger.store.file/messenger/MessengerStore.cs b/linker.messenger.store.file/messenger/MessengerStore.cs new file mode 100644 index 00000000..81e268cc --- /dev/null +++ b/linker.messenger.store.file/messenger/MessengerStore.cs @@ -0,0 +1,13 @@ +namespace linker.messenger.store.file.messenger +{ + public class MessengerStore : IMessengerStore + { + public ServerCertificateInfo SSL => fileConfig.Data.Server.SSL; + + private readonly FileConfig fileConfig; + public MessengerStore(FileConfig fileConfig) + { + this.fileConfig = fileConfig; + } + } +} diff --git a/linker.messenger.store.file/pcp/Config.cs b/linker.messenger.store.file/pcp/Config.cs new file mode 100644 index 00000000..149eab88 --- /dev/null +++ b/linker.messenger.store.file/pcp/Config.cs @@ -0,0 +1,12 @@ +using linker.messenger.pcp; + +namespace linker.messenger.store.file +{ + public sealed partial class RunningConfigInfo + { + /// + /// 打洞历史记录 + /// + public PcpHistoryInfo PcpHistory { get; set; } = new PcpHistoryInfo(); + } +} diff --git a/linker.messenger.store.file/pcp/PcpStore.cs b/linker.messenger.store.file/pcp/PcpStore.cs new file mode 100644 index 00000000..185fc217 --- /dev/null +++ b/linker.messenger.store.file/pcp/PcpStore.cs @@ -0,0 +1,22 @@ +using linker.messenger.pcp; +using linker.tunnel.connection; + +namespace linker.messenger.store.file.pcp +{ + public sealed class PcpStore : IPcpStore + { + public PcpHistoryInfo PcpHistory => runningConfig.Data.PcpHistory; + + private readonly RunningConfig runningConfig; + public PcpStore(RunningConfig runningConfig) + { + this.runningConfig = runningConfig; + } + public void AddHistory(ITunnelConnection connection) + { + runningConfig.Data.PcpHistory.History.Add(connection.RemoteMachineId); + runningConfig.Data.PcpHistory.History = runningConfig.Data.PcpHistory.History.Distinct().ToList(); + runningConfig.Data.Update(); + } + } +} diff --git a/linker/plugins/relay/config/Config.cs b/linker.messenger.store.file/relay/Config.cs similarity index 62% rename from linker/plugins/relay/config/Config.cs rename to linker.messenger.store.file/relay/Config.cs index adf96f12..6c5a300f 100644 --- a/linker/plugins/relay/config/Config.cs +++ b/linker.messenger.store.file/relay/Config.cs @@ -1,12 +1,9 @@ using linker.libs; -using linker.libs.extends; using linker.messenger.relay.client.transport; using linker.messenger.relay.server; -using MemoryPack; -using System.Net; -namespace linker.client.config +namespace linker.messenger.store.file { public sealed partial class RunningConfigInfo { @@ -18,17 +15,11 @@ namespace linker.client.config public string DefaultNodeId { get; set; } } -} - - -namespace linker.config -{ - public sealed partial class ConfigClientInfo { - public RelayInfo Relay { get; set; } = new RelayInfo(); + public RelayClientInfo Relay { get; set; } = new RelayClientInfo(); } - public sealed class RelayInfo + public sealed class RelayClientInfo { /// /// 中继服务器列表 @@ -60,27 +51,4 @@ namespace linker.config public RelayServerNodeInfo Node { get; set; } = new RelayServerNodeInfo { }; public RelayServerMasterInfo Master { get; set; } = new RelayServerMasterInfo { }; } - /// - /// 中继服务器 - /// - [MemoryPackable] - public sealed partial class RelayServerInfo - { - public RelayServerInfo() { } - /// - /// 密钥 - /// - public string SecretKey { get; set; } = Helper.GlobalString; - /// - /// 禁用 - /// - public bool Disabled { get; set; } - /// - /// 开启ssl - /// - public bool SSL { get; set; } = true; - - public RelayClientType RelayType { get; set; } = RelayClientType.Linker; - } - } diff --git a/linker/plugins/relay/client/RelayClientConfigTransfer.cs b/linker.messenger.store.file/relay/RelayClientStore.cs similarity index 52% rename from linker/plugins/relay/client/RelayClientConfigTransfer.cs rename to linker.messenger.store.file/relay/RelayClientStore.cs index 84eeea64..d7c9e922 100644 --- a/linker/plugins/relay/client/RelayClientConfigTransfer.cs +++ b/linker.messenger.store.file/relay/RelayClientStore.cs @@ -1,17 +1,25 @@ -using linker.client.config; -using linker.config; +using linker.messenger.relay.client; +using linker.messenger.relay.client.transport; +using linker.messenger.signin; -namespace linker.plugins.relay.client +namespace linker.messenger.store.file.relay { - public sealed class RelayClientConfigTransfer + public sealed class RelayClientStore : IRelayClientStore { public string DefaultNodeId => runningConfig.Data.Relay.DefaultNodeId; - public RelayServerInfo Server => config.Data.Client.Relay.Servers[0]; + public RelayServerInfo Server => config.Data.Client.Relay.Server; + + private readonly SignInClientState signInClientState; + private readonly ISignInClientStore signInClientStore; private readonly FileConfig config; - private readonly RunningConfig runningConfig; - public RelayClientConfigTransfer(FileConfig config, RunningConfig runningConfig) + private readonly RunningConfig runningConfig; + + public RelayClientStore(SignInClientState signInClientState, ISignInClientStore signInClientStore, FileConfig config, RunningConfig runningConfig) { + this.signInClientState = signInClientState; + this.signInClientStore = signInClientStore; + this.config = config; this.runningConfig = runningConfig; } @@ -25,7 +33,7 @@ namespace linker.plugins.relay.client public void SetServer(RelayServerInfo server) { config.Data.Client.Relay.Servers = [server]; - runningConfig.Data.Update(); + config.Data.Update(); } public void SetServerSecretKey(string secretKey) { @@ -33,7 +41,7 @@ namespace linker.plugins.relay.client { item.SecretKey = secretKey; } - runningConfig.Data.Update(); + config.Data.Update(); } } } diff --git a/linker.messenger.store.file/relay/RelayServerMasterStore.cs b/linker.messenger.store.file/relay/RelayServerMasterStore.cs new file mode 100644 index 00000000..5a58c47f --- /dev/null +++ b/linker.messenger.store.file/relay/RelayServerMasterStore.cs @@ -0,0 +1,16 @@ +using linker.messenger.relay.server; + +namespace linker.messenger.store.file.relay +{ + public sealed class RelayServerMasterStore : IRelayServerMasterStore + { + public RelayServerMasterInfo Master => config.Data.Server.Relay.Distributed.Master; + + private readonly FileConfig config; + public RelayServerMasterStore(FileConfig config) + { + this.config = config; + } + + } +} diff --git a/linker.messenger.store.file/relay/RelayServerNodeStore.cs b/linker.messenger.store.file/relay/RelayServerNodeStore.cs new file mode 100644 index 00000000..7e0abcdd --- /dev/null +++ b/linker.messenger.store.file/relay/RelayServerNodeStore.cs @@ -0,0 +1,31 @@ +using linker.messenger.relay.server; + +namespace linker.messenger.store.file.relay +{ + public sealed class RelayServerNodeStore : IRelayServerNodeStore + { + public int ServicePort => config.Data.Server.ServicePort; + public RelayServerNodeInfo Node => config.Data.Server.Relay.Distributed.Node; + + private readonly FileConfig config; + public RelayServerNodeStore(FileConfig config) + { + this.config = config; + } + + public void Confirm() + { + config.Data.Update(); + } + + public void SetMaxGbTotalLastBytes(ulong value) + { + config.Data.Server.Relay.Distributed.Node.MaxGbTotalLastBytes=value; + } + + public void SetMaxGbTotalMonth(int month) + { + config.Data.Server.Relay.Distributed.Node.MaxGbTotalMonth = month; + } + } +} diff --git a/linker.messenger.store.file/relay/RelayServerStore.cs b/linker.messenger.store.file/relay/RelayServerStore.cs new file mode 100644 index 00000000..51dafbb4 --- /dev/null +++ b/linker.messenger.store.file/relay/RelayServerStore.cs @@ -0,0 +1,14 @@ +using linker.messenger.relay.server; + +namespace linker.messenger.store.file.relay +{ + public sealed class RelayServerStore : IRelayServerStore + { + public string SecretKey => config.Data.Server.Relay.SecretKey; + private readonly FileConfig config; + public RelayServerStore(FileConfig config) + { + this.config = config; + } + } +} diff --git a/linker.messenger.store.file/server/Config.cs b/linker.messenger.store.file/server/Config.cs new file mode 100644 index 00000000..d585e2b0 --- /dev/null +++ b/linker.messenger.store.file/server/Config.cs @@ -0,0 +1,8 @@ +using linker.libs.extends; +namespace linker.messenger.store.file +{ + public sealed partial class ConfigServerInfo + { + public int ServicePort { get; set; } = 1802; + } +} diff --git a/linker.messenger.store.file/server/ListenStore.cs b/linker.messenger.store.file/server/ListenStore.cs new file mode 100644 index 00000000..1941c25a --- /dev/null +++ b/linker.messenger.store.file/server/ListenStore.cs @@ -0,0 +1,15 @@ +using linker.messenger.listen; + +namespace linker.messenger.store.file.server +{ + public sealed class ListenStore: IListenStore + { + public int Port => config.Data.Server.ServicePort; + + private readonly FileConfig config; + public ListenStore(FileConfig config) + { + this.config = config; + } + } +} diff --git a/linker.messenger.store.file/signIn/Config.cs b/linker.messenger.store.file/signIn/Config.cs new file mode 100644 index 00000000..cfb8d574 --- /dev/null +++ b/linker.messenger.store.file/signIn/Config.cs @@ -0,0 +1,79 @@ +using linker.libs; +using linker.libs.extends; +using linker.messenger.signin; +using System.Net; +using System.Text; + +namespace linker.messenger.store.file +{ + public sealed partial class ConfigClientInfo : IConfig + { + public bool OnlyNode { get; set; } + + + private SignInClientServerInfo[] servers = new SignInClientServerInfo[] { +#if DEBUG + new SignInClientServerInfo{ Name="Linker", Host=new IPEndPoint(IPAddress.Loopback, 1802).ToString() } +#else + new ClientServerInfo{ Name="Linker", Host="linker.snltty.com:1802" } +#endif + }; + public SignInClientServerInfo Server => Servers[0]; + public SignInClientServerInfo[] Servers + { + get => servers; set { servers = value; } + } + + private string id = string.Empty; + public string Id + { + get => id; set + { + id = value.SubStr(0, 36); + } + } + + private string name = Dns.GetHostName().SubStr(0, 12); + public string Name + { + get => name; set + { + name = value.SubStr(0, 12); + } + } + + private SignInClientGroupInfo[] groups = new[] { new SignInClientGroupInfo { } }; + public SignInClientGroupInfo Group => Groups[0]; + public SignInClientGroupInfo[] Groups + { + get => groups; set + { + groups = value; + if (groups.Length == 0) groups = new[] { new SignInClientGroupInfo { } }; + } + } + + /// + /// 加密证书 + /// + public ClientCertificateInfo SSL { get; set; } = new ClientCertificateInfo(); + + } + + public sealed partial class ClientCertificateInfo + { + public ClientCertificateInfo() { } + public string File { get; set; } = "./snltty.pfx"; + public string Password { get; set; } = "oeq9tw1o"; + } + + + public partial class ConfigServerInfo + { + /// + /// 登入 + /// + public SignInConfigServerInfo SignIn { get; set; } = new SignInConfigServerInfo(); + } + +} diff --git a/linker/plugins/client/ClientConfigTransfer.cs b/linker.messenger.store.file/signIn/SignInClientStore.cs similarity index 69% rename from linker/plugins/client/ClientConfigTransfer.cs rename to linker.messenger.store.file/signIn/SignInClientStore.cs index 2e337f17..9767da6e 100644 --- a/linker/plugins/client/ClientConfigTransfer.cs +++ b/linker.messenger.store.file/signIn/SignInClientStore.cs @@ -1,12 +1,13 @@ using linker.config; +using linker.messenger.signin; using System.Security.Cryptography.X509Certificates; -namespace linker.plugins.client +namespace linker.messenger.store.file.signIn { - public sealed class ClientConfigTransfer + public sealed class SignInClientStore : ISignInClientStore { - public ClientServerInfo Server => config.Data.Client.Servers[0]; - public ClientGroupInfo Group => config.Data.Client.Groups[0]; + public SignInClientServerInfo Server => config.Data.Client.Servers[0]; + public SignInClientGroupInfo Group => config.Data.Client.Groups[0]; public string Id => config.Data.Client.Id; public string Name => config.Data.Client.Name; @@ -14,7 +15,7 @@ namespace linker.plugins.client public X509Certificate2 Certificate { get; private set; } private readonly FileConfig config; - public ClientConfigTransfer(FileConfig config) + public SignInClientStore(FileConfig config) { this.config = config; string path = Path.GetFullPath(config.Data.Client.SSL.File); @@ -29,9 +30,9 @@ namespace linker.plugins.client config.Data.Client.Name = newName; config.Data.Update(); } - public void SetGroup(ClientGroupInfo[] groups) + public void SetGroup(SignInClientGroupInfo group) { - config.Data.Client.Groups = groups.DistinctBy(c => c.Name).ToArray(); + config.Data.Client.Groups = [group]; config.Data.Update(); } public void SetGroupPassword(string password) @@ -39,9 +40,9 @@ namespace linker.plugins.client Group.Password = password; config.Data.Update(); } - public void SetServer(ClientServerInfo[] servers) + public void SetServer(SignInClientServerInfo server) { - config.Data.Client.Servers = servers; + config.Data.Client.Servers = [server]; config.Data.Update(); } diff --git a/linker/plugins/signIn/SignInStore.cs b/linker.messenger.store.file/signIn/SignInServerStore.cs similarity index 72% rename from linker/plugins/signIn/SignInStore.cs rename to linker.messenger.store.file/signIn/SignInServerStore.cs index 19c7ad9c..966c6fc7 100644 --- a/linker/plugins/signIn/SignInStore.cs +++ b/linker.messenger.store.file/signIn/SignInServerStore.cs @@ -1,18 +1,20 @@ using linker.messenger.signin; -using linker.store; using LiteDB; -namespace linker.plugins.signIn +namespace linker.messenger.store.file.signIn { - public sealed class SignInStore : ISignInStore + public sealed class SignInServerStore : ISignInServerStore { + public string SecretKey => fileConfig.Data.Server.SignIn.SecretKey; private readonly Storefactory dBfactory; private readonly ILiteCollection liteCollection; - public SignInStore(Storefactory dBfactory) + private readonly FileConfig fileConfig; + public SignInServerStore(Storefactory dBfactory, FileConfig fileConfig) { this.dBfactory = dBfactory; liteCollection = dBfactory.GetCollection("signs"); + this.fileConfig = fileConfig; } public void Confirm() @@ -32,7 +34,7 @@ namespace linker.plugins.signIn public IEnumerable Find() { - return liteCollection.FindAll(); + return liteCollection.FindAll(); } public string Insert(SignCacheInfo value) diff --git a/linker.messenger.store.file/signIn/SignInSync.cs b/linker.messenger.store.file/signIn/SignInSync.cs new file mode 100644 index 00000000..a890efea --- /dev/null +++ b/linker.messenger.store.file/signIn/SignInSync.cs @@ -0,0 +1,48 @@ +using linker.libs; +using linker.messenger.signin; +using linker.messenger.sync; + +namespace linker.messenger.store.file.signIn +{ + public sealed class SignInSyncSecretKey : ISync + { + public string Name => "SignInSecretKey"; + + private readonly ISignInClientStore signInClientStore; + private readonly ISerializer serializer; + public SignInSyncSecretKey(ISignInClientStore signInClientStore, ISerializer serializer) + { + this.signInClientStore = signInClientStore; + } + public Memory GetData() + { + return serializer.Serialize(signInClientStore.Server.SecretKey); + } + + public void SetData(Memory data) + { + signInClientStore.SetSecretKey(serializer.Deserialize(data.Span)); + } + } + public sealed class SignInSyncGroupSecretKey : ISync + { + public string Name => "GroupSecretKey"; + + private readonly ISignInClientStore signInClientStore; + private readonly ISerializer serializer; + public SignInSyncGroupSecretKey(ISignInClientStore signInClientStore, ISerializer serializer) + { + this.signInClientStore = signInClientStore; + this.serializer = serializer; + } + public Memory GetData() + { + return serializer.Serialize(signInClientStore.Group.Password); + } + + public void SetData(Memory data) + { + signInClientStore.SetGroupPassword(serializer.Deserialize(data.Span)); + } + } +} diff --git a/linker.messenger.store.file/socks5/Config.cs b/linker.messenger.store.file/socks5/Config.cs new file mode 100644 index 00000000..89e4fdce --- /dev/null +++ b/linker.messenger.store.file/socks5/Config.cs @@ -0,0 +1,24 @@ + +using linker.messenger.socks5; + +namespace linker.messenger.store.file +{ + public sealed partial class Socks5ConfigInfo + { + public Socks5ConfigInfo() { } + public int Port { get; set; } = 1805; + /// + /// 局域网配置列表 + /// + public List Lans { get; set; } = new List(); + + /// + /// 是否在运行中 + /// + public bool Running { get; set; } + } + public sealed partial class RunningConfigInfo + { + public Socks5ConfigInfo Socks5 { get; set; } = new Socks5ConfigInfo(); + } +} diff --git a/linker.messenger.store.file/socks5/Socks5Store.cs b/linker.messenger.store.file/socks5/Socks5Store.cs new file mode 100644 index 00000000..5bf988e2 --- /dev/null +++ b/linker.messenger.store.file/socks5/Socks5Store.cs @@ -0,0 +1,37 @@ +using linker.messenger.socks5; + +namespace linker.messenger.store.file.socks5 +{ + public sealed class Socks5Store : ISocks5Store + { + public List Lans => runningConfig.Data.Socks5.Lans; + + public int Port => runningConfig.Data.Socks5.Port; + + public bool Running => runningConfig.Data.Socks5.Running; + + private readonly RunningConfig runningConfig; + public Socks5Store(RunningConfig runningConfig) + { + this.runningConfig = runningConfig; + } + + public void SetLans(List lans) + { + runningConfig.Data.Socks5.Lans = lans; + runningConfig.Data.Update(); + } + + public void SetPort(int port) + { + runningConfig.Data.Socks5.Port = port; + runningConfig.Data.Update(); + } + + public void SetRunning(bool running) + { + runningConfig.Data.Socks5.Running = running; + runningConfig.Data.Update(); + } + } +} diff --git a/linker.messenger.store.file/tunnel/Config.cs b/linker.messenger.store.file/tunnel/Config.cs new file mode 100644 index 00000000..f4f6693a --- /dev/null +++ b/linker.messenger.store.file/tunnel/Config.cs @@ -0,0 +1,38 @@ +using linker.tunnel.transport; +using LiteDB; +namespace linker.messenger.store.file +{ + public sealed partial class RunningConfigInfo + { + /// + /// 打洞配置 + /// + public TunnelRunningInfo Tunnel { get; set; } = new TunnelRunningInfo(); + } + + public sealed class TunnelRunningInfo + { + public TunnelRunningInfo() { } + public ObjectId Id { get; set; } + /// + /// 附加的网关层级 + /// + public int RouteLevelPlus { get; set; } + + public int PortMapWan { get; set; } + public int PortMapLan { get; set; } + } + + public partial class ConfigClientInfo + { + public TunnelConfigClientInfo Tunnel { get; set; } = new TunnelConfigClientInfo(); + } + public sealed class TunnelConfigClientInfo + { + /// + /// 打洞协议列表 + /// + public List Transports { get; set; } = new List(); + } +} + diff --git a/linker.messenger.store.file/tunnel/TunnelClientStore.cs b/linker.messenger.store.file/tunnel/TunnelClientStore.cs new file mode 100644 index 00000000..a237142c --- /dev/null +++ b/linker.messenger.store.file/tunnel/TunnelClientStore.cs @@ -0,0 +1,60 @@ +using linker.tunnel.transport; +using linker.messenger.signin; +using linker.plugins.tunnel; + +namespace linker.messenger.store.file.tunnel +{ + public sealed class TunnelClientStore : ITunnelClientStore + { + public int RouteLevelPlus => runningConfig.Data.Tunnel.RouteLevelPlus; + + public int PortMapPrivate => runningConfig.Data.Tunnel.PortMapLan; + public int PortMapPublic => runningConfig.Data.Tunnel.PortMapWan; + + public Action OnChanged { get; set; } = () => { }; + + private readonly SignInClientState signInClientState; + private readonly ISignInClientStore signInClientStore; + private readonly FileConfig config; + private readonly RunningConfig runningConfig; + + public TunnelClientStore(SignInClientState signInClientState, ISignInClientStore signInClientStore, FileConfig config, RunningConfig runningConfig) + { + this.signInClientState = signInClientState; + this.signInClientStore = signInClientStore; + this.config = config; + this.runningConfig = runningConfig; + } + public async Task SetTunnelTransports(List list) + { + config.Data.Client.Tunnel.Transports = list; + config.Data.Update(); + + OnChanged(); + + return await Task.FromResult(true); + } + + public async Task> GetTunnelTransports() + { + return await Task.FromResult(config.Data.Client.Tunnel.Transports); + } + + public async Task SetRouteLevelPlus(int level) + { + runningConfig.Data.Tunnel.RouteLevelPlus = level; + runningConfig.Data.Update(); + OnChanged(); + return await Task.FromResult(true); + } + + public async Task SetPortMap(int privatePort, int publicPort) + { + runningConfig.Data.Tunnel.PortMapLan = privatePort; + runningConfig.Data.Tunnel.PortMapWan = publicPort; + runningConfig.Data.Update(); + OnChanged(); + return await Task.FromResult(true); + } + } +} diff --git a/linker.messenger.store.file/updater/Config.cs b/linker.messenger.store.file/updater/Config.cs new file mode 100644 index 00000000..b81148ea --- /dev/null +++ b/linker.messenger.store.file/updater/Config.cs @@ -0,0 +1,24 @@ +using linker.messenger.updater; + +namespace linker.messenger.store.file +{ + public sealed partial class ConfigCommonInfo + { + public string UpdateUrl { get; set; } = "https://static.qbcode.cn/downloads/linker"; + public int UpdateIntervalSeconds { get; set; } = 60; + } + public partial class ConfigClientInfo + { + /// + /// 服务器穿透配置 + /// + public UpdaterConfigClientInfo Updater { get; set; } = new UpdaterConfigClientInfo(); + } + public partial class ConfigServerInfo + { + /// + /// 服务器穿透配置 + /// + public UpdaterConfigServerInfo Updater { get; set; } = new UpdaterConfigServerInfo(); + } +} diff --git a/linker.messenger.store.file/updater/UpdaterClientStore.cs b/linker.messenger.store.file/updater/UpdaterClientStore.cs new file mode 100644 index 00000000..5a3293b8 --- /dev/null +++ b/linker.messenger.store.file/updater/UpdaterClientStore.cs @@ -0,0 +1,26 @@ +using linker.config; +using linker.messenger.updater; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace linker.messenger.store.file.updater +{ + public sealed class UpdaterClientStore : IUpdaterClientStore + { + public string SecretKey => fileConfig.Data.Client.Updater.SecretKey; + + private readonly FileConfig fileConfig; + public UpdaterClientStore(FileConfig fileConfig) + { + this.fileConfig = fileConfig; + } + public void SetSecretKey(string key) + { + fileConfig.Data.Client.Updater.SecretKey = key; + fileConfig.Data.Update(); + } + } +} diff --git a/linker/plugins/updater/UpdaterCommonTransfer.cs b/linker.messenger.store.file/updater/UpdaterCommonStore.cs similarity index 69% rename from linker/plugins/updater/UpdaterCommonTransfer.cs rename to linker.messenger.store.file/updater/UpdaterCommonStore.cs index 7b6cdef9..c5ecd482 100644 --- a/linker/plugins/updater/UpdaterCommonTransfer.cs +++ b/linker.messenger.store.file/updater/UpdaterCommonStore.cs @@ -1,16 +1,15 @@ -using linker.config; - -namespace linker.plugins.updater + +using linker.messenger.updater; +namespace linker.messenger.store.file.updater { - public sealed class UpdaterCommonTransfer + public sealed class UpdaterCommonStore : IUpdaterCommonStore { - public string UpdateUrl => fileConfig.Data.Common.UpdateUrl; + public int UpdateIntervalSeconds => fileConfig.Data.Common.UpdateIntervalSeconds; private readonly FileConfig fileConfig; - - public UpdaterCommonTransfer( FileConfig fileConfig) + public UpdaterCommonStore(FileConfig fileConfig) { this.fileConfig = fileConfig; } diff --git a/linker.messenger.store.file/updater/UpdaterServerStore.cs b/linker.messenger.store.file/updater/UpdaterServerStore.cs new file mode 100644 index 00000000..27b134e3 --- /dev/null +++ b/linker.messenger.store.file/updater/UpdaterServerStore.cs @@ -0,0 +1,16 @@ + +using linker.messenger.updater; + +namespace linker.messenger.store.file.updater +{ + public sealed class UpdaterServerStore : IUpdaterServerStore + { + public string SecretKey => fileConfig.Data.Server.Updater.SecretKey; + + private readonly FileConfig fileConfig; + public UpdaterServerStore(FileConfig fileConfig) + { + this.fileConfig = fileConfig; + } + } +} diff --git a/linker.messenger.sync/Entry.cs b/linker.messenger.sync/Entry.cs new file mode 100644 index 00000000..dca17234 --- /dev/null +++ b/linker.messenger.sync/Entry.cs @@ -0,0 +1,39 @@ +using linker.libs.api; +using Microsoft.Extensions.DependencyInjection; +using IApiServer = linker.messenger.api.IApiServer; +namespace linker.messenger.sync +{ + public static class Entry + { + public static ServiceCollection AddSyncClient(this ServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + return serviceCollection; + } + public static ServiceProvider UseSyncClient(this ServiceProvider serviceProvider) + { + IMessengerResolver messengerResolver= serviceProvider.GetService(); + messengerResolver.AddMessenger(new List { serviceProvider.GetService() }); + + IApiServer apiServer = serviceProvider.GetService(); + apiServer.AddPlugins(new List { serviceProvider.GetService() }); + + return serviceProvider; + } + + public static ServiceCollection AddSyncServer(this ServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + return serviceCollection; + } + public static ServiceProvider UseSyncServer(this ServiceProvider serviceProvider) + { + IMessengerResolver messengerResolver = serviceProvider.GetService(); + messengerResolver.AddMessenger(new List { serviceProvider.GetService() }); + + return serviceProvider; + } + } +} diff --git a/linker.messenger.sync/ISync.cs b/linker.messenger.sync/ISync.cs new file mode 100644 index 00000000..4bfea295 --- /dev/null +++ b/linker.messenger.sync/ISync.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace linker.messenger.sync +{ + public interface ISync + { + public string Name { get; } + public Memory GetData(); + public void SetData(Memory data); + } + + public sealed partial class SyncInfo + { + public SyncInfo() { } + public string Name { get; set; } + public Memory Data { get; set; } + } +} diff --git a/linker.messenger.sync/SyncApiController.cs b/linker.messenger.sync/SyncApiController.cs new file mode 100644 index 00000000..c8c44720 --- /dev/null +++ b/linker.messenger.sync/SyncApiController.cs @@ -0,0 +1,34 @@ +using linker.libs.api; +using linker.libs.extends; +namespace linker.messenger.sync +{ + public sealed class SyncApiController : IApiController + { + private readonly SyncTreansfer syncTreansfer; + + public SyncApiController(SyncTreansfer syncTreansfer) + { + this.syncTreansfer = syncTreansfer; + } + + public List SyncNames(ApiControllerParamsInfo param) + { + return syncTreansfer.GetNames(); + } + public async Task Sync(ApiControllerParamsInfo param) + { + string[] names = param.Content.DeJson(); + if (names.Length == 1) + { + await syncTreansfer.Sync(names[0]); + } + else + { + syncTreansfer.Sync(names); + } + + return true; + } + } + +} diff --git a/linker/plugins/config/messenger/ConfigMessenger.cs b/linker.messenger.sync/SyncMessenger.cs similarity index 60% rename from linker/plugins/config/messenger/ConfigMessenger.cs rename to linker.messenger.sync/SyncMessenger.cs index 3871231f..922cee0d 100644 --- a/linker/plugins/config/messenger/ConfigMessenger.cs +++ b/linker.messenger.sync/SyncMessenger.cs @@ -1,25 +1,26 @@ -using linker.messenger; +using linker.libs; using linker.messenger.signin; -using MemoryPack; -namespace linker.plugins.config.messenger +namespace linker.messenger.sync { - public sealed class ConfigServerMessenger : IMessenger + public sealed class SyncServerMessenger : IMessenger { private readonly IMessengerSender sender; - private readonly SignCaching signCaching; + private readonly SignInServerCaching signCaching; + private readonly ISerializer serializer; - public ConfigServerMessenger(IMessengerSender sender, SignCaching signCaching) + public SyncServerMessenger(IMessengerSender sender, SignInServerCaching signCaching, ISerializer serializer) { this.sender = sender; this.signCaching = signCaching; + this.serializer = serializer; } [MessengerId((ushort)ConfigMessengerIds.SyncForward)] public async Task SyncForward(IConnection connection) { - ConfigAsyncInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + SyncInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (signCaching.TryGet(connection.Id, out SignCacheInfo cache)) { List caches = signCaching.Get(cache.GroupId); @@ -40,19 +41,20 @@ namespace linker.plugins.config.messenger } } - public sealed class ConfigClientMessenger : IMessenger + public sealed class SyncClientMessenger : IMessenger { - private readonly ConfigSyncTreansfer syncTreansfer; - - public ConfigClientMessenger(ConfigSyncTreansfer syncTreansfer) + private readonly SyncTreansfer syncTreansfer; + private readonly ISerializer serializer; + public SyncClientMessenger(SyncTreansfer syncTreansfer, ISerializer serializer) { this.syncTreansfer = syncTreansfer; + this.serializer = serializer; } [MessengerId((ushort)ConfigMessengerIds.Sync)] public void Sync(IConnection connection) { - ConfigAsyncInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + SyncInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); syncTreansfer.Sync(info); } diff --git a/linker/plugins/config/messenger/ConfigMessengerIds.cs b/linker.messenger.sync/SyncMessengerIds.cs similarity index 76% rename from linker/plugins/config/messenger/ConfigMessengerIds.cs rename to linker.messenger.sync/SyncMessengerIds.cs index 175aa0c7..b8428a26 100644 --- a/linker/plugins/config/messenger/ConfigMessengerIds.cs +++ b/linker.messenger.sync/SyncMessengerIds.cs @@ -1,4 +1,4 @@ -namespace linker.plugins.config.messenger +namespace linker.messenger.sync { public enum ConfigMessengerIds : ushort { diff --git a/linker/plugins/config/ConfigSyncTreansfer.cs b/linker.messenger.sync/SyncTreansfer.cs similarity index 54% rename from linker/plugins/config/ConfigSyncTreansfer.cs rename to linker.messenger.sync/SyncTreansfer.cs index d38e92ea..cb0b0e91 100644 --- a/linker/plugins/config/ConfigSyncTreansfer.cs +++ b/linker.messenger.sync/SyncTreansfer.cs @@ -1,43 +1,26 @@ using linker.libs; -using linker.messenger; -using linker.plugins.client; -using linker.plugins.config.messenger; -using linker.plugins.messenger; -using MemoryPack; +using linker.messenger.signin; -namespace linker.plugins.config +namespace linker.messenger.sync { - public interface IConfigSync - { - public string Name { get; } - public Memory GetData(); - public void SetData(Memory data); - } - - [MemoryPackable] - public sealed partial class ConfigAsyncInfo - { - public ConfigAsyncInfo() { } - public string Name { get; set; } - public Memory Data { get; set; } - } - - public sealed class ConfigSyncTreansfer + public sealed class SyncTreansfer { private readonly SemaphoreSlim slim = new SemaphoreSlim(1); - private List syncs = new List(); + private List syncs = new List(); private readonly IMessengerSender messengerSender; - private readonly ClientSignInState clientSignInState; - public ConfigSyncTreansfer(IMessengerSender messengerSender, ClientSignInState clientSignInState) + private readonly SignInClientState signInClientState; + private readonly ISerializer serializer; + public SyncTreansfer(IMessengerSender messengerSender, SignInClientState signInClientState, ISerializer serializer) { this.messengerSender = messengerSender; - this.clientSignInState = clientSignInState; + this.signInClientState = signInClientState; + this.serializer = serializer; } - public void LoadConfigSyncs(List list) + public void AddSyncs(List list) { - syncs = list; + syncs = syncs.Concat(list).Distinct().ToList(); } public List GetNames() @@ -56,9 +39,9 @@ namespace linker.plugins.config { return messengerSender.SendOnly(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)ConfigMessengerIds.SyncForward, - Payload = MemoryPackSerializer.Serialize(new ConfigAsyncInfo { Name = c.Name, Data = c.GetData() }), + Payload = serializer.Serialize(new SyncInfo { Name = c.Name, Data = c.GetData() }), }); }).ToList(); @@ -77,13 +60,13 @@ namespace linker.plugins.config { await messengerSender.SendOnly(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)ConfigMessengerIds.SyncForward, - Payload = MemoryPackSerializer.Serialize(new ConfigAsyncInfo { Name = sync.Name, Data = sync.GetData() }), + Payload = serializer.Serialize(new SyncInfo { Name = sync.Name, Data = sync.GetData() }), }); } } - public void Sync(ConfigAsyncInfo info) + public void Sync(SyncInfo info) { var sync = syncs.FirstOrDefault(c => c.Name == info.Name); if (sync != null) diff --git a/linker.messenger.sync/linker.messenger.sync.csproj b/linker.messenger.sync/linker.messenger.sync.csproj new file mode 100644 index 00000000..4635dda5 --- /dev/null +++ b/linker.messenger.sync/linker.messenger.sync.csproj @@ -0,0 +1,42 @@ + + + + + + net8.0 + enable + disable + true + false + true + True + linker messenger sync + snltty + snltty + linker messenger sync + snltty + https://github.com/snltty/linker + https://github.com/snltty/linker + linker messenger sync + 1.6.4 + 1.6.4 + 1.6.4 + + + + full + true + + + none + false + True + + + + + + + + + diff --git a/linker.messenger.tunnel/Config.cs b/linker.messenger.tunnel/Config.cs new file mode 100644 index 00000000..af65fb6e --- /dev/null +++ b/linker.messenger.tunnel/Config.cs @@ -0,0 +1,22 @@ +namespace linker.messenger.tunnel +{ + public sealed partial class TunnelRouteLevelInfo + { + public string MachineId { get; set; } + public int RouteLevel { get; set; } + public int RouteLevelPlus { get; set; } + + public bool NeedReboot { get; set; } + + public int PortMapWan { get; set; } + public int PortMapLan { get; set; } + } + + public sealed partial class TunnelSetRouteLevelInfo + { + public string MachineId { get; set; } + public int RouteLevelPlus { get; set; } + public int PortMapWan { get; set; } + public int PortMapLan { get; set; } + } +} diff --git a/linker.messenger.tunnel/Entry.cs b/linker.messenger.tunnel/Entry.cs new file mode 100644 index 00000000..b0299980 --- /dev/null +++ b/linker.messenger.tunnel/Entry.cs @@ -0,0 +1,75 @@ +using linker.messenger.api; +using linker.messenger.decenter; +using linker.messenger.exroute; +using linker.messenger.signin; +using linker.plugins.tunnel; +using linker.tunnel; +using Microsoft.Extensions.DependencyInjection; +using System.Security.Cryptography.X509Certificates; +namespace linker.messenger.tunnel +{ + public static class Entry + { + public static X509Certificate2 certificate; + public static ServiceCollection AddTunnelClient(this ServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + + return serviceCollection; + } + public static ServiceProvider UseTunnelClient(this ServiceProvider serviceProvider, X509Certificate2 certificate) + { + Entry.certificate = certificate; + + TunnelNetworkTransfer tunnelNetworkTransfer = serviceProvider.GetService(); + + TunnelTransfer tunnelTransfer = serviceProvider.GetService(); + TunnelClientExcludeIPTransfer signInArgsTransfer = serviceProvider.GetService(); + + IMessengerResolver messengerResolver = serviceProvider.GetService(); + messengerResolver.AddMessenger(new List { serviceProvider.GetService() }); + + + DecenterClientTransfer decenterClientTransfer = serviceProvider.GetService(); + decenterClientTransfer.AddDecenters(new List { serviceProvider.GetService() }); + + IApiServer apiServer = serviceProvider.GetService(); + apiServer.AddPlugins(new List { serviceProvider.GetService() }); + + + ExRouteTransfer exRouteTransfer= serviceProvider.GetService(); + exRouteTransfer.AddExRoutes(new List { serviceProvider.GetService() }); + + return serviceProvider; + } + + + public static ServiceCollection AddTunnelServer(this ServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + return serviceCollection; + } + public static ServiceProvider UseTunnelServer(this ServiceProvider serviceProvider) + { + IMessengerResolver messengerResolver = serviceProvider.GetService(); + messengerResolver.AddMessenger(new List { serviceProvider.GetService() }); + + ResolverTransfer resolverTransfer = new ResolverTransfer(); + resolverTransfer.AddResolvers(new List { serviceProvider.GetService() }); + + return serviceProvider; + } + } +} diff --git a/linker.messenger.tunnel/ITunnelExcludeIP.cs b/linker.messenger.tunnel/ITunnelClientExcludeIP.cs similarity index 79% rename from linker.messenger.tunnel/ITunnelExcludeIP.cs rename to linker.messenger.tunnel/ITunnelClientExcludeIP.cs index eae4f8f3..4b733a33 100644 --- a/linker.messenger.tunnel/ITunnelExcludeIP.cs +++ b/linker.messenger.tunnel/ITunnelClientExcludeIP.cs @@ -5,7 +5,7 @@ namespace linker.messenger.tunnel /// /// 打洞排除IP /// - public interface ITunnelExcludeIP + public interface ITunnelClientExcludeIP { public List Get(); } diff --git a/linker/plugins/tunnel/TunnelApiController.cs b/linker.messenger.tunnel/TunnelApiController.cs similarity index 51% rename from linker/plugins/tunnel/TunnelApiController.cs rename to linker.messenger.tunnel/TunnelApiController.cs index 85a98b7a..a33f36a5 100644 --- a/linker/plugins/tunnel/TunnelApiController.cs +++ b/linker.messenger.tunnel/TunnelApiController.cs @@ -1,39 +1,33 @@ -using linker.config; -using linker.tunnel.transport; +using linker.tunnel.transport; using linker.libs.api; using linker.libs.extends; -using MemoryPack; using System.Collections.Concurrent; -using linker.plugins.client; -using linker.plugins.capi; -using linker.plugins.access; -using linker.messenger; -using linker.messenger.tunnel; +using linker.messenger.signin; +using linker.plugins.tunnel; +using linker.libs; -namespace linker.plugins.tunnel +namespace linker.messenger.tunnel { /// /// 管理接口 /// - public sealed class TunnelApiController : IApiClientController + public sealed class TunnelApiController : IApiController { - private readonly ClientSignInState clientSignInState; + private readonly SignInClientState signInClientState; private readonly IMessengerSender messengerSender; - private readonly TunnelConfigTransfer tunnelConfigTransfer; - private readonly TunnelExcludeIPTransfer excludeIPTransfer; - private readonly AccessTransfer accessTransfer; - private readonly ClientConfigTransfer clientConfigTransfer; + private readonly ISignInClientStore signInClientStore; private readonly TunnelDecenter tunnelDecenter; + private readonly ITunnelClientStore tunnelClientStore; + private readonly ISerializer serializer; - public TunnelApiController(ClientSignInState clientSignInState, IMessengerSender messengerSender, TunnelConfigTransfer tunnelConfigTransfer, TunnelExcludeIPTransfer excludeIPTransfer, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer, TunnelDecenter tunnelDecenter) + public TunnelApiController(SignInClientState signInClientState, IMessengerSender messengerSender, ISignInClientStore signInClientStore, TunnelDecenter tunnelDecenter, ITunnelClientStore tunnelClientStore, ISerializer serializer) { - this.clientSignInState = clientSignInState; + this.signInClientState = signInClientState; this.messengerSender = messengerSender; - this.tunnelConfigTransfer = tunnelConfigTransfer; - this.excludeIPTransfer = excludeIPTransfer; - this.accessTransfer = accessTransfer; - this.clientConfigTransfer = clientConfigTransfer; + this.signInClientStore = signInClientStore; this.tunnelDecenter = tunnelDecenter; + this.tunnelClientStore = tunnelClientStore; + this.serializer = serializer; } /// @@ -70,22 +64,20 @@ namespace linker.plugins.tunnel /// public async Task SetRouteLevel(ApiControllerParamsInfo param) { - TunnelTransportRouteLevelInfo tunnelTransportFileConfigInfo = param.Content.DeJson(); + TunnelSetRouteLevelInfo tunnelSetRouteLevelInfo = param.Content.DeJson(); - if (tunnelTransportFileConfigInfo.MachineId == clientConfigTransfer.Id) + if (tunnelSetRouteLevelInfo.MachineId == signInClientStore.Id) { - if (accessTransfer.HasAccess(ClientApiAccess.TunnelChangeSelf) == false) return false; - tunnelConfigTransfer.OnLocalRouteLevel(tunnelTransportFileConfigInfo); + await tunnelClientStore.SetRouteLevelPlus(tunnelSetRouteLevelInfo.RouteLevelPlus); + await tunnelClientStore.SetPortMap(tunnelSetRouteLevelInfo.PortMapLan, tunnelSetRouteLevelInfo.PortMapWan); } else { - if (accessTransfer.HasAccess(ClientApiAccess.TunnelChangeOther) == false) return false; - await messengerSender.SendOnly(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)TunnelMessengerIds.RouteLevelForward, - Payload = MemoryPackSerializer.Serialize(tunnelTransportFileConfigInfo) + Payload = serializer.Serialize(tunnelSetRouteLevelInfo) }).ConfigureAwait(false); } @@ -96,29 +88,27 @@ namespace linker.plugins.tunnel /// /// /// - public List GetTransports(ApiControllerParamsInfo param) + public async Task> GetTransports(ApiControllerParamsInfo param) { - return tunnelConfigTransfer.Transports; + return await tunnelClientStore.GetTunnelTransports(); } /// /// 设置打洞协议 /// /// /// - [ClientApiAccessAttribute(ClientApiAccess.Transport)] - public bool SetTransports(ApiControllerParamsInfo param) + public async Task SetTransports(ApiControllerParamsInfo param) { List info = param.Content.DeJson>(); - tunnelConfigTransfer.SetTransports(info); + await tunnelClientStore.SetTunnelTransports(info); return true; } public sealed class TunnelListInfo { - public ConcurrentDictionary List { get; set; } + public ConcurrentDictionary List { get; set; } public ulong HashCode { get; set; } } - } } diff --git a/linker.messenger.tunnel/TunnelExcludeIPTransfer.cs b/linker.messenger.tunnel/TunnelClientExcludeIPTransfer.cs similarity index 62% rename from linker.messenger.tunnel/TunnelExcludeIPTransfer.cs rename to linker.messenger.tunnel/TunnelClientExcludeIPTransfer.cs index ef6ca9cb..e331dd05 100644 --- a/linker.messenger.tunnel/TunnelExcludeIPTransfer.cs +++ b/linker.messenger.tunnel/TunnelClientExcludeIPTransfer.cs @@ -5,11 +5,11 @@ namespace linker.messenger.tunnel /// /// 打洞排除IP /// - public sealed class TunnelExcludeIPTransfer + public sealed class TunnelClientExcludeIPTransfer { - private List excludeIPs = new List(); + private List excludeIPs = new List(); - public TunnelExcludeIPTransfer() + public TunnelClientExcludeIPTransfer() { } @@ -17,9 +17,9 @@ namespace linker.messenger.tunnel /// 加载排除IP的实现类 /// /// - public void LoadTunnelExcludeIPs(List list) + public void LoadTunnelExcludeIPs(List list) { - excludeIPs = list; + excludeIPs = excludeIPs.Concat(list).ToList(); } /// diff --git a/linker.messenger.tunnel/TunnelMessengerAdapter.cs b/linker.messenger.tunnel/TunnelClientMessengerAdapter.cs similarity index 72% rename from linker.messenger.tunnel/TunnelMessengerAdapter.cs rename to linker.messenger.tunnel/TunnelClientMessengerAdapter.cs index 17237ea8..7e7344df 100644 --- a/linker.messenger.tunnel/TunnelMessengerAdapter.cs +++ b/linker.messenger.tunnel/TunnelClientMessengerAdapter.cs @@ -5,28 +5,25 @@ using linker.tunnel; using linker.messenger; using linker.messenger.tunnel; using System.Security.Cryptography.X509Certificates; +using linker.messenger.signin; namespace linker.plugins.tunnel { /// /// 打洞信标适配存储 /// - public interface ITunnelMessengerAdapterStore + public interface ITunnelClientStore { - /// - /// 获取信标连接 - /// - public IConnection SignConnection { get; } - /// /// 配置的额外网络层级 /// public int RouteLevelPlus { get; } - /// - /// 加密密钥 + /// 设置额外的网关层级 /// - public X509Certificate2 Certificate { get; } + /// + /// + public Task SetRouteLevelPlus(int level); /// /// 端口映射内外端口 @@ -36,6 +33,13 @@ namespace linker.plugins.tunnel /// 端口映射外网端口 /// public int PortMapPublic { get; } + /// + /// 设置映射端口 + /// + /// + /// + /// + public Task SetPortMap(int privatePort, int publicPort); /// /// 获取打洞协议列表 @@ -48,34 +52,40 @@ namespace linker.plugins.tunnel /// public Task SetTunnelTransports(List list); + + public Action OnChanged { get; set; } } /// /// 打洞信标适配 /// - public class TunnelMessengerAdapter: ITunnelMessengerAdapter + public class TunnelClientMessengerAdapter : ITunnelMessengerAdapter { - public string MachineId => tunnelMessengerAdapterStore.SignConnection?.Id ?? string.Empty; + public string MachineId => signInClientState.Connection?.Id ?? string.Empty; public int RouteLevelPlus => tunnelMessengerAdapterStore.RouteLevelPlus; - public IPEndPoint ServerHost => tunnelMessengerAdapterStore.SignConnection?.Address ?? null; - public X509Certificate2 Certificate => tunnelMessengerAdapterStore.Certificate; + public IPEndPoint ServerHost => signInClientState.Connection?.Address ?? null; + public X509Certificate2 Certificate => linker.messenger.tunnel.Entry.certificate; public int PortMapPrivate => tunnelMessengerAdapterStore.PortMapPrivate; public int PortMapPublic => tunnelMessengerAdapterStore.PortMapPublic; private readonly IMessengerSender messengerSender; - private readonly TunnelExcludeIPTransfer excludeIPTransfer; + private readonly TunnelClientExcludeIPTransfer excludeIPTransfer; private readonly ISerializer serializer; - private readonly ITunnelMessengerAdapterStore tunnelMessengerAdapterStore; + private readonly ITunnelClientStore tunnelMessengerAdapterStore; - public TunnelMessengerAdapter(IMessengerSender messengerSender, TunnelExcludeIPTransfer excludeIPTransfer, ISerializer serializer, ITunnelMessengerAdapterStore tunnelMessengerAdapterStore) + private readonly SignInClientState signInClientState; + + public TunnelClientMessengerAdapter(IMessengerSender messengerSender, TunnelClientExcludeIPTransfer excludeIPTransfer, + ISerializer serializer, ITunnelClientStore tunnelMessengerAdapterStore, SignInClientState signInClientState) { this.messengerSender = messengerSender; this.excludeIPTransfer = excludeIPTransfer; this.serializer = serializer; this.tunnelMessengerAdapterStore = tunnelMessengerAdapterStore; + this.signInClientState = signInClientState; } public async Task> GetExcludeIps() @@ -97,7 +107,7 @@ namespace linker.plugins.tunnel { MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap { - Connection = tunnelMessengerAdapterStore.SignConnection, + Connection = signInClientState.Connection, MessengerId = (ushort)TunnelMessengerIds.InfoForward, Payload = serializer.Serialize(info) }).ConfigureAwait(false); @@ -112,7 +122,7 @@ namespace linker.plugins.tunnel { MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap { - Connection = tunnelMessengerAdapterStore.SignConnection, + Connection = signInClientState.Connection, MessengerId = (ushort)TunnelMessengerIds.BeginForward, Payload = serializer.Serialize(tunnelTransportInfo) }).ConfigureAwait(false); @@ -122,7 +132,7 @@ namespace linker.plugins.tunnel { await messengerSender.SendOnly(new MessageRequestWrap { - Connection = tunnelMessengerAdapterStore.SignConnection, + Connection = signInClientState.Connection, MessengerId = (ushort)TunnelMessengerIds.FailForward, Payload = serializer.Serialize(tunnelTransportInfo) }).ConfigureAwait(false); @@ -132,7 +142,7 @@ namespace linker.plugins.tunnel { await messengerSender.SendOnly(new MessageRequestWrap { - Connection = tunnelMessengerAdapterStore.SignConnection, + Connection = signInClientState.Connection, MessengerId = (ushort)TunnelMessengerIds.SuccessForward, Payload = serializer.Serialize(tunnelTransportInfo) }).ConfigureAwait(false); diff --git a/linker.messenger.tunnel/TunnelDecenter.cs b/linker.messenger.tunnel/TunnelDecenter.cs new file mode 100644 index 00000000..55f198e8 --- /dev/null +++ b/linker.messenger.tunnel/TunnelDecenter.cs @@ -0,0 +1,70 @@ +using linker.libs; +using linker.messenger.decenter; +using linker.messenger.signin; +using linker.plugins.tunnel; +using System.Collections.Concurrent; +namespace linker.messenger.tunnel +{ + public sealed class TunnelDecenter : IDecenter + { + public string Name => "tunnel"; + public VersionManager SyncVersion { get; } = new VersionManager(); + public VersionManager DataVersion { get; } = new VersionManager(); + public ConcurrentDictionary Config { get; } = new ConcurrentDictionary(); + + private readonly ITunnelClientStore tunnelClientMessengerAdapterStore; + private readonly TunnelNetworkTransfer tunnelNetworkTransfer; + private readonly ISerializer serializer; + private readonly SignInClientState signInClientState; + + public TunnelDecenter(ITunnelClientStore tunnelClientMessengerAdapterStore, TunnelNetworkTransfer tunnelNetworkTransfer, ISerializer serializer, SignInClientState signInClientState) + { + this.tunnelClientMessengerAdapterStore = tunnelClientMessengerAdapterStore; + tunnelClientMessengerAdapterStore.OnChanged += Refresh; + this.tunnelNetworkTransfer = tunnelNetworkTransfer; + this.serializer = serializer; + this.signInClientState = signInClientState; + } + public void Refresh() + { + SyncVersion.Add(); + } + public Memory GetData() + { + TunnelRouteLevelInfo tunnelTransportRouteLevelInfo = GetLocalRouteLevel(); + Config.AddOrUpdate(tunnelTransportRouteLevelInfo.MachineId, tunnelTransportRouteLevelInfo, (a, b) => tunnelTransportRouteLevelInfo); + DataVersion.Add(); + return serializer.Serialize(tunnelTransportRouteLevelInfo); + } + public void SetData(Memory data) + { + TunnelRouteLevelInfo tunnelTransportRouteLevelInfo = serializer.Deserialize(data.Span); + Config.AddOrUpdate(tunnelTransportRouteLevelInfo.MachineId, tunnelTransportRouteLevelInfo, (a, b) => tunnelTransportRouteLevelInfo); + DataVersion.Add(); + } + public void SetData(List> data) + { + List list = data.Select(c => serializer.Deserialize(c.Span)).ToList(); + foreach (var item in list) + { + Config.AddOrUpdate(item.MachineId, item, (a, b) => item); + } + TunnelRouteLevelInfo config = GetLocalRouteLevel(); + Config.AddOrUpdate(config.MachineId, config, (a, b) => config); + DataVersion.Add(); + } + + private TunnelRouteLevelInfo GetLocalRouteLevel() + { + return new TunnelRouteLevelInfo + { + MachineId = signInClientState.Connection?.Id ?? string.Empty, + RouteLevel = tunnelNetworkTransfer.Info.RouteLevel, + NeedReboot = false, + PortMapLan = tunnelClientMessengerAdapterStore.PortMapPrivate, + PortMapWan = tunnelClientMessengerAdapterStore.PortMapPublic, + RouteLevelPlus = tunnelClientMessengerAdapterStore.RouteLevelPlus + }; + } + } +} diff --git a/linker.messenger.tunnel/TunnelExRoute.cs b/linker.messenger.tunnel/TunnelExRoute.cs new file mode 100644 index 00000000..5e419b70 --- /dev/null +++ b/linker.messenger.tunnel/TunnelExRoute.cs @@ -0,0 +1,21 @@ + +using linker.messenger.exroute; +using System.Net; + +namespace linker.messenger.tunnel +{ + public sealed class TunnelExRoute : IExRoute + { + private readonly TunnelNetworkTransfer tunnelNetworkTransfer; + public TunnelExRoute(TunnelNetworkTransfer tunnelNetworkTransfer) + { + this.tunnelNetworkTransfer = tunnelNetworkTransfer; + } + public List Get() + { + return tunnelNetworkTransfer.Info.LocalIPs.Where(c => c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) + //路由上的IP + .Concat(tunnelNetworkTransfer.Info.RouteIPs).ToList(); + } + } +} diff --git a/linker.messenger.tunnel/TunnelMessenger.cs b/linker.messenger.tunnel/TunnelMessenger.cs index ad7f05bf..29638c5d 100644 --- a/linker.messenger.tunnel/TunnelMessenger.cs +++ b/linker.messenger.tunnel/TunnelMessenger.cs @@ -2,6 +2,7 @@ using linker.tunnel.transport; using linker.libs; using linker.messenger.signin; +using linker.plugins.tunnel; namespace linker.messenger.tunnel { @@ -13,12 +14,14 @@ namespace linker.messenger.tunnel private readonly TunnelTransfer tunnel; private readonly IMessengerSender messengerSender; private readonly ISerializer serializer; + private readonly ITunnelClientStore tunnelClientStore; - public TunnelClientMessenger(TunnelTransfer tunnel, IMessengerSender messengerSender, ISerializer serializer) + public TunnelClientMessenger(TunnelTransfer tunnel, IMessengerSender messengerSender, ISerializer serializer, ITunnelClientStore tunnelClientStore) { this.tunnel = tunnel; this.messengerSender = messengerSender; this.serializer = serializer; + this.tunnelClientStore = tunnelClientStore; } [MessengerId((ushort)TunnelMessengerIds.Begin)] @@ -85,6 +88,15 @@ namespace linker.messenger.tunnel tunnel.OnSuccess(tunnelTransportInfo); } + + + [MessengerId((ushort)TunnelMessengerIds.RouteLevel)] + public async Task RouteLevel(IConnection connection) + { + TunnelSetRouteLevelInfo tunnelTransportFileConfigInfo = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + await tunnelClientStore.SetRouteLevelPlus(tunnelTransportFileConfigInfo.RouteLevelPlus); + await tunnelClientStore.SetPortMap(tunnelTransportFileConfigInfo.PortMapLan, tunnelTransportFileConfigInfo.PortMapWan); + } } /// @@ -93,10 +105,10 @@ namespace linker.messenger.tunnel public class TunnelServerMessenger : IMessenger { private readonly IMessengerSender messengerSender; - private readonly SignCaching signCaching; + private readonly SignInServerCaching signCaching; private readonly ISerializer serializer; - public TunnelServerMessenger(IMessengerSender messengerSender, SignCaching signCaching, ISerializer serializer) + public TunnelServerMessenger(IMessengerSender messengerSender, SignInServerCaching signCaching, ISerializer serializer) { this.messengerSender = messengerSender; this.signCaching = signCaching; @@ -187,5 +199,20 @@ namespace linker.messenger.tunnel } } + + [MessengerId((ushort)TunnelMessengerIds.RouteLevelForward)] + public async Task RouteLevelForward(IConnection connection) + { + TunnelRouteLevelInfo tunnelTransportInfo = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + if (signCaching.TryGet(tunnelTransportInfo.MachineId, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId) + { + await messengerSender.SendOnly(new MessageRequestWrap + { + Connection = cache.Connection, + MessengerId = (ushort)TunnelMessengerIds.RouteLevel, + Payload = connection.ReceiveRequestWrap.Payload + }).ConfigureAwait(false); + } + } } } diff --git a/linker.messenger.tunnel/TunnelNetworkTransfer.cs b/linker.messenger.tunnel/TunnelNetworkTransfer.cs new file mode 100644 index 00000000..7b490417 --- /dev/null +++ b/linker.messenger.tunnel/TunnelNetworkTransfer.cs @@ -0,0 +1,92 @@ +using linker.libs; +using linker.messenger.signin; +using linker.tunnel; +using System.Net; +using System.Net.Quic; + +namespace linker.messenger.tunnel +{ + public sealed class TunnelNetworkTransfer + { + private readonly ISignInClientStore signInClientStore; + public TunnelNetworkInfo Info { get; private set; } = new TunnelNetworkInfo(); + + public TunnelNetworkTransfer(ISignInClientStore signInClientStore, SignInClientState signInClientState,TunnelTransfer tunnelTransfer) + { + this.signInClientStore = signInClientStore; + signInClientState.NetworkEnabledHandle += (times) => + { + TimerHelper.Async(RefreshRouteLevel); + tunnelTransfer.Refresh(); + + }; + TestQuic(); + } + /// + /// 刷新网关等级数据 + /// + private void RefreshRouteLevel() + { + Info.RouteLevel = NetworkHelper.GetRouteLevel(signInClientStore.Server.Host, out List ips); + Info.RouteIPs = ips.ToArray(); + Info.LocalIPs = NetworkHelper.GetIPV6().Concat(NetworkHelper.GetIPV4()).ToArray(); + } + + private void TestQuic() + { + if (OperatingSystem.IsWindows()) + { + if (QuicListener.IsSupported == false) + { + try + { + if (File.Exists("msquic-openssl.dll")) + { + LoggerHelper.Instance.Warning($"copy msquic-openssl.dll -> msquic.dll,please restart linker"); + File.Move("msquic.dll", "msquic.dll.temp", true); + File.Move("msquic-openssl.dll", "msquic.dll", true); + + if (Environment.UserInteractive == false && OperatingSystem.IsWindows()) + { + Environment.Exit(1); + } + } + } + catch (Exception) + { + } + } + try + { + if (File.Exists("msquic.dll.temp")) + { + File.Delete("msquic.dll.temp"); + } + if (File.Exists("msquic-openssl.dll")) + { + File.Delete("msquic-openssl.dll"); + } + } + catch (Exception) + { + } + } + } + + public sealed class TunnelNetworkInfo + { + /// + /// 网关层级 + /// + public int RouteLevel { get; set; } + /// + /// 本地IP + /// + public IPAddress[] LocalIPs { get; set; } = Array.Empty(); + /// + /// 路由上的IP + /// + public IPAddress[] RouteIPs { get; set; } = Array.Empty(); + } + } +} diff --git a/linker.messenger.tunnel/TunnelExternalResolver.cs b/linker.messenger.tunnel/TunnelServerExternalResolver.cs similarity index 96% rename from linker.messenger.tunnel/TunnelExternalResolver.cs rename to linker.messenger.tunnel/TunnelServerExternalResolver.cs index ddec617c..06aaab1e 100644 --- a/linker.messenger.tunnel/TunnelExternalResolver.cs +++ b/linker.messenger.tunnel/TunnelServerExternalResolver.cs @@ -10,8 +10,10 @@ namespace linker.messenger.tunnel /// /// 外网端口处理器 /// - public class TunnelExternalResolver + public class TunnelServerExternalResolver: IResolver { + public ResolverType Type => ResolverType.External; + public virtual void AddReceive( ulong bytes) { } public virtual void AddSendt(ulong bytes) { } diff --git a/linker.messenger.tunnel/TunnelSync.cs b/linker.messenger.tunnel/TunnelSync.cs new file mode 100644 index 00000000..ad367d8d --- /dev/null +++ b/linker.messenger.tunnel/TunnelSync.cs @@ -0,0 +1,29 @@ +using linker.libs; +using linker.messenger.sync; +using linker.plugins.tunnel; +using linker.tunnel.transport; + +namespace linker.messenger.tunnel +{ + public sealed class TunnelSyncTransports : ISync + { + public string Name => "TunnelTransports"; + + private readonly ITunnelClientStore tunnelClientStore; + private readonly ISerializer serializer; + public TunnelSyncTransports(ITunnelClientStore tunnelClientStore, ISerializer serializer) + { + this.tunnelClientStore = tunnelClientStore; + this.serializer = serializer; + } + public Memory GetData() + { + return serializer.Serialize(tunnelClientStore.GetTunnelTransports().Result); + } + + public void SetData(Memory data) + { + tunnelClientStore.SetTunnelTransports(serializer.Deserialize>(data.Span)); + } + } +} diff --git a/linker.messenger.tunnel/linker.messenger.tunnel.csproj b/linker.messenger.tunnel/linker.messenger.tunnel.csproj index ba876950..56148435 100644 --- a/linker.messenger.tunnel/linker.messenger.tunnel.csproj +++ b/linker.messenger.tunnel/linker.messenger.tunnel.csproj @@ -8,7 +8,7 @@ false true True - linker messenger signin + linker messenger tunnel snltty snltty linker messenger tunnel @@ -32,6 +32,10 @@ + + + + diff --git a/linker.messenger.updater/Config.cs b/linker.messenger.updater/Config.cs new file mode 100644 index 00000000..92291c99 --- /dev/null +++ b/linker.messenger.updater/Config.cs @@ -0,0 +1,89 @@ +using linker.libs; +using System.Collections.Concurrent; +using System.Text.Json.Serialization; +namespace linker.messenger.updater +{ + public sealed partial class UpdaterConfirmInfo + { + public string MachineId { get; set; } + public string Version { get; set; } + public string SecretKey { get; set; } + public bool GroupAll { get; set; } + public bool All { get; set; } + } + public sealed partial class UpdaterConfirmServerInfo + { + public string SecretKey { get; set; } + public string Version { get; set; } + } + + public sealed class UpdaterConfigClientInfo + { + /// + /// 密钥 + /// + public string SecretKey { get; set; } = Helper.GlobalString; + } + public sealed class UpdaterConfigServerInfo + { + /// + /// 密钥 + /// +#if DEBUG + public string SecretKey { get; set; } = Helper.GlobalString; +#else + public string SecretKey { get; set; } = Guid.NewGuid().ToString().ToUpper(); +#endif + } + + + public sealed class UpdaterListInfo + { + public ConcurrentDictionary List { get; set; } + public ulong HashCode { get; set; } + } + + public sealed partial class UpdaterClientInfo + { + public string[] ToMachines { get; set; } + public UpdaterInfo Info { get; set; } + } + + public sealed partial class UpdaterInfo + { + public string Version { get; set; } + public string[] Msg { get; set; } + public string DateTime { get; set; } + + public string MachineId { get; set; } + + private ulong counter = 0; + [JsonIgnore] + public bool Updated => Interlocked.And(ref counter, 0x0) > 0; + + + private UpdaterStatus status = UpdaterStatus.None; + public UpdaterStatus Status { get => status; set { status = value; Interlocked.Increment(ref counter); } } + + private long length = 0; + public long Length { get => length; set { length = value; Interlocked.Increment(ref counter); } } + private long current = 0; + public long Current { get => current; set { current = value; Interlocked.Increment(ref counter); } } + + public void Update() + { + Interlocked.Increment(ref counter); + } + } + + public enum UpdaterStatus : byte + { + None = 0, + Checking = 1, + Checked = 2, + Downloading = 3, + Downloaded = 4, + Extracting = 5, + Extracted = 6 + } +} \ No newline at end of file diff --git a/linker.messenger.updater/Entry.cs b/linker.messenger.updater/Entry.cs new file mode 100644 index 00000000..5604f2a4 --- /dev/null +++ b/linker.messenger.updater/Entry.cs @@ -0,0 +1,55 @@ +using linker.messenger.api; +using linker.messenger.sync; +using Microsoft.Extensions.DependencyInjection; +namespace linker.messenger.updater +{ + public static class Entry + { + public static ServiceCollection AddUpdaterClient(this ServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + + return serviceCollection; + } + public static ServiceProvider UseUpdaterClient(this ServiceProvider serviceProvider) + { + UpdaterClientTransfer updaterClientTransfer = serviceProvider.GetService(); + + IMessengerResolver messengerResolver = serviceProvider.GetService(); + messengerResolver.AddMessenger(new List { serviceProvider.GetService() }); + + SyncTreansfer syncTransfer = serviceProvider.GetService(); + syncTransfer.AddSyncs(new List { serviceProvider.GetService() }); + + IApiServer apiServer = serviceProvider.GetService(); + apiServer.AddPlugins(new List { serviceProvider.GetService() }); + + return serviceProvider; + } + + + public static ServiceCollection AddUpdaterServer(this ServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + return serviceCollection; + } + public static ServiceProvider UseUpdaterServer(this ServiceProvider serviceProvider) + { + UpdaterServerTransfer updaterServerTransfer= serviceProvider.GetService(); + + IMessengerResolver messengerResolver = serviceProvider.GetService(); + messengerResolver.AddMessenger(new List { serviceProvider.GetService() }); + + return serviceProvider; + } + } +} diff --git a/linker.messenger.updater/IUpdaterClientStore.cs b/linker.messenger.updater/IUpdaterClientStore.cs new file mode 100644 index 00000000..23afd4c0 --- /dev/null +++ b/linker.messenger.updater/IUpdaterClientStore.cs @@ -0,0 +1,9 @@ +namespace linker.messenger.updater +{ + public interface IUpdaterClientStore + { + public string SecretKey { get; } + + public void SetSecretKey(string key); + } +} diff --git a/linker.messenger.updater/IUpdaterCommonStore.cs b/linker.messenger.updater/IUpdaterCommonStore.cs new file mode 100644 index 00000000..5b517a16 --- /dev/null +++ b/linker.messenger.updater/IUpdaterCommonStore.cs @@ -0,0 +1,10 @@ +namespace linker.messenger.updater +{ + public interface IUpdaterCommonStore + { + + public string UpdateUrl { get; } + public int UpdateIntervalSeconds { get; } + public void SetInterval(int sec); + } +} diff --git a/linker.messenger.updater/IUpdaterServerStore.cs b/linker.messenger.updater/IUpdaterServerStore.cs new file mode 100644 index 00000000..653fd08e --- /dev/null +++ b/linker.messenger.updater/IUpdaterServerStore.cs @@ -0,0 +1,7 @@ +namespace linker.messenger.updater +{ + public interface IUpdaterServerStore + { + public string SecretKey { get; } + } +} diff --git a/linker/plugins/updater/UpdaterClientApiController.cs b/linker.messenger.updater/UpdaterApiController.cs similarity index 50% rename from linker/plugins/updater/UpdaterClientApiController.cs rename to linker.messenger.updater/UpdaterApiController.cs index c41f7525..668d078c 100644 --- a/linker/plugins/updater/UpdaterClientApiController.cs +++ b/linker.messenger.updater/UpdaterApiController.cs @@ -1,105 +1,90 @@ using linker.libs.api; -using linker.config; -using linker.plugins.updater.messenger; -using MemoryPack; -using System.Collections.Concurrent; -using linker.plugins.updater.config; using linker.libs.extends; -using linker.client.config; -using linker.plugins.client; -using linker.plugins.capi; -using linker.plugins.messenger; using linker.libs; -using linker.plugins.access; -using linker.messenger; +using linker.messenger.signin; -namespace linker.plugins.updater +namespace linker.messenger.updater { - public sealed class UpdaterClientApiController : IApiClientController + public sealed class UpdaterApiController :IApiController { private readonly IMessengerSender messengerSender; private readonly UpdaterClientTransfer updaterTransfer; - private readonly ClientSignInState clientSignInState; - private readonly FileConfig config; - private readonly RunningConfig runningConfig; - private readonly AccessTransfer accessTransfer; - private readonly ClientConfigTransfer clientConfigTransfer; - private readonly UpdaterCommonTransfer updaterCommonTransfer; + private readonly SignInClientState signInClientState; + private readonly ISignInClientStore signInClientStore; + private readonly IUpdaterCommonStore updaterCommonTransfer; + private readonly ISerializer serializer; + private readonly IUpdaterClientStore updaterClientStore; - public UpdaterClientApiController(IMessengerSender messengerSender, UpdaterClientTransfer updaterTransfer, ClientSignInState clientSignInState, FileConfig config, RunningConfig runningConfig, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer, UpdaterCommonTransfer updaterCommonTransfer) + public UpdaterApiController(IMessengerSender messengerSender, UpdaterClientTransfer updaterTransfer, SignInClientState signInClientState, ISignInClientStore signInClientStore, + IUpdaterCommonStore updaterCommonTransfer, ISerializer serializer, IUpdaterClientStore updaterClientStore) { this.messengerSender = messengerSender; this.updaterTransfer = updaterTransfer; - this.clientSignInState = clientSignInState; - this.config = config; - this.runningConfig = runningConfig; - this.accessTransfer = accessTransfer; - this.clientConfigTransfer = clientConfigTransfer; + this.signInClientState = signInClientState; + this.signInClientStore = signInClientStore; this.updaterCommonTransfer = updaterCommonTransfer; + this.serializer = serializer; + this.updaterClientStore = updaterClientStore; } - [ClientApiAccessAttribute(ClientApiAccess.Config)] public string GetSecretKey(ApiControllerParamsInfo param) { - return updaterTransfer.GetSecretKey(); + return updaterClientStore.SecretKey; } - [ClientApiAccessAttribute(ClientApiAccess.Config)] public void SetSecretKey(ApiControllerParamsInfo param) { - updaterTransfer.SetSecretKey(param.Content); + updaterClientStore.SetSecretKey(param.Content); } - [ClientApiAccessAttribute(ClientApiAccess.Config)] public void SetInterval(ApiControllerParamsInfo param) { updaterCommonTransfer.SetInterval(int.Parse(param.Content)); } - public async Task GetServer(ApiControllerParamsInfo param) + public async Task GetServer(ApiControllerParamsInfo param) { MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)UpdaterMessengerIds.UpdateServer, }); if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0) { - return MemoryPackSerializer.Deserialize(resp.Data.Span); + return serializer.Deserialize(resp.Data.Span); } - return new UpdateInfo(); + return new UpdaterInfo(); } - [ClientApiAccessAttribute(ClientApiAccess.UpdateServer)] public async Task ConfirmServer(ApiControllerParamsInfo param) { await messengerSender.SendOnly(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)UpdaterMessengerIds.ConfirmServer, - Payload = MemoryPackSerializer.Serialize(new UpdaterConfirmServerInfo { SecretKey = updaterTransfer.SecretKey, Version = param.Content }) + Payload = serializer.Serialize(new UpdaterConfirmServerInfo { SecretKey = updaterClientStore.SecretKey, Version = param.Content }) }); } - [ClientApiAccessAttribute(ClientApiAccess.UpdateServer)] + public async Task ExitServer(ApiControllerParamsInfo param) { await messengerSender.SendOnly(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)UpdaterMessengerIds.ExitServer, - Payload = MemoryPackSerializer.Serialize(new UpdaterConfirmServerInfo { SecretKey = updaterTransfer.SecretKey, Version = string.Empty }) + Payload = serializer.Serialize(new UpdaterConfirmServerInfo { SecretKey = updaterClientStore.SecretKey, Version = string.Empty }) }); } - public UpdateInfo GetCurrent(ApiControllerParamsInfo param) + public UpdaterInfo GetCurrent(ApiControllerParamsInfo param) { var updaters = updaterTransfer.Get(); - if (updaters.TryGetValue(clientConfigTransfer.Id, out UpdateInfo info)) + if (updaters.TryGetValue(signInClientStore.Id, out UpdaterInfo info)) { return info; } - return new UpdateInfo { }; + return new UpdaterInfo { }; } public UpdaterListInfo Get(ApiControllerParamsInfo param) { @@ -119,51 +104,39 @@ namespace linker.plugins.updater { UpdaterConfirmInfo confirm = param.Content.DeJson(); - if (confirm.All || confirm.GroupAll || confirm.MachineId != clientConfigTransfer.Id) + if (confirm.All || confirm.GroupAll || confirm.MachineId != signInClientStore.Id) { - if (accessTransfer.HasAccess(ClientApiAccess.UpdateOther) == false) - { - return false; - } - - confirm.SecretKey = updaterTransfer.SecretKey; + confirm.SecretKey = updaterClientStore.SecretKey; MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)UpdaterMessengerIds.ConfirmForward, - Payload = MemoryPackSerializer.Serialize(confirm) + Payload = serializer.Serialize(confirm) }); if (resp.Code != MessageResponeCodes.OK || resp.Data.Span.SequenceEqual(Helper.TrueArray) == false) { return false; } } - if (confirm.MachineId == clientConfigTransfer.Id || confirm.All || confirm.GroupAll) + if (confirm.MachineId == signInClientStore.Id || confirm.All || confirm.GroupAll) { - if (accessTransfer.HasAccess(ClientApiAccess.UpdateSelf) == false) - { - return false; - } updaterTransfer.Confirm(confirm.Version); } return true; } public async Task Exit(ApiControllerParamsInfo param) { - if (string.IsNullOrWhiteSpace(param.Content) || param.Content == clientConfigTransfer.Id) + if (string.IsNullOrWhiteSpace(param.Content) || param.Content == signInClientStore.Id) { - if (accessTransfer.HasAccess(ClientApiAccess.UpdateSelf) == false) return false; - Environment.Exit(1); } else { - if (accessTransfer.HasAccess(ClientApiAccess.UpdateOther) == false) return false; await messengerSender.SendOnly(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)UpdaterMessengerIds.ExitForward, - Payload = MemoryPackSerializer.Serialize(param.Content) + Payload = serializer.Serialize(param.Content) }); } return true; @@ -174,32 +147,28 @@ namespace linker.plugins.updater { await messengerSender.SendOnly(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)UpdaterMessengerIds.SubscribeForward }); } public async Task Check(ApiControllerParamsInfo param) { - if(param.Content != clientConfigTransfer.Id) + if(param.Content != signInClientStore.Id) { await messengerSender.SendOnly(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)UpdaterMessengerIds.CheckForward, - Payload = string.IsNullOrWhiteSpace(param.Content) ? Helper.EmptyArray : MemoryPackSerializer.Serialize(param.Content) + Payload = string.IsNullOrWhiteSpace(param.Content) ? Helper.EmptyArray : serializer.Serialize(param.Content) }); } - if (string.IsNullOrWhiteSpace(param.Content) || param.Content == clientConfigTransfer.Id) + if (string.IsNullOrWhiteSpace(param.Content) || param.Content == signInClientStore.Id) { updaterTransfer.Check(); } } } - public sealed class UpdaterListInfo - { - public ConcurrentDictionary List { get; set; } - public ulong HashCode { get; set; } - } + } diff --git a/linker/plugins/updater/UpdaterClientTransfer.cs b/linker.messenger.updater/UpdaterClientTransfer.cs similarity index 61% rename from linker/plugins/updater/UpdaterClientTransfer.cs rename to linker.messenger.updater/UpdaterClientTransfer.cs index 4c836f38..2458e8e0 100644 --- a/linker/plugins/updater/UpdaterClientTransfer.cs +++ b/linker.messenger.updater/UpdaterClientTransfer.cs @@ -1,45 +1,34 @@ -using linker.client.config; -using linker.config; -using linker.libs; -using linker.messenger; -using linker.plugins.client; -using linker.plugins.messenger; -using linker.plugins.updater.messenger; -using MemoryPack; +using linker.libs; using System.Collections.Concurrent; +using linker.messenger.signin; -namespace linker.plugins.updater +namespace linker.messenger.updater { public sealed class UpdaterClientTransfer { - private UpdateInfo updateInfo = new UpdateInfo(); - private ConcurrentDictionary updateInfos = new ConcurrentDictionary(); + private UpdaterInfo updateInfo = new UpdaterInfo(); + private ConcurrentDictionary updateInfos = new ConcurrentDictionary(); private ConcurrentDictionary subscribes = new ConcurrentDictionary(); - public string SecretKey => fileConfig.Data.Client.Updater.SecretKey; - - private readonly FileConfig fileConfig; private readonly IMessengerSender messengerSender; - private readonly ClientSignInState clientSignInState; + private readonly SignInClientState signInClientState; private readonly UpdaterHelper updaterHelper; - private readonly ClientConfigTransfer clientConfigTransfer; - private readonly UpdaterCommonTransfer updaterCommonTransfer; - - private readonly RunningConfig running; + private readonly ISignInClientStore signInClientStore; + private readonly IUpdaterCommonStore updaterCommonTransfer; + private readonly ISerializer serializer; public VersionManager Version { get; } = new VersionManager(); - public UpdaterClientTransfer(FileConfig fileConfig, IMessengerSender messengerSender, ClientSignInState clientSignInState, UpdaterHelper updaterHelper, RunningConfig running, ClientConfigTransfer clientConfigTransfer, UpdaterCommonTransfer updaterCommonTransfer) + public UpdaterClientTransfer( IMessengerSender messengerSender, SignInClientState signInClientState, UpdaterHelper updaterHelper, ISignInClientStore signInClientStore, IUpdaterCommonStore updaterCommonTransfer, ISerializer serializer) { - this.fileConfig = fileConfig; this.messengerSender = messengerSender; - this.clientSignInState = clientSignInState; + this.signInClientState = signInClientState; this.updaterHelper = updaterHelper; - this.running = running; - this.clientConfigTransfer = clientConfigTransfer; + this.signInClientStore = signInClientStore; this.updaterCommonTransfer = updaterCommonTransfer; + this.serializer = serializer; - clientSignInState.NetworkFirstEnabledHandle += Init; + signInClientState.NetworkFirstEnabledHandle += Init; } private void Init() @@ -49,21 +38,11 @@ namespace linker.plugins.updater updateInfo.Update(); } - public string GetSecretKey() - { - return fileConfig.Data.Client.Updater.SecretKey; - } - public void SetSecretKey(string key) - { - fileConfig.Data.Client.Updater.SecretKey = key; - fileConfig.Data.Update(); - } - /// /// 所有客户端的更新信息 /// /// - public ConcurrentDictionary Get() + public ConcurrentDictionary Get() { return updateInfos; } @@ -78,7 +57,7 @@ namespace linker.plugins.updater /// 来自别的客户端的更新信息 /// /// - public void Update(UpdateInfo info) + public void Update(UpdaterInfo info) { if (string.IsNullOrWhiteSpace(info.MachineId) == false) { @@ -120,15 +99,15 @@ namespace linker.plugins.updater { if (updateInfo.Updated) { - updateInfo.MachineId = clientConfigTransfer.Id; + updateInfo.MachineId = signInClientStore.Id; string[] machines = subscribes.Where(c => c.Value.DiffLessEqual(15000)).Select(c => c.Key).ToArray(); if (machines.Length > 0) { await messengerSender.SendOnly(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)UpdaterMessengerIds.UpdateForward, - Payload = MemoryPackSerializer.Serialize(new UpdateClientInfo { ToMachines = machines, Info = updateInfo }), + Payload = serializer.Serialize(new UpdaterClientInfo { ToMachines = machines, Info = updateInfo }), }); } Update(updateInfo); @@ -147,11 +126,6 @@ namespace linker.plugins.updater } } - [MemoryPackable] - public sealed partial class UpdateClientInfo - { - public string[] ToMachines { get; set; } - public UpdateInfo Info { get; set; } - } + } diff --git a/linker.messenger.updater/UpdaterConfigSync.cs b/linker.messenger.updater/UpdaterConfigSync.cs new file mode 100644 index 00000000..a8051d8b --- /dev/null +++ b/linker.messenger.updater/UpdaterConfigSync.cs @@ -0,0 +1,29 @@ +using linker.libs; +using linker.messenger.sync; + +namespace linker.messenger.updater +{ + public sealed class UpdaterConfigSyncSecretKey : ISync + { + public string Name => "UpdaterSecretKey"; + + private readonly UpdaterClientTransfer updaterClientTransfer; + private readonly ISerializer serializer; + private readonly IUpdaterClientStore updaterClientStore; + public UpdaterConfigSyncSecretKey(UpdaterClientTransfer updaterClientTransfer, ISerializer serializer, IUpdaterClientStore updaterClientStore) + { + this.updaterClientTransfer = updaterClientTransfer; + this.serializer = serializer; + this.updaterClientStore = updaterClientStore; + } + public Memory GetData() + { + return serializer.Serialize(updaterClientStore.SecretKey); + } + + public void SetData(Memory data) + { + updaterClientStore.SetSecretKey(serializer.Deserialize(data.Span)); + } + } +} diff --git a/linker/plugins/updater/UpdaterHelper.cs b/linker.messenger.updater/UpdaterHelper.cs similarity index 76% rename from linker/plugins/updater/UpdaterHelper.cs rename to linker.messenger.updater/UpdaterHelper.cs index af8a35f0..ada9d40e 100644 --- a/linker/plugins/updater/UpdaterHelper.cs +++ b/linker.messenger.updater/UpdaterHelper.cs @@ -1,19 +1,17 @@ using linker.libs; -using MemoryPack; using System.Diagnostics; using System.IO.Compression; using System.Runtime.InteropServices; using System.Text; -using System.Text.Json.Serialization; -namespace linker.plugins.updater +namespace linker.messenger.updater { public sealed class UpdaterHelper { private string[] extractExcludeFiles = []; - private readonly UpdaterCommonTransfer updaterCommonTransfer; - public UpdaterHelper(UpdaterCommonTransfer updaterCommonTransfer) + private readonly IUpdaterCommonStore updaterCommonTransfer; + public UpdaterHelper(IUpdaterCommonStore updaterCommonTransfer) { this.updaterCommonTransfer = updaterCommonTransfer; ClearFiles(); @@ -24,18 +22,18 @@ namespace linker.plugins.updater /// /// /// - public async Task GetUpdateInfo(UpdateInfo updateInfo) + public async Task GetUpdateInfo(UpdaterInfo updateInfo) { //正在检查,或者已经确认更新了 - if (updateInfo.Status == UpdateStatus.Checking || updateInfo.Status > UpdateStatus.Checked) + if (updateInfo.Status == UpdaterStatus.Checking || updateInfo.Status > UpdaterStatus.Checked) { return; } - UpdateStatus status = updateInfo.Status; + UpdaterStatus status = updateInfo.Status; try { - updateInfo.Status = UpdateStatus.Checking; + updateInfo.Status = UpdaterStatus.Checking; using HttpClient httpClient = new HttpClient(); string str = await httpClient.GetStringAsync($"{updaterCommonTransfer.UpdateUrl}/version.txt").WaitAsync(TimeSpan.FromSeconds(15)); @@ -50,7 +48,7 @@ namespace linker.plugins.updater updateInfo.Msg = msg; updateInfo.Version = tag; - updateInfo.Status = UpdateStatus.Checked; + updateInfo.Status = UpdaterStatus.Checked; } catch (Exception ex) { @@ -64,25 +62,25 @@ namespace linker.plugins.updater /// /// /// - public async Task DownloadUpdate(UpdateInfo updateInfo, string version) + public async Task DownloadUpdate(UpdaterInfo updateInfo, string version) { for (int i = 0; i <= 5; i++) { - if (updateInfo.Status != UpdateStatus.Checking) + if (updateInfo.Status != UpdaterStatus.Checking) { break; } await Task.Delay(1000); } - if (updateInfo.Status != UpdateStatus.Checked) + if (updateInfo.Status != UpdaterStatus.Checked) { return; } - UpdateStatus status = updateInfo.Status; + UpdaterStatus status = updateInfo.Status; try { - updateInfo.Status = UpdateStatus.Downloading; + updateInfo.Status = UpdaterStatus.Downloading; updateInfo.Current = 0; updateInfo.Length = 0; @@ -112,7 +110,7 @@ namespace linker.plugins.updater updateInfo.Current += readBytes; } - updateInfo.Status = UpdateStatus.Downloaded; + updateInfo.Status = UpdaterStatus.Downloaded; } catch (Exception ex) { @@ -132,18 +130,18 @@ namespace linker.plugins.updater /// /// /// - public async Task ExtractUpdate(UpdateInfo updateInfo) + public async Task ExtractUpdate(UpdaterInfo updateInfo) { //没下载完成 - if (updateInfo.Status != UpdateStatus.Downloaded) + if (updateInfo.Status != UpdaterStatus.Downloaded) { return; } string fileName = Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName); - UpdateStatus status = updateInfo.Status; + UpdaterStatus status = updateInfo.Status; try { - updateInfo.Status = UpdateStatus.Extracting; + updateInfo.Status = UpdaterStatus.Extracting; updateInfo.Current = 0; updateInfo.Length = 0; @@ -197,7 +195,7 @@ namespace linker.plugins.updater archive.Dispose(); File.Delete("updater.zip"); - updateInfo.Status = UpdateStatus.Extracted; + updateInfo.Status = UpdaterStatus.Extracted; } catch (Exception ex) { @@ -211,7 +209,7 @@ namespace linker.plugins.updater /// /// /// - public void Confirm(UpdateInfo updateInfo, string version) + public void Confirm(UpdaterInfo updateInfo, string version) { TimerHelper.Async(async () => { @@ -267,45 +265,5 @@ namespace linker.plugins.updater } } - [MemoryPackable] - public sealed partial class UpdateInfo - { - [MemoryPackIgnore] - public string Version { get; set; } - [MemoryPackIgnore] - public string[] Msg { get; set; } - [MemoryPackIgnore] - public string DateTime { get; set; } - - public string MachineId { get; set; } - - private ulong counter = 0; - [MemoryPackIgnore, JsonIgnore] - public bool Updated => Interlocked.And(ref counter, 0x0) > 0; - - - private UpdateStatus status = UpdateStatus.None; - public UpdateStatus Status { get => status; set { status = value; Interlocked.Increment(ref counter); } } - - private long length = 0; - public long Length { get => length; set { length = value; Interlocked.Increment(ref counter); } } - private long current = 0; - public long Current { get => current; set { current = value; Interlocked.Increment(ref counter); } } - - public void Update() - { - Interlocked.Increment(ref counter); - } - } - - public enum UpdateStatus : byte - { - None = 0, - Checking = 1, - Checked = 2, - Downloading = 3, - Downloaded = 4, - Extracting = 5, - Extracted = 6 - } + } diff --git a/linker/plugins/updater/messenger/UpdaterMessenger.cs b/linker.messenger.updater/UpdaterMessenger.cs similarity index 78% rename from linker/plugins/updater/messenger/UpdaterMessenger.cs rename to linker.messenger.updater/UpdaterMessenger.cs index f4fc8d29..1f198fe0 100644 --- a/linker/plugins/updater/messenger/UpdaterMessenger.cs +++ b/linker.messenger.updater/UpdaterMessenger.cs @@ -1,19 +1,17 @@ -using linker.config; -using linker.libs; +using linker.libs; using linker.libs.extends; -using linker.messenger; using linker.messenger.signin; -using linker.plugins.updater.config; -using MemoryPack; -namespace linker.plugins.updater.messenger +namespace linker.messenger.updater { public sealed class UpdaterClientMessenger : IMessenger { private readonly UpdaterClientTransfer updaterTransfer; - public UpdaterClientMessenger(UpdaterClientTransfer updaterTransfer) + private readonly ISerializer serializer; + public UpdaterClientMessenger(UpdaterClientTransfer updaterTransfer, ISerializer serializer) { this.updaterTransfer = updaterTransfer; + this.serializer = serializer; } /// @@ -25,7 +23,7 @@ namespace linker.plugins.updater.messenger { try { - UpdaterConfirmInfo confirm = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + UpdaterConfirmInfo confirm = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) { LoggerHelper.Instance.Debug(confirm.ToJson()); @@ -48,7 +46,7 @@ namespace linker.plugins.updater.messenger [MessengerId((ushort)UpdaterMessengerIds.Update)] public void Update(IConnection connection) { - UpdateInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + UpdaterInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); updaterTransfer.Update(info); } /// @@ -69,7 +67,7 @@ namespace linker.plugins.updater.messenger [MessengerId((ushort)UpdaterMessengerIds.Subscribe)] public void Subscribe(IConnection connection) { - string machineId = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + string machineId = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); updaterTransfer.Subscribe(machineId); } @@ -88,16 +86,18 @@ namespace linker.plugins.updater.messenger public sealed class UpdaterServerMessenger : IMessenger { private readonly IMessengerSender messengerSender; - private readonly SignCaching signCaching; + private readonly SignInServerCaching signCaching; private readonly UpdaterServerTransfer updaterServerTransfer; - private readonly FileConfig fileConfig; + private readonly ISerializer serializer; + private readonly IUpdaterServerStore updaterServerStore; - public UpdaterServerMessenger(IMessengerSender messengerSender, SignCaching signCaching, UpdaterServerTransfer updaterServerTransfer, FileConfig fileConfig) + public UpdaterServerMessenger(IMessengerSender messengerSender, SignInServerCaching signCaching, UpdaterServerTransfer updaterServerTransfer, ISerializer serializer, IUpdaterServerStore updaterServerStore) { this.messengerSender = messengerSender; this.signCaching = signCaching; this.updaterServerTransfer = updaterServerTransfer; - this.fileConfig = fileConfig; + this.serializer = serializer; + this.updaterServerStore = updaterServerStore; } /// /// 获取服务器的更新信息 @@ -106,7 +106,7 @@ namespace linker.plugins.updater.messenger [MessengerId((ushort)UpdaterMessengerIds.UpdateServer)] public void UpdateServer(IConnection connection) { - connection.Write(MemoryPackSerializer.Serialize(updaterServerTransfer.Get())); + connection.Write(serializer.Serialize(updaterServerTransfer.Get())); } /// /// 开始更新服务器 @@ -115,8 +115,8 @@ namespace linker.plugins.updater.messenger [MessengerId((ushort)UpdaterMessengerIds.ConfirmServer)] public void ConfirmServer(IConnection connection) { - UpdaterConfirmServerInfo confirm = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); - if (updaterServerTransfer.SecretKey == confirm.SecretKey) + UpdaterConfirmServerInfo confirm = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + if (updaterServerStore.SecretKey == confirm.SecretKey) { updaterServerTransfer.Confirm(confirm.Version); } @@ -128,8 +128,8 @@ namespace linker.plugins.updater.messenger [MessengerId((ushort)UpdaterMessengerIds.ExitServer)] public void ExitServer(IConnection connection) { - UpdaterConfirmServerInfo confirm = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); - if (updaterServerTransfer.SecretKey == confirm.SecretKey) + UpdaterConfirmServerInfo confirm = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + if (updaterServerStore.SecretKey == confirm.SecretKey) { Environment.Exit(1); } @@ -144,7 +144,7 @@ namespace linker.plugins.updater.messenger [MessengerId((ushort)UpdaterMessengerIds.ConfirmForward)] public async Task ConfirmForward(IConnection connection) { - UpdaterConfirmInfo confirm = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + UpdaterConfirmInfo confirm = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) == false) { connection.Write(Helper.FalseArray); @@ -152,7 +152,7 @@ namespace linker.plugins.updater.messenger } //需要密钥 - if ((confirm.All || confirm.GroupAll) && updaterServerTransfer.SecretKey != confirm.SecretKey) + if ((confirm.All || confirm.GroupAll) && updaterServerStore.SecretKey != confirm.SecretKey) { connection.Write(Helper.FalseArray); return; @@ -165,17 +165,14 @@ namespace linker.plugins.updater.messenger //某一个 else machines = signCaching.Get(cache.GroupId).Where(c => c.MachineId == confirm.MachineId && c.GroupId == cache.GroupId); - UpdaterConfirmV149Info v149 = new UpdaterConfirmV149Info { All = confirm.All, MachineId = confirm.MachineId, Version = confirm.Version }; confirm.SecretKey = string.Empty; - byte[] payload = MemoryPackSerializer.Serialize(confirm); - byte[] payloadV149 = MemoryPackSerializer.Serialize(v149); var tasks = machines.Select(c => { return messengerSender.SendOnly(new MessageRequestWrap { Connection = c.Connection, MessengerId = (ushort)UpdaterMessengerIds.Confirm, - Payload = c.Version == "v1.4.9" ? payloadV149 : payload + Payload = serializer.Serialize(confirm) }); }).ToList(); @@ -191,10 +188,10 @@ namespace linker.plugins.updater.messenger [MessengerId((ushort)UpdaterMessengerIds.UpdateForward)] public void UpdateForward(IConnection connection) { - UpdateClientInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + UpdaterClientInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (signCaching.TryGet(connection.Id, out SignCacheInfo cache)) { - byte[] payload = MemoryPackSerializer.Serialize(info.Info); + byte[] payload = serializer.Serialize(info.Info); foreach (var item in signCaching.Get(cache.GroupId).Where(c => info.ToMachines.Contains(c.MachineId)).Where(c => c.Connected && c.MachineId != connection.Id)) { _ = messengerSender.SendOnly(new MessageRequestWrap @@ -215,7 +212,7 @@ namespace linker.plugins.updater.messenger [MessengerId((ushort)UpdaterMessengerIds.ExitForward)] public async Task ExitForward(IConnection connection) { - string machineId = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + string machineId = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) && signCaching.TryGet(machineId, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId) { await messengerSender.SendOnly(new MessageRequestWrap @@ -237,7 +234,7 @@ namespace linker.plugins.updater.messenger { if (signCaching.TryGet(connection.Id, out SignCacheInfo cache)) { - byte[] mechineId = MemoryPackSerializer.Serialize(connection.Id); + byte[] mechineId = serializer.Serialize(connection.Id); foreach (var item in signCaching.Get(cache.GroupId).Where(c => c.Connected && c.MachineId != connection.Id)) { _ = messengerSender.SendOnly(new MessageRequestWrap @@ -263,7 +260,7 @@ namespace linker.plugins.updater.messenger string toMachineId = string.Empty; if (connection.ReceiveRequestWrap.Payload.Length > 0) { - toMachineId = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + toMachineId = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); } var clients = string.IsNullOrWhiteSpace(toMachineId) diff --git a/linker/plugins/updater/messenger/UpdaterMessengerIds.cs b/linker.messenger.updater/UpdaterMessengerIds.cs similarity index 90% rename from linker/plugins/updater/messenger/UpdaterMessengerIds.cs rename to linker.messenger.updater/UpdaterMessengerIds.cs index c4e309ca..3cb35fea 100644 --- a/linker/plugins/updater/messenger/UpdaterMessengerIds.cs +++ b/linker.messenger.updater/UpdaterMessengerIds.cs @@ -1,4 +1,4 @@ -namespace linker.plugins.updater.messenger +namespace linker.messenger.updater { public enum UpdaterMessengerIds : ushort { diff --git a/linker/plugins/updater/UpdaterServerTransfer.cs b/linker.messenger.updater/UpdaterServerTransfer.cs similarity index 56% rename from linker/plugins/updater/UpdaterServerTransfer.cs rename to linker.messenger.updater/UpdaterServerTransfer.cs index 3b969838..938b42ec 100644 --- a/linker/plugins/updater/UpdaterServerTransfer.cs +++ b/linker.messenger.updater/UpdaterServerTransfer.cs @@ -1,23 +1,16 @@ -using linker.config; - -namespace linker.plugins.updater +namespace linker.messenger.updater { public sealed class UpdaterServerTransfer { - - public string SecretKey => fileConfig.Data.Server.Updater.SecretKey; - - private UpdateInfo updateInfo = new UpdateInfo { Status = UpdateStatus.Checked }; + private UpdaterInfo updateInfo = new UpdaterInfo { Status = UpdaterStatus.Checked }; private readonly UpdaterHelper updaterHelper; - private readonly FileConfig fileConfig; - public UpdaterServerTransfer(UpdaterHelper updaterHelper, FileConfig fileConfig) + public UpdaterServerTransfer(UpdaterHelper updaterHelper) { this.updaterHelper = updaterHelper; - this.fileConfig = fileConfig; } - public UpdateInfo Get() + public UpdaterInfo Get() { return updateInfo; } diff --git a/linker.messenger.updater/linker.messenger.updater.csproj b/linker.messenger.updater/linker.messenger.updater.csproj new file mode 100644 index 00000000..abe19e1c --- /dev/null +++ b/linker.messenger.updater/linker.messenger.updater.csproj @@ -0,0 +1,41 @@ + + + + net8.0 + enable + disable + true + false + true + True + linker messenger updater + snltty + snltty + linker messenger updater + snltty + https://github.com/snltty/linker + https://github.com/snltty/linker + linker messenger updater + 1.6.4 + 1.6.4 + 1.6.4 + + + + full + true + + + none + false + True + + + + + + + + + + diff --git a/linker.messenger/Entry.cs b/linker.messenger/Entry.cs new file mode 100644 index 00000000..56ba8188 --- /dev/null +++ b/linker.messenger/Entry.cs @@ -0,0 +1,24 @@ +using Microsoft.Extensions.DependencyInjection; +namespace linker.messenger +{ + public static class Entry + { + public static ServiceCollection AddMessenger(this ServiceCollection serviceCollection) + { + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + return serviceCollection; + } + public static ServiceProvider UseMessenger(this ServiceProvider serviceProvider) + { + IMessengerResolver messengerResolver = serviceProvider.GetService(); + + ResolverTransfer resolverTransfer = serviceProvider.GetService(); + resolverTransfer.AddResolvers(new List { serviceProvider.GetService() }); + + return serviceProvider; + } + + } +} diff --git a/linker.messenger/IMessengerStore.cs b/linker.messenger/IMessengerStore.cs new file mode 100644 index 00000000..5dca6d51 --- /dev/null +++ b/linker.messenger/IMessengerStore.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace linker.messenger +{ + public sealed partial class ServerCertificateInfo + { + public ServerCertificateInfo() { } + public string File { get; set; } = "./snltty.pfx"; + public string Password { get; set; } = "oeq9tw1o"; + } + public interface IMessengerStore + { + public ServerCertificateInfo SSL { get; } + } +} diff --git a/linker/plugins/resolver/IResolver.cs b/linker.messenger/IResolver.cs similarity index 69% rename from linker/plugins/resolver/IResolver.cs rename to linker.messenger/IResolver.cs index dbb22e8c..68ec8f6a 100644 --- a/linker/plugins/resolver/IResolver.cs +++ b/linker.messenger/IResolver.cs @@ -1,7 +1,7 @@ using System.Net; using System.Net.Sockets; -namespace linker.plugins.resolver +namespace linker.messenger { public enum ResolverType : byte { @@ -37,7 +37,20 @@ namespace linker.plugins.resolver public interface IResolver { public ResolverType Type { get; } + /// + /// TCP + /// + /// + /// + /// public Task Resolve(Socket socket, Memory memory); + /// + /// UDP + /// + /// + /// + /// + /// public Task Resolve(Socket socket, IPEndPoint ep, Memory memory); } diff --git a/linker.messenger/MessengerResolver.cs b/linker.messenger/MessengerResolver.cs index fa2588e9..48c5e536 100644 --- a/linker.messenger/MessengerResolver.cs +++ b/linker.messenger/MessengerResolver.cs @@ -14,15 +14,32 @@ namespace linker.messenger /// public interface IMessengerResolver { - public void Initialize(string certificate, string password); - public void Initialize(X509Certificate2 certificate); public Task BeginReceiveClient(Socket socket); public Task BeginReceiveClient(Socket socket, bool sendFlag, byte flag); - public void LoadMessenger(List list); + public void AddMessenger(List list); public Task BeginReceiveServer(Socket socket, Memory memory); public Task BeginReceiveServer(Socket socket, IPEndPoint ep, Memory memory); } + public class MessengerResolverResolver : IResolver + { + public ResolverType Type => ResolverType.Messenger; + + private readonly IMessengerResolver messengerResolver; + public MessengerResolverResolver(IMessengerResolver messengerResolver) + { + this.messengerResolver = messengerResolver; + } + public async Task Resolve(Socket socket, Memory memory) + { + await messengerResolver.BeginReceiveServer(socket, memory); + } + public async Task Resolve(Socket socket, IPEndPoint ep, Memory memory) + { + await messengerResolver.BeginReceiveServer(socket, ep, memory); + } + } + /// /// 消息处理总线 /// @@ -36,17 +53,14 @@ namespace linker.messenger private readonly IMessengerSender messengerSender; private X509Certificate2 serverCertificate; - public MessengerResolver(IMessengerSender messengerSender) + public MessengerResolver(IMessengerSender messengerSender, IMessengerStore messengerStore) { this.messengerSender = messengerSender; - } - public void Initialize(string certificate, string password) - { - string path = Path.GetFullPath(certificate); + string path = Path.GetFullPath(messengerStore.SSL.File); if (File.Exists(path)) { - serverCertificate = new X509Certificate2(path, password, X509KeyStorageFlags.Exportable); + serverCertificate = new X509Certificate2(path, messengerStore.SSL.Password, X509KeyStorageFlags.Exportable); } else { @@ -54,14 +68,17 @@ namespace linker.messenger Environment.Exit(0); } } - public void Initialize(X509Certificate2 certificate) - { - serverCertificate = certificate; - } + public virtual void AddReceive(ushort id, ulong bytes) { } public virtual void AddSendt(ushort id, ulong bytes) { } + /// + /// 以服务器模式接收数据 TCP + /// + /// + /// + /// public async Task BeginReceiveServer(Socket socket, Memory memory) { try @@ -79,16 +96,35 @@ namespace linker.messenger LoggerHelper.Instance.Error(ex); } } + /// + /// 以服务器模式接收数据 UDP + /// + /// + /// + /// + /// public async Task BeginReceiveServer(Socket socket, IPEndPoint ep, Memory memory) { await Task.CompletedTask; } + /// + /// 以客户端模式接收数据 + /// + /// + /// public async Task BeginReceiveClient(Socket socket) { - return await BeginReceiveClient(socket,false,0); + return await BeginReceiveClient(socket, false, 0); } - public async Task BeginReceiveClient(Socket socket,bool sendFlag,byte flag) + /// + /// 以客户端模式接收数据 + /// + /// + /// + /// + /// + public async Task BeginReceiveClient(Socket socket, bool sendFlag, byte flag) { try { @@ -125,7 +161,6 @@ namespace linker.messenger { return true; } - private IConnection CreateConnection(SslStream stream, NetworkStream networkStream, Socket socket, IPEndPoint local, IPEndPoint remote) { return new TcpConnection(stream, networkStream, socket, local, remote) @@ -136,9 +171,9 @@ namespace linker.messenger } /// - /// 加载所有消息处理器 + /// 添加信标 /// - public void LoadMessenger(List list) + public void AddMessenger(List list) { Type voidType = typeof(void); Type midType = typeof(MessengerIdAttribute); @@ -147,7 +182,7 @@ namespace linker.messenger { Type type = messenger.GetType(); - foreach (var method in type.GetMethods( BindingFlags.Public | BindingFlags.Instance)) + foreach (var method in type.GetMethods(BindingFlags.Public | BindingFlags.Instance)) { MessengerIdAttribute mid = method.GetCustomAttribute(midType) as MessengerIdAttribute; if (mid != null) @@ -177,7 +212,7 @@ namespace linker.messenger } /// - /// 处理消息 + /// 处理消息,不需要调用,内部会处理 /// /// /// diff --git a/linker.messenger/MessengerSender.cs b/linker.messenger/MessengerSender.cs index f4d112e0..1799cf1c 100644 --- a/linker.messenger/MessengerSender.cs +++ b/linker.messenger/MessengerSender.cs @@ -14,6 +14,7 @@ namespace linker.messenger /// /// public Task SendReply(MessageRequestWrap msg); + /// /// 仅发送 /// @@ -48,12 +49,6 @@ namespace linker.messenger public virtual void AddReceive(ushort id, ulong bytes) { } public virtual void AddSendt(ushort id, ulong bytes) { } - - /// - /// 发送并等待回复 - /// - /// - /// public async Task SendReply(MessageRequestWrap msg) { if (msg.Connection == null || msg.Connection.Connected == false) @@ -92,12 +87,6 @@ namespace linker.messenger return new MessageResponeInfo { Code = MessageResponeCodes.TIMEOUT }; } } - - /// - /// 只发送,不等回复 - /// - /// - /// public async Task SendOnly(MessageRequestWrap msg) { if (msg.Connection == null || msg.Connection.Connected == false) @@ -129,11 +118,6 @@ namespace linker.messenger return false; } - /// - /// 回复远程消息,收到某个连接的消息后,通过这个再返回消息给它 - /// - /// - /// public async ValueTask ReplyOnly(MessageResponseWrap msg, ushort messengerId) { if (msg.Connection == null) @@ -159,10 +143,7 @@ namespace linker.messenger } return false; } - /// - /// 回复本地消息,发送消息后,socket收到消息,通过这个方法回复给刚刚发送的对象 - /// - /// + public void Response(MessageResponseWrap wrap) { if (sends.TryRemove(wrap.RequestId, out ReplyWrapInfo info)) diff --git a/linker.messenger/MessengerWrap.cs b/linker.messenger/MessengerWrap.cs index 00ff0e65..35507611 100644 --- a/linker.messenger/MessengerWrap.cs +++ b/linker.messenger/MessengerWrap.cs @@ -5,12 +5,12 @@ using System.ComponentModel; namespace linker.messenger { /// - /// 请求数据包 + /// 请求数据包,只填 MessengerId Payload Connection 就可以,Timeout可选,其它不用填 /// public sealed class MessageRequestWrap { /// - /// 超时ms + /// 超时ms,默认15000 /// public int Timeout { get; set; } /// @@ -18,7 +18,7 @@ namespace linker.messenger /// public ushort MessengerId { get; set; } /// - /// 请求id + /// 请求id,不用填 /// public uint RequestId { get; set; } /// diff --git a/linker/plugins/resolver/ResolverTransfer.cs b/linker.messenger/ResolverTransfer.cs similarity index 72% rename from linker/plugins/resolver/ResolverTransfer.cs rename to linker.messenger/ResolverTransfer.cs index fe34d099..f7108b71 100644 --- a/linker/plugins/resolver/ResolverTransfer.cs +++ b/linker.messenger/ResolverTransfer.cs @@ -3,8 +3,11 @@ using System.Net.Sockets; using linker.libs.extends; using System.Buffers; using System.Net; -namespace linker.plugins.resolver +namespace linker.messenger { + /// + /// 消息分发器 + /// public sealed class ResolverTransfer { private readonly Dictionary resolvers = new Dictionary(); @@ -12,7 +15,12 @@ namespace linker.plugins.resolver public ResolverTransfer() { } - public void LoadResolvers(List list) + + /// + /// 添加消息分发器 + /// + /// + public void AddResolvers(List list) { foreach (IResolver resolver in list) { @@ -20,7 +28,11 @@ namespace linker.plugins.resolver } } - + /// + /// 开始处理这个连接的分发 TCP + /// + /// + /// public async Task BeginReceive(Socket socket) { byte[] buffer = ArrayPool.Shared.Rent(1024); @@ -51,6 +63,13 @@ namespace linker.plugins.resolver ArrayPool.Shared.Return(buffer); } } + /// + /// 开始处理这个连接的分发 UDP + /// + /// + /// + /// + /// public async Task BeginReceive(Socket socket, IPEndPoint ep, Memory memory) { if (resolvers.TryGetValue((ResolverType)memory.Span[0], out IResolver resolver)) diff --git a/linker.messenger/linker.messenger.csproj b/linker.messenger/linker.messenger.csproj index ce3ff6a8..bee17dd4 100644 --- a/linker.messenger/linker.messenger.csproj +++ b/linker.messenger/linker.messenger.csproj @@ -30,6 +30,9 @@ false True + + + diff --git a/linker.sln b/linker.sln index 7cfd7e67..026a381d 100644 --- a/linker.sln +++ b/linker.sln @@ -11,17 +11,43 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.tunnel", "linker.tun EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.tun", "linker.tun\linker.tun.csproj", "{0DE134E0-7CD8-4DCF-8D2A-325CEBE5895F}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.gen", "linker.gen\linker.gen.csproj", "{031C3589-72BB-4A3F-B1A5-BC0665FDF01B}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger", "linker.messenger\linker.messenger.csproj", "{2B0BFDBB-8C5F-4E47-8309-2A764C2567C2}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.signin", "linker.signin\linker.messenger.signin.csproj", "{5B1F4754-D1B6-426B-B310-8C21F26879D2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.signin", "linker.messenger.signin\linker.messenger.signin.csproj", "{5B1F4754-D1B6-426B-B310-8C21F26879D2}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.tunnel", "linker.messenger.tunnel\linker.messenger.tunnel.csproj", "{92582A55-8BBF-4B82-892D-75CEC8969EAF}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.relay", "linker.messenger.relay\linker.messenger.relay.csproj", "{90E99334-FBF6-423F-A636-89B1E71D8FEE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "linker.messenger.example", "linker.messenger.example\linker.messenger.example.csproj", "{98970DF9-0996-4111-97BA-DD495A098498}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.example", "linker.messenger.example\linker.messenger.example.csproj", "{98970DF9-0996-4111-97BA-DD495A098498}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.decenter", "linker.messenger.decenter\linker.messenger.decenter.csproj", "{5FDD5CF7-6B10-4F3C-A2E2-D9E8F2A4E271}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.entry", "linker.messenger.entry\linker.messenger.entry.csproj", "{AE6579B4-886A-4460-B058-516E67D84FBB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.api", "linker.messenger.api\linker.messenger.api.csproj", "{2678852B-FBAD-4D4F-941E-D90458D9398C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.sync", "linker.messenger.sync\linker.messenger.sync.csproj", "{4881D7B1-06A5-4845-8395-BC5530ABD7C3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.serializer.memorypack", "linker.messenger.serializer.memorypack\linker.messenger.serializer.memorypack.csproj", "{E99412D2-71DF-4A95-9CA1-EE1F0F26EBE0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.updater", "linker.messenger.updater\linker.messenger.updater.csproj", "{6DE82860-4C90-488F-9721-FB6CA3E5176B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.socks5", "linker.messenger.socks5\linker.messenger.socks5.csproj", "{668C9465-CAF9-4B4A-91C2-C221B5B04AD2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.access", "linker.messenger.access\linker.messenger.access.csproj", "{2C076344-B58C-474C-96BF-2ECA63EB90FC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.store.file", "linker.messenger.store.file\linker.messenger.store.file.csproj", "{B314CF79-2DFF-4A7F-AE86-326ECFD02BB6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.exroute", "linker.messenger.exroute\linker.messenger.exroute.csproj", "{091C723F-47AD-49AB-9373-9E49E1DD46C3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.channel", "linker.messenger.channel\linker.messenger.channel.csproj", "{9F0DC900-7B27-4C33-8B58-C09DDAF67802}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.action", "linker.messenger.action\linker.messenger.action.csproj", "{8B16725E-645D-41C8-BD04-C3D9F453BEF6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.messenger.listen", "linker.messenger.listen\linker.messenger.listen.csproj", "{4BD30072-9DFC-4D65-B6FB-DB9DDE3EFB30}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "linker.messenger.pcp", "linker.messenger.pcp\linker.messenger.pcp.csproj", "{A73BB5AD-C3CA-41A2-B5F9-C06DE6F5CD5C}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -81,18 +107,6 @@ Global {0DE134E0-7CD8-4DCF-8D2A-325CEBE5895F}.Release|x64.Build.0 = Release|Any CPU {0DE134E0-7CD8-4DCF-8D2A-325CEBE5895F}.Release|x86.ActiveCfg = Release|Any CPU {0DE134E0-7CD8-4DCF-8D2A-325CEBE5895F}.Release|x86.Build.0 = Release|Any CPU - {031C3589-72BB-4A3F-B1A5-BC0665FDF01B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {031C3589-72BB-4A3F-B1A5-BC0665FDF01B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {031C3589-72BB-4A3F-B1A5-BC0665FDF01B}.Debug|x64.ActiveCfg = Debug|Any CPU - {031C3589-72BB-4A3F-B1A5-BC0665FDF01B}.Debug|x64.Build.0 = Debug|Any CPU - {031C3589-72BB-4A3F-B1A5-BC0665FDF01B}.Debug|x86.ActiveCfg = Debug|Any CPU - {031C3589-72BB-4A3F-B1A5-BC0665FDF01B}.Debug|x86.Build.0 = Debug|Any CPU - {031C3589-72BB-4A3F-B1A5-BC0665FDF01B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {031C3589-72BB-4A3F-B1A5-BC0665FDF01B}.Release|Any CPU.Build.0 = Release|Any CPU - {031C3589-72BB-4A3F-B1A5-BC0665FDF01B}.Release|x64.ActiveCfg = Release|Any CPU - {031C3589-72BB-4A3F-B1A5-BC0665FDF01B}.Release|x64.Build.0 = Release|Any CPU - {031C3589-72BB-4A3F-B1A5-BC0665FDF01B}.Release|x86.ActiveCfg = Release|Any CPU - {031C3589-72BB-4A3F-B1A5-BC0665FDF01B}.Release|x86.Build.0 = Release|Any CPU {2B0BFDBB-8C5F-4E47-8309-2A764C2567C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2B0BFDBB-8C5F-4E47-8309-2A764C2567C2}.Debug|Any CPU.Build.0 = Debug|Any CPU {2B0BFDBB-8C5F-4E47-8309-2A764C2567C2}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -153,6 +167,174 @@ Global {98970DF9-0996-4111-97BA-DD495A098498}.Release|x64.Build.0 = Release|Any CPU {98970DF9-0996-4111-97BA-DD495A098498}.Release|x86.ActiveCfg = Release|Any CPU {98970DF9-0996-4111-97BA-DD495A098498}.Release|x86.Build.0 = Release|Any CPU + {5FDD5CF7-6B10-4F3C-A2E2-D9E8F2A4E271}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5FDD5CF7-6B10-4F3C-A2E2-D9E8F2A4E271}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5FDD5CF7-6B10-4F3C-A2E2-D9E8F2A4E271}.Debug|x64.ActiveCfg = Debug|Any CPU + {5FDD5CF7-6B10-4F3C-A2E2-D9E8F2A4E271}.Debug|x64.Build.0 = Debug|Any CPU + {5FDD5CF7-6B10-4F3C-A2E2-D9E8F2A4E271}.Debug|x86.ActiveCfg = Debug|Any CPU + {5FDD5CF7-6B10-4F3C-A2E2-D9E8F2A4E271}.Debug|x86.Build.0 = Debug|Any CPU + {5FDD5CF7-6B10-4F3C-A2E2-D9E8F2A4E271}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5FDD5CF7-6B10-4F3C-A2E2-D9E8F2A4E271}.Release|Any CPU.Build.0 = Release|Any CPU + {5FDD5CF7-6B10-4F3C-A2E2-D9E8F2A4E271}.Release|x64.ActiveCfg = Release|Any CPU + {5FDD5CF7-6B10-4F3C-A2E2-D9E8F2A4E271}.Release|x64.Build.0 = Release|Any CPU + {5FDD5CF7-6B10-4F3C-A2E2-D9E8F2A4E271}.Release|x86.ActiveCfg = Release|Any CPU + {5FDD5CF7-6B10-4F3C-A2E2-D9E8F2A4E271}.Release|x86.Build.0 = Release|Any CPU + {AE6579B4-886A-4460-B058-516E67D84FBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AE6579B4-886A-4460-B058-516E67D84FBB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AE6579B4-886A-4460-B058-516E67D84FBB}.Debug|x64.ActiveCfg = Debug|Any CPU + {AE6579B4-886A-4460-B058-516E67D84FBB}.Debug|x64.Build.0 = Debug|Any CPU + {AE6579B4-886A-4460-B058-516E67D84FBB}.Debug|x86.ActiveCfg = Debug|Any CPU + {AE6579B4-886A-4460-B058-516E67D84FBB}.Debug|x86.Build.0 = Debug|Any CPU + {AE6579B4-886A-4460-B058-516E67D84FBB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AE6579B4-886A-4460-B058-516E67D84FBB}.Release|Any CPU.Build.0 = Release|Any CPU + {AE6579B4-886A-4460-B058-516E67D84FBB}.Release|x64.ActiveCfg = Release|Any CPU + {AE6579B4-886A-4460-B058-516E67D84FBB}.Release|x64.Build.0 = Release|Any CPU + {AE6579B4-886A-4460-B058-516E67D84FBB}.Release|x86.ActiveCfg = Release|Any CPU + {AE6579B4-886A-4460-B058-516E67D84FBB}.Release|x86.Build.0 = Release|Any CPU + {2678852B-FBAD-4D4F-941E-D90458D9398C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2678852B-FBAD-4D4F-941E-D90458D9398C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2678852B-FBAD-4D4F-941E-D90458D9398C}.Debug|x64.ActiveCfg = Debug|Any CPU + {2678852B-FBAD-4D4F-941E-D90458D9398C}.Debug|x64.Build.0 = Debug|Any CPU + {2678852B-FBAD-4D4F-941E-D90458D9398C}.Debug|x86.ActiveCfg = Debug|Any CPU + {2678852B-FBAD-4D4F-941E-D90458D9398C}.Debug|x86.Build.0 = Debug|Any CPU + {2678852B-FBAD-4D4F-941E-D90458D9398C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2678852B-FBAD-4D4F-941E-D90458D9398C}.Release|Any CPU.Build.0 = Release|Any CPU + {2678852B-FBAD-4D4F-941E-D90458D9398C}.Release|x64.ActiveCfg = Release|Any CPU + {2678852B-FBAD-4D4F-941E-D90458D9398C}.Release|x64.Build.0 = Release|Any CPU + {2678852B-FBAD-4D4F-941E-D90458D9398C}.Release|x86.ActiveCfg = Release|Any CPU + {2678852B-FBAD-4D4F-941E-D90458D9398C}.Release|x86.Build.0 = Release|Any CPU + {4881D7B1-06A5-4845-8395-BC5530ABD7C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4881D7B1-06A5-4845-8395-BC5530ABD7C3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4881D7B1-06A5-4845-8395-BC5530ABD7C3}.Debug|x64.ActiveCfg = Debug|Any CPU + {4881D7B1-06A5-4845-8395-BC5530ABD7C3}.Debug|x64.Build.0 = Debug|Any CPU + {4881D7B1-06A5-4845-8395-BC5530ABD7C3}.Debug|x86.ActiveCfg = Debug|Any CPU + {4881D7B1-06A5-4845-8395-BC5530ABD7C3}.Debug|x86.Build.0 = Debug|Any CPU + {4881D7B1-06A5-4845-8395-BC5530ABD7C3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4881D7B1-06A5-4845-8395-BC5530ABD7C3}.Release|Any CPU.Build.0 = Release|Any CPU + {4881D7B1-06A5-4845-8395-BC5530ABD7C3}.Release|x64.ActiveCfg = Release|Any CPU + {4881D7B1-06A5-4845-8395-BC5530ABD7C3}.Release|x64.Build.0 = Release|Any CPU + {4881D7B1-06A5-4845-8395-BC5530ABD7C3}.Release|x86.ActiveCfg = Release|Any CPU + {4881D7B1-06A5-4845-8395-BC5530ABD7C3}.Release|x86.Build.0 = Release|Any CPU + {E99412D2-71DF-4A95-9CA1-EE1F0F26EBE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E99412D2-71DF-4A95-9CA1-EE1F0F26EBE0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E99412D2-71DF-4A95-9CA1-EE1F0F26EBE0}.Debug|x64.ActiveCfg = Debug|Any CPU + {E99412D2-71DF-4A95-9CA1-EE1F0F26EBE0}.Debug|x64.Build.0 = Debug|Any CPU + {E99412D2-71DF-4A95-9CA1-EE1F0F26EBE0}.Debug|x86.ActiveCfg = Debug|Any CPU + {E99412D2-71DF-4A95-9CA1-EE1F0F26EBE0}.Debug|x86.Build.0 = Debug|Any CPU + {E99412D2-71DF-4A95-9CA1-EE1F0F26EBE0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E99412D2-71DF-4A95-9CA1-EE1F0F26EBE0}.Release|Any CPU.Build.0 = Release|Any CPU + {E99412D2-71DF-4A95-9CA1-EE1F0F26EBE0}.Release|x64.ActiveCfg = Release|Any CPU + {E99412D2-71DF-4A95-9CA1-EE1F0F26EBE0}.Release|x64.Build.0 = Release|Any CPU + {E99412D2-71DF-4A95-9CA1-EE1F0F26EBE0}.Release|x86.ActiveCfg = Release|Any CPU + {E99412D2-71DF-4A95-9CA1-EE1F0F26EBE0}.Release|x86.Build.0 = Release|Any CPU + {6DE82860-4C90-488F-9721-FB6CA3E5176B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6DE82860-4C90-488F-9721-FB6CA3E5176B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6DE82860-4C90-488F-9721-FB6CA3E5176B}.Debug|x64.ActiveCfg = Debug|Any CPU + {6DE82860-4C90-488F-9721-FB6CA3E5176B}.Debug|x64.Build.0 = Debug|Any CPU + {6DE82860-4C90-488F-9721-FB6CA3E5176B}.Debug|x86.ActiveCfg = Debug|Any CPU + {6DE82860-4C90-488F-9721-FB6CA3E5176B}.Debug|x86.Build.0 = Debug|Any CPU + {6DE82860-4C90-488F-9721-FB6CA3E5176B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6DE82860-4C90-488F-9721-FB6CA3E5176B}.Release|Any CPU.Build.0 = Release|Any CPU + {6DE82860-4C90-488F-9721-FB6CA3E5176B}.Release|x64.ActiveCfg = Release|Any CPU + {6DE82860-4C90-488F-9721-FB6CA3E5176B}.Release|x64.Build.0 = Release|Any CPU + {6DE82860-4C90-488F-9721-FB6CA3E5176B}.Release|x86.ActiveCfg = Release|Any CPU + {6DE82860-4C90-488F-9721-FB6CA3E5176B}.Release|x86.Build.0 = Release|Any CPU + {668C9465-CAF9-4B4A-91C2-C221B5B04AD2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {668C9465-CAF9-4B4A-91C2-C221B5B04AD2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {668C9465-CAF9-4B4A-91C2-C221B5B04AD2}.Debug|x64.ActiveCfg = Debug|Any CPU + {668C9465-CAF9-4B4A-91C2-C221B5B04AD2}.Debug|x64.Build.0 = Debug|Any CPU + {668C9465-CAF9-4B4A-91C2-C221B5B04AD2}.Debug|x86.ActiveCfg = Debug|Any CPU + {668C9465-CAF9-4B4A-91C2-C221B5B04AD2}.Debug|x86.Build.0 = Debug|Any CPU + {668C9465-CAF9-4B4A-91C2-C221B5B04AD2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {668C9465-CAF9-4B4A-91C2-C221B5B04AD2}.Release|Any CPU.Build.0 = Release|Any CPU + {668C9465-CAF9-4B4A-91C2-C221B5B04AD2}.Release|x64.ActiveCfg = Release|Any CPU + {668C9465-CAF9-4B4A-91C2-C221B5B04AD2}.Release|x64.Build.0 = Release|Any CPU + {668C9465-CAF9-4B4A-91C2-C221B5B04AD2}.Release|x86.ActiveCfg = Release|Any CPU + {668C9465-CAF9-4B4A-91C2-C221B5B04AD2}.Release|x86.Build.0 = Release|Any CPU + {2C076344-B58C-474C-96BF-2ECA63EB90FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2C076344-B58C-474C-96BF-2ECA63EB90FC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2C076344-B58C-474C-96BF-2ECA63EB90FC}.Debug|x64.ActiveCfg = Debug|Any CPU + {2C076344-B58C-474C-96BF-2ECA63EB90FC}.Debug|x64.Build.0 = Debug|Any CPU + {2C076344-B58C-474C-96BF-2ECA63EB90FC}.Debug|x86.ActiveCfg = Debug|Any CPU + {2C076344-B58C-474C-96BF-2ECA63EB90FC}.Debug|x86.Build.0 = Debug|Any CPU + {2C076344-B58C-474C-96BF-2ECA63EB90FC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2C076344-B58C-474C-96BF-2ECA63EB90FC}.Release|Any CPU.Build.0 = Release|Any CPU + {2C076344-B58C-474C-96BF-2ECA63EB90FC}.Release|x64.ActiveCfg = Release|Any CPU + {2C076344-B58C-474C-96BF-2ECA63EB90FC}.Release|x64.Build.0 = Release|Any CPU + {2C076344-B58C-474C-96BF-2ECA63EB90FC}.Release|x86.ActiveCfg = Release|Any CPU + {2C076344-B58C-474C-96BF-2ECA63EB90FC}.Release|x86.Build.0 = Release|Any CPU + {B314CF79-2DFF-4A7F-AE86-326ECFD02BB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B314CF79-2DFF-4A7F-AE86-326ECFD02BB6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B314CF79-2DFF-4A7F-AE86-326ECFD02BB6}.Debug|x64.ActiveCfg = Debug|Any CPU + {B314CF79-2DFF-4A7F-AE86-326ECFD02BB6}.Debug|x64.Build.0 = Debug|Any CPU + {B314CF79-2DFF-4A7F-AE86-326ECFD02BB6}.Debug|x86.ActiveCfg = Debug|Any CPU + {B314CF79-2DFF-4A7F-AE86-326ECFD02BB6}.Debug|x86.Build.0 = Debug|Any CPU + {B314CF79-2DFF-4A7F-AE86-326ECFD02BB6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B314CF79-2DFF-4A7F-AE86-326ECFD02BB6}.Release|Any CPU.Build.0 = Release|Any CPU + {B314CF79-2DFF-4A7F-AE86-326ECFD02BB6}.Release|x64.ActiveCfg = Release|Any CPU + {B314CF79-2DFF-4A7F-AE86-326ECFD02BB6}.Release|x64.Build.0 = Release|Any CPU + {B314CF79-2DFF-4A7F-AE86-326ECFD02BB6}.Release|x86.ActiveCfg = Release|Any CPU + {B314CF79-2DFF-4A7F-AE86-326ECFD02BB6}.Release|x86.Build.0 = Release|Any CPU + {091C723F-47AD-49AB-9373-9E49E1DD46C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {091C723F-47AD-49AB-9373-9E49E1DD46C3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {091C723F-47AD-49AB-9373-9E49E1DD46C3}.Debug|x64.ActiveCfg = Debug|Any CPU + {091C723F-47AD-49AB-9373-9E49E1DD46C3}.Debug|x64.Build.0 = Debug|Any CPU + {091C723F-47AD-49AB-9373-9E49E1DD46C3}.Debug|x86.ActiveCfg = Debug|Any CPU + {091C723F-47AD-49AB-9373-9E49E1DD46C3}.Debug|x86.Build.0 = Debug|Any CPU + {091C723F-47AD-49AB-9373-9E49E1DD46C3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {091C723F-47AD-49AB-9373-9E49E1DD46C3}.Release|Any CPU.Build.0 = Release|Any CPU + {091C723F-47AD-49AB-9373-9E49E1DD46C3}.Release|x64.ActiveCfg = Release|Any CPU + {091C723F-47AD-49AB-9373-9E49E1DD46C3}.Release|x64.Build.0 = Release|Any CPU + {091C723F-47AD-49AB-9373-9E49E1DD46C3}.Release|x86.ActiveCfg = Release|Any CPU + {091C723F-47AD-49AB-9373-9E49E1DD46C3}.Release|x86.Build.0 = Release|Any CPU + {9F0DC900-7B27-4C33-8B58-C09DDAF67802}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9F0DC900-7B27-4C33-8B58-C09DDAF67802}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9F0DC900-7B27-4C33-8B58-C09DDAF67802}.Debug|x64.ActiveCfg = Debug|Any CPU + {9F0DC900-7B27-4C33-8B58-C09DDAF67802}.Debug|x64.Build.0 = Debug|Any CPU + {9F0DC900-7B27-4C33-8B58-C09DDAF67802}.Debug|x86.ActiveCfg = Debug|Any CPU + {9F0DC900-7B27-4C33-8B58-C09DDAF67802}.Debug|x86.Build.0 = Debug|Any CPU + {9F0DC900-7B27-4C33-8B58-C09DDAF67802}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9F0DC900-7B27-4C33-8B58-C09DDAF67802}.Release|Any CPU.Build.0 = Release|Any CPU + {9F0DC900-7B27-4C33-8B58-C09DDAF67802}.Release|x64.ActiveCfg = Release|Any CPU + {9F0DC900-7B27-4C33-8B58-C09DDAF67802}.Release|x64.Build.0 = Release|Any CPU + {9F0DC900-7B27-4C33-8B58-C09DDAF67802}.Release|x86.ActiveCfg = Release|Any CPU + {9F0DC900-7B27-4C33-8B58-C09DDAF67802}.Release|x86.Build.0 = Release|Any CPU + {8B16725E-645D-41C8-BD04-C3D9F453BEF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8B16725E-645D-41C8-BD04-C3D9F453BEF6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8B16725E-645D-41C8-BD04-C3D9F453BEF6}.Debug|x64.ActiveCfg = Debug|Any CPU + {8B16725E-645D-41C8-BD04-C3D9F453BEF6}.Debug|x64.Build.0 = Debug|Any CPU + {8B16725E-645D-41C8-BD04-C3D9F453BEF6}.Debug|x86.ActiveCfg = Debug|Any CPU + {8B16725E-645D-41C8-BD04-C3D9F453BEF6}.Debug|x86.Build.0 = Debug|Any CPU + {8B16725E-645D-41C8-BD04-C3D9F453BEF6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8B16725E-645D-41C8-BD04-C3D9F453BEF6}.Release|Any CPU.Build.0 = Release|Any CPU + {8B16725E-645D-41C8-BD04-C3D9F453BEF6}.Release|x64.ActiveCfg = Release|Any CPU + {8B16725E-645D-41C8-BD04-C3D9F453BEF6}.Release|x64.Build.0 = Release|Any CPU + {8B16725E-645D-41C8-BD04-C3D9F453BEF6}.Release|x86.ActiveCfg = Release|Any CPU + {8B16725E-645D-41C8-BD04-C3D9F453BEF6}.Release|x86.Build.0 = Release|Any CPU + {4BD30072-9DFC-4D65-B6FB-DB9DDE3EFB30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4BD30072-9DFC-4D65-B6FB-DB9DDE3EFB30}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4BD30072-9DFC-4D65-B6FB-DB9DDE3EFB30}.Debug|x64.ActiveCfg = Debug|Any CPU + {4BD30072-9DFC-4D65-B6FB-DB9DDE3EFB30}.Debug|x64.Build.0 = Debug|Any CPU + {4BD30072-9DFC-4D65-B6FB-DB9DDE3EFB30}.Debug|x86.ActiveCfg = Debug|Any CPU + {4BD30072-9DFC-4D65-B6FB-DB9DDE3EFB30}.Debug|x86.Build.0 = Debug|Any CPU + {4BD30072-9DFC-4D65-B6FB-DB9DDE3EFB30}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4BD30072-9DFC-4D65-B6FB-DB9DDE3EFB30}.Release|Any CPU.Build.0 = Release|Any CPU + {4BD30072-9DFC-4D65-B6FB-DB9DDE3EFB30}.Release|x64.ActiveCfg = Release|Any CPU + {4BD30072-9DFC-4D65-B6FB-DB9DDE3EFB30}.Release|x64.Build.0 = Release|Any CPU + {4BD30072-9DFC-4D65-B6FB-DB9DDE3EFB30}.Release|x86.ActiveCfg = Release|Any CPU + {4BD30072-9DFC-4D65-B6FB-DB9DDE3EFB30}.Release|x86.Build.0 = Release|Any CPU + {A73BB5AD-C3CA-41A2-B5F9-C06DE6F5CD5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A73BB5AD-C3CA-41A2-B5F9-C06DE6F5CD5C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A73BB5AD-C3CA-41A2-B5F9-C06DE6F5CD5C}.Debug|x64.ActiveCfg = Debug|Any CPU + {A73BB5AD-C3CA-41A2-B5F9-C06DE6F5CD5C}.Debug|x64.Build.0 = Debug|Any CPU + {A73BB5AD-C3CA-41A2-B5F9-C06DE6F5CD5C}.Debug|x86.ActiveCfg = Debug|Any CPU + {A73BB5AD-C3CA-41A2-B5F9-C06DE6F5CD5C}.Debug|x86.Build.0 = Debug|Any CPU + {A73BB5AD-C3CA-41A2-B5F9-C06DE6F5CD5C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A73BB5AD-C3CA-41A2-B5F9-C06DE6F5CD5C}.Release|Any CPU.Build.0 = Release|Any CPU + {A73BB5AD-C3CA-41A2-B5F9-C06DE6F5CD5C}.Release|x64.ActiveCfg = Release|Any CPU + {A73BB5AD-C3CA-41A2-B5F9-C06DE6F5CD5C}.Release|x64.Build.0 = Release|Any CPU + {A73BB5AD-C3CA-41A2-B5F9-C06DE6F5CD5C}.Release|x86.ActiveCfg = Release|Any CPU + {A73BB5AD-C3CA-41A2-B5F9-C06DE6F5CD5C}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/linker.tray.win/default.aproj b/linker.tray.win/default.aproj index 5479be2c..9c12466e 100644 --- a/linker.tray.win/default.aproj +++ b/linker.tray.win/default.aproj @@ -1,5 +1,5 @@  - + diff --git a/linker.tray.win/dist/linker.tray.win.exe b/linker.tray.win/dist/linker.tray.win.exe index 4dc04fa96ac33f6bb6087b33e15883a7b1472ba7..4592042126f15cc680d9df7df4845e6ba76f25cc 100644 GIT binary patch delta 16636 zcmeHvc~}%z_UNroe}?!VVv>Mmh|>^%fmn|?VLHHbGL-hlWa zIFu5VI$EkHV<(X8LVOnSF2v!9WbD5X=OF$Lu?ca30oRLoE#e-;TM>^Teh~3)#IGPe zi1;Mp*AbH86k79o z40*KCM~@P6JSCPq88F~hZ7iWFz6yjKn-fbO+pExlOOCWpU)GfcB=|IP#K4 z;a|8Tj=Y?x(9i!WjucHDr*V98_U$-wb+}TY{||AbHef|heHBLz#3}sFpW;ZKQK7dM z#gkICvckwPaON+1JM6ng8i1d<=HfX7cJkX7FHp7BX^dLsEUK!g{jCz9R( zrR;1>B*$ke9h$CAB<6rE+HhwgS+-i?ANxllc{*T%Tlpk1@P)$vF(sK?6C%^z@yS?L zGI7Qz70ymeCbbTQHr|y?_S~S*$ET!_kbnt)U`QcS0DY&BLbiAYkmXBA*1Qz*Y>?9a zL_-R>AS>zUxY-?BoI+Lyh+JRdQTzg+vF? zRVPzOM8Fo*pG_eKoZzU>?#I4OAvFOaJrb2l#sbVpNK7TQR2g9FvQ%0Ev)IVURhD{q}jo-5}3{a<*wfH(piQO{ci2@By;W(DbLVu@7N8Sjk4`6V-=*;D1)l5((CU*Go;(vk@1D<-*)>Z26Wb=z zX~+0c5*D!HoD)1*6`*uuAMzx5W0-%7b}uuMssJ50(PktY(7b$G*tE(>f&v^>%W5OJ zpi=nt?M5;?p#ClGqejvlu)^~jjAVa+89unxNIni|u=PeGi46!wyZ0bJp#3JvNItj_ z?4QuGgXJVQp#G+#<>XB?dEbQRj=o(!K}1_)DkjjcH&u|UK2;hBrdh-ppv6yB&zc~i zx1X&cKLqe!KT<Uof`6AFDe5Z*;Y%0fGr5$Sxe$V6@J=1wIn>C zgPc9Jb zhd(Bej{-V8b5J1N!wSEJr{v>+1jIB#iMvAKKQ2+yQ0Oy5wErLf%E&`hsqkRFg?tjP z(6^LY$hQH(=ejNnDXNY0@8L6#EG5573#k9f(g_l6*}RN=wq4;@Cbp8l`XnUBpRANt zvLiqO2QykpM8FE4pVCUc4AAO_b6ZLJLrRB7j<%8$_bT+goy&~B|}nWR9CVd^GF@3A+@BGn23Q0q@0w)%d?^;rK5cpO^6(}cMIfaRUmca6 zTIwm%VWEIctFiZTd}3avZ%y*B@=rO=u#8YI(}XQeICwGs)Zoe({>EwenBD~&aqF``*UsQN$ zv0iU9Sxr#VV%(un@3t6I{FL-ni*Z{>WRX}}R9;eE(l!iDmB#7N#Ei?seT5Le!dR?O zUooRzp{81l28CK>F-}vc+bzaYg?h(gG$pk=J2$TA6y4&Cbu$d*Vn;`Z(FAX;H0Fo< zsqa@Bv!z#88oN|d-&Es);7nJ)=+N~$Z4S4uWpTM^wU!j?+h9|>@j%?=#jw4^m;|#s zjQXEpZSFA6{2A7(9mZTZw%C}O*JaX|l(*~kZM>+nJH<|$quV!-j|F?R##C@jGvF%j84O;s~be&ea=og1l1nJHNFZwr=^s$slhWm^38WfOcn*JhrntC5Kahk66 zHg`wQjCQxfCjehP&$N_oXD&CIByOg00T)?nEiW%FwRWIJ#TFVf6Q+y4wmuGQ(Hqs_ zK1w>IH$JHfYN{5XKF4?pP=#-o&KDbZa^c18?d2t6he_VnyZw|@TxvX``v1y-8hWL2 z9H=l}3iTWL|IPv269i$*nDqb33!IZQtBv!5q>np{cO`O7TQ;pXB9tJMB9tMR5XuoM z5N07%BA5|oBg{dlLa0Wlkv6Tby$8a?;`UO#SPI#(!s>8CXNOp#H?&LF#|oc@O3%D0 zxMQSE*>p1t(W9LVgJDWtQnW)isBvp~hptoOhMV$e7F5B!i1 z94E9|sWH{fJ9v?|^Bvk@Z@JB^(es1w_wR)iSR7_i!>>*Wad2apWfF{qS|Y=o{0dKn z$S#@(H-uZ_VRjd-@I1xW_i8ojPTM*)?;5Ywe?3cu1E+;>_-z->fDghg>F~vAp;&&3 z2O+|e42zzj39z&qd%N#uAr@}zrq^%|i0+}LY=@@URIJzXLpXOsk)d46cgjyjqn2N1 z9)?4AE=+=x^J!STL!NY}ZhnteGiv!u6q_J$>Kln;wxCED^qG%;&r8&h-_;ZtDhjh5Gcp4}bdX zOP}1d@AUSY)O@GaE!ylAxdy3fpAZ@pz2=j9AN}x;nC~*ofL=DlaaUzIcQ|B-aSnJjLcj*O?pn0kd5r&sh5Jr`WkD zC6-N|LQ|!`9A=-UO0S<_9ie`XRQw^^kq%0YfMT^3}*Q0Pn%j)d4p_zePZ zcA5;An&*YVjp>3K{+uerz%%K>6z|j0EMc1b#Dbh=4ZM>oWWt;@Au`Brw!*uqLI(Ws zXCVp((uAYI&Jlh!yw|-XiL=APbm2Q}VTJqCh4e_5+u5(?tyTavM+1Bl-M^!ge*dbx2a1<^!&x?@$HdFXTP!bAG)@+=VsB1-=zz*zk2Wp7Ei6%;~ z7YoO@6er(dw~B);Lk_pt-(u^tI)~iY*RM;2f>dt@*xuz?R0nooG?kXYOBq5sT&xrl zGx|nGyc%x1%&)jWoX+&{)jw!4*8$I(QCdTA#w=)}W_1lYI%JbX-(zq$B^Bm4buPE) zw(8LHIIJF4LBW+}kX0oZ68=s3K$W0QcWJd12DAC+*dnrvewK|h)Kv>5IYTI8*<9^D z_cCZ6?jLmayDCw@ssrH$BM)=}lW55PLYN=3*TC$>4n1)(( zL#fc9LOnZf5>}vcN%{)maSqvknI-%R(e;%=tE#9R&Sljl!m$i=$MPm}4G?P<=BBPt zyKQc}Ro%ur&C0VKbhCvi$ta0l>&6O$Ja5mFeuVFVBj@SN@V;>tymcO<%+s@l3a$&z z&K4$f>mX*1kXzTUvGQ_&>F2xoI$wan_4rQS0CM<{syIwU)09VAgw6Q!K5A zJ&g;Jxn3BUBZ$n?yq#$^8~I^b{1yEHGI!}@|G%PNXLDQobPZxhkIiAN>uek09Yc0I zZ{ochs&0cHO+r5OAE2qQr&@^3>DPI^y4N1+nl$}7x5qTbI|S|mEr4&Ug@oA4IVm+l z^A&{~YJ`F-3isCtsgma9PD&wL;6~y<%B9Y^oKaE@yx| z9Pa-1ZyS@~aC&159IF+Auc$RP7oE<=U*=fc~|tT z|0kUcx-<2YKwn%RIjPf=6xej~-qpheL72_eLKzkE@_Ko%lJR{`JUJ{8?L*efMFgH{ z#$LqzdYlTeSB&Lhue?a3ui)S;(%`m>==!HIAvSyBMqjbe_b$>c@K+`*yrQ4k7NMK# zfkShJnb35J#>3GE8xvrUMF`>g{H4Kg=eLdVaF$s+Ysf_zAV z-1Md#=nrnXa$|Dm2`Ndl&H5{}0Avmf)(N>8T|d7iSZNBpT_?=SSoa?*Rav^x?Ul$L ziLa9#peNJXh)*Vi9#gGad@3`Rm7yKtlQ$#7j7L*mZYtLD>+wmB4O*VUee(oMdaZ6z z&su(>Wml}%RgZwUd_i{7M%_{jNW4on^m<*5{4Bz``IrE`F-u4U%Y0z~&dwKRMmAgR zU23gX4!y`WqxH|M7jA|ZGg%sx)GSVhPwR!))NWnVBCW=)Sh}_XJMM-_4Fb>A?L5XR zxjGm)i^Uv!i?XdeL4-LaKOww(lhd8bYPL9wgxg~Jt)%3y0AxsKAS-1^qM(JwU z6U?Gvcq)wq-C9kDq>w6|AEmE^U@j1jd5HA>^^{Y^cVj7yIz8(c!KH~(nIKD>I$ zq~~v@Mpb65JiCA`_K2=l-eLw(x6+a*YOWtY1g(aTvhaY?ek;w!C2qczCIu}quZGx< zX$mwwK||rGTWKoS3{}A_2hQAz3Do4fabq%Wqp@(|VHyWxx6yE^`Zn6dh1RP|Jg|sxkd2hPC6P~r)#!?9;h)2vkoh7m(#>WuzwdFvZ5-Azqt)v|7R1h_QNMw(?CNriR0X?)N!bG3BSZaTu@<{faeWQe&9SAB3V{`$bp zqNVD)>0u6a@b+p(VJx48Lizg`POlnaiE#EFAq2jz##(SM%?`pIese$V!OBziP&=Yq z_Mp&e;i*0JEd1+xtow!=TcP-4rMLD{BX;|n2WYSg+lB1Ic0*A00{tx%K1ACShII4M zJIIkA55)2+hTxuu=s9!=+kQoxuy6fY-09UH(V6%xdkH`<5djB2qA{@OVansMqYu-K z@cdrf@B>fc8TCmuOOdJ`p@-%1xX0;Lh&DY=Hz4}X+$|HBhL7R^QRF!)mrkn}1E4RgrjuiE6Okif7*Yf1*<%=n#F|(5-Z_enJ<0{w{j0 z=5Fh_s&`psT~C3OC+H1m?!S0~PQlf^fJjwul@*+Mgo{VsvoEtG)YUmp(s{wazQ#y% zzeFYfQv?h>L!SsB*>CAz;l8PC3dBA~!(iUC^fP$lc{&OHWI&Hl_Z)R$Z!bJYqdBft zdh>adHAmr}FHlQb6RxPkF1lP5>h&`WdcAstUt%?{w#o*W3jHtA#e6eXk@HVIo>n{+ zy9cdS2Ue^LXgetOW64H1_aaR-EV2e9u?^$RF@0ScSYEA^FN5-zXdm3T3Vqn)!7KuP z?M5-3{9s-P{P88a5&c5bVVZ`n&vuyV&=>4JOpEY%`_^H4wMwKWzZWeM{X#UHiNU8!Z_*xb*|xXnd2UF$ z=55*?gi7N%?p=D9rgKzEJw}hp#`EEOv?SBU7h8)xhr(H&=;2zT)o47&JsT|CiI(@q zUSSeo%W!D@9X)~~&;C7qnv;EW^2DW0k<@>n9YFz8>V2Q4!&&RnU z<29U|;ZKOL$M644leh`Sg?A}vT+-yfP(hU)Xmy^$O<+MEY}PUjnB!TJ^xTISCs7%u zeT4q^KNw?glE?eZo1o_PVE8>vli1(rFSw*3(XUDCQmoWe{^eTu%q zbq5s0ou+XZU~*5>j>~<@W2b2WN_*D>v{B0WlrBI+m-;`aQ)Soo&X?HZ!7peo&h~d- z(9e>(MLD%{>pVAK@^!wN@0Dvk6ol~)?!Acey!{Mqz^3SwTws}jlWG5oe*bTT2fcr% z`%xI_U(*sq3%;hWOrcg?HN|tGZg9wM#jxI|)wz4D4*!Ou`>MjJpy$$Hle^DieDsJh z9ZsM1OcFVhA^#k`4sHFBbF?y-iRN~3+$Gea&^)#^q8!cZVNNj1g~D$z#MZ*OZ|DQq z@y>tHsj*FBfL$#SJ*UIe=J77jzUutFp(Vb09+kZX&Y#Dyx5(3F!o-XaGnY4 zG)lmDdld%E*+VRI*CGrNk8EIZ(6okyXsGBpI*iNNbHljWS0tY%T;nG}*sR0QaLacz zKK{xBA6LRW2fjS%gYT)9Q#FZD{RSQlru;x#(7fG0(A8+($A6%=$J7OOJ|rJiw4i?) zgEa=M80p1-Qc;ERGUpOqhKodGg#DN3TWJlV9I`!W@lyHGn-^D$p2Rq{<=-X7OGSt~ zgn8pvKheh_suCC6|1VUUSN?@c)37s+Rl)g6RtN|7)ramJVRF8^2oKKU<@xT;2N=)U zJn60ya3Uog$FjK0WuiaWRO7;wEO(LU3E`QYKu_;9Y_B-y)hrH+98SA|+e7?fz zvRgOIFrXbT6wQkvMh*y=k;SGgP^$EI+A(Ti6^jT1$7v>)FKe15Fpk0RkJDu7>0ows zP>>+Ja2#70W@ltFwOIC3Mu=gvv752xlh<|6%=nk#Yj97NF3bWYN3qki0&G=7# zE+51MHY;pb5ST>OXlY(X3DFbj#|5|qZe;>mWvRZ z$Wl~RyBzED;LpFNT5u(@5!GA~-c3f!*t3L&N?A$lMlNWcsD(prnj}4+%&zA2%SCM) z{%HBtcn##eC=>0d-gx{Q_at_^a#QNI!#&s2%rLLh$Cna%yzYM~l|^Ub{fpJt0+;B! zqO|J<%RC7_M5VDeLqxl-y8*Tp3x&X?vv1NJcHa%F+k3-m_a^>Mh|XYtEpf=VvqNSL zy5R;%wna%Lw0i~Y@5uopmZ{84z`Vx zeX0&S%-&10RXv`a@Mc}{EnH;^k~}ZysBVu_!*5 zd14XbQs`4--gcuzr$A~Ri-D7Bb{G}RTN6ArYVui)x5iIXSr|N;&xWxt4{PPr09GU% zoyy+iI;0&1Y$m7bvqR$ztP=iJ$TG4#GWO=r0SPr;63YoSDtU&qK*PdRoCr&&vHuv! zW8jNvtRS;rk#OGx38PSC3C}OJih5&NSGixp>+R-#pM<;Z7>N|s?wv?>O(gLuGLfaK z+C9?FiBzHx%=m`Rg==T9_u<&@X$bV6p~2ySfh6zB7$RW|8Rk^o_`2aonkU_AU~Uf6 zh@fI-|3B`eE3lK`b#`qV%rxQMM*sJiM4L=3Yci9Ktjy@Qvf2PEtA_y-n;U3kNpRf6 znu}`fyy!DBujR<^0hnDUmZSb-RP-AjmUUl+u>_iG@I*db&USE3^fF_s9XGbscJr{c z&*qjd#I5qh1Fv>@a2wy@?CWv=na*uU}qBsyw@t(OwU86nI&NArZclvY`WFV<`i_}E&8~z zH7Sa;dV(V1e#?qv^Sy=lE7B6Xxyh$U&A6)ZK;)j$k<()pJ29Hn$qMAV5#KnW3UXVN zf_|~v>Wf^9Abu4_gobhV`t`#YC=SlXGr8x)`rfZ;nhK5jliBQUT+H5JJYn_1-&e6r z>Chauh~t{2C2JVRK}ZeTgv-nw#ruZz2uwEnn=vE$`c-tz|6RitaM1FOpp)ha=%vxl zk5l#|dW82FdqgIO=dv%6?5<-b6&`W-%x9xW=G3zRE@>l52lXH@gKClXHL%C9p|o%T zi^23(TGPZZ-CYC+7hz-^f{ixT1lKiVupELH*E0DE?#H$4@33z%)5zI$3`WFDi`g1( zDXdz;et{kQxP*nuLkG38xA1nyg(=(=ps=EM!3vYdrsYFW4(mv4is zma`LhDs5iD)JUyc!M24_jTIZ!LgY#|XHvb{iZ>PBA__}ZvJR~F>`FF2v3vY&Y^~L9 z_XN9&UPxUf){1%06QYd32#lR**P&=^B*i+Z{}YdvLLX<*DR!B{~>icQneIxe9LS zV!6osbr-6JpSM9)kv3?y;jRoxxZ8rP1h~_uIBv1LrFX_tIl6isz4zr8EdL8;t6hEU zLENq=2fHBz-AI2c#5(Z&|Fnbs%DcY<$bHwzM5GM;o=w*d;IU#uKf5;>^}>oi3is2h zYnC^}+BwGt$ghm-^=z~3ufRFL?(=q11XY795_|Go(6kRSiq8)Zvd<^^_FmrNUbxT2 zvNHu`I~PybPTYXKm6+{+?P75&=iAMKZx0tvj28=VOUF|w%lIQ6Zt|7V0i|@UQrhY- zg{)OhSz@ z@LD!$=PqjY=!k?m@*5TQA79N1;NI)mzDe`s_)=a}T%_ffd&2#b<^B}PbD&4clSFxM z>o3cpL|wb*_TGEKmnya}o!q_cMpmJkXNP?^vgc5b#hchuGMRcaJD(chxUFt~jH3S{o*vq)iH4icQ1?8+;*_5fw^Mc+xWSyhS>32WM#XWkT(Oa_Xnz|<5h3gt`(NwWyL>5lFZh@S!4!gWlZT7zQ_Yj_5>wHelQ{@W*4@Ki{(LvzP9JJ^S(U z!nd|u$rwiWM*ZLEEK90Nq-Vl$Kk-5?Ed;;VspysFWl{X(XUik3HKM$<6hE*kEi0BT z0gF>9UwS6r&C-J-+vS~;KWgg((|xQkwolj9HN-Enb`4rxJr#Z6xQ`ie#~!$k9f98a z*>-<>2;Rf)PN0`>be(i?4|_+xSRMT(o2{zjVe>Cpw)B@@vKv*w^1B3ByASV$`e4gG zwvcO=-rvV!Ij&Fo{2>gjp6}D7qKDZMe7E^ewlKtn8Sy$W*fENI@K5$#kPE-D+JBKv zhHoyiqtPz2T0O3CBE0q^n-?wm-g3IlB4l2|sf$w6C6*Gzi95S3uiznZ8fPhraLG;p zzq@mRm9u;`$z`5CeQ=iiEuOf-1*=t-Ud{z?sVw&e$+SJlvN%{A;hW**J1t4@evoAY zvc>qNsbCAXyot|yLoAuFAjA>@#UYj~aEDkwzDp+>v^cy=`aar{ufpb8 zv6ebSU9pzg8Qxwz?eS}-fg$VQM!By|n_Tc>tR*Gd#mnCeG|BN#gp;wBN@!b)`HV5n z@~s-bF2qo&vuf~DKD?>%UJ|=??KTH~1j@@__QCvk%T;Rp5YJl=-(UZmdh!eFPvb2@ zD!Qo4JCWTMR3}(|nXE6moM+S*!4CFPq(D1MvIC{D%2*ixKlKCnbdr7Nl}Hmw9M2| zT5c58JWjtttuHbbnTk70)jTc&D|Z^ivhvO@HIE{#P`Bgv{N>g%tD47^Rj7-L+q=5j zJ3Ejp!Jdt!T~_R_T_(#a)LkV-`gR00kE_SFouPVzvBau}iY!ZucP_>*z0uHKj2(F9 zQc`LyDiiVa>77e^N2$rsSzbOqxS_mMUu-Bgj*r%5#8<#2<+u*dXhv&si2*+%A0N$N zEN|~9YcE!htgyCCSL-@lF7?O=2Ey^L@1*F-mgQW!YZls`Us^V8mvc}fe*q`LXtrf$ zGX7zJSLpWX)3w7gqZ6(9)ojb+P?tGZzVUM>~xpT zA@*6#>e`+mN3Z-57abgQ;x`p8Xv?!?N4j+Gjr~@$6Y1;oEM?gGg*;1_s!-k|gGU?& zj}#0Z$s0TpmVcKa7v(9{6eBdzRP{+XY+u7CN;`2PjU^(u}4 delta 16320 zcmd6O3wTpi*62RzlRlvD2Nc?-r8IB|Nt(84Awb*g9SSWJT1v~qa+;)VXqvQ53KS?U z4vOOw6?#;#mU6YR6UFew-VPLxPZoctU!A zcC~89)hZ4_!Vw6O2vG>p2r&q;2;&gq#H&^DES38nPNc_A8~%Pe8EHr&BZe7dqziEe z;t|A$5bs6&I^t2pUm!k?IEg1C?;$oKzKGb3I4PNoJczg$@!N>!BTkx0Mp_UrMBIyb zJL2mQKZE!nVwIMRJe5qUM=CLK8Z&%|KSq2AF-gIJ5oaO(7_km<)+{oz0PzCEYY}fm zyb8D?Xw8gooiN;cbv$`kO~{9l{_LCw z;>m^m3Y}DwK)#)?& zokU(JR?08jo{wrb(e!Z%rY;HYjw`;S|!BtI*p|r;x(12|V~-3c1SPULK#sW~Y)*!$f#t zMk?tJ+mve;r;;~jDIFTOrV?}568Uzel9o25{Nz7U$rE7=Zs*fT-zQ4>#f)@vb(BQ= z$0u8I(urrhQsJ}d>7>T3(7Ju;6%lusA+rCjh}<^?*FPwM*iVXxGfkm= z-xrbkNecZk>P%LSLcdcwjm!w6W0y@M(H%;8(o@q&-3to6dP6a}JxO8c%N-hWbl9d; z82wa3EMa!w!ap=*=W3;Vd&6|HVY)(J+BBW4OjPKW>!y=NtwKNgUXR>c`A(FwTLHk ztCjk1+%%R>JIxQ1n6Me=oZ-n;VViEtyF5uBj0r8#t`;MiAGQbHSYsp`QN4moSa+3? zd=N(K+KeP3%y1dk8p%bKQlGaC8_C?T1}+;`2otHj&q!8=?b;WwHImLSi4^ZQlBO)B z!!1u3$vYP#LkzVXsv!Achu44jEJsFs2oEdUtCExomCoG%4QQ! z*e*UYZ}u1ooqVdAd=plF{H1DA8a5z#rJ8&jCc)uLC#%VCpH~KW`Gy)|30s2L+iOTt zv{Ih6uZF~ib&z+UhTQurrTpbZ76M@+UcJ~to(!v>)?^`<6w^FRl5Vn)`prrQYhx+# zg_+_vGALO>mGZ*Xl>9AhMhOBXzsXk0-`GUS>(dna{(C9;B#eQb4^k30GpL5B|98E~ z$S284gX_*RayHC^=`~r&S7C>by~|1rHA$g0-22E1@`tcJ;Cgw*7>OEx)|KLVY~Rcf>x6K3#G&RPqdOVcPaFij+LZ1 zOzrM}a3v`W+vLZQjtra~xU%Ts91(BR#hc<`@0|FwOamz;WkgGigpv|W>q!-S6qm)z-3uaef)e^X6PW3*Q$kafxGFQRr=)5&r&`Z+UUSJI4YWX>42 zp;)2RUl^RRG?F|Uxl-wl+?sfV1cXF{@dy(Tk`R&+QV>!R(h$-SG7vHmvJkQnCL&Bi z$U&HlFa;qOArB!RL5)y=P>3)Up$K6bLNS5{VLHML1Rh}~f)-&Gf(}8CU=VX_N(_I2 z2NoJX5F7H0Ns+M~x-Axa+9%#00Otf8#Eq{CG1fZbN( zG=+NEYE*|P@e8Z*aTVNHXxu4g)fsnVD}9OGRN5}Ud7Cj6^4g8DaJt?&9Lg70EH=KZ z`u{+(JDQB&N29a_oO`(eIGypfq9C<~*LJu(8)k0k7kcORDy!|UD?Y6=-WdV!wHec5 zbvlEgtkhwG#bw4F3iX#VV~Ij#l^b;m)lhEK#|7K1*$juvj9KuPa${^#aG+ozJX>xo zQyP9#ZZyHWg7InbhC-t|{{NWwo1&CH|KG4}iM5$JI?7PP08GZh5GD4RjN5TDG#fL; z(RQODBF@_@xV60=r`rcF%ria)!}Emgi?eu zgmMHELIpx4!fb>&2xf%22=fr;BUB+&i(3Y3?t~b7yWJ$1N?}T}r7hNBu(jJu9Cq=V zWXsv;IK5uChTmLXt}g?wfo8$4=g|kEJVX3O3kcOT9qzuSIR-Y)r>{l2%*7h$t)dg- z+nsK^v)8NE@E&ki(JvxhLwp;YcQmI(VoN7*H#Dcgjn(vB*jYn!;=DdjubOvAwQsGV zuS8+()-KRj(+u!hD9?GsgBCiMg9tXZ@>)tKiMfoPYfBxM2p56%T~ zwN#I7=hV_2(Wx#C-+}y@=N9Yu0qu&Vnqm+9aS2@ko`Z{`z|esGyP&UuUgBJ$dntXJ zgQ2;W81OBn1!8|AJ;8Avn6sQt!w&7s>3I%oH?N@8i1w|Z`G}rfLDwa___j`muhH4* zu5)^Q`brO!wa{1OF+^1>y(eP4Bqa0P&B%qIZSC5#kIoi9TTM@M87|)DatQrR18$$t z+vMzVcm{mf{ts8tqD+4yY~z(Vw`qp>k`iM%EOk;Iu5G6^IR2~cbUHHkbvvzB;T&ol zbQSU}-rYeTm6)yTqQ69Rp^LUgR+N>L$!)o1u+>QyKyw?N1sB?B66|iH1vt~E+fa1< z@M#+@p2*wHtJFTH&*f0B;k&}pJ@6MN%}wtxZ|-&sR_cfN_5PG@i0_5ub#xZj303Rp z8m<=ZUPmW$gK%^m&CjSScJMyl&DZfYe79z^&Exj^@-{$nH%;d#yjZs+oofPfHx(Av zX|d4lu=$)=N9#g~uBy{IeU2V&yco z6}%lMc-aV7)Lh=%*)P}~((;VuZ@7mxUBMq_X2Z8VG=AD;)vxH+&p{U)^UyTd>80aS z4MRL`i?M^Ojb@W!*i9!+?BRcEa`3pDmQU>X>GDVqEx3ZyExl+17kg+<;(C4+cJ0)* zGfgptM^{@kaL|K$cmq6%4GWrhzgqA;9=pTUEVu?7mkSM$%`8akrA1c^BbSWCvV<#2 zkbyZ<#_od4mks{dOV3=<@Ms_H4|b{=BCn`_*h?qN^}~& z9#a(+rVN^$VmcFC>uDY|tw&)#yPi(q>fv|m=?z%;J!P3_L66;6msaF9`?UQ7ZZ|s0^RTlT zZNoB6u}`sHno21b9@>Cr{O_-`@$kV0?63Y5%Mzz=L~~x;j?C(%>CN_=Nvp(DyS7SG z+{mw5rS5mQ?T&smUkBXhmdxy++pS)+Ml*Z8(4V)=Y#kcHH1y7}w8ZI6C3upT>MF|M z{31&hyw+k#6E}G+v!Ws^4CN*z6W-cr*{66$n+7d+rT=Z`_79KV^zq2HkM_Ut@jW-< zzrQ_jRLt3A`D$_85O4FJYW1Ld*peX;oIT&(P$tRr?6=8(4*`nj%yeD4zU|mi5(hgUkS3>c0=4@ zR;=zY`}|ucAmwiJW}8d!dMni(F2_do5canC5ta#;j<6IMI?R5z=Yk~xzBz={gi%%q z*Z-P5%C$rJ;92^arX1k@Lu@wO_zw_7h|jw;4_cq zYR(6qUW+N+7cd$F!5xCmkPn{gwPa0kOWZpB=D{bW?b=0Mn&Qopn^Nh9z9vg%yyUoO ztNJ^=tK^LIqDDvmdPl#sAld~UuW!wkEo$`;x~zWn@%0aGc6Jo|U{Rl?Kw_cKVnY5N z?6XvI{ti+u?*O@p?zarW;3<|E>lqpvLVfVTu71m$wBR*9WDUB^xH)?)ZER|NDTk;8s2-H5rhFnSZcKh9}(73+<7Y7D?t zH`6v)`4UZloLUwKJ5S@!Uv8$!oKrk^GyNb6SSwx&zTQPSRZcfHGw91pg1fs@xruZ@ zX)A3^9Ma5|XKVFoiaVhns4lWwTQ~@Z7h0x@zXSBNk?HUD;vFNU({H!iu}}XARwJId zgBn$nn8aMzK_H8WNe4j<)L%p!v}iv~j;J$JXxmTCS%V=9X7Bg(+C3ZGXvJ#HZNPm+ zbKvxTn#nal-_3Y}#U7w)m=MVlpzHvh0BKL*CE%_DG*(=5fOc@P1AZ??2lo`PG77wcr(q3*reC;6Kh=P?2{z^&r(zhcA`Bk;>#l6&1+>D%87%K2wZj@7a1UF&A ze=OHy%1}{)hw(DF=03U?FCS_n#ymiWBb&924ygMD zHNx``&^XLJfw^2G)c%6Lnds!Z1n)9Ok7vE3asX!hlA7XMq@5&-X$5@!Pga;#R#sx_ zs3^CGl%mSqBL3o+bcln<57G0OegGH!lg*yeKZn|zD0}0 zTOOg+5y<2p4$&?wo&6YfA$ssJ6b6ISkI^roU@OZ)`MfoXS41qDKa*_}_y3yyjKfy> zM`%}sli$4iFuD=1Ok@Y4<_X%K;?yoe@4!9a!mFy^xPbTs-ZY!xp(jxt2c&}~1Cm7a z5dJz9kM9*C-uoEbDbhhWGm2|>RSGMB_YGLdQ;Y8J-8)z|yq3bIh@($YmkI}-{4Cvs zXz#OhBckNz=rv<{edjrvh#AtsC3T(*DMzV&+JGY@L#HF$>F9R^-3*(SL-dedj$asxf(*_+OE!r?suhU5?1bwg3 zUcLcKq&u$;@9eUl(An>BNGjGG)&wJFn9~S}uhUF@y(8@6ye!ZhugojL^IMesDp>wH z?SYRwQ8CXYvvH8P71#B>Q;U6XE#*mJX^v(>u`~9{4luj8F}jVb%L|VhZol`W#*# z`n%?Qo#bcLi6!sSSGb4)z65S`uEX*55VXF>}l=$Xp@;(`M>BBoZsq> zow0~BzB(d|v1hVzXMb@Pw}Z^=xh7;5^NQiIkLiBoss8WuH_~dReoE80F?!W6?PVv# z=P-wO;4}K}*wQY!RJ`R2`Xm=s=g5F2Ra#Y`YqXD{{eRf&VLF#`~!`T zK><}!O)(t!4&8*ef57{rRBIPgOLeC1wz46P?fwm$lV2m4+l7F3GZcudIYYBM2HbLF zCy&D62$m0M%ub-DC#u+eIP75+o2nWVV0jzWNn5*(mZ%y8IWVPa7UalO65l9e=`-jDoGwnax*Ljc6L|1^ufSMi}`6 zjZPmF{86U=v|_DP5#vh#Sw%@qtE*5=A9#aKif9%zFmEn82*D6iGFYFc$zoI#E96v- z0^EZp0D4>T^0_pcF$}%!jb?3VDK18{o#U4U~fG}&*L;b-m6)o(eP~;^wYra ze~)piFYlr8;tw&*qEexxm&UVM;EQ9$lDK68gAAtrq@ zjavuTWwC8=;w(BHt4^ZnIWd>Ti)*q`2;2fVdWl{KUru7YDfLpYo6Y3!vn zUg^;T@6LD(psK8FmEu+Ybk9ai<9$Zj@mR#HQW1t~WXi8oU1kTqM)-qEXiS}2`Iz#@ zlJT8)K)k+~)pC=Z$VkAEw!6Z$28Anyo*-&EOCCSqGCN%XiP&6zH?DFz%Z==EnQd@- zI%@ggbk-Qz6Cit3y{Vks^{Nykq6i6S(V&k zPYDJ^KG(C&VI2y=k~g?s@y!x8i&J&G;Q32*4xBn-8NcT%qZ z#oJ0*j0!LGca*a!S84`&-kC7d#EK?$DnjobBXks(Ec9zkDD)1OxicvA^)C6mRJFU{ z+BRxX)wuizCUeOLW*#U%yp^le4k=8-tGzN_1Lr@blVUcYX>prd;6)4TM~(Tt z1&{BAl;weevKg?OvMR0`{zO?3+@6RBcOgR$K~8OAECr8=Dh*48gA6?oC!A$$UQss& zvjVoHT2X|mF^YgYFaHZm*5ttV8KHAxvCCW?)QOF-&C1gAHYsPs8h$xWCUA4}&9vdM zYH>mDuPkXQei8I`vUJtbfI&JnO2>iDjkm7s0~iO(UBF_Hzoi_@QK2L6o{5%k^#b-Y zJ(ca1e=SaEo{8h z`wOjXiAuF7(0B&B3j_Bk!!|$(Q7Fc~1JB`dQjl)y#hqurN zSl!0fa!cT78VXlo$Mb@9&h|cC#8;Yh5 zuC?LR2jDFmJA=3DU)z})sW6c4H7n zdf%*ZxLooI zvpQLFVxh}y4Q`M=d4r5!7rsGSS@Rtr&fI zsFux#Dkt-DebPP{k}hw!1@gqkZswK<+y{7vbg^|P=aoHZEhR52A&NKg>y*`-3!i#e zKGsO=#eET~(W>kZGyJ+ASHUUbB3q;#fD8N~$1RkWa94bb{6U2O?73$>JC1(+x()1F zMCUiKSN&_(hm>}Z2}tc6lo#~6O?Vyq(;&Mm9oO7}76g~wp_PU0u+JL+ET0qCDKDX9 zP2lxS?0~-$1Khot#bHl!5b4-vMll_;h5bD-xUSOjb;5UB*p!5o%2F+aZM)GbEFNM> zT@IglWpHf--w@1C{Bf6>c|-$ zAKZLBdqveBpuIAkBjT%#F#=Q`OA35+GkYe{>65NQ7==go#wU3ZO`uteQH(nd(R^6A zlVwzd{5ko8j+E@t`Cle~(xJm8af4QR*-U=G#bXrT?Qls^{K^g&e_6!8vdbq`z|UTAXUyBfax66h-{`S* zdrK=91ygd{l>#4l_^Vv(3MS=}LKh!=6O?I(5ANQB#>WXS?P13CS+cew+FN?2fxPaWgT1qR$M#CdvTh977dlPLz0HIYnMp= z^=7Z1^9KK?Kr$is+8i`ma+b_xBRKZri(EbI+{^NkT87LWQU^X+SSY<0_p+<-E1cYY z>`e~i*Za_>R>SLeu<5xNiIu+=3OslQCp6%YIq8ASJ6RpZ((QM$cQANTbr(`C5}FQA z-NkzF;iG6j+ks!=U@RWNim(8o$ALcskamC>a(O9iD=9wOdVV89u(DFAK^@E+(?LI0 zmJSJq&2U&7d zx6ix*H$6U;jVmvcU&`=JI_fM-QYjyAPX0T~j*RP(-UX#Mqjs48Ih!`2UE9$yzz4@` zhxMN`Bi93ue9m6>Kf`*yV7G=kf!K5Gjud?C9sAl$#Utm~>s(B&eBQeue-^%w??2B9 zqp5VU^Jj>EKF@AZ`9I}yU%<#lJKS)AE#-Q|zg)m@2tIdz{xw=(`DI@$`w!O4L2M6x z1Yk0hWJw$+z`1YOM+t&itqwSJ zUU>gsY+-^o_;%)(^3KAkw-8(N~dH!(=7c(rfo&xL+L>q4Yvklr;^xYmTy3s<8iCW31O>!<<;F z8gu8xTJe=g*b`@+iDlY2t7e)Ye-CK<5POCN+Nl>92>c##h$E=U@XwBv~yP__fC6ok$;WT$NH6d;WeYFn!VoRwCCya&1P>= zQL)?X6`#$tW~zqE%PQ4ndVRUhR$)~0$Xlgar`MG^@Jm@FO(m7;3c;ikI&|%7-e4%L zRGWknyI}0VQe+iLeVM+)RDx|wN)6Z*e(_sYVHDInei?z^l^6uQU2k%zd6a6Ux?OLx z*~&{x)jTdnrP?N#qB=?)x>8s%(b^=lBAE2X@(P30yEK@wLub^tm)HV>86731dclUJ z@?fQ94nw&h*aL$Jr4@D?KFkFMGYPg5gP}wp7|hh}FgYBCGWF0Z$C?>xtLyv6xNKoIs$ocCPECiWzgP-~d0~H!byhllr0EyDYsL)CW~soAn*Dx` zb$PTPJqQgz^6utrartEHGpH|OQm!>s+Tw-z*16e&)-Cin%<7u10e80)k*EFr9{jdR zfX(^VDRF|1CPVFUnmnOF%D6SuYD$FUeHwDzwg* zEYU+#trrp9TV%Z|Rxo>38P@P#h@EC_nki@`eqCmv*ryqi=HGG?jsFpUp17rZ<;Nl7e)r1N$?)ay J$|U*ce*?LorHcRn diff --git a/linker.tray.win/web/css/402.bc681d99.css b/linker.tray.win/web/css/402.bc681d99.css new file mode 100644 index 00000000..481fac6c --- /dev/null +++ b/linker.tray.win/web/css/402.bc681d99.css @@ -0,0 +1 @@ +.action-wrap[data-v-3cb5be52]{font-size:1.3rem;padding:1.5rem} \ No newline at end of file diff --git a/linker.tray.win/web/css/424.a59dc963.css b/linker.tray.win/web/css/424.a59dc963.css deleted file mode 100644 index bc5498f6..00000000 --- a/linker.tray.win/web/css/424.a59dc963.css +++ /dev/null @@ -1 +0,0 @@ -.action-wrap[data-v-f78c23dc]{font-size:1.3rem;padding:1.5rem} \ No newline at end of file diff --git a/linker.tray.win/web/css/509.8ac32231.css b/linker.tray.win/web/css/509.8ac32231.css deleted file mode 100644 index c54e63bd..00000000 --- a/linker.tray.win/web/css/509.8ac32231.css +++ /dev/null @@ -1 +0,0 @@ -.table-sort th[data-v-4b2df38c]{border-bottom:0}.dropdown[data-v-6638f97d]{border:1px solid #ddd;padding:.4rem;font-size:1.3rem;border-radius:.4rem;position:relative}.dropdown .el-icon[data-v-6638f97d]{vertical-align:middle}.dropdown .badge[data-v-6638f97d]{position:absolute;right:-1rem;top:-50%;border-radius:10px;background-color:#f1ae05;color:#fff;padding:.2rem .6rem;font-size:1.2rem}a[data-v-6653ef00]{color:#666;text-decoration:underline}a.green[data-v-6653ef00]{color:green;font-weight:700}a.download[data-v-6653ef00]{margin-left:.6rem}a.download .el-icon[data-v-6653ef00]{vertical-align:middle;font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-6653ef00]{animation:loading-6653ef00 1s linear infinite}a.download+a.download[data-v-6653ef00]{margin-left:.2rem}@keyframes loading-6653ef00{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}img.system[data-v-ffd0d512]{height:1.6rem;vertical-align:middle;margin-right:.4rem}.self[data-v-ffd0d512]{color:#d400ff}.self .el-icon[data-v-ffd0d512]{vertical-align:text-bottom}.ipaddress span[data-v-5db71b03]{vertical-align:middle}.el-input[data-v-5db71b03]{width:12rem;margin-right:.6rem}.el-col[data-v-5d52ca48]{text-align:left}.el-icon.loading[data-v-7edec26e],a.loading[data-v-7edec26e]{vertical-align:middle;font-weight:700;animation:loading-7edec26e 1s linear infinite}.el-switch.is-disabled[data-v-7edec26e]{opacity:1}.el-input[data-v-7edec26e]{width:8rem}.delay[data-v-7edec26e]{position:absolute;right:0;bottom:0;line-height:normal}.switch-btn[data-v-7edec26e]{font-size:1.5rem}@keyframes loading-7edec26e{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.wrap[data-v-786fe646]{padding-right:1rem}.remark[data-v-786fe646]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wrap[data-v-4abaaeaf]{padding-right:1rem}.el-switch.is-disabled[data-v-34275839]{opacity:1}.upgrade-wrap[data-v-34275839]{border:1px solid #ddd;margin-bottom:2rem;padding:0 0 1rem 0}.el-switch.is-disabled[data-v-4a28804a]{opacity:1}.calc span[data-v-4a28804a]{display:inline-block}.calc span.label[data-v-4a28804a]{width:6rem}.el-icon.loading[data-v-c1ea089c],a.loading[data-v-c1ea089c]{vertical-align:middle;font-weight:700;animation:loading-c1ea089c 1s linear infinite}.el-switch.is-disabled[data-v-c1ea089c]{opacity:1}.el-input[data-v-c1ea089c]{width:8rem}.switch-btn[data-v-c1ea089c]{font-size:1.5rem}@keyframes loading-c1ea089c{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.el-switch.is-disabled[data-v-022e3781]{opacity:1}.upgrade-wrap[data-v-022e3781]{border:1px solid #ddd;margin-bottom:2rem;padding:1rem 0 1rem 0}.lan-item[data-v-022e3781]{margin-bottom:0}.el-switch.is-disabled[data-v-49e16cac]{opacity:1}.green[data-v-49e16cac]{font-weight:700}.el-switch.is-disabled[data-v-6ea047f9]{opacity:1}a[data-v-26b3f87e]{text-decoration:underline}a+a[data-v-26b3f87e]{margin-left:1rem}a.green[data-v-26b3f87e]{font-weight:700}.head[data-v-15b05a01]{padding-bottom:1rem}.green[data-v-15b05a01]{color:green;font-weight:700}.error[data-v-15b05a01]{font-weight:700}.error .el-icon[data-v-15b05a01]{vertical-align:text-bottom}.head[data-v-7eb8e7cc]{padding-bottom:1rem}.error[data-v-7eb8e7cc]{font-weight:700}.error .el-icon[data-v-7eb8e7cc]{vertical-align:text-bottom}.head[data-v-7891b902]{padding-bottom:1rem}.table-sort.el-table th.el-table__cell.is-leaf{border-bottom:0}.table-sort.el-table .el-table__inner-wrapper:before{height:0}.home-list-wrap[data-v-3d1c480c]{padding:1rem}.home-list-wrap .page[data-v-3d1c480c]{padding-top:1rem}.home-list-wrap .page-wrap[data-v-3d1c480c]{display:inline-block} \ No newline at end of file diff --git a/linker.tray.win/web/css/827.8be8ee26.css b/linker.tray.win/web/css/734.19603134.css similarity index 87% rename from linker.tray.win/web/css/827.8be8ee26.css rename to linker.tray.win/web/css/734.19603134.css index 5e66913e..b8c03467 100644 --- a/linker.tray.win/web/css/827.8be8ee26.css +++ b/linker.tray.win/web/css/734.19603134.css @@ -1 +1 @@ -#file-input[data-v-4892cd3c]{opacity:0;position:absolute;z-index:-1}.el-icon[data-v-4892cd3c]{font-size:1.6rem;vertical-align:middle;color:#555}#file-input[data-v-288c64ff]{opacity:0;position:absolute;z-index:-1}.head[data-v-288c64ff]{background-color:#f6f8fa;border-bottom:1px solid #d0d7de;box-shadow:1px 1px 4px rgba(0,0,0,.05);height:5rem;line-height:5rem}.head .logo[data-v-288c64ff]{padding:.5rem 0 0 1rem}.head .logo img[data-v-288c64ff]{vertical-align:top;height:4rem}.head .menu[data-v-288c64ff]{padding-left:1rem;font-size:1.4rem}.head .menu li[data-v-288c64ff]{box-sizing:border-box;padding:.5rem 0;margin-right:.5rem}.head .menu a[data-v-288c64ff]{display:block;color:#333;padding:0 1rem;line-height:4rem}.head .menu a.router-link-active[data-v-288c64ff],.head .menu a[data-v-288c64ff]:hover{background-color:rgba(0,0,0,.1);font-weight:700;border-radius:4px}.head .menu a img[data-v-288c64ff]{height:2rem;vertical-align:text-top}.head .image[data-v-288c64ff]{padding-right:1rem}body.sunny{background-image:url(../img/bg.a2158f12.jpg);background-repeat:no-repeat;background-size:cover;background-position:bottom;position:absolute;left:0;top:0;right:0;bottom:0}body.sunny .app-wrap{background-color:hsla(0,0%,100%,.5)}body.sunny .status-wrap{background-color:hsla(0,0%,96%,.3)}body.sunny .status-wrap .copy a{color:#333}body.sunny .el-table{background-color:hsla(0,0%,100%,.5)}body.sunny .head{background-color:rgba(246,248,250,.5)}body.sunny .el-table tr,body.sunny .el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell{background-color:rgba(246,248,250,.2)}.el-pagination__total,body.sunny .el-pagination__sizes,body.sunny .status-wrap .copy a{color:#000}body.sunny a{color:#576acf}.status-api-wrap[data-v-1d3d9c26]{padding-right:2rem}.status-api-wrap a[data-v-1d3d9c26]{color:#333}.status-api-wrap span[data-v-1d3d9c26]{border-radius:1rem;background-color:rgba(0,0,0,.1);padding:0 .6rem;margin-left:.2rem}.status-api-wrap.connected a[data-v-1d3d9c26]{color:green;font-weight:700}.status-api-wrap.connected span[data-v-1d3d9c26]{background-color:green;color:#fff}.status-api-wrap .el-icon[data-v-1d3d9c26]{vertical-align:text-top}a a[data-v-3b6604f4]{color:#333;margin-left:.6rem}a.connected[data-v-3b6604f4]{color:green;font-weight:700}a .el-icon[data-v-3b6604f4]{vertical-align:text-bottom}a[data-v-2183bbe0]{font-weight:700;position:absolute;right:1rem;bottom:90%;border:1px solid #ddd;background-color:#fff;z-index:9}a p[data-v-2183bbe0]{line-height:normal;white-space:nowrap}.head[data-v-3e577fa7]{padding-bottom:1rem;text-align:center}.head .el-input[data-v-3e577fa7]{width:20rem}.page[data-v-3e577fa7]{padding-top:1rem}.page-wrap[data-v-3e577fa7]{display:inline-block}.head[data-v-7dbf3a4a]{padding-bottom:1rem;text-align:center}.head .el-input[data-v-7dbf3a4a]{width:20rem}.page[data-v-7dbf3a4a]{padding-top:1rem}.page-wrap[data-v-7dbf3a4a]{display:inline-block}.flow-wrap[data-v-7eac1e72]{padding:.4rem;font-weight:700;position:absolute;right:1rem;bottom:80%;border:1px solid #ddd;background-color:#fff;z-index:9}.flow-wrap>a[data-v-7eac1e72],.flow-wrap>p[data-v-7eac1e72]{line-height:normal;white-space:nowrap;display:block}a[data-v-70063cba]{font-weight:700}a .el-icon[data-v-70063cba]{vertical-align:text-bottom}a.download .el-icon[data-v-70063cba]{font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-70063cba]{animation:loading-70063cba 1s linear infinite}@keyframes loading-70063cba{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.status-server-wrap[data-v-2d85a782]{position:relative;padding-right:.5rem}.status-server-wrap a[data-v-2d85a782]{color:#333}.status-server-wrap a+a[data-v-2d85a782]{margin-left:.6rem}.status-server-wrap .el-icon[data-v-2d85a782]{vertical-align:text-bottom}.el-col[data-v-5d52ca48]{text-align:left}.status-export-wrap[data-v-0ef57e46]{padding-right:2rem}.status-export-wrap a[data-v-0ef57e46]{color:#333}.status-export-wrap .el-icon[data-v-0ef57e46]{vertical-align:text-top}.status-export-wrap .el-col[data-v-0ef57e46]{text-align:left}a[data-v-6653ef00]{color:#666;text-decoration:underline}a.green[data-v-6653ef00]{color:green;font-weight:700}a.download[data-v-6653ef00]{margin-left:.6rem}a.download .el-icon[data-v-6653ef00]{vertical-align:middle;font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-6653ef00]{animation:loading-6653ef00 1s linear infinite}a.download+a.download[data-v-6653ef00]{margin-left:.2rem}@keyframes loading-6653ef00{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.status-wrap[data-v-002265e8]{border-top:1px solid #ddd;background-color:#f5f5f5;height:3rem;line-height:3rem;font-size:1.2rem;color:#555}.status-wrap .pay[data-v-002265e8]{font-size:xxx-large}.status-wrap .pay img[data-v-002265e8]{width:100%;margin:0}.status-wrap .copy[data-v-002265e8]{padding-left:.5rem}.status-wrap .copy a[data-v-002265e8]{color:#555}.status-wrap a.memory[data-v-002265e8]{margin-right:.6rem}.status-wrap a.memory img[data-v-002265e8]{height:3rem;vertical-align:bottom;margin-right:.1rem}.body[data-v-c8ff678c]{padding:1rem 0 0 0}.footer[data-v-c8ff678c]{padding:1rem 0}.body[data-v-5cebfa33]{padding:1rem 0 0 0}.footer[data-v-5cebfa33]{padding:1rem 0}.body[data-v-41d4c7eb],.el-card+.el-card[data-v-5cebfa33]{margin-top:1rem}.footer[data-v-41d4c7eb]{margin-top:2rem}@media screen and (max-width:1000px){body .app-wrap[data-v-5ea3415a]{width:calc(100% - 40px);height:calc(100% - 40px);position:absolute;left:20px;top:20px;right:0;bottom:0;transform:none;max-width:calc(100% - 40px)}}.app-wrap[data-v-5ea3415a]{box-sizing:border-box;background-color:#fff;border:1px solid #d0d7de;width:81rem;max-width:80%;height:90%;position:absolute;left:50%;top:50%;transform:translateX(-50%) translateY(-50%)} \ No newline at end of file +#file-input[data-v-4892cd3c]{opacity:0;position:absolute;z-index:-1}.el-icon[data-v-4892cd3c]{font-size:1.6rem;vertical-align:middle;color:#555}#file-input[data-v-288c64ff]{opacity:0;position:absolute;z-index:-1}.head[data-v-288c64ff]{background-color:#f6f8fa;border-bottom:1px solid #d0d7de;box-shadow:1px 1px 4px rgba(0,0,0,.05);height:5rem;line-height:5rem}.head .logo[data-v-288c64ff]{padding:.5rem 0 0 1rem}.head .logo img[data-v-288c64ff]{vertical-align:top;height:4rem}.head .menu[data-v-288c64ff]{padding-left:1rem;font-size:1.4rem}.head .menu li[data-v-288c64ff]{box-sizing:border-box;padding:.5rem 0;margin-right:.5rem}.head .menu a[data-v-288c64ff]{display:block;color:#333;padding:0 1rem;line-height:4rem}.head .menu a.router-link-active[data-v-288c64ff],.head .menu a[data-v-288c64ff]:hover{background-color:rgba(0,0,0,.1);font-weight:700;border-radius:4px}.head .menu a img[data-v-288c64ff]{height:2rem;vertical-align:text-top}.head .image[data-v-288c64ff]{padding-right:1rem}body.sunny{background-image:url(../img/bg.a2158f12.jpg);background-repeat:no-repeat;background-size:cover;background-position:bottom;position:absolute;left:0;top:0;right:0;bottom:0}body.sunny .app-wrap{background-color:hsla(0,0%,100%,.5)}body.sunny .status-wrap{background-color:hsla(0,0%,96%,.3)}body.sunny .status-wrap .copy a{color:#333}body.sunny .el-table{background-color:hsla(0,0%,100%,.5)}body.sunny .head{background-color:rgba(246,248,250,.5)}body.sunny .el-table tr,body.sunny .el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell{background-color:rgba(246,248,250,.2)}.el-pagination__total,body.sunny .el-pagination__sizes,body.sunny .status-wrap .copy a{color:#000}body.sunny a{color:#576acf}.status-api-wrap[data-v-1d3d9c26]{padding-right:2rem}.status-api-wrap a[data-v-1d3d9c26]{color:#333}.status-api-wrap span[data-v-1d3d9c26]{border-radius:1rem;background-color:rgba(0,0,0,.1);padding:0 .6rem;margin-left:.2rem}.status-api-wrap.connected a[data-v-1d3d9c26]{color:green;font-weight:700}.status-api-wrap.connected span[data-v-1d3d9c26]{background-color:green;color:#fff}.status-api-wrap .el-icon[data-v-1d3d9c26]{vertical-align:text-top}a a[data-v-3b6604f4]{color:#333;margin-left:.6rem}a.connected[data-v-3b6604f4]{color:green;font-weight:700}a .el-icon[data-v-3b6604f4]{vertical-align:text-bottom}a[data-v-2183bbe0]{font-weight:700;position:absolute;right:1rem;bottom:90%;border:1px solid #ddd;background-color:#fff;z-index:9}a p[data-v-2183bbe0]{line-height:normal;white-space:nowrap}.head[data-v-3e577fa7]{padding-bottom:1rem;text-align:center}.head .el-input[data-v-3e577fa7]{width:20rem}.page[data-v-3e577fa7]{padding-top:1rem}.page-wrap[data-v-3e577fa7]{display:inline-block}.head[data-v-7dbf3a4a]{padding-bottom:1rem;text-align:center}.head .el-input[data-v-7dbf3a4a]{width:20rem}.page[data-v-7dbf3a4a]{padding-top:1rem}.page-wrap[data-v-7dbf3a4a]{display:inline-block}.flow-wrap[data-v-630048e8]{padding:.4rem;font-weight:700;position:absolute;right:1rem;bottom:80%;border:1px solid #ddd;background-color:#fff;z-index:9}.flow-wrap>a[data-v-630048e8],.flow-wrap>p[data-v-630048e8]{line-height:normal;white-space:nowrap;display:block}a[data-v-70063cba]{font-weight:700}a .el-icon[data-v-70063cba]{vertical-align:text-bottom}a.download .el-icon[data-v-70063cba]{font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-70063cba]{animation:loading-70063cba 1s linear infinite}@keyframes loading-70063cba{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.status-server-wrap[data-v-2d85a782]{position:relative;padding-right:.5rem}.status-server-wrap a[data-v-2d85a782]{color:#333}.status-server-wrap a+a[data-v-2d85a782]{margin-left:.6rem}.status-server-wrap .el-icon[data-v-2d85a782]{vertical-align:text-bottom}.el-col[data-v-5d52ca48]{text-align:left}.status-export-wrap[data-v-0ef57e46]{padding-right:2rem}.status-export-wrap a[data-v-0ef57e46]{color:#333}.status-export-wrap .el-icon[data-v-0ef57e46]{vertical-align:text-top}.status-export-wrap .el-col[data-v-0ef57e46]{text-align:left}a[data-v-6653ef00]{color:#666;text-decoration:underline}a.green[data-v-6653ef00]{color:green;font-weight:700}a.download[data-v-6653ef00]{margin-left:.6rem}a.download .el-icon[data-v-6653ef00]{vertical-align:middle;font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-6653ef00]{animation:loading-6653ef00 1s linear infinite}a.download+a.download[data-v-6653ef00]{margin-left:.2rem}@keyframes loading-6653ef00{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.status-wrap[data-v-2a629595]{border-top:1px solid #ddd;background-color:#f5f5f5;height:3rem;line-height:3rem;font-size:1.2rem;color:#555}.status-wrap .pay[data-v-2a629595]{font-size:xxx-large}.status-wrap .pay img[data-v-2a629595]{width:100%;margin:0}.status-wrap .copy[data-v-2a629595]{padding-left:.5rem}.status-wrap .copy a[data-v-2a629595]{color:#555}.status-wrap a.memory[data-v-2a629595]{margin-right:.6rem}.status-wrap a.memory img[data-v-2a629595]{height:3rem;vertical-align:bottom;margin-right:.1rem}.body[data-v-19accc48]{padding:1rem 0 0 0}.footer[data-v-19accc48]{padding:1rem 0}.body[data-v-5cebfa33]{padding:1rem 0 0 0}.footer[data-v-5cebfa33]{padding:1rem 0}.body[data-v-41d4c7eb],.el-card+.el-card[data-v-5cebfa33]{margin-top:1rem}.footer[data-v-41d4c7eb]{margin-top:2rem}@media screen and (max-width:1000px){body .app-wrap[data-v-5ea3415a]{width:calc(100% - 40px);height:calc(100% - 40px);position:absolute;left:20px;top:20px;right:0;bottom:0;transform:none;max-width:calc(100% - 40px)}}.app-wrap[data-v-5ea3415a]{box-sizing:border-box;background-color:#fff;border:1px solid #d0d7de;width:81rem;max-width:80%;height:90%;position:absolute;left:50%;top:50%;transform:translateX(-50%) translateY(-50%)} \ No newline at end of file diff --git a/linker.tray.win/web/css/76.a8147928.css b/linker.tray.win/web/css/76.a8147928.css deleted file mode 100644 index 70e57eff..00000000 --- a/linker.tray.win/web/css/76.a8147928.css +++ /dev/null @@ -1 +0,0 @@ -#file-input[data-v-4892cd3c]{opacity:0;position:absolute;z-index:-1}.el-icon[data-v-4892cd3c]{font-size:1.6rem;vertical-align:middle;color:#555}body.sunny{background-image:url(../img/bg.a2158f12.jpg);background-repeat:no-repeat;background-size:cover;background-position:bottom;position:absolute;left:0;top:0;right:0;bottom:0}body.sunny .status-wrap{background-color:hsla(0,0%,100%,.5)}body.sunny .head-wrap{background-color:hsla(0,0%,100%,.7)}body.sunny .net-list-wrap ul li,body.sunny .net-wrap{background-color:hsla(0,0%,98%,.5)}.head-wrap[data-v-213d85ba]{background-color:#fafafa;padding:1rem;border-bottom:1px solid #ddd;box-shadow:1px 2px 3px rgba(0,0,0,.05);font-size:1.4rem}.head-wrap span.label[data-v-213d85ba]{line-height:2.4rem;margin-right:.6rem;color:#555}a[data-v-6653ef00]{color:#666;text-decoration:underline}a.green[data-v-6653ef00]{color:green;font-weight:700}a.download[data-v-6653ef00]{margin-left:.6rem}a.download .el-icon[data-v-6653ef00]{vertical-align:middle;font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-6653ef00]{animation:loading-6653ef00 1s linear infinite}a.download+a.download[data-v-6653ef00]{margin-left:.2rem}@keyframes loading-6653ef00{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}img.system[data-v-ffd0d512]{height:1.6rem;vertical-align:middle;margin-right:.4rem}.self[data-v-ffd0d512]{color:#d400ff}.self .el-icon[data-v-ffd0d512]{vertical-align:text-bottom}.el-icon.loading[data-v-7edec26e],a.loading[data-v-7edec26e]{vertical-align:middle;font-weight:700;animation:loading-7edec26e 1s linear infinite}.el-switch.is-disabled[data-v-7edec26e]{opacity:1}.el-input[data-v-7edec26e]{width:8rem}.delay[data-v-7edec26e]{position:absolute;right:0;bottom:0;line-height:normal}.switch-btn[data-v-7edec26e]{font-size:1.5rem}@keyframes loading-7edec26e{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.net-list-wrap ul[data-v-b6ab4f06]{padding:2rem 2rem 1rem 2rem}.net-list-wrap ul li[data-v-b6ab4f06]{margin-bottom:1rem;border:1px solid #ddd;background-color:#fff;font-size:1.3rem;border-radius:.4rem}.net-list-wrap ul li dt[data-v-b6ab4f06]{padding:.6rem;border-bottom:1px solid #ddd}.net-list-wrap ul li dd.tuntap[data-v-b6ab4f06]{padding:1rem;position:relative}.net-list-wrap .page[data-v-b6ab4f06]{padding:.6rem 0;border-top:1px solid #ddd;background-color:hsla(0,0%,98%,.5);box-shadow:-1px -2px 3px rgba(0,0,0,.05)}.net-list-wrap .page-wrap[data-v-b6ab4f06]{display:inline-block}.status-api-wrap[data-v-1d3d9c26]{padding-right:2rem}.status-api-wrap a[data-v-1d3d9c26]{color:#333}.status-api-wrap span[data-v-1d3d9c26]{border-radius:1rem;background-color:rgba(0,0,0,.1);padding:0 .6rem;margin-left:.2rem}.status-api-wrap.connected a[data-v-1d3d9c26]{color:green;font-weight:700}.status-api-wrap.connected span[data-v-1d3d9c26]{background-color:green;color:#fff}.status-api-wrap .el-icon[data-v-1d3d9c26]{vertical-align:text-top}a a[data-v-3b6604f4]{color:#333;margin-left:.6rem}a.connected[data-v-3b6604f4]{color:green;font-weight:700}a .el-icon[data-v-3b6604f4]{vertical-align:text-bottom}a[data-v-2183bbe0]{font-weight:700;position:absolute;right:1rem;bottom:90%;border:1px solid #ddd;background-color:#fff;z-index:9}a p[data-v-2183bbe0]{line-height:normal;white-space:nowrap}.head[data-v-3e577fa7]{padding-bottom:1rem;text-align:center}.head .el-input[data-v-3e577fa7]{width:20rem}.page[data-v-3e577fa7]{padding-top:1rem}.page-wrap[data-v-3e577fa7]{display:inline-block}.head[data-v-7dbf3a4a]{padding-bottom:1rem;text-align:center}.head .el-input[data-v-7dbf3a4a]{width:20rem}.page[data-v-7dbf3a4a]{padding-top:1rem}.page-wrap[data-v-7dbf3a4a]{display:inline-block}.flow-wrap[data-v-7eac1e72]{padding:.4rem;font-weight:700;position:absolute;right:1rem;bottom:80%;border:1px solid #ddd;background-color:#fff;z-index:9}.flow-wrap>a[data-v-7eac1e72],.flow-wrap>p[data-v-7eac1e72]{line-height:normal;white-space:nowrap;display:block}a[data-v-70063cba]{font-weight:700}a .el-icon[data-v-70063cba]{vertical-align:text-bottom}a.download .el-icon[data-v-70063cba]{font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-70063cba]{animation:loading-70063cba 1s linear infinite}@keyframes loading-70063cba{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.status-server-wrap[data-v-2d85a782]{position:relative;padding-right:.5rem}.status-server-wrap a[data-v-2d85a782]{color:#333}.status-server-wrap a+a[data-v-2d85a782]{margin-left:.6rem}.status-server-wrap .el-icon[data-v-2d85a782]{vertical-align:text-bottom}.el-col[data-v-5d52ca48]{text-align:left}.status-export-wrap[data-v-0ef57e46]{padding-right:2rem}.status-export-wrap a[data-v-0ef57e46]{color:#333}.status-export-wrap .el-icon[data-v-0ef57e46]{vertical-align:text-top}.status-export-wrap .el-col[data-v-0ef57e46]{text-align:left}.status-wrap[data-v-002265e8]{border-top:1px solid #ddd;background-color:#f5f5f5;height:3rem;line-height:3rem;font-size:1.2rem;color:#555}.status-wrap .pay[data-v-002265e8]{font-size:xxx-large}.status-wrap .pay img[data-v-002265e8]{width:100%;margin:0}.status-wrap .copy[data-v-002265e8]{padding-left:.5rem}.status-wrap .copy a[data-v-002265e8]{color:#555}.status-wrap a.memory[data-v-002265e8]{margin-right:.6rem}.status-wrap a.memory img[data-v-002265e8]{height:3rem;vertical-align:bottom;margin-right:.1rem}.net-wrap[data-v-6a3f3b43]{box-sizing:border-box;background-color:#fafafa;border:1px solid #d0d7de;width:calc(100% - 40px);height:calc(100% - 40px);position:absolute;left:20px;top:20px} \ No newline at end of file diff --git a/linker.tray.win/web/css/855.f4293598.css b/linker.tray.win/web/css/855.f4293598.css new file mode 100644 index 00000000..7beb4f02 --- /dev/null +++ b/linker.tray.win/web/css/855.f4293598.css @@ -0,0 +1 @@ +.table-sort th[data-v-4b2df38c]{border-bottom:0}.dropdown[data-v-6638f97d]{border:1px solid #ddd;padding:.4rem;font-size:1.3rem;border-radius:.4rem;position:relative}.dropdown .el-icon[data-v-6638f97d]{vertical-align:middle}.dropdown .badge[data-v-6638f97d]{position:absolute;right:-1rem;top:-50%;border-radius:10px;background-color:#f1ae05;color:#fff;padding:.2rem .6rem;font-size:1.2rem}a[data-v-6653ef00]{color:#666;text-decoration:underline}a.green[data-v-6653ef00]{color:green;font-weight:700}a.download[data-v-6653ef00]{margin-left:.6rem}a.download .el-icon[data-v-6653ef00]{vertical-align:middle;font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-6653ef00]{animation:loading-6653ef00 1s linear infinite}a.download+a.download[data-v-6653ef00]{margin-left:.2rem}@keyframes loading-6653ef00{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}img.system[data-v-ffd0d512]{height:1.6rem;vertical-align:middle;margin-right:.4rem}.self[data-v-ffd0d512]{color:#d400ff}.self .el-icon[data-v-ffd0d512]{vertical-align:text-bottom}.ipaddress span[data-v-5db71b03]{vertical-align:middle}.el-input[data-v-5db71b03]{width:12rem;margin-right:.6rem}.el-col[data-v-5d52ca48]{text-align:left}span.point[data-v-39aee530]{width:.8rem;height:.8rem;border-radius:50%;display:inline-block;vertical-align:middle;margin:-.2rem .3rem 0 -1.3rem;background-color:#eee;border:1px solid #ddd}span.point.p2p[data-v-39aee530]{background-color:#01c901;border:1px solid #049538}span.point.relay[data-v-39aee530]{background-color:#e3e811;border:1px solid #b3c410}span.point.node[data-v-39aee530]{background-color:#09dda9;border:1px solid #0cac90}.el-icon.loading[data-v-f8059b00],a.loading[data-v-f8059b00]{vertical-align:middle;font-weight:700;animation:loading-f8059b00 1s linear infinite}.el-switch.is-disabled[data-v-f8059b00]{opacity:1}.el-input[data-v-f8059b00]{width:8rem}.delay[data-v-f8059b00]{position:absolute;right:0;bottom:0;line-height:normal}.switch-btn[data-v-f8059b00]{font-size:1.5rem}@keyframes loading-f8059b00{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.wrap[data-v-786fe646]{padding-right:1rem}.remark[data-v-786fe646]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wrap[data-v-4abaaeaf]{padding-right:1rem}.el-switch.is-disabled[data-v-34275839]{opacity:1}.upgrade-wrap[data-v-34275839]{border:1px solid #ddd;margin-bottom:2rem;padding:0 0 1rem 0}.el-switch.is-disabled[data-v-4a28804a]{opacity:1}.calc span[data-v-4a28804a]{display:inline-block}.calc span.label[data-v-4a28804a]{width:6rem}.el-icon.loading[data-v-d37c5992],a.loading[data-v-d37c5992]{vertical-align:middle;font-weight:700;animation:loading-d37c5992 1s linear infinite}.el-switch.is-disabled[data-v-d37c5992]{opacity:1}.el-input[data-v-d37c5992]{width:8rem}.switch-btn[data-v-d37c5992]{font-size:1.5rem}@keyframes loading-d37c5992{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.el-switch.is-disabled[data-v-022e3781]{opacity:1}.upgrade-wrap[data-v-022e3781]{border:1px solid #ddd;margin-bottom:2rem;padding:1rem 0 1rem 0}.lan-item[data-v-022e3781]{margin-bottom:0}.el-switch.is-disabled[data-v-49e16cac]{opacity:1}.green[data-v-49e16cac]{font-weight:700}.el-switch.is-disabled[data-v-6ea047f9]{opacity:1}a[data-v-6e9936ec]{text-decoration:underline}a+a[data-v-6e9936ec]{margin-left:1rem}a.green[data-v-6e9936ec]{font-weight:700}.head[data-v-15b05a01]{padding-bottom:1rem}.green[data-v-15b05a01]{color:green;font-weight:700}.error[data-v-15b05a01]{font-weight:700}.error .el-icon[data-v-15b05a01]{vertical-align:text-bottom}.head[data-v-7eb8e7cc]{padding-bottom:1rem}.error[data-v-7eb8e7cc]{font-weight:700}.error .el-icon[data-v-7eb8e7cc]{vertical-align:text-bottom}.head[data-v-7891b902]{padding-bottom:1rem}.table-sort.el-table th.el-table__cell.is-leaf{border-bottom:0}.table-sort.el-table .el-table__inner-wrapper:before{height:0}.home-list-wrap[data-v-3d1c480c]{padding:1rem}.home-list-wrap .page[data-v-3d1c480c]{padding-top:1rem}.home-list-wrap .page-wrap[data-v-3d1c480c]{display:inline-block} \ No newline at end of file diff --git a/linker.tray.win/web/css/256.4e351ac8.css b/linker.tray.win/web/css/857.4e351ac8.css similarity index 100% rename from linker.tray.win/web/css/256.4e351ac8.css rename to linker.tray.win/web/css/857.4e351ac8.css diff --git a/linker.tray.win/web/css/966.149bc7b3.css b/linker.tray.win/web/css/966.149bc7b3.css new file mode 100644 index 00000000..a9655cac --- /dev/null +++ b/linker.tray.win/web/css/966.149bc7b3.css @@ -0,0 +1 @@ +#file-input[data-v-4892cd3c]{opacity:0;position:absolute;z-index:-1}.el-icon[data-v-4892cd3c]{font-size:1.6rem;vertical-align:middle;color:#555}body.sunny{background-image:url(../img/bg.a2158f12.jpg);background-repeat:no-repeat;background-size:cover;background-position:bottom;position:absolute;left:0;top:0;right:0;bottom:0}body.sunny .status-wrap{background-color:hsla(0,0%,100%,.5)}body.sunny .head-wrap{background-color:hsla(0,0%,100%,.7)}body.sunny .net-list-wrap ul li,body.sunny .net-wrap{background-color:hsla(0,0%,98%,.5)}.head-wrap[data-v-3bb95ac8]{background-color:#fafafa;padding:1rem;border-bottom:1px solid #ddd;box-shadow:1px 2px 3px rgba(0,0,0,.05);font-size:1.4rem}.head-wrap span.label[data-v-3bb95ac8]{line-height:2.4rem;margin-right:.6rem;color:#555}a[data-v-6653ef00]{color:#666;text-decoration:underline}a.green[data-v-6653ef00]{color:green;font-weight:700}a.download[data-v-6653ef00]{margin-left:.6rem}a.download .el-icon[data-v-6653ef00]{vertical-align:middle;font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-6653ef00]{animation:loading-6653ef00 1s linear infinite}a.download+a.download[data-v-6653ef00]{margin-left:.2rem}@keyframes loading-6653ef00{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}img.system[data-v-ffd0d512]{height:1.6rem;vertical-align:middle;margin-right:.4rem}.self[data-v-ffd0d512]{color:#d400ff}.self .el-icon[data-v-ffd0d512]{vertical-align:text-bottom}span.point[data-v-39aee530]{width:.8rem;height:.8rem;border-radius:50%;display:inline-block;vertical-align:middle;margin:-.2rem .3rem 0 -1.3rem;background-color:#eee;border:1px solid #ddd}span.point.p2p[data-v-39aee530]{background-color:#01c901;border:1px solid #049538}span.point.relay[data-v-39aee530]{background-color:#e3e811;border:1px solid #b3c410}span.point.node[data-v-39aee530]{background-color:#09dda9;border:1px solid #0cac90}.el-icon.loading[data-v-f8059b00],a.loading[data-v-f8059b00]{vertical-align:middle;font-weight:700;animation:loading-f8059b00 1s linear infinite}.el-switch.is-disabled[data-v-f8059b00]{opacity:1}.el-input[data-v-f8059b00]{width:8rem}.delay[data-v-f8059b00]{position:absolute;right:0;bottom:0;line-height:normal}.switch-btn[data-v-f8059b00]{font-size:1.5rem}@keyframes loading-f8059b00{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.net-list-wrap ul[data-v-b6ab4f06]{padding:2rem 2rem 1rem 2rem}.net-list-wrap ul li[data-v-b6ab4f06]{margin-bottom:1rem;border:1px solid #ddd;background-color:#fff;font-size:1.3rem;border-radius:.4rem}.net-list-wrap ul li dt[data-v-b6ab4f06]{padding:.6rem;border-bottom:1px solid #ddd}.net-list-wrap ul li dd.tuntap[data-v-b6ab4f06]{padding:1rem;position:relative}.net-list-wrap .page[data-v-b6ab4f06]{padding:.6rem 0;border-top:1px solid #ddd;background-color:hsla(0,0%,98%,.5);box-shadow:-1px -2px 3px rgba(0,0,0,.05)}.net-list-wrap .page-wrap[data-v-b6ab4f06]{display:inline-block}.status-api-wrap[data-v-1d3d9c26]{padding-right:2rem}.status-api-wrap a[data-v-1d3d9c26]{color:#333}.status-api-wrap span[data-v-1d3d9c26]{border-radius:1rem;background-color:rgba(0,0,0,.1);padding:0 .6rem;margin-left:.2rem}.status-api-wrap.connected a[data-v-1d3d9c26]{color:green;font-weight:700}.status-api-wrap.connected span[data-v-1d3d9c26]{background-color:green;color:#fff}.status-api-wrap .el-icon[data-v-1d3d9c26]{vertical-align:text-top}a a[data-v-3b6604f4]{color:#333;margin-left:.6rem}a.connected[data-v-3b6604f4]{color:green;font-weight:700}a .el-icon[data-v-3b6604f4]{vertical-align:text-bottom}a[data-v-2183bbe0]{font-weight:700;position:absolute;right:1rem;bottom:90%;border:1px solid #ddd;background-color:#fff;z-index:9}a p[data-v-2183bbe0]{line-height:normal;white-space:nowrap}.head[data-v-3e577fa7]{padding-bottom:1rem;text-align:center}.head .el-input[data-v-3e577fa7]{width:20rem}.page[data-v-3e577fa7]{padding-top:1rem}.page-wrap[data-v-3e577fa7]{display:inline-block}.head[data-v-7dbf3a4a]{padding-bottom:1rem;text-align:center}.head .el-input[data-v-7dbf3a4a]{width:20rem}.page[data-v-7dbf3a4a]{padding-top:1rem}.page-wrap[data-v-7dbf3a4a]{display:inline-block}.flow-wrap[data-v-630048e8]{padding:.4rem;font-weight:700;position:absolute;right:1rem;bottom:80%;border:1px solid #ddd;background-color:#fff;z-index:9}.flow-wrap>a[data-v-630048e8],.flow-wrap>p[data-v-630048e8]{line-height:normal;white-space:nowrap;display:block}a[data-v-70063cba]{font-weight:700}a .el-icon[data-v-70063cba]{vertical-align:text-bottom}a.download .el-icon[data-v-70063cba]{font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-70063cba]{animation:loading-70063cba 1s linear infinite}@keyframes loading-70063cba{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.status-server-wrap[data-v-2d85a782]{position:relative;padding-right:.5rem}.status-server-wrap a[data-v-2d85a782]{color:#333}.status-server-wrap a+a[data-v-2d85a782]{margin-left:.6rem}.status-server-wrap .el-icon[data-v-2d85a782]{vertical-align:text-bottom}.el-col[data-v-5d52ca48]{text-align:left}.status-export-wrap[data-v-0ef57e46]{padding-right:2rem}.status-export-wrap a[data-v-0ef57e46]{color:#333}.status-export-wrap .el-icon[data-v-0ef57e46]{vertical-align:text-top}.status-export-wrap .el-col[data-v-0ef57e46]{text-align:left}.status-wrap[data-v-2a629595]{border-top:1px solid #ddd;background-color:#f5f5f5;height:3rem;line-height:3rem;font-size:1.2rem;color:#555}.status-wrap .pay[data-v-2a629595]{font-size:xxx-large}.status-wrap .pay img[data-v-2a629595]{width:100%;margin:0}.status-wrap .copy[data-v-2a629595]{padding-left:.5rem}.status-wrap .copy a[data-v-2a629595]{color:#555}.status-wrap a.memory[data-v-2a629595]{margin-right:.6rem}.status-wrap a.memory img[data-v-2a629595]{height:3rem;vertical-align:bottom;margin-right:.1rem}.net-wrap[data-v-6a3f3b43]{box-sizing:border-box;background-color:#fafafa;border:1px solid #d0d7de;width:calc(100% - 40px);height:calc(100% - 40px);position:absolute;left:20px;top:20px} \ No newline at end of file diff --git a/linker.tray.win/web/css/app.1dca501b.css b/linker.tray.win/web/css/app.1dca501b.css new file mode 100644 index 00000000..6ba93708 --- /dev/null +++ b/linker.tray.win/web/css/app.1dca501b.css @@ -0,0 +1 @@ +.status-api-wrap[data-v-08751c59]{padding-right:2rem}.status-api-wrap a[data-v-08751c59]{color:#333}.status-api-wrap span[data-v-08751c59]{border-radius:1rem;background-color:rgba(0,0,0,.1);padding:0 .6rem;margin-left:.2rem}.status-api-wrap.connected a[data-v-08751c59]{color:green;font-weight:700}.status-api-wrap.connected span[data-v-08751c59]{background-color:green;color:#fff}.status-api-wrap .el-icon[data-v-08751c59]{vertical-align:text-top}*{margin:0;padding:0;list-style:none}a{text-decoration:none;color:#666;background-image:linear-gradient(92deg,red,#ff9000,#ffdc00,#23bf08,#00ffb2,#0072ff,#fd00ff);background-size:0 2px;background-position:0 100%;background-repeat:no-repeat;transition:.3s}a:hover{background-size:100% 2px;background-position:100% 100%}:root{--foot-menu-dropdown-color:#f5f5f5}a.a-line{text-decoration:underline}.flex{display:flex;display:-ms-flex;display:-o-flex;flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.flex-column{flex-direction:column}.flex-row{flex-direction:row}.flex-1{flex:1 1 0%}.absolute{position:absolute;left:0;top:0;right:0;bottom:0}.relative{position:relative}.h-100{height:100%}.w-100{width:100%}.t-c{text-align:center}.t-r{text-align:right}.t-l{text-align:left!important}.pdl-6{padding-left:.6rem}.pdb-6{padding-bottom:.6rem}.pdl-10{padding-left:1rem}.pdt-10{padding-top:1rem}.pdr-10{padding-right:1rem}.m-r-1{margin-right:1rem}.m-l-1{margin-left:1rem}.m-b-0{margin-bottom:0!important}table{border-spacing:0;border-collapse:collapse}html{font-size:10px;background-color:#f4f4f4}body{overflow:hidden}span.split{width:.6rem}span.split-pad{padding:0 .3rem}span.split-pad10{padding:0 1rem}.middle{vertical-align:middle}.red{color:red!important}.green{color:green!important}.yellow{color:#e68906!important}.gateway{&.green{transition:.3s;&:hover{background:linear-gradient(270deg,#caff00,green,#0d6d23,#e38a00,green);background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:hsla(0,0%,100%,0)}}}.scrollbar,.scrollbar-1,.scrollbar-10,.scrollbar-4{overflow:auto}.scrollbar-1::-webkit-scrollbar{width:0;height:1px}.scrollbar-1::-webkit-scrollbar-thumb{background:rgba(0,0,0,.1);border-radius:10px}.scrollbar::-webkit-scrollbar{width:1px;height:1px}.scrollbar::-webkit-scrollbar-thumb{background:rgba(0,0,0,.1);border-radius:10px}.scrollbar-4::-webkit-scrollbar{width:4px;height:4px}.scrollbar-4::-webkit-scrollbar-thumb{background:rgba(0,0,0,.1);border-radius:10px}.scrollbar-10::-webkit-scrollbar{width:10px;height:1px}.scrollbar-10::-webkit-scrollbar-thumb{background:rgba(0,0,0,.1);border-radius:10px}:root{--el-color-primary:var(--el-color-success)!important;--el-color-primary-light-3:var(--el-color-success-light-3)!important;--el-color-primary-light-5:var(--el-color-success-light-5)!important;--el-color-primary-light-7:var(--el-color-success-light-7)!important;--el-color-primary-light-8:var(--el-color-success-light-8)!important;--el-color-primary-light-9:var(--el-color-success-light-9)!important;--el-color-primary-dark-2:var(--el-color-success-dark-2)!important}.el-table{--el-table-header-text-color:var(--el-text-color-regular)!important}.el-input-number--small{width:100%!important}.el-table .cell{overflow:visible!important}.el-table--scrollable-y .el-table__body-wrapper::-webkit-scrollbar{background:#f5f5f5}.el-table--scrollable-y .el-table__body-wrapper::-webkit-scrollbar-thumb{background:#ddd}.el-collapse-item__header{background-color:#fafafa!important;border-left:1px solid #ebeef5;border-right:1px solid #ebeef5;padding:0 2rem}.el-collapse-item__content{padding:1rem;border:1px solid #ebeef5;border-bottom:0}.el-input.w-search,.el-input.w-search .el-input__inner,.el-select.w-search{width:10rem}.el-form-item.w-search .el-form-item__label{font-size:1.2rem}.table-search .el-form--inline .el-form-item{margin-bottom:0}.el-dropdown,.el-dropdown-menu__item{font-size:1.3rem}.el-dropdown-menu__item a{color:#333}.el-input__inner:focus{border-color:var(--main-color)}.el-date-editor.el-input.w-auto,.el-date-editor.el-input__inner.w-auto{width:auto}.el-table .active-row{background:rgba(0,0,0,.15)}.el-table .table-green-row{background:rgba(0,255,0,.15)}.el-table .table-red-row{background:rgba(255,0,0,.15)}.el-table .table-green-row td,.el-table .table-red-row td{background:transparent!important}.el-date-editor.el-input,.el-date-editor.el-input__inner{width:auto}.el-table .active-row td{background:transparent!important}.el-table--border th{background-color:#fafafa}.el-table thead.is-group th.el-table__cell{background:var(--el-table-header-bg-color)!important}.el-pagination.is-background .el-pager li:not(.disabled).active{background-color:var(--main-color)}.el-pagination.is-background .el-pager li:not(.disabled):hover{color:var(--main-color)}.el-pagination .btn-next .el-icon,.el-pagination .btn-prev .el-icon{width:inherit}.el-dialog{max-width:96%}.el-dialog__body .el-form-item:last-child{margin-bottom:0}.el-input-group__append,.el-input-group__prepend{padding:0 4px!important;background-color:transparent!important}.el-checkbox__label .el-icon{vertical-align:middle;margin-top:-2px}.el-color-picker{vertical-align:middle}.el-color-picker__trigger{border:0!important}.el-color-picker__color{border:0!important;border-radius:2px}.el-color-picker__color-inner{border-radius:2px}.el-message{min-width:10rem!important}.card-header{font-size:1.4rem}.forward-wrap .el-table--small.el-table .el-table__expanded-cell[class*=cell]{padding:20px 50px 20px 50px}h3.title{font-size:1.6rem;padding-bottom:.6rem;color:#555}.el-message-box{max-width:90%!important;width:-moz-fit-content!important;width:fit-content!important}.el-select-dropdown__item{padding-right:2rem!important}.el-form-item--default{--font-size:13px!important}.el-input__inner{font-size:13px}.el-dialog--center .el-dialog__body{padding-top:1rem!important;padding-bottom:1rem!important} \ No newline at end of file diff --git a/linker.tray.win/web/css/app.e2cbd3ed.css b/linker.tray.win/web/css/app.e2cbd3ed.css deleted file mode 100644 index f2036f09..00000000 --- a/linker.tray.win/web/css/app.e2cbd3ed.css +++ /dev/null @@ -1 +0,0 @@ -.status-api-wrap[data-v-08751c59]{padding-right:2rem}.status-api-wrap a[data-v-08751c59]{color:#333}.status-api-wrap span[data-v-08751c59]{border-radius:1rem;background-color:rgba(0,0,0,.1);padding:0 .6rem;margin-left:.2rem}.status-api-wrap.connected a[data-v-08751c59]{color:green;font-weight:700}.status-api-wrap.connected span[data-v-08751c59]{background-color:green;color:#fff}.status-api-wrap .el-icon[data-v-08751c59]{vertical-align:text-top}*{margin:0;padding:0;list-style:none}a{text-decoration:none;color:#666;background-image:linear-gradient(92deg,red,#ff9000,#ffdc00,#23bf08,#00ffb2,#0072ff,#fd00ff);background-size:0 2px;background-position:0 100%;background-repeat:no-repeat;transition:.3s}a:hover{background-size:100% 2px;background-position:100% 100%}:root{--foot-menu-dropdown-color:#f5f5f5}a.a-line{text-decoration:underline}span.point{width:.8rem;height:.8rem;border-radius:50%;display:inline-block;vertical-align:middle;margin:-.2rem .3rem 0 -1.3rem;background-color:#eee;border:1px solid #ddd}span.point.p2p{background-color:#01c901;border:1px solid #049538}span.point.relay{background-color:#e3e811;border:1px solid #b3c410}span.point.node{background-color:#09dda9;border:1px solid #0cac90}.flex{display:flex;display:-ms-flex;display:-o-flex;flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.flex-column{flex-direction:column}.flex-row{flex-direction:row}.flex-1{flex:1 1 0%}.absolute{position:absolute;left:0;top:0;right:0;bottom:0}.relative{position:relative}.h-100{height:100%}.w-100{width:100%}.t-c{text-align:center}.t-r{text-align:right}.t-l{text-align:left!important}.pdl-6{padding-left:.6rem}.pdb-6{padding-bottom:.6rem}.pdl-10{padding-left:1rem}.pdt-10{padding-top:1rem}.pdr-10{padding-right:1rem}.m-r-1{margin-right:1rem}.m-l-1{margin-left:1rem}.m-b-0{margin-bottom:0!important}table{border-spacing:0;border-collapse:collapse}html{font-size:10px;background-color:#f4f4f4}body{overflow:hidden}span.split{width:.6rem}span.split-pad{padding:0 .3rem}span.split-pad10{padding:0 1rem}.middle{vertical-align:middle}.red{color:red!important}.green{color:green!important}.yellow{color:#e68906!important}.gateway{&.green{transition:.3s;&:hover{background:linear-gradient(270deg,#caff00,green,#0d6d23,#e38a00,green);background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:hsla(0,0%,100%,0)}}}.scrollbar,.scrollbar-1,.scrollbar-10,.scrollbar-4{overflow:auto}.scrollbar-1::-webkit-scrollbar{width:0;height:1px}.scrollbar-1::-webkit-scrollbar-thumb{background:rgba(0,0,0,.1);border-radius:10px}.scrollbar::-webkit-scrollbar{width:1px;height:1px}.scrollbar::-webkit-scrollbar-thumb{background:rgba(0,0,0,.1);border-radius:10px}.scrollbar-4::-webkit-scrollbar{width:4px;height:4px}.scrollbar-4::-webkit-scrollbar-thumb{background:rgba(0,0,0,.1);border-radius:10px}.scrollbar-10::-webkit-scrollbar{width:10px;height:1px}.scrollbar-10::-webkit-scrollbar-thumb{background:rgba(0,0,0,.1);border-radius:10px}:root{--el-color-primary:var(--el-color-success)!important;--el-color-primary-light-3:var(--el-color-success-light-3)!important;--el-color-primary-light-5:var(--el-color-success-light-5)!important;--el-color-primary-light-7:var(--el-color-success-light-7)!important;--el-color-primary-light-8:var(--el-color-success-light-8)!important;--el-color-primary-light-9:var(--el-color-success-light-9)!important;--el-color-primary-dark-2:var(--el-color-success-dark-2)!important}.el-table{--el-table-header-text-color:var(--el-text-color-regular)!important}.el-input-number--small{width:100%!important}.el-table .cell{overflow:visible!important}.el-table--scrollable-y .el-table__body-wrapper::-webkit-scrollbar{background:#f5f5f5}.el-table--scrollable-y .el-table__body-wrapper::-webkit-scrollbar-thumb{background:#ddd}.el-collapse-item__header{background-color:#fafafa!important;border-left:1px solid #ebeef5;border-right:1px solid #ebeef5;padding:0 2rem}.el-collapse-item__content{padding:1rem;border:1px solid #ebeef5;border-bottom:0}.el-input.w-search,.el-input.w-search .el-input__inner,.el-select.w-search{width:10rem}.el-form-item.w-search .el-form-item__label{font-size:1.2rem}.table-search .el-form--inline .el-form-item{margin-bottom:0}.el-dropdown,.el-dropdown-menu__item{font-size:1.3rem}.el-dropdown-menu__item a{color:#333}.el-input__inner:focus{border-color:var(--main-color)}.el-date-editor.el-input.w-auto,.el-date-editor.el-input__inner.w-auto{width:auto}.el-table .active-row{background:rgba(0,0,0,.15)}.el-table .table-green-row{background:rgba(0,255,0,.15)}.el-table .table-red-row{background:rgba(255,0,0,.15)}.el-table .table-green-row td,.el-table .table-red-row td{background:transparent!important}.el-date-editor.el-input,.el-date-editor.el-input__inner{width:auto}.el-table .active-row td{background:transparent!important}.el-table--border th{background-color:#fafafa}.el-table thead.is-group th.el-table__cell{background:var(--el-table-header-bg-color)!important}.el-pagination.is-background .el-pager li:not(.disabled).active{background-color:var(--main-color)}.el-pagination.is-background .el-pager li:not(.disabled):hover{color:var(--main-color)}.el-pagination .btn-next .el-icon,.el-pagination .btn-prev .el-icon{width:inherit}.el-dialog{max-width:96%}.el-dialog__body .el-form-item:last-child{margin-bottom:0}.el-input-group__append,.el-input-group__prepend{padding:0 4px!important;background-color:transparent!important}.el-checkbox__label .el-icon{vertical-align:middle;margin-top:-2px}.el-color-picker{vertical-align:middle}.el-color-picker__trigger{border:0!important}.el-color-picker__color{border:0!important;border-radius:2px}.el-color-picker__color-inner{border-radius:2px}.el-message{min-width:10rem!important}.card-header{font-size:1.4rem}.forward-wrap .el-table--small.el-table .el-table__expanded-cell[class*=cell]{padding:20px 50px 20px 50px}h3.title{font-size:1.6rem;padding-bottom:.6rem;color:#555}.el-message-box{max-width:90%!important;width:-moz-fit-content!important;width:fit-content!important}.el-select-dropdown__item{padding-right:2rem!important}.el-form-item--default{--font-size:13px!important}.el-input__inner{font-size:13px}.el-dialog--center .el-dialog__body{padding-top:1rem!important;padding-bottom:1rem!important} \ No newline at end of file diff --git a/linker.tray.win/web/index.html b/linker.tray.win/web/index.html index 6c0f96ab..489b497a 100644 --- a/linker.tray.win/web/index.html +++ b/linker.tray.win/web/index.html @@ -1 +1 @@ -linker.web
\ No newline at end of file +linker.web
\ No newline at end of file diff --git a/linker.tray.win/web/js/110.0106ebd8.js b/linker.tray.win/web/js/110.0106ebd8.js deleted file mode 100644 index 92e6f2f9..00000000 --- a/linker.tray.win/web/js/110.0106ebd8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[110],{7716:function(e,t,n){n.d(t,{H1:function(){return s},Oy:function(){return u},V1:function(){return c},dS:function(){return d},nH:function(){return r},o2:function(){return a},we:function(){return o},xD:function(){return l}});var i=n(4);const s=(e="0")=>(0,i.zG)("forwardclient/connections",e),a=e=>(0,i.zG)("forwardclient/removeconnection",e),c=(e="0")=>(0,i.zG)("forwardclient/getcount",e),u=(e="0")=>(0,i.zG)("forwardclient/get",e),l=()=>(0,i.zG)("forwardclient/bindips"),o=e=>(0,i.zG)("forwardclient/remove",e),r=e=>(0,i.zG)("forwardclient/add",e),d=()=>(0,i.zG)("forwardclient/refresh")},2173:function(e,t,n){n.d(t,{$y:function(){return c},L1:function(){return a},QP:function(){return r},R2:function(){return l},_Q:function(){return o},im:function(){return s},qH:function(){return u}});var i=n(4);const s=(e="0")=>(0,i.zG)("socks5client/connections",e),a=e=>(0,i.zG)("socks5client/removeconnection",e),c=(e="0")=>(0,i.zG)("socks5client/get",e),u=e=>(0,i.zG)("socks5client/run",e),l=e=>(0,i.zG)("socks5client/stop",e),o=e=>(0,i.zG)("socks5client/update",e),r=()=>(0,i.zG)("socks5client/refresh")},5241:function(e,t,n){n.d(t,{AE:function(){return v},Jd:function(){return d},Nj:function(){return f},PR:function(){return l},Yh:function(){return r},_:function(){return h},ac:function(){return o},en:function(){return u},kl:function(){return s},vB:function(){return a},w0:function(){return m},zi:function(){return c}});var i=n(4);const s=(e="0")=>(0,i.zG)("tuntapclient/connections",e),a=e=>(0,i.zG)("tuntapclient/removeconnection",e),c=(e="0")=>(0,i.zG)("tuntapclient/get",e),u=e=>(0,i.zG)("tuntapclient/run",e),l=e=>(0,i.zG)("tuntapclient/stop",e),o=e=>(0,i.zG)("tuntapclient/update",e),r=()=>(0,i.zG)("tuntapclient/refresh"),d=()=>(0,i.zG)("tuntapclient/SubscribePing"),h=e=>(0,i.zG)("tuntapclient/SubscribeForwardTest",e),m=e=>(0,i.zG)("tuntapclient/CalcNetwork",e),f=()=>(0,i.zG)("tuntapclient/GetNetwork"),v=e=>(0,i.zG)("tuntapclient/AddNetwork",e)},9983:function(e,t,n){n.d(t,{FG:function(){return v},L2:function(){return h},ZY:function(){return m},bB:function(){return p},mx:function(){return f}});var i=n(7716),s=n(5241),a=n(2173),c=n(144),u=n(6768);const l=Symbol(),o=Symbol(),r=Symbol(),d=Symbol(),h=()=>{const e=(0,c.KR)({showEdit:!1,speedCache:{},current:"",currentName:"",hashcode:0,hashcode1:0,_updateRealTime:!1,updateRealTime:t=>{e.value.hashcode=0,e.value.hashcode1=0,e.value._updateRealTime=t}});(0,u.Gt)(l,e);const t=(0,c.KR)({timer:0,list:{}});(0,u.Gt)(o,t);const n=()=>{(0,i.H1)(e.value.hashcode.toString()).then((s=>{0==e.value._updateRealTime&&(e.value.hashcode=s.HashCode),s.List&&(p(s.List,i.o2),t.value.list=s.List),t.value.timer=setTimeout(n,1e3)})).catch((e=>{t.value.timer=setTimeout(n,1e3)}))},h=(0,c.KR)({timer:0,list:{}});(0,u.Gt)(r,h);const m=()=>{(0,s.kl)(e.value.hashcode1.toString()).then((t=>{0==e.value._updateRealTime&&(e.value.hashcode1=t.HashCode),t.List&&(p(t.List,s.vB),h.value.list=t.List),h.value.timer=setTimeout(m,1e3)})).catch((e=>{h.value.timer=setTimeout(m,1e3)}))},f=(0,c.KR)({timer:0,list:{}});(0,u.Gt)(d,f);const v=()=>{(0,a.im)(e.value.hashcode1.toString()).then((t=>{0==e.value._updateRealTime&&(e.value.hashcode1=t.HashCode),t.List&&(p(t.List,a.L1),f.value.list=t.List),f.value.timer=setTimeout(v,1e3)})).catch((e=>{f.value.timer=setTimeout(v,1e3)}))},p=(t,n)=>{const i=e.value.speedCache;for(let e in t){const s=t[e];s.removeFunc=n;const a=`${s.RemoteMachineId}-${s.TransactionId}`,c=i[a]||{SendBytes:0,ReceiveBytes:0};s.SendBytesText=g(s.SendBytes-c.SendBytes),s.ReceiveBytesText=g(s.ReceiveBytes-c.ReceiveBytes),c.SendBytes=s.SendBytes,c.ReceiveBytes=s.ReceiveBytes,i[a]=c}},g=e=>{let t=0;while(e>=1024)e/=1024,t++;return`${e.toFixed(2)}${["B/s","KB/s","MB/s","GB/s","TB/s"][t]}`},I=t=>{e.value.current=t.MachineId,e.value.currentName=t.MachineName,e.value.showEdit=!0},y=()=>{clearTimeout(t.value.timer),clearTimeout(h.value.timer),clearTimeout(f.value.timer)};return{connections:e,forwardConnections:t,_getForwardConnections:n,tuntapConnections:h,_getTuntapConnections:m,socks5Connections:f,_getSocks5Connections:v,handleTunnelConnections:I,clearConnectionsTimeout:y}},m=()=>(0,u.WQ)(l),f=()=>(0,u.WQ)(o),v=()=>(0,u.WQ)(r),p=()=>(0,u.WQ)(d)},7985:function(e,t,n){n.d(t,{r:function(){return l}});n(4114);var i=n(9299),s=n(3830),a=n(6768),c=n(144);const u=[],l=()=>{const e=(0,s.B)(),t=(0,a.EW)((()=>e.value.config.Client.Id)),n=(0,c.Kh)({timer:0,page:{Request:{Page:1,Size:+(localStorage.getItem("ps")||"10"),Name:"",Ids:[],Prop:"",Asc:!0},Count:0,List:[]},showDeviceEdit:!1,showAccessEdit:!1,deviceInfo:null}),l=()=>{(0,i.nD)(n.page.Request).then((i=>{n.page.Request=i.Request,n.page.Count=i.Count;for(let n in i.List)Object.assign(i.List[n],{showDel:t.value!=i.List[n].MachineId&&0==i.List[n].Connected,showAccess:t.value!=i.List[n].MachineId&&i.List[n].Connected,showReboot:i.List[n].Connected,isSelf:t.value==i.List[n].MachineId,showip:!1}),i.List[n].isSelf&&(e.value.self=i.List[n]);n.page.List=i.List;for(let e=0;e{}))},o=()=>{(0,i.nD)(n.page.Request).then((i=>{for(let s in i.List){const a=n.page.List.filter((e=>e.MachineId==i.List[s].MachineId))[0];a&&(Object.assign(a,{Connected:i.List[s].Connected,Version:i.List[s].Version,LastSignIn:i.List[s].LastSignIn,Args:i.List[s].Args,showDel:t.value!=i.List[s].MachineId&&0==i.List[s].Connected,showAccess:t.value!=i.List[s].MachineId&&i.List[s].Connected,showReboot:i.List[s].Connected,isSelf:t.value==i.List[s].MachineId}),a.isSelf&&(e.value.self=a))}n.timer=setTimeout(o,5e3)})).catch((e=>{n.timer=setTimeout(o,5e3)}))},r=()=>{try{if(0==u.length)return void setTimeout(r,1e3);const e=u.shift();fetch(`http://ip-api.com/json/${e.IP.split(":")[0]}`).then((async t=>{try{const n=await t.json();e.countryFlag=`https://unpkg.com/flag-icons@7.2.3/flags/4x3/${n.countryCode.toLowerCase()}.svg`}catch(n){}setTimeout(r,1e3)})).catch((()=>{setTimeout(r,1e3)}))}catch(e){setTimeout(r,1e3)}};r();const d=e=>{n.deviceInfo=e,n.showDeviceEdit=!0},h=e=>{n.deviceInfo=e,n.showAccessEdit=!0},m=e=>{e&&(n.page.Request.Page=e),l()},f=e=>{e&&(n.page.Request.Size=e,localStorage.setItem("ps",e)),l()},v=e=>{(0,i.Se)(e).then((()=>{l()}))},p=()=>{clearTimeout(n.timer),n.timer=0},g=e=>(0,i.VN)(e);return{devices:n,machineId:t,_getSignList:l,_getSignList1:o,handleDeviceEdit:d,handleAccessEdit:h,handlePageChange:m,handlePageSizeChange:f,handleDel:v,clearDevicesTimeout:p,setSort:g}}},8104:function(e,t,n){n.d(t,{O:function(){return u},W:function(){return l}});var i=n(144),s=n(6768),a=n(5241);const c=Symbol(),u=()=>{const e=(0,i.KR)({show:!0,timer:0,showEdit:!1,current:null,list:{},hashcode:0,showLease:!1});(0,s.Gt)(c,e);const t={linux:["debian","ubuntu","alpine","rocky","centos"],ubuntu:["ubuntu"],windows:["windows"],android:["android"],ios:["ios"]},n=()=>{clearTimeout(e.value.timer),(0,a.zi)(e.value.hashcode.toString()).then((i=>{if(e.value.hashcode=i.HashCode,i.List){for(let e in i.List){let n="system";const s=i.List[e].SystemInfo.toLowerCase();for(let e in t)if(s.indexOf(e)>=0){const i=t[e];if(1==i.length)n=i[0];else for(let e=0;e=0){n=i[e];break}break}Object.assign(i.List[e],{running:2==i.List[e].Status,loading:1==i.List[e].Status,system:n,systemDocker:s.indexOf("docker")>=0})}e.value.list=i.List}e.value.timer=setTimeout(n,1100),(0,a.Jd)()})).catch((t=>{e.value.timer=setTimeout(n,1100)}))},u=t=>{e.value.current=t,e.value.showEdit=!0},l=()=>{(0,a.Yh)()},o=()=>{clearTimeout(e.value.timer),e.value.timer=0},r=t=>Object.values(e.value.list).filter((e=>e.IP.indexOf(t)>=0||e.Lans.filter((e=>e.IP.indexOf(t)>=0)).length>0)).map((e=>e.MachineId)),d=t=>{const n=Object.values(e.value.list).filter((e=>e.IP)).sort(((e,t)=>{const n=e.IP.split(".").map((e=>Number(e))),i=t.IP.split(".").map((e=>Number(e)));for(let s=0;se.MachineId))};return{tuntap:e,_getTuntapInfo:n,handleTuntapEdit:u,handleTuntapRefresh:l,clearTuntapTimeout:o,getTuntapMachines:r,sortTuntapIP:d}},l=()=>(0,s.WQ)(c)},3347:function(e,t,n){n.d(t,{A:function(){return g}});var i=n(6768),s=n(4232);const a=["title"],c=["src"],u=["src"],l={key:1,class:"system",src:"/docker.svg"},o={key:1,class:"self gateway"};function r(e,t,n,r,d,h){const m=(0,i.g2)("StarFilled"),f=(0,i.g2)("el-icon");return(0,i.uX)(),(0,i.CE)("div",null,[r.tuntap.list[r.item.MachineId]&&r.tuntap.list[r.item.MachineId].system?((0,i.uX)(),(0,i.CE)("span",{key:0,title:r.tuntap.list[r.item.MachineId].SystemInfo},[r.item.countryFlag?((0,i.uX)(),(0,i.CE)("img",{key:0,class:"system",src:r.item.countryFlag},null,8,c)):(0,i.Q3)("",!0),(0,i.Lk)("img",{class:"system",src:`/${r.tuntap.list[r.item.MachineId].system}.svg`},null,8,u),r.tuntap.list[r.item.MachineId].systemDocker?((0,i.uX)(),(0,i.CE)("img",l)):(0,i.Q3)("",!0)],8,a)):(0,i.Q3)("",!0),(0,i.Lk)("a",{href:"javascript:;",onClick:t[0]||(t[0]=(...e)=>r.handleEdit&&r.handleEdit(...e)),title:"此客户端的设备名",class:"a-line"},[(0,i.Lk)("strong",{class:(0,s.C4)(["gateway",{green:r.item.Connected}])},(0,s.v_)(r.item.MachineName||"null"),3)]),r.item.isSelf?((0,i.uX)(),(0,i.CE)("strong",o,[(0,i.eW)("("),(0,i.bF)(f,{size:"16"},{default:(0,i.k6)((()=>[(0,i.bF)(m)])),_:1}),(0,i.eW)(") ")])):(0,i.Q3)("",!0)])}var d=n(3830),h=n(8104),m=n(7477),f={props:["item","config"],emits:["edit","refresh"],components:{StarFilled:m.BQ2},setup(e,{emit:t}){const n=(0,h.W)(),s=(0,d.B)(),a=(0,i.EW)((()=>s.value.hasAccess("RenameSelf"))),c=(0,i.EW)((()=>s.value.hasAccess("RenameOther"))),u=(0,i.EW)((()=>s.value.config.Client.Id)),l=()=>{if(e.config){if(u.value===e.item.MachineId){if(!a.value)return}else if(!c.value)return;t("edit",e.item)}};return{item:(0,i.EW)((()=>e.item)),tuntap:n,handleEdit:l}}},v=n(1241);const p=(0,v.A)(f,[["render",r],["__scopeId","data-v-ffd0d512"]]);var g=p},9636:function(e,t,n){n.d(t,{A:function(){return R}});var i=n(6768),s=n(4232);const a={class:"flex"},c={class:"flex-1"},u={key:0,class:"point p2p",title:"打洞直连"},l={key:1,class:"point relay",title:"中继连接"},o={key:2,class:"point node",title:"节点连接"},r={key:1,class:"point",title:"未连接"},d=["title"],h=["title"],m={key:0,class:"green gateway"},f={key:1},v={key:0},p={key:0,class:"flex yellow",title:"已禁用"},g={key:1,class:"flex yellow",title:"与其它设备填写IP、或本机局域网IP有冲突"},I={key:0,class:"delay green"},y={class:"delay yellow"};function L(e,t,n,L,C,k){const w=(0,i.g2)("Loading"),E=(0,i.g2)("el-icon"),T=(0,i.g2)("el-switch");return(0,i.uX)(),(0,i.CE)("div",null,[(0,i.Lk)("div",a,[(0,i.Lk)("div",c,[L.connections.list[L.item.MachineId]&&L.connections.list[L.item.MachineId].Connected?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[0==L.connections.list[L.item.MachineId].Type?((0,i.uX)(),(0,i.CE)("span",u)):1==L.connections.list[L.item.MachineId].Type?((0,i.uX)(),(0,i.CE)("span",l)):2==L.connections.list[L.item.MachineId].Type?((0,i.uX)(),(0,i.CE)("span",o)):(0,i.Q3)("",!0)],64)):((0,i.uX)(),(0,i.CE)("span",r)),(0,i.Lk)("a",{href:"javascript:;",class:"a-line",onClick:t[0]||(t[0]=e=>L.handleTuntapIP(L.tuntap.list[L.item.MachineId])),title:"此设备的虚拟网卡IP"},[L.tuntap.list[L.item.MachineId].SetupError?((0,i.uX)(),(0,i.CE)("strong",{key:0,class:"red",title:L.tuntap.list[L.item.MachineId].SetupError},(0,s.v_)(L.tuntap.list[L.item.MachineId].IP),9,d)):L.tuntap.list[L.item.MachineId].Upgrade&&L.tuntap.list[L.item.MachineId].NatError?((0,i.uX)(),(0,i.CE)("strong",{key:1,class:"yellow",title:L.tuntap.list[L.item.MachineId].NatError},(0,s.v_)(L.tuntap.list[L.item.MachineId].IP),9,h)):((0,i.uX)(),(0,i.CE)(i.FK,{key:2},[L.tuntap.list[L.item.MachineId].running?((0,i.uX)(),(0,i.CE)("strong",m,(0,s.v_)(L.tuntap.list[L.item.MachineId].IP),1)):((0,i.uX)(),(0,i.CE)("strong",f,(0,s.v_)(L.tuntap.list[L.item.MachineId].IP),1))],64))])]),L.tuntap.list[L.item.MachineId].loading?((0,i.uX)(),(0,i.CE)("div",v,[(0,i.bF)(E,{size:"14",class:"loading"},{default:(0,i.k6)((()=>[(0,i.bF)(w)])),_:1})])):((0,i.uX)(),(0,i.Wv)(T,{key:1,modelValue:L.tuntap.list[L.item.MachineId].running,"onUpdate:modelValue":t[1]||(t[1]=e=>L.tuntap.list[L.item.MachineId].running=e),loading:L.tuntap.list[L.item.MachineId].loading,disabled:"",onClick:t[2]||(t[2]=e=>L.handleTuntap(L.tuntap.list[L.item.MachineId])),size:"small","inline-prompt":"","active-text":"😀","inactive-text":"😣"},null,8,["modelValue","loading"]))]),(0,i.Lk)("div",null,[(0,i.Lk)("div",null,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(L.tuntap.list[L.item.MachineId].Lans,((e,t)=>((0,i.uX)(),(0,i.CE)(i.FK,{key:t},[e.Disabled?((0,i.uX)(),(0,i.CE)("div",p,(0,s.v_)(e.IP)+" / "+(0,s.v_)(e.PrefixLength),1)):e.Exists?((0,i.uX)(),(0,i.CE)("div",g,(0,s.v_)(e.IP)+" / "+(0,s.v_)(e.PrefixLength),1)):((0,i.uX)(),(0,i.CE)("div",{key:2,class:(0,s.C4)(["flex",{green:L.tuntap.list[L.item.MachineId].running}]),title:"正常使用"},(0,s.v_)(e.IP)+" / "+(0,s.v_)(e.PrefixLength),3))],64)))),128))]),L.showDelay?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[L.tuntap.list[L.item.MachineId].Delay>=0&&L.tuntap.list[L.item.MachineId].Delay<=100?((0,i.uX)(),(0,i.CE)("div",I,(0,s.v_)(L.tuntap.list[L.item.MachineId].Delay)+"ms",1)):(0,i.Q3)("",!0),(0,i.Lk)("template",null,[(0,i.Lk)("div",y,(0,s.v_)(L.tuntap.list[L.item.MachineId].Delay)+"ms",1)])],64)):(0,i.Q3)("",!0)])])}var C=n(5241),k=n(1219),w=n(8104),E=n(7477),T=n(3830),M=n(9983),S={props:["item","config"],emits:["edit","refresh"],components:{Loading:E.Rhj},setup(e,{emit:t}){const n=(0,w.W)(),s=(0,T.B)(),a=(0,i.EW)((()=>s.value.config.Client.Id)),c=(0,i.EW)((()=>s.value.hasAccess("TuntapChangeSelf"))),u=(0,i.EW)((()=>s.value.hasAccess("TuntapChangeOther"))),l=(0,i.EW)((()=>s.value.hasAccess("TuntapStatusSelf"))),o=(0,i.EW)((()=>s.value.hasAccess("TuntapStatusOther"))),r=(0,M.FG)(),d=(0,i.EW)((()=>2==(2&(s.value.config.Running.Tuntap||{Switch:0}).Switch))),h=t=>{if(!e.config)return;if(a.value===t.MachineId){if(!l.value)return}else if(!o.value)return;const n=t.running?(0,C.PR)(t.MachineId):(0,C.en)(t.MachineId);t.loading=!0,n.then((()=>{k.nk.success("操作成功!")})).catch((e=>{console.log(e),k.nk.error("操作失败!")}))},m=n=>{if(e.config||a.value==n.MachineId){if(a.value===n.MachineId){if(!c.value)return}else if(!u.value)return;n.device=e.item,t("edit",n)}},f=()=>{t("refresh")};return{item:(0,i.EW)((()=>e.item)),tuntap:n,showDelay:d,connections:r,handleTuntap:h,handleTuntapIP:m,handleTuntapRefresh:f}}},b=n(1241);const G=(0,b.A)(S,[["render",L],["__scopeId","data-v-7edec26e"]]);var R=G}}]); \ No newline at end of file diff --git a/linker.tray.win/web/js/183.9a80af0b.js b/linker.tray.win/web/js/183.9a80af0b.js deleted file mode 100644 index 9ff9f613..00000000 --- a/linker.tray.win/web/js/183.9a80af0b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[183],{5096:function(e,t,a){a.d(t,{A:function(){return p}});var l=a(6768);const o=e=>((0,l.Qi)("data-v-4892cd3c"),e=e(),(0,l.jt)(),e),n=o((()=>(0,l.Lk)("input",{type:"file",id:"file-input"},null,-1)));function s(e,t,a,o,s,r){const i=(0,l.g2)("PictureRounded"),d=(0,l.g2)("el-icon");return(0,l.uX)(),(0,l.CE)(l.FK,null,[(0,l.Lk)("a",{href:"javascript:;",onClick:t[0]||(t[0]=(...e)=>o.handleBg&&o.handleBg(...e))},[(0,l.bF)(d,null,{default:(0,l.k6)((()=>[(0,l.bF)(i)])),_:1})]),n],64)}var r=a(7477),i=a(2933),d={components:{PictureRounded:r.syp},props:["name"],setup(e){const t=`bg-${e.name}`,a=()=>{localStorage.getItem(t)?i.s.confirm("清除背景?","Warning",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((()=>{n()})).catch((()=>{})):document.getElementById("file-input").click()},o=e=>{const t=e.target.files[0];if(t)try{const e=new FileReader;e.onload=function(e){n(e.target.result)},e.readAsDataURL(t)}catch(a){}e.target.value=""},n=e=>{e?(document.body.className="sunny",localStorage.setItem(t,e),document.body.style=`background-image:url(${e})`):(document.body.className="",document.body.style="",localStorage.setItem(t,""))};return(0,l.sV)((()=>{document.getElementById("file-input").addEventListener("change",o),n(localStorage.getItem(t))})),{handleBg:a}}},c=a(1241);const u=(0,c.A)(d,[["render",s],["__scopeId","data-v-4892cd3c"]]);var p=u},9278:function(e,t,a){a.d(t,{A:function(){return Ye}});var l=a(6768),o=a(4232),n=a.p+"img/coin.6431311b.svg",s=a.p+"img/wechat.5c371c5d.jpg",r=a.p+"img/alipay.ff9b1e7c.jpg";const i=e=>((0,l.Qi)("data-v-002265e8"),e=e(),(0,l.jt)(),e),d={class:"status-wrap flex"},c={class:"copy"},u=i((()=>(0,l.Lk)("img",{src:n,alt:"memory"},null,-1))),p=i((()=>(0,l.Lk)("span",null,"各位老板行行好",-1))),g=[u,p],v={href:"https://github.com/snltty/linker",target:"_blank"},f=i((()=>(0,l.Lk)("div",{class:"flex-1"},null,-1))),m={class:"export"},h={class:"api"},y={class:"server"},k=i((()=>(0,l.Lk)("div",{class:"pay"},[(0,l.Lk)("img",{src:s,alt:""}),(0,l.Lk)("img",{src:r,alt:""})],-1)));function w(e,t,a,n,s,r){const i=(0,l.g2)("Export"),u=(0,l.g2)("Api"),p=(0,l.g2)("Server"),w=(0,l.g2)("el-dialog");return(0,l.uX)(),(0,l.CE)("div",d,[(0,l.Lk)("div",c,[(0,l.Lk)("a",{href:"javascript:;",class:"memory",title:"赞助一笔,让作者饱餐一顿",onClick:t[0]||(t[0]=e=>n.state.showPay=!0)},g),(0,l.Lk)("a",v,"©linker "+(0,o.v_)(n.self.Version),1)]),f,(0,l.Lk)("div",m,[(0,l.bF)(i,{config:n.config},null,8,["config"])]),(0,l.Lk)("div",h,[(0,l.bF)(u,{config:n.config},null,8,["config"])]),(0,l.Lk)("div",y,[(0,l.bF)(p,{config:n.config},null,8,["config"])]),(0,l.bF)(w,{modelValue:n.state.showPay,"onUpdate:modelValue":t[1]||(t[1]=e=>n.state.showPay=e),title:"赞助linker",width:"300",top:"1vh"},{default:(0,l.k6)((()=>[k])),_:1},8,["modelValue"])])}var b=a(144);const S={href:"javascript:;",title:"此设备的管理接口"};function B(e,t,a,n,s,r){const i=(0,l.g2)("Tools"),d=(0,l.g2)("el-icon"),c=(0,l.g2)("el-popconfirm");return n.config?((0,l.uX)(),(0,l.CE)("div",{key:0,class:(0,o.C4)(["status-api-wrap",{connected:n.connected}])},[(0,l.bF)(c,{"confirm-button-text":"清除","cancel-button-text":"更改",title:"确定你的操作?",onCancel:n.handleShow,onConfirm:n.handleResetConnect},{reference:(0,l.k6)((()=>[(0,l.Lk)("a",S,[(0,l.bF)(d,{size:"16"},{default:(0,l.k6)((()=>[(0,l.bF)(i)])),_:1}),(0,l.eW)(" 管理接口 ")])])),_:1},8,["onCancel","onConfirm"])],2)):(0,l.Q3)("",!0)}var F=a(3830),C=a(4),_=a(7477),V={components:{Tools:_.S0q},props:["config"],setup(e){const t=(0,F.B)(),a=(0,l.EW)((()=>t.value.api.connected)),o=()=>{localStorage.setItem("api-cache",""),window.location.reload()},n=()=>{(0,C.e3)(),(0,C.a1)(`ws${"https:"===window.location.protocol?"s":""}://${window.location.hostname}:12345`,"snltty")};return{config:e.config,connected:a,handleShow:n,handleResetConnect:o}}},x=a(1241);const T=(0,x.A)(V,[["render",B],["__scopeId","data-v-1d3d9c26"]]);var L=T;const R={class:"status-server-wrap"};function I(e,t,a,o,n,s){const r=(0,l.g2)("ServerConfig"),i=(0,l.g2)("ServerVersion"),d=(0,l.g2)("ServerFlow");return(0,l.uX)(),(0,l.CE)("div",R,[(0,l.bF)(r,{config:o.config},null,8,["config"]),(0,l.bF)(i,{config:o.config},null,8,["config"]),o.config&&o.hasFlow?((0,l.uX)(),(0,l.Wv)(d,{key:0,config:o.config},null,8,["config"])):(0,l.Q3)("",!0)])}const P=e=>((0,l.Qi)("data-v-3b6604f4"),e=e(),(0,l.jt)(),e),E=P((()=>(0,l.Lk)("span",null,"信标服务器",-1))),W={class:"dialog-footer t-c"};function D(e,t,a,n,s,r){const i=(0,l.g2)("Promotion"),d=(0,l.g2)("el-icon"),c=(0,l.g2)("el-input"),u=(0,l.g2)("el-form-item"),p=(0,l.g2)("el-option"),g=(0,l.g2)("el-select"),v=(0,l.g2)("el-form"),f=(0,l.g2)("el-button"),m=(0,l.g2)("el-dialog");return(0,l.uX)(),(0,l.CE)(l.FK,null,[(0,l.Lk)("a",{href:"javascript:;",class:(0,o.C4)({connected:n.state.connected}),title:"更改你的连接设置",onClick:t[0]||(t[0]=(...e)=>n.handleConfig&&n.handleConfig(...e))},[(0,l.bF)(d,{size:"16"},{default:(0,l.k6)((()=>[(0,l.bF)(i)])),_:1}),(0,l.eW)(),E],2),(0,l.bF)(m,{modelValue:n.state.show,"onUpdate:modelValue":t[4]||(t[4]=e=>n.state.show=e),title:"连接设置",width:"300","append-to-body":""},{footer:(0,l.k6)((()=>[(0,l.Lk)("div",W,[(0,l.bF)(f,{onClick:t[3]||(t[3]=e=>n.state.show=!1),loading:n.state.loading},{default:(0,l.k6)((()=>[(0,l.eW)("取消")])),_:1},8,["loading"]),(0,l.bF)(f,{type:"primary",onClick:n.handleSave,loading:n.state.loading},{default:(0,l.k6)((()=>[(0,l.eW)("确定保存")])),_:1},8,["onClick","loading"])])])),default:(0,l.k6)((()=>[(0,l.Lk)("div",null,[(0,l.bF)(v,{model:n.state.form,rules:n.state.rules,"label-width":"6rem"},{default:(0,l.k6)((()=>[(0,l.bF)(u,{label:"机器名",prop:"name"},{default:(0,l.k6)((()=>[(0,l.bF)(c,{modelValue:n.state.form.name,"onUpdate:modelValue":t[1]||(t[1]=e=>n.state.form.name=e),maxlength:"12","show-word-limit":""},null,8,["modelValue"])])),_:1}),(0,l.bF)(u,{label:"分组名",prop:"groupid"},{default:(0,l.k6)((()=>[(0,l.bF)(g,{modelValue:n.state.groupid,"onUpdate:modelValue":t[2]||(t[2]=e=>n.state.groupid=e),onChange:n.handleGroupChange},{default:(0,l.k6)((()=>[((0,l.uX)(!0),(0,l.CE)(l.FK,null,(0,l.pI)(n.state.form.groups,(e=>((0,l.uX)(),(0,l.Wv)(p,{key:e.Id,label:e.Name,value:e.Id},null,8,["label","value"])))),128))])),_:1},8,["modelValue","onChange"])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue"])],64)}var z=a(9299),K=a(1219),$={components:{Promotion:_.Yk4,CirclePlus:_.HxT},props:["config"],setup(e){const t=(0,F.B)(),a=(0,l.EW)((()=>t.value.hasAccess("Config"))),o=(0,b.Kh)({show:!1,loading:!1,connected:(0,l.EW)((()=>t.value.signin.Connected)),groupid:t.value.config.Client.Group.Id,form:{name:t.value.config.Client.Name,groups:t.value.config.Client.Groups},rules:{}}),n=()=>{e.config&&a.value&&(o.form.name=t.value.config.Client.Name,o.form.groups=t.value.config.Client.Groups,o.groupid=t.value.config.Client.Group.Id,o.show=!0)},s=e=>{const t=o.form.groups.map(((e,t)=>(e.$index=t,e))).filter((t=>t.Id==e))[0].$index,a=o.form.groups[t];o.form.groups[t]=o.form.groups[0],o.form.groups[0]=a},r=()=>{o.loading=!0,(0,z.rd)(o.form).then((()=>{o.loading=!1,o.show=!1,K.nk.success("已操作"),setTimeout((()=>{window.location.reload()}),1e3)})).catch((e=>{console.log(e),o.loading=!1,K.nk.error("操作失败!")}))};return{config:e.config,state:o,handleConfig:n,handleSave:r,handleGroupChange:s}}};const A=(0,x.A)($,[["render",D],["__scopeId","data-v-3b6604f4"]]);var X=A;const O={key:0,class:"flow-wrap"},U={href:"javascript:;",title:"本服务器\r\n在线数/7天内上线数"},j={href:"javascript:;",title:"所有服务器\r\n在线数/7天内上线数/服务端数"};function G(e,t,a,n,s,r){const i=(0,l.g2)("el-table-column"),d=(0,l.g2)("el-button"),c=(0,l.g2)("el-table"),u=(0,l.g2)("el-dialog"),p=(0,l.g2)("ServerFlowMessenger"),g=(0,l.g2)("ServerFlowSForward"),v=(0,l.g2)("ServerFlowRelay");return(0,l.uX)(),(0,l.CE)(l.FK,null,[n.config?((0,l.uX)(),(0,l.CE)("div",O,[(0,l.Lk)("p",null,[(0,l.eW)("在线 "),(0,l.Lk)("a",U,(0,o.v_)(n.state.overallOnline),1),(0,l.Lk)("a",j,(0,o.v_)(n.state.serverOnline),1)]),(0,l.Lk)("p",null,[(0,l.eW)("上传 "),(0,l.Lk)("a",{href:"javascript:;",title:"本服务器\r\n发送速率",onClick:t[0]||(t[0]=(...e)=>n.handleShow&&n.handleShow(...e))},(0,o.v_)(n.state.overallSendtSpeed)+"/s",1)]),(0,l.Lk)("p",null,[(0,l.eW)("下载 "),(0,l.Lk)("a",{href:"javascript:;",title:"本服务器\r\n接收速率",onClick:t[1]||(t[1]=(...e)=>n.handleShow&&n.handleShow(...e))},(0,o.v_)(n.state.overallReceiveSpeed)+"/s",1)])])):(0,l.Q3)("",!0),(0,l.bF)(u,{title:n.state.time,"destroy-on-close":"",modelValue:n.state.show,"onUpdate:modelValue":t[2]||(t[2]=e=>n.state.show=e),width:"540"},{default:(0,l.k6)((()=>[(0,l.Lk)("div",null,[(0,l.bF)(c,{data:n.state.list,border:"",size:"small",width:"100%"},{default:(0,l.k6)((()=>[(0,l.bF)(i,{prop:"text",label:"类别",width:"80"}),(0,l.bF)(i,{prop:"sendtBytes",label:"已上传",sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.sendtBytesText),1)])),_:1}),(0,l.bF)(i,{prop:"sendtSpeed",label:"上传速度",sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.sendtSpeedText)+"/s",1)])),_:1}),(0,l.bF)(i,{prop:"receiveBytes",label:"已下载",sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.receiveBytesText),1)])),_:1}),(0,l.bF)(i,{prop:"receiveSpeed",label:"下载速度",sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.receiveSpeedText)+"/s",1)])),_:1}),(0,l.bF)(i,{prop:"oper",label:"操作",width:"64"},{default:(0,l.k6)((e=>[e.row.detail?((0,l.uX)(),(0,l.Wv)(d,{key:0,size:"small",onClick:t=>n.handleShowDetail(e.row.id)},{default:(0,l.k6)((()=>[(0,l.eW)("详情")])),_:2},1032,["onClick"])):(0,l.Q3)("",!0)])),_:1})])),_:1},8,["data"])])])),_:1},8,["title","modelValue"]),n.state.details.Messenger?((0,l.uX)(),(0,l.Wv)(p,{key:1,config:n.config,modelValue:n.state.details.Messenger,"onUpdate:modelValue":t[3]||(t[3]=e=>n.state.details.Messenger=e)},null,8,["config","modelValue"])):(0,l.Q3)("",!0),n.state.details.SForward?((0,l.uX)(),(0,l.Wv)(g,{key:2,config:n.config,modelValue:n.state.details.SForward,"onUpdate:modelValue":t[4]||(t[4]=e=>n.state.details.SForward=e)},null,8,["config","modelValue"])):(0,l.Q3)("",!0),n.state.details.Relay?((0,l.uX)(),(0,l.Wv)(v,{key:3,config:n.config,modelValue:n.state.details.Relay,"onUpdate:modelValue":t[5]||(t[5]=e=>n.state.details.Relay=e)},null,8,["config","modelValue"])):(0,l.Q3)("",!0)],64)}a(4114);const M=()=>(0,C.zG)("flowClient/GetFlows"),Q=()=>(0,C.zG)("flowClient/GetMessengerFlows"),N=e=>(0,C.zG)("flowClient/GetSForwardFlows",e),Y=e=>(0,C.zG)("flowClient/GetRelayFlows",e);function q(e,t,a,n,s,r){const i=(0,l.g2)("el-table-column"),d=(0,l.g2)("el-table"),c=(0,l.g2)("el-dialog");return(0,l.uX)(),(0,l.Wv)(c,{title:"信标流量",class:"options-center",top:"1vh","destroy-on-close":"",modelValue:n.state.show,"onUpdate:modelValue":t[0]||(t[0]=e=>n.state.show=e),width:"680"},{default:(0,l.k6)((()=>[(0,l.Lk)("div",null,[(0,l.bF)(d,{data:n.state.list,stripe:"",border:"",size:"small",width:"100%",height:"60vh"},{default:(0,l.k6)((()=>[(0,l.bF)(i,{prop:"id",label:"信标id",width:"200"}),(0,l.bF)(i,{prop:"sendtBytes",label:"已上传",sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.sendtBytesText),1)])),_:1}),(0,l.bF)(i,{prop:"sendtSpeed",label:"上传速度",sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.sendtSpeedText)+"/s",1)])),_:1}),(0,l.bF)(i,{prop:"receiveBytes",label:"已下载",sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.receiveBytesText),1)])),_:1}),(0,l.bF)(i,{prop:"receiveSpeed",label:"下载速度",sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.receiveSpeedText)+"/s",1)])),_:1})])),_:1},8,["data"])])])),_:1},8,["modelValue"])}var H={props:["modelValue","config"],emits:["update:modelValue"],setup(e,{emit:t}){const a=(0,b.Kh)({show:!0,timer:0,list:[],old:null});(0,l.wB)((()=>a.show),(e=>{e||setTimeout((()=>{t("update:modelValue",e)}),300)}));const o={0:"登入信标",1:"客户端列表",2:"客户端删除",4:"客户端改名(转发)",7:"获取服务器版本",8:"客户端搜索ids",9:"客户端id列表",10:"客户端排序",11:"客户端在线",12:"生成客户端id",13:"登入信标V_1_3_1",2001:"外网端口(转发)",2002:"外网端口(转发)",2003:"开始打洞(转发)",2004:"开始打洞(转发)",2005:"打洞失败(转发)",2006:"打洞失败(转发)",2007:"打洞成功(转发)",2008:"打洞成功(转发)",2009:"隧道配置(转发)",2010:"隧道配置(转发)",2012:"隧道同步(转发)",2101:"中继通知(转发)",2102:"中继通知(转发)",2103:"中继请求",2105:"中继连通测试",2201:"运行网卡(转发)",2203:"停止网卡(转发)",2204:"更新网卡",2205:"更新网卡(转发)",2208:"配置网卡网络",2209:"获取网卡网络",2210:"分配IP",2211:"网卡变化",2212:"网卡变化(转发)",2213:"IP续约",2214:"网卡端口转发检测",2215:"网卡端口转发检测(转发)",2301:"添加内网穿透",2302:"移除内网穿透",2303:"通知内网穿透(转发)",2304:"通知内网穿透UDP(转发)",2305:"获取穿透列表(转发)",2401:"测试端口转发(转发)",2403:"获取端口转发(转发)",2507:"同步配置",2508:"同步配置(转发)",2601:"更新信息(转发)",2602:"更新信息(转发)",2603:"确认更新(转发)",2604:"确认更新(转发)",2605:"重启(转发)",2606:"重启",2607:"服务器更新信息",2608:"确认服务器更新",2609:"服务器重启",2610:"订阅更新信息(转发)",2611:"订阅更新信息(转发)",2612:"检查更新",2613:"检查更新(转发)",2701:"服务器流量",2702:"服务器信标流量",2703:"服务器中继流量",2704:"服务器内网穿透流量",2807:"同步配置",2808:"同步配置(转发)",2900:"运行socks5",2901:"运行socks5(转发)",2902:"停止socks5",2903:"停止socks5(转发)",2904:"更新socks5",2905:"更新socks5(转发)",3003:"获取权限",3004:"获取权限(转发)",3005:"更新权限",3006:"更新权限(转发)"},n=()=>{Q().then((e=>{const t=a.old||e,l=[];for(let a in e){const n=e[a],r=t[a],i=`[${a}]${o[`${a}`]||"未知"}`;l.push({id:i,sendtBytes:n.SendtBytes,sendtBytesText:s(n.SendtBytes),sendtSpeed:n.SendtBytes-r.SendtBytes,sendtSpeedText:s(n.SendtBytes-r.SendtBytes),receiveBytes:n.ReceiveBytes,receiveBytesText:s(n.ReceiveBytes),receiveSpeed:n.ReceiveBytes-r.ReceiveBytes,receiveSpeedText:s(n.ReceiveBytes-r.ReceiveBytes)})}a.list=l.filter((e=>!!e.id)),a.old=e,a.timer=setTimeout(n,1e3)})).catch((e=>{a.timer=setTimeout(n,1e3)}))},s=e=>{let t=0;while(e>=1024)e/=1024,t++;return`${e.toFixed(2)}${["B","KB","MB","GB","TB"][t]}`};return(0,l.sV)((()=>{n()})),(0,l.hi)((()=>{clearTimeout(a.timer)})),{config:e.config,state:a}}};const J=(0,x.A)(H,[["render",q],["__scopeId","data-v-2183bbe0"]]);var Z=J;const ee={class:"head"},te={class:"page t-c"},ae={class:"page-wrap"};function le(e,t,a,n,s,r){const i=(0,l.g2)("el-input"),d=(0,l.g2)("el-table-column"),c=(0,l.g2)("el-table"),u=(0,l.g2)("el-pagination"),p=(0,l.g2)("el-dialog");return(0,l.uX)(),(0,l.Wv)(p,{title:"内网穿透流量",class:"options-center",top:"1vh","destroy-on-close":"",modelValue:n.state.show,"onUpdate:modelValue":t[1]||(t[1]=e=>n.state.show=e),width:"680"},{default:(0,l.k6)((()=>[(0,l.Lk)("div",null,[(0,l.Lk)("div",ee,[(0,l.bF)(i,{modelValue:n.state.page.Key,"onUpdate:modelValue":t[0]||(t[0]=e=>n.state.page.Key=e),placeholder:"域名/端口搜索"},null,8,["modelValue"])]),(0,l.bF)(c,{data:n.state.list,stripe:"",border:"",size:"small",width:"100%",height:"60vh",onSortChange:n.handleSort},{default:(0,l.k6)((()=>[(0,l.bF)(d,{prop:"Key",label:"域名/端口",width:"200"}),(0,l.bF)(d,{prop:"SendtBytes",label:"已上传",sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.SendtBytesText),1)])),_:1}),(0,l.bF)(d,{prop:"DiffSendtBytes",label:"上传速度",sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.DiffSendtBytesText)+"/s",1)])),_:1}),(0,l.bF)(d,{prop:"ReceiveBytes",label:"已下载",sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.ReceiveBytesText),1)])),_:1}),(0,l.bF)(d,{prop:"DiffReceiveBytes",label:"下载速度",sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.DiffReceiveBytesText)+"/s",1)])),_:1})])),_:1},8,["data","onSortChange"]),(0,l.Lk)("div",te,[(0,l.Lk)("div",ae,[(0,l.bF)(u,{small:"",background:"",layout:"total,prev,pager, next",total:n.state.page.Count,"page-size":n.state.page.PageSize,"current-page":n.state.page.Page,onCurrentChange:n.handlePageChange},null,8,["total","page-size","current-page","onCurrentChange"])])])])])),_:1},8,["modelValue"])}var oe={props:["modelValue","config"],emits:["update:modelValue"],setup(e,{emit:t}){const a=(0,b.Kh)({show:!0,timer:0,list:[],page:{Key:"",Page:1,PageSize:15,Count:0,Order:1,OrderType:0}});(0,l.wB)((()=>a.show),(e=>{e||setTimeout((()=>{t("update:modelValue",e)}),300)}));const o=()=>{N({Key:a.page.Key,Page:a.page.Page,PageSize:a.page.PageSize,Order:a.page.Order,OrderType:a.page.OrderType}).then((e=>{try{a.page.Page=e.Page,a.page.PageSize=e.PageSize,a.page.Count=e.Count;const t=[];for(let a=0;a{a.timer=setTimeout(o,1e3)}))},n=e=>{let t=0;while(e>=1024)e/=1024,t++;return`${e.toFixed(2)}${["B","KB","MB","GB","TB"][t]}`},s=e=>{e&&(a.page.Page=e)},r=e=>{const t={ascending:1,descending:0}[e.order],l={SendtBytes:1,DiffSendtBytes:2,ReceiveBytes:3,DiffReceiveBytes:4}[e.prop];a.page.Order=l,a.page.OrderType=t};return(0,l.sV)((()=>{o()})),(0,l.hi)((()=>{clearTimeout(a.timer)})),{config:e.config,state:a,handlePageChange:s,handleSort:r}}};const ne=(0,x.A)(oe,[["render",le],["__scopeId","data-v-3e577fa7"]]);var se=ne;const re={class:"head"},ie={class:"page t-c"},de={class:"page-wrap"};function ce(e,t,a,n,s,r){const i=(0,l.g2)("el-input"),d=(0,l.g2)("el-table-column"),c=(0,l.g2)("el-table"),u=(0,l.g2)("el-pagination"),p=(0,l.g2)("el-dialog");return(0,l.uX)(),(0,l.Wv)(p,{title:"中继流量",class:"options-center",top:"1vh","destroy-on-close":"",modelValue:n.state.show,"onUpdate:modelValue":t[1]||(t[1]=e=>n.state.show=e),width:"680"},{default:(0,l.k6)((()=>[(0,l.Lk)("div",null,[(0,l.Lk)("div",re,[(0,l.bF)(i,{modelValue:n.state.page.Key,"onUpdate:modelValue":t[0]||(t[0]=e=>n.state.page.Key=e),placeholder:"名字搜索"},null,8,["modelValue"])]),(0,l.bF)(c,{data:n.state.list,stripe:"",border:"",size:"small",width:"100%",height:"60vh",onSortChange:n.handleSort},{default:(0,l.k6)((()=>[(0,l.bF)(d,{prop:"FromName",label:"发起端",width:"120"}),(0,l.bF)(d,{prop:"ToName",label:"目标端",width:"120"}),(0,l.bF)(d,{prop:"SendtBytes",label:"已上传",sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.SendtBytesText),1)])),_:1}),(0,l.bF)(d,{prop:"DiffSendtBytes",label:"上传速度",sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.DiffSendtBytesText)+"/s",1)])),_:1}),(0,l.bF)(d,{prop:"ReceiveBytes",label:"已下载",sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.ReceiveBytesText),1)])),_:1}),(0,l.bF)(d,{prop:"DiffReceiveBytes",label:"下载速度",sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.DiffReceiveBytesText)+"/s",1)])),_:1})])),_:1},8,["data","onSortChange"]),(0,l.Lk)("div",ie,[(0,l.Lk)("div",de,[(0,l.bF)(u,{small:"",background:"",layout:"total,prev,pager, next",total:n.state.page.Count,"page-size":n.state.page.PageSize,"current-page":n.state.page.Page,onCurrentChange:n.handlePageChange},null,8,["total","page-size","current-page","onCurrentChange"])])])])])),_:1},8,["modelValue"])}var ue={props:["modelValue","config"],emits:["update:modelValue"],setup(e,{emit:t}){const a=(0,b.Kh)({show:!0,timer:0,list:[],page:{Key:"",Page:1,PageSize:15,Count:0,Order:1,OrderType:0}});(0,l.wB)((()=>a.show),(e=>{e||setTimeout((()=>{t("update:modelValue",e)}),300)}));const o=()=>{Y({Key:a.page.Key,Page:a.page.Page,PageSize:a.page.PageSize,Order:a.page.Order,OrderType:a.page.OrderType}).then((e=>{try{a.page.Page=e.Page,a.page.PageSize=e.PageSize,a.page.Count=e.Count;const t=[];for(let a=0;a{a.timer=setTimeout(o,1e3)}))},n=e=>{let t=0;while(e>=1024)e/=1024,t++;return`${e.toFixed(2)}${["B","KB","MB","GB","TB"][t]}`},s=e=>{e&&(a.page.Page=e)},r=e=>{const t={ascending:1,descending:0}[e.order],l={SendtBytes:1,DiffSendtBytes:2,ReceiveBytes:3,DiffReceiveBytes:4}[e.prop];a.page.Order=l,a.page.OrderType=t};return(0,l.sV)((()=>{o()})),(0,l.hi)((()=>{clearTimeout(a.timer)})),{config:e.config,state:a,handlePageChange:s,handleSort:r}}};const pe=(0,x.A)(ue,[["render",ce],["__scopeId","data-v-7dbf3a4a"]]);var ge=pe,ve={props:["config"],components:{ServerFlowMessenger:Z,ServerFlowSForward:se,ServerFlowRelay:ge},setup(e){const t=(0,F.B)(),a=(0,l.EW)((()=>t.value.hasAccess("SForwardFlow"))),o=(0,l.EW)((()=>t.value.hasAccess("RelayFlow"))),n=(0,l.EW)((()=>t.value.hasAccess("SigninFlow"))),s=(0,b.Kh)({show:!1,timer:0,overallSendtSpeed:"0000.00KB",overallReceiveSpeed:"0000.00KB",overallOnline:"0/0",serverOnline:"",time:"",list:[],old:null,details:{Messenger:!1,SForward:!1,Relay:!1}}),r=()=>{s.show=!0},i=e=>{s.details[e]=!0},d={External:{text:"外网端口",detail:!1},RelayReport:{text:"中继节点",detail:!1},Relay:{text:"中继",detail:o.value},Messenger:{text:"信标",detail:n.value},SForward:{text:"内网穿透",detail:a.value}},c=()=>{M().then((e=>{const t=s.old||e;if(e.Items["_"]&&(s.overallOnline=`${e.Items["_"].SendtBytes}/${e.Items["_"].ReceiveBytes}`,delete e.Items["_"]),e.Items["flow"]&&e.Items["flow"].ReceiveBytes>0){const t=(BigInt(e.Items["flow"].ReceiveBytes)>>BigInt(32)).toString(),a=(BigInt(e.Items["flow"].ReceiveBytes)&BigInt(4294967295)).toString(),l=e.Items["flow"].SendtBytes;s.serverOnline=`、${t}/${a}/${l}`,delete e.Items["flow"]}let a=0,l=0,o=0,n=0;for(let s in t.Items)a+=t.Items[s].ReceiveBytes,l+=t.Items[s].SendtBytes;for(let s in e.Items)o+=e.Items[s].ReceiveBytes,n+=e.Items[s].SendtBytes;s.overallSendtSpeed=u(n-l),s.overallReceiveSpeed=u(o-a),s.time=`从 ${e.Start}启动 至今`;const r=[];for(let s in e.Items){const a=e.Items[s],l=t.Items[s],o=d[`${s}`]||{text:"未知",detail:!1};r.push({id:s,text:o.text,detail:o.detail,sendtBytes:a.SendtBytes,sendtBytesText:u(a.SendtBytes),sendtSpeed:a.SendtBytes-l.SendtBytes,sendtSpeedText:u(a.SendtBytes-l.SendtBytes),receiveBytes:a.ReceiveBytes,receiveBytesText:u(a.ReceiveBytes),receiveSpeed:a.ReceiveBytes-l.ReceiveBytes,receiveSpeedText:u(a.ReceiveBytes-l.ReceiveBytes)})}s.list=r.filter((e=>!!e.id)),s.old=e,s.timer=setTimeout(c,1e3)})).catch((e=>{s.timer=setTimeout(c,1e3)}))},u=e=>{let t=0;while(e>=1024)e/=1024,t++;return`${e.toFixed(2)}${["B","KB","MB","GB","TB"][t]}`};return(0,l.sV)((()=>{c()})),(0,l.hi)((()=>{clearTimeout(s.timer)})),{hasSForwardFlow:a,config:e.config,state:s,handleShow:r,handleShowDetail:i}}};const fe=(0,x.A)(ve,[["render",G],["__scopeId","data-v-7eac1e72"]]);var me=fe;const he=["title"],ye={key:0,class:"progress"},ke={key:1,class:"progress"};function we(e,t,a,n,s,r){const i=(0,l.g2)("Loading"),d=(0,l.g2)("el-icon"),c=(0,l.g2)("Download"),u=(0,l.g2)("CircleCheck");return(0,l.uX)(),(0,l.CE)("a",{href:"javascript:;",title:"服务端的程序版本",onClick:t[0]||(t[0]=(...e)=>n.handleUpdate&&n.handleUpdate(...e)),class:(0,o.C4)(["download",n.updateColor()])},[(0,l.Lk)("span",null,(0,o.v_)(n.state.version),1),n.updaterCurrent.Version?((0,l.uX)(),(0,l.CE)(l.FK,{key:0},[1==n.updaterCurrent.Status?((0,l.uX)(),(0,l.Wv)(d,{key:0,size:"14",class:"loading"},{default:(0,l.k6)((()=>[(0,l.bF)(i)])),_:1})):2==n.updaterServer.Status?((0,l.uX)(),(0,l.Wv)(d,{key:1,size:"14"},{default:(0,l.k6)((()=>[(0,l.bF)(c)])),_:1})):3==n.updaterServer.Status||5==n.updaterServer.Status?((0,l.uX)(),(0,l.CE)(l.FK,{key:2},[(0,l.bF)(d,{size:"14",class:"loading"},{default:(0,l.k6)((()=>[(0,l.bF)(i)])),_:1}),0==n.updaterServer.Length?((0,l.uX)(),(0,l.CE)("span",ye,"0%")):((0,l.uX)(),(0,l.CE)("span",ke,(0,o.v_)(parseInt(n.updaterServer.Current/n.updaterServer.Length*100))+"%",1))],64)):6==n.updaterServer.Status?((0,l.uX)(),(0,l.Wv)(d,{key:3,size:"14",class:"yellow"},{default:(0,l.k6)((()=>[(0,l.bF)(u)])),_:1})):(0,l.Q3)("",!0)],64)):((0,l.uX)(),(0,l.Wv)(d,{key:1,size:"14"},{default:(0,l.k6)((()=>[(0,l.bF)(c)])),_:1}))],10,he)}var be=a(2933),Se=a(920),Be={components:{Promotion:_.Yk4,Download:_.f5X,Loading:_.Rhj,CircleCheck:_.rW7,ServerFlow:me},props:["config"],setup(e){const t=(0,F.B)(),a=(0,l.EW)((()=>t.value.hasAccess("UpdateServer"))),o=(0,b.KR)({Version:"",Msg:[],DateTime:"",Status:0,Length:0,Current:0}),n=(0,b.KR)({Version:"",Status:0,Length:0,Current:0}),s=(0,l.EW)((()=>`${o.value.Version}->${o.value.DateTime}\n${o.value.Msg.map(((e,t)=>`${t+1}、${e}`)).join("\n")}`)),r=(0,b.Kh)({show:!1,loading:!1,connected:(0,l.EW)((()=>t.value.signin.Connected)),version:(0,l.EW)((()=>t.value.signin.Version))}),i=()=>{(0,Se.Vk)().then((e=>{o.value.DateTime=e.DateTime,o.value.Version=e.Version,o.value.Status=e.Status,o.value.Length=e.Length,o.value.Current=e.Current,o.value.Msg=e.Msg,setTimeout((()=>{i()}),1e3)})).catch((()=>{setTimeout((()=>{i()}),1e3)}))},d=()=>{(0,Se.BJ)().then((e=>{n.value.Version=e.Version,n.value.Status=e.Status,n.value.Length=e.Length,n.value.Current=e.Current,n.value.Status>2&&n.value.Status<6&&setTimeout((()=>{d()}),1e3)})).catch((()=>{setTimeout((()=>{d()}),1e3)}))},c=()=>o.value.Version?n.value.Status<=2?r.version!=o.value.Version?`不是最新版本(${o.value.Version}),建议更新\n${s.value}`:`是最新版本,但我无法阻止你喜欢更新\n${s.value}`:{3:"正在下载",4:"已下载",5:"正在解压",6:"已解压,请重启"}[n.value.Status]:"未检测到更新",u=()=>r.version!=o.value.Version?"yellow":"green",p=()=>{e.config&&a.value&&(o.value.Version?[0,1,3,5].indexOf(n.value.Status)>=0?K.nk.error("操作中,请稍后!"):6!=n.value.Status?2==o.value.Status&&be.s.confirm("确定更新服务端吗?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((()=>{(0,Se.y2)(o.value.Version).then((()=>{setTimeout((()=>{d()}),1e3)}))})).catch((()=>{})):be.s.confirm("确定关闭服务端吗?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((()=>{(0,Se.aP)()})).catch((()=>{})):K.nk.error("未检测到更新"))};return(0,l.sV)((()=>{i(),d()})),{config:e.config,state:r,updaterCurrent:o,updaterServer:n,handleUpdate:p,updateText:c,updateColor:u}}};const Fe=(0,x.A)(Be,[["render",we],["__scopeId","data-v-70063cba"]]);var Ce=Fe,_e={components:{ServerConfig:X,ServerFlow:me,ServerVersion:Ce},props:["config"],setup(e){const t=(0,F.B)(),a=(0,l.EW)((()=>t.value.hasAccess("Flow"))),o=(0,b.Kh)({show:!1,loading:!1});return{config:e.config,hasFlow:a,state:o}}};const Ve=(0,x.A)(_e,[["render",I],["__scopeId","data-v-2d85a782"]]);var xe=Ve;const Te=e=>((0,l.Qi)("data-v-0ef57e46"),e=e(),(0,l.jt)(),e),Le={key:0,class:"status-export-wrap"},Re={class:"port-wrap"},Ie=Te((()=>(0,l.Lk)("div",{class:"text"}," 导出配置,作为子设备运行,如果使用docker,容器映射configs文件夹即可 ",-1))),Pe={class:"body"},Ee={class:"card-header"},We={class:"flex"},De={title:"这将生成唯一ID,多台设备使用产生冲突,挤压下线"},ze={style:{"margin-left":"2rem"}},Ke=Te((()=>(0,l.Lk)("span",null,"设备名 : ",-1))),$e=Te((()=>(0,l.Lk)("span",null,"管理密码 : ",-1)));function Ae(e,t,a,o,n,s){const r=(0,l.g2)("Share"),i=(0,l.g2)("el-icon"),d=(0,l.g2)("el-checkbox"),c=(0,l.g2)("el-input"),u=(0,l.g2)("Access"),p=(0,l.g2)("el-card"),g=(0,l.g2)("el-button"),v=(0,l.g2)("el-dialog");return o.config&&o.hasExport?((0,l.uX)(),(0,l.CE)("div",Le,[(0,l.Lk)("a",{href:"javascript:;",title:"此设备的管理接口",onClick:t[0]||(t[0]=e=>o.state.show=!0)},[(0,l.bF)(i,{size:"16"},{default:(0,l.k6)((()=>[(0,l.bF)(r)])),_:1}),(0,l.eW)(" 导出配置 ")]),(0,l.bF)(v,{class:"options-center",title:"导出配置","destroy-on-close":"",modelValue:o.state.show,"onUpdate:modelValue":t[5]||(t[5]=e=>o.state.show=e),center:"",width:"580",top:"1vh"},{footer:(0,l.k6)((()=>[(0,l.bF)(g,{plain:"",onClick:t[4]||(t[4]=e=>o.state.show=!1),loading:o.state.loading},{default:(0,l.k6)((()=>[(0,l.eW)("取消")])),_:1},8,["loading"]),(0,l.bF)(g,{type:"success",plain:"",onClick:o.handleExport,loading:o.state.loading},{default:(0,l.k6)((()=>[(0,l.eW)("确定导出")])),_:1},8,["onClick","loading"])])),default:(0,l.k6)((()=>[(0,l.Lk)("div",Re,[Ie,(0,l.Lk)("div",Pe,[(0,l.bF)(p,{shadow:"never"},{header:(0,l.k6)((()=>[(0,l.Lk)("div",Ee,[(0,l.Lk)("div",We,[(0,l.Lk)("div",De,[(0,l.bF)(d,{disabled:o.onlyNode,modelValue:o.state.single,"onUpdate:modelValue":t[1]||(t[1]=e=>o.state.single=e),label:"单设备"},null,8,["disabled","modelValue"])]),(0,l.Lk)("div",ze,[Ke,(0,l.bF)(c,{disabled:!o.state.single,modelValue:o.state.name,"onUpdate:modelValue":t[2]||(t[2]=e=>o.state.name=e),maxlength:"12","show-word-limit":"",style:{width:"15rem"}},null,8,["disabled","modelValue"])]),(0,l.Lk)("div",null,[$e,(0,l.bF)(c,{type:"password","show-password":"",disabled:o.onlyNode,modelValue:o.state.apipassword,"onUpdate:modelValue":t[3]||(t[3]=e=>o.state.apipassword=e),maxlength:"36","show-word-limit":"",style:{width:"15rem"}},null,8,["disabled","modelValue"])])])])])),default:(0,l.k6)((()=>[(0,l.bF)(u,{ref:"accessDom",machineid:o.machineId},null,8,["machineid"])])),_:1})])])])),_:1},8,["modelValue"])])):(0,l.Q3)("",!0)}var Xe=a(8835),Oe=a(9593),Ue={components:{Share:_.SYj,Access:Oe.A},props:["config"],setup(e){const t=(0,F.B)(),a=(0,l.EW)((()=>t.value.hasAccess("Export"))),o=(0,l.EW)((()=>t.value.config.Client.OnlyNode)),n=(0,l.EW)((()=>t.value.config.Client.Id)),s=(0,b.Kh)({show:!1,loading:!1,single:!0,name:"",apipassword:t.value.config.Client.CApi.ApiPassword}),r=(0,b.KR)(null),i=()=>{if(!a.value)return;const e={access:r.value.getValue(),single:s.single,name:s.name,apipassword:s.apipassword};if(e.single){if(!e.name)return void K.nk.error("请输入设备名")}else e.name="";if(!e.single||s.name)return e;K.nk.error("请输入管理密码")},d=()=>{const e=document.createElement("a");s.single?e.download=`client-node-export-${s.name}.zip`:e.download="client-node-export.zip",e.href="/client-node-export.zip",document.body.appendChild(e),e.click(),document.body.removeChild(e)},c=()=>{const e=i();e&&(s.loading=!0,(0,Xe.P$)(e).then((()=>{s.loading=!1,s.show=!1,K.nk.success("导出成功"),d()})).catch((()=>{s.loading=!1})))};return{config:e.config,onlyNode:o,hasExport:a,machineId:n,state:s,accessDom:r,handleExport:c}}};const je=(0,x.A)(Ue,[["render",Ae],["__scopeId","data-v-0ef57e46"]]);var Ge=je,Me=a(167),Qe={components:{Api:L,Server:xe,Export:Ge,UpdaterBtn:Me.A},props:["config"],setup(e){const t=(0,F.B)(),a=(0,l.EW)((()=>t.value.self)),o=(0,b.Kh)({showPay:!1});return{state:o,config:e.config,self:a}}};const Ne=(0,x.A)(Qe,[["render",w],["__scopeId","data-v-002265e8"]]);var Ye=Ne}}]); \ No newline at end of file diff --git a/linker.tray.win/web/js/256.8161f834.js b/linker.tray.win/web/js/256.8161f834.js deleted file mode 100644 index 60ea5e97..00000000 --- a/linker.tray.win/web/js/256.8161f834.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[256],{9232:function(e,l,t){t.d(l,{W4:function(){return o},q:function(){return n},uQ:function(){return r}});var a=t(4);const n=e=>(0,a.zG)("relay/SetServers",e),o=()=>(0,a.zG)("relay/Subscribe"),r=e=>(0,a.zG)("relay/Connect",e)},743:function(e,l,t){t.d(l,{Ap:function(){return n},Co:function(){return o},DY:function(){return u},Qs:function(){return i},a9:function(){return s},eX:function(){return c},gz:function(){return d},pY:function(){return r}});var a=t(4);const n=()=>(0,a.zG)("sforwardclient/GetSecretKey"),o=e=>(0,a.zG)("sforwardclient/SetSecretKey",e),r=e=>(0,a.zG)("sforwardclient/get",e),s=()=>(0,a.zG)("sforwardclient/refresh"),d=(e="0")=>(0,a.zG)("sforwardclient/getcount",e),u=e=>(0,a.zG)("sforwardclient/remove",e),i=e=>(0,a.zG)("sforwardclient/add",e),c=e=>(0,a.zG)("sforwardclient/TestLocal",e)},920:function(e,l,t){t.d(l,{BJ:function(){return c},Ce:function(){return g},NS:function(){return r},PY:function(){return u},UB:function(){return p},Vk:function(){return i},aP:function(){return m},ir:function(){return d},lJ:function(){return o},mK:function(){return n},y2:function(){return h},yN:function(){return s}});var a=t(4);const n=(e="0")=>(0,a.zG)("updaterclient/get",e),o=e=>(0,a.zG)("updaterclient/confirm",e),r=e=>(0,a.zG)("updaterclient/exit",e),s=()=>(0,a.zG)("updaterclient/GetSecretKey"),d=e=>(0,a.zG)("updaterclient/SetSecretKey",e),u=e=>(0,a.zG)("updaterclient/SetInterval",e),i=()=>(0,a.zG)("updaterclient/getcurrent"),c=()=>(0,a.zG)("updaterclient/getserver"),h=e=>(0,a.zG)("updaterclient/confirmserver",e),m=()=>(0,a.zG)("updaterclient/exitserver"),p=()=>(0,a.zG)("updaterclient/Subscribe"),g=e=>(0,a.zG)("updaterclient/check",e)},256:function(e,l,t){t.r(l),t.d(l,{default:function(){return oe}});var a=t(6768);const n={key:0,class:"servers-wrap"};function o(e,l,t,o,r,s){const d=(0,a.g2)("SignInServers"),u=(0,a.g2)("el-tab-pane"),i=(0,a.g2)("Groups"),c=(0,a.g2)("Async"),h=(0,a.g2)("el-tabs");return o.hasConfig?((0,a.uX)(),(0,a.CE)("div",n,[(0,a.bF)(h,{type:"border-card",style:{width:"100%"},modelValue:o.state.tab,"onUpdate:modelValue":l[0]||(l[0]=e=>o.state.tab=e)},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"信标服务器",name:"signin"},{default:(0,a.k6)((()=>[(0,a.bF)(d)])),_:1}),(0,a.bF)(u,{label:"分组设置",name:"groups"},{default:(0,a.k6)((()=>[(0,a.bF)(i)])),_:1}),o.hasSync?((0,a.uX)(),(0,a.Wv)(u,{key:0,label:"配置同步",name:"async"},{default:(0,a.k6)((()=>[(0,a.bF)(c)])),_:1})):(0,a.Q3)("",!0)])),_:1},8,["modelValue"])])):(0,a.Q3)("",!0)}var r=t(144),s=t(3830),d=t(4232);const u={class:"flex"},i=(0,a.Lk)("span",null,"服务器地址。ip:端口 或者 域名:端口",-1),c={class:"flex"},h=(0,a.Lk)("span",null,"密钥正确时可连接服务器",-1),m={class:"t-c"};function p(e,l,t,n,o,r){const s=(0,a.g2)("el-input"),p=(0,a.g2)("el-form-item"),g=(0,a.g2)("RelayServers"),f=(0,a.g2)("SForward"),k=(0,a.g2)("Updater"),b=(0,a.g2)("el-form"),w=(0,a.g2)("el-button"),y=(0,a.g2)("el-card");return(0,a.uX)(),(0,a.CE)("div",{class:"signin-wrap",style:(0,d.Tr)({height:`${n.state.height}px`})},[(0,a.bF)(y,{shadow:"never"},{header:(0,a.k6)((()=>[(0,a.eW)("服务器相关设置")])),footer:(0,a.k6)((()=>[(0,a.Lk)("div",m,[(0,a.bF)(w,{type:"success",onClick:n.handleSave},{default:(0,a.k6)((()=>[(0,a.eW)("确定更改")])),_:1},8,["onClick"])])])),default:(0,a.k6)((()=>[(0,a.Lk)("div",null,[(0,a.bF)(b,{"label-width":"auto"},{default:(0,a.k6)((()=>[(0,a.bF)(p,{label:"服务器地址"},{default:(0,a.k6)((()=>[(0,a.Lk)("div",u,[(0,a.bF)(s,{class:"flex-1",modelValue:n.state.list.Host,"onUpdate:modelValue":l[0]||(l[0]=e=>n.state.list.Host=e),onChange:n.handleSave},null,8,["modelValue","onChange"]),i])])),_:1}),(0,a.bF)(p,{label:"信标密钥"},{default:(0,a.k6)((()=>[(0,a.Lk)("div",c,[(0,a.bF)(s,{class:"flex-1",type:"password","show-password":"",maxlength:"36",modelValue:n.state.list.SecretKey,"onUpdate:modelValue":l[1]||(l[1]=e=>n.state.list.SecretKey=e),onChange:n.handleSave},null,8,["modelValue","onChange"]),h])])),_:1}),(0,a.bF)(g),(0,a.bF)(f),(0,a.bF)(k)])),_:1})])])),_:1})],4)}var g=t(9299),f=t(1219);const k={class:"flex"},b=(0,a.Lk)("span",null,"密钥正确时可使用内网穿透",-1);function w(e,l,t,n,o,r){const s=(0,a.g2)("el-input"),d=(0,a.g2)("el-form-item");return(0,a.uX)(),(0,a.Wv)(d,{label:"服务器穿透密钥"},{default:(0,a.k6)((()=>[(0,a.Lk)("div",k,[(0,a.bF)(s,{class:"flex-1",type:"password","show-password":"",modelValue:n.state.SForwardSecretKey,"onUpdate:modelValue":l[0]||(l[0]=e=>n.state.SForwardSecretKey=e),maxlength:"36",onBlur:n.handleChange},null,8,["modelValue","onBlur"]),b])])),_:1})}var y=t(743),v={setup(e){const l=(0,r.Kh)({SForwardSecretKey:""}),t=()=>{(0,y.Ap)().then((e=>{l.SForwardSecretKey=e}))},n=()=>{l.SForwardSecretKey&&(0,y.Co)(l.SForwardSecretKey).then((()=>{f.nk.success("已操作")})).catch((e=>{console.log(e),f.nk.error("操作失败")}))},o=()=>{n()};return(0,a.sV)((()=>{t()})),{state:l,handleChange:o}}},C=t(1241);const F=(0,C.A)(v,[["render",w]]);var S=F;const V={class:"flex"},_=(0,a.Lk)("span",null,"密钥正确时可更新服务端",-1);function x(e,l,t,n,o,r){const s=(0,a.g2)("el-input"),d=(0,a.g2)("el-form-item"),u=(0,a.g2)("el-input-number");return(0,a.uX)(),(0,a.CE)(a.FK,null,[(0,a.bF)(d,{label:"服务器更新密钥"},{default:(0,a.k6)((()=>[(0,a.Lk)("div",V,[(0,a.bF)(s,{class:"flex-1",type:"password","show-password":"",modelValue:n.state.secretKey,"onUpdate:modelValue":l[0]||(l[0]=e=>n.state.secretKey=e),maxlength:"36",onBlur:n.handleChange},null,8,["modelValue","onBlur"]),_])])),_:1}),(0,a.bF)(d,{label:"客户端更新检测频率"},{default:(0,a.k6)((()=>[(0,a.Lk)("div",null,[(0,a.Lk)("div",null,[(0,a.bF)(u,{modelValue:n.state.year,"onUpdate:modelValue":l[1]||(l[1]=e=>n.state.year=e),min:0,max:99,style:{width:"12rem"},onChange:n.handleSecChange},null,8,["modelValue","onChange"]),(0,a.eW)(" 年 "),(0,a.bF)(u,{modelValue:n.state.month,"onUpdate:modelValue":l[2]||(l[2]=e=>n.state.month=e),min:0,max:99,style:{width:"12rem"},onChange:n.handleSecChange},null,8,["modelValue","onChange"]),(0,a.eW)(" 月 "),(0,a.bF)(u,{modelValue:n.state.day,"onUpdate:modelValue":l[3]||(l[3]=e=>n.state.day=e),min:0,max:99,style:{width:"12rem"},onChange:n.handleSecChange},null,8,["modelValue","onChange"]),(0,a.eW)(" 日 ")]),(0,a.Lk)("div",null,[(0,a.bF)(u,{modelValue:n.state.hour,"onUpdate:modelValue":l[4]||(l[4]=e=>n.state.hour=e),min:0,max:99,style:{width:"12rem"},onChange:n.handleSecChange},null,8,["modelValue","onChange"]),(0,a.eW)(" 时 "),(0,a.bF)(u,{modelValue:n.state.min,"onUpdate:modelValue":l[5]||(l[5]=e=>n.state.min=e),min:0,max:99,style:{width:"12rem"},onChange:n.handleSecChange},null,8,["modelValue","onChange"]),(0,a.eW)(" 分 "),(0,a.bF)(u,{modelValue:n.state.sec,"onUpdate:modelValue":l[6]||(l[6]=e=>n.state.sec=e),min:0,max:99,style:{width:"12rem"},onChange:n.handleSecChange},null,8,["modelValue","onChange"]),(0,a.eW)(" 秒 ")])])])),_:1})],64)}var K=t(920),G={setup(e){const l=(0,s.B)(),t=(0,r.Kh)({secretKey:"",year:0,month:0,day:0,hour:0,min:1,sec:0}),n=()=>{(0,K.yN)().then((e=>{t.secretKey=e}))},o=()=>{t.secretKey&&(0,K.ir)(t.secretKey).then((()=>{f.nk.success("已操作")})).catch((e=>{console.log(e),f.nk.error("操作失败")}))},d=()=>{const e=31536e3*t.year+2592e3*t.month+86400*t.day+3600*t.hour+60*t.min+t.sec;(0,K.PY)(e).then((()=>{f.nk.success("已操作")})).catch((e=>{console.log(e),f.nk.error("操作失败")}))},u=()=>{d()},i=()=>{o()};return(0,a.sV)((()=>{n();let e=l.value.config.Common.UpdateIntervalSeconds;t.year=Math.floor(e/31536e3),e%=31536e3,t.month=Math.floor(e/2592e3),e%=2592e3,t.day=Math.floor(e/86400),e%=86400,t.hour=Math.floor(e/3600),e%=3600,t.min=Math.floor(e/60),e%=60,t.sec=e})),{state:t,handleChange:i,handleSecChange:u}}};const z=(0,C.A)(G,[["render",x]]);var B=z;const E={key:0},U={key:1},W={key:0},L={key:1},I={key:0},X={key:1};function A(e,l,t,n,o,r){const s=(0,a.g2)("el-input"),u=(0,a.g2)("el-checkbox"),i=(0,a.g2)("el-form-item"),c=(0,a.g2)("el-table-column"),h=(0,a.g2)("el-switch"),m=(0,a.g2)("el-table"),p=(0,a.g2)("el-dialog");return(0,a.uX)(),(0,a.CE)(a.FK,null,[(0,a.bF)(i,{label:"中继密钥"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{type:"password","show-password":"",modelValue:n.state.list.SecretKey,"onUpdate:modelValue":l[0]||(l[0]=e=>n.state.list.SecretKey=e),maxlength:"36",onChange:n.handleSave},null,8,["modelValue","onChange"]),(0,a.bF)(u,{modelValue:n.state.list.SSL,"onUpdate:modelValue":l[1]||(l[1]=e=>n.state.list.SSL=e),label:"使用ssl",size:"large",onChange:n.handleSave},null,8,["modelValue","onChange"]),(0,a.bF)(u,{modelValue:n.state.list.Disabled,"onUpdate:modelValue":l[2]||(l[2]=e=>n.state.list.Disabled=e),label:"禁用中继",size:"large",onChange:n.handleSave},null,8,["modelValue","onChange"]),(0,a.Lk)("a",{href:"javascript:;",onClick:l[3]||(l[3]=e=>n.state.show=!0),class:(0,d.C4)(["delay a-line",{red:0==n.state.nodes.length,green:n.state.nodes.length>0}])}," 中继节点 : "+(0,d.v_)(n.state.nodes.length),3)])),_:1}),(0,a.bF)(p,{modelValue:n.state.show,"onUpdate:modelValue":l[4]||(l[4]=e=>n.state.show=e),title:"中继节点",width:"760",top:"2vh"},{default:(0,a.k6)((()=>[(0,a.Lk)("div",null,[(0,a.bF)(m,{data:n.state.nodes,size:"small",border:"",height:"500"},{default:(0,a.k6)((()=>[(0,a.bF)(c,{property:"Name",label:"名称"}),(0,a.bF)(c,{property:"MaxGbTotal",label:"月流量",width:"160"},{default:(0,a.k6)((e=>[0==e.row.MaxGbTotal?((0,a.uX)(),(0,a.CE)("span",E,"无限制")):((0,a.uX)(),(0,a.CE)("span",U,(0,d.v_)((e.row.MaxGbTotalLastBytes/1024/1024/1024).toFixed(2))+"GB / "+(0,d.v_)(e.row.MaxGbTotal)+"GB",1))])),_:1}),(0,a.bF)(c,{property:"MaxBandwidth",label:"连接带宽",width:"80"},{default:(0,a.k6)((e=>[0==e.row.MaxBandwidth?((0,a.uX)(),(0,a.CE)("span",W,"无限制")):((0,a.uX)(),(0,a.CE)("span",L,(0,d.v_)(e.row.MaxBandwidth)+"Mbps",1))])),_:1}),(0,a.bF)(c,{property:"MaxBandwidthTotal",label:"总带宽",width:"80"},{default:(0,a.k6)((e=>[0==e.row.MaxBandwidthTotal?((0,a.uX)(),(0,a.CE)("span",I,"无限制")):((0,a.uX)(),(0,a.CE)("span",X,(0,d.v_)(e.row.MaxBandwidthTotal)+"Mbps",1))])),_:1}),(0,a.bF)(c,{property:"BandwidthRatio",label:"带宽速率",width:"66"},{default:(0,a.k6)((e=>[(0,a.Lk)("span",null,(0,d.v_)(100*e.row.BandwidthRatio)+"%",1)])),_:1}),(0,a.bF)(c,{property:"ConnectionRatio",label:"连接数",width:"60"},{default:(0,a.k6)((e=>[(0,a.Lk)("span",null,(0,d.v_)(100*e.row.ConnectionRatio)+"%",1)])),_:1}),(0,a.bF)(c,{property:"Delay",label:"延迟",width:"60"},{default:(0,a.k6)((e=>[(0,a.Lk)("span",null,(0,d.v_)(e.row.Delay)+"ms",1)])),_:1}),(0,a.bF)(c,{property:"Public",label:"公开",width:"60"},{default:(0,a.k6)((e=>[(0,a.bF)(h,{disabled:"",modelValue:e.row.Public,"onUpdate:modelValue":l=>e.row.Public=l,size:"small"},null,8,["modelValue","onUpdate:modelValue"])])),_:1})])),_:1},8,["data"])])])),_:1},8,["modelValue"])],64)}var M=t(9232),P={setup(e){const l=(0,s.B)(),t=(0,r.Kh)({list:l.value.config.Client.Relay.Server,show:!1,nodes:[],timer:0});(0,a.wB)((()=>l.value.config.Client.Relay.Server),(()=>{t.list.Delay=l.value.config.Client.Relay.Server.Delay}));const n=()=>{(0,M.q)(t.list).then((()=>{f.nk.success("已操作")})).catch((e=>{console.log(e),f.nk.error("操作失败")}))},o=()=>{(0,M.W4)().then((e=>{t.nodes=e,t.timer=setTimeout(o,1e3)})).catch((()=>{t.timer=setTimeout(o,1e3)}))};return(0,a.sV)((()=>{o()})),(0,a.hi)((()=>{clearTimeout(t.timer)})),{state:t,handleSave:n}}};const T=(0,C.A)(P,[["render",A],["__scopeId","data-v-3a883663"]]);var D=T,N={components:{SForward:S,Updater:B,RelayServers:D},setup(e){const l=(0,s.B)(),t=(0,r.Kh)({list:l.value.config.Client.ServerInfo,height:(0,a.EW)((()=>l.value.height-90))}),n=()=>{(0,g.jU)(t.list).then((()=>{f.nk.success("已操作")})).catch((e=>{console.log(e),f.nk.error("操作失败")}))};return{state:t,handleSave:n}}};const R=(0,C.A)(N,[["render",p]]);var $=R;function Q(e,l,t,n,o,r){const s=(0,a.g2)("el-input"),u=(0,a.g2)("el-table-column"),i=(0,a.g2)("Delete"),c=(0,a.g2)("el-icon"),h=(0,a.g2)("el-button"),m=(0,a.g2)("el-popconfirm"),p=(0,a.g2)("Plus"),g=(0,a.g2)("el-table");return(0,a.uX)(),(0,a.Wv)(g,{stripe:"",data:n.state.list,border:"",size:"small",width:"100%",height:`${n.state.height}px`,onCellDblclick:n.handleCellClick},{default:(0,a.k6)((()=>[(0,a.bF)(u,{prop:"Name",label:"名称",width:"100"},{default:(0,a.k6)((e=>[e.row.NameEditing?((0,a.uX)(),(0,a.Wv)(s,{key:0,autofocus:"",size:"small",modelValue:e.row.Name,"onUpdate:modelValue":l=>e.row.Name=l,onBlur:l=>n.handleEditBlur(e.row,"Name")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,a.uX)(),(0,a.CE)(a.FK,{key:1},[(0,a.eW)((0,d.v_)(e.row.Name),1)],64))])),_:1}),(0,a.bF)(u,{prop:"Id",label:"Id"},{default:(0,a.k6)((e=>[e.row.IdEditing?((0,a.uX)(),(0,a.Wv)(s,{key:0,autofocus:"",size:"small",modelValue:e.row.Id,"onUpdate:modelValue":l=>e.row.Id=l,onBlur:l=>n.handleEditBlur(e.row,"Id")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,a.uX)(),(0,a.CE)(a.FK,{key:1},[(0,a.eW)((0,d.v_)(e.row.Id),1)],64))])),_:1}),(0,a.bF)(u,{prop:"Password",label:"密码"},{default:(0,a.k6)((e=>[e.row.PasswordEditing?((0,a.uX)(),(0,a.Wv)(s,{key:0,type:"password","show-password":"",size:"small",modelValue:e.row.Password,"onUpdate:modelValue":l=>e.row.Password=l,onBlur:l=>n.handleEditBlur(e.row,"Password")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,a.uX)(),(0,a.CE)(a.FK,{key:1},[(0,a.eW)((0,d.v_)(e.row.Password.replace(/.{1}/g,"*")),1)],64))])),_:1}),(0,a.bF)(u,{prop:"Oper",label:"操作",width:"110"},{default:(0,a.k6)((e=>[(0,a.Lk)("div",null,[(0,a.bF)(m,{title:"删除不可逆,是否确认?",onConfirm:l=>n.handleDel(e.$index)},{reference:(0,a.k6)((()=>[(0,a.bF)(h,{type:"danger",size:"small"},{default:(0,a.k6)((()=>[(0,a.bF)(c,null,{default:(0,a.k6)((()=>[(0,a.bF)(i)])),_:1})])),_:1})])),_:2},1032,["onConfirm"]),(0,a.bF)(h,{type:"primary",size:"small",onClick:l=>n.handleAdd(e.$index)},{default:(0,a.k6)((()=>[(0,a.bF)(c,null,{default:(0,a.k6)((()=>[(0,a.bF)(p)])),_:1})])),_:2},1032,["onClick"])])])),_:1})])),_:1},8,["data","height","onCellDblclick"])}var Y=t(7477),j={components:{Delete:Y.epd,Plus:Y.FWt,Select:Y.l6P},setup(e){const l=(0,s.B)(),t=(0,r.Kh)({list:l.value.config.Client.Groups||[],height:(0,a.EW)((()=>l.value.height-90))});(0,a.wB)((()=>l.value.config.Client.Groups),(()=>{0==t.list.filter((e=>e["__editing"])).length&&(t.list=l.value.config.Client.Groups)}));const n=(e,l)=>{o(e,l.property)},o=(e,l)=>{t.list.forEach((e=>{e["NameEditing"]=!1,e["IdEditing"]=!1,e["PasswordEditing"]=!1})),e[`${l}Editing`]=!0,e["__editing"]=!0},d=(e,l)=>{e[`${l}Editing`]=!1,e["__editing"]=!1,c()},u=e=>{t.list.splice(e,1),c()},i=e=>{t.list.filter((e=>""==e.Id||""==e.Name)).length>0||(t.list.splice(e+1,0,{Name:"",Id:"",Password:""}),c())},c=()=>{(0,g.zp)(t.list).then((()=>{f.nk.success("已操作")})).catch((e=>{console.log(e),f.nk.error("操作失败")}))};return{state:t,handleCellClick:n,handleEditBlur:d,handleDel:u,handleAdd:i}}};const q=(0,C.A)(j,[["render",Q]]);var H=q;const J={class:"t-c"};function O(e,l,t,n,o,r){const s=(0,a.g2)("el-checkbox"),u=(0,a.g2)("el-col"),i=(0,a.g2)("el-row"),c=(0,a.g2)("el-checkbox-group"),h=(0,a.g2)("el-button"),m=(0,a.g2)("el-card");return(0,a.uX)(),(0,a.CE)("div",{style:(0,d.Tr)({height:`${n.state.height}px`})},[(0,a.bF)(m,{shadow:"never"},{header:(0,a.k6)((()=>[(0,a.eW)("选择你需要同步的项,将这些配置同步到本组所有客户端")])),footer:(0,a.k6)((()=>[(0,a.Lk)("div",J,[(0,a.bF)(h,{type:"success",onClick:n.handleSync},{default:(0,a.k6)((()=>[(0,a.eW)("确定同步")])),_:1},8,["onClick"])])])),default:(0,a.k6)((()=>[(0,a.Lk)("div",null,[(0,a.bF)(s,{modelValue:n.state.checkAll,"onUpdate:modelValue":l[0]||(l[0]=e=>n.state.checkAll=e),indeterminate:n.state.isIndeterminate,onChange:n.handleCheckAllChange},{default:(0,a.k6)((()=>[(0,a.eW)("全选")])),_:1},8,["modelValue","indeterminate","onChange"]),(0,a.bF)(c,{modelValue:n.state.checkeds,"onUpdate:modelValue":l[1]||(l[1]=e=>n.state.checkeds=e),onChange:n.handleCheckedsChange},{default:(0,a.k6)((()=>[(0,a.bF)(i,null,{default:(0,a.k6)((()=>[((0,a.uX)(!0),(0,a.CE)(a.FK,null,(0,a.pI)(n.state.names,(e=>((0,a.uX)(),(0,a.Wv)(u,{span:8},{default:(0,a.k6)((()=>[((0,a.uX)(),(0,a.Wv)(s,{key:e.name,label:e.label,value:e.name},{default:(0,a.k6)((()=>[(0,a.eW)((0,d.v_)(e.label),1)])),_:2},1032,["label","value"]))])),_:2},1024)))),256))])),_:1})])),_:1},8,["modelValue","onChange"])])])),_:1})],4)}var Z=t(8835),ee={label:"同步配置",name:"async",order:7,setup(e){const l=(0,s.B)(),t=(0,r.Kh)({names:[],checkAll:!1,isIndeterminate:!1,checkeds:[],height:(0,a.EW)((()=>l.value.height-90))}),n=e=>{t.checkeds=e?t.names.map((e=>e.name)):[],t.isIndeterminate=!1},o=e=>{const l=e.length;t.checkAll=l===t.names.length,t.isIndeterminate=l>0&&l{(0,Z.Iv)().then((e=>{t.names=e.map((e=>({name:e,label:d[e]})))}))}));const u=()=>{0!=t.checkeds.length?(0,Z.E1)(t.checkeds).then((e=>{f.nk.success("已操作")})):f.nk.error("至少选择一个")};return{state:t,handleCheckAllChange:n,handleCheckedsChange:o,handleSync:u}}};const le=(0,C.A)(ee,[["render",O]]);var te=le,ae={components:{SignInServers:$,Groups:H,Async:te},setup(e){const l=(0,s.B)(),t=(0,a.EW)((()=>l.value.hasAccess("Config"))),n=(0,a.EW)((()=>l.value.hasAccess("Sync"))),o=(0,r.Kh)({tab:"signin"});return{state:o,hasConfig:t,hasSync:n}}};const ne=(0,C.A)(ae,[["render",o],["__scopeId","data-v-11926c68"]]);var oe=ne}}]); \ No newline at end of file diff --git a/linker.tray.win/web/js/402.024283d6.js b/linker.tray.win/web/js/402.024283d6.js new file mode 100644 index 00000000..ecf717b6 --- /dev/null +++ b/linker.tray.win/web/js/402.024283d6.js @@ -0,0 +1 @@ +"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[402],{402:function(e,t,n){n.r(t),n.d(t,{default:function(){return h}});var r=n(6768);const o={class:"action-wrap"},s={class:"t-c"};function a(e,t,n,a,l,c){const i=(0,r.g2)("el-input"),u=(0,r.g2)("el-button"),d=(0,r.g2)("el-card");return(0,r.uX)(),(0,r.CE)("div",o,[(0,r.bF)(d,{shadow:"never"},{header:(0,r.k6)((()=>[(0,r.eW)("设置定义验证的静态Json参数")])),footer:(0,r.k6)((()=>[(0,r.Lk)("div",s,[(0,r.bF)(u,{type:"success",onClick:a.handleSave},{default:(0,r.k6)((()=>[(0,r.eW)("确定更改")])),_:1},8,["onClick"])])])),default:(0,r.k6)((()=>[(0,r.Lk)("div",null,[(0,r.bF)(i,{modelValue:a.state.list,"onUpdate:modelValue":t[0]||(t[0]=e=>a.state.list=e),rows:10,type:"textarea",resize:"none",onChange:a.handleSave},null,8,["modelValue","onChange"])])])),_:1})])}var l=n(4);const c=e=>(0,l.zG)("action/SetServerArgs",e);var i=n(3830),u=n(1219),d=n(144),v={setup(e){const t=(0,i.B)(),n=(0,d.Kh)({list:t.value.config.Client.Action.Args[t.value.config.Client.Server.Host]||""}),r=()=>{try{if(n.list&&"object"!=typeof JSON.parse(n.list))return void u.nk.error("Json格式错误")}catch(r){return void u.nk.error("Json格式错误")}const e={};e[t.value.config.Client.Server.Host]=n.list,c(e).then((()=>{u.nk.success("已操作")})).catch((e=>{console.log(e),u.nk.error("操作失败")}))};return{state:n,handleSave:r}}},k=n(1241);const f=(0,k.A)(v,[["render",a],["__scopeId","data-v-3cb5be52"]]);var h=f}}]); \ No newline at end of file diff --git a/linker.tray.win/web/js/424.f2a1d18e.js b/linker.tray.win/web/js/424.f2a1d18e.js deleted file mode 100644 index 2a1260fa..00000000 --- a/linker.tray.win/web/js/424.f2a1d18e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[424],{6424:function(e,n,t){t.r(n),t.d(n,{default:function(){return h}});var o=t(6768);const r={class:"action-wrap"},s={class:"t-c"};function a(e,n,t,a,l,c){const i=(0,o.g2)("el-input"),u=(0,o.g2)("el-button"),d=(0,o.g2)("el-card");return(0,o.uX)(),(0,o.CE)("div",r,[(0,o.bF)(d,{shadow:"never"},{header:(0,o.k6)((()=>[(0,o.eW)("设置定义验证的静态Json参数")])),footer:(0,o.k6)((()=>[(0,o.Lk)("div",s,[(0,o.bF)(u,{type:"success",onClick:a.handleSave},{default:(0,o.k6)((()=>[(0,o.eW)("确定更改")])),_:1},8,["onClick"])])])),default:(0,o.k6)((()=>[(0,o.Lk)("div",null,[(0,o.bF)(i,{modelValue:a.state.list,"onUpdate:modelValue":n[0]||(n[0]=e=>a.state.list=e),rows:10,type:"textarea",resize:"none",onChange:a.handleSave},null,8,["modelValue","onChange"])])])),_:1})])}var l=t(4);const c=e=>(0,l.zG)("action/SetServerArgs",e);var i=t(3830),u=t(1219),d=t(144),v={setup(e){const n=(0,i.B)(),t=(0,d.Kh)({list:n.value.config.Client.Action.Args[n.value.config.Client.ServerInfo.Host]||""}),o=()=>{try{if(t.list&&"object"!=typeof JSON.parse(t.list))return void u.nk.error("Json格式错误")}catch(o){return void u.nk.error("Json格式错误")}const e={};e[n.value.config.Client.ServerInfo.Host]=t.list,c(e).then((()=>{u.nk.success("已操作")})).catch((e=>{console.log(e),u.nk.error("操作失败")}))};return{state:t,handleSave:o}}},k=t(1241);const f=(0,k.A)(v,[["render",a],["__scopeId","data-v-f78c23dc"]]);var h=f}}]); \ No newline at end of file diff --git a/linker.tray.win/web/js/509.b1ccc755.js b/linker.tray.win/web/js/509.b1ccc755.js deleted file mode 100644 index bc3b60cd..00000000 --- a/linker.tray.win/web/js/509.b1ccc755.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[509],{9232:function(e,a,l){l.d(a,{W4:function(){return o},q:function(){return n},uQ:function(){return r}});var t=l(4);const n=e=>(0,t.zG)("relay/SetServers",e),o=()=>(0,t.zG)("relay/Subscribe"),r=e=>(0,t.zG)("relay/Connect",e)},743:function(e,a,l){l.d(a,{Ap:function(){return n},Co:function(){return o},DY:function(){return i},Qs:function(){return u},a9:function(){return s},eX:function(){return c},gz:function(){return d},pY:function(){return r}});var t=l(4);const n=()=>(0,t.zG)("sforwardclient/GetSecretKey"),o=e=>(0,t.zG)("sforwardclient/SetSecretKey",e),r=e=>(0,t.zG)("sforwardclient/get",e),s=()=>(0,t.zG)("sforwardclient/refresh"),d=(e="0")=>(0,t.zG)("sforwardclient/getcount",e),i=e=>(0,t.zG)("sforwardclient/remove",e),u=e=>(0,t.zG)("sforwardclient/add",e),c=e=>(0,t.zG)("sforwardclient/TestLocal",e)},83:function(e,a,l){l.d(a,{$M:function(){return s},KW:function(){return r},gM:function(){return o},r7:function(){return n}});var t=l(4);const n=(e="0")=>(0,t.zG)("tunnel/get",e),o=()=>(0,t.zG)("tunnel/refresh"),r=e=>(0,t.zG)("tunnel/SetRouteLevel",e),s=e=>(0,t.zG)("tunnel/SetTransports",e)},2712:function(e,a,l){l.r(a),l.d(a,{default:function(){return kt}});var t=l(6768);const n={class:"home-list-wrap absolute"},o={class:"page t-c"},r={class:"page-wrap"};function s(e,a,l,s,d,i){const u=(0,t.g2)("Sort"),c=(0,t.g2)("Device"),h=(0,t.g2)("Tunnel"),m=(0,t.g2)("Tuntap"),p=(0,t.g2)("Socks5"),w=(0,t.g2)("Forward"),k=(0,t.g2)("Oper"),g=(0,t.g2)("el-table"),f=(0,t.g2)("el-pagination"),v=(0,t.g2)("DeviceEdit"),b=(0,t.g2)("AccessEdit"),C=(0,t.g2)("TunnelEdit"),F=(0,t.g2)("ConnectionsEdit"),E=(0,t.g2)("TuntapEdit"),L=(0,t.g2)("Socks5Edit"),_=(0,t.g2)("TuntapLease"),y=(0,t.g2)("ForwardEdit"),I=(0,t.g2)("SForwardEdit");return(0,t.uX)(),(0,t.CE)("div",n,[(0,t.bF)(u,{onSort:s.handleSortChange},null,8,["onSort"]),(0,t.bF)(g,{data:s.devices.page.List,stripe:"",border:"",style:{width:"100%"},height:`${s.state.height}px`,size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(c,{onEdit:s.handleDeviceEdit,onRefresh:s.handlePageRefresh},null,8,["onEdit","onRefresh"]),(0,t.bF)(h,{onEdit:s.handleTunnelEdit,onRefresh:s.handleTunnelRefresh,onConnections:s.handleTunnelConnections},null,8,["onEdit","onRefresh","onConnections"]),s.tuntap.show?((0,t.uX)(),(0,t.Wv)(m,{key:0,onEdit:s.handleTuntapEdit,onRefresh:s.handleTuntapRefresh},null,8,["onEdit","onRefresh"])):(0,t.Q3)("",!0),s.socks5.show?((0,t.uX)(),(0,t.Wv)(p,{key:1,onEdit:s.handleSocks5Edit,onRefresh:s.handleSocks5Refresh},null,8,["onEdit","onRefresh"])):(0,t.Q3)("",!0),s.forward.show?((0,t.uX)(),(0,t.Wv)(w,{key:2,onEdit:s.handleForwardEdit,onSedit:s.handleSForwardEdit},null,8,["onEdit","onSedit"])):(0,t.Q3)("",!0),(0,t.bF)(k,{onRefresh:s.handlePageRefresh,onAccess:s.handleAccessEdit},null,8,["onRefresh","onAccess"])])),_:1},8,["data","height"]),(0,t.Lk)("div",o,[(0,t.Lk)("div",r,[(0,t.bF)(f,{small:"",background:"",layout:"total,sizes,prev,pager, next",total:s.devices.page.Count,"page-size":s.devices.page.Request.Size,"current-page":s.devices.page.Request.Page,onCurrentChange:s.handlePageChange,onSizeChange:s.handlePageSizeChange,"page-sizes":[10,20,50,100,255]},null,8,["total","page-size","current-page","onCurrentChange","onSizeChange"])])]),s.devices.showDeviceEdit?((0,t.uX)(),(0,t.Wv)(v,{key:0,modelValue:s.devices.showDeviceEdit,"onUpdate:modelValue":a[0]||(a[0]=e=>s.devices.showDeviceEdit=e),onChange:s.handlePageChange,data:s.devices.deviceInfo},null,8,["modelValue","onChange","data"])):(0,t.Q3)("",!0),s.devices.showAccessEdit?((0,t.uX)(),(0,t.Wv)(b,{key:1,modelValue:s.devices.showAccessEdit,"onUpdate:modelValue":a[1]||(a[1]=e=>s.devices.showAccessEdit=e),onChange:s.handlePageChange,data:s.devices.deviceInfo},null,8,["modelValue","onChange","data"])):(0,t.Q3)("",!0),s.tunnel.showEdit?((0,t.uX)(),(0,t.Wv)(C,{key:2,modelValue:s.tunnel.showEdit,"onUpdate:modelValue":a[2]||(a[2]=e=>s.tunnel.showEdit=e),onChange:s.handleTunnelRefresh},null,8,["modelValue","onChange"])):(0,t.Q3)("",!0),s.connections.showEdit?((0,t.uX)(),(0,t.Wv)(F,{key:3,modelValue:s.connections.showEdit,"onUpdate:modelValue":a[3]||(a[3]=e=>s.connections.showEdit=e)},null,8,["modelValue"])):(0,t.Q3)("",!0),s.tuntap.showEdit?((0,t.uX)(),(0,t.Wv)(E,{key:4,modelValue:s.tuntap.showEdit,"onUpdate:modelValue":a[4]||(a[4]=e=>s.tuntap.showEdit=e),onChange:s.handleTuntapRefresh},null,8,["modelValue","onChange"])):(0,t.Q3)("",!0),s.socks5.showEdit?((0,t.uX)(),(0,t.Wv)(L,{key:5,modelValue:s.socks5.showEdit,"onUpdate:modelValue":a[5]||(a[5]=e=>s.socks5.showEdit=e),onChange:s.handleSocks5Refresh},null,8,["modelValue","onChange"])):(0,t.Q3)("",!0),s.tuntap.showLease?((0,t.uX)(),(0,t.Wv)(_,{key:6,modelValue:s.tuntap.showLease,"onUpdate:modelValue":a[6]||(a[6]=e=>s.tuntap.showLease=e),onChange:s.handleTuntapRefresh},null,8,["modelValue","onChange"])):(0,t.Q3)("",!0),s.forward.showEdit?((0,t.uX)(),(0,t.Wv)(y,{key:7,modelValue:s.forward.showEdit,"onUpdate:modelValue":a[7]||(a[7]=e=>s.forward.showEdit=e)},null,8,["modelValue"])):(0,t.Q3)("",!0),s.sforward.showEdit?((0,t.uX)(),(0,t.Wv)(I,{key:8,modelValue:s.sforward.showEdit,"onUpdate:modelValue":a[8]||(a[8]=e=>s.sforward.showEdit=e)},null,8,["modelValue"])):(0,t.Q3)("",!0)])}l(4114);var d=l(3830),i=l(144),u=l(1219);function c(e,a,l,n,o,r){const s=(0,t.g2)("el-table-column"),d=(0,t.g2)("el-checkbox"),i=(0,t.g2)("el-table");return(0,t.uX)(),(0,t.Wv)(i,{border:"",style:{width:"100%"},height:"32px",size:"small",onSortChange:n.handleSortChange,class:"table-sort"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{prop:"MachineId",label:"设备名",width:"110",sortable:"custom"}),(0,t.bF)(s,{prop:"Version",label:"版本",width:"110",sortable:"custom"}),(0,t.bF)(s,{prop:"tunnel",label:"网关",width:"76",sortable:"custom"}),n.tuntap.show?((0,t.uX)(),(0,t.Wv)(s,{key:0,prop:"tuntap",label:"网卡IP",width:"160",sortable:"custom"})):(0,t.Q3)("",!0),n.socks5.show?((0,t.uX)(),(0,t.Wv)(s,{key:1,prop:"socks5",label:"代理转发",width:"160",sortable:"custom"})):(0,t.Q3)("",!0),(0,t.bF)(s,{label:"columns",fixed:"right"},{header:(0,t.k6)((()=>[(0,t.bF)(d,{modelValue:n.tuntap.show,"onUpdate:modelValue":a[0]||(a[0]=e=>n.tuntap.show=e),onChange:n.handleTuntapShow,size:"small",style:{"margin-right":"1rem"}},{default:(0,t.k6)((()=>[(0,t.eW)("网卡")])),_:1},8,["modelValue","onChange"]),(0,t.bF)(d,{modelValue:n.socks5.show,"onUpdate:modelValue":a[1]||(a[1]=e=>n.socks5.show=e),onChange:n.handleSocks5Show,size:"small",style:{"margin-right":"1rem"}},{default:(0,t.k6)((()=>[(0,t.eW)("代理")])),_:1},8,["modelValue","onChange"]),(0,t.bF)(d,{modelValue:n.forward.show,"onUpdate:modelValue":a[2]||(a[2]=e=>n.forward.show=e),onChange:n.handleForwardShow,size:"small",style:{"margin-right":"0rem"}},{default:(0,t.k6)((()=>[(0,t.eW)("转发")])),_:1},8,["modelValue","onChange"])])),_:1})])),_:1},8,["onSortChange"])}var h=l(7716);const m=Symbol(),p=()=>{(0,d.B)();const e=(0,i.KR)({show:!0,timer:0,showEdit:!1,machineId:null,list:{},hashcode:0});(0,t.Gt)(m,e);const a=()=>{(0,h.dS)()},l=()=>{(0,h.V1)(e.value.hashcode.toString()).then((a=>{e.value.hashcode=a.HashCode,a.List&&(e.value.list=a.List),e.value.timer=setTimeout(l,1020)})).catch((()=>{e.value.timer=setTimeout(l,1020)}))},n=a=>{e.value.machineId=a[0],e.value.machineName=a[1],e.value.showEdit=!0},o=()=>{clearTimeout(e.value.timer)};return{forward:e,_getForwardCountInfo:l,handleForwardEdit:n,clearForwardTimeout:o,handleForwardRefresh:a}},w=()=>(0,t.WQ)(m);var k=l(2173);const g=Symbol(),f=()=>{const e=(0,i.KR)({show:!0,timer:0,showEdit:!1,current:null,list:{},hashcode:0});(0,t.Gt)(g,e);const a=()=>{clearTimeout(e.value.timer),(0,k.$y)(e.value.hashcode.toString()).then((l=>{if(e.value.hashcode=l.HashCode,l.List){for(let e in l.List)Object.assign(l.List[e],{running:2==l.List[e].Status,loading:1==l.List[e].Status});e.value.list=l.List}e.value.timer=setTimeout(a,1100)})).catch((l=>{e.value.timer=setTimeout(a,1100)}))},l=a=>{e.value.current=a,e.value.showEdit=!0},n=()=>{(0,k.QP)()},o=()=>{clearTimeout(e.value.timer),e.value.timer=0},r=a=>Object.values(e.value.list).filter((e=>e.Port.toString().indexOf(a)>=0||e.Lans.filter((e=>e.IP.indexOf(a)>=0)).length>0)).map((e=>e.MachineId)),s=a=>{const l=Object.values(e.value.list).sort(((e,a)=>e.Port-a.Port));return l.map((e=>e.MachineId))};return{socks5:e,_getSocks5Info:a,handleSocks5Edit:l,handleSocks5Refresh:n,clearSocks5Timeout:o,getSocks5Machines:r,sortSocks5:s}},v=()=>(0,t.WQ)(g);var b=l(8104),C={emits:["sort"],setup(e,{emit:a}){const l=(0,b.W)();l.value.show="false"!=localStorage.getItem("tuntap.show");const t=v();t.value.show="false"!=localStorage.getItem("socks5.show");const n=w();n.value.show="false"!=localStorage.getItem("forward.show");const o=e=>{a("sort",e)},r=()=>{localStorage.setItem("tuntap.show",l.value.show)},s=()=>{localStorage.setItem("socks5.show",t.value.show)},d=()=>{localStorage.setItem("forward.show",n.value.show)};return{tuntap:l,socks5:t,forward:n,handleSortChange:o,handleTuntapShow:r,handleSocks5Show:s,handleForwardShow:d}}},F=l(1241);const E=(0,F.A)(C,[["render",c],["__scopeId","data-v-4b2df38c"]]);var L=E;const _=e=>((0,t.Qi)("data-v-6638f97d"),e=e(),(0,t.jt)(),e),y={class:"dropdown"},I=_((()=>(0,t.Lk)("span",null,"操作",-1)));function P(e,a,l,n,o,r){const s=(0,t.g2)("ArrowDown"),d=(0,t.g2)("el-icon"),i=(0,t.g2)("SwitchButton"),u=(0,t.g2)("el-dropdown-item"),c=(0,t.g2)("Delete"),h=(0,t.g2)("Flag"),m=(0,t.g2)("el-dropdown-menu"),p=(0,t.g2)("el-dropdown"),w=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(w,{label:"操作",fixed:"right"},{default:(0,t.k6)((e=>[(0,t.bF)(p,{size:"small"},{dropdown:(0,t.k6)((()=>[(0,t.bF)(m,null,{default:(0,t.k6)((()=>[e.row.showReboot&&n.hasReboot?((0,t.uX)(),(0,t.Wv)(u,{key:0,onClick:a=>n.handleExit(e.row.MachineId,e.row.MachineName)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(i)])),_:1}),(0,t.eW)(" 重启")])),_:2},1032,["onClick"])):(0,t.Q3)("",!0),e.row.showDel&&n.hasRemove?((0,t.uX)(),(0,t.Wv)(u,{key:1,onClick:a=>n.handleDel(e.row.MachineId,e.row.MachineName)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(c)])),_:1}),(0,t.eW)(" 删除")])),_:2},1032,["onClick"])):(0,t.Q3)("",!0),n.handleShowAccess(e.row,n.accessList[e.row.MachineId]||0)?((0,t.uX)(),(0,t.Wv)(u,{key:2,onClick:a=>n.handleAccess(e.row)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(h)])),_:1}),(0,t.eW)(" 权限")])),_:2},1032,["onClick"])):(0,t.Q3)("",!0)])),_:2},1024)])),default:(0,t.k6)((()=>[(0,t.Lk)("div",y,[I,(0,t.bF)(d,{class:"el-icon--right"},{default:(0,t.k6)((()=>[(0,t.bF)(s)])),_:1})])])),_:2},1024)])),_:1})}var V=l(9299),S=l(920),T=l(7477),M=l(2933),R=l(5962),W={emits:["refresh","access"],components:{Delete:T.epd,SwitchButton:T.L$q,ArrowDown:T.yd$,Flag:T.lNU},setup(e,{emit:a}){const l=(0,d.B)(),n=(0,R.q)(),o=(0,t.EW)((()=>l.value.config.Client.Access)),r=(0,t.EW)((()=>l.value.hasAccess("Access"))),s=(0,t.EW)((()=>n.value.list)),i=(0,t.EW)((()=>l.value.hasAccess("Reboot"))),u=(0,t.EW)((()=>l.value.hasAccess("Remove"))),c=(e,l)=>{M.s.confirm(`确认删除[${l}]?`,"提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((()=>{(0,V.Se)(e).then((()=>{a("refresh")}))})).catch((()=>{}))},h=(e,l)=>{M.s.confirm(`确认关闭[${l}]?`,"提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((()=>{(0,S.NS)(e).then((()=>{a("refresh")}))})).catch((()=>{}))},m=(e,a)=>e.showAccess&&r.value&&a>=0&&0==+(~BigInt(o.value)&BigInt(a)).toString(),p=e=>{a("access",e)};return{accessList:s,handleDel:c,handleExit:h,hasReboot:i,hasRemove:u,hasAccess:r,handleShowAccess:m,handleAccess:p}}};const X=(0,F.A)(W,[["render",P],["__scopeId","data-v-6638f97d"]]);var A=X,B=l(4232);const N=e=>((0,t.Qi)("data-v-5db71b03"),e=e(),(0,t.jt)(),e),x={class:"flex"},z=N((()=>(0,t.Lk)("span",{class:"flex-1"},"设备",-1))),U={class:"flex"},D=["onClick"],K=["onClick"],Q=N((()=>(0,t.Lk)("span",null,"😴㊙.㊙.㊙.㊙",-1))),O=[Q],G=N((()=>(0,t.Lk)("span",{class:"flex-1"},null,-1)));function $(e,a,l,n,o,r){const s=(0,t.g2)("el-input"),d=(0,t.g2)("Search"),i=(0,t.g2)("el-icon"),u=(0,t.g2)("el-button"),c=(0,t.g2)("DeviceName"),h=(0,t.g2)("UpdaterBtn"),m=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(m,{prop:"MachineId",label:"设备",width:"220"},{header:(0,t.k6)((()=>[(0,t.Lk)("div",x,[z,(0,t.Lk)("span",null,[(0,t.bF)(s,{size:"small",modelValue:n.name,"onUpdate:modelValue":a[0]||(a[0]=e=>n.name=e),clearable:"",onInput:n.handleRefresh,placeholder:"设备/虚拟网卡/端口转发"},null,8,["modelValue","onInput"])]),(0,t.Lk)("span",null,[(0,t.bF)(u,{size:"small",onClick:n.handleRefresh},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(d)])),_:1})])),_:1},8,["onClick"])])])])),default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("p",null,[(0,t.bF)(c,{onEdit:n.handleEdit,config:!0,item:e.row},null,8,["onEdit","item"])]),(0,t.Lk)("p",U,[e.row.showip?((0,t.uX)(),(0,t.CE)("span",{key:0,title:"此设备的外网IP",class:"ipaddress",onClick:a=>n.handleExternal(e.row)},[(0,t.Lk)("span",null,"😀"+(0,B.v_)(e.row.IP),1)],8,D)):((0,t.uX)(),(0,t.CE)("span",{key:1,title:"此设备的外网IP",class:"ipaddress",onClick:a=>n.handleExternal(e.row)},O,8,K)),G,0==e.row.showip?((0,t.uX)(),(0,t.Wv)(h,{key:2,config:!0,item:e.row},null,8,["item"])):(0,t.Q3)("",!0)])])])),_:1})}var q=l(167),j=l(3347),Y={emits:["edit","refresh"],components:{Search:T.vji,UpdaterBtn:q.A,DeviceName:j.A},setup(e,{emit:a}){const l=(0,d.B)(),n=(0,t.EW)((()=>l.value.hasAccess("ExternalShow"))),o=(0,i.KR)(sessionStorage.getItem("search-name")||""),r=e=>{n.value&&(e.showip=!e.showip)},s=e=>{a("edit",e)},u=()=>{sessionStorage.setItem("search-name",o.value),a("refresh",o.value)};return{handleEdit:s,handleRefresh:u,name:o,handleExternal:r}}};const H=(0,F.A)(Y,[["render",$],["__scopeId","data-v-5db71b03"]]);var J=H;const Z=(0,t.Lk)("div",null,"修改后最好能重启一次客户端",-1),ee={class:"t-c w-100"};function ae(e,a,l,n,o,r){const s=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-input"),i=(0,t.g2)("el-button"),u=(0,t.g2)("el-form"),c=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(c,{modelValue:n.state.show,"onUpdate:modelValue":a[2]||(a[2]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:`设置[${n.state.ruleForm.MachineName}]设备`,width:"300"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(u,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"auto"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:""},{default:(0,t.k6)((()=>[Z])),_:1}),(0,t.bF)(s,{label:"设备名",prop:"MachineName"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{maxlength:"12","show-word-limit":"",modelValue:n.state.ruleForm.MachineName,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.ruleForm.MachineName=e)},null,8,["modelValue"])])),_:1}),(0,t.bF)(s,{label:"",prop:"Btns"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",ee,[(0,t.bF)(i,{onClick:a[1]||(a[1]=e=>n.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(i,{type:"primary",onClick:n.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue","title"])}var le={props:["data","modelValue"],emits:["change","update:modelValue"],setup(e,{emit:a}){const l=(0,i.KR)(null),n=(0,i.Kh)({show:!0,ruleForm:{MachineName1:e.data.MachineName,MachineName:e.data.MachineName},rules:{}});(0,t.wB)((()=>n.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const o=()=>{e.data.MachineName!=n.ruleForm.MachineName&&(0,V.gC)({Id:e.data.MachineId,newName:n.ruleForm.MachineName}).then((()=>{n.show=!1,u.nk.success("已操作!"),a("change")})).catch((e=>{console.log(e),u.nk.error("操作失败!")}))};return{state:n,ruleFormRef:l,handleSave:o}}};const te=(0,F.A)(le,[["render",ae]]);var ne=te,oe=l(7985);function re(e,a,l,n,o,r){const s=(0,t.g2)("Access"),d=(0,t.g2)("el-button"),i=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(i,{modelValue:n.state.show,"onUpdate:modelValue":a[1]||(a[1]=e=>n.state.show=e),"close-on-click-modal":!1,center:"","append-to":".app-wrap",title:`设置[${n.machineName}]的权限`,width:"580",top:"1vh"},{footer:(0,t.k6)((()=>[(0,t.bF)(d,{plain:"",onClick:a[0]||(a[0]=e=>n.state.show=!1),loading:n.state.loading},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1},8,["loading"]),(0,t.bF)(d,{type:"success",plain:"",onClick:n.handleSave,loading:n.state.loading},{default:(0,t.k6)((()=>[(0,t.eW)("确定保存")])),_:1},8,["onClick","loading"])])),default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(s,{machineid:n.machineid,ref:"accessDom"},null,8,["machineid"])])])),_:1},8,["modelValue","title"])}var se=l(3363),de=l(9593),ie={props:["data","modelValue"],emits:["change","update:modelValue"],components:{Access:de.A},setup(e,{emit:a}){const l=(0,i.Kh)({show:!0,loading:!1});(0,t.wB)((()=>l.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const n=(0,i.KR)(null),o=()=>{l.loading=!0,(0,se.ZK)({ToMachineId:e.data.MachineId,Access:n.value.getValue()}).then((()=>{l.loading=!1,l.show=!1,u.nk.success("已操作!"),a("change")})).catch((e=>{console.log(e),l.loading=!1,u.nk.error("操作失败!")}))};return{machineName:e.data.MachineName,machineid:e.data.MachineId,state:l,accessDom:n,handleSave:o}}};const ue=(0,F.A)(ie,[["render",re]]);var ce=ue;const he={key:0};function me(e,a,l,n,o,r){const s=(0,t.g2)("TuntapShow"),d=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(d,{prop:"tuntap",label:"虚拟网卡",width:"160"},{header:(0,t.k6)((()=>[(0,t.Lk)("a",{href:"javascript:;",class:"a-line",onClick:a[0]||(a[0]=(...e)=>n.handleShowLease&&n.handleShowLease(...e))},"虚拟网卡")])),default:(0,t.k6)((e=>[n.tuntap.list[e.row.MachineId]?((0,t.uX)(),(0,t.CE)("div",he,[(0,t.bF)(s,{config:!0,item:e.row,onEdit:n.handleTuntapIP,onRefresh:n.handleTuntapRefresh},null,8,["item","onEdit","onRefresh"])])):(0,t.Q3)("",!0)])),_:1})}var pe=l(9636),we={emits:["edit","refresh"],components:{TuntapShow:pe.A},setup(e,{emit:a}){const l=(0,b.W)(),t=e=>{a("edit",e)},n=()=>{a("refresh")},o=()=>{l.value.showLease=!0};return{tuntap:l,handleTuntapIP:t,handleTuntapRefresh:n,handleShowLease:o}}};const ke=(0,F.A)(we,[["render",me]]);var ge=ke;const fe=e=>((0,t.Qi)("data-v-34275839"),e=e(),(0,t.jt)(),e),ve=fe((()=>(0,t.Lk)("span",null,"/",-1))),be=fe((()=>(0,t.Lk)("span",{style:{width:"2rem"}},null,-1))),Ce={key:0,class:"upgrade-wrap"},Fe={class:"w-100 t-c"};function Ee(e,a,l,n,o,r){const s=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-input"),i=(0,t.g2)("el-checkbox"),u=(0,t.g2)("TuntapLan"),c=(0,t.g2)("TuntapForward"),h=(0,t.g2)("el-button"),m=(0,t.g2)("el-form"),p=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(p,{modelValue:n.state.show,"onUpdate:modelValue":a[7]||(a[7]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:`设置[${n.state.machineName}]组网`,top:"1vh",width:"760"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(m,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"8rem"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{prop:"gateway",class:"m-b-0"},{default:(0,t.k6)((()=>[(0,t.eW)("赐予此设备IP,其它设备可通过此IP访问")])),_:1}),(0,t.bF)(s,{label:"虚拟网卡IP",prop:"IP"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{modelValue:n.state.ruleForm.IP,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.ruleForm.IP=e),style:{width:"14rem"}},null,8,["modelValue"]),ve,(0,t.bF)(d,{onChange:n.handlePrefixLengthChange,modelValue:n.state.ruleForm.PrefixLength,"onUpdate:modelValue":a[1]||(a[1]=e=>n.state.ruleForm.PrefixLength=e),style:{width:"4rem"}},null,8,["onChange","modelValue"]),be,(0,t.bF)(i,{modelValue:n.state.ruleForm.ShowDelay,"onUpdate:modelValue":a[2]||(a[2]=e=>n.state.ruleForm.ShowDelay=e),label:"显示延迟",size:"large",style:{"margin-right":"1rem"}},null,8,["modelValue"]),(0,t.bF)(i,{modelValue:n.state.ruleForm.AutoConnect,"onUpdate:modelValue":a[3]||(a[3]=e=>n.state.ruleForm.AutoConnect=e),label:"自动连接",size:"large",style:{"margin-right":"1rem"}},null,8,["modelValue"]),(0,t.bF)(i,{modelValue:n.state.ruleForm.Multicast,"onUpdate:modelValue":a[4]||(a[4]=e=>n.state.ruleForm.Multicast=e),label:"禁用UDP广播",size:"large"},null,8,["modelValue"])])),_:1}),(0,t.bF)(s,{prop:"upgrade",class:"m-b-0"},{default:(0,t.k6)((()=>[(0,t.bF)(i,{modelValue:n.state.ruleForm.Upgrade,"onUpdate:modelValue":a[5]||(a[5]=e=>n.state.ruleForm.Upgrade=e),label:"我很懂,我要使用高级功能(点对网和网对网)",size:"large"},null,8,["modelValue"])])),_:1}),n.state.ruleForm.Upgrade?((0,t.uX)(),(0,t.CE)("div",Ce,[(0,t.bF)(s,{label:"局域网IP",prop:"LanIP",class:"m-b-0",style:{"border-bottom":"1px solid #ddd"}},{default:(0,t.k6)((()=>[(0,t.bF)(u,{ref:"lanDom"},null,512)])),_:1}),(0,t.bF)(s,{label:"端口转发",prop:"forwards"},{default:(0,t.k6)((()=>[(0,t.bF)(c,{ref:"forwardDom"},null,512)])),_:1})])):(0,t.Q3)("",!0),(0,t.bF)(s,{label:"",prop:"Btns","label-width":"0"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",Fe,[(0,t.bF)(h,{onClick:a[6]||(a[6]=e=>n.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(h,{type:"primary",onClick:n.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue","title"])}var Le=l(5241);const _e=e=>((0,t.Qi)("data-v-786fe646"),e=e(),(0,t.jt)(),e),ye={class:"w-100"},Ie=_e((()=>(0,t.Lk)("span",{class:"yellow"},"此设备无法使用NAT转发,或只想使用端口转发",-1))),Pe={key:0,class:"green"},Ve={class:"wrap"},Se=["title"],Te={key:1},Me=["title"],Re={key:1},We=["title"],Xe={key:1},Ae={key:1,class:"remark"};function Be(e,a,l,n,o,r){const s=(0,t.g2)("el-input"),d=(0,t.g2)("el-table-column"),i=(0,t.g2)("Delete"),u=(0,t.g2)("el-icon"),c=(0,t.g2)("el-button"),h=(0,t.g2)("el-popconfirm"),m=(0,t.g2)("Plus"),p=(0,t.g2)("el-table");return(0,t.uX)(),(0,t.CE)("div",ye,[(0,t.Lk)("div",null,[Ie,n.state.testing?((0,t.uX)(),(0,t.CE)("span",Pe,"、testing")):(0,t.Q3)("",!0)]),(0,t.Lk)("div",Ve,[(0,t.bF)(p,{stripe:"",data:n.state.forwards,border:"",size:"small",width:"100%",height:"300px",onCellDblclick:n.handleCellClick},{default:(0,t.k6)((()=>[(0,t.bF)(d,{prop:"ListenPort",label:"源端口",width:"60"},{default:(0,t.k6)((e=>[e.row.ListenPortEditing?((0,t.uX)(),(0,t.Wv)(s,{key:0,autofocus:"",size:"small",modelValue:e.row.ListenPort,"onUpdate:modelValue":a=>e.row.ListenPort=a,onBlur:a=>n.handleEditBlur(e.row,"ListenPort")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,B.v_)(e.row.ListenPort),9,Se)):((0,t.uX)(),(0,t.CE)("span",Te,(0,B.v_)(e.row.ListenPort),1))],64))])),_:1}),(0,t.bF)(d,{prop:"ConnectAddr",label:"目标IP",width:"120"},{default:(0,t.k6)((e=>[e.row.ConnectAddrEditing?((0,t.uX)(),(0,t.Wv)(s,{key:0,autofocus:"",size:"small",modelValue:e.row.ConnectAddr,"onUpdate:modelValue":a=>e.row.ConnectAddr=a,onBlur:a=>n.handleEditBlur(e.row,"ConnectAddr")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,B.v_)(e.row.ConnectAddr),9,Me)):((0,t.uX)(),(0,t.CE)("span",Re,(0,B.v_)(e.row.ConnectAddr),1))],64))])),_:1}),(0,t.bF)(d,{prop:"ConnectPort",label:"目标端口",width:"80"},{default:(0,t.k6)((e=>[e.row.ConnectPortEditing?((0,t.uX)(),(0,t.Wv)(s,{key:0,autofocus:"",size:"small",modelValue:e.row.ConnectPort,"onUpdate:modelValue":a=>e.row.ConnectPort=a,onBlur:a=>n.handleEditBlur(e.row,"ConnectPort")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,B.v_)(e.row.ConnectPort),9,We)):((0,t.uX)(),(0,t.CE)("span",Xe,(0,B.v_)(e.row.ConnectPort),1))],64))])),_:1}),(0,t.bF)(d,{prop:"Remark",label:"备注"},{default:(0,t.k6)((e=>[e.row.RemarkEditing?((0,t.uX)(),(0,t.Wv)(s,{key:0,autofocus:"",size:"small",modelValue:e.row.Remark,"onUpdate:modelValue":a=>e.row.Remark=a,onBlur:a=>n.handleEditBlur(e.row,"Remark")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("div",Ae,(0,B.v_)(e.row.Remark),1))])),_:1}),(0,t.bF)(d,{prop:"Oper",label:"操作",width:"110"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.bF)(h,{title:"删除不可逆,是否确认?",onConfirm:a=>n.handleDel(e.$index)},{reference:(0,t.k6)((()=>[(0,t.bF)(c,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(u,null,{default:(0,t.k6)((()=>[(0,t.bF)(i)])),_:1})])),_:1})])),_:2},1032,["onConfirm"]),(0,t.bF)(c,{type:"primary",size:"small",onClick:a=>n.handleAdd(e.$index)},{default:(0,t.k6)((()=>[(0,t.bF)(u,null,{default:(0,t.k6)((()=>[(0,t.bF)(m)])),_:1})])),_:2},1032,["onClick"])])])),_:1})])),_:1},8,["data","onCellDblclick"])])])}var Ne={props:["modelValue"],emits:["update:modelValue"],components:{Delete:T.epd,Plus:T.FWt,Warning:T.N5l,Refresh:T.C42},setup(e){const a=(0,b.W)(),l=(0,i.Kh)({machineName:a.value.current.device.MachineName,forwards:0==a.value.current.Forwards.length?[{ListenAddr:"0.0.0.0",ListenPort:0,ConnectAddr:"0.0.0.0",ConnectPort:0,Remark:""}]:a.value.current.Forwards.slice(0),timer:0,testing:!1}),n=(e,a)=>{o(e,a.property)},o=(e,a)=>{l.forwards.forEach((e=>{e["ListenAddrEditing"]=!1,e["ListenPortEditing"]=!1,e["ConnectAddrEditing"]=!1,e["ConnectPortEditing"]=!1,e["RemarkEditing"]=!1})),e[`${a}Editing`]=!0,e["__editing"]=!0},r=(e,a)=>{e[`${a}Editing`]=!1,e["__editing"]=!1},s=e=>{1==l.forwards.length?l.forwards[0]={ListenAddr:"0.0.0.0",ListenPort:0,ConnectAddr:"0.0.0.0",ConnectPort:0,Remark:""}:l.forwards.splice(e,1)},d=e=>{l.forwards.filter((e=>"0.0.0.0"==e.ConnectAddr||0==e.ConnectPort||0==e.ListenPort)).length>0||l.forwards.splice(e+1,0,{ListenAddr:"0.0.0.0",ListenPort:0,ConnectAddr:"0.0.0.0",ConnectPort:0,Remark:""})},u=()=>{clearTimeout(l.timer),l.testing=!0,(0,Le._)({MachineId:a.value.current.MachineId,List:l.forwards.map((e=>({ListenAddr:e.ListenAddr,ListenPort:+e.ListenPort,ConnectAddr:e.ConnectAddr,ConnectPort:+e.ConnectPort})))}).then((e=>{var a=e.List;for(let t=0;t${e.ConnectAddr}:${e.ConnectPort}`,o=l.forwards.filter((e=>`${e.ListenPort}->${e.ConnectAddr}:${e.ConnectPort}`==n));for(let a=0;a{l.testing=!1,l.timer=setTimeout(u,3e3)}))};(0,t.sV)((()=>{u()})),(0,t.hi)((()=>{clearTimeout(l.timer)}));const c=()=>l.forwards.map((e=>(e.ListenPort=+e.ListenPort,e.ConnectPort=+e.ConnectPort,e)));return{state:l,handleCellClick:n,handleEditBlur:r,handleDel:s,handleAdd:d,getData:c}}};const xe=(0,F.A)(Ne,[["render",Be],["__scopeId","data-v-786fe646"]]);var ze=xe;const Ue=e=>((0,t.Qi)("data-v-4abaaeaf"),e=e(),(0,t.jt)(),e),De={class:"w-100"},Ke=Ue((()=>(0,t.Lk)("div",null,[(0,t.Lk)("span",{class:"yellow"},"填写局域网IP,使用NAT转发")],-1))),Qe={class:"wrap"},Oe=Ue((()=>(0,t.Lk)("span",null,"/",-1))),Ge={class:"pdl-10"},$e={class:"pdl-10"};function qe(e,a,l,n,o,r){const s=(0,t.g2)("el-input"),d=(0,t.g2)("el-checkbox"),i=(0,t.g2)("Delete"),u=(0,t.g2)("el-icon"),c=(0,t.g2)("el-button"),h=(0,t.g2)("Plus");return(0,t.uX)(),(0,t.CE)("div",De,[Ke,(0,t.Lk)("div",Qe,[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(n.state.lans,((e,a)=>((0,t.uX)(),(0,t.CE)("div",{key:a,class:"flex",style:{"margin-bottom":".6rem"}},[(0,t.Lk)("div",null,[(0,t.bF)(s,{modelValue:e.IP,"onUpdate:modelValue":a=>e.IP=a,style:{width:"14rem"}},null,8,["modelValue","onUpdate:modelValue"]),Oe,(0,t.bF)(s,{onChange:e=>n.handleMaskChange(a),modelValue:e.PrefixLength,"onUpdate:modelValue":a=>e.PrefixLength=a,style:{width:"4rem"}},null,8,["onChange","modelValue","onUpdate:modelValue"])]),(0,t.Lk)("div",Ge,[(0,t.bF)(d,{modelValue:e.Disabled,"onUpdate:modelValue":a=>e.Disabled=a,label:"禁用记录",style:{"vertical-align":"middle"}},null,8,["modelValue","onUpdate:modelValue"])]),(0,t.Lk)("div",$e,[(0,t.bF)(c,{type:"danger",onClick:e=>n.handleDel(a),size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(u,null,{default:(0,t.k6)((()=>[(0,t.bF)(i)])),_:1})])),_:2},1032,["onClick"]),(0,t.bF)(c,{type:"primary",onClick:e=>n.handleAdd(a),size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(u,null,{default:(0,t.k6)((()=>[(0,t.bF)(h)])),_:1})])),_:2},1032,["onClick"])])])))),128))])])}var je={props:["modelValue"],emits:["update:modelValue"],components:{Delete:T.epd,Plus:T.FWt,Warning:T.N5l,Refresh:T.C42},setup(e){const a=(0,b.W)(),l=(0,i.Kh)({lans:a.value.current.Lans.slice(0)});0==l.lans.length&&l.lans.push({IP:"0.0.0.0",PrefixLength:24});const t=e=>{var a=+l.lans[e].PrefixLength;(a>32||a<16||isNaN(a))&&(a=24),l.lans[e].PrefixLength=a},n=e=>{l.lans.splice(e,1),0==l.lans.length&&o(0)},o=e=>{l.lans.splice(e+1,0,{IP:"0.0.0.0",PrefixLength:24})},r=()=>l.lans.map((e=>(e.PrefixLength=+e.PrefixLength,e)));return{state:l,handleMaskChange:t,handleDel:n,handleAdd:o,getData:r}}};const Ye=(0,F.A)(je,[["render",qe],["__scopeId","data-v-4abaaeaf"]]);var He=Ye,Je={props:["modelValue"],emits:["change","update:modelValue"],components:{Delete:T.epd,Plus:T.FWt,Warning:T.N5l,Refresh:T.C42,TuntapForward:ze,TuntapLan:He},setup(e,{emit:a}){const l=(0,d.B)(),n=(0,b.W)(),o=(0,i.KR)(null),r=(0,i.Kh)({show:!0,machineName:n.value.current.device.MachineName,bufferSize:l.value.bufferSize,ruleForm:{IP:n.value.current.IP,PrefixLength:n.value.current.PrefixLength||24,Gateway:n.value.current.Gateway,ShowDelay:n.value.current.ShowDelay,AutoConnect:n.value.current.AutoConnect,Upgrade:n.value.current.Upgrade,Multicast:n.value.current.Multicast,Forwards:n.value.current.Forwards},rules:{}});(0,t.wB)((()=>r.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const s=()=>{var e=+r.ruleForm.PrefixLength;(e>32||e<16||isNaN(e))&&(e=24),r.ruleForm.PrefixLength=e},c=(0,i.KR)(null),h=(0,i.KR)(null),m=()=>{const e=JSON.parse(JSON.stringify(n.value.current));e.IP=r.ruleForm.IP.replace(/\s/g,"")||"0.0.0.0",e.Lans=c.value?c.value.getData():n.value.current.Lans,e.PrefixLength=+r.ruleForm.PrefixLength,e.Gateway=r.ruleForm.Gateway,e.ShowDelay=r.ruleForm.ShowDelay,e.AutoConnect=r.ruleForm.AutoConnect,e.Upgrade=r.ruleForm.Upgrade,e.Multicast=r.ruleForm.Multicast,e.Forwards=h.value?h.value.getData():n.value.current.Forwards,(0,Le.ac)(e).then((()=>{r.show=!1,u.nk.success("已操作!"),a("change")})).catch((e=>{console.log(e),u.nk.error("操作失败!")}))};return{state:r,ruleFormRef:o,handlePrefixLengthChange:s,handleSave:m,lanDom:c,forwardDom:h}}};const Ze=(0,F.A)(Je,[["render",Ee],["__scopeId","data-v-34275839"]]);var ea=Ze;const aa=e=>((0,t.Qi)("data-v-4a28804a"),e=e(),(0,t.jt)(),e),la=aa((()=>(0,t.Lk)("p",null,"网络租期30天、IP租期7天",-1))),ta=aa((()=>(0,t.Lk)("span",null,"/",-1))),na=aa((()=>(0,t.Lk)("span",{style:{width:"1rem"}},null,-1))),oa={class:"calc"},ra=aa((()=>(0,t.Lk)("span",{class:"label"},"网络号",-1))),sa={class:"value"},da=aa((()=>(0,t.Lk)("span",{class:"label"},"网关",-1))),ia={class:"value"},ua=aa((()=>(0,t.Lk)("span",{class:"label"},"开始IP",-1))),ca={class:"value"},ha=aa((()=>(0,t.Lk)("span",{class:"label"},"结束IP",-1))),ma={class:"value"},pa=aa((()=>(0,t.Lk)("span",{class:"label"},"广播号",-1))),wa={class:"value"},ka=aa((()=>(0,t.Lk)("span",{class:"label"},"IP数量",-1))),ga={class:"value"};function fa(e,a,l,n,o,r){const s=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-input"),i=(0,t.g2)("el-button"),u=(0,t.g2)("el-form"),c=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(c,{modelValue:n.state.show,"onUpdate:modelValue":a[3]||(a[3]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:"配置本组的网络",top:"1vh",width:"400"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(u,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"100"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{prop:"gateway"},{default:(0,t.k6)((()=>[la])),_:1}),(0,t.bF)(s,{label:"网络和掩码",prop:"IP"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{modelValue:n.state.ruleForm.IP,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.ruleForm.IP=e),style:{width:"14rem"},onChange:n.handlePrefixLengthChange},null,8,["modelValue","onChange"]),ta,(0,t.bF)(d,{onChange:n.handlePrefixLengthChange,modelValue:n.state.ruleForm.PrefixLength,"onUpdate:modelValue":a[1]||(a[1]=e=>n.state.ruleForm.PrefixLength=e),style:{width:"4rem"}},null,8,["onChange","modelValue"]),na,(0,t.bF)(i,{onClick:n.handleClear},{default:(0,t.k6)((()=>[(0,t.eW)("清除")])),_:1},8,["onClick"])])),_:1}),(0,t.bF)(s,{label:"",prop:"IP1"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",oa,[(0,t.Lk)("p",null,[ra,(0,t.Lk)("span",sa,(0,B.v_)(n.state.values.Network),1)]),(0,t.Lk)("p",null,[da,(0,t.Lk)("span",ia,(0,B.v_)(n.state.values.Gateway),1)]),(0,t.Lk)("p",null,[ua,(0,t.Lk)("span",ca,(0,B.v_)(n.state.values.Start),1)]),(0,t.Lk)("p",null,[ha,(0,t.Lk)("span",ma,(0,B.v_)(n.state.values.End),1)]),(0,t.Lk)("p",null,[pa,(0,t.Lk)("span",wa,(0,B.v_)(n.state.values.Broadcast),1)]),(0,t.Lk)("p",null,[ka,(0,t.Lk)("span",ga,(0,B.v_)(n.state.values.Count),1)])])])),_:1}),n.hasLease?((0,t.uX)(),(0,t.Wv)(s,{key:0,label:"",prop:"Btns"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(i,{onClick:a[2]||(a[2]=e=>n.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(i,{type:"primary",onClick:n.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})):(0,t.Q3)("",!0)])),_:1},8,["model","rules"])])])),_:1},8,["modelValue"])}var va={props:["modelValue"],emits:["change","update:modelValue"],components:{Delete:T.epd,Plus:T.FWt},setup(e,{emit:a}){const l=(0,d.B)(),n=(0,t.EW)((()=>l.value.hasAccess("Lease"))),o=(0,i.KR)(null),r=(0,i.Kh)({show:!0,ruleForm:{IP:"0.0.0.0",PrefixLength:24},rules:{},values:{}});(0,t.wB)((()=>r.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const s=()=>{(0,Le.w0)(r.ruleForm).then((e=>{r.values=e}))},c=()=>{(0,Le.Nj)().then((e=>{r.ruleForm.IP=e.IP,r.ruleForm.PrefixLength=e.PrefixLength,s()}))},h=()=>{var e=+r.ruleForm.PrefixLength;(e>32||e<16||isNaN(e))&&(e=24),r.ruleForm.PrefixLength=e,s()},m=()=>{(0,Le.AE)(r.ruleForm).then((()=>{u.nk.success("已操作"),r.show=!1})).catch((e=>{console.log(e),u.nk.error("操作失败")}))},p=()=>{(0,Le.AE)({IP:"0.0.0.0",PrefixLength:24}).then((()=>{u.nk.success("已操作"),c()})).catch((e=>{console.log(e),u.nk.error("操作失败")}))};return(0,t.sV)((()=>{c()})),{state:r,hasLease:n,ruleFormRef:o,handleSave:m,handlePrefixLengthChange:h,handleClear:p}}};const ba=(0,F.A)(va,[["render",fa],["__scopeId","data-v-4a28804a"]]);var Ca=ba;const Fa={key:0};function Ea(e,a,l,n,o,r){const s=(0,t.g2)("Socks5Show"),d=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(d,{prop:"socks5",label:"代理转发",width:"160"},{default:(0,t.k6)((e=>[n.socks5.list[e.row.MachineId]?((0,t.uX)(),(0,t.CE)("div",Fa,[(0,t.bF)(s,{config:!0,item:e.row,onEdit:n.handleSocks5,onRefresh:n.handleSocks5Refresh},null,8,["item","onEdit","onRefresh"])])):(0,t.Q3)("",!0)])),_:1})}const La={class:"flex"},_a={class:"flex-1"},ya={key:0,class:"point p2p",title:"打洞直连"},Ia={key:1,class:"point relay",title:"中继连接"},Pa={key:2,class:"point node",title:"节点连接"},Va={key:1,class:"point",title:"未连接"},Sa=["title"],Ta={key:0,class:"green gateway"},Ma={key:1},Ra={key:0},Wa={key:0,class:"flex yellow",title:"已禁用"},Xa={key:1,class:"flex red",title:"与其它设备填写IP、或本机局域网IP有冲突"};function Aa(e,a,l,n,o,r){const s=(0,t.g2)("Loading"),d=(0,t.g2)("el-icon"),i=(0,t.g2)("el-switch");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("div",La,[(0,t.Lk)("div",_a,[n.connections.list[n.item.MachineId]&&n.connections.list[n.item.MachineId].Connected?((0,t.uX)(),(0,t.CE)(t.FK,{key:0},[0==n.connections.list[n.item.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",ya)):1==n.connections.list[n.item.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",Ia)):2==n.connections.list[n.item.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",Pa)):(0,t.Q3)("",!0)],64)):((0,t.uX)(),(0,t.CE)("span",Va)),(0,t.Lk)("a",{href:"javascript:;",class:"a-line",onClick:a[0]||(a[0]=e=>n.handleSocks5Port(n.socks5.list[n.item.MachineId])),title:"此设备的socks5代理"},[n.socks5.list[n.item.MachineId].SetupError?((0,t.uX)(),(0,t.CE)("strong",{key:0,class:"red",title:n.socks5.list[n.item.MachineId].SetupError}," socks5://*:"+(0,B.v_)(n.socks5.list[n.item.MachineId].Port),9,Sa)):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[n.socks5.list[n.item.MachineId].running?((0,t.uX)(),(0,t.CE)("strong",Ta,"socks5://*:"+(0,B.v_)(n.socks5.list[n.item.MachineId].Port),1)):((0,t.uX)(),(0,t.CE)("span",Ma,"socks5://*:"+(0,B.v_)(n.socks5.list[n.item.MachineId].Port),1))],64))])]),n.socks5.list[n.item.MachineId].loading?((0,t.uX)(),(0,t.CE)("div",Ra,[(0,t.bF)(d,{size:"14",class:"loading"},{default:(0,t.k6)((()=>[(0,t.bF)(s)])),_:1})])):((0,t.uX)(),(0,t.Wv)(i,{key:1,modelValue:n.socks5.list[n.item.MachineId].running,"onUpdate:modelValue":a[1]||(a[1]=e=>n.socks5.list[n.item.MachineId].running=e),loading:n.socks5.list[n.item.MachineId].loading,disabled:"",onClick:a[2]||(a[2]=e=>n.handleSocks5(n.socks5.list[n.item.MachineId])),size:"small","inline-prompt":"","active-text":"😀","inactive-text":"😣"},null,8,["modelValue","loading"]))]),(0,t.Lk)("div",null,[(0,t.Lk)("div",null,[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(n.socks5.list[n.item.MachineId].Lans,((e,a)=>((0,t.uX)(),(0,t.CE)(t.FK,{key:a},[e.Disabled?((0,t.uX)(),(0,t.CE)("div",Wa,(0,B.v_)(e.IP)+" / "+(0,B.v_)(e.PrefixLength),1)):e.Exists?((0,t.uX)(),(0,t.CE)("div",Xa,(0,B.v_)(e.IP)+" / "+(0,B.v_)(e.PrefixLength),1)):((0,t.uX)(),(0,t.CE)("div",{key:2,class:(0,B.C4)(["flex",{green:n.socks5.list[n.item.MachineId].running}]),title:"正常使用"},(0,B.v_)(e.IP)+" / "+(0,B.v_)(e.PrefixLength),3))],64)))),128))])])])}var Ba=l(9983),Na={props:["item","config"],emits:["edit","refresh"],components:{Loading:T.Rhj},setup(e,{emit:a}){const l=v(),n=(0,d.B)(),o=(0,t.EW)((()=>n.value.config.Client.Id)),r=(0,t.EW)((()=>n.value.hasAccess("Socks5ChangeSelf"))),s=(0,t.EW)((()=>n.value.hasAccess("Socks5ChangeOther"))),i=(0,t.EW)((()=>n.value.hasAccess("Socks5StatusSelf"))),c=(0,t.EW)((()=>n.value.hasAccess("Socks5StatusOther"))),h=(0,Ba.bB)(),m=a=>{if(!e.config)return;if(o.value===a.MachineId){if(!i.value)return}else if(!c.value)return;const l=a.running?(0,k.R2)(a.MachineId):(0,k.qH)(a.MachineId);a.loading=!0,l.then((()=>{u.nk.success("操作成功!")})).catch((e=>{console.log(e),u.nk.error("操作失败!")}))},p=l=>{if(e.config||o.value==l.MachineId){if(o.value===l.MachineId){if(!r.value)return}else if(!s.value)return;l.device=e.item,a("edit",l)}},w=()=>{a("refresh")};return{item:(0,t.EW)((()=>e.item)),socks5:l,connections:h,handleSocks5:m,handleSocks5Port:p,handleSocks5Refresh:w}}};const xa=(0,F.A)(Na,[["render",Aa],["__scopeId","data-v-c1ea089c"]]);var za=xa,Ua={emits:["edit","refresh"],components:{Socks5Show:za},setup(e,{emit:a}){const l=v(),t=e=>{a("edit",e)},n=()=>{a("refresh")};return{socks5:l,handleSocks5:t,handleSocks5Refresh:n}}};const Da=(0,F.A)(Ua,[["render",Ea]]);var Ka=Da;const Qa=e=>((0,t.Qi)("data-v-022e3781"),e=e(),(0,t.jt)(),e),Oa={class:"upgrade-wrap"},Ga={class:"flex-1"},$a=Qa((()=>(0,t.Lk)("span",null,"/",-1))),qa={class:"pdl-10"},ja={class:"pdl-10"};function Ya(e,a,l,n,o,r){const s=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-input"),i=(0,t.g2)("el-checkbox"),u=(0,t.g2)("Delete"),c=(0,t.g2)("el-icon"),h=(0,t.g2)("el-button"),m=(0,t.g2)("Plus"),p=(0,t.g2)("el-form"),w=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(w,{modelValue:n.state.show,"onUpdate:modelValue":a[2]||(a[2]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:`设置[${n.state.machineName}]代理`,top:"1vh",width:"600"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(p,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"140"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{prop:"gateway",style:{"margin-bottom":"0"}},{default:(0,t.k6)((()=>[(0,t.eW)(" 配置代理,通过代理访问其它设备 ")])),_:1}),(0,t.bF)(s,{label:"代理端口",prop:"Port"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{modelValue:n.state.ruleForm.Port,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.ruleForm.Port=e),style:{width:"14rem"}},null,8,["modelValue"])])),_:1}),(0,t.Lk)("div",Oa,[(0,t.bF)(s,{label:"此设备局域网IP",prop:"LanIP",class:"lan-item"},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(n.state.ruleForm.Lans,((e,a)=>((0,t.uX)(),(0,t.CE)("div",{key:a,class:"flex",style:{"margin-bottom":".6rem"}},[(0,t.Lk)("div",Ga,[(0,t.bF)(d,{modelValue:e.IP,"onUpdate:modelValue":a=>e.IP=a,style:{width:"14rem"}},null,8,["modelValue","onUpdate:modelValue"]),$a,(0,t.bF)(d,{onChange:e=>n.handleMaskChange(a),modelValue:e.PrefixLength,"onUpdate:modelValue":a=>e.PrefixLength=a,style:{width:"4rem"}},null,8,["onChange","modelValue","onUpdate:modelValue"])]),(0,t.Lk)("div",qa,[(0,t.bF)(i,{modelValue:e.Disabled,"onUpdate:modelValue":a=>e.Disabled=a,label:"禁用记录",size:"large"},null,8,["modelValue","onUpdate:modelValue"])]),(0,t.Lk)("div",ja,[(0,t.bF)(h,{type:"danger",onClick:e=>n.handleDel(a)},{default:(0,t.k6)((()=>[(0,t.bF)(c,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})])),_:2},1032,["onClick"]),(0,t.bF)(h,{type:"primary",onClick:e=>n.handleAdd(a)},{default:(0,t.k6)((()=>[(0,t.bF)(c,null,{default:(0,t.k6)((()=>[(0,t.bF)(m)])),_:1})])),_:2},1032,["onClick"])])])))),128))])),_:1})]),(0,t.bF)(s,{label:"",prop:"Btns"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(h,{onClick:a[1]||(a[1]=e=>n.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(h,{type:"primary",onClick:n.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue","title"])}var Ha={props:["modelValue"],emits:["change","update:modelValue"],components:{Delete:T.epd,Plus:T.FWt},setup(e,{emit:a}){const l=(0,d.B)(),n=v(),o=(0,i.KR)(null),r=(0,i.Kh)({show:!0,machineName:n.value.current.device.MachineName,bufferSize:l.value.bufferSize,ruleForm:{Port:n.value.current.Port,Lans:n.value.current.Lans.slice(0)},rules:{}});0==r.ruleForm.Lans.length&&r.ruleForm.Lans.push({IP:"0.0.0.0",PrefixLength:24}),(0,t.wB)((()=>r.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const s=e=>{var a=+r.ruleForm.Lans[e].PrefixLength;(a>32||a<16||isNaN(a))&&(a=24),r.ruleForm.Lans[e].PrefixLength=a},c=e=>{r.ruleForm.Lans.splice(e,1),0==r.ruleForm.Lans.length&&h(0)},h=e=>{r.ruleForm.Lans.splice(e+1,0,{IP:"0.0.0.0",PrefixLength:24})},m=()=>{const e=JSON.parse(JSON.stringify(n.value.current));e.Port=+(r.ruleForm.Port||"1805"),e.Lans=r.ruleForm.Lans.map((e=>(e.PrefixLength=+e.PrefixLength,e))),(0,k._Q)(e).then((()=>{r.show=!1,u.nk.success("已操作!"),a("change")})).catch((e=>{console.log(e),u.nk.error("操作失败!")}))};return{state:r,ruleFormRef:o,handleMaskChange:s,handleDel:c,handleAdd:h,handleSave:m}}};const Ja=(0,F.A)(Ha,[["render",Ya],["__scopeId","data-v-022e3781"]]);var Za=Ja;const el={key:0},al=["title","onClick"],ll=["onClick"];function tl(e,a,l,n,o,r){const s=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(s,{prop:"tunnel",label:"隧道",width:"76"},{default:(0,t.k6)((e=>[n.tunnel.list[e.row.MachineId]?((0,t.uX)(),(0,t.CE)("div",el,[(0,t.Lk)("a",{href:"javascript:;",class:(0,B.C4)(["a-line",{yellow:n.tunnel.list[e.row.MachineId].NeedReboot}]),title:n.tunnel.list[e.row.MachineId].NeedReboot?"需要重启":"调整网关层级有助于打洞成功",onClick:a=>n.handleTunnel(n.tunnel.list[e.row.MachineId],e.row)},[(0,t.Lk)("span",null,"网关:"+(0,B.v_)(n.tunnel.list[e.row.MachineId].RouteLevel)+"+"+(0,B.v_)(n.tunnel.list[e.row.MachineId].RouteLevelPlus),1)],10,al)])):(0,t.Q3)("",!0),(0,t.Lk)("div",null,[(0,t.Lk)("a",{href:"javascript:;",title:"与此设备的隧道连接",class:(0,B.C4)(["a-line",{green:n.connectionCount(e.row.MachineId)>0}]),onClick:a=>n.handleConnections(e.row)},[(0,t.Lk)("span",{class:(0,B.C4)({gateway:n.connectionCount(e.row.MachineId)>0})},[(0,t.eW)("连接:"),(0,t.Lk)("span",null,(0,B.v_)(n.connectionCount(e.row.MachineId)),1)],2)],10,ll)])])),_:1})}var nl=l(83);const ol=Symbol(),rl=()=>{(0,d.B)();const e=(0,i.KR)({timer:0,showEdit:!1,current:null,list:{},hashcode:0});(0,t.Gt)(ol,e);const a=()=>{(0,nl.r7)(e.value.hashcode.toString()).then((l=>{e.value.hashcode=l.HashCode,l.List&&(e.value.list=l.List),e.value.timer=setTimeout(a,1060)})).catch((()=>{e.value.timer=setTimeout(a,1060)}))},l=a=>{e.value.current=a,e.value.showEdit=!0},n=()=>{(0,nl.gM)()},o=()=>{clearTimeout(e.value.timer)},r=a=>Object.values(e.value.list).sort(((e,a)=>e.RouteLevel+e.RouteLevelPlus-a.RouteLevel+a.RouteLevelPlus)).map((e=>e.MachineId));return{tunnel:e,_getTunnelInfo:a,handleTunnelEdit:l,handleTunnelRefresh:n,clearTunnelTimeout:o,sortTunnel:r}},sl=()=>(0,t.WQ)(ol);var dl={emits:["edit","refresh"],setup(e,{emit:a}){const l=(0,d.B)(),n=(0,t.EW)((()=>l.value.config.Client.Id)),o=(0,t.EW)((()=>l.value.hasAccess("TunnelChangeSelf"))),r=(0,t.EW)((()=>l.value.hasAccess("TunnelChangeOther"))),s=sl(),i=((0,Ba.ZY)(),(0,Ba.mx)()),u=(0,Ba.FG)(),c=(0,Ba.bB)(),h=e=>{const a=[i.value.list[e],u.value.list[e],c.value.list[e]].filter((e=>!!e&&e.Connected)).length;return a},m=(e,l)=>{if(n.value===e.MachineId){if(!o.value)return}else if(!r.value)return;e.device=l,a("edit",e)},p=()=>{a("refresh")},w=e=>{a("connections",e)};return{tunnel:s,handleTunnel:m,handleTunnelRefresh:p,connectionCount:h,handleConnections:w}}};const il=(0,F.A)(dl,[["render",tl],["__scopeId","data-v-49e16cac"]]);var ul=il;const cl=e=>((0,t.Qi)("data-v-6ea047f9"),e=e(),(0,t.jt)(),e),hl=cl((()=>(0,t.Lk)("div",null,"网关层级为你的设备与外网的距离,你可以手动调整数值",-1))),ml=cl((()=>(0,t.Lk)("div",null,"光猫映射了端口后,可以直接连接,把TcpPortMap调到第一",-1))),pl={class:"t-c w-100"};function wl(e,a,l,n,o,r){const s=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-input"),i=(0,t.g2)("el-col"),u=(0,t.g2)("el-input-number"),c=(0,t.g2)("el-row"),h=(0,t.g2)("el-button"),m=(0,t.g2)("el-form"),p=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(p,{modelValue:n.state.show,"onUpdate:modelValue":a[5]||(a[5]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:`设置[${n.state.machineName}]网关`,width:"400"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(m,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"auto"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:"",prop:"alert"},{default:(0,t.k6)((()=>[hl])),_:1}),(0,t.bF)(s,{label:""},{default:(0,t.k6)((()=>[(0,t.bF)(c,null,{default:(0,t.k6)((()=>[(0,t.bF)(i,{span:12},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:"网关层级",prop:"RouteLevel"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{readonly:"",modelValue:n.state.ruleForm.RouteLevel,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.ruleForm.RouteLevel=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,t.bF)(i,{span:12},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:"调整层级",prop:"RouteLevelPlus"},{default:(0,t.k6)((()=>[(0,t.bF)(u,{modelValue:n.state.ruleForm.RouteLevelPlus,"onUpdate:modelValue":a[1]||(a[1]=e=>n.state.ruleForm.RouteLevelPlus=e)},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,t.bF)(s,{label:"",prop:"alert"},{default:(0,t.k6)((()=>[ml])),_:1}),(0,t.bF)(s,{label:""},{default:(0,t.k6)((()=>[(0,t.bF)(c,null,{default:(0,t.k6)((()=>[(0,t.bF)(i,{span:12},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:"外网端口",prop:"PortMapWan"},{default:(0,t.k6)((()=>[(0,t.bF)(u,{modelValue:n.state.ruleForm.PortMapWan,"onUpdate:modelValue":a[2]||(a[2]=e=>n.state.ruleForm.PortMapWan=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,t.bF)(i,{span:12},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:"内网端口",prop:"PortMapLan"},{default:(0,t.k6)((()=>[(0,t.bF)(u,{modelValue:n.state.ruleForm.PortMapLan,"onUpdate:modelValue":a[3]||(a[3]=e=>n.state.ruleForm.PortMapLan=e)},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,t.bF)(s,{label:"",prop:"Btns"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",pl,[(0,t.bF)(h,{onClick:a[4]||(a[4]=e=>n.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(h,{type:"primary",onClick:n.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue","title"])}var kl={props:["modelValue"],emits:["change","update:modelValue"],setup(e,{emit:a}){const l=sl(),n=(0,i.KR)(null),o=(0,i.Kh)({show:!0,machineName:l.value.current.device.MachineName,ruleForm:{RouteLevel:l.value.current.RouteLevel,RouteLevelPlus:l.value.current.RouteLevelPlus,PortMapWan:l.value.current.PortMapWan,PortMapLan:l.value.current.PortMapLan},rules:{}});(0,t.wB)((()=>o.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const r=()=>{const e=JSON.parse(JSON.stringify(l.value.current));e.RouteLevel=+o.ruleForm.RouteLevel,e.RouteLevelPlus=+o.ruleForm.RouteLevelPlus,e.PortMapWan=+o.ruleForm.PortMapWan,e.PortMapLan=+o.ruleForm.PortMapLan,(0,nl.KW)(e).then((()=>{o.show=!1,u.nk.success("已操作!"),a("change")})).catch((e=>{console.log(e),u.nk.error("操作失败!")}))};return{state:o,ruleFormRef:n,handleSave:r}}};const gl=(0,F.A)(kl,[["render",wl],["__scopeId","data-v-6ea047f9"]]);var fl=gl;const vl={key:0,class:"point p2p",title:"打洞直连"},bl={key:1,class:"point relay",title:"中继连接"},Cl={key:2,class:"point node",title:"节点连接"},Fl={key:1,class:"point",title:"未连接"},El=["onClick"],Ll=["onClick"],_l={key:0,class:"point p2p",title:"打洞直连"},yl={key:1,class:"point relay",title:"中继连接"},Il={key:2,class:"point node",title:"节点连接"},Pl={key:1,class:"point",title:"未连接"},Vl=["onClick"],Sl=["onClick"];function Tl(e,a,l,n,o,r){const s=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(s,{prop:"forward",label:"转发/穿透"},{default:(0,t.k6)((a=>[a.row.Connected?((0,t.uX)(),(0,t.CE)(t.FK,{key:0},[a.row.isSelf&&(n.hasForwardShowSelf||e.hasForwardSelf)?((0,t.uX)(),(0,t.CE)(t.FK,{key:0},[(0,t.Lk)("div",null,[n.connections.list[a.row.MachineId]&&n.connections.list[a.row.MachineId].Connected?((0,t.uX)(),(0,t.CE)(t.FK,{key:0},[0==n.connections.list[a.row.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",vl)):1==n.connections.list[a.row.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",bl)):2==n.connections.list[a.row.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",Cl)):(0,t.Q3)("",!0)],64)):((0,t.uX)(),(0,t.CE)("span",Fl)),(0,t.Lk)("a",{href:"javascript:;",title:"管理自己的端口转发",class:(0,B.C4)({green:n.forward.list[a.row.MachineId]>0}),onClick:e=>n.handleEdit(a.row.MachineId,a.row.MachineName)},[(0,t.Lk)("span",{class:(0,B.C4)({gateway:n.forward.list[a.row.MachineId]>0})},"端口转发("+(0,B.v_)(n.forward.list[a.row.MachineId]>99?"99+":n.forward.list[a.row.MachineId])+")",3)],10,El)]),(0,t.Lk)("div",null,[(0,t.Lk)("a",{href:"javascript:;",title:"管理自己的内网穿透",class:(0,B.C4)({green:n.sforward.list[a.row.MachineId]>0}),onClick:e=>n.handleSEdit(a.row.MachineId,a.row.MachineName)},[(0,t.Lk)("span",{class:(0,B.C4)({gateway:n.sforward.list[a.row.MachineId]>0})},"内网穿透("+(0,B.v_)(n.sforward.list[a.row.MachineId]>99?"99+":n.sforward.list[a.row.MachineId])+")",3)],10,Ll)])],64)):n.hasForwardShowOther||e.hasForwardOther?((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.Lk)("div",null,[n.connections.list[a.row.MachineId]&&n.connections.list[a.row.MachineId].Connected?((0,t.uX)(),(0,t.CE)(t.FK,{key:0},[0==n.connections.list[a.row.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",_l)):1==n.connections.list[a.row.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",yl)):2==n.connections.list[a.row.MachineId].Type?((0,t.uX)(),(0,t.CE)("span",Il)):(0,t.Q3)("",!0)],64)):((0,t.uX)(),(0,t.CE)("span",Pl)),(0,t.Lk)("a",{href:"javascript:;",title:"管理自己的端口转发",class:(0,B.C4)({green:n.forward.list[a.row.MachineId]>0}),onClick:e=>n.handleEdit(a.row.MachineId,a.row.MachineName)},[(0,t.Lk)("span",{class:(0,B.C4)({gateway:n.forward.list[a.row.MachineId]>0})},"端口转发("+(0,B.v_)(n.forward.list[a.row.MachineId]>99?"99+":n.forward.list[a.row.MachineId])+")",3)],10,Vl)]),(0,t.Lk)("div",null,[(0,t.Lk)("a",{href:"javascript:;",title:"管理自己的内网穿透",class:(0,B.C4)({green:n.sforward.list[a.row.MachineId]>0}),onClick:e=>n.handleSEdit(a.row.MachineId,a.row.MachineName)},[(0,t.Lk)("span",{class:(0,B.C4)({gateway:n.sforward.list[a.row.MachineId]>0})},"内网穿透("+(0,B.v_)(n.sforward.list[a.row.MachineId]>99?"99+":n.sforward.list[a.row.MachineId])+")",3)],10,Sl)])],64)):(0,t.Q3)("",!0)],64)):(0,t.Q3)("",!0)])),_:1})}var Ml=l(743);const Rl=Symbol(),Wl=()=>{const e=(0,d.B)(),a=((0,t.EW)((()=>e.value.config.Client.Id)),(0,i.KR)({timer:0,showEdit:!1,showCopy:!1,list:{},testTimer:0,hashcode:0,machineid:"",machineName:""}));(0,t.Gt)(Rl,a);const l=()=>{(0,Ml.a9)()},n=()=>{(0,Ml.gz)(a.value.hashcode.toString()).then((e=>{a.value.hashcode=e.HashCode,e.List&&(a.value.list=e.List),a.value.timer=setTimeout(n,1020)})).catch((()=>{a.value.timer=setTimeout(n,1020)}))},o=e=>{a.value.machineid=e[0],a.value.machineName=e[1],a.value.showEdit=!0},r=()=>{clearTimeout(a.value.timer),clearTimeout(a.value.testTimer)};return{sforward:a,_getSForwardCountInfo:n,handleSForwardEdit:o,clearSForwardTimeout:r,handleSForwardRefresh:l}},Xl=()=>(0,t.WQ)(Rl);var Al={emits:["edit","sedit"],setup(e,{emit:a}){const l=w(),n=Xl(),o=(0,d.B)(),r=(0,t.EW)((()=>o.value.config.Client.Id)),s=(0,t.EW)((()=>o.value.hasAccess("ForwardShowSelf"))),i=(0,t.EW)((()=>o.value.hasAccess("ForwardShowOther"))),u=(0,t.EW)((()=>o.value.hasAccess("ForwardSelf"))),c=(0,t.EW)((()=>o.value.hasAccess("ForwardOther"))),h=(0,Ba.mx)(),m=(e,l)=>{if(r.value===e){if(!u.value)return}else if(!c.value)return;a("edit",[e,l])},p=(e,l)=>{if(r.value===e){if(!u.value)return}else if(!c.value)return;a("sedit",[e,l])},k=()=>{a("refresh")};return{forward:l,sforward:n,hasForwardShowSelf:s,hasForwardShowOther:i,connections:h,handleEdit:m,handleSEdit:p,handleForwardRefresh:k}}};const Bl=(0,F.A)(Al,[["render",Tl],["__scopeId","data-v-26b3f87e"]]);var Nl=Bl;const xl={class:"t-c head"},zl=["title"],Ul={class:"t-c"},Dl={class:"page-wrap"},Kl=["title"];function Ql(e,a,l,n,o,r){const s=(0,t.g2)("el-button"),d=(0,t.g2)("el-input"),i=(0,t.g2)("el-table-column"),u=(0,t.g2)("el-option"),c=(0,t.g2)("el-select"),h=(0,t.g2)("WarnTriangleFilled"),m=(0,t.g2)("el-icon"),p=(0,t.g2)("el-pagination"),w=(0,t.g2)("el-switch"),k=(0,t.g2)("Delete"),g=(0,t.g2)("el-popconfirm"),f=(0,t.g2)("el-table"),v=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(v,{modelValue:n.state.show,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.show=e),onOpen:n.handleOnShowList,"append-to":".app-wrap",title:`【${n.state.machineName}】的端口转发`,top:"1vh",width:"780"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.Lk)("div",xl,[(0,t.bF)(s,{type:"success",size:"small",onClick:n.handleAdd},{default:(0,t.k6)((()=>[(0,t.eW)("添加")])),_:1},8,["onClick"]),(0,t.bF)(s,{size:"small",onClick:n.handleRefresh},{default:(0,t.k6)((()=>[(0,t.eW)("刷新")])),_:1},8,["onClick"])]),(0,t.bF)(f,{data:n.state.data,size:"small",border:"",height:"500",onCellDblclick:n.handleCellClick},{default:(0,t.k6)((()=>[(0,t.bF)(i,{property:"Name",label:"名称",width:"100"},{default:(0,t.k6)((e=>[e.row.NameEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.Name,"onUpdate:modelValue":a=>e.row.Name=a,onBlur:a=>n.handleEditBlur(e.row,"Name")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,B.v_)(e.row.Name),1)],64))])),_:1}),(0,t.bF)(i,{prop:"BufferSize",label:"缓冲区",width:"80"},{default:(0,t.k6)((e=>[e.row.BufferSizeEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(c,{key:0,modelValue:e.row.BufferSize,"onUpdate:modelValue":a=>e.row.BufferSize=a,placeholder:"Select",size:"small",disabled:e.row.Started,onChange:a=>n.handleEditBlur(e.row,"BufferSize")},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(n.state.bufferSize,((e,a)=>((0,t.uX)(),(0,t.Wv)(u,{key:a,label:e,value:a},null,8,["label","value"])))),128))])),_:2},1032,["modelValue","onUpdate:modelValue","disabled","onChange"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,B.v_)(n.state.bufferSize[e.row.BufferSize]),1)],64))])),_:1}),(0,t.bF)(i,{property:"BindIPAddress",label:"监听IP",width:"140"},{default:(0,t.k6)((e=>[e.row.BindIPAddressEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(c,{key:0,modelValue:e.row.BindIPAddress,"onUpdate:modelValue":a=>e.row.BindIPAddress=a,size:"small",disabled:e.row.Started,onChange:a=>n.handleEditBlur(e.row,"BindIPAddress")},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(n.state.ips,(e=>((0,t.uX)(),(0,t.Wv)(u,{key:e,label:e,value:e},null,8,["label","value"])))),128))])),_:2},1032,["modelValue","onUpdate:modelValue","disabled","onChange"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,B.v_)(e.row.BindIPAddress),1)],64))])),_:1}),(0,t.bF)(i,{property:"Port",label:"监听端口",width:"80"},{default:(0,t.k6)((e=>[e.row.PortEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(d,{key:0,type:"number",autofocus:"",size:"small",modelValue:e.row.Port,"onUpdate:modelValue":a=>e.row.Port=a,onBlur:a=>n.handleEditBlur(e.row,"Port")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[e.row.Msg?((0,t.uX)(),(0,t.CE)("div",{key:0,class:"error red",title:e.row.Msg},[(0,t.Lk)("span",null,(0,B.v_)(e.row.Port),1),(0,t.bF)(m,{size:"20"},{default:(0,t.k6)((()=>[(0,t.bF)(h)])),_:1})],8,zl)):((0,t.uX)(),(0,t.CE)("span",{key:1,class:(0,B.C4)({green:e.row.Started})},(0,B.v_)(e.row.Port),3))],64))])),_:1}),(0,t.bF)(i,{property:"MachineId",label:"目标"},{default:(0,t.k6)((e=>[e.row.MachineIdEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(c,{key:0,modelValue:e.row.MachineId,"onUpdate:modelValue":a=>e.row.MachineId=a,onChange:a=>n.handleEditBlur(e.row,"MachineId"),filterable:"",remote:"",loading:n.state.loading,"remote-method":n.handleSearch},{header:(0,t.k6)((()=>[(0,t.Lk)("div",Ul,[(0,t.Lk)("div",Dl,[(0,t.bF)(p,{small:"",background:"",layout:"prev, pager, next","page-size":n.state.machineIds.Request.Size,total:n.state.machineIds.Count,"pager-count":5,"current-page":n.state.machineIds.Request.Page,onCurrentChange:n.handlePageChange},null,8,["page-size","total","current-page","onCurrentChange"])])])])),default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(n.state.machineIds.List,((e,a)=>((0,t.uX)(),(0,t.Wv)(u,{key:a,label:e.MachineName,value:e.MachineId},null,8,["label","value"])))),128))])),_:2},1032,["modelValue","onUpdate:modelValue","onChange","loading","remote-method"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,B.v_)(e.row.MachineName),1)],64))])),_:1}),(0,t.bF)(i,{property:"TargetEP",label:"目标服务",width:"140"},{default:(0,t.k6)((e=>[e.row.TargetEPEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.TargetEP,"onUpdate:modelValue":a=>e.row.TargetEP=a,onBlur:a=>n.handleEditBlur(e.row,"TargetEP")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[e.row.TargetMsg?((0,t.uX)(),(0,t.CE)("div",{key:0,class:"error red",title:e.row.TargetMsg},[(0,t.Lk)("span",null,(0,B.v_)(e.row.TargetEP),1),(0,t.bF)(m,{size:"20"},{default:(0,t.k6)((()=>[(0,t.bF)(h)])),_:1})],8,Kl)):((0,t.uX)(),(0,t.CE)("span",{key:1,class:(0,B.C4)({green:e.row.Started})},(0,B.v_)(e.row.TargetEP),3))],64))])),_:1}),(0,t.bF)(i,{property:"Started",label:"状态",width:"60"},{default:(0,t.k6)((e=>[(0,t.bF)(w,{modelValue:e.row.Started,"onUpdate:modelValue":a=>e.row.Started=a,onChange:a=>n.handleStartChange(e.row),"inline-prompt":"","active-text":"开","inactive-text":"关"},null,8,["modelValue","onUpdate:modelValue","onChange"])])),_:1}),(0,t.bF)(i,{label:"操作",width:"54"},{default:(0,t.k6)((e=>[(0,t.bF)(g,{"confirm-button-text":"确认","cancel-button-text":"取消",title:"删除不可逆,是否确认?",onConfirm:a=>n.handleDel(e.row.Id)},{reference:(0,t.k6)((()=>[(0,t.bF)(s,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(m,null,{default:(0,t.k6)((()=>[(0,t.bF)(k)])),_:1})])),_:1})])),_:2},1032,["onConfirm"])])),_:1})])),_:1},8,["data","onCellDblclick"])])])),_:1},8,["modelValue","onOpen","title"])}var Ol={props:["data","modelValue"],emits:["update:modelValue"],components:{WarnTriangleFilled:T.DtC,Delete:T.epd},setup(e,{emit:a}){const l=(0,d.B)(),n=w(),o=(0,i.Kh)({show:!0,machineId:n.value.machineId,machineName:n.value.machineName,data:[],ips:[],bufferSize:l.value.bufferSize,loading:!1,machineIds:{Request:{Page:1,Size:10,Name:""},Count:0,List:[]}});(0,t.wB)((()=>o.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const r=()=>{(0,h.xD)().then((e=>{e.splice(0,0,"127.0.0.1"),e.splice(0,0,"0.0.0.0"),o.ips=e})).catch((()=>{}))},s=()=>{(0,h.Oy)(o.machineId).then((e=>{o.data=e})).catch((()=>{}))},c=e=>{o.machineIds.Request.Name=e,m()},m=()=>{o.loading=!0,(0,V.BS)(o.machineIds.Request).then((e=>{o.loading=!1,o.machineIds.Request=e.Request,o.machineIds.Count=e.Count,o.machineIds.List=e.List})).catch((e=>{o.loading=!1}))},p=e=>{o.machineIds.Request.Page=e,m()},k=()=>{s(),m()},g=(e,a)=>{b(e,a.property)},f=()=>{s(),u.nk.success("已刷新")},v=()=>{L({ID:0,Name:"",Port:0,TargetEP:"127.0.0.1:80",machineId:""})},b=(e,a)=>{e.Started?u.nk.error("请先停止"):(o.data.forEach((e=>{e["NameEditing"]=!1,e["PortEditing"]=!1,e["TargetEPEditing"]=!1,e["BindIPAddressEditing"]=!1,e["BufferSizeEditing"]=!1,e["MachineIdEditing"]=!1})),e[`${a}Editing`]=!0)},C=(e,a)=>{if(e.Started)return void u.nk.error("请先停止");e[`${a}Editing`]=!1;const l=o.machineIds.List.find((a=>a.MachineId==e.MachineId));l&&(e.MachineName=l.MachineName),L(e)},F=e=>{(0,h.we)({machineId:o.machineId,Id:e}).then((()=>{s()}))},E=e=>{L(e)},L=e=>{e.Port=parseInt(e.Port),(0,h.nH)({machineId:o.machineId,data:e}).then((()=>{s()})).catch((e=>{u.nk.error(e)}))};return(0,t.sV)((()=>{s(),r()})),{state:o,handleOnShowList:k,handleCellClick:g,handleRefresh:f,handleAdd:v,handleEdit:b,handleEditBlur:C,handleDel:F,handleStartChange:E,handleSearch:c,handlePageChange:p}}};const Gl=(0,F.A)(Ol,[["render",Ql],["__scopeId","data-v-15b05a01"]]);var $l=Gl;const ql={class:"t-c head"},jl=["title"],Yl=["title"];function Hl(e,a,l,n,o,r){const s=(0,t.g2)("el-button"),d=(0,t.g2)("el-input"),i=(0,t.g2)("el-table-column"),u=(0,t.g2)("WarnTriangleFilled"),c=(0,t.g2)("el-icon"),h=(0,t.g2)("el-switch"),m=(0,t.g2)("Delete"),p=(0,t.g2)("el-popconfirm"),w=(0,t.g2)("el-table"),k=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(k,{modelValue:n.state.show,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.show=e),onOpen:n.handleOnShowList,"append-to":".app-wrap",title:`【${n.machineName}】的内网穿透`,top:"1vh",width:"700"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.Lk)("div",ql,[(0,t.bF)(s,{type:"success",size:"small",onClick:n.handleAdd},{default:(0,t.k6)((()=>[(0,t.eW)("添加")])),_:1},8,["onClick"]),(0,t.bF)(s,{size:"small",onClick:n.handleRefresh},{default:(0,t.k6)((()=>[(0,t.eW)("刷新")])),_:1},8,["onClick"])]),(0,t.bF)(w,{data:n.state.data,size:"small",border:"",height:"500",onCellDblclick:n.handleCellClick},{default:(0,t.k6)((()=>[(0,t.bF)(i,{property:"Name",label:"名称"},{default:(0,t.k6)((e=>[e.row.NameEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.Name,"onUpdate:modelValue":a=>e.row.Name=a,onBlur:a=>n.handleEditBlur(e.row,"Name")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,B.v_)(e.row.Name),1)],64))])),_:1}),(0,t.bF)(i,{prop:"BufferSize",label:"缓冲区",width:"100"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,B.v_)(1<[e.row.TempEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.Temp,"onUpdate:modelValue":a=>e.row.Temp=a,onBlur:a=>n.handleEditBlur(e.row,"Temp")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[e.row.Msg?((0,t.uX)(),(0,t.CE)("div",{key:0,class:"error red",title:e.row.Msg},[(0,t.Lk)("span",null,(0,B.v_)(e.row.Temp),1),(0,t.bF)(c,{size:"20"},{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})],8,jl)):((0,t.uX)(),(0,t.CE)("span",{key:1,class:(0,B.C4)({green:e.row.Started})},(0,B.v_)(e.row.Temp),3))],64))])),_:1}),(0,t.bF)(i,{property:"LocalEP",label:"本机服务",width:"140"},{default:(0,t.k6)((e=>[e.row.LocalEPEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.LocalEP,"onUpdate:modelValue":a=>e.row.LocalEP=a,onBlur:a=>n.handleEditBlur(e.row,"LocalEP")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[e.row.LocalMsg?((0,t.uX)(),(0,t.CE)("div",{key:0,class:"error red",title:e.row.LocalMsg},[(0,t.Lk)("span",null,(0,B.v_)(e.row.LocalEP),1),(0,t.bF)(c,{size:"20"},{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})],8,Yl)):((0,t.uX)(),(0,t.CE)("span",{key:1,class:(0,B.C4)({green:e.row.Started})},(0,B.v_)(e.row.LocalEP),3))],64))])),_:1}),(0,t.bF)(i,{property:"Started",label:"状态",width:"60"},{default:(0,t.k6)((e=>[(0,t.bF)(h,{modelValue:e.row.Started,"onUpdate:modelValue":a=>e.row.Started=a,onChange:a=>n.handleStartChange(e.row),"inline-prompt":"","active-text":"是","inactive-text":"否"},null,8,["modelValue","onUpdate:modelValue","onChange"])])),_:1}),(0,t.bF)(i,{label:"操作",width:"54"},{default:(0,t.k6)((e=>[(0,t.bF)(p,{"confirm-button-text":"确认","cancel-button-text":"取消",title:"删除不可逆,是否确认?",onConfirm:a=>n.handleDel(e.row.Id)},{reference:(0,t.k6)((()=>[(0,t.bF)(s,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(c,null,{default:(0,t.k6)((()=>[(0,t.bF)(m)])),_:1})])),_:1})])),_:2},1032,["onConfirm"])])),_:1})])),_:1},8,["data","onCellDblclick"])])])),_:1},8,["modelValue","onOpen","title"])}var Jl={props:["data","modelValue"],emits:["update:modelValue"],components:{WarnTriangleFilled:T.DtC,Delete:T.epd},setup(e,{emit:a}){const l=(0,d.B)(),n=Xl(),o=(0,i.Kh)({bufferSize:l.value.bufferSize,show:!0,data:[],timerTestLocal:0});(0,t.wB)((()=>o.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const r=()=>{console.log(n.value.machineid),(0,Ml.eX)(n.value.machineid).then((e=>{o.timerTestLocal=setTimeout(r,1e3)})).catch((()=>{o.timerTestLocal=setTimeout(r,1e3)}))},s=()=>{(0,Ml.pY)(n.value.machineid).then((e=>{e.forEach((e=>{e.Temp=(e.Domain||e.RemotePort).toString(),e.RemotePort=0,e.Domain=""})),o.data=e})).catch((()=>{}))},c=()=>{s()},h=(e,a)=>{w(e,a.property)},m=()=>{s(),u.nk.success("已刷新")},p=()=>{const e={Id:0,Name:"",RemotePort:0,LocalEP:"127.0.0.1:80",Domain:"",Temp:""};(0,Ml.Qs)({machineid:n.value.machineid,data:e}).then((()=>{setTimeout((()=>{s()}),100)})).catch((e=>{u.nk.error(e)}))},w=(e,a)=>{e.Started?u.nk.error("请先停止运行"):(o.data.forEach((e=>{e["NameEditing"]=!1,e["RemotePortEditing"]=!1,e["LocalEPEditing"]=!1,e["DomainEditing"]=!1,e["TempEditing"]=!1})),e[`${a}Editing`]=!0)},k=(e,a)=>{e.Started?u.nk.error("请先停止运行"):(e[`${a}Editing`]=!1,v(e))},g=e=>{(0,Ml.DY)({machineid:n.value.machineid,id:e}).then((()=>{s()}))},f=e=>{v(e)},v=e=>{e.Temp&&(/^\d+$/.test(e.Temp)?e.RemotePort=parseInt(e.Temp):e.Domain=e.Temp,(0,Ml.Qs)({machineid:n.value.machineid,data:e}).then((e=>{0==e&&u.nk.error("操作失败,可能存在相同值"),setTimeout((()=>{s()}),100)})).catch((e=>{u.nk.error(e)})))};return(0,t.sV)((()=>{s(),r()})),(0,t.hi)((()=>{clearTimeout(o.timerTestLocal)})),{state:o,machineName:n.value.machineName,handleOnShowList:c,handleCellClick:h,handleRefresh:m,handleAdd:p,handleEdit:w,handleEditBlur:k,handleDel:g,handleStartChange:f}}};const Zl=(0,F.A)(Jl,[["render",Hl],["__scopeId","data-v-7eb8e7cc"]]);var et=Zl;const at=["onClick"],lt={key:0},tt={key:1},nt={key:0},ot={key:1},rt={key:0},st={key:1};function dt(e,a,l,n,o,r){const s=(0,t.g2)("el-table-column"),d=(0,t.g2)("Delete"),i=(0,t.g2)("el-icon"),u=(0,t.g2)("el-button"),c=(0,t.g2)("el-popconfirm"),h=(0,t.g2)("el-table"),m=(0,t.g2)("el-dialog"),p=(0,t.g2)("el-switch");return(0,t.uX)(),(0,t.CE)(t.FK,null,[(0,t.bF)(m,{modelValue:n.state.show,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.show=e),"append-to":".app-wrap",title:`与[${n.state.machineName}]的链接`,top:"1vh",width:"780"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(h,{data:n.state.data,size:"small",border:"",height:"500"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{property:"RemoteMachineId",label:"目标/服务器"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",{class:(0,B.C4)({green:e.row.Connected})},[(0,t.Lk)("p",null,(0,B.v_)(e.row.IPEndPoint),1),(0,t.Lk)("p",null,"ssl : "+(0,B.v_)(e.row.SSL),1)],2)])),_:1}),(0,t.bF)(s,{property:"TransactionId",label:"事务",width:"80"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,B.v_)(n.state.transactions[e.row.TransactionId]),1)])),_:1}),(0,t.bF)(s,{property:"TransportName",label:"协议"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("p",null,(0,B.v_)(e.row.TransportName)+"("+(0,B.v_)(n.state.protocolTypes[e.row.ProtocolType])+")",1),(0,t.Lk)("p",null,(0,B.v_)(n.state.types[e.row.Type])+" - "+(0,B.v_)(1<[(0,t.Lk)("span",null,(0,B.v_)(e.row.Delay)+"ms",1)])),_:1}),(0,t.bF)(s,{property:"Bytes",label:"通信"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("p",null,"up : "+(0,B.v_)(e.row.SendBytesText),1),(0,t.Lk)("p",null,"down : "+(0,B.v_)(e.row.ReceiveBytesText),1)])])),_:1}),(0,t.bF)(s,{property:"relay",label:"中继节点"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("a",{href:"javascript:;",class:"a-line",onClick:a=>n.handleNode(e.row)},(0,B.v_)(n.state.nodesDic[e.row.NodeId]||"选择节点"),9,at)])])),_:1}),(0,t.bF)(s,{label:"操作",width:"54"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[n.hasTunnelRemove?((0,t.uX)(),(0,t.Wv)(c,{key:0,"confirm-button-text":"确认","cancel-button-text":"取消",title:"确定关闭此连接?",onConfirm:a=>n.handleDel(e.row)},{reference:(0,t.k6)((()=>[(0,t.bF)(u,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(d)])),_:1})])),_:1})])),_:2},1032,["onConfirm"])):(0,t.Q3)("",!0)])])),_:1})])),_:1},8,["data"])])])),_:1},8,["modelValue","title"]),(0,t.bF)(m,{modelValue:n.state.showNodes,"onUpdate:modelValue":a[1]||(a[1]=e=>n.state.showNodes=e),title:"中继节点",width:"760",top:"2vh"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(h,{data:n.state.nodes,size:"small",border:"",height:"600"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{property:"Name",label:"名称"}),(0,t.bF)(s,{property:"MaxGbTotal",label:"月流量",width:"160"},{default:(0,t.k6)((e=>[0==e.row.MaxGbTotal?((0,t.uX)(),(0,t.CE)("span",lt,"无限制")):((0,t.uX)(),(0,t.CE)("span",tt,(0,B.v_)((e.row.MaxGbTotalLastBytes/1024/1024/1024).toFixed(2))+"GB / "+(0,B.v_)(e.row.MaxGbTotal)+"GB ",1))])),_:1}),(0,t.bF)(s,{property:"MaxBandwidth",label:"连接带宽",width:"80"},{default:(0,t.k6)((e=>[0==e.row.MaxBandwidth?((0,t.uX)(),(0,t.CE)("span",nt,"无限制")):((0,t.uX)(),(0,t.CE)("span",ot,(0,B.v_)(e.row.MaxBandwidth)+"Mbps",1))])),_:1}),(0,t.bF)(s,{property:"MaxBandwidthTotal",label:"总带宽",width:"80"},{default:(0,t.k6)((e=>[0==e.row.MaxBandwidthTotal?((0,t.uX)(),(0,t.CE)("span",rt,"无限制")):((0,t.uX)(),(0,t.CE)("span",st,(0,B.v_)(e.row.MaxBandwidthTotal)+"Mbps",1))])),_:1}),(0,t.bF)(s,{property:"BandwidthRatio",label:"带宽速率",width:"66"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,B.v_)(100*e.row.BandwidthRatio)+"%",1)])),_:1}),(0,t.bF)(s,{property:"ConnectionRatio",label:"连接数",width:"60"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,B.v_)(100*e.row.ConnectionRatio)+"%",1)])),_:1}),(0,t.bF)(s,{property:"Delay",label:"延迟",width:"60"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,B.v_)(e.row.Delay)+"ms",1)])),_:1}),(0,t.bF)(s,{property:"Public",label:"公开",width:"60"},{default:(0,t.k6)((e=>[(0,t.bF)(p,{disabled:"",modelValue:e.row.Public,"onUpdate:modelValue":a=>e.row.Public=a,size:"small"},null,8,["modelValue","onUpdate:modelValue"])])),_:1}),(0,t.bF)(s,{property:"Oper",label:"操作",width:"65"},{default:(0,t.k6)((e=>[(0,t.bF)(u,{type:"success",size:"small",onClick:a=>n.handleConnect(e.row.Id)},{default:(0,t.k6)((()=>[(0,t.eW)("使用")])),_:2},1032,["onClick"])])),_:1})])),_:1},8,["data"])])])),_:1},8,["modelValue"])],64)}var it=l(9232),ut={props:["modelValue"],emits:["change","update:modelValue"],components:{Delete:T.epd},setup(e,{emit:a}){const l=(0,d.B)(),n=(0,t.EW)((()=>l.value.hasAccess("TunnelRemove"))),o=(0,Ba.ZY)(),r=(0,Ba.mx)(),s=(0,Ba.FG)(),c=(0,Ba.bB)(),h=(0,i.Kh)({show:!0,protocolTypes:{1:"tcp",2:"udp",4:"msquic"},types:{0:"打洞",1:"中继",2:"节点"},transactions:{forward:"端口转发",tuntap:"虚拟网卡",socks5:"代理转发"},machineName:o.value.currentName,currentRow:{},data:(0,t.EW)((()=>[r.value.list[o.value.current],s.value.list[o.value.current],c.value.list[o.value.current]].filter((e=>!!e)))),showNodes:!1,nodes:[],nodesDic:{},timer:0});(0,t.wB)((()=>h.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e),a("change")}),300)}));const m=e=>{n.value&&e.removeFunc(e.RemoteMachineId).then((()=>{u.nk.success("删除成功")})).catch((()=>{}))},p=()=>{(0,it.W4)().then((e=>{h.nodes=e,h.nodesDic=e.reduce(((e,a)=>(e[a.Id]=a.Name,e)),{}),h.timer=setTimeout(p,1e3)})).catch((()=>{h.timer=setTimeout(p,1e3)}))},w=e=>{h.currentRow=e,h.showNodes=!0},k=e=>{const a={FromMachineId:l.value.config.Client.Id,TransactionId:h.currentRow.TransactionId,ToMachineId:h.currentRow.RemoteMachineId,NodeId:e};a.NodeId!=h.currentRow.NodeId&&((0,it.uQ)(a).then((()=>{})).catch((()=>{})),h.showNodes=!1)};return(0,t.sV)((()=>{o.value.updateRealTime(!0),p()})),(0,t.hi)((()=>{o.value.updateRealTime(!1),clearTimeout(h.timer)})),{state:h,handleDel:m,hasTunnelRemove:n,handleNode:w,handleConnect:k}}};const ct=(0,F.A)(ut,[["render",dt],["__scopeId","data-v-7891b902"]]);var ht=ct,mt=l(9383),pt={components:{Sort:L,Oper:A,Device:J,DeviceEdit:ne,AccessEdit:ce,Tunnel:ul,TunnelEdit:fl,ConnectionsEdit:ht,Tuntap:ge,TuntapEdit:ea,TuntapLease:Ca,Socks5:Ka,Socks5Edit:Za,Forward:Nl,ForwardEdit:$l,SForwardEdit:et},setup(e){const a=(0,d.B)(),l=(0,i.Kh)({height:(0,t.EW)((()=>a.value.height-90))}),{devices:n,machineId:o,_getSignList:r,_getSignList1:s,handleDeviceEdit:c,handleAccessEdit:h,handlePageChange:m,handlePageSizeChange:w,handleDel:k,clearDevicesTimeout:g,setSort:v}=(0,oe.r)(),{tuntap:C,_getTuntapInfo:F,handleTuntapEdit:E,handleTuntapRefresh:L,clearTuntapTimeout:_,getTuntapMachines:y,sortTuntapIP:I}=(0,b.O)(),{socks5:P,_getSocks5Info:V,handleSocks5Edit:S,handleSocks5Refresh:T,clearSocks5Timeout:M,getSocks5Machines:W,sortSocks5:X}=f(),{tunnel:A,_getTunnelInfo:B,handleTunnelEdit:N,handleTunnelRefresh:x,clearTunnelTimeout:z,sortTunnel:U}=rl(),{forward:D,_getForwardCountInfo:K,handleForwardEdit:Q,clearForwardTimeout:O,handleForwardRefresh:G}=p(),{sforward:$,_getSForwardCountInfo:q,handleSForwardEdit:j,clearSForwardTimeout:Y,handleSForwardRefresh:H}=Wl(),{connections:J,forwardConnections:Z,_getForwardConnections:ee,tuntapConnections:ae,_getTuntapConnections:le,socks5Connections:te,_getSocks5Connections:ne,handleTunnelConnections:re,clearConnectionsTimeout:se}=(0,Ba.L2)(),{_getUpdater:de,_subscribeUpdater:ie,clearUpdaterTimeout:ue}=(0,mt.d)(),{_getAccessInfo:ce,clearAccessTimeout:he,handleAccesssRefresh:me}=(0,R.Y)(),pe=e=>{n.page.Request.Prop=e.prop,n.page.Request.Asc="ascending"==e.order;let a=new Promise(((e,a)=>{e()}));if("tunnel"==e.prop){const e=U(n.page.Request.Asc);e.length>0&&(a=v(e))}else if("tuntap"==e.prop){const e=I(n.page.Request.Asc);e.length>0&&(a=v(e))}else if("socks5"==e.prop){const e=X(n.page.Request.Asc);e.length>0&&(a=v(e))}a.then((()=>{m()})).catch((()=>{}))},we=e=>{n.page.Request.Name=e||"",n.page.Request.Name?n.page.Request.Ids=y(n.page.Request.Name).concat(W(n.page.Request.Name)).reduce(((e,a)=>(-1==e.indexOf(a)&&e.push(a),e)),[]):n.page.Request.Ids=[],m(),x(),L(),T(),G(),H(),me(),u.nk.success({message:"刷新成功",grouping:!0})},ke=()=>{m(),x(),L(),T(),me(),u.nk.success({message:"刷新成功",grouping:!0})};return(0,t.sV)((()=>{m(),x(),L(),T(),G(),H(),me(),r(),s(),F(),V(),B(),ee(),le(),ne(),K(),q(),de(),ie(),ce()})),(0,t.hi)((()=>{g(),se(),_(),M(),z(),O(),Y(),ue(),he()})),{state:l,devices:n,machineId:o,handleSortChange:pe,handleDeviceEdit:c,handleAccessEdit:h,handlePageRefresh:we,handlePageSearch:ke,handlePageChange:m,handlePageSizeChange:w,handleDel:k,tuntap:C,handleTuntapEdit:E,handleTuntapRefresh:L,socks5:P,handleSocks5Edit:S,handleSocks5Refresh:T,tunnel:A,connections:J,handleTunnelEdit:N,handleTunnelRefresh:x,handleTunnelConnections:re,forward:D,handleForwardEdit:Q,sforward:$,handleSForwardEdit:j}}};const wt=(0,F.A)(pt,[["render",s],["__scopeId","data-v-3d1c480c"]]);var kt=wt}}]); \ No newline at end of file diff --git a/linker.tray.win/web/js/642.8d1a79df.js b/linker.tray.win/web/js/642.8d1a79df.js new file mode 100644 index 00000000..b076f14e --- /dev/null +++ b/linker.tray.win/web/js/642.8d1a79df.js @@ -0,0 +1 @@ +"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[642],{5096:function(e,t,a){a.d(t,{A:function(){return p}});var l=a(6768);const o=e=>((0,l.Qi)("data-v-4892cd3c"),e=e(),(0,l.jt)(),e),n=o((()=>(0,l.Lk)("input",{type:"file",id:"file-input"},null,-1)));function s(e,t,a,o,s,r){const i=(0,l.g2)("PictureRounded"),d=(0,l.g2)("el-icon");return(0,l.uX)(),(0,l.CE)(l.FK,null,[(0,l.Lk)("a",{href:"javascript:;",onClick:t[0]||(t[0]=(...e)=>o.handleBg&&o.handleBg(...e))},[(0,l.bF)(d,null,{default:(0,l.k6)((()=>[(0,l.bF)(i)])),_:1})]),n],64)}var r=a(7477),i=a(2933),d={components:{PictureRounded:r.syp},props:["name"],setup(e){const t=`bg-${e.name}`,a=()=>{localStorage.getItem(t)?i.s.confirm("清除背景?","Warning",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((()=>{n()})).catch((()=>{})):document.getElementById("file-input").click()},o=e=>{const t=e.target.files[0];if(t)try{const e=new FileReader;e.onload=function(e){n(e.target.result)},e.readAsDataURL(t)}catch(a){}e.target.value=""},n=e=>{e?(document.body.className="sunny",localStorage.setItem(t,e),document.body.style=`background-image:url(${e})`):(document.body.className="",document.body.style="",localStorage.setItem(t,""))};return(0,l.sV)((()=>{document.getElementById("file-input").addEventListener("change",o),n(localStorage.getItem(t))})),{handleBg:a}}},c=a(1241);const u=(0,c.A)(d,[["render",s],["__scopeId","data-v-4892cd3c"]]);var p=u},3269:function(e,t,a){a.d(t,{A:function(){return Ye}});var l=a(6768),o=a(4232),n=a.p+"img/coin.6431311b.svg",s=a.p+"img/wechat.5c371c5d.jpg",r=a.p+"img/alipay.ff9b1e7c.jpg";const i=e=>((0,l.Qi)("data-v-2a629595"),e=e(),(0,l.jt)(),e),d={class:"status-wrap flex"},c={class:"copy"},u=i((()=>(0,l.Lk)("img",{src:n,alt:"memory"},null,-1))),p=i((()=>(0,l.Lk)("span",null,"赞助",-1))),g=[u,p],v={href:"https://github.com/snltty/linker",target:"_blank"},f=i((()=>(0,l.Lk)("div",{class:"flex-1"},null,-1))),m={class:"export"},h={class:"api"},y={class:"server"},k=i((()=>(0,l.Lk)("div",{class:"pay"},[(0,l.Lk)("img",{src:s,alt:""}),(0,l.Lk)("img",{src:r,alt:""})],-1)));function w(e,t,a,n,s,r){const i=(0,l.g2)("Export"),u=(0,l.g2)("Api"),p=(0,l.g2)("Server"),w=(0,l.g2)("el-dialog");return(0,l.uX)(),(0,l.CE)("div",d,[(0,l.Lk)("div",c,[(0,l.Lk)("a",{href:"javascript:;",class:"memory",title:"赞助一笔,让作者饱餐一顿",onClick:t[0]||(t[0]=e=>n.state.showPay=!0)},g),(0,l.Lk)("a",v,"©linker "+(0,o.v_)(n.self.Version),1)]),f,(0,l.Lk)("div",m,[(0,l.bF)(i,{config:n.config},null,8,["config"])]),(0,l.Lk)("div",h,[(0,l.bF)(u,{config:n.config},null,8,["config"])]),(0,l.Lk)("div",y,[(0,l.bF)(p,{config:n.config},null,8,["config"])]),(0,l.bF)(w,{modelValue:n.state.showPay,"onUpdate:modelValue":t[1]||(t[1]=e=>n.state.showPay=e),title:"赞助linker",width:"300",top:"1vh"},{default:(0,l.k6)((()=>[k])),_:1},8,["modelValue"])])}var b=a(144);const S={href:"javascript:;",title:"此设备的管理接口"};function B(e,t,a,n,s,r){const i=(0,l.g2)("Tools"),d=(0,l.g2)("el-icon"),c=(0,l.g2)("el-popconfirm");return n.config?((0,l.uX)(),(0,l.CE)("div",{key:0,class:(0,o.C4)(["status-api-wrap",{connected:n.connected}])},[(0,l.bF)(c,{"confirm-button-text":"清除","cancel-button-text":"更改",title:"确定你的操作?",onCancel:n.handleShow,onConfirm:n.handleResetConnect},{reference:(0,l.k6)((()=>[(0,l.Lk)("a",S,[(0,l.bF)(d,{size:"16"},{default:(0,l.k6)((()=>[(0,l.bF)(i)])),_:1}),(0,l.eW)(" 管理接口 ")])])),_:1},8,["onCancel","onConfirm"])],2)):(0,l.Q3)("",!0)}var F=a(3830),C=a(4),_=a(7477),V={components:{Tools:_.S0q},props:["config"],setup(e){const t=(0,F.B)(),a=(0,l.EW)((()=>t.value.api.connected)),o=()=>{localStorage.setItem("api-cache",""),window.location.reload()},n=()=>{(0,C.e3)(),(0,C.a1)(`ws${"https:"===window.location.protocol?"s":""}://${window.location.hostname}:12345`,"snltty")};return{config:e.config,connected:a,handleShow:n,handleResetConnect:o}}},x=a(1241);const T=(0,x.A)(V,[["render",B],["__scopeId","data-v-1d3d9c26"]]);var L=T;const R={class:"status-server-wrap"};function I(e,t,a,o,n,s){const r=(0,l.g2)("ServerConfig"),i=(0,l.g2)("ServerVersion"),d=(0,l.g2)("ServerFlow");return(0,l.uX)(),(0,l.CE)("div",R,[(0,l.bF)(r,{config:o.config},null,8,["config"]),(0,l.bF)(i,{config:o.config},null,8,["config"]),o.config&&o.hasFlow?((0,l.uX)(),(0,l.Wv)(d,{key:0,config:o.config},null,8,["config"])):(0,l.Q3)("",!0)])}const P=e=>((0,l.Qi)("data-v-3b6604f4"),e=e(),(0,l.jt)(),e),E=P((()=>(0,l.Lk)("span",null,"信标服务器",-1))),W={class:"dialog-footer t-c"};function D(e,t,a,n,s,r){const i=(0,l.g2)("Promotion"),d=(0,l.g2)("el-icon"),c=(0,l.g2)("el-input"),u=(0,l.g2)("el-form-item"),p=(0,l.g2)("el-option"),g=(0,l.g2)("el-select"),v=(0,l.g2)("el-form"),f=(0,l.g2)("el-button"),m=(0,l.g2)("el-dialog");return(0,l.uX)(),(0,l.CE)(l.FK,null,[(0,l.Lk)("a",{href:"javascript:;",class:(0,o.C4)({connected:n.state.connected}),title:"更改你的连接设置",onClick:t[0]||(t[0]=(...e)=>n.handleConfig&&n.handleConfig(...e))},[(0,l.bF)(d,{size:"16"},{default:(0,l.k6)((()=>[(0,l.bF)(i)])),_:1}),(0,l.eW)(),E],2),(0,l.bF)(m,{modelValue:n.state.show,"onUpdate:modelValue":t[4]||(t[4]=e=>n.state.show=e),title:"连接设置",width:"300","append-to-body":""},{footer:(0,l.k6)((()=>[(0,l.Lk)("div",W,[(0,l.bF)(f,{onClick:t[3]||(t[3]=e=>n.state.show=!1),loading:n.state.loading},{default:(0,l.k6)((()=>[(0,l.eW)("取消")])),_:1},8,["loading"]),(0,l.bF)(f,{type:"primary",onClick:n.handleSave,loading:n.state.loading},{default:(0,l.k6)((()=>[(0,l.eW)("确定保存")])),_:1},8,["onClick","loading"])])])),default:(0,l.k6)((()=>[(0,l.Lk)("div",null,[(0,l.bF)(v,{model:n.state.form,rules:n.state.rules,"label-width":"6rem"},{default:(0,l.k6)((()=>[(0,l.bF)(u,{label:"机器名",prop:"name"},{default:(0,l.k6)((()=>[(0,l.bF)(c,{modelValue:n.state.form.name,"onUpdate:modelValue":t[1]||(t[1]=e=>n.state.form.name=e),maxlength:"12","show-word-limit":""},null,8,["modelValue"])])),_:1}),(0,l.bF)(u,{label:"分组名",prop:"groupid"},{default:(0,l.k6)((()=>[(0,l.bF)(g,{modelValue:n.state.groupid,"onUpdate:modelValue":t[2]||(t[2]=e=>n.state.groupid=e),onChange:n.handleGroupChange},{default:(0,l.k6)((()=>[((0,l.uX)(!0),(0,l.CE)(l.FK,null,(0,l.pI)(n.state.form.groups,(e=>((0,l.uX)(),(0,l.Wv)(p,{key:e.Id,label:e.Name,value:e.Id},null,8,["label","value"])))),128))])),_:1},8,["modelValue","onChange"])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue"])],64)}var z=a(9299),K=a(1219),$={components:{Promotion:_.Yk4,CirclePlus:_.HxT},props:["config"],setup(e){const t=(0,F.B)(),a=(0,l.EW)((()=>t.value.hasAccess("Config"))),o=(0,b.Kh)({show:!1,loading:!1,connected:(0,l.EW)((()=>t.value.signin.Connected)),groupid:t.value.config.Client.Group.Id,form:{name:t.value.config.Client.Name,groups:t.value.config.Client.Groups},rules:{}}),n=()=>{e.config&&a.value&&(o.form.name=t.value.config.Client.Name,o.form.groups=t.value.config.Client.Groups,o.groupid=t.value.config.Client.Group.Id,o.show=!0)},s=e=>{const t=o.form.groups.map(((e,t)=>(e.$index=t,e))).filter((t=>t.Id==e))[0].$index,a=o.form.groups[t];o.form.groups[t]=o.form.groups[0],o.form.groups[0]=a},r=()=>{o.loading=!0,(0,z.rd)(o.form).then((()=>{o.loading=!1,o.show=!1,K.nk.success("已操作"),setTimeout((()=>{window.location.reload()}),1e3)})).catch((e=>{console.log(e),o.loading=!1,K.nk.error("操作失败!")}))};return{config:e.config,state:o,handleConfig:n,handleSave:r,handleGroupChange:s}}};const A=(0,x.A)($,[["render",D],["__scopeId","data-v-3b6604f4"]]);var X=A;const O={key:0,class:"flow-wrap"},U={href:"javascript:;",title:"本服务器\r\n在线数/7天内上线数"},j={href:"javascript:;",title:"所有服务器\r\n在线数/7天内上线数/服务端数"};function G(e,t,a,n,s,r){const i=(0,l.g2)("el-table-column"),d=(0,l.g2)("el-button"),c=(0,l.g2)("el-table"),u=(0,l.g2)("el-dialog"),p=(0,l.g2)("ServerFlowMessenger"),g=(0,l.g2)("ServerFlowSForward"),v=(0,l.g2)("ServerFlowRelay");return(0,l.uX)(),(0,l.CE)(l.FK,null,[n.config?((0,l.uX)(),(0,l.CE)("div",O,[(0,l.Lk)("p",null,[(0,l.eW)("在线 "),(0,l.Lk)("a",U,(0,o.v_)(n.state.overallOnline),1),(0,l.Lk)("a",j,(0,o.v_)(n.state.serverOnline),1)]),(0,l.Lk)("p",null,[(0,l.eW)("上传 "),(0,l.Lk)("a",{href:"javascript:;",title:"本服务器\r\n发送速率",onClick:t[0]||(t[0]=(...e)=>n.handleShow&&n.handleShow(...e))},(0,o.v_)(n.state.overallSendtSpeed)+"/s",1)]),(0,l.Lk)("p",null,[(0,l.eW)("下载 "),(0,l.Lk)("a",{href:"javascript:;",title:"本服务器\r\n接收速率",onClick:t[1]||(t[1]=(...e)=>n.handleShow&&n.handleShow(...e))},(0,o.v_)(n.state.overallReceiveSpeed)+"/s",1)])])):(0,l.Q3)("",!0),(0,l.bF)(u,{title:n.state.time,"destroy-on-close":"",modelValue:n.state.show,"onUpdate:modelValue":t[2]||(t[2]=e=>n.state.show=e),width:"540"},{default:(0,l.k6)((()=>[(0,l.Lk)("div",null,[(0,l.bF)(c,{data:n.state.list,border:"",size:"small",width:"100%"},{default:(0,l.k6)((()=>[(0,l.bF)(i,{prop:"text",label:"类别",width:"80"}),(0,l.bF)(i,{prop:"sendtBytes",label:"已上传",sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.sendtBytesText),1)])),_:1}),(0,l.bF)(i,{prop:"sendtSpeed",label:"上传速度",sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.sendtSpeedText)+"/s",1)])),_:1}),(0,l.bF)(i,{prop:"receiveBytes",label:"已下载",sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.receiveBytesText),1)])),_:1}),(0,l.bF)(i,{prop:"receiveSpeed",label:"下载速度",sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.receiveSpeedText)+"/s",1)])),_:1}),(0,l.bF)(i,{prop:"oper",label:"操作",width:"64"},{default:(0,l.k6)((e=>[e.row.detail?((0,l.uX)(),(0,l.Wv)(d,{key:0,size:"small",onClick:t=>n.handleShowDetail(e.row.id)},{default:(0,l.k6)((()=>[(0,l.eW)("详情")])),_:2},1032,["onClick"])):(0,l.Q3)("",!0)])),_:1})])),_:1},8,["data"])])])),_:1},8,["title","modelValue"]),n.state.details.Messenger?((0,l.uX)(),(0,l.Wv)(p,{key:1,config:n.config,modelValue:n.state.details.Messenger,"onUpdate:modelValue":t[3]||(t[3]=e=>n.state.details.Messenger=e)},null,8,["config","modelValue"])):(0,l.Q3)("",!0),n.state.details.SForward?((0,l.uX)(),(0,l.Wv)(g,{key:2,config:n.config,modelValue:n.state.details.SForward,"onUpdate:modelValue":t[4]||(t[4]=e=>n.state.details.SForward=e)},null,8,["config","modelValue"])):(0,l.Q3)("",!0),n.state.details.Relay?((0,l.uX)(),(0,l.Wv)(v,{key:3,config:n.config,modelValue:n.state.details.Relay,"onUpdate:modelValue":t[5]||(t[5]=e=>n.state.details.Relay=e)},null,8,["config","modelValue"])):(0,l.Q3)("",!0)],64)}a(4114);const M=()=>(0,C.zG)("flowClient/GetFlows"),Q=()=>(0,C.zG)("flowClient/GetMessengerFlows"),N=e=>(0,C.zG)("flowClient/GetSForwardFlows",e),Y=e=>(0,C.zG)("flowClient/GetRelayFlows",e);function q(e,t,a,n,s,r){const i=(0,l.g2)("el-table-column"),d=(0,l.g2)("el-table"),c=(0,l.g2)("el-dialog");return(0,l.uX)(),(0,l.Wv)(c,{title:"信标流量",class:"options-center",top:"1vh","destroy-on-close":"",modelValue:n.state.show,"onUpdate:modelValue":t[0]||(t[0]=e=>n.state.show=e),width:"680"},{default:(0,l.k6)((()=>[(0,l.Lk)("div",null,[(0,l.bF)(d,{data:n.state.list,stripe:"",border:"",size:"small",width:"100%",height:"60vh"},{default:(0,l.k6)((()=>[(0,l.bF)(i,{prop:"id",label:"信标id",width:"200"}),(0,l.bF)(i,{prop:"sendtBytes",label:"已上传",sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.sendtBytesText),1)])),_:1}),(0,l.bF)(i,{prop:"sendtSpeed",label:"上传速度",sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.sendtSpeedText)+"/s",1)])),_:1}),(0,l.bF)(i,{prop:"receiveBytes",label:"已下载",sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.receiveBytesText),1)])),_:1}),(0,l.bF)(i,{prop:"receiveSpeed",label:"下载速度",sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.receiveSpeedText)+"/s",1)])),_:1})])),_:1},8,["data"])])])),_:1},8,["modelValue"])}var H={props:["modelValue","config"],emits:["update:modelValue"],setup(e,{emit:t}){const a=(0,b.Kh)({show:!0,timer:0,list:[],old:null});(0,l.wB)((()=>a.show),(e=>{e||setTimeout((()=>{t("update:modelValue",e)}),300)}));const o={0:"登入信标",1:"客户端列表",2:"客户端删除",4:"客户端改名(转发)",7:"获取服务器版本",8:"客户端搜索ids",9:"客户端id列表",10:"客户端排序",11:"客户端在线",12:"生成客户端id",13:"登入信标V_1_3_1",2001:"外网端口(转发)",2002:"外网端口(转发)",2003:"开始打洞(转发)",2004:"开始打洞(转发)",2005:"打洞失败(转发)",2006:"打洞失败(转发)",2007:"打洞成功(转发)",2008:"打洞成功(转发)",2009:"隧道配置(转发)",2010:"隧道配置(转发)",2012:"隧道同步(转发)",2101:"中继通知(转发)",2102:"中继通知(转发)",2103:"中继请求",2105:"中继连通测试",2201:"运行网卡(转发)",2203:"停止网卡(转发)",2204:"更新网卡",2205:"更新网卡(转发)",2208:"配置网卡网络",2209:"获取网卡网络",2210:"分配IP",2211:"网卡变化",2212:"网卡变化(转发)",2213:"IP续约",2214:"网卡端口转发检测",2215:"网卡端口转发检测(转发)",2301:"添加内网穿透",2302:"移除内网穿透",2303:"通知内网穿透(转发)",2304:"通知内网穿透UDP(转发)",2305:"获取穿透列表(转发)",2401:"测试端口转发(转发)",2403:"获取端口转发(转发)",2507:"同步配置",2508:"同步配置(转发)",2601:"更新信息(转发)",2602:"更新信息(转发)",2603:"确认更新(转发)",2604:"确认更新(转发)",2605:"重启(转发)",2606:"重启",2607:"服务器更新信息",2608:"确认服务器更新",2609:"服务器重启",2610:"订阅更新信息(转发)",2611:"订阅更新信息(转发)",2612:"检查更新",2613:"检查更新(转发)",2701:"服务器流量",2702:"服务器信标流量",2703:"服务器中继流量",2704:"服务器内网穿透流量",2807:"同步配置",2808:"同步配置(转发)",2900:"运行socks5",2901:"运行socks5(转发)",2902:"停止socks5",2903:"停止socks5(转发)",2904:"更新socks5",2905:"更新socks5(转发)",3003:"获取权限",3004:"获取权限(转发)",3005:"更新权限",3006:"更新权限(转发)"},n=()=>{Q().then((e=>{const t=a.old||e,l=[];for(let a in e){const n=e[a],r=t[a],i=`[${a}]${o[`${a}`]||"未知"}`;l.push({id:i,sendtBytes:n.SendtBytes,sendtBytesText:s(n.SendtBytes),sendtSpeed:n.SendtBytes-r.SendtBytes,sendtSpeedText:s(n.SendtBytes-r.SendtBytes),receiveBytes:n.ReceiveBytes,receiveBytesText:s(n.ReceiveBytes),receiveSpeed:n.ReceiveBytes-r.ReceiveBytes,receiveSpeedText:s(n.ReceiveBytes-r.ReceiveBytes)})}a.list=l.filter((e=>!!e.id)),a.old=e,a.timer=setTimeout(n,1e3)})).catch((e=>{a.timer=setTimeout(n,1e3)}))},s=e=>{let t=0;while(e>=1024)e/=1024,t++;return`${e.toFixed(2)}${["B","KB","MB","GB","TB"][t]}`};return(0,l.sV)((()=>{n()})),(0,l.hi)((()=>{clearTimeout(a.timer)})),{config:e.config,state:a}}};const J=(0,x.A)(H,[["render",q],["__scopeId","data-v-2183bbe0"]]);var Z=J;const ee={class:"head"},te={class:"page t-c"},ae={class:"page-wrap"};function le(e,t,a,n,s,r){const i=(0,l.g2)("el-input"),d=(0,l.g2)("el-table-column"),c=(0,l.g2)("el-table"),u=(0,l.g2)("el-pagination"),p=(0,l.g2)("el-dialog");return(0,l.uX)(),(0,l.Wv)(p,{title:"内网穿透流量",class:"options-center",top:"1vh","destroy-on-close":"",modelValue:n.state.show,"onUpdate:modelValue":t[1]||(t[1]=e=>n.state.show=e),width:"680"},{default:(0,l.k6)((()=>[(0,l.Lk)("div",null,[(0,l.Lk)("div",ee,[(0,l.bF)(i,{modelValue:n.state.page.Key,"onUpdate:modelValue":t[0]||(t[0]=e=>n.state.page.Key=e),placeholder:"域名/端口搜索"},null,8,["modelValue"])]),(0,l.bF)(c,{data:n.state.list,stripe:"",border:"",size:"small",width:"100%",height:"60vh",onSortChange:n.handleSort},{default:(0,l.k6)((()=>[(0,l.bF)(d,{prop:"Key",label:"域名/端口",width:"200"}),(0,l.bF)(d,{prop:"SendtBytes",label:"已上传",sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.SendtBytesText),1)])),_:1}),(0,l.bF)(d,{prop:"DiffSendtBytes",label:"上传速度",sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.DiffSendtBytesText)+"/s",1)])),_:1}),(0,l.bF)(d,{prop:"ReceiveBytes",label:"已下载",sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.ReceiveBytesText),1)])),_:1}),(0,l.bF)(d,{prop:"DiffReceiveBytes",label:"下载速度",sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.DiffReceiveBytesText)+"/s",1)])),_:1})])),_:1},8,["data","onSortChange"]),(0,l.Lk)("div",te,[(0,l.Lk)("div",ae,[(0,l.bF)(u,{small:"",background:"",layout:"total,prev,pager, next",total:n.state.page.Count,"page-size":n.state.page.PageSize,"current-page":n.state.page.Page,onCurrentChange:n.handlePageChange},null,8,["total","page-size","current-page","onCurrentChange"])])])])])),_:1},8,["modelValue"])}var oe={props:["modelValue","config"],emits:["update:modelValue"],setup(e,{emit:t}){const a=(0,b.Kh)({show:!0,timer:0,list:[],page:{Key:"",Page:1,PageSize:15,Count:0,Order:1,OrderType:0}});(0,l.wB)((()=>a.show),(e=>{e||setTimeout((()=>{t("update:modelValue",e)}),300)}));const o=()=>{N({Key:a.page.Key,Page:a.page.Page,PageSize:a.page.PageSize,Order:a.page.Order,OrderType:a.page.OrderType}).then((e=>{try{a.page.Page=e.Page,a.page.PageSize=e.PageSize,a.page.Count=e.Count;const t=[];for(let a=0;a{a.timer=setTimeout(o,1e3)}))},n=e=>{let t=0;while(e>=1024)e/=1024,t++;return`${e.toFixed(2)}${["B","KB","MB","GB","TB"][t]}`},s=e=>{e&&(a.page.Page=e)},r=e=>{const t={ascending:1,descending:0}[e.order],l={SendtBytes:1,DiffSendtBytes:2,ReceiveBytes:3,DiffReceiveBytes:4}[e.prop];a.page.Order=l,a.page.OrderType=t};return(0,l.sV)((()=>{o()})),(0,l.hi)((()=>{clearTimeout(a.timer)})),{config:e.config,state:a,handlePageChange:s,handleSort:r}}};const ne=(0,x.A)(oe,[["render",le],["__scopeId","data-v-3e577fa7"]]);var se=ne;const re={class:"head"},ie={class:"page t-c"},de={class:"page-wrap"};function ce(e,t,a,n,s,r){const i=(0,l.g2)("el-input"),d=(0,l.g2)("el-table-column"),c=(0,l.g2)("el-table"),u=(0,l.g2)("el-pagination"),p=(0,l.g2)("el-dialog");return(0,l.uX)(),(0,l.Wv)(p,{title:"中继流量",class:"options-center",top:"1vh","destroy-on-close":"",modelValue:n.state.show,"onUpdate:modelValue":t[1]||(t[1]=e=>n.state.show=e),width:"680"},{default:(0,l.k6)((()=>[(0,l.Lk)("div",null,[(0,l.Lk)("div",re,[(0,l.bF)(i,{modelValue:n.state.page.Key,"onUpdate:modelValue":t[0]||(t[0]=e=>n.state.page.Key=e),placeholder:"名字搜索"},null,8,["modelValue"])]),(0,l.bF)(c,{data:n.state.list,stripe:"",border:"",size:"small",width:"100%",height:"60vh",onSortChange:n.handleSort},{default:(0,l.k6)((()=>[(0,l.bF)(d,{prop:"FromName",label:"发起端",width:"120"}),(0,l.bF)(d,{prop:"ToName",label:"目标端",width:"120"}),(0,l.bF)(d,{prop:"SendtBytes",label:"已上传",sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.SendtBytesText),1)])),_:1}),(0,l.bF)(d,{prop:"DiffSendtBytes",label:"上传速度",sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.DiffSendtBytesText)+"/s",1)])),_:1}),(0,l.bF)(d,{prop:"ReceiveBytes",label:"已下载",sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.ReceiveBytesText),1)])),_:1}),(0,l.bF)(d,{prop:"DiffReceiveBytes",label:"下载速度",sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.DiffReceiveBytesText)+"/s",1)])),_:1})])),_:1},8,["data","onSortChange"]),(0,l.Lk)("div",ie,[(0,l.Lk)("div",de,[(0,l.bF)(u,{small:"",background:"",layout:"total,prev,pager, next",total:n.state.page.Count,"page-size":n.state.page.PageSize,"current-page":n.state.page.Page,onCurrentChange:n.handlePageChange},null,8,["total","page-size","current-page","onCurrentChange"])])])])])),_:1},8,["modelValue"])}var ue={props:["modelValue","config"],emits:["update:modelValue"],setup(e,{emit:t}){const a=(0,b.Kh)({show:!0,timer:0,list:[],page:{Key:"",Page:1,PageSize:15,Count:0,Order:1,OrderType:0}});(0,l.wB)((()=>a.show),(e=>{e||setTimeout((()=>{t("update:modelValue",e)}),300)}));const o=()=>{Y({Key:a.page.Key,Page:a.page.Page,PageSize:a.page.PageSize,Order:a.page.Order,OrderType:a.page.OrderType}).then((e=>{try{a.page.Page=e.Page,a.page.PageSize=e.PageSize,a.page.Count=e.Count;const t=[];for(let a=0;a{a.timer=setTimeout(o,1e3)}))},n=e=>{let t=0;while(e>=1024)e/=1024,t++;return`${e.toFixed(2)}${["B","KB","MB","GB","TB"][t]}`},s=e=>{e&&(a.page.Page=e)},r=e=>{const t={ascending:1,descending:0}[e.order],l={SendtBytes:1,DiffSendtBytes:2,ReceiveBytes:3,DiffReceiveBytes:4}[e.prop];a.page.Order=l,a.page.OrderType=t};return(0,l.sV)((()=>{o()})),(0,l.hi)((()=>{clearTimeout(a.timer)})),{config:e.config,state:a,handlePageChange:s,handleSort:r}}};const pe=(0,x.A)(ue,[["render",ce],["__scopeId","data-v-7dbf3a4a"]]);var ge=pe,ve={props:["config"],components:{ServerFlowMessenger:Z,ServerFlowSForward:se,ServerFlowRelay:ge},setup(e){const t=(0,F.B)(),a=(0,l.EW)((()=>t.value.hasAccess("SForwardFlow"))),o=(0,l.EW)((()=>t.value.hasAccess("RelayFlow"))),n=(0,l.EW)((()=>t.value.hasAccess("SigninFlow"))),s=(0,b.Kh)({show:!1,timer:0,overallSendtSpeed:"0000.00KB",overallReceiveSpeed:"0000.00KB",overallOnline:"0/0",serverOnline:"",time:"",list:[],old:null,details:{Messenger:!1,SForward:!1,Relay:!1}}),r=()=>{s.show=!0},i=e=>{s.details[e]=!0},d={External:{text:"外网端口",detail:!1},RelayReport:{text:"中继节点",detail:!1},Relay:{text:"中继",detail:o.value},Messenger:{text:"信标",detail:n.value},SForward:{text:"内网穿透",detail:a.value},flow:{text:"在线报告",detail:!1}},c=()=>{M().then((e=>{const t=s.old||e;if(e.Items["_"]&&(s.overallOnline=`${e.Items["_"].SendtBytes}/${e.Items["_"].ReceiveBytes}`,delete e.Items["_"]),e.Items["flow"]&&e.Items["flow"].ReceiveBytes>0){const t=(BigInt(e.Items["flow"].ReceiveBytes)>>BigInt(32)).toString(),a=(BigInt(e.Items["flow"].ReceiveBytes)&BigInt(4294967295)).toString(),l=e.Items["flow"].SendtBytes;s.serverOnline=`、${t}/${a}/${l}`,delete e.Items["flow"]}let a=0,l=0,o=0,n=0;for(let s in t.Items)a+=t.Items[s].ReceiveBytes,l+=t.Items[s].SendtBytes;for(let s in e.Items)o+=e.Items[s].ReceiveBytes,n+=e.Items[s].SendtBytes;s.overallSendtSpeed=u(n-l),s.overallReceiveSpeed=u(o-a),s.time=`从 ${e.Start}启动 至今`;const r=[];for(let s in e.Items){const a=e.Items[s],l=t.Items[s],o=d[`${s}`]||{text:`未知${s}`,detail:!1};r.push({id:s,text:o.text,detail:o.detail,sendtBytes:a.SendtBytes,sendtBytesText:u(a.SendtBytes),sendtSpeed:a.SendtBytes-l.SendtBytes,sendtSpeedText:u(a.SendtBytes-l.SendtBytes),receiveBytes:a.ReceiveBytes,receiveBytesText:u(a.ReceiveBytes),receiveSpeed:a.ReceiveBytes-l.ReceiveBytes,receiveSpeedText:u(a.ReceiveBytes-l.ReceiveBytes)})}s.list=r.filter((e=>!!e.id)),s.old=e,s.timer=setTimeout(c,1e3)})).catch((e=>{s.timer=setTimeout(c,1e3)}))},u=e=>{let t=0;while(e>=1024)e/=1024,t++;return`${e.toFixed(2)}${["B","KB","MB","GB","TB"][t]}`};return(0,l.sV)((()=>{c()})),(0,l.hi)((()=>{clearTimeout(s.timer)})),{hasSForwardFlow:a,config:e.config,state:s,handleShow:r,handleShowDetail:i}}};const fe=(0,x.A)(ve,[["render",G],["__scopeId","data-v-630048e8"]]);var me=fe;const he=["title"],ye={key:0,class:"progress"},ke={key:1,class:"progress"};function we(e,t,a,n,s,r){const i=(0,l.g2)("Loading"),d=(0,l.g2)("el-icon"),c=(0,l.g2)("Download"),u=(0,l.g2)("CircleCheck");return(0,l.uX)(),(0,l.CE)("a",{href:"javascript:;",title:"服务端的程序版本",onClick:t[0]||(t[0]=(...e)=>n.handleUpdate&&n.handleUpdate(...e)),class:(0,o.C4)(["download",n.updateColor()])},[(0,l.Lk)("span",null,(0,o.v_)(n.state.version),1),n.updaterCurrent.Version?((0,l.uX)(),(0,l.CE)(l.FK,{key:0},[1==n.updaterCurrent.Status?((0,l.uX)(),(0,l.Wv)(d,{key:0,size:"14",class:"loading"},{default:(0,l.k6)((()=>[(0,l.bF)(i)])),_:1})):2==n.updaterServer.Status?((0,l.uX)(),(0,l.Wv)(d,{key:1,size:"14"},{default:(0,l.k6)((()=>[(0,l.bF)(c)])),_:1})):3==n.updaterServer.Status||5==n.updaterServer.Status?((0,l.uX)(),(0,l.CE)(l.FK,{key:2},[(0,l.bF)(d,{size:"14",class:"loading"},{default:(0,l.k6)((()=>[(0,l.bF)(i)])),_:1}),0==n.updaterServer.Length?((0,l.uX)(),(0,l.CE)("span",ye,"0%")):((0,l.uX)(),(0,l.CE)("span",ke,(0,o.v_)(parseInt(n.updaterServer.Current/n.updaterServer.Length*100))+"%",1))],64)):6==n.updaterServer.Status?((0,l.uX)(),(0,l.Wv)(d,{key:3,size:"14",class:"yellow"},{default:(0,l.k6)((()=>[(0,l.bF)(u)])),_:1})):(0,l.Q3)("",!0)],64)):((0,l.uX)(),(0,l.Wv)(d,{key:1,size:"14"},{default:(0,l.k6)((()=>[(0,l.bF)(c)])),_:1}))],10,he)}var be=a(2933),Se=a(920),Be={components:{Promotion:_.Yk4,Download:_.f5X,Loading:_.Rhj,CircleCheck:_.rW7,ServerFlow:me},props:["config"],setup(e){const t=(0,F.B)(),a=(0,l.EW)((()=>t.value.hasAccess("UpdateServer"))),o=(0,b.KR)({Version:"",Msg:[],DateTime:"",Status:0,Length:0,Current:0}),n=(0,b.KR)({Version:"",Status:0,Length:0,Current:0}),s=(0,l.EW)((()=>`${o.value.Version}->${o.value.DateTime}\n${o.value.Msg.map(((e,t)=>`${t+1}、${e}`)).join("\n")}`)),r=(0,b.Kh)({show:!1,loading:!1,connected:(0,l.EW)((()=>t.value.signin.Connected)),version:(0,l.EW)((()=>t.value.signin.Version))}),i=()=>{(0,Se.Vk)().then((e=>{o.value.DateTime=e.DateTime,o.value.Version=e.Version,o.value.Status=e.Status,o.value.Length=e.Length,o.value.Current=e.Current,o.value.Msg=e.Msg,setTimeout((()=>{i()}),1e3)})).catch((()=>{setTimeout((()=>{i()}),1e3)}))},d=()=>{(0,Se.BJ)().then((e=>{n.value.Version=e.Version,n.value.Status=e.Status,n.value.Length=e.Length,n.value.Current=e.Current,n.value.Status>2&&n.value.Status<6&&setTimeout((()=>{d()}),1e3)})).catch((()=>{setTimeout((()=>{d()}),1e3)}))},c=()=>o.value.Version?n.value.Status<=2?r.version!=o.value.Version?`不是最新版本(${o.value.Version}),建议更新\n${s.value}`:`是最新版本,但我无法阻止你喜欢更新\n${s.value}`:{3:"正在下载",4:"已下载",5:"正在解压",6:"已解压,请重启"}[n.value.Status]:"未检测到更新",u=()=>r.version!=o.value.Version?"yellow":"green",p=()=>{e.config&&a.value&&(o.value.Version?[0,1,3,5].indexOf(n.value.Status)>=0?K.nk.error("操作中,请稍后!"):6!=n.value.Status?2==o.value.Status&&be.s.confirm("确定更新服务端吗?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((()=>{(0,Se.y2)(o.value.Version).then((()=>{setTimeout((()=>{d()}),1e3)}))})).catch((()=>{})):be.s.confirm("确定关闭服务端吗?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((()=>{(0,Se.aP)()})).catch((()=>{})):K.nk.error("未检测到更新"))};return(0,l.sV)((()=>{i(),d()})),{config:e.config,state:r,updaterCurrent:o,updaterServer:n,handleUpdate:p,updateText:c,updateColor:u}}};const Fe=(0,x.A)(Be,[["render",we],["__scopeId","data-v-70063cba"]]);var Ce=Fe,_e={components:{ServerConfig:X,ServerFlow:me,ServerVersion:Ce},props:["config"],setup(e){const t=(0,F.B)(),a=(0,l.EW)((()=>t.value.hasAccess("Flow"))),o=(0,b.Kh)({show:!1,loading:!1});return{config:e.config,hasFlow:a,state:o}}};const Ve=(0,x.A)(_e,[["render",I],["__scopeId","data-v-2d85a782"]]);var xe=Ve;const Te=e=>((0,l.Qi)("data-v-0ef57e46"),e=e(),(0,l.jt)(),e),Le={key:0,class:"status-export-wrap"},Re={class:"port-wrap"},Ie=Te((()=>(0,l.Lk)("div",{class:"text"}," 导出配置,作为子设备运行,如果使用docker,容器映射configs文件夹即可 ",-1))),Pe={class:"body"},Ee={class:"card-header"},We={class:"flex"},De={title:"这将生成唯一ID,多台设备使用产生冲突,挤压下线"},ze={style:{"margin-left":"2rem"}},Ke=Te((()=>(0,l.Lk)("span",null,"设备名 : ",-1))),$e=Te((()=>(0,l.Lk)("span",null,"管理密码 : ",-1)));function Ae(e,t,a,o,n,s){const r=(0,l.g2)("Share"),i=(0,l.g2)("el-icon"),d=(0,l.g2)("el-checkbox"),c=(0,l.g2)("el-input"),u=(0,l.g2)("Access"),p=(0,l.g2)("el-card"),g=(0,l.g2)("el-button"),v=(0,l.g2)("el-dialog");return o.config&&o.hasExport?((0,l.uX)(),(0,l.CE)("div",Le,[(0,l.Lk)("a",{href:"javascript:;",title:"此设备的管理接口",onClick:t[0]||(t[0]=e=>o.state.show=!0)},[(0,l.bF)(i,{size:"16"},{default:(0,l.k6)((()=>[(0,l.bF)(r)])),_:1}),(0,l.eW)(" 导出配置 ")]),(0,l.bF)(v,{class:"options-center",title:"导出配置","destroy-on-close":"",modelValue:o.state.show,"onUpdate:modelValue":t[5]||(t[5]=e=>o.state.show=e),center:"",width:"580",top:"1vh"},{footer:(0,l.k6)((()=>[(0,l.bF)(g,{plain:"",onClick:t[4]||(t[4]=e=>o.state.show=!1),loading:o.state.loading},{default:(0,l.k6)((()=>[(0,l.eW)("取消")])),_:1},8,["loading"]),(0,l.bF)(g,{type:"success",plain:"",onClick:o.handleExport,loading:o.state.loading},{default:(0,l.k6)((()=>[(0,l.eW)("确定导出")])),_:1},8,["onClick","loading"])])),default:(0,l.k6)((()=>[(0,l.Lk)("div",Re,[Ie,(0,l.Lk)("div",Pe,[(0,l.bF)(p,{shadow:"never"},{header:(0,l.k6)((()=>[(0,l.Lk)("div",Ee,[(0,l.Lk)("div",We,[(0,l.Lk)("div",De,[(0,l.bF)(d,{disabled:o.onlyNode,modelValue:o.state.single,"onUpdate:modelValue":t[1]||(t[1]=e=>o.state.single=e),label:"单设备"},null,8,["disabled","modelValue"])]),(0,l.Lk)("div",ze,[Ke,(0,l.bF)(c,{disabled:!o.state.single,modelValue:o.state.name,"onUpdate:modelValue":t[2]||(t[2]=e=>o.state.name=e),maxlength:"12","show-word-limit":"",style:{width:"15rem"}},null,8,["disabled","modelValue"])]),(0,l.Lk)("div",null,[$e,(0,l.bF)(c,{type:"password","show-password":"",disabled:o.onlyNode,modelValue:o.state.apipassword,"onUpdate:modelValue":t[3]||(t[3]=e=>o.state.apipassword=e),maxlength:"36","show-word-limit":"",style:{width:"15rem"}},null,8,["disabled","modelValue"])])])])])),default:(0,l.k6)((()=>[(0,l.bF)(u,{ref:"accessDom",machineid:o.machineId},null,8,["machineid"])])),_:1})])])])),_:1},8,["modelValue"])])):(0,l.Q3)("",!0)}var Xe=a(8835),Oe=a(9593),Ue={components:{Share:_.SYj,Access:Oe.A},props:["config"],setup(e){const t=(0,F.B)(),a=(0,l.EW)((()=>t.value.hasAccess("Export"))),o=(0,l.EW)((()=>t.value.config.Client.OnlyNode)),n=(0,l.EW)((()=>t.value.config.Client.Id)),s=(0,b.Kh)({show:!1,loading:!1,single:!0,name:"",apipassword:t.value.config.Client.CApi.ApiPassword}),r=(0,b.KR)(null),i=()=>{if(!a.value)return;const e={access:r.value.getValue(),single:s.single,name:s.name,apipassword:s.apipassword};if(e.single){if(!e.name)return void K.nk.error("请输入设备名")}else e.name="";if(!e.single||s.name)return e;K.nk.error("请输入管理密码")},d=()=>{const e=document.createElement("a");s.single?e.download=`client-node-export-${s.name}.zip`:e.download="client-node-export.zip",e.href="/client-node-export.zip",document.body.appendChild(e),e.click(),document.body.removeChild(e)},c=()=>{const e=i();e&&(s.loading=!0,(0,Xe.P$)(e).then((()=>{s.loading=!1,s.show=!1,K.nk.success("导出成功"),d()})).catch((()=>{s.loading=!1})))};return{config:e.config,onlyNode:o,hasExport:a,machineId:n,state:s,accessDom:r,handleExport:c}}};const je=(0,x.A)(Ue,[["render",Ae],["__scopeId","data-v-0ef57e46"]]);var Ge=je,Me=a(167),Qe={components:{Api:L,Server:xe,Export:Ge,UpdaterBtn:Me.A},props:["config"],setup(e){const t=(0,F.B)(),a=(0,l.EW)((()=>t.value.self)),o=(0,b.Kh)({showPay:!1});return{state:o,config:e.config,self:a}}};const Ne=(0,x.A)(Qe,[["render",w],["__scopeId","data-v-2a629595"]]);var Ye=Ne}}]); \ No newline at end of file diff --git a/linker.tray.win/web/js/827.ca8f5e05.js b/linker.tray.win/web/js/734.bccc9e7e.js similarity index 56% rename from linker.tray.win/web/js/827.ca8f5e05.js rename to linker.tray.win/web/js/734.bccc9e7e.js index bc451ad8..4e2d51bb 100644 --- a/linker.tray.win/web/js/827.ca8f5e05.js +++ b/linker.tray.win/web/js/734.bccc9e7e.js @@ -1 +1 @@ -"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[827],{3112:function(e,r,l){l.r(r),l.d(r,{default:function(){return Fe}});var a=l(6768);const t={class:"app-wrap flex flex-column flex-nowrap"},o={class:"head"},s={class:"body flex-1 relative",ref:"wrap"},u={class:"home absolute"},n={class:"status"};function d(e,r,l,d,m,i){const f=(0,a.g2)("Head"),c=(0,a.g2)("router-view"),b=(0,a.g2)("Status"),p=(0,a.g2)("Install");return(0,a.uX)(),(0,a.CE)("div",t,[(0,a.Lk)("div",o,[(0,a.bF)(f)]),(0,a.Lk)("div",s,[(0,a.Lk)("div",u,[(0,a.bF)(c)])],512),(0,a.Lk)("div",n,[(0,a.bF)(b,{config:!0}),(0,a.bF)(p)])])}l(4114);var m=l.p+"img/logo.892cb2fb.png",i=l.p+"img/shouye.4c820c0e.svg",f=l.p+"img/fuwuqi.247f2561.svg",c=l.p+"img/dadong.e6fd78bf.svg",b=l.p+"img/anquan.5f8d5e47.svg",p=l.p+"img/rizhi.c3ca751b.svg";const v=e=>((0,a.Qi)("data-v-288c64ff"),e=e(),(0,a.jt)(),e),g={class:"head flex"},k={class:"logo"},F=v((()=>(0,a.Lk)("img",{src:m,alt:""},null,-1))),w={class:"menu flex-1"},y={class:"flex"},h=v((()=>(0,a.Lk)("img",{src:i},null,-1))),S={key:0},_=v((()=>(0,a.Lk)("img",{src:f},null,-1))),K={key:1},V=v((()=>(0,a.Lk)("img",{src:c},null,-1))),P={key:2},C=v((()=>(0,a.Lk)("img",{src:b},null,-1))),x={key:3},L=v((()=>(0,a.Lk)("img",{src:p},null,-1))),W={class:"image"};function U(e,r,l,t,o,s){const u=(0,a.g2)("router-link"),n=(0,a.g2)("Background");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.Lk)("div",g,[(0,a.Lk)("div",k,[(0,a.bF)(u,{to:{name:"FullIndex"}},{default:(0,a.k6)((()=>[F])),_:1})]),(0,a.Lk)("div",w,[(0,a.Lk)("ul",y,[(0,a.Lk)("li",null,[(0,a.bF)(u,{to:{name:"FullIndex"}},{default:(0,a.k6)((()=>[h,(0,a.eW)(" 首页")])),_:1})]),t.hasConfig?((0,a.uX)(),(0,a.CE)("li",S,[(0,a.bF)(u,{to:{name:"FullServers"}},{default:(0,a.k6)((()=>[_,(0,a.eW)(" 服务器")])),_:1})])):(0,a.Q3)("",!0),t.hasTransport?((0,a.uX)(),(0,a.CE)("li",K,[(0,a.bF)(u,{to:{name:"FullTransport"}},{default:(0,a.k6)((()=>[V,(0,a.eW)(" 打洞协议")])),_:1})])):(0,a.Q3)("",!0),t.hasAction?((0,a.uX)(),(0,a.CE)("li",P,[(0,a.bF)(u,{to:{name:"FullAction"}},{default:(0,a.k6)((()=>[C,(0,a.eW)(" 自定义验证")])),_:1})])):(0,a.Q3)("",!0),t.hasLogger?((0,a.uX)(),(0,a.CE)("li",x,[(0,a.bF)(u,{to:{name:"FullLogger"}},{default:(0,a.k6)((()=>[L,(0,a.eW)(" 日志")])),_:1})])):(0,a.Q3)("",!0)])]),(0,a.Lk)("div",W,[(0,a.bF)(n,{name:"full"})])])])}var A=l(7477),X=l(3830),j=l(5096),Q={components:{Promotion:A.Yk4,StarFilled:A.BQ2,WarnTriangleFilled:A.DtC,PhoneFilled:A.pXb,HelpFilled:A.adD,Background:j.A},setup(){const e=(0,X.B)(),r=(0,a.EW)((()=>e.value.hasAccess("Config"))),l=(0,a.EW)((()=>e.value.hasAccess("LoggerShow"))),t=(0,a.EW)((()=>e.value.hasAccess("Transport"))),o=(0,a.EW)((()=>e.value.hasAccess("Action")));return{hasConfig:r,hasLogger:l,hasTransport:t,hasAction:o}}},E=l(1241);const I=(0,E.A)(Q,[["render",U],["__scopeId","data-v-288c64ff"]]);var N=I,q=l(9278);const R=e=>((0,a.Qi)("data-v-41d4c7eb"),e=e(),(0,a.jt)(),e),D={class:"head"},B={class:"body"},O=R((()=>(0,a.Lk)("div",{class:"t-c"},"完成保存后,请重启软件",-1))),T={class:"footer t-c"};function J(e,r,l,t,o,s){const u=(0,a.g2)("el-step"),n=(0,a.g2)("el-steps"),d=(0,a.g2)("Common"),m=(0,a.g2)("el-card"),i=(0,a.g2)("Server"),f=(0,a.g2)("Client"),c=(0,a.g2)("el-button"),b=(0,a.g2)("el-dialog");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.bF)(b,{modelValue:t.state.show,"onUpdate:modelValue":r[0]||(r[0]=e=>t.state.show=e),title:"初始化配置",width:"600",top:"2vh"},{default:(0,a.k6)((()=>[(0,a.Lk)("div",null,[(0,a.Lk)("div",D,[(0,a.bF)(n,{active:t.step.step,"finish-status":"success"},{default:(0,a.k6)((()=>[((0,a.uX)(!0),(0,a.CE)(a.FK,null,(0,a.pI)(t.state.steps,((e,r)=>((0,a.uX)(),(0,a.Wv)(u,{title:e},null,8,["title"])))),256))])),_:1},8,["active"])]),(0,a.Lk)("div",B,[1==t.step.step?((0,a.uX)(),(0,a.Wv)(m,{key:0,shadow:"never"},{default:(0,a.k6)((()=>[(0,a.bF)(d,{ref:"currentDom"},null,512)])),_:1})):(0,a.Q3)("",!0),2==t.step.step?((0,a.uX)(),(0,a.Wv)(m,{key:1,shadow:"never"},{default:(0,a.k6)((()=>[(0,a.bF)(i,{ref:"currentDom"},null,512)])),_:1})):(0,a.Q3)("",!0),3==t.step.step?((0,a.uX)(),(0,a.Wv)(m,{key:2,shadow:"never"},{default:(0,a.k6)((()=>[(0,a.bF)(f,{ref:"currentDom"},null,512)])),_:1})):(0,a.Q3)("",!0),4==t.step.step?((0,a.uX)(),(0,a.Wv)(m,{key:3,shadow:"never"},{default:(0,a.k6)((()=>[O])),_:1})):(0,a.Q3)("",!0)]),(0,a.Lk)("div",T,[(0,a.bF)(c,{disabled:t.step.step<=1,onClick:t.handlePrev},{default:(0,a.k6)((()=>[(0,a.eW)("上一步")])),_:1},8,["disabled","onClick"]),t.step.step[(0,a.eW)("下一步")])),_:1},8,["onClick"])):((0,a.uX)(),(0,a.Wv)(c,{key:1,type:"primary",onClick:t.handleSave},{default:(0,a.k6)((()=>[(0,a.eW)("完成")])),_:1},8,["onClick"]))])])])),_:1},8,["modelValue"])])}var H=l(8835),z=l(144),G=l(1219);const Y={class:"t-c"};function M(e,r,l,t,o,s){const u=(0,a.g2)("el-checkbox");return(0,a.uX)(),(0,a.CE)("div",Y,[(0,a.bF)(u,{modelValue:t.state.form.client,"onUpdate:modelValue":r[0]||(r[0]=e=>t.state.form.client=e),label:"作为客户端"},null,8,["modelValue"]),(0,a.bF)(u,{modelValue:t.state.form.server,"onUpdate:modelValue":r[1]||(r[1]=e=>t.state.form.server=e),label:"作为服务端"},null,8,["modelValue"])])}var Z={name:"Common",setup(){const e=(0,a.WQ)("step"),r=(0,z.Kh)({form:{client:e.value.form.common.client||e.value.json.Common&&e.value.json.Common.client||!0,server:e.value.form.common.server||e.value.json.Common&&e.value.json.Common.server||!1}}),l=e=>new Promise(((e,l)=>{r.form.client||r.form.server?e({json:{Common:{client:r.form.client,server:r.form.server,modes:[r.form.client?"client":"",r.form.server?"server":""].filter((e=>!!e))}},form:{common:JSON.parse(JSON.stringify(r.form))}}):(G.nk.error("请选择客户端或服务端"),l())}));return{state:r,handleValidate:l}}};const $=(0,E.A)(Z,[["render",M]]);var ee=$;const re=e=>((0,a.Qi)("data-v-c8ff678c"),e=e(),(0,a.jt)(),e),le=re((()=>(0,a.Lk)("div",{class:"t-c w-100"},[(0,a.Lk)("p",null,"端口为0则不监听,相同分组名之间的客户端相互可见")],-1)));function ae(e,r,l,t,o,s){const u=(0,a.g2)("el-form-item"),n=(0,a.g2)("el-input"),d=(0,a.g2)("el-col"),m=(0,a.g2)("el-row"),i=(0,a.g2)("el-checkbox"),f=(0,a.g2)("el-form");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.bF)(f,{ref:"formDom",model:t.state.form,rules:t.state.rules,"label-width":"8rem"},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[le])),_:1}),(0,a.bF)(u,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"机器名",prop:"name"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.name,"onUpdate:modelValue":r[0]||(r[0]=e=>t.state.form.name=e),maxlength:"12","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"网页端口",prop:"web"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{style:{width:"44.5rem"},modelValue:t.state.form.web,"onUpdate:modelValue":r[1]||(r[1]=e=>t.state.form.web=e)},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,a.bF)(u,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"接口端口",prop:"api"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.api,"onUpdate:modelValue":r[2]||(r[2]=e=>t.state.form.api=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"接口密码",prop:"password"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{type:"password",modelValue:t.state.form.password,"onUpdate:modelValue":r[3]||(r[3]=e=>t.state.form.password=e),"show-password":"",maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,a.bF)(u,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"分组名",prop:"groupid"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.groupid,"onUpdate:modelValue":r[4]||(r[4]=e=>t.state.form.groupid=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"分组密码",prop:"groupPassword"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.groupPassword,"onUpdate:modelValue":r[5]||(r[5]=e=>t.state.form.groupPassword=e),type:"password","show-password":"",maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,a.bF)(u,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:24},{default:(0,a.k6)((()=>[(0,a.bF)(u,{"label-width":"8rem",prop:"hasServer"},{default:(0,a.k6)((()=>[(0,a.bF)(i,{modelValue:t.state.form.hasServer,"onUpdate:modelValue":r[6]||(r[6]=e=>t.state.form.hasServer=e),label:"我有服务器(私有部署服务端,使用自己的服务器)",size:"large"},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),t.state.form.hasServer?((0,a.uX)(),(0,a.Wv)(u,{key:0,label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"信标服务",prop:"server"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.server,"onUpdate:modelValue":r[7]||(r[7]=e=>t.state.form.server=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"信标密钥",prop:"serverSecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.serverSecretKey,"onUpdate:modelValue":r[8]||(r[8]=e=>t.state.form.serverSecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1})):(0,a.Q3)("",!0),t.state.form.hasServer?((0,a.uX)(),(0,a.Wv)(u,{key:1,label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"穿透密钥",prop:"sForwardSecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.sForwardSecretKey,"onUpdate:modelValue":r[9]||(r[9]=e=>t.state.form.sForwardSecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"中继密钥",prop:"relaySecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.relaySecretKey,"onUpdate:modelValue":r[10]||(r[10]=e=>t.state.form.relaySecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1})):(0,a.Q3)("",!0),t.state.form.hasServer?((0,a.uX)(),(0,a.Wv)(u,{key:2,label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"更新密钥",prop:"updaterSecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.updaterSecretKey,"onUpdate:modelValue":r[11]||(r[11]=e=>t.state.form.updaterSecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"占位"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{disabled:"",maxlength:"36","show-word-limit":""})])),_:1})])),_:1})])),_:1})])),_:1})):(0,a.Q3)("",!0)])),_:1},8,["model","rules"])])}var te={setup(e){const r=(0,a.WQ)("step"),l=(0,X.B)(),t=(0,z.Kh)({form:{name:r.value.form.client.name||l.value.config.Client.Name,groupid:r.value.form.client.groupid||l.value.config.Client.Group.Id,groupPassword:r.value.form.client.groupPassword||l.value.config.Client.Group.Password,api:r.value.form.client.api||l.value.config.Client.CApi.ApiPort,web:r.value.form.client.web||l.value.config.Client.CApi.WebPort,password:r.value.form.client.password||l.value.config.Client.CApi.ApiPassword,hasServer:r.value.form.client.hasServer||!1,server:r.value.form.client.server||l.value.config.Client.ServerInfo.Host,serverSecretKey:r.value.form.client.serverSecretKey||l.value.config.Client.ServerSecretKey,sForwardSecretKey:r.value.form.client.sForwardSecretKey||l.value.config.Client.SForward.SecretKey,relaySecretKey:r.value.form.client.relaySecretKey||(l.value.config.Client.Relay.Servers[0]||{SecretKey:"snltty"}).SecretKey,updaterSecretKey:r.value.form.client.updaterSecretKey||l.value.config.Client.Updater.SecretKey},rules:{name:[{required:!0,message:"必填",trigger:"blur"}],groupid:[{required:!0,message:"必填",trigger:"blur"}],groupPassword:[{required:!0,message:"必填",trigger:"blur"}],password:[{required:!0,message:"必填",trigger:"blur"}],api:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:0,max:65535,message:"数字 0-65535",trigger:"blur",transform(e){return Number(e)}}],web:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:0,max:65535,message:"数字 0-65535",trigger:"blur",transform(e){return Number(e)}}]}}),o=(0,z.KR)(null),s=()=>new Promise(((e,r)=>{o.value.validate((l=>{l?e({json:{Client:{name:t.form.name,groupid:t.form.groupid,groupPassword:t.form.groupPassword,api:+t.form.api,web:+t.form.web,password:t.form.password,hasServer:t.form.hasServer,server:t.form.server,serverSecretKey:t.form.serverSecretKey,sForwardSecretKey:t.form.sForwardSecretKey,relaySecretKey:t.form.relaySecretKey,updaterSecretKey:t.form.updaterSecretKey}},form:{client:JSON.parse(JSON.stringify(t.form))}}):r()}))}));return(0,a.sV)((()=>{0==r.value.json.Common.client&&(r.value.step+=r.value.increment)})),{state:t,handleValidate:s,formDom:o}}};const oe=(0,E.A)(te,[["render",ae],["__scopeId","data-v-c8ff678c"]]);var se=oe;const ue=e=>((0,a.Qi)("data-v-5cebfa33"),e=e(),(0,a.jt)(),e),ne=ue((()=>(0,a.Lk)("div",{class:"t-c w-100"},"端口为0则不监听",-1)));function de(e,r,l,t,o,s){const u=(0,a.g2)("el-form-item"),n=(0,a.g2)("el-input"),d=(0,a.g2)("el-col"),m=(0,a.g2)("el-row"),i=(0,a.g2)("el-form");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.bF)(i,{ref:"formDom",model:t.state.form,rules:t.state.rules,"label-width":"10rem"},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[ne])),_:1}),(0,a.bF)(u,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"服务端口",prop:"servicePort"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.servicePort,"onUpdate:modelValue":r[0]||(r[0]=e=>t.state.form.servicePort=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"web穿透端口",prop:"webPort"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.webPort,"onUpdate:modelValue":r[1]||(r[1]=e=>t.state.form.webPort=e)},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,a.bF)(u,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"开放最小端口",prop:"tunnelPort1"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.tunnelPort1,"onUpdate:modelValue":r[2]||(r[2]=e=>t.state.form.tunnelPort1=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"开放最大端口",prop:"tunnelPort2"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.tunnelPort2,"onUpdate:modelValue":r[3]||(r[3]=e=>t.state.form.tunnelPort2=e)},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,a.bF)(u,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"穿透密钥",prop:"sForwardSecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.sForwardSecretKey,"onUpdate:modelValue":r[4]||(r[4]=e=>t.state.form.sForwardSecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"中继密钥",prop:"relaySecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.relaySecretKey,"onUpdate:modelValue":r[5]||(r[5]=e=>t.state.form.relaySecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,a.bF)(u,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"信标密钥",prop:"signinSecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.signinSecretKey,"onUpdate:modelValue":r[6]||(r[6]=e=>t.state.form.signinSecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"更新密钥",prop:"updaterSecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.updaterSecretKey,"onUpdate:modelValue":r[7]||(r[7]=e=>t.state.form.updaterSecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1})])),_:1},8,["model","rules"])])}var me={setup(e){const r=(0,a.WQ)("step"),l=(0,X.B)(),t=(0,z.Kh)({show:!1,form:{signinSecretKey:r.value.form.server.signinSecretKey||l.value.config.Server.SignIn.SecretKey,relaySecretKey:r.value.form.server.relaySecretKey||l.value.config.Server.Relay.SecretKey,sForwardSecretKey:r.value.form.server.sForwardSecretKey||l.value.config.Server.SForward.SecretKey,servicePort:r.value.form.server.servicePort||l.value.config.Server.ServicePort,webPort:r.value.form.server.webPort||l.value.config.Server.SForward.WebPort,tunnelPort1:r.value.form.server.tunnelPort1||l.value.config.Server.SForward.TunnelPortRange[0],tunnelPort2:r.value.form.server.tunnelPort2||l.value.config.Server.SForward.TunnelPortRange[1],updaterSecretKey:r.value.form.server.updaterSecretKey||l.value.config.Server.Updater.SecretKey},rules:{relaySecretKey:[{required:!0,message:"必填",trigger:"blur"}],sForwardSecretKey:[{required:!0,message:"必填",trigger:"blur"}],servicePort:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:0,max:65535,message:"数字 0-65535",trigger:"blur",transform(e){return Number(e)}}],webPort:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:0,max:65535,message:"数字 0-65535",trigger:"blur",transform(e){return Number(e)}}],tunnelPort1:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:0,max:65535,message:"数字 0-65535",trigger:"blur",transform(e){return Number(e)}}],tunnelPort2:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:0,max:65535,message:"数字 0-65535",trigger:"blur",transform(e){return Number(e)}}]}}),o=(0,z.KR)(null),s=()=>new Promise(((e,r)=>{o.value.validate((l=>{0==l?r():e({json:{Server:{ServicePort:+t.form.servicePort,Relay:{SecretKey:t.form.relaySecretKey},SForward:{SecretKey:t.form.sForwardSecretKey,WebPort:+t.form.webPort,TunnelPortRange:[+t.form.tunnelPort1,+t.form.tunnelPort2]},Updater:{SecretKey:t.form.updaterSecretKey},SignIn:{SecretKey:t.form.signinSecretKey}}},form:{server:JSON.parse(JSON.stringify(t.form))}})}))}));return(0,a.sV)((()=>{0==r.value.json.Common.server&&(r.value.step+=r.value.increment)})),{state:t,handleValidate:s,formDom:o}}};const ie=(0,E.A)(me,[["render",de],["__scopeId","data-v-5cebfa33"]]);var fe=ie,ce={components:{Common:ee,Client:se,Server:fe},setup(e){const r=(0,X.B)(),l=(0,z.Kh)({show:0==r.value.config.Common.Install,steps:["选择模式","服务端","客户端","完成"]}),t=(0,z.KR)(null),o=(0,z.KR)({step:1,increment:1,json:{},form:{server:{},client:{},common:{}}});(0,a.Gt)("step",o);const s=()=>{o.value.step--,o.value.increment=-1},u=()=>{o.value.increment=1,t.value.handleValidate().then((e=>{o.value.json=Object.assign(o.value.json,e.json),o.value.form=Object.assign(o.value.form,e.form),o.value.step++})).catch((()=>{}))},n=()=>{(0,H.ai)(o.value.json).then((()=>{G.nk.success("保存成功")})).catch((()=>{G.nk.error("保存失败")}))};return{state:l,currentDom:t,step:o,handlePrev:s,handleNext:u,handleSave:n}}};const be=(0,E.A)(ce,[["render",J],["__scopeId","data-v-41d4c7eb"]]);var pe=be,ve=l(1387),ge={name:"Index",components:{Head:N,Status:q.A,Install:pe},setup(e){const r=(0,X.B)(),l=(0,ve.rd)(),t=(0,z.KR)(null),o=()=>{(0,a.dY)((()=>{r.value.height=t.value.offsetHeight}))};return(0,a.sV)((()=>{0==r.value.hasAccess("FullManager")&&l.push({name:"NoPermission"}),window.addEventListener("resize",o),o()})),(0,a.hi)((()=>{window.removeEventListener("resize",o)})),{wrap:t}}};const ke=(0,E.A)(ge,[["render",d],["__scopeId","data-v-5ea3415a"]]);var Fe=ke}}]); \ No newline at end of file +"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[734],{8933:function(e,r,l){l.r(r),l.d(r,{default:function(){return Fe}});var a=l(6768);const t={class:"app-wrap flex flex-column flex-nowrap"},o={class:"head"},s={class:"body flex-1 relative",ref:"wrap"},u={class:"home absolute"},n={class:"status"};function d(e,r,l,d,m,i){const f=(0,a.g2)("Head"),c=(0,a.g2)("router-view"),b=(0,a.g2)("Status"),p=(0,a.g2)("Install");return(0,a.uX)(),(0,a.CE)("div",t,[(0,a.Lk)("div",o,[(0,a.bF)(f)]),(0,a.Lk)("div",s,[(0,a.Lk)("div",u,[(0,a.bF)(c)])],512),(0,a.Lk)("div",n,[(0,a.bF)(b,{config:!0}),(0,a.bF)(p)])])}l(4114);var m=l.p+"img/logo.892cb2fb.png",i=l.p+"img/shouye.4c820c0e.svg",f=l.p+"img/fuwuqi.247f2561.svg",c=l.p+"img/dadong.e6fd78bf.svg",b=l.p+"img/anquan.5f8d5e47.svg",p=l.p+"img/rizhi.c3ca751b.svg";const v=e=>((0,a.Qi)("data-v-288c64ff"),e=e(),(0,a.jt)(),e),g={class:"head flex"},k={class:"logo"},F=v((()=>(0,a.Lk)("img",{src:m,alt:""},null,-1))),w={class:"menu flex-1"},y={class:"flex"},h=v((()=>(0,a.Lk)("img",{src:i},null,-1))),S={key:0},_=v((()=>(0,a.Lk)("img",{src:f},null,-1))),K={key:1},V=v((()=>(0,a.Lk)("img",{src:c},null,-1))),P={key:2},C=v((()=>(0,a.Lk)("img",{src:b},null,-1))),x={key:3},L=v((()=>(0,a.Lk)("img",{src:p},null,-1))),W={class:"image"};function U(e,r,l,t,o,s){const u=(0,a.g2)("router-link"),n=(0,a.g2)("Background");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.Lk)("div",g,[(0,a.Lk)("div",k,[(0,a.bF)(u,{to:{name:"FullIndex"}},{default:(0,a.k6)((()=>[F])),_:1})]),(0,a.Lk)("div",w,[(0,a.Lk)("ul",y,[(0,a.Lk)("li",null,[(0,a.bF)(u,{to:{name:"FullIndex"}},{default:(0,a.k6)((()=>[h,(0,a.eW)(" 首页")])),_:1})]),t.hasConfig?((0,a.uX)(),(0,a.CE)("li",S,[(0,a.bF)(u,{to:{name:"FullServers"}},{default:(0,a.k6)((()=>[_,(0,a.eW)(" 服务器")])),_:1})])):(0,a.Q3)("",!0),t.hasTransport?((0,a.uX)(),(0,a.CE)("li",K,[(0,a.bF)(u,{to:{name:"FullTransport"}},{default:(0,a.k6)((()=>[V,(0,a.eW)(" 打洞协议")])),_:1})])):(0,a.Q3)("",!0),t.hasAction?((0,a.uX)(),(0,a.CE)("li",P,[(0,a.bF)(u,{to:{name:"FullAction"}},{default:(0,a.k6)((()=>[C,(0,a.eW)(" 自定义验证")])),_:1})])):(0,a.Q3)("",!0),t.hasLogger?((0,a.uX)(),(0,a.CE)("li",x,[(0,a.bF)(u,{to:{name:"FullLogger"}},{default:(0,a.k6)((()=>[L,(0,a.eW)(" 日志")])),_:1})])):(0,a.Q3)("",!0)])]),(0,a.Lk)("div",W,[(0,a.bF)(n,{name:"full"})])])])}var A=l(7477),X=l(3830),j=l(5096),Q={components:{Promotion:A.Yk4,StarFilled:A.BQ2,WarnTriangleFilled:A.DtC,PhoneFilled:A.pXb,HelpFilled:A.adD,Background:j.A},setup(){const e=(0,X.B)(),r=(0,a.EW)((()=>e.value.hasAccess("Config"))),l=(0,a.EW)((()=>e.value.hasAccess("LoggerShow"))),t=(0,a.EW)((()=>e.value.hasAccess("Transport"))),o=(0,a.EW)((()=>e.value.hasAccess("Action")));return{hasConfig:r,hasLogger:l,hasTransport:t,hasAction:o}}},E=l(1241);const N=(0,E.A)(Q,[["render",U],["__scopeId","data-v-288c64ff"]]);var I=N,q=l(3269);const R=e=>((0,a.Qi)("data-v-41d4c7eb"),e=e(),(0,a.jt)(),e),D={class:"head"},B={class:"body"},O=R((()=>(0,a.Lk)("div",{class:"t-c"},"完成保存后,请重启软件",-1))),T={class:"footer t-c"};function J(e,r,l,t,o,s){const u=(0,a.g2)("el-step"),n=(0,a.g2)("el-steps"),d=(0,a.g2)("Common"),m=(0,a.g2)("el-card"),i=(0,a.g2)("Server"),f=(0,a.g2)("Client"),c=(0,a.g2)("el-button"),b=(0,a.g2)("el-dialog");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.bF)(b,{modelValue:t.state.show,"onUpdate:modelValue":r[0]||(r[0]=e=>t.state.show=e),title:"初始化配置",width:"600",top:"2vh"},{default:(0,a.k6)((()=>[(0,a.Lk)("div",null,[(0,a.Lk)("div",D,[(0,a.bF)(n,{active:t.step.step,"finish-status":"success"},{default:(0,a.k6)((()=>[((0,a.uX)(!0),(0,a.CE)(a.FK,null,(0,a.pI)(t.state.steps,((e,r)=>((0,a.uX)(),(0,a.Wv)(u,{title:e},null,8,["title"])))),256))])),_:1},8,["active"])]),(0,a.Lk)("div",B,[1==t.step.step?((0,a.uX)(),(0,a.Wv)(m,{key:0,shadow:"never"},{default:(0,a.k6)((()=>[(0,a.bF)(d,{ref:"currentDom"},null,512)])),_:1})):(0,a.Q3)("",!0),2==t.step.step?((0,a.uX)(),(0,a.Wv)(m,{key:1,shadow:"never"},{default:(0,a.k6)((()=>[(0,a.bF)(i,{ref:"currentDom"},null,512)])),_:1})):(0,a.Q3)("",!0),3==t.step.step?((0,a.uX)(),(0,a.Wv)(m,{key:2,shadow:"never"},{default:(0,a.k6)((()=>[(0,a.bF)(f,{ref:"currentDom"},null,512)])),_:1})):(0,a.Q3)("",!0),4==t.step.step?((0,a.uX)(),(0,a.Wv)(m,{key:3,shadow:"never"},{default:(0,a.k6)((()=>[O])),_:1})):(0,a.Q3)("",!0)]),(0,a.Lk)("div",T,[(0,a.bF)(c,{disabled:t.step.step<=1,onClick:t.handlePrev},{default:(0,a.k6)((()=>[(0,a.eW)("上一步")])),_:1},8,["disabled","onClick"]),t.step.step[(0,a.eW)("下一步")])),_:1},8,["onClick"])):((0,a.uX)(),(0,a.Wv)(c,{key:1,type:"primary",onClick:t.handleSave},{default:(0,a.k6)((()=>[(0,a.eW)("完成")])),_:1},8,["onClick"]))])])])),_:1},8,["modelValue"])])}var H=l(8835),z=l(144),G=l(1219);const Y={class:"t-c"};function M(e,r,l,t,o,s){const u=(0,a.g2)("el-checkbox");return(0,a.uX)(),(0,a.CE)("div",Y,[(0,a.bF)(u,{modelValue:t.state.form.client,"onUpdate:modelValue":r[0]||(r[0]=e=>t.state.form.client=e),label:"作为客户端"},null,8,["modelValue"]),(0,a.bF)(u,{modelValue:t.state.form.server,"onUpdate:modelValue":r[1]||(r[1]=e=>t.state.form.server=e),label:"作为服务端"},null,8,["modelValue"])])}var Z={name:"Common",setup(){const e=(0,a.WQ)("step"),r=(0,z.Kh)({form:{client:e.value.form.common.client||e.value.json.Common&&e.value.json.Common.client||!0,server:e.value.form.common.server||e.value.json.Common&&e.value.json.Common.server||!1}}),l=e=>new Promise(((e,l)=>{r.form.client||r.form.server?e({json:{Common:{client:r.form.client,server:r.form.server,modes:[r.form.client?"client":"",r.form.server?"server":""].filter((e=>!!e))}},form:{common:JSON.parse(JSON.stringify(r.form))}}):(G.nk.error("请选择客户端或服务端"),l())}));return{state:r,handleValidate:l}}};const $=(0,E.A)(Z,[["render",M]]);var ee=$;const re=e=>((0,a.Qi)("data-v-19accc48"),e=e(),(0,a.jt)(),e),le=re((()=>(0,a.Lk)("div",{class:"t-c w-100"},[(0,a.Lk)("p",null,"端口为0则不监听,相同分组名之间的客户端相互可见")],-1)));function ae(e,r,l,t,o,s){const u=(0,a.g2)("el-form-item"),n=(0,a.g2)("el-input"),d=(0,a.g2)("el-col"),m=(0,a.g2)("el-row"),i=(0,a.g2)("el-checkbox"),f=(0,a.g2)("el-form");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.bF)(f,{ref:"formDom",model:t.state.form,rules:t.state.rules,"label-width":"8rem"},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[le])),_:1}),(0,a.bF)(u,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"机器名",prop:"name"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.name,"onUpdate:modelValue":r[0]||(r[0]=e=>t.state.form.name=e),maxlength:"12","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"网页端口",prop:"web"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{style:{width:"44.5rem"},modelValue:t.state.form.web,"onUpdate:modelValue":r[1]||(r[1]=e=>t.state.form.web=e)},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,a.bF)(u,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"接口端口",prop:"api"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.api,"onUpdate:modelValue":r[2]||(r[2]=e=>t.state.form.api=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"接口密码",prop:"password"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{type:"password",modelValue:t.state.form.password,"onUpdate:modelValue":r[3]||(r[3]=e=>t.state.form.password=e),"show-password":"",maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,a.bF)(u,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"分组名",prop:"groupid"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.groupid,"onUpdate:modelValue":r[4]||(r[4]=e=>t.state.form.groupid=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"分组密码",prop:"groupPassword"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.groupPassword,"onUpdate:modelValue":r[5]||(r[5]=e=>t.state.form.groupPassword=e),type:"password","show-password":"",maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,a.bF)(u,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:24},{default:(0,a.k6)((()=>[(0,a.bF)(u,{"label-width":"8rem",prop:"hasServer"},{default:(0,a.k6)((()=>[(0,a.bF)(i,{modelValue:t.state.form.hasServer,"onUpdate:modelValue":r[6]||(r[6]=e=>t.state.form.hasServer=e),label:"我有服务器(私有部署服务端,使用自己的服务器)",size:"large"},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),t.state.form.hasServer?((0,a.uX)(),(0,a.Wv)(u,{key:0,label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"信标服务",prop:"server"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.server,"onUpdate:modelValue":r[7]||(r[7]=e=>t.state.form.server=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"信标密钥",prop:"serverSecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.serverSecretKey,"onUpdate:modelValue":r[8]||(r[8]=e=>t.state.form.serverSecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1})):(0,a.Q3)("",!0),t.state.form.hasServer?((0,a.uX)(),(0,a.Wv)(u,{key:1,label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"穿透密钥",prop:"sForwardSecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.sForwardSecretKey,"onUpdate:modelValue":r[9]||(r[9]=e=>t.state.form.sForwardSecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"中继密钥",prop:"relaySecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.relaySecretKey,"onUpdate:modelValue":r[10]||(r[10]=e=>t.state.form.relaySecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1})):(0,a.Q3)("",!0),t.state.form.hasServer?((0,a.uX)(),(0,a.Wv)(u,{key:2,label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"更新密钥",prop:"updaterSecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.updaterSecretKey,"onUpdate:modelValue":r[11]||(r[11]=e=>t.state.form.updaterSecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"占位"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{disabled:"",maxlength:"36","show-word-limit":""})])),_:1})])),_:1})])),_:1})])),_:1})):(0,a.Q3)("",!0)])),_:1},8,["model","rules"])])}var te={setup(e){const r=(0,a.WQ)("step"),l=(0,X.B)(),t=(0,z.Kh)({form:{name:r.value.form.client.name||l.value.config.Client.Name,groupid:r.value.form.client.groupid||l.value.config.Client.Group.Id,groupPassword:r.value.form.client.groupPassword||l.value.config.Client.Group.Password,api:r.value.form.client.api||l.value.config.Client.CApi.ApiPort,web:r.value.form.client.web||l.value.config.Client.CApi.WebPort,password:r.value.form.client.password||l.value.config.Client.CApi.ApiPassword,hasServer:r.value.form.client.hasServer||!1,server:r.value.form.client.server||l.value.config.Client.Server.Host,serverSecretKey:r.value.form.client.serverSecretKey||l.value.config.Client.ServerSecretKey,sForwardSecretKey:r.value.form.client.sForwardSecretKey||l.value.config.Client.SForward.SecretKey,relaySecretKey:r.value.form.client.relaySecretKey||(l.value.config.Client.Relay.Servers[0]||{SecretKey:"snltty"}).SecretKey,updaterSecretKey:r.value.form.client.updaterSecretKey||l.value.config.Client.Updater.SecretKey},rules:{name:[{required:!0,message:"必填",trigger:"blur"}],groupid:[{required:!0,message:"必填",trigger:"blur"}],groupPassword:[{required:!0,message:"必填",trigger:"blur"}],password:[{required:!0,message:"必填",trigger:"blur"}],api:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:0,max:65535,message:"数字 0-65535",trigger:"blur",transform(e){return Number(e)}}],web:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:0,max:65535,message:"数字 0-65535",trigger:"blur",transform(e){return Number(e)}}]}}),o=(0,z.KR)(null),s=()=>new Promise(((e,r)=>{o.value.validate((l=>{l?e({json:{Client:{name:t.form.name,groupid:t.form.groupid,groupPassword:t.form.groupPassword,api:+t.form.api,web:+t.form.web,password:t.form.password,hasServer:t.form.hasServer,server:t.form.server,serverSecretKey:t.form.serverSecretKey,sForwardSecretKey:t.form.sForwardSecretKey,relaySecretKey:t.form.relaySecretKey,updaterSecretKey:t.form.updaterSecretKey}},form:{client:JSON.parse(JSON.stringify(t.form))}}):r()}))}));return(0,a.sV)((()=>{0==r.value.json.Common.client&&(r.value.step+=r.value.increment)})),{state:t,handleValidate:s,formDom:o}}};const oe=(0,E.A)(te,[["render",ae],["__scopeId","data-v-19accc48"]]);var se=oe;const ue=e=>((0,a.Qi)("data-v-5cebfa33"),e=e(),(0,a.jt)(),e),ne=ue((()=>(0,a.Lk)("div",{class:"t-c w-100"},"端口为0则不监听",-1)));function de(e,r,l,t,o,s){const u=(0,a.g2)("el-form-item"),n=(0,a.g2)("el-input"),d=(0,a.g2)("el-col"),m=(0,a.g2)("el-row"),i=(0,a.g2)("el-form");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.bF)(i,{ref:"formDom",model:t.state.form,rules:t.state.rules,"label-width":"10rem"},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[ne])),_:1}),(0,a.bF)(u,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"服务端口",prop:"servicePort"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.servicePort,"onUpdate:modelValue":r[0]||(r[0]=e=>t.state.form.servicePort=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"web穿透端口",prop:"webPort"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.webPort,"onUpdate:modelValue":r[1]||(r[1]=e=>t.state.form.webPort=e)},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,a.bF)(u,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"开放最小端口",prop:"tunnelPort1"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.tunnelPort1,"onUpdate:modelValue":r[2]||(r[2]=e=>t.state.form.tunnelPort1=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"开放最大端口",prop:"tunnelPort2"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.tunnelPort2,"onUpdate:modelValue":r[3]||(r[3]=e=>t.state.form.tunnelPort2=e)},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,a.bF)(u,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"穿透密钥",prop:"sForwardSecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.sForwardSecretKey,"onUpdate:modelValue":r[4]||(r[4]=e=>t.state.form.sForwardSecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"中继密钥",prop:"relaySecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.relaySecretKey,"onUpdate:modelValue":r[5]||(r[5]=e=>t.state.form.relaySecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,a.bF)(u,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"信标密钥",prop:"signinSecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.signinSecretKey,"onUpdate:modelValue":r[6]||(r[6]=e=>t.state.form.signinSecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"更新密钥",prop:"updaterSecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.form.updaterSecretKey,"onUpdate:modelValue":r[7]||(r[7]=e=>t.state.form.updaterSecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1})])),_:1},8,["model","rules"])])}var me={setup(e){const r=(0,a.WQ)("step"),l=(0,X.B)(),t=(0,z.Kh)({show:!1,form:{signinSecretKey:r.value.form.server.signinSecretKey||l.value.config.Server.SignIn.SecretKey,relaySecretKey:r.value.form.server.relaySecretKey||l.value.config.Server.Relay.SecretKey,sForwardSecretKey:r.value.form.server.sForwardSecretKey||l.value.config.Server.SForward.SecretKey,servicePort:r.value.form.server.servicePort||l.value.config.Server.ServicePort,webPort:r.value.form.server.webPort||l.value.config.Server.SForward.WebPort,tunnelPort1:r.value.form.server.tunnelPort1||l.value.config.Server.SForward.TunnelPortRange[0],tunnelPort2:r.value.form.server.tunnelPort2||l.value.config.Server.SForward.TunnelPortRange[1],updaterSecretKey:r.value.form.server.updaterSecretKey||l.value.config.Server.Updater.SecretKey},rules:{relaySecretKey:[{required:!0,message:"必填",trigger:"blur"}],sForwardSecretKey:[{required:!0,message:"必填",trigger:"blur"}],servicePort:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:0,max:65535,message:"数字 0-65535",trigger:"blur",transform(e){return Number(e)}}],webPort:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:0,max:65535,message:"数字 0-65535",trigger:"blur",transform(e){return Number(e)}}],tunnelPort1:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:0,max:65535,message:"数字 0-65535",trigger:"blur",transform(e){return Number(e)}}],tunnelPort2:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:0,max:65535,message:"数字 0-65535",trigger:"blur",transform(e){return Number(e)}}]}}),o=(0,z.KR)(null),s=()=>new Promise(((e,r)=>{o.value.validate((l=>{0==l?r():e({json:{Server:{ServicePort:+t.form.servicePort,Relay:{SecretKey:t.form.relaySecretKey},SForward:{SecretKey:t.form.sForwardSecretKey,WebPort:+t.form.webPort,TunnelPortRange:[+t.form.tunnelPort1,+t.form.tunnelPort2]},Updater:{SecretKey:t.form.updaterSecretKey},SignIn:{SecretKey:t.form.signinSecretKey}}},form:{server:JSON.parse(JSON.stringify(t.form))}})}))}));return(0,a.sV)((()=>{0==r.value.json.Common.server&&(r.value.step+=r.value.increment)})),{state:t,handleValidate:s,formDom:o}}};const ie=(0,E.A)(me,[["render",de],["__scopeId","data-v-5cebfa33"]]);var fe=ie,ce={components:{Common:ee,Client:se,Server:fe},setup(e){const r=(0,X.B)(),l=(0,z.Kh)({show:0==r.value.config.Common.Install,steps:["选择模式","服务端","客户端","完成"]}),t=(0,z.KR)(null),o=(0,z.KR)({step:1,increment:1,json:{},form:{server:{},client:{},common:{}}});(0,a.Gt)("step",o);const s=()=>{o.value.step--,o.value.increment=-1},u=()=>{o.value.increment=1,t.value.handleValidate().then((e=>{o.value.json=Object.assign(o.value.json,e.json),o.value.form=Object.assign(o.value.form,e.form),o.value.step++})).catch((()=>{}))},n=()=>{(0,H.ai)(o.value.json).then((()=>{G.nk.success("保存成功")})).catch((()=>{G.nk.error("保存失败")}))};return{state:l,currentDom:t,step:o,handlePrev:s,handleNext:u,handleSave:n}}};const be=(0,E.A)(ce,[["render",J],["__scopeId","data-v-41d4c7eb"]]);var pe=be,ve=l(1387),ge={name:"Index",components:{Head:I,Status:q.A,Install:pe},setup(e){const r=(0,X.B)(),l=(0,ve.rd)(),t=(0,z.KR)(null),o=()=>{(0,a.dY)((()=>{r.value.height=t.value.offsetHeight}))};return(0,a.sV)((()=>{0==r.value.hasAccess("FullManager")&&l.push({name:"NoPermission"}),window.addEventListener("resize",o),o()})),(0,a.hi)((()=>{window.removeEventListener("resize",o)})),{wrap:t}}};const ke=(0,E.A)(ge,[["render",d],["__scopeId","data-v-5ea3415a"]]);var Fe=ke}}]); \ No newline at end of file diff --git a/linker.tray.win/web/js/76.61170c94.js b/linker.tray.win/web/js/76.61170c94.js deleted file mode 100644 index 6ad578a4..00000000 --- a/linker.tray.win/web/js/76.61170c94.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[76],{9256:function(e,a,t){t.r(a),t.d(a,{default:function(){return M}});var n=t(6768);const l={class:"net-wrap app-wrap"},s={class:"inner absolute flex flex-column flex-nowrap"},r={class:"head"},i={class:"body flex-1 relative"},u={class:"status"};function c(e,a,t,c,d,o){const g=(0,n.g2)("Head"),p=(0,n.g2)("List"),v=(0,n.g2)("Status");return(0,n.uX)(),(0,n.CE)("div",l,[(0,n.Lk)("div",s,[(0,n.Lk)("div",r,[(0,n.bF)(g)]),(0,n.Lk)("div",i,[(0,n.bF)(p)]),(0,n.Lk)("div",u,[(0,n.bF)(v,{config:!1})])])])}t(4114);const d=e=>((0,n.Qi)("data-v-213d85ba"),e=e(),(0,n.jt)(),e),o={class:"head-wrap"},g={class:"tools flex"},p=d((()=>(0,n.Lk)("span",{class:"label"},"服务器 ",-1))),v=d((()=>(0,n.Lk)("span",{class:"flex-1"},null,-1))),h={style:{"margin-left":"1rem"}};function f(e,a,t,l,s,r){const i=(0,n.g2)("el-option"),u=(0,n.g2)("el-select"),c=(0,n.g2)("Refresh"),d=(0,n.g2)("el-icon"),f=(0,n.g2)("el-button"),k=(0,n.g2)("Background");return(0,n.uX)(),(0,n.CE)("div",o,[(0,n.Lk)("div",g,[p,(0,n.bF)(u,{modelValue:l.state.server,"onUpdate:modelValue":a[0]||(a[0]=e=>l.state.server=e),placeholder:"服务器",style:{width:"16rem"},size:"small"},{default:(0,n.k6)((()=>[((0,n.uX)(!0),(0,n.CE)(n.FK,null,(0,n.pI)(l.state.servers,(e=>((0,n.uX)(),(0,n.Wv)(i,{key:e.Host,label:e.Name,value:e.Host},null,8,["label","value"])))),128))])),_:1},8,["modelValue"]),v,(0,n.bF)(f,{size:"small",onClick:l.handleRefresh},{default:(0,n.k6)((()=>[(0,n.eW)(" 刷新(F5)"),(0,n.bF)(d,null,{default:(0,n.k6)((()=>[(0,n.bF)(c)])),_:1})])),_:1},8,["onClick"]),(0,n.Lk)("div",h,[(0,n.bF)(k,{name:"net"})])])])}var k=t(3830),m=t(144),b=t(7477),C=t(5096),L={components:{Edit:b.ffu,Refresh:b.C42,Background:C.A},setup(){const e=(0,k.B)(),a=(0,m.Kh)({server:"linker.snltty.com:1802",servers:[]});(0,n.wB)((()=>e.value.config.Client.Servers),(()=>{a.servers=(e.value.config.Client.Servers||[]).slice(0,1),a.server=e.value.config.Client.ServerInfo.Host}));const t=()=>{window.location.reload()};return{state:a,handleRefresh:t}}},w=t(1241);const S=(0,w.A)(L,[["render",f],["__scopeId","data-v-213d85ba"]]);var _=S;const F=e=>((0,n.Qi)("data-v-b6ab4f06"),e=e(),(0,n.jt)(),e),x={class:"net-list-wrap flex flex-column absolute"},z={class:"flex-1 scrollbar"},I={class:"flex"},E=F((()=>(0,n.Lk)("div",{class:"flex-1"},null,-1))),T={class:"tuntap"},A={class:"page t-c"},B={class:"page-wrap t-c"};function P(e,a,t,l,s,r){const i=(0,n.g2)("DeviceName"),u=(0,n.g2)("UpdaterBtn"),c=(0,n.g2)("TuntapShow"),d=(0,n.g2)("el-pagination");return(0,n.uX)(),(0,n.CE)("div",x,[(0,n.Lk)("div",z,[(0,n.Lk)("ul",null,[((0,n.uX)(!0),(0,n.CE)(n.FK,null,(0,n.pI)(l.devices.page.List,((e,a)=>((0,n.uX)(),(0,n.CE)("li",{key:a},[(0,n.Lk)("dl",null,[(0,n.Lk)("dt",I,[(0,n.Lk)("div",null,[(0,n.bF)(i,{item:e},null,8,["item"])]),E,(0,n.Lk)("div",null,[(0,n.bF)(u,{config:!1,item:e},null,8,["item"])])]),(0,n.Lk)("dd",T,[l.tuntap.list[e.MachineId]?((0,n.uX)(),(0,n.Wv)(c,{key:0,item:e},null,8,["item"])):(0,n.Q3)("",!0)])])])))),128))])]),(0,n.Lk)("div",A,[(0,n.Lk)("div",B,[(0,n.bF)(d,{size:"small",background:"",layout:"prev,pager, next","pager-count":5,total:l.devices.page.Count,"page-size":l.devices.page.Request.Size,"current-page":l.devices.page.Request.Page,onCurrentChange:l.handlePageChange,onSizeChange:l.handlePageSizeChange,"page-sizes":[10,20,50,100,255]},null,8,["total","page-size","current-page","onCurrentChange","onSizeChange"])])])])}var y=t(8104),X=t(7985),R=t(9383),D=t(167),U=t(3347),H=t(9636),N={components:{StarFilled:b.BQ2,UpdaterBtn:D.A,DeviceName:U.A,TuntapShow:H.A},setup(e){(0,k.B)();const a=(0,m.Kh)({}),{devices:t,machineId:l,_getSignList:s,_getSignList1:r,handleDeviceEdit:i,handlePageChange:u,handlePageSizeChange:c,handleDel:d,clearDevicesTimeout:o}=(0,X.r)(),{tuntap:g,_getTuntapInfo:p,handleTuntapRefresh:v,clearTuntapTimeout:h,handleTuntapEdit:f,sortTuntapIP:b}=(0,y.O)(),{_getUpdater:C,_subscribeUpdater:L,clearUpdaterTimeout:w}=(0,R.d)();return(0,n.sV)((()=>{u(),v(),s(),r(),p(),C(),L()})),(0,n.hi)((()=>{o(),h(),w()})),{state:a,devices:t,machineId:l,handlePageChange:u,handlePageSizeChange:c,tuntap:g}}};const V=(0,w.A)(N,[["render",P],["__scopeId","data-v-b6ab4f06"]]);var K=V,Q=t(9278),W=t(1387),j={components:{Head:_,List:K,Status:Q.A},setup(){document.addEventListener("contextmenu",(function(e){e.preventDefault()}));const e=(0,k.B)(),a=(0,W.rd)();return(0,n.sV)((()=>{0==e.value.hasAccess("NetManager")&&a.push({name:"NoPermission"})})),{}}};const q=(0,w.A)(j,[["render",c],["__scopeId","data-v-6a3f3b43"]]);var M=q}}]); \ No newline at end of file diff --git a/linker.tray.win/web/js/848.33bffbdc.js b/linker.tray.win/web/js/848.33bffbdc.js new file mode 100644 index 00000000..259d7844 --- /dev/null +++ b/linker.tray.win/web/js/848.33bffbdc.js @@ -0,0 +1 @@ +"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[848],{7716:function(e,t,n){n.d(t,{H1:function(){return s},Oy:function(){return u},V1:function(){return c},dS:function(){return d},nH:function(){return r},o2:function(){return a},we:function(){return l},xD:function(){return o}});var i=n(4);const s=(e="0")=>(0,i.zG)("forwardclient/connections",e),a=e=>(0,i.zG)("forwardclient/removeconnection",e),c=(e="0")=>(0,i.zG)("forwardclient/getcount",e),u=(e="0")=>(0,i.zG)("forwardclient/get",e),o=()=>(0,i.zG)("forwardclient/bindips"),l=e=>(0,i.zG)("forwardclient/remove",e),r=e=>(0,i.zG)("forwardclient/add",e),d=()=>(0,i.zG)("forwardclient/refresh")},2173:function(e,t,n){n.d(t,{$y:function(){return c},L1:function(){return a},QP:function(){return r},R2:function(){return o},_Q:function(){return l},im:function(){return s},qH:function(){return u}});var i=n(4);const s=(e="0")=>(0,i.zG)("socks5client/connections",e),a=e=>(0,i.zG)("socks5client/removeconnection",e),c=(e="0")=>(0,i.zG)("socks5client/get",e),u=e=>(0,i.zG)("socks5client/run",e),o=e=>(0,i.zG)("socks5client/stop",e),l=e=>(0,i.zG)("socks5client/update",e),r=()=>(0,i.zG)("socks5client/refresh")},5241:function(e,t,n){n.d(t,{AE:function(){return v},Jd:function(){return d},Nj:function(){return f},PR:function(){return o},Yh:function(){return r},_:function(){return h},ac:function(){return l},en:function(){return u},kl:function(){return s},vB:function(){return a},w0:function(){return m},zi:function(){return c}});var i=n(4);const s=(e="0")=>(0,i.zG)("tuntapclient/connections",e),a=e=>(0,i.zG)("tuntapclient/removeconnection",e),c=(e="0")=>(0,i.zG)("tuntapclient/get",e),u=e=>(0,i.zG)("tuntapclient/run",e),o=e=>(0,i.zG)("tuntapclient/stop",e),l=e=>(0,i.zG)("tuntapclient/update",e),r=()=>(0,i.zG)("tuntapclient/refresh"),d=()=>(0,i.zG)("tuntapclient/SubscribePing"),h=e=>(0,i.zG)("tuntapclient/SubscribeForwardTest",e),m=e=>(0,i.zG)("tuntapclient/CalcNetwork",e),f=()=>(0,i.zG)("tuntapclient/GetNetwork"),v=e=>(0,i.zG)("tuntapclient/AddNetwork",e)},9983:function(e,t,n){n.d(t,{FG:function(){return v},L2:function(){return h},ZY:function(){return m},bB:function(){return p},mx:function(){return f}});var i=n(7716),s=n(5241),a=n(2173),c=n(144),u=n(6768);const o=Symbol(),l=Symbol(),r=Symbol(),d=Symbol(),h=()=>{const e=(0,c.KR)({showEdit:!1,speedCache:{},current:"",currentName:"",hashcode:0,hashcode1:0,_updateRealTime:!1,updateRealTime:t=>{e.value.hashcode=0,e.value.hashcode1=0,e.value._updateRealTime=t}});(0,u.Gt)(o,e);const t=(0,c.KR)({timer:0,list:{}});(0,u.Gt)(l,t);const n=()=>{(0,i.H1)(e.value.hashcode.toString()).then((s=>{0==e.value._updateRealTime&&(e.value.hashcode=s.HashCode),s.List&&(p(s.List,i.o2),t.value.list=s.List),t.value.timer=setTimeout(n,1e3)})).catch((e=>{t.value.timer=setTimeout(n,1e3)}))},h=(0,c.KR)({timer:0,list:{}});(0,u.Gt)(r,h);const m=()=>{(0,s.kl)(e.value.hashcode1.toString()).then((t=>{0==e.value._updateRealTime&&(e.value.hashcode1=t.HashCode),t.List&&(p(t.List,s.vB),h.value.list=t.List),h.value.timer=setTimeout(m,1e3)})).catch((e=>{h.value.timer=setTimeout(m,1e3)}))},f=(0,c.KR)({timer:0,list:{}});(0,u.Gt)(d,f);const v=()=>{(0,a.im)(e.value.hashcode1.toString()).then((t=>{0==e.value._updateRealTime&&(e.value.hashcode1=t.HashCode),t.List&&(p(t.List,a.L1),f.value.list=t.List),f.value.timer=setTimeout(v,1e3)})).catch((e=>{f.value.timer=setTimeout(v,1e3)}))},p=(t,n)=>{const i=e.value.speedCache;for(let e in t){const s=t[e];s.removeFunc=n;const a=`${s.RemoteMachineId}-${s.TransactionId}`,c=i[a]||{SendBytes:0,ReceiveBytes:0};s.SendBytesText=g(s.SendBytes-c.SendBytes),s.ReceiveBytesText=g(s.ReceiveBytes-c.ReceiveBytes),c.SendBytes=s.SendBytes,c.ReceiveBytes=s.ReceiveBytes,i[a]=c}},g=e=>{let t=0;while(e>=1024)e/=1024,t++;return`${e.toFixed(2)}${["B/s","KB/s","MB/s","GB/s","TB/s"][t]}`},I=t=>{e.value.current=t.MachineId,e.value.currentName=t.MachineName,e.value.showEdit=!0},y=()=>{clearTimeout(t.value.timer),clearTimeout(h.value.timer),clearTimeout(f.value.timer)};return{connections:e,forwardConnections:t,_getForwardConnections:n,tuntapConnections:h,_getTuntapConnections:m,socks5Connections:f,_getSocks5Connections:v,handleTunnelConnections:I,clearConnectionsTimeout:y}},m=()=>(0,u.WQ)(o),f=()=>(0,u.WQ)(l),v=()=>(0,u.WQ)(r),p=()=>(0,u.WQ)(d)},7985:function(e,t,n){n.d(t,{r:function(){return o}});n(4114);var i=n(9299),s=n(3830),a=n(6768),c=n(144);const u=[],o=()=>{const e=(0,s.B)(),t=(0,a.EW)((()=>e.value.config.Client.Id)),n=(0,c.Kh)({timer:0,page:{Request:{Page:1,Size:+(localStorage.getItem("ps")||"10"),Name:"",Ids:[],Prop:"",Asc:!0},Count:0,List:[]},showDeviceEdit:!1,showAccessEdit:!1,deviceInfo:null}),o=()=>{(0,i.nD)(n.page.Request).then((i=>{n.page.Request=i.Request,n.page.Count=i.Count;for(let n in i.List)Object.assign(i.List[n],{showDel:t.value!=i.List[n].MachineId&&0==i.List[n].Connected,showAccess:t.value!=i.List[n].MachineId&&i.List[n].Connected,showReboot:i.List[n].Connected,isSelf:t.value==i.List[n].MachineId,showip:!1}),i.List[n].isSelf&&(e.value.self=i.List[n]);n.page.List=i.List;for(let e=0;e{}))},l=()=>{(0,i.nD)(n.page.Request).then((i=>{for(let s in i.List){const a=n.page.List.filter((e=>e.MachineId==i.List[s].MachineId))[0];a&&(Object.assign(a,{Connected:i.List[s].Connected,Version:i.List[s].Version,LastSignIn:i.List[s].LastSignIn,Args:i.List[s].Args,showDel:t.value!=i.List[s].MachineId&&0==i.List[s].Connected,showAccess:t.value!=i.List[s].MachineId&&i.List[s].Connected,showReboot:i.List[s].Connected,isSelf:t.value==i.List[s].MachineId}),a.isSelf&&(e.value.self=a))}n.timer=setTimeout(l,5e3)})).catch((e=>{n.timer=setTimeout(l,5e3)}))},r=()=>{try{if(0==u.length)return void setTimeout(r,1e3);const e=u.shift();fetch(`http://ip-api.com/json/${e.IP.split(":")[0]}`).then((async t=>{try{const n=await t.json();e.countryFlag=`https://unpkg.com/flag-icons@7.2.3/flags/4x3/${n.countryCode.toLowerCase()}.svg`}catch(n){}setTimeout(r,1e3)})).catch((()=>{setTimeout(r,1e3)}))}catch(e){setTimeout(r,1e3)}};r();const d=e=>{n.deviceInfo=e,n.showDeviceEdit=!0},h=e=>{n.deviceInfo=e,n.showAccessEdit=!0},m=e=>{e&&(n.page.Request.Page=e),o()},f=e=>{e&&(n.page.Request.Size=e,localStorage.setItem("ps",e)),o()},v=e=>{(0,i.Se)(e).then((()=>{o()}))},p=()=>{clearTimeout(n.timer),n.timer=0},g=e=>(0,i.VN)(e);return{devices:n,machineId:t,_getSignList:o,_getSignList1:l,handleDeviceEdit:d,handleAccessEdit:h,handlePageChange:m,handlePageSizeChange:f,handleDel:v,clearDevicesTimeout:p,setSort:g}}},8104:function(e,t,n){n.d(t,{O:function(){return u},W:function(){return o}});var i=n(144),s=n(6768),a=n(5241);const c=Symbol(),u=()=>{const e=(0,i.KR)({show:!0,timer:0,showEdit:!1,current:null,list:{},hashcode:0,showLease:!1});(0,s.Gt)(c,e);const t={linux:["debian","ubuntu","alpine","rocky","centos"],ubuntu:["ubuntu"],windows:["windows"],android:["android"],ios:["ios"]},n=()=>{clearTimeout(e.value.timer),(0,a.zi)(e.value.hashcode.toString()).then((i=>{if(e.value.hashcode=i.HashCode,i.List){for(let e in i.List){let n="system";const s=i.List[e].SystemInfo.toLowerCase();for(let e in t)if(s.indexOf(e)>=0){const i=t[e];if(1==i.length)n=i[0];else for(let e=0;e=0){n=i[e];break}break}Object.assign(i.List[e],{running:2==i.List[e].Status,loading:1==i.List[e].Status,system:n,systemDocker:s.indexOf("docker")>=0})}e.value.list=i.List}e.value.timer=setTimeout(n,1100),(0,a.Jd)()})).catch((t=>{e.value.timer=setTimeout(n,1100)}))},u=t=>{e.value.current=t,e.value.showEdit=!0},o=()=>{(0,a.Yh)()},l=()=>{clearTimeout(e.value.timer),e.value.timer=0},r=t=>Object.values(e.value.list).filter((e=>e.IP.indexOf(t)>=0||e.Lans.filter((e=>e.IP.indexOf(t)>=0)).length>0)).map((e=>e.MachineId)),d=t=>{const n=Object.values(e.value.list).filter((e=>e.IP)).sort(((e,t)=>{const n=e.IP.split(".").map((e=>Number(e))),i=t.IP.split(".").map((e=>Number(e)));for(let s=0;se.MachineId))};return{tuntap:e,_getTuntapInfo:n,handleTuntapEdit:u,handleTuntapRefresh:o,clearTuntapTimeout:l,getTuntapMachines:r,sortTuntapIP:d}},o=()=>(0,s.WQ)(c)},4867:function(e,t,n){n.d(t,{A:function(){return m}});var i=n(6768);const s={key:0,class:"point p2p",title:"打洞直连"},a={key:1,class:"point relay",title:"中继连接"},c={key:2,class:"point node",title:"节点连接"},u={key:1,class:"point",title:"未连接"};function o(e,t,n,o,l,r){return o.state.connection&&o.state.connection.Connected?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[0==o.state.connection.Type?((0,i.uX)(),(0,i.CE)("span",s)):1==o.state.connection.Type?((0,i.uX)(),(0,i.CE)("span",a)):2==o.state.connection.Type?((0,i.uX)(),(0,i.CE)("span",c)):(0,i.Q3)("",!0)],64)):((0,i.uX)(),(0,i.CE)("span",u))}var l=n(144),r={props:["data"],setup(e){const t=(0,l.Kh)({connection:e.data});return(0,i.wB)((()=>e.data),(()=>{t.connection=e.data})),{state:t}}},d=n(1241);const h=(0,d.A)(r,[["render",o],["__scopeId","data-v-39aee530"]]);var m=h},3347:function(e,t,n){n.d(t,{A:function(){return g}});var i=n(6768),s=n(4232);const a=["title"],c=["src"],u=["src"],o={key:1,class:"system",src:"/docker.svg"},l={key:1,class:"self gateway"};function r(e,t,n,r,d,h){const m=(0,i.g2)("StarFilled"),f=(0,i.g2)("el-icon");return(0,i.uX)(),(0,i.CE)("div",null,[r.tuntap.list[r.item.MachineId]&&r.tuntap.list[r.item.MachineId].system?((0,i.uX)(),(0,i.CE)("span",{key:0,title:r.tuntap.list[r.item.MachineId].SystemInfo},[r.item.countryFlag?((0,i.uX)(),(0,i.CE)("img",{key:0,class:"system",src:r.item.countryFlag},null,8,c)):(0,i.Q3)("",!0),(0,i.Lk)("img",{class:"system",src:`/${r.tuntap.list[r.item.MachineId].system}.svg`},null,8,u),r.tuntap.list[r.item.MachineId].systemDocker?((0,i.uX)(),(0,i.CE)("img",o)):(0,i.Q3)("",!0)],8,a)):(0,i.Q3)("",!0),(0,i.Lk)("a",{href:"javascript:;",onClick:t[0]||(t[0]=(...e)=>r.handleEdit&&r.handleEdit(...e)),title:"此客户端的设备名",class:"a-line"},[(0,i.Lk)("strong",{class:(0,s.C4)(["gateway",{green:r.item.Connected}])},(0,s.v_)(r.item.MachineName||"null"),3)]),r.item.isSelf?((0,i.uX)(),(0,i.CE)("strong",l,[(0,i.eW)("("),(0,i.bF)(f,{size:"16"},{default:(0,i.k6)((()=>[(0,i.bF)(m)])),_:1}),(0,i.eW)(") ")])):(0,i.Q3)("",!0)])}var d=n(3830),h=n(8104),m=n(7477),f={props:["item","config"],emits:["edit","refresh"],components:{StarFilled:m.BQ2},setup(e,{emit:t}){const n=(0,h.W)(),s=(0,d.B)(),a=(0,i.EW)((()=>s.value.hasAccess("RenameSelf"))),c=(0,i.EW)((()=>s.value.hasAccess("RenameOther"))),u=(0,i.EW)((()=>s.value.config.Client.Id)),o=()=>{if(e.config){if(u.value===e.item.MachineId){if(!a.value)return}else if(!c.value)return;t("edit",e.item)}};return{item:(0,i.EW)((()=>e.item)),tuntap:n,handleEdit:o}}},v=n(1241);const p=(0,v.A)(f,[["render",r],["__scopeId","data-v-ffd0d512"]]);var g=p},2950:function(e,t,n){n.d(t,{A:function(){return M}});var i=n(6768),s=n(4232);const a={class:"flex"},c={class:"flex-1"},u=["title"],o=["title"],l={key:0,class:"green gateway"},r={key:1},d={key:0},h={key:0,class:"flex yellow",title:"已禁用"},m={key:1,class:"flex yellow",title:"与其它设备填写IP、或本机局域网IP有冲突"},f={key:0,class:"delay green"},v={class:"delay yellow"};function p(e,t,n,p,g,I){const y=(0,i.g2)("ConnectionShow"),C=(0,i.g2)("Loading"),L=(0,i.g2)("el-icon"),k=(0,i.g2)("el-switch");return(0,i.uX)(),(0,i.CE)("div",null,[(0,i.Lk)("div",a,[(0,i.Lk)("div",c,[(0,i.bF)(y,{data:p.connections.list[p.item.MachineId]},null,8,["data"]),(0,i.Lk)("a",{href:"javascript:;",class:"a-line",onClick:t[0]||(t[0]=e=>p.handleTuntapIP(p.tuntap.list[p.item.MachineId])),title:"此设备的虚拟网卡IP"},[p.tuntap.list[p.item.MachineId].SetupError?((0,i.uX)(),(0,i.CE)("strong",{key:0,class:"red",title:p.tuntap.list[p.item.MachineId].SetupError},(0,s.v_)(p.tuntap.list[p.item.MachineId].IP),9,u)):p.tuntap.list[p.item.MachineId].Upgrade&&p.tuntap.list[p.item.MachineId].NatError?((0,i.uX)(),(0,i.CE)("strong",{key:1,class:"yellow",title:p.tuntap.list[p.item.MachineId].NatError},(0,s.v_)(p.tuntap.list[p.item.MachineId].IP),9,o)):((0,i.uX)(),(0,i.CE)(i.FK,{key:2},[p.tuntap.list[p.item.MachineId].running?((0,i.uX)(),(0,i.CE)("strong",l,(0,s.v_)(p.tuntap.list[p.item.MachineId].IP),1)):((0,i.uX)(),(0,i.CE)("strong",r,(0,s.v_)(p.tuntap.list[p.item.MachineId].IP),1))],64))])]),p.tuntap.list[p.item.MachineId].loading?((0,i.uX)(),(0,i.CE)("div",d,[(0,i.bF)(L,{size:"14",class:"loading"},{default:(0,i.k6)((()=>[(0,i.bF)(C)])),_:1})])):((0,i.uX)(),(0,i.Wv)(k,{key:1,modelValue:p.tuntap.list[p.item.MachineId].running,"onUpdate:modelValue":t[1]||(t[1]=e=>p.tuntap.list[p.item.MachineId].running=e),loading:p.tuntap.list[p.item.MachineId].loading,disabled:"",onClick:t[2]||(t[2]=e=>p.handleTuntap(p.tuntap.list[p.item.MachineId])),size:"small","inline-prompt":"","active-text":"😀","inactive-text":"😣"},null,8,["modelValue","loading"]))]),(0,i.Lk)("div",null,[(0,i.Lk)("div",null,[((0,i.uX)(!0),(0,i.CE)(i.FK,null,(0,i.pI)(p.tuntap.list[p.item.MachineId].Lans,((e,t)=>((0,i.uX)(),(0,i.CE)(i.FK,{key:t},[e.Disabled?((0,i.uX)(),(0,i.CE)("div",h,(0,s.v_)(e.IP)+" / "+(0,s.v_)(e.PrefixLength),1)):e.Exists?((0,i.uX)(),(0,i.CE)("div",m,(0,s.v_)(e.IP)+" / "+(0,s.v_)(e.PrefixLength),1)):((0,i.uX)(),(0,i.CE)("div",{key:2,class:(0,s.C4)(["flex",{green:p.tuntap.list[p.item.MachineId].running}]),title:"正常使用"},(0,s.v_)(e.IP)+" / "+(0,s.v_)(e.PrefixLength),3))],64)))),128))]),p.showDelay?((0,i.uX)(),(0,i.CE)(i.FK,{key:0},[p.tuntap.list[p.item.MachineId].Delay>=0&&p.tuntap.list[p.item.MachineId].Delay<=100?((0,i.uX)(),(0,i.CE)("div",f,(0,s.v_)(p.tuntap.list[p.item.MachineId].Delay)+"ms",1)):(0,i.Q3)("",!0),(0,i.Lk)("template",null,[(0,i.Lk)("div",v,(0,s.v_)(p.tuntap.list[p.item.MachineId].Delay)+"ms",1)])],64)):(0,i.Q3)("",!0)])])}var g=n(5241),I=n(1219),y=n(8104),C=n(7477),L=n(3830),k=n(9983),w=n(4867),E={props:["item","config"],emits:["edit","refresh"],components:{Loading:C.Rhj,ConnectionShow:w.A},setup(e,{emit:t}){const n=(0,y.W)(),s=(0,L.B)(),a=(0,i.EW)((()=>s.value.config.Client.Id)),c=(0,i.EW)((()=>s.value.hasAccess("TuntapChangeSelf"))),u=(0,i.EW)((()=>s.value.hasAccess("TuntapChangeOther"))),o=(0,i.EW)((()=>s.value.hasAccess("TuntapStatusSelf"))),l=(0,i.EW)((()=>s.value.hasAccess("TuntapStatusOther"))),r=(0,k.FG)(),d=(0,i.EW)((()=>2==(2&(s.value.config.Running.Tuntap||{Switch:0}).Switch))),h=t=>{if(!e.config)return;if(a.value===t.MachineId){if(!o.value)return}else if(!l.value)return;const n=t.running?(0,g.PR)(t.MachineId):(0,g.en)(t.MachineId);t.loading=!0,n.then((()=>{I.nk.success("操作成功!")})).catch((e=>{console.log(e),I.nk.error("操作失败!")}))},m=n=>{if(e.config||a.value==n.MachineId){if(a.value===n.MachineId){if(!c.value)return}else if(!u.value)return;n.device=e.item,t("edit",n)}},f=()=>{t("refresh")};return{item:(0,i.EW)((()=>e.item)),tuntap:n,showDelay:d,connections:r,handleTuntap:h,handleTuntapIP:m,handleTuntapRefresh:f}}},T=n(1241);const S=(0,T.A)(E,[["render",p],["__scopeId","data-v-f8059b00"]]);var M=S}}]); \ No newline at end of file diff --git a/linker.tray.win/web/js/855.46fe678b.js b/linker.tray.win/web/js/855.46fe678b.js new file mode 100644 index 00000000..41110bfe --- /dev/null +++ b/linker.tray.win/web/js/855.46fe678b.js @@ -0,0 +1 @@ +"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[855],{9232:function(e,a,l){l.d(a,{W4:function(){return o},q:function(){return n},uQ:function(){return r}});var t=l(4);const n=e=>(0,t.zG)("relay/SetServers",e),o=()=>(0,t.zG)("relay/Subscribe"),r=e=>(0,t.zG)("relay/Connect",e)},743:function(e,a,l){l.d(a,{Ap:function(){return n},Co:function(){return o},DY:function(){return u},Qs:function(){return i},a9:function(){return s},eX:function(){return c},gz:function(){return d},pY:function(){return r}});var t=l(4);const n=()=>(0,t.zG)("sforwardclient/GetSecretKey"),o=e=>(0,t.zG)("sforwardclient/SetSecretKey",e),r=e=>(0,t.zG)("sforwardclient/get",e),s=()=>(0,t.zG)("sforwardclient/refresh"),d=(e="0")=>(0,t.zG)("sforwardclient/getcount",e),u=e=>(0,t.zG)("sforwardclient/remove",e),i=e=>(0,t.zG)("sforwardclient/add",e),c=e=>(0,t.zG)("sforwardclient/TestLocal",e)},83:function(e,a,l){l.d(a,{$M:function(){return s},KW:function(){return r},gM:function(){return o},r7:function(){return n}});var t=l(4);const n=(e="0")=>(0,t.zG)("tunnel/get",e),o=()=>(0,t.zG)("tunnel/refresh"),r=e=>(0,t.zG)("tunnel/SetRouteLevel",e),s=e=>(0,t.zG)("tunnel/SetTransports",e)},8163:function(e,a,l){l.r(a),l.d(a,{default:function(){return ot}});var t=l(6768);const n={class:"home-list-wrap absolute"},o={class:"page t-c"},r={class:"page-wrap"};function s(e,a,l,s,d,u){const i=(0,t.g2)("Sort"),c=(0,t.g2)("Device"),h=(0,t.g2)("Tunnel"),m=(0,t.g2)("Tuntap"),p=(0,t.g2)("Socks5"),w=(0,t.g2)("Forward"),g=(0,t.g2)("Oper"),k=(0,t.g2)("el-table"),f=(0,t.g2)("el-pagination"),v=(0,t.g2)("DeviceEdit"),b=(0,t.g2)("AccessEdit"),F=(0,t.g2)("TunnelEdit"),C=(0,t.g2)("ConnectionsEdit"),L=(0,t.g2)("TuntapEdit"),E=(0,t.g2)("Socks5Edit"),_=(0,t.g2)("TuntapLease"),P=(0,t.g2)("ForwardEdit"),V=(0,t.g2)("SForwardEdit");return(0,t.uX)(),(0,t.CE)("div",n,[(0,t.bF)(i,{onSort:s.handleSortChange},null,8,["onSort"]),(0,t.bF)(k,{data:s.devices.page.List,stripe:"",border:"",style:{width:"100%"},height:`${s.state.height}px`,size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(c,{onEdit:s.handleDeviceEdit,onRefresh:s.handlePageRefresh},null,8,["onEdit","onRefresh"]),(0,t.bF)(h,{onEdit:s.handleTunnelEdit,onRefresh:s.handleTunnelRefresh,onConnections:s.handleTunnelConnections},null,8,["onEdit","onRefresh","onConnections"]),s.tuntap.show?((0,t.uX)(),(0,t.Wv)(m,{key:0,onEdit:s.handleTuntapEdit,onRefresh:s.handleTuntapRefresh},null,8,["onEdit","onRefresh"])):(0,t.Q3)("",!0),s.socks5.show?((0,t.uX)(),(0,t.Wv)(p,{key:1,onEdit:s.handleSocks5Edit,onRefresh:s.handleSocks5Refresh},null,8,["onEdit","onRefresh"])):(0,t.Q3)("",!0),s.forward.show?((0,t.uX)(),(0,t.Wv)(w,{key:2,onEdit:s.handleForwardEdit,onSedit:s.handleSForwardEdit},null,8,["onEdit","onSedit"])):(0,t.Q3)("",!0),(0,t.bF)(g,{onRefresh:s.handlePageRefresh,onAccess:s.handleAccessEdit},null,8,["onRefresh","onAccess"])])),_:1},8,["data","height"]),(0,t.Lk)("div",o,[(0,t.Lk)("div",r,[(0,t.bF)(f,{small:"",background:"",layout:"total,sizes,prev,pager, next",total:s.devices.page.Count,"page-size":s.devices.page.Request.Size,"current-page":s.devices.page.Request.Page,onCurrentChange:s.handlePageChange,onSizeChange:s.handlePageSizeChange,"page-sizes":[10,20,50,100,255]},null,8,["total","page-size","current-page","onCurrentChange","onSizeChange"])])]),s.devices.showDeviceEdit?((0,t.uX)(),(0,t.Wv)(v,{key:0,modelValue:s.devices.showDeviceEdit,"onUpdate:modelValue":a[0]||(a[0]=e=>s.devices.showDeviceEdit=e),onChange:s.handlePageChange,data:s.devices.deviceInfo},null,8,["modelValue","onChange","data"])):(0,t.Q3)("",!0),s.devices.showAccessEdit?((0,t.uX)(),(0,t.Wv)(b,{key:1,modelValue:s.devices.showAccessEdit,"onUpdate:modelValue":a[1]||(a[1]=e=>s.devices.showAccessEdit=e),onChange:s.handlePageChange,data:s.devices.deviceInfo},null,8,["modelValue","onChange","data"])):(0,t.Q3)("",!0),s.tunnel.showEdit?((0,t.uX)(),(0,t.Wv)(F,{key:2,modelValue:s.tunnel.showEdit,"onUpdate:modelValue":a[2]||(a[2]=e=>s.tunnel.showEdit=e),onChange:s.handleTunnelRefresh},null,8,["modelValue","onChange"])):(0,t.Q3)("",!0),s.connections.showEdit?((0,t.uX)(),(0,t.Wv)(C,{key:3,modelValue:s.connections.showEdit,"onUpdate:modelValue":a[3]||(a[3]=e=>s.connections.showEdit=e)},null,8,["modelValue"])):(0,t.Q3)("",!0),s.tuntap.showEdit?((0,t.uX)(),(0,t.Wv)(L,{key:4,modelValue:s.tuntap.showEdit,"onUpdate:modelValue":a[4]||(a[4]=e=>s.tuntap.showEdit=e),onChange:s.handleTuntapRefresh},null,8,["modelValue","onChange"])):(0,t.Q3)("",!0),s.socks5.showEdit?((0,t.uX)(),(0,t.Wv)(E,{key:5,modelValue:s.socks5.showEdit,"onUpdate:modelValue":a[5]||(a[5]=e=>s.socks5.showEdit=e),onChange:s.handleSocks5Refresh},null,8,["modelValue","onChange"])):(0,t.Q3)("",!0),s.tuntap.showLease?((0,t.uX)(),(0,t.Wv)(_,{key:6,modelValue:s.tuntap.showLease,"onUpdate:modelValue":a[6]||(a[6]=e=>s.tuntap.showLease=e),onChange:s.handleTuntapRefresh},null,8,["modelValue","onChange"])):(0,t.Q3)("",!0),s.forward.showEdit?((0,t.uX)(),(0,t.Wv)(P,{key:7,modelValue:s.forward.showEdit,"onUpdate:modelValue":a[7]||(a[7]=e=>s.forward.showEdit=e)},null,8,["modelValue"])):(0,t.Q3)("",!0),s.sforward.showEdit?((0,t.uX)(),(0,t.Wv)(V,{key:8,modelValue:s.sforward.showEdit,"onUpdate:modelValue":a[8]||(a[8]=e=>s.sforward.showEdit=e)},null,8,["modelValue"])):(0,t.Q3)("",!0)])}l(4114);var d=l(3830),u=l(144),i=l(1219);function c(e,a,l,n,o,r){const s=(0,t.g2)("el-table-column"),d=(0,t.g2)("el-checkbox"),u=(0,t.g2)("el-table");return(0,t.uX)(),(0,t.Wv)(u,{border:"",style:{width:"100%"},height:"32px",size:"small",onSortChange:n.handleSortChange,class:"table-sort"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{prop:"MachineId",label:"设备名",width:"110",sortable:"custom"}),(0,t.bF)(s,{prop:"Version",label:"版本",width:"110",sortable:"custom"}),(0,t.bF)(s,{prop:"tunnel",label:"网关",width:"76",sortable:"custom"}),n.tuntap.show?((0,t.uX)(),(0,t.Wv)(s,{key:0,prop:"tuntap",label:"网卡IP",width:"160",sortable:"custom"})):(0,t.Q3)("",!0),n.socks5.show?((0,t.uX)(),(0,t.Wv)(s,{key:1,prop:"socks5",label:"代理转发",width:"160",sortable:"custom"})):(0,t.Q3)("",!0),(0,t.bF)(s,{label:"columns",fixed:"right"},{header:(0,t.k6)((()=>[(0,t.bF)(d,{modelValue:n.tuntap.show,"onUpdate:modelValue":a[0]||(a[0]=e=>n.tuntap.show=e),onChange:n.handleTuntapShow,size:"small",style:{"margin-right":"1rem"}},{default:(0,t.k6)((()=>[(0,t.eW)("网卡")])),_:1},8,["modelValue","onChange"]),(0,t.bF)(d,{modelValue:n.socks5.show,"onUpdate:modelValue":a[1]||(a[1]=e=>n.socks5.show=e),onChange:n.handleSocks5Show,size:"small",style:{"margin-right":"1rem"}},{default:(0,t.k6)((()=>[(0,t.eW)("代理")])),_:1},8,["modelValue","onChange"]),(0,t.bF)(d,{modelValue:n.forward.show,"onUpdate:modelValue":a[2]||(a[2]=e=>n.forward.show=e),onChange:n.handleForwardShow,size:"small",style:{"margin-right":"0rem"}},{default:(0,t.k6)((()=>[(0,t.eW)("转发")])),_:1},8,["modelValue","onChange"])])),_:1})])),_:1},8,["onSortChange"])}var h=l(7716);const m=Symbol(),p=()=>{(0,d.B)();const e=(0,u.KR)({show:!0,timer:0,showEdit:!1,machineId:null,list:{},hashcode:0});(0,t.Gt)(m,e);const a=()=>{(0,h.dS)()},l=()=>{(0,h.V1)(e.value.hashcode.toString()).then((a=>{e.value.hashcode=a.HashCode,a.List&&(e.value.list=a.List),e.value.timer=setTimeout(l,1020)})).catch((()=>{e.value.timer=setTimeout(l,1020)}))},n=a=>{e.value.machineId=a[0],e.value.machineName=a[1],e.value.showEdit=!0},o=()=>{clearTimeout(e.value.timer)};return{forward:e,_getForwardCountInfo:l,handleForwardEdit:n,clearForwardTimeout:o,handleForwardRefresh:a}},w=()=>(0,t.WQ)(m);var g=l(2173);const k=Symbol(),f=()=>{const e=(0,u.KR)({show:!0,timer:0,showEdit:!1,current:null,list:{},hashcode:0});(0,t.Gt)(k,e);const a=()=>{clearTimeout(e.value.timer),(0,g.$y)(e.value.hashcode.toString()).then((l=>{if(e.value.hashcode=l.HashCode,l.List){for(let e in l.List)Object.assign(l.List[e],{running:2==l.List[e].Status,loading:1==l.List[e].Status});e.value.list=l.List}e.value.timer=setTimeout(a,1100)})).catch((l=>{e.value.timer=setTimeout(a,1100)}))},l=a=>{e.value.current=a,e.value.showEdit=!0},n=()=>{(0,g.QP)()},o=()=>{clearTimeout(e.value.timer),e.value.timer=0},r=a=>Object.values(e.value.list).filter((e=>e.Port.toString().indexOf(a)>=0||e.Lans.filter((e=>e.IP.indexOf(a)>=0)).length>0)).map((e=>e.MachineId)),s=a=>{const l=Object.values(e.value.list).sort(((e,a)=>e.Port-a.Port));return l.map((e=>e.MachineId))};return{socks5:e,_getSocks5Info:a,handleSocks5Edit:l,handleSocks5Refresh:n,clearSocks5Timeout:o,getSocks5Machines:r,sortSocks5:s}},v=()=>(0,t.WQ)(k);var b=l(8104),F={emits:["sort"],setup(e,{emit:a}){const l=(0,b.W)();l.value.show="false"!=localStorage.getItem("tuntap.show");const t=v();t.value.show="false"!=localStorage.getItem("socks5.show");const n=w();n.value.show="false"!=localStorage.getItem("forward.show");const o=e=>{a("sort",e)},r=()=>{localStorage.setItem("tuntap.show",l.value.show)},s=()=>{localStorage.setItem("socks5.show",t.value.show)},d=()=>{localStorage.setItem("forward.show",n.value.show)};return{tuntap:l,socks5:t,forward:n,handleSortChange:o,handleTuntapShow:r,handleSocks5Show:s,handleForwardShow:d}}},C=l(1241);const L=(0,C.A)(F,[["render",c],["__scopeId","data-v-4b2df38c"]]);var E=L;const _=e=>((0,t.Qi)("data-v-6638f97d"),e=e(),(0,t.jt)(),e),P={class:"dropdown"},V=_((()=>(0,t.Lk)("span",null,"操作",-1)));function S(e,a,l,n,o,r){const s=(0,t.g2)("ArrowDown"),d=(0,t.g2)("el-icon"),u=(0,t.g2)("SwitchButton"),i=(0,t.g2)("el-dropdown-item"),c=(0,t.g2)("Delete"),h=(0,t.g2)("Flag"),m=(0,t.g2)("el-dropdown-menu"),p=(0,t.g2)("el-dropdown"),w=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(w,{label:"操作",fixed:"right"},{default:(0,t.k6)((e=>[(0,t.bF)(p,{size:"small"},{dropdown:(0,t.k6)((()=>[(0,t.bF)(m,null,{default:(0,t.k6)((()=>[e.row.showReboot&&n.hasReboot?((0,t.uX)(),(0,t.Wv)(i,{key:0,onClick:a=>n.handleExit(e.row.MachineId,e.row.MachineName)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1}),(0,t.eW)(" 重启")])),_:2},1032,["onClick"])):(0,t.Q3)("",!0),e.row.showDel&&n.hasRemove?((0,t.uX)(),(0,t.Wv)(i,{key:1,onClick:a=>n.handleDel(e.row.MachineId,e.row.MachineName)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(c)])),_:1}),(0,t.eW)(" 删除")])),_:2},1032,["onClick"])):(0,t.Q3)("",!0),n.handleShowAccess(e.row,n.accessList[e.row.MachineId]||0)?((0,t.uX)(),(0,t.Wv)(i,{key:2,onClick:a=>n.handleAccess(e.row)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(h)])),_:1}),(0,t.eW)(" 权限")])),_:2},1032,["onClick"])):(0,t.Q3)("",!0)])),_:2},1024)])),default:(0,t.k6)((()=>[(0,t.Lk)("div",P,[V,(0,t.bF)(d,{class:"el-icon--right"},{default:(0,t.k6)((()=>[(0,t.bF)(s)])),_:1})])])),_:2},1024)])),_:1})}var I=l(9299),y=l(920),T=l(7477),R=l(2933),M=l(5962),W={emits:["refresh","access"],components:{Delete:T.epd,SwitchButton:T.L$q,ArrowDown:T.yd$,Flag:T.lNU},setup(e,{emit:a}){const l=(0,d.B)(),n=(0,M.q)(),o=(0,t.EW)((()=>l.value.config.Client.Access)),r=(0,t.EW)((()=>l.value.hasAccess("Access"))),s=(0,t.EW)((()=>n.value.list)),u=(0,t.EW)((()=>l.value.hasAccess("Reboot"))),i=(0,t.EW)((()=>l.value.hasAccess("Remove"))),c=(e,l)=>{R.s.confirm(`确认删除[${l}]?`,"提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((()=>{(0,I.Se)(e).then((()=>{a("refresh")}))})).catch((()=>{}))},h=(e,l)=>{R.s.confirm(`确认关闭[${l}]?`,"提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((()=>{(0,y.NS)(e).then((()=>{a("refresh")}))})).catch((()=>{}))},m=(e,a)=>e.showAccess&&r.value&&a>=0&&0==+(~BigInt(o.value)&BigInt(a)).toString(),p=e=>{a("access",e)};return{accessList:s,handleDel:c,handleExit:h,hasReboot:u,hasRemove:i,hasAccess:r,handleShowAccess:m,handleAccess:p}}};const A=(0,C.A)(W,[["render",S],["__scopeId","data-v-6638f97d"]]);var X=A,B=l(4232);const N=e=>((0,t.Qi)("data-v-5db71b03"),e=e(),(0,t.jt)(),e),x={class:"flex"},z=N((()=>(0,t.Lk)("span",{class:"flex-1"},"设备",-1))),U={class:"flex"},D=["onClick"],K=["onClick"],Q=N((()=>(0,t.Lk)("span",null,"😴㊙.㊙.㊙.㊙",-1))),O=[Q],G=N((()=>(0,t.Lk)("span",{class:"flex-1"},null,-1)));function $(e,a,l,n,o,r){const s=(0,t.g2)("el-input"),d=(0,t.g2)("Search"),u=(0,t.g2)("el-icon"),i=(0,t.g2)("el-button"),c=(0,t.g2)("DeviceName"),h=(0,t.g2)("UpdaterBtn"),m=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(m,{prop:"MachineId",label:"设备",width:"220"},{header:(0,t.k6)((()=>[(0,t.Lk)("div",x,[z,(0,t.Lk)("span",null,[(0,t.bF)(s,{size:"small",modelValue:n.name,"onUpdate:modelValue":a[0]||(a[0]=e=>n.name=e),clearable:"",onInput:n.handleRefresh,placeholder:"设备/虚拟网卡/端口转发"},null,8,["modelValue","onInput"])]),(0,t.Lk)("span",null,[(0,t.bF)(i,{size:"small",onClick:n.handleRefresh},{default:(0,t.k6)((()=>[(0,t.bF)(u,null,{default:(0,t.k6)((()=>[(0,t.bF)(d)])),_:1})])),_:1},8,["onClick"])])])])),default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("p",null,[(0,t.bF)(c,{onEdit:n.handleEdit,config:!0,item:e.row},null,8,["onEdit","item"])]),(0,t.Lk)("p",U,[e.row.showip?((0,t.uX)(),(0,t.CE)("span",{key:0,title:"此设备的外网IP",class:"ipaddress",onClick:a=>n.handleExternal(e.row)},[(0,t.Lk)("span",null,"😀"+(0,B.v_)(e.row.IP),1)],8,D)):((0,t.uX)(),(0,t.CE)("span",{key:1,title:"此设备的外网IP",class:"ipaddress",onClick:a=>n.handleExternal(e.row)},O,8,K)),G,0==e.row.showip?((0,t.uX)(),(0,t.Wv)(h,{key:2,config:!0,item:e.row},null,8,["item"])):(0,t.Q3)("",!0)])])])),_:1})}var q=l(167),j=l(3347),Y={emits:["edit","refresh"],components:{Search:T.vji,UpdaterBtn:q.A,DeviceName:j.A},setup(e,{emit:a}){const l=(0,d.B)(),n=(0,t.EW)((()=>l.value.hasAccess("ExternalShow"))),o=(0,u.KR)(sessionStorage.getItem("search-name")||""),r=e=>{n.value&&(e.showip=!e.showip)},s=e=>{a("edit",e)},i=()=>{sessionStorage.setItem("search-name",o.value),a("refresh",o.value)};return{handleEdit:s,handleRefresh:i,name:o,handleExternal:r}}};const H=(0,C.A)(Y,[["render",$],["__scopeId","data-v-5db71b03"]]);var J=H;const Z=(0,t.Lk)("div",null,"修改后最好能重启一次客户端",-1),ee={class:"t-c w-100"};function ae(e,a,l,n,o,r){const s=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-input"),u=(0,t.g2)("el-button"),i=(0,t.g2)("el-form"),c=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(c,{modelValue:n.state.show,"onUpdate:modelValue":a[2]||(a[2]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:`设置[${n.state.ruleForm.MachineName}]设备`,width:"300"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(i,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"auto"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:""},{default:(0,t.k6)((()=>[Z])),_:1}),(0,t.bF)(s,{label:"设备名",prop:"MachineName"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{maxlength:"12","show-word-limit":"",modelValue:n.state.ruleForm.MachineName,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.ruleForm.MachineName=e)},null,8,["modelValue"])])),_:1}),(0,t.bF)(s,{label:"",prop:"Btns"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",ee,[(0,t.bF)(u,{onClick:a[1]||(a[1]=e=>n.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(u,{type:"primary",onClick:n.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue","title"])}var le={props:["data","modelValue"],emits:["change","update:modelValue"],setup(e,{emit:a}){const l=(0,u.KR)(null),n=(0,u.Kh)({show:!0,ruleForm:{MachineName1:e.data.MachineName,MachineName:e.data.MachineName},rules:{}});(0,t.wB)((()=>n.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const o=()=>{e.data.MachineName!=n.ruleForm.MachineName&&(0,I.gC)({Id:e.data.MachineId,newName:n.ruleForm.MachineName}).then((()=>{n.show=!1,i.nk.success("已操作!"),a("change")})).catch((e=>{console.log(e),i.nk.error("操作失败!")}))};return{state:n,ruleFormRef:l,handleSave:o}}};const te=(0,C.A)(le,[["render",ae]]);var ne=te,oe=l(7985);function re(e,a,l,n,o,r){const s=(0,t.g2)("Access"),d=(0,t.g2)("el-button"),u=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(u,{modelValue:n.state.show,"onUpdate:modelValue":a[1]||(a[1]=e=>n.state.show=e),"close-on-click-modal":!1,center:"","append-to":".app-wrap",title:`设置[${n.machineName}]的权限`,width:"580",top:"1vh"},{footer:(0,t.k6)((()=>[(0,t.bF)(d,{plain:"",onClick:a[0]||(a[0]=e=>n.state.show=!1),loading:n.state.loading},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1},8,["loading"]),(0,t.bF)(d,{type:"success",plain:"",onClick:n.handleSave,loading:n.state.loading},{default:(0,t.k6)((()=>[(0,t.eW)("确定保存")])),_:1},8,["onClick","loading"])])),default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(s,{machineid:n.machineid,ref:"accessDom"},null,8,["machineid"])])])),_:1},8,["modelValue","title"])}var se=l(3363),de=l(9593),ue={props:["data","modelValue"],emits:["change","update:modelValue"],components:{Access:de.A},setup(e,{emit:a}){const l=(0,u.Kh)({show:!0,loading:!1});(0,t.wB)((()=>l.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const n=(0,u.KR)(null),o=()=>{l.loading=!0,(0,se.ZK)({ToMachineId:e.data.MachineId,Access:n.value.getValue()}).then((()=>{l.loading=!1,l.show=!1,i.nk.success("已操作!"),a("change")})).catch((e=>{console.log(e),l.loading=!1,i.nk.error("操作失败!")}))};return{machineName:e.data.MachineName,machineid:e.data.MachineId,state:l,accessDom:n,handleSave:o}}};const ie=(0,C.A)(ue,[["render",re]]);var ce=ie;const he={key:0};function me(e,a,l,n,o,r){const s=(0,t.g2)("TuntapShow"),d=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(d,{prop:"tuntap",label:"虚拟网卡",width:"160"},{header:(0,t.k6)((()=>[(0,t.Lk)("a",{href:"javascript:;",class:"a-line",onClick:a[0]||(a[0]=(...e)=>n.handleShowLease&&n.handleShowLease(...e))},"虚拟网卡")])),default:(0,t.k6)((e=>[n.tuntap.list[e.row.MachineId]?((0,t.uX)(),(0,t.CE)("div",he,[(0,t.bF)(s,{config:!0,item:e.row,onEdit:n.handleTuntapIP,onRefresh:n.handleTuntapRefresh},null,8,["item","onEdit","onRefresh"])])):(0,t.Q3)("",!0)])),_:1})}var pe=l(2950),we={emits:["edit","refresh"],components:{TuntapShow:pe.A},setup(e,{emit:a}){const l=(0,b.W)(),t=e=>{a("edit",e)},n=()=>{a("refresh")},o=()=>{l.value.showLease=!0};return{tuntap:l,handleTuntapIP:t,handleTuntapRefresh:n,handleShowLease:o}}};const ge=(0,C.A)(we,[["render",me]]);var ke=ge;const fe=e=>((0,t.Qi)("data-v-34275839"),e=e(),(0,t.jt)(),e),ve=fe((()=>(0,t.Lk)("span",null,"/",-1))),be=fe((()=>(0,t.Lk)("span",{style:{width:"2rem"}},null,-1))),Fe={key:0,class:"upgrade-wrap"},Ce={class:"w-100 t-c"};function Le(e,a,l,n,o,r){const s=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-input"),u=(0,t.g2)("el-checkbox"),i=(0,t.g2)("TuntapLan"),c=(0,t.g2)("TuntapForward"),h=(0,t.g2)("el-button"),m=(0,t.g2)("el-form"),p=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(p,{modelValue:n.state.show,"onUpdate:modelValue":a[7]||(a[7]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:`设置[${n.state.machineName}]组网`,top:"1vh",width:"760"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(m,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"8rem"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{prop:"gateway",class:"m-b-0"},{default:(0,t.k6)((()=>[(0,t.eW)("赐予此设备IP,其它设备可通过此IP访问")])),_:1}),(0,t.bF)(s,{label:"虚拟网卡IP",prop:"IP"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{modelValue:n.state.ruleForm.IP,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.ruleForm.IP=e),style:{width:"14rem"}},null,8,["modelValue"]),ve,(0,t.bF)(d,{onChange:n.handlePrefixLengthChange,modelValue:n.state.ruleForm.PrefixLength,"onUpdate:modelValue":a[1]||(a[1]=e=>n.state.ruleForm.PrefixLength=e),style:{width:"4rem"}},null,8,["onChange","modelValue"]),be,(0,t.bF)(u,{modelValue:n.state.ruleForm.ShowDelay,"onUpdate:modelValue":a[2]||(a[2]=e=>n.state.ruleForm.ShowDelay=e),label:"显示延迟",size:"large",style:{"margin-right":"1rem"}},null,8,["modelValue"]),(0,t.bF)(u,{modelValue:n.state.ruleForm.AutoConnect,"onUpdate:modelValue":a[3]||(a[3]=e=>n.state.ruleForm.AutoConnect=e),label:"自动连接",size:"large",style:{"margin-right":"1rem"}},null,8,["modelValue"]),(0,t.bF)(u,{modelValue:n.state.ruleForm.Multicast,"onUpdate:modelValue":a[4]||(a[4]=e=>n.state.ruleForm.Multicast=e),label:"禁用UDP广播",size:"large"},null,8,["modelValue"])])),_:1}),(0,t.bF)(s,{prop:"upgrade",class:"m-b-0"},{default:(0,t.k6)((()=>[(0,t.bF)(u,{modelValue:n.state.ruleForm.Upgrade,"onUpdate:modelValue":a[5]||(a[5]=e=>n.state.ruleForm.Upgrade=e),label:"我很懂,我要使用高级功能(点对网和网对网)",size:"large"},null,8,["modelValue"])])),_:1}),n.state.ruleForm.Upgrade?((0,t.uX)(),(0,t.CE)("div",Fe,[(0,t.bF)(s,{label:"局域网IP",prop:"LanIP",class:"m-b-0",style:{"border-bottom":"1px solid #ddd"}},{default:(0,t.k6)((()=>[(0,t.bF)(i,{ref:"lanDom"},null,512)])),_:1}),(0,t.bF)(s,{label:"端口转发",prop:"forwards"},{default:(0,t.k6)((()=>[(0,t.bF)(c,{ref:"forwardDom"},null,512)])),_:1})])):(0,t.Q3)("",!0),(0,t.bF)(s,{label:"",prop:"Btns","label-width":"0"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",Ce,[(0,t.bF)(h,{onClick:a[6]||(a[6]=e=>n.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(h,{type:"primary",onClick:n.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue","title"])}var Ee=l(5241);const _e=e=>((0,t.Qi)("data-v-786fe646"),e=e(),(0,t.jt)(),e),Pe={class:"w-100"},Ve=_e((()=>(0,t.Lk)("span",{class:"yellow"},"此设备无法使用NAT转发,或只想使用端口转发",-1))),Se={key:0,class:"green"},Ie={class:"wrap"},ye=["title"],Te={key:1},Re=["title"],Me={key:1},We=["title"],Ae={key:1},Xe={key:1,class:"remark"};function Be(e,a,l,n,o,r){const s=(0,t.g2)("el-input"),d=(0,t.g2)("el-table-column"),u=(0,t.g2)("Delete"),i=(0,t.g2)("el-icon"),c=(0,t.g2)("el-button"),h=(0,t.g2)("el-popconfirm"),m=(0,t.g2)("Plus"),p=(0,t.g2)("el-table");return(0,t.uX)(),(0,t.CE)("div",Pe,[(0,t.Lk)("div",null,[Ve,n.state.testing?((0,t.uX)(),(0,t.CE)("span",Se,"、testing")):(0,t.Q3)("",!0)]),(0,t.Lk)("div",Ie,[(0,t.bF)(p,{stripe:"",data:n.state.forwards,border:"",size:"small",width:"100%",height:"300px",onCellDblclick:n.handleCellClick},{default:(0,t.k6)((()=>[(0,t.bF)(d,{prop:"ListenPort",label:"源端口",width:"60"},{default:(0,t.k6)((e=>[e.row.ListenPortEditing?((0,t.uX)(),(0,t.Wv)(s,{key:0,autofocus:"",size:"small",modelValue:e.row.ListenPort,"onUpdate:modelValue":a=>e.row.ListenPort=a,onBlur:a=>n.handleEditBlur(e.row,"ListenPort")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,B.v_)(e.row.ListenPort),9,ye)):((0,t.uX)(),(0,t.CE)("span",Te,(0,B.v_)(e.row.ListenPort),1))],64))])),_:1}),(0,t.bF)(d,{prop:"ConnectAddr",label:"目标IP",width:"120"},{default:(0,t.k6)((e=>[e.row.ConnectAddrEditing?((0,t.uX)(),(0,t.Wv)(s,{key:0,autofocus:"",size:"small",modelValue:e.row.ConnectAddr,"onUpdate:modelValue":a=>e.row.ConnectAddr=a,onBlur:a=>n.handleEditBlur(e.row,"ConnectAddr")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,B.v_)(e.row.ConnectAddr),9,Re)):((0,t.uX)(),(0,t.CE)("span",Me,(0,B.v_)(e.row.ConnectAddr),1))],64))])),_:1}),(0,t.bF)(d,{prop:"ConnectPort",label:"目标端口",width:"80"},{default:(0,t.k6)((e=>[e.row.ConnectPortEditing?((0,t.uX)(),(0,t.Wv)(s,{key:0,autofocus:"",size:"small",modelValue:e.row.ConnectPort,"onUpdate:modelValue":a=>e.row.ConnectPort=a,onBlur:a=>n.handleEditBlur(e.row,"ConnectPort")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,B.v_)(e.row.ConnectPort),9,We)):((0,t.uX)(),(0,t.CE)("span",Ae,(0,B.v_)(e.row.ConnectPort),1))],64))])),_:1}),(0,t.bF)(d,{prop:"Remark",label:"备注"},{default:(0,t.k6)((e=>[e.row.RemarkEditing?((0,t.uX)(),(0,t.Wv)(s,{key:0,autofocus:"",size:"small",modelValue:e.row.Remark,"onUpdate:modelValue":a=>e.row.Remark=a,onBlur:a=>n.handleEditBlur(e.row,"Remark")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("div",Xe,(0,B.v_)(e.row.Remark),1))])),_:1}),(0,t.bF)(d,{prop:"Oper",label:"操作",width:"110"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.bF)(h,{title:"删除不可逆,是否确认?",onConfirm:a=>n.handleDel(e.$index)},{reference:(0,t.k6)((()=>[(0,t.bF)(c,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})])),_:1})])),_:2},1032,["onConfirm"]),(0,t.bF)(c,{type:"primary",size:"small",onClick:a=>n.handleAdd(e.$index)},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(m)])),_:1})])),_:2},1032,["onClick"])])])),_:1})])),_:1},8,["data","onCellDblclick"])])])}var Ne={props:["modelValue"],emits:["update:modelValue"],components:{Delete:T.epd,Plus:T.FWt,Warning:T.N5l,Refresh:T.C42},setup(e){const a=(0,b.W)(),l=(0,u.Kh)({machineName:a.value.current.device.MachineName,forwards:0==a.value.current.Forwards.length?[{ListenAddr:"0.0.0.0",ListenPort:0,ConnectAddr:"0.0.0.0",ConnectPort:0,Remark:""}]:a.value.current.Forwards.slice(0),timer:0,testing:!1}),n=(e,a)=>{o(e,a.property)},o=(e,a)=>{l.forwards.forEach((e=>{e["ListenAddrEditing"]=!1,e["ListenPortEditing"]=!1,e["ConnectAddrEditing"]=!1,e["ConnectPortEditing"]=!1,e["RemarkEditing"]=!1})),e[`${a}Editing`]=!0,e["__editing"]=!0},r=(e,a)=>{e[`${a}Editing`]=!1,e["__editing"]=!1},s=e=>{1==l.forwards.length?l.forwards[0]={ListenAddr:"0.0.0.0",ListenPort:0,ConnectAddr:"0.0.0.0",ConnectPort:0,Remark:""}:l.forwards.splice(e,1)},d=e=>{l.forwards.filter((e=>"0.0.0.0"==e.ConnectAddr||0==e.ConnectPort||0==e.ListenPort)).length>0||l.forwards.splice(e+1,0,{ListenAddr:"0.0.0.0",ListenPort:0,ConnectAddr:"0.0.0.0",ConnectPort:0,Remark:""})},i=()=>{clearTimeout(l.timer),l.testing=!0,(0,Ee._)({MachineId:a.value.current.MachineId,List:l.forwards.map((e=>({ListenAddr:e.ListenAddr,ListenPort:+e.ListenPort,ConnectAddr:e.ConnectAddr,ConnectPort:+e.ConnectPort})))}).then((e=>{var a=e.List;for(let t=0;t${e.ConnectAddr}:${e.ConnectPort}`,o=l.forwards.filter((e=>`${e.ListenPort}->${e.ConnectAddr}:${e.ConnectPort}`==n));for(let a=0;a{l.testing=!1,l.timer=setTimeout(i,3e3)}))};(0,t.sV)((()=>{i()})),(0,t.hi)((()=>{clearTimeout(l.timer)}));const c=()=>l.forwards.map((e=>(e.ListenPort=+e.ListenPort,e.ConnectPort=+e.ConnectPort,e)));return{state:l,handleCellClick:n,handleEditBlur:r,handleDel:s,handleAdd:d,getData:c}}};const xe=(0,C.A)(Ne,[["render",Be],["__scopeId","data-v-786fe646"]]);var ze=xe;const Ue=e=>((0,t.Qi)("data-v-4abaaeaf"),e=e(),(0,t.jt)(),e),De={class:"w-100"},Ke=Ue((()=>(0,t.Lk)("div",null,[(0,t.Lk)("span",{class:"yellow"},"填写局域网IP,使用NAT转发")],-1))),Qe={class:"wrap"},Oe=Ue((()=>(0,t.Lk)("span",null,"/",-1))),Ge={class:"pdl-10"},$e={class:"pdl-10"};function qe(e,a,l,n,o,r){const s=(0,t.g2)("el-input"),d=(0,t.g2)("el-checkbox"),u=(0,t.g2)("Delete"),i=(0,t.g2)("el-icon"),c=(0,t.g2)("el-button"),h=(0,t.g2)("Plus");return(0,t.uX)(),(0,t.CE)("div",De,[Ke,(0,t.Lk)("div",Qe,[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(n.state.lans,((e,a)=>((0,t.uX)(),(0,t.CE)("div",{key:a,class:"flex",style:{"margin-bottom":".6rem"}},[(0,t.Lk)("div",null,[(0,t.bF)(s,{modelValue:e.IP,"onUpdate:modelValue":a=>e.IP=a,style:{width:"14rem"}},null,8,["modelValue","onUpdate:modelValue"]),Oe,(0,t.bF)(s,{onChange:e=>n.handleMaskChange(a),modelValue:e.PrefixLength,"onUpdate:modelValue":a=>e.PrefixLength=a,style:{width:"4rem"}},null,8,["onChange","modelValue","onUpdate:modelValue"])]),(0,t.Lk)("div",Ge,[(0,t.bF)(d,{modelValue:e.Disabled,"onUpdate:modelValue":a=>e.Disabled=a,label:"禁用记录",style:{"vertical-align":"middle"}},null,8,["modelValue","onUpdate:modelValue"])]),(0,t.Lk)("div",$e,[(0,t.bF)(c,{type:"danger",onClick:e=>n.handleDel(a),size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})])),_:2},1032,["onClick"]),(0,t.bF)(c,{type:"primary",onClick:e=>n.handleAdd(a),size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(h)])),_:1})])),_:2},1032,["onClick"])])])))),128))])])}var je={props:["modelValue"],emits:["update:modelValue"],components:{Delete:T.epd,Plus:T.FWt,Warning:T.N5l,Refresh:T.C42},setup(e){const a=(0,b.W)(),l=(0,u.Kh)({lans:a.value.current.Lans.slice(0)});0==l.lans.length&&l.lans.push({IP:"0.0.0.0",PrefixLength:24});const t=e=>{var a=+l.lans[e].PrefixLength;(a>32||a<16||isNaN(a))&&(a=24),l.lans[e].PrefixLength=a},n=e=>{l.lans.splice(e,1),0==l.lans.length&&o(0)},o=e=>{l.lans.splice(e+1,0,{IP:"0.0.0.0",PrefixLength:24})},r=()=>l.lans.map((e=>(e.PrefixLength=+e.PrefixLength,e)));return{state:l,handleMaskChange:t,handleDel:n,handleAdd:o,getData:r}}};const Ye=(0,C.A)(je,[["render",qe],["__scopeId","data-v-4abaaeaf"]]);var He=Ye,Je={props:["modelValue"],emits:["change","update:modelValue"],components:{Delete:T.epd,Plus:T.FWt,Warning:T.N5l,Refresh:T.C42,TuntapForward:ze,TuntapLan:He},setup(e,{emit:a}){const l=(0,d.B)(),n=(0,b.W)(),o=(0,u.KR)(null),r=(0,u.Kh)({show:!0,machineName:n.value.current.device.MachineName,bufferSize:l.value.bufferSize,ruleForm:{IP:n.value.current.IP,PrefixLength:n.value.current.PrefixLength||24,Gateway:n.value.current.Gateway,ShowDelay:n.value.current.ShowDelay,AutoConnect:n.value.current.AutoConnect,Upgrade:n.value.current.Upgrade,Multicast:n.value.current.Multicast,Forwards:n.value.current.Forwards},rules:{}});(0,t.wB)((()=>r.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const s=()=>{var e=+r.ruleForm.PrefixLength;(e>32||e<16||isNaN(e))&&(e=24),r.ruleForm.PrefixLength=e},c=(0,u.KR)(null),h=(0,u.KR)(null),m=()=>{const e=JSON.parse(JSON.stringify(n.value.current));e.IP=r.ruleForm.IP.replace(/\s/g,"")||"0.0.0.0",e.Lans=c.value?c.value.getData():n.value.current.Lans,e.PrefixLength=+r.ruleForm.PrefixLength,e.Gateway=r.ruleForm.Gateway,e.ShowDelay=r.ruleForm.ShowDelay,e.AutoConnect=r.ruleForm.AutoConnect,e.Upgrade=r.ruleForm.Upgrade,e.Multicast=r.ruleForm.Multicast,e.Forwards=h.value?h.value.getData():n.value.current.Forwards,(0,Ee.ac)(e).then((()=>{r.show=!1,i.nk.success("已操作!"),a("change")})).catch((e=>{console.log(e),i.nk.error("操作失败!")}))};return{state:r,ruleFormRef:o,handlePrefixLengthChange:s,handleSave:m,lanDom:c,forwardDom:h}}};const Ze=(0,C.A)(Je,[["render",Le],["__scopeId","data-v-34275839"]]);var ea=Ze;const aa=e=>((0,t.Qi)("data-v-4a28804a"),e=e(),(0,t.jt)(),e),la=aa((()=>(0,t.Lk)("p",null,"网络租期30天、IP租期7天",-1))),ta=aa((()=>(0,t.Lk)("span",null,"/",-1))),na=aa((()=>(0,t.Lk)("span",{style:{width:"1rem"}},null,-1))),oa={class:"calc"},ra=aa((()=>(0,t.Lk)("span",{class:"label"},"网络号",-1))),sa={class:"value"},da=aa((()=>(0,t.Lk)("span",{class:"label"},"网关",-1))),ua={class:"value"},ia=aa((()=>(0,t.Lk)("span",{class:"label"},"开始IP",-1))),ca={class:"value"},ha=aa((()=>(0,t.Lk)("span",{class:"label"},"结束IP",-1))),ma={class:"value"},pa=aa((()=>(0,t.Lk)("span",{class:"label"},"广播号",-1))),wa={class:"value"},ga=aa((()=>(0,t.Lk)("span",{class:"label"},"IP数量",-1))),ka={class:"value"};function fa(e,a,l,n,o,r){const s=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-input"),u=(0,t.g2)("el-button"),i=(0,t.g2)("el-form"),c=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(c,{modelValue:n.state.show,"onUpdate:modelValue":a[3]||(a[3]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:"配置本组的网络",top:"1vh",width:"400"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(i,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"100"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{prop:"gateway"},{default:(0,t.k6)((()=>[la])),_:1}),(0,t.bF)(s,{label:"网络和掩码",prop:"IP"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{modelValue:n.state.ruleForm.IP,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.ruleForm.IP=e),style:{width:"14rem"},onChange:n.handlePrefixLengthChange},null,8,["modelValue","onChange"]),ta,(0,t.bF)(d,{onChange:n.handlePrefixLengthChange,modelValue:n.state.ruleForm.PrefixLength,"onUpdate:modelValue":a[1]||(a[1]=e=>n.state.ruleForm.PrefixLength=e),style:{width:"4rem"}},null,8,["onChange","modelValue"]),na,(0,t.bF)(u,{onClick:n.handleClear},{default:(0,t.k6)((()=>[(0,t.eW)("清除")])),_:1},8,["onClick"])])),_:1}),(0,t.bF)(s,{label:"",prop:"IP1"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",oa,[(0,t.Lk)("p",null,[ra,(0,t.Lk)("span",sa,(0,B.v_)(n.state.values.Network),1)]),(0,t.Lk)("p",null,[da,(0,t.Lk)("span",ua,(0,B.v_)(n.state.values.Gateway),1)]),(0,t.Lk)("p",null,[ia,(0,t.Lk)("span",ca,(0,B.v_)(n.state.values.Start),1)]),(0,t.Lk)("p",null,[ha,(0,t.Lk)("span",ma,(0,B.v_)(n.state.values.End),1)]),(0,t.Lk)("p",null,[pa,(0,t.Lk)("span",wa,(0,B.v_)(n.state.values.Broadcast),1)]),(0,t.Lk)("p",null,[ga,(0,t.Lk)("span",ka,(0,B.v_)(n.state.values.Count),1)])])])),_:1}),n.hasLease?((0,t.uX)(),(0,t.Wv)(s,{key:0,label:"",prop:"Btns"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(u,{onClick:a[2]||(a[2]=e=>n.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(u,{type:"primary",onClick:n.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})):(0,t.Q3)("",!0)])),_:1},8,["model","rules"])])])),_:1},8,["modelValue"])}var va={props:["modelValue"],emits:["change","update:modelValue"],components:{Delete:T.epd,Plus:T.FWt},setup(e,{emit:a}){const l=(0,d.B)(),n=(0,t.EW)((()=>l.value.hasAccess("Lease"))),o=(0,u.KR)(null),r=(0,u.Kh)({show:!0,ruleForm:{IP:"0.0.0.0",PrefixLength:24},rules:{},values:{}});(0,t.wB)((()=>r.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const s=()=>{(0,Ee.w0)(r.ruleForm).then((e=>{r.values=e}))},c=()=>{(0,Ee.Nj)().then((e=>{r.ruleForm.IP=e.IP,r.ruleForm.PrefixLength=e.PrefixLength,s()}))},h=()=>{var e=+r.ruleForm.PrefixLength;(e>32||e<16||isNaN(e))&&(e=24),r.ruleForm.PrefixLength=e,s()},m=()=>{(0,Ee.AE)(r.ruleForm).then((()=>{i.nk.success("已操作"),r.show=!1})).catch((e=>{console.log(e),i.nk.error("操作失败")}))},p=()=>{(0,Ee.AE)({IP:"0.0.0.0",PrefixLength:24}).then((()=>{i.nk.success("已操作"),c()})).catch((e=>{console.log(e),i.nk.error("操作失败")}))};return(0,t.sV)((()=>{c()})),{state:r,hasLease:n,ruleFormRef:o,handleSave:m,handlePrefixLengthChange:h,handleClear:p}}};const ba=(0,C.A)(va,[["render",fa],["__scopeId","data-v-4a28804a"]]);var Fa=ba;const Ca={key:0};function La(e,a,l,n,o,r){const s=(0,t.g2)("Socks5Show"),d=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(d,{prop:"socks5",label:"代理转发",width:"160"},{default:(0,t.k6)((e=>[n.socks5.list[e.row.MachineId]?((0,t.uX)(),(0,t.CE)("div",Ca,[(0,t.bF)(s,{config:!0,item:e.row,onEdit:n.handleSocks5,onRefresh:n.handleSocks5Refresh},null,8,["item","onEdit","onRefresh"])])):(0,t.Q3)("",!0)])),_:1})}const Ea={class:"flex"},_a={class:"flex-1"},Pa=["title"],Va={key:0,class:"green gateway"},Sa={key:1},Ia={key:0},ya={key:0,class:"flex yellow",title:"已禁用"},Ta={key:1,class:"flex red",title:"与其它设备填写IP、或本机局域网IP有冲突"};function Ra(e,a,l,n,o,r){const s=(0,t.g2)("ConnectionShow"),d=(0,t.g2)("Loading"),u=(0,t.g2)("el-icon"),i=(0,t.g2)("el-switch");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("div",Ea,[(0,t.Lk)("div",_a,[(0,t.bF)(s,{data:n.connections.list[n.item.MachineId]},null,8,["data"]),(0,t.Lk)("a",{href:"javascript:;",class:"a-line",onClick:a[0]||(a[0]=e=>n.handleSocks5Port(n.socks5.list[n.item.MachineId])),title:"此设备的socks5代理"},[n.socks5.list[n.item.MachineId].SetupError?((0,t.uX)(),(0,t.CE)("strong",{key:0,class:"red",title:n.socks5.list[n.item.MachineId].SetupError}," socks5://*:"+(0,B.v_)(n.socks5.list[n.item.MachineId].Port),9,Pa)):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[n.socks5.list[n.item.MachineId].running?((0,t.uX)(),(0,t.CE)("strong",Va,"socks5://*:"+(0,B.v_)(n.socks5.list[n.item.MachineId].Port),1)):((0,t.uX)(),(0,t.CE)("span",Sa,"socks5://*:"+(0,B.v_)(n.socks5.list[n.item.MachineId].Port),1))],64))])]),n.socks5.list[n.item.MachineId].loading?((0,t.uX)(),(0,t.CE)("div",Ia,[(0,t.bF)(u,{size:"14",class:"loading"},{default:(0,t.k6)((()=>[(0,t.bF)(d)])),_:1})])):((0,t.uX)(),(0,t.Wv)(i,{key:1,modelValue:n.socks5.list[n.item.MachineId].running,"onUpdate:modelValue":a[1]||(a[1]=e=>n.socks5.list[n.item.MachineId].running=e),loading:n.socks5.list[n.item.MachineId].loading,disabled:"",onClick:a[2]||(a[2]=e=>n.handleSocks5(n.socks5.list[n.item.MachineId])),size:"small","inline-prompt":"","active-text":"😀","inactive-text":"😣"},null,8,["modelValue","loading"]))]),(0,t.Lk)("div",null,[(0,t.Lk)("div",null,[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(n.socks5.list[n.item.MachineId].Lans,((e,a)=>((0,t.uX)(),(0,t.CE)(t.FK,{key:a},[e.Disabled?((0,t.uX)(),(0,t.CE)("div",ya,(0,B.v_)(e.IP)+" / "+(0,B.v_)(e.PrefixLength),1)):e.Exists?((0,t.uX)(),(0,t.CE)("div",Ta,(0,B.v_)(e.IP)+" / "+(0,B.v_)(e.PrefixLength),1)):((0,t.uX)(),(0,t.CE)("div",{key:2,class:(0,B.C4)(["flex",{green:n.socks5.list[n.item.MachineId].running}]),title:"正常使用"},(0,B.v_)(e.IP)+" / "+(0,B.v_)(e.PrefixLength),3))],64)))),128))])])])}var Ma=l(9983),Wa=l(4867),Aa={props:["item","config"],emits:["edit","refresh"],components:{Loading:T.Rhj,ConnectionShow:Wa.A},setup(e,{emit:a}){const l=v(),n=(0,d.B)(),o=(0,t.EW)((()=>n.value.config.Client.Id)),r=(0,t.EW)((()=>n.value.hasAccess("Socks5ChangeSelf"))),s=(0,t.EW)((()=>n.value.hasAccess("Socks5ChangeOther"))),u=(0,t.EW)((()=>n.value.hasAccess("Socks5StatusSelf"))),c=(0,t.EW)((()=>n.value.hasAccess("Socks5StatusOther"))),h=(0,Ma.bB)(),m=a=>{if(!e.config)return;if(o.value===a.MachineId){if(!u.value)return}else if(!c.value)return;const l=a.running?(0,g.R2)(a.MachineId):(0,g.qH)(a.MachineId);a.loading=!0,l.then((()=>{i.nk.success("操作成功!")})).catch((e=>{console.log(e),i.nk.error("操作失败!")}))},p=l=>{if(e.config||o.value==l.MachineId){if(o.value===l.MachineId){if(!r.value)return}else if(!s.value)return;l.device=e.item,a("edit",l)}},w=()=>{a("refresh")};return{item:(0,t.EW)((()=>e.item)),socks5:l,connections:h,handleSocks5:m,handleSocks5Port:p,handleSocks5Refresh:w}}};const Xa=(0,C.A)(Aa,[["render",Ra],["__scopeId","data-v-d37c5992"]]);var Ba=Xa,Na={emits:["edit","refresh"],components:{Socks5Show:Ba},setup(e,{emit:a}){const l=v(),t=e=>{a("edit",e)},n=()=>{a("refresh")};return{socks5:l,handleSocks5:t,handleSocks5Refresh:n}}};const xa=(0,C.A)(Na,[["render",La]]);var za=xa;const Ua=e=>((0,t.Qi)("data-v-022e3781"),e=e(),(0,t.jt)(),e),Da={class:"upgrade-wrap"},Ka={class:"flex-1"},Qa=Ua((()=>(0,t.Lk)("span",null,"/",-1))),Oa={class:"pdl-10"},Ga={class:"pdl-10"};function $a(e,a,l,n,o,r){const s=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-input"),u=(0,t.g2)("el-checkbox"),i=(0,t.g2)("Delete"),c=(0,t.g2)("el-icon"),h=(0,t.g2)("el-button"),m=(0,t.g2)("Plus"),p=(0,t.g2)("el-form"),w=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(w,{modelValue:n.state.show,"onUpdate:modelValue":a[2]||(a[2]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:`设置[${n.state.machineName}]代理`,top:"1vh",width:"600"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(p,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"140"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{prop:"gateway",style:{"margin-bottom":"0"}},{default:(0,t.k6)((()=>[(0,t.eW)(" 配置代理,通过代理访问其它设备 ")])),_:1}),(0,t.bF)(s,{label:"代理端口",prop:"Port"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{modelValue:n.state.ruleForm.Port,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.ruleForm.Port=e),style:{width:"14rem"}},null,8,["modelValue"])])),_:1}),(0,t.Lk)("div",Da,[(0,t.bF)(s,{label:"此设备局域网IP",prop:"LanIP",class:"lan-item"},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(n.state.ruleForm.Lans,((e,a)=>((0,t.uX)(),(0,t.CE)("div",{key:a,class:"flex",style:{"margin-bottom":".6rem"}},[(0,t.Lk)("div",Ka,[(0,t.bF)(d,{modelValue:e.IP,"onUpdate:modelValue":a=>e.IP=a,style:{width:"14rem"}},null,8,["modelValue","onUpdate:modelValue"]),Qa,(0,t.bF)(d,{onChange:e=>n.handleMaskChange(a),modelValue:e.PrefixLength,"onUpdate:modelValue":a=>e.PrefixLength=a,style:{width:"4rem"}},null,8,["onChange","modelValue","onUpdate:modelValue"])]),(0,t.Lk)("div",Oa,[(0,t.bF)(u,{modelValue:e.Disabled,"onUpdate:modelValue":a=>e.Disabled=a,label:"禁用记录",size:"large"},null,8,["modelValue","onUpdate:modelValue"])]),(0,t.Lk)("div",Ga,[(0,t.bF)(h,{type:"danger",onClick:e=>n.handleDel(a)},{default:(0,t.k6)((()=>[(0,t.bF)(c,null,{default:(0,t.k6)((()=>[(0,t.bF)(i)])),_:1})])),_:2},1032,["onClick"]),(0,t.bF)(h,{type:"primary",onClick:e=>n.handleAdd(a)},{default:(0,t.k6)((()=>[(0,t.bF)(c,null,{default:(0,t.k6)((()=>[(0,t.bF)(m)])),_:1})])),_:2},1032,["onClick"])])])))),128))])),_:1})]),(0,t.bF)(s,{label:"",prop:"Btns"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(h,{onClick:a[1]||(a[1]=e=>n.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(h,{type:"primary",onClick:n.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue","title"])}var qa={props:["modelValue"],emits:["change","update:modelValue"],components:{Delete:T.epd,Plus:T.FWt},setup(e,{emit:a}){const l=(0,d.B)(),n=v(),o=(0,u.KR)(null),r=(0,u.Kh)({show:!0,machineName:n.value.current.device.MachineName,bufferSize:l.value.bufferSize,ruleForm:{Port:n.value.current.Port,Lans:n.value.current.Lans.slice(0)},rules:{}});0==r.ruleForm.Lans.length&&r.ruleForm.Lans.push({IP:"0.0.0.0",PrefixLength:24}),(0,t.wB)((()=>r.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const s=e=>{var a=+r.ruleForm.Lans[e].PrefixLength;(a>32||a<16||isNaN(a))&&(a=24),r.ruleForm.Lans[e].PrefixLength=a},c=e=>{r.ruleForm.Lans.splice(e,1),0==r.ruleForm.Lans.length&&h(0)},h=e=>{r.ruleForm.Lans.splice(e+1,0,{IP:"0.0.0.0",PrefixLength:24})},m=()=>{const e=JSON.parse(JSON.stringify(n.value.current));e.Port=+(r.ruleForm.Port||"1805"),e.Lans=r.ruleForm.Lans.map((e=>(e.PrefixLength=+e.PrefixLength,e))),(0,g._Q)(e).then((()=>{r.show=!1,i.nk.success("已操作!"),a("change")})).catch((e=>{console.log(e),i.nk.error("操作失败!")}))};return{state:r,ruleFormRef:o,handleMaskChange:s,handleDel:c,handleAdd:h,handleSave:m}}};const ja=(0,C.A)(qa,[["render",$a],["__scopeId","data-v-022e3781"]]);var Ya=ja;const Ha={key:0},Ja=["title","onClick"],Za=["onClick"];function el(e,a,l,n,o,r){const s=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(s,{prop:"tunnel",label:"隧道",width:"76"},{default:(0,t.k6)((e=>[n.tunnel.list[e.row.MachineId]?((0,t.uX)(),(0,t.CE)("div",Ha,[(0,t.Lk)("a",{href:"javascript:;",class:(0,B.C4)(["a-line",{yellow:n.tunnel.list[e.row.MachineId].NeedReboot}]),title:n.tunnel.list[e.row.MachineId].NeedReboot?"需要重启":"调整网关层级有助于打洞成功",onClick:a=>n.handleTunnel(n.tunnel.list[e.row.MachineId],e.row)},[(0,t.Lk)("span",null,"网关:"+(0,B.v_)(n.tunnel.list[e.row.MachineId].RouteLevel)+"+"+(0,B.v_)(n.tunnel.list[e.row.MachineId].RouteLevelPlus),1)],10,Ja)])):(0,t.Q3)("",!0),(0,t.Lk)("div",null,[(0,t.Lk)("a",{href:"javascript:;",title:"与此设备的隧道连接",class:(0,B.C4)(["a-line",{green:n.connectionCount(e.row.MachineId)>0}]),onClick:a=>n.handleConnections(e.row)},[(0,t.Lk)("span",{class:(0,B.C4)({gateway:n.connectionCount(e.row.MachineId)>0})},[(0,t.eW)("连接:"),(0,t.Lk)("span",null,(0,B.v_)(n.connectionCount(e.row.MachineId)),1)],2)],10,Za)])])),_:1})}var al=l(83);const ll=Symbol(),tl=()=>{(0,d.B)();const e=(0,u.KR)({timer:0,showEdit:!1,current:null,list:{},hashcode:0});(0,t.Gt)(ll,e);const a=()=>{(0,al.r7)(e.value.hashcode.toString()).then((l=>{e.value.hashcode=l.HashCode,l.List&&(e.value.list=l.List),e.value.timer=setTimeout(a,1060)})).catch((()=>{e.value.timer=setTimeout(a,1060)}))},l=a=>{e.value.current=a,e.value.showEdit=!0},n=()=>{(0,al.gM)()},o=()=>{clearTimeout(e.value.timer)},r=a=>Object.values(e.value.list).sort(((e,a)=>e.RouteLevel+e.RouteLevelPlus-a.RouteLevel+a.RouteLevelPlus)).map((e=>e.MachineId));return{tunnel:e,_getTunnelInfo:a,handleTunnelEdit:l,handleTunnelRefresh:n,clearTunnelTimeout:o,sortTunnel:r}},nl=()=>(0,t.WQ)(ll);var ol={emits:["edit","refresh"],setup(e,{emit:a}){const l=(0,d.B)(),n=(0,t.EW)((()=>l.value.config.Client.Id)),o=(0,t.EW)((()=>l.value.hasAccess("TunnelChangeSelf"))),r=(0,t.EW)((()=>l.value.hasAccess("TunnelChangeOther"))),s=nl(),u=((0,Ma.ZY)(),(0,Ma.mx)()),i=(0,Ma.FG)(),c=(0,Ma.bB)(),h=e=>{const a=[u.value.list[e],i.value.list[e],c.value.list[e]].filter((e=>!!e&&e.Connected)).length;return a},m=(e,l)=>{if(n.value===e.MachineId){if(!o.value)return}else if(!r.value)return;e.device=l,a("edit",e)},p=()=>{a("refresh")},w=e=>{a("connections",e)};return{tunnel:s,handleTunnel:m,handleTunnelRefresh:p,connectionCount:h,handleConnections:w}}};const rl=(0,C.A)(ol,[["render",el],["__scopeId","data-v-49e16cac"]]);var sl=rl;const dl=e=>((0,t.Qi)("data-v-6ea047f9"),e=e(),(0,t.jt)(),e),ul=dl((()=>(0,t.Lk)("div",null,"网关层级为你的设备与外网的距离,你可以手动调整数值",-1))),il=dl((()=>(0,t.Lk)("div",null,"光猫映射了端口后,可以直接连接,把TcpPortMap调到第一",-1))),cl={class:"t-c w-100"};function hl(e,a,l,n,o,r){const s=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-input"),u=(0,t.g2)("el-col"),i=(0,t.g2)("el-input-number"),c=(0,t.g2)("el-row"),h=(0,t.g2)("el-button"),m=(0,t.g2)("el-form"),p=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(p,{modelValue:n.state.show,"onUpdate:modelValue":a[5]||(a[5]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:`设置[${n.state.machineName}]网关`,width:"400"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(m,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"auto"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:"",prop:"alert"},{default:(0,t.k6)((()=>[ul])),_:1}),(0,t.bF)(s,{label:""},{default:(0,t.k6)((()=>[(0,t.bF)(c,null,{default:(0,t.k6)((()=>[(0,t.bF)(u,{span:12},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:"网关层级",prop:"RouteLevel"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{readonly:"",modelValue:n.state.ruleForm.RouteLevel,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.ruleForm.RouteLevel=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,t.bF)(u,{span:12},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:"调整层级",prop:"RouteLevelPlus"},{default:(0,t.k6)((()=>[(0,t.bF)(i,{modelValue:n.state.ruleForm.RouteLevelPlus,"onUpdate:modelValue":a[1]||(a[1]=e=>n.state.ruleForm.RouteLevelPlus=e)},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,t.bF)(s,{label:"",prop:"alert"},{default:(0,t.k6)((()=>[il])),_:1}),(0,t.bF)(s,{label:""},{default:(0,t.k6)((()=>[(0,t.bF)(c,null,{default:(0,t.k6)((()=>[(0,t.bF)(u,{span:12},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:"外网端口",prop:"PortMapWan"},{default:(0,t.k6)((()=>[(0,t.bF)(i,{modelValue:n.state.ruleForm.PortMapWan,"onUpdate:modelValue":a[2]||(a[2]=e=>n.state.ruleForm.PortMapWan=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,t.bF)(u,{span:12},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:"内网端口",prop:"PortMapLan"},{default:(0,t.k6)((()=>[(0,t.bF)(i,{modelValue:n.state.ruleForm.PortMapLan,"onUpdate:modelValue":a[3]||(a[3]=e=>n.state.ruleForm.PortMapLan=e)},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,t.bF)(s,{label:"",prop:"Btns"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",cl,[(0,t.bF)(h,{onClick:a[4]||(a[4]=e=>n.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(h,{type:"primary",onClick:n.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue","title"])}var ml={props:["modelValue"],emits:["change","update:modelValue"],setup(e,{emit:a}){const l=nl(),n=(0,u.KR)(null),o=(0,u.Kh)({show:!0,machineName:l.value.current.device.MachineName,ruleForm:{RouteLevel:l.value.current.RouteLevel,RouteLevelPlus:l.value.current.RouteLevelPlus,PortMapWan:l.value.current.PortMapWan,PortMapLan:l.value.current.PortMapLan},rules:{}});(0,t.wB)((()=>o.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const r=()=>{const e=JSON.parse(JSON.stringify(l.value.current));e.RouteLevel=+o.ruleForm.RouteLevel,e.RouteLevelPlus=+o.ruleForm.RouteLevelPlus,e.PortMapWan=+o.ruleForm.PortMapWan,e.PortMapLan=+o.ruleForm.PortMapLan,(0,al.KW)(e).then((()=>{o.show=!1,i.nk.success("已操作!"),a("change")})).catch((e=>{console.log(e),i.nk.error("操作失败!")}))};return{state:o,ruleFormRef:n,handleSave:r}}};const pl=(0,C.A)(ml,[["render",hl],["__scopeId","data-v-6ea047f9"]]);var wl=pl;const gl=["onClick"],kl=["onClick"],fl=["onClick"],vl=["onClick"];function bl(e,a,l,n,o,r){const s=(0,t.g2)("ConnectionShow"),d=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(d,{prop:"forward",label:"转发/穿透"},{default:(0,t.k6)((a=>[a.row.Connected?((0,t.uX)(),(0,t.CE)(t.FK,{key:0},[a.row.isSelf&&(n.hasForwardShowSelf||e.hasForwardSelf)?((0,t.uX)(),(0,t.CE)(t.FK,{key:0},[(0,t.Lk)("div",null,[(0,t.bF)(s,{data:n.connections.list[a.row.MachineId]},null,8,["data"]),(0,t.Lk)("a",{href:"javascript:;",title:"管理自己的端口转发",class:(0,B.C4)({green:n.forward.list[a.row.MachineId]>0}),onClick:e=>n.handleEdit(a.row.MachineId,a.row.MachineName)},[(0,t.Lk)("span",{class:(0,B.C4)({gateway:n.forward.list[a.row.MachineId]>0})},"端口转发("+(0,B.v_)(n.forward.list[a.row.MachineId]>99?"99+":n.forward.list[a.row.MachineId])+")",3)],10,gl)]),(0,t.Lk)("div",null,[(0,t.Lk)("a",{href:"javascript:;",title:"管理自己的内网穿透",class:(0,B.C4)({green:n.sforward.list[a.row.MachineId]>0}),onClick:e=>n.handleSEdit(a.row.MachineId,a.row.MachineName)},[(0,t.Lk)("span",{class:(0,B.C4)({gateway:n.sforward.list[a.row.MachineId]>0})},"内网穿透("+(0,B.v_)(n.sforward.list[a.row.MachineId]>99?"99+":n.sforward.list[a.row.MachineId])+")",3)],10,kl)])],64)):n.hasForwardShowOther||e.hasForwardOther?((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.Lk)("div",null,[(0,t.bF)(s,{data:n.connections.list[a.row.MachineId]},null,8,["data"]),(0,t.Lk)("a",{href:"javascript:;",title:"管理自己的端口转发",class:(0,B.C4)({green:n.forward.list[a.row.MachineId]>0}),onClick:e=>n.handleEdit(a.row.MachineId,a.row.MachineName)},[(0,t.Lk)("span",{class:(0,B.C4)({gateway:n.forward.list[a.row.MachineId]>0})},"端口转发("+(0,B.v_)(n.forward.list[a.row.MachineId]>99?"99+":n.forward.list[a.row.MachineId])+")",3)],10,fl)]),(0,t.Lk)("div",null,[(0,t.Lk)("a",{href:"javascript:;",title:"管理自己的内网穿透",class:(0,B.C4)({green:n.sforward.list[a.row.MachineId]>0}),onClick:e=>n.handleSEdit(a.row.MachineId,a.row.MachineName)},[(0,t.Lk)("span",{class:(0,B.C4)({gateway:n.sforward.list[a.row.MachineId]>0})},"内网穿透("+(0,B.v_)(n.sforward.list[a.row.MachineId]>99?"99+":n.sforward.list[a.row.MachineId])+")",3)],10,vl)])],64)):(0,t.Q3)("",!0)],64)):(0,t.Q3)("",!0)])),_:1})}var Fl=l(743);const Cl=Symbol(),Ll=()=>{const e=(0,d.B)(),a=((0,t.EW)((()=>e.value.config.Client.Id)),(0,u.KR)({timer:0,showEdit:!1,showCopy:!1,list:{},testTimer:0,hashcode:0,machineid:"",machineName:""}));(0,t.Gt)(Cl,a);const l=()=>{(0,Fl.a9)()},n=()=>{(0,Fl.gz)(a.value.hashcode.toString()).then((e=>{a.value.hashcode=e.HashCode,e.List&&(a.value.list=e.List),a.value.timer=setTimeout(n,1020)})).catch((()=>{a.value.timer=setTimeout(n,1020)}))},o=e=>{a.value.machineid=e[0],a.value.machineName=e[1],a.value.showEdit=!0},r=()=>{clearTimeout(a.value.timer),clearTimeout(a.value.testTimer)};return{sforward:a,_getSForwardCountInfo:n,handleSForwardEdit:o,clearSForwardTimeout:r,handleSForwardRefresh:l}},El=()=>(0,t.WQ)(Cl);var _l={emits:["edit","sedit"],components:{ConnectionShow:Wa.A},setup(e,{emit:a}){const l=w(),n=El(),o=(0,d.B)(),r=(0,t.EW)((()=>o.value.config.Client.Id)),s=(0,t.EW)((()=>o.value.hasAccess("ForwardShowSelf"))),u=(0,t.EW)((()=>o.value.hasAccess("ForwardShowOther"))),i=(0,t.EW)((()=>o.value.hasAccess("ForwardSelf"))),c=(0,t.EW)((()=>o.value.hasAccess("ForwardOther"))),h=(0,Ma.mx)(),m=(e,l)=>{if(r.value===e){if(!i.value)return}else if(!c.value)return;a("edit",[e,l])},p=(e,l)=>{if(r.value===e){if(!i.value)return}else if(!c.value)return;a("sedit",[e,l])},g=()=>{a("refresh")};return{forward:l,sforward:n,hasForwardShowSelf:s,hasForwardShowOther:u,connections:h,handleEdit:m,handleSEdit:p,handleForwardRefresh:g}}};const Pl=(0,C.A)(_l,[["render",bl],["__scopeId","data-v-6e9936ec"]]);var Vl=Pl;const Sl={class:"t-c head"},Il=["title"],yl={class:"t-c"},Tl={class:"page-wrap"},Rl=["title"];function Ml(e,a,l,n,o,r){const s=(0,t.g2)("el-button"),d=(0,t.g2)("el-input"),u=(0,t.g2)("el-table-column"),i=(0,t.g2)("el-option"),c=(0,t.g2)("el-select"),h=(0,t.g2)("WarnTriangleFilled"),m=(0,t.g2)("el-icon"),p=(0,t.g2)("el-pagination"),w=(0,t.g2)("el-switch"),g=(0,t.g2)("Delete"),k=(0,t.g2)("el-popconfirm"),f=(0,t.g2)("el-table"),v=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(v,{modelValue:n.state.show,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.show=e),onOpen:n.handleOnShowList,"append-to":".app-wrap",title:`【${n.state.machineName}】的端口转发`,top:"1vh",width:"780"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.Lk)("div",Sl,[(0,t.bF)(s,{type:"success",size:"small",onClick:n.handleAdd},{default:(0,t.k6)((()=>[(0,t.eW)("添加")])),_:1},8,["onClick"]),(0,t.bF)(s,{size:"small",onClick:n.handleRefresh},{default:(0,t.k6)((()=>[(0,t.eW)("刷新")])),_:1},8,["onClick"])]),(0,t.bF)(f,{data:n.state.data,size:"small",border:"",height:"500",onCellDblclick:n.handleCellClick},{default:(0,t.k6)((()=>[(0,t.bF)(u,{property:"Name",label:"名称",width:"100"},{default:(0,t.k6)((e=>[e.row.NameEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.Name,"onUpdate:modelValue":a=>e.row.Name=a,onBlur:a=>n.handleEditBlur(e.row,"Name")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,B.v_)(e.row.Name),1)],64))])),_:1}),(0,t.bF)(u,{prop:"BufferSize",label:"缓冲区",width:"80"},{default:(0,t.k6)((e=>[e.row.BufferSizeEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(c,{key:0,modelValue:e.row.BufferSize,"onUpdate:modelValue":a=>e.row.BufferSize=a,placeholder:"Select",size:"small",disabled:e.row.Started,onChange:a=>n.handleEditBlur(e.row,"BufferSize")},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(n.state.bufferSize,((e,a)=>((0,t.uX)(),(0,t.Wv)(i,{key:a,label:e,value:a},null,8,["label","value"])))),128))])),_:2},1032,["modelValue","onUpdate:modelValue","disabled","onChange"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,B.v_)(n.state.bufferSize[e.row.BufferSize]),1)],64))])),_:1}),(0,t.bF)(u,{property:"BindIPAddress",label:"监听IP",width:"140"},{default:(0,t.k6)((e=>[e.row.BindIPAddressEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(c,{key:0,modelValue:e.row.BindIPAddress,"onUpdate:modelValue":a=>e.row.BindIPAddress=a,size:"small",disabled:e.row.Started,onChange:a=>n.handleEditBlur(e.row,"BindIPAddress")},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(n.state.ips,(e=>((0,t.uX)(),(0,t.Wv)(i,{key:e,label:e,value:e},null,8,["label","value"])))),128))])),_:2},1032,["modelValue","onUpdate:modelValue","disabled","onChange"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,B.v_)(e.row.BindIPAddress),1)],64))])),_:1}),(0,t.bF)(u,{property:"Port",label:"监听端口",width:"80"},{default:(0,t.k6)((e=>[e.row.PortEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(d,{key:0,type:"number",autofocus:"",size:"small",modelValue:e.row.Port,"onUpdate:modelValue":a=>e.row.Port=a,onBlur:a=>n.handleEditBlur(e.row,"Port")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[e.row.Msg?((0,t.uX)(),(0,t.CE)("div",{key:0,class:"error red",title:e.row.Msg},[(0,t.Lk)("span",null,(0,B.v_)(e.row.Port),1),(0,t.bF)(m,{size:"20"},{default:(0,t.k6)((()=>[(0,t.bF)(h)])),_:1})],8,Il)):((0,t.uX)(),(0,t.CE)("span",{key:1,class:(0,B.C4)({green:e.row.Started})},(0,B.v_)(e.row.Port),3))],64))])),_:1}),(0,t.bF)(u,{property:"MachineId",label:"目标"},{default:(0,t.k6)((e=>[e.row.MachineIdEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(c,{key:0,modelValue:e.row.MachineId,"onUpdate:modelValue":a=>e.row.MachineId=a,onChange:a=>n.handleEditBlur(e.row,"MachineId"),filterable:"",remote:"",loading:n.state.loading,"remote-method":n.handleSearch},{header:(0,t.k6)((()=>[(0,t.Lk)("div",yl,[(0,t.Lk)("div",Tl,[(0,t.bF)(p,{small:"",background:"",layout:"prev, pager, next","page-size":n.state.machineIds.Request.Size,total:n.state.machineIds.Count,"pager-count":5,"current-page":n.state.machineIds.Request.Page,onCurrentChange:n.handlePageChange},null,8,["page-size","total","current-page","onCurrentChange"])])])])),default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(n.state.machineIds.List,((e,a)=>((0,t.uX)(),(0,t.Wv)(i,{key:a,label:e.MachineName,value:e.MachineId},null,8,["label","value"])))),128))])),_:2},1032,["modelValue","onUpdate:modelValue","onChange","loading","remote-method"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,B.v_)(e.row.MachineName),1)],64))])),_:1}),(0,t.bF)(u,{property:"TargetEP",label:"目标服务",width:"140"},{default:(0,t.k6)((e=>[e.row.TargetEPEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.TargetEP,"onUpdate:modelValue":a=>e.row.TargetEP=a,onBlur:a=>n.handleEditBlur(e.row,"TargetEP")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[e.row.TargetMsg?((0,t.uX)(),(0,t.CE)("div",{key:0,class:"error red",title:e.row.TargetMsg},[(0,t.Lk)("span",null,(0,B.v_)(e.row.TargetEP),1),(0,t.bF)(m,{size:"20"},{default:(0,t.k6)((()=>[(0,t.bF)(h)])),_:1})],8,Rl)):((0,t.uX)(),(0,t.CE)("span",{key:1,class:(0,B.C4)({green:e.row.Started})},(0,B.v_)(e.row.TargetEP),3))],64))])),_:1}),(0,t.bF)(u,{property:"Started",label:"状态",width:"60"},{default:(0,t.k6)((e=>[(0,t.bF)(w,{modelValue:e.row.Started,"onUpdate:modelValue":a=>e.row.Started=a,onChange:a=>n.handleStartChange(e.row),"inline-prompt":"","active-text":"开","inactive-text":"关"},null,8,["modelValue","onUpdate:modelValue","onChange"])])),_:1}),(0,t.bF)(u,{label:"操作",width:"54"},{default:(0,t.k6)((e=>[(0,t.bF)(k,{"confirm-button-text":"确认","cancel-button-text":"取消",title:"删除不可逆,是否确认?",onConfirm:a=>n.handleDel(e.row.Id)},{reference:(0,t.k6)((()=>[(0,t.bF)(s,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(m,null,{default:(0,t.k6)((()=>[(0,t.bF)(g)])),_:1})])),_:1})])),_:2},1032,["onConfirm"])])),_:1})])),_:1},8,["data","onCellDblclick"])])])),_:1},8,["modelValue","onOpen","title"])}var Wl={props:["data","modelValue"],emits:["update:modelValue"],components:{WarnTriangleFilled:T.DtC,Delete:T.epd},setup(e,{emit:a}){const l=(0,d.B)(),n=w(),o=(0,u.Kh)({show:!0,machineId:n.value.machineId,machineName:n.value.machineName,data:[],ips:[],bufferSize:l.value.bufferSize,loading:!1,machineIds:{Request:{Page:1,Size:10,Name:""},Count:0,List:[]}});(0,t.wB)((()=>o.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const r=()=>{(0,h.xD)().then((e=>{e.splice(0,0,"127.0.0.1"),e.splice(0,0,"0.0.0.0"),o.ips=e})).catch((()=>{}))},s=()=>{(0,h.Oy)(o.machineId).then((e=>{o.data=e})).catch((()=>{}))},c=e=>{o.machineIds.Request.Name=e,m()},m=()=>{o.loading=!0,(0,I.BS)(o.machineIds.Request).then((e=>{o.loading=!1,o.machineIds.Request=e.Request,o.machineIds.Count=e.Count,o.machineIds.List=e.List})).catch((e=>{o.loading=!1}))},p=e=>{o.machineIds.Request.Page=e,m()},g=()=>{s(),m()},k=(e,a)=>{b(e,a.property)},f=()=>{s(),i.nk.success("已刷新")},v=()=>{E({ID:0,Name:"",Port:0,TargetEP:"127.0.0.1:80",machineId:""})},b=(e,a)=>{e.Started?i.nk.error("请先停止"):(o.data.forEach((e=>{e["NameEditing"]=!1,e["PortEditing"]=!1,e["TargetEPEditing"]=!1,e["BindIPAddressEditing"]=!1,e["BufferSizeEditing"]=!1,e["MachineIdEditing"]=!1})),e[`${a}Editing`]=!0)},F=(e,a)=>{if(e.Started)return void i.nk.error("请先停止");e[`${a}Editing`]=!1;const l=o.machineIds.List.find((a=>a.MachineId==e.MachineId));l&&(e.MachineName=l.MachineName),E(e)},C=e=>{(0,h.we)({machineId:o.machineId,Id:e}).then((()=>{s()}))},L=e=>{E(e)},E=e=>{e.Port=parseInt(e.Port),(0,h.nH)({machineId:o.machineId,data:e}).then((()=>{s()})).catch((e=>{i.nk.error(e)}))};return(0,t.sV)((()=>{s(),r()})),{state:o,handleOnShowList:g,handleCellClick:k,handleRefresh:f,handleAdd:v,handleEdit:b,handleEditBlur:F,handleDel:C,handleStartChange:L,handleSearch:c,handlePageChange:p}}};const Al=(0,C.A)(Wl,[["render",Ml],["__scopeId","data-v-15b05a01"]]);var Xl=Al;const Bl={class:"t-c head"},Nl=["title"],xl=["title"];function zl(e,a,l,n,o,r){const s=(0,t.g2)("el-button"),d=(0,t.g2)("el-input"),u=(0,t.g2)("el-table-column"),i=(0,t.g2)("WarnTriangleFilled"),c=(0,t.g2)("el-icon"),h=(0,t.g2)("el-switch"),m=(0,t.g2)("Delete"),p=(0,t.g2)("el-popconfirm"),w=(0,t.g2)("el-table"),g=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(g,{modelValue:n.state.show,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.show=e),onOpen:n.handleOnShowList,"append-to":".app-wrap",title:`【${n.machineName}】的内网穿透`,top:"1vh",width:"700"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.Lk)("div",Bl,[(0,t.bF)(s,{type:"success",size:"small",onClick:n.handleAdd},{default:(0,t.k6)((()=>[(0,t.eW)("添加")])),_:1},8,["onClick"]),(0,t.bF)(s,{size:"small",onClick:n.handleRefresh},{default:(0,t.k6)((()=>[(0,t.eW)("刷新")])),_:1},8,["onClick"])]),(0,t.bF)(w,{data:n.state.data,size:"small",border:"",height:"500",onCellDblclick:n.handleCellClick},{default:(0,t.k6)((()=>[(0,t.bF)(u,{property:"Name",label:"名称"},{default:(0,t.k6)((e=>[e.row.NameEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.Name,"onUpdate:modelValue":a=>e.row.Name=a,onBlur:a=>n.handleEditBlur(e.row,"Name")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,B.v_)(e.row.Name),1)],64))])),_:1}),(0,t.bF)(u,{prop:"BufferSize",label:"缓冲区",width:"100"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,B.v_)(1<[e.row.TempEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.Temp,"onUpdate:modelValue":a=>e.row.Temp=a,onBlur:a=>n.handleEditBlur(e.row,"Temp")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[e.row.Msg?((0,t.uX)(),(0,t.CE)("div",{key:0,class:"error red",title:e.row.Msg},[(0,t.Lk)("span",null,(0,B.v_)(e.row.Temp),1),(0,t.bF)(c,{size:"20"},{default:(0,t.k6)((()=>[(0,t.bF)(i)])),_:1})],8,Nl)):((0,t.uX)(),(0,t.CE)("span",{key:1,class:(0,B.C4)({green:e.row.Started})},(0,B.v_)(e.row.Temp),3))],64))])),_:1}),(0,t.bF)(u,{property:"LocalEP",label:"本机服务",width:"140"},{default:(0,t.k6)((e=>[e.row.LocalEPEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.LocalEP,"onUpdate:modelValue":a=>e.row.LocalEP=a,onBlur:a=>n.handleEditBlur(e.row,"LocalEP")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[e.row.LocalMsg?((0,t.uX)(),(0,t.CE)("div",{key:0,class:"error red",title:e.row.LocalMsg},[(0,t.Lk)("span",null,(0,B.v_)(e.row.LocalEP),1),(0,t.bF)(c,{size:"20"},{default:(0,t.k6)((()=>[(0,t.bF)(i)])),_:1})],8,xl)):((0,t.uX)(),(0,t.CE)("span",{key:1,class:(0,B.C4)({green:e.row.Started})},(0,B.v_)(e.row.LocalEP),3))],64))])),_:1}),(0,t.bF)(u,{property:"Started",label:"状态",width:"60"},{default:(0,t.k6)((e=>[(0,t.bF)(h,{modelValue:e.row.Started,"onUpdate:modelValue":a=>e.row.Started=a,onChange:a=>n.handleStartChange(e.row),"inline-prompt":"","active-text":"是","inactive-text":"否"},null,8,["modelValue","onUpdate:modelValue","onChange"])])),_:1}),(0,t.bF)(u,{label:"操作",width:"54"},{default:(0,t.k6)((e=>[(0,t.bF)(p,{"confirm-button-text":"确认","cancel-button-text":"取消",title:"删除不可逆,是否确认?",onConfirm:a=>n.handleDel(e.row.Id)},{reference:(0,t.k6)((()=>[(0,t.bF)(s,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(c,null,{default:(0,t.k6)((()=>[(0,t.bF)(m)])),_:1})])),_:1})])),_:2},1032,["onConfirm"])])),_:1})])),_:1},8,["data","onCellDblclick"])])])),_:1},8,["modelValue","onOpen","title"])}var Ul={props:["data","modelValue"],emits:["update:modelValue"],components:{WarnTriangleFilled:T.DtC,Delete:T.epd},setup(e,{emit:a}){const l=(0,d.B)(),n=El(),o=(0,u.Kh)({bufferSize:l.value.bufferSize,show:!0,data:[],timerTestLocal:0});(0,t.wB)((()=>o.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e)}),300)}));const r=()=>{console.log(n.value.machineid),(0,Fl.eX)(n.value.machineid).then((e=>{o.timerTestLocal=setTimeout(r,1e3)})).catch((()=>{o.timerTestLocal=setTimeout(r,1e3)}))},s=()=>{(0,Fl.pY)(n.value.machineid).then((e=>{e.forEach((e=>{e.Temp=(e.Domain||e.RemotePort).toString(),e.RemotePort=0,e.Domain=""})),o.data=e})).catch((()=>{}))},c=()=>{s()},h=(e,a)=>{w(e,a.property)},m=()=>{s(),i.nk.success("已刷新")},p=()=>{const e={Id:0,Name:"",RemotePort:0,LocalEP:"127.0.0.1:80",Domain:"",Temp:""};(0,Fl.Qs)({machineid:n.value.machineid,data:e}).then((()=>{setTimeout((()=>{s()}),100)})).catch((e=>{i.nk.error(e)}))},w=(e,a)=>{e.Started?i.nk.error("请先停止运行"):(o.data.forEach((e=>{e["NameEditing"]=!1,e["RemotePortEditing"]=!1,e["LocalEPEditing"]=!1,e["DomainEditing"]=!1,e["TempEditing"]=!1})),e[`${a}Editing`]=!0)},g=(e,a)=>{e.Started?i.nk.error("请先停止运行"):(e[`${a}Editing`]=!1,v(e))},k=e=>{(0,Fl.DY)({machineid:n.value.machineid,id:e}).then((()=>{s()}))},f=e=>{v(e)},v=e=>{e.Temp&&(/^\d+$/.test(e.Temp)?e.RemotePort=parseInt(e.Temp):e.Domain=e.Temp,(0,Fl.Qs)({machineid:n.value.machineid,data:e}).then((e=>{0==e&&i.nk.error("操作失败,可能存在相同值"),setTimeout((()=>{s()}),100)})).catch((e=>{i.nk.error(e)})))};return(0,t.sV)((()=>{s(),r()})),(0,t.hi)((()=>{clearTimeout(o.timerTestLocal)})),{state:o,machineName:n.value.machineName,handleOnShowList:c,handleCellClick:h,handleRefresh:m,handleAdd:p,handleEdit:w,handleEditBlur:g,handleDel:k,handleStartChange:f}}};const Dl=(0,C.A)(Ul,[["render",zl],["__scopeId","data-v-7eb8e7cc"]]);var Kl=Dl;const Ql=["onClick"],Ol={key:0},Gl={key:1},$l={key:0},ql={key:1},jl={key:0},Yl={key:1};function Hl(e,a,l,n,o,r){const s=(0,t.g2)("el-table-column"),d=(0,t.g2)("Delete"),u=(0,t.g2)("el-icon"),i=(0,t.g2)("el-button"),c=(0,t.g2)("el-popconfirm"),h=(0,t.g2)("el-table"),m=(0,t.g2)("el-dialog"),p=(0,t.g2)("el-switch");return(0,t.uX)(),(0,t.CE)(t.FK,null,[(0,t.bF)(m,{modelValue:n.state.show,"onUpdate:modelValue":a[0]||(a[0]=e=>n.state.show=e),"append-to":".app-wrap",title:`与[${n.state.machineName}]的链接`,top:"1vh",width:"780"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(h,{data:n.state.data,size:"small",border:"",height:"500"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{property:"RemoteMachineId",label:"目标/服务器"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",{class:(0,B.C4)({green:e.row.Connected})},[(0,t.Lk)("p",null,(0,B.v_)(e.row.IPEndPoint),1),(0,t.Lk)("p",null,"ssl : "+(0,B.v_)(e.row.SSL),1)],2)])),_:1}),(0,t.bF)(s,{property:"TransactionId",label:"事务",width:"80"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,B.v_)(n.state.transactions[e.row.TransactionId]),1)])),_:1}),(0,t.bF)(s,{property:"TransportName",label:"协议"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("p",null,(0,B.v_)(e.row.TransportName)+"("+(0,B.v_)(n.state.protocolTypes[e.row.ProtocolType])+")",1),(0,t.Lk)("p",null,(0,B.v_)(n.state.types[e.row.Type])+" - "+(0,B.v_)(1<[(0,t.Lk)("span",null,(0,B.v_)(e.row.Delay)+"ms",1)])),_:1}),(0,t.bF)(s,{property:"Bytes",label:"通信"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("p",null,"up : "+(0,B.v_)(e.row.SendBytesText),1),(0,t.Lk)("p",null,"down : "+(0,B.v_)(e.row.ReceiveBytesText),1)])])),_:1}),(0,t.bF)(s,{property:"relay",label:"中继节点"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("a",{href:"javascript:;",class:"a-line",onClick:a=>n.handleNode(e.row)},(0,B.v_)(n.state.nodesDic[e.row.NodeId]||"选择节点"),9,Ql)])])),_:1}),(0,t.bF)(s,{label:"操作",width:"54"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[n.hasTunnelRemove?((0,t.uX)(),(0,t.Wv)(c,{key:0,"confirm-button-text":"确认","cancel-button-text":"取消",title:"确定关闭此连接?",onConfirm:a=>n.handleDel(e.row)},{reference:(0,t.k6)((()=>[(0,t.bF)(i,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(u,null,{default:(0,t.k6)((()=>[(0,t.bF)(d)])),_:1})])),_:1})])),_:2},1032,["onConfirm"])):(0,t.Q3)("",!0)])])),_:1})])),_:1},8,["data"])])])),_:1},8,["modelValue","title"]),(0,t.bF)(m,{modelValue:n.state.showNodes,"onUpdate:modelValue":a[1]||(a[1]=e=>n.state.showNodes=e),title:"中继节点",width:"760",top:"2vh"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(h,{data:n.state.nodes,size:"small",border:"",height:"600"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{property:"Name",label:"名称"}),(0,t.bF)(s,{property:"MaxGbTotal",label:"月流量",width:"160"},{default:(0,t.k6)((e=>[0==e.row.MaxGbTotal?((0,t.uX)(),(0,t.CE)("span",Ol,"无限制")):((0,t.uX)(),(0,t.CE)("span",Gl,(0,B.v_)((e.row.MaxGbTotalLastBytes/1024/1024/1024).toFixed(2))+"GB / "+(0,B.v_)(e.row.MaxGbTotal)+"GB ",1))])),_:1}),(0,t.bF)(s,{property:"MaxBandwidth",label:"连接带宽",width:"80"},{default:(0,t.k6)((e=>[0==e.row.MaxBandwidth?((0,t.uX)(),(0,t.CE)("span",$l,"无限制")):((0,t.uX)(),(0,t.CE)("span",ql,(0,B.v_)(e.row.MaxBandwidth)+"Mbps",1))])),_:1}),(0,t.bF)(s,{property:"MaxBandwidthTotal",label:"总带宽",width:"80"},{default:(0,t.k6)((e=>[0==e.row.MaxBandwidthTotal?((0,t.uX)(),(0,t.CE)("span",jl,"无限制")):((0,t.uX)(),(0,t.CE)("span",Yl,(0,B.v_)(e.row.MaxBandwidthTotal)+"Mbps",1))])),_:1}),(0,t.bF)(s,{property:"BandwidthRatio",label:"带宽速率",width:"66"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,B.v_)(100*e.row.BandwidthRatio)+"%",1)])),_:1}),(0,t.bF)(s,{property:"ConnectionRatio",label:"连接数",width:"60"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,B.v_)(100*e.row.ConnectionRatio)+"%",1)])),_:1}),(0,t.bF)(s,{property:"Delay",label:"延迟",width:"60"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,B.v_)(e.row.Delay)+"ms",1)])),_:1}),(0,t.bF)(s,{property:"Public",label:"公开",width:"60"},{default:(0,t.k6)((e=>[(0,t.bF)(p,{disabled:"",modelValue:e.row.Public,"onUpdate:modelValue":a=>e.row.Public=a,size:"small"},null,8,["modelValue","onUpdate:modelValue"])])),_:1}),(0,t.bF)(s,{property:"Oper",label:"操作",width:"65"},{default:(0,t.k6)((e=>[(0,t.bF)(i,{type:"success",size:"small",onClick:a=>n.handleConnect(e.row.Id)},{default:(0,t.k6)((()=>[(0,t.eW)("使用")])),_:2},1032,["onClick"])])),_:1})])),_:1},8,["data"])])])),_:1},8,["modelValue"])],64)}var Jl=l(9232),Zl={props:["modelValue"],emits:["change","update:modelValue"],components:{Delete:T.epd},setup(e,{emit:a}){const l=(0,d.B)(),n=(0,t.EW)((()=>l.value.hasAccess("TunnelRemove"))),o=(0,Ma.ZY)(),r=(0,Ma.mx)(),s=(0,Ma.FG)(),c=(0,Ma.bB)(),h=(0,u.Kh)({show:!0,protocolTypes:{1:"tcp",2:"udp",4:"msquic"},types:{0:"打洞",1:"中继",2:"节点"},transactions:{forward:"端口转发",tuntap:"虚拟网卡",socks5:"代理转发"},machineName:o.value.currentName,currentRow:{},data:(0,t.EW)((()=>[r.value.list[o.value.current],s.value.list[o.value.current],c.value.list[o.value.current]].filter((e=>!!e)))),showNodes:!1,nodes:[],nodesDic:{},timer:0});(0,t.wB)((()=>h.show),(e=>{e||setTimeout((()=>{a("update:modelValue",e),a("change")}),300)}));const m=e=>{n.value&&e.removeFunc(e.RemoteMachineId).then((()=>{i.nk.success("删除成功")})).catch((()=>{}))},p=()=>{(0,Jl.W4)().then((e=>{h.nodes=e,h.nodesDic=e.reduce(((e,a)=>(e[a.Id]=a.Name,e)),{}),h.timer=setTimeout(p,1e3)})).catch((()=>{h.timer=setTimeout(p,1e3)}))},w=e=>{h.currentRow=e,h.showNodes=!0},g=e=>{const a={FromMachineId:l.value.config.Client.Id,TransactionId:h.currentRow.TransactionId,ToMachineId:h.currentRow.RemoteMachineId,NodeId:e};a.NodeId!=h.currentRow.NodeId&&((0,Jl.uQ)(a).then((()=>{})).catch((()=>{})),h.showNodes=!1)};return(0,t.sV)((()=>{o.value.updateRealTime(!0),p()})),(0,t.hi)((()=>{o.value.updateRealTime(!1),clearTimeout(h.timer)})),{state:h,handleDel:m,hasTunnelRemove:n,handleNode:w,handleConnect:g}}};const et=(0,C.A)(Zl,[["render",Hl],["__scopeId","data-v-7891b902"]]);var at=et,lt=l(9383),tt={components:{Sort:E,Oper:X,Device:J,DeviceEdit:ne,AccessEdit:ce,Tunnel:sl,TunnelEdit:wl,ConnectionsEdit:at,Tuntap:ke,TuntapEdit:ea,TuntapLease:Fa,Socks5:za,Socks5Edit:Ya,Forward:Vl,ForwardEdit:Xl,SForwardEdit:Kl},setup(e){const a=(0,d.B)(),l=(0,u.Kh)({height:(0,t.EW)((()=>a.value.height-90))}),{devices:n,machineId:o,_getSignList:r,_getSignList1:s,handleDeviceEdit:c,handleAccessEdit:h,handlePageChange:m,handlePageSizeChange:w,handleDel:g,clearDevicesTimeout:k,setSort:v}=(0,oe.r)(),{tuntap:F,_getTuntapInfo:C,handleTuntapEdit:L,handleTuntapRefresh:E,clearTuntapTimeout:_,getTuntapMachines:P,sortTuntapIP:V}=(0,b.O)(),{socks5:S,_getSocks5Info:I,handleSocks5Edit:y,handleSocks5Refresh:T,clearSocks5Timeout:R,getSocks5Machines:W,sortSocks5:A}=f(),{tunnel:X,_getTunnelInfo:B,handleTunnelEdit:N,handleTunnelRefresh:x,clearTunnelTimeout:z,sortTunnel:U}=tl(),{forward:D,_getForwardCountInfo:K,handleForwardEdit:Q,clearForwardTimeout:O,handleForwardRefresh:G}=p(),{sforward:$,_getSForwardCountInfo:q,handleSForwardEdit:j,clearSForwardTimeout:Y,handleSForwardRefresh:H}=Ll(),{connections:J,forwardConnections:Z,_getForwardConnections:ee,tuntapConnections:ae,_getTuntapConnections:le,socks5Connections:te,_getSocks5Connections:ne,handleTunnelConnections:re,clearConnectionsTimeout:se}=(0,Ma.L2)(),{_getUpdater:de,_subscribeUpdater:ue,clearUpdaterTimeout:ie}=(0,lt.d)(),{_getAccessInfo:ce,clearAccessTimeout:he,handleAccesssRefresh:me}=(0,M.Y)(),pe=e=>{n.page.Request.Prop=e.prop,n.page.Request.Asc="ascending"==e.order;let a=new Promise(((e,a)=>{e()}));if("tunnel"==e.prop){const e=U(n.page.Request.Asc);e.length>0&&(a=v(e))}else if("tuntap"==e.prop){const e=V(n.page.Request.Asc);e.length>0&&(a=v(e))}else if("socks5"==e.prop){const e=A(n.page.Request.Asc);e.length>0&&(a=v(e))}a.then((()=>{m()})).catch((()=>{}))},we=e=>{n.page.Request.Name=e||"",n.page.Request.Name?n.page.Request.Ids=P(n.page.Request.Name).concat(W(n.page.Request.Name)).reduce(((e,a)=>(-1==e.indexOf(a)&&e.push(a),e)),[]):n.page.Request.Ids=[],m(),x(),E(),T(),G(),H(),me(),i.nk.success({message:"刷新成功",grouping:!0})},ge=()=>{m(),x(),E(),T(),me(),i.nk.success({message:"刷新成功",grouping:!0})};return(0,t.sV)((()=>{m(),x(),E(),T(),G(),H(),me(),r(),s(),C(),I(),B(),ee(),le(),ne(),K(),q(),de(),ue(),ce()})),(0,t.hi)((()=>{k(),se(),_(),R(),z(),O(),Y(),ie(),he()})),{state:l,devices:n,machineId:o,handleSortChange:pe,handleDeviceEdit:c,handleAccessEdit:h,handlePageRefresh:we,handlePageSearch:ge,handlePageChange:m,handlePageSizeChange:w,handleDel:g,tuntap:F,handleTuntapEdit:L,handleTuntapRefresh:E,socks5:S,handleSocks5Edit:y,handleSocks5Refresh:T,tunnel:X,connections:J,handleTunnelEdit:N,handleTunnelRefresh:x,handleTunnelConnections:re,forward:D,handleForwardEdit:Q,sforward:$,handleSForwardEdit:j}}};const nt=(0,C.A)(tt,[["render",s],["__scopeId","data-v-3d1c480c"]]);var ot=nt}}]); \ No newline at end of file diff --git a/linker.tray.win/web/js/857.f520b520.js b/linker.tray.win/web/js/857.f520b520.js new file mode 100644 index 00000000..92f5fba3 --- /dev/null +++ b/linker.tray.win/web/js/857.f520b520.js @@ -0,0 +1 @@ +"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[857],{9232:function(e,l,t){t.d(l,{W4:function(){return o},q:function(){return n},uQ:function(){return r}});var a=t(4);const n=e=>(0,a.zG)("relay/SetServers",e),o=()=>(0,a.zG)("relay/Subscribe"),r=e=>(0,a.zG)("relay/Connect",e)},743:function(e,l,t){t.d(l,{Ap:function(){return n},Co:function(){return o},DY:function(){return u},Qs:function(){return i},a9:function(){return s},eX:function(){return c},gz:function(){return d},pY:function(){return r}});var a=t(4);const n=()=>(0,a.zG)("sforwardclient/GetSecretKey"),o=e=>(0,a.zG)("sforwardclient/SetSecretKey",e),r=e=>(0,a.zG)("sforwardclient/get",e),s=()=>(0,a.zG)("sforwardclient/refresh"),d=(e="0")=>(0,a.zG)("sforwardclient/getcount",e),u=e=>(0,a.zG)("sforwardclient/remove",e),i=e=>(0,a.zG)("sforwardclient/add",e),c=e=>(0,a.zG)("sforwardclient/TestLocal",e)},920:function(e,l,t){t.d(l,{BJ:function(){return c},Ce:function(){return g},NS:function(){return r},PY:function(){return u},UB:function(){return p},Vk:function(){return i},aP:function(){return m},ir:function(){return d},lJ:function(){return o},mK:function(){return n},y2:function(){return h},yN:function(){return s}});var a=t(4);const n=(e="0")=>(0,a.zG)("updaterclient/get",e),o=e=>(0,a.zG)("updaterclient/confirm",e),r=e=>(0,a.zG)("updaterclient/exit",e),s=()=>(0,a.zG)("updaterclient/GetSecretKey"),d=e=>(0,a.zG)("updaterclient/SetSecretKey",e),u=e=>(0,a.zG)("updaterclient/SetInterval",e),i=()=>(0,a.zG)("updaterclient/getcurrent"),c=()=>(0,a.zG)("updaterclient/getserver"),h=e=>(0,a.zG)("updaterclient/confirmserver",e),m=()=>(0,a.zG)("updaterclient/exitserver"),p=()=>(0,a.zG)("updaterclient/Subscribe"),g=e=>(0,a.zG)("updaterclient/check",e)},5857:function(e,l,t){t.r(l),t.d(l,{default:function(){return oe}});var a=t(6768);const n={key:0,class:"servers-wrap"};function o(e,l,t,o,r,s){const d=(0,a.g2)("SignInServers"),u=(0,a.g2)("el-tab-pane"),i=(0,a.g2)("Groups"),c=(0,a.g2)("Async"),h=(0,a.g2)("el-tabs");return o.hasConfig?((0,a.uX)(),(0,a.CE)("div",n,[(0,a.bF)(h,{type:"border-card",style:{width:"100%"},modelValue:o.state.tab,"onUpdate:modelValue":l[0]||(l[0]=e=>o.state.tab=e)},{default:(0,a.k6)((()=>[(0,a.bF)(u,{label:"信标服务器",name:"signin"},{default:(0,a.k6)((()=>[(0,a.bF)(d)])),_:1}),(0,a.bF)(u,{label:"分组设置",name:"groups"},{default:(0,a.k6)((()=>[(0,a.bF)(i)])),_:1}),o.hasSync?((0,a.uX)(),(0,a.Wv)(u,{key:0,label:"配置同步",name:"async"},{default:(0,a.k6)((()=>[(0,a.bF)(c)])),_:1})):(0,a.Q3)("",!0)])),_:1},8,["modelValue"])])):(0,a.Q3)("",!0)}var r=t(144),s=t(3830),d=t(4232);const u={class:"flex"},i=(0,a.Lk)("span",null,"服务器地址。ip:端口 或者 域名:端口",-1),c={class:"flex"},h=(0,a.Lk)("span",null,"密钥正确时可连接服务器",-1),m={class:"t-c"};function p(e,l,t,n,o,r){const s=(0,a.g2)("el-input"),p=(0,a.g2)("el-form-item"),g=(0,a.g2)("RelayServers"),k=(0,a.g2)("SForward"),b=(0,a.g2)("Updater"),f=(0,a.g2)("el-form"),w=(0,a.g2)("el-button"),y=(0,a.g2)("el-card");return(0,a.uX)(),(0,a.CE)("div",{class:"signin-wrap",style:(0,d.Tr)({height:`${n.state.height}px`})},[(0,a.bF)(y,{shadow:"never"},{header:(0,a.k6)((()=>[(0,a.eW)("服务器相关设置")])),footer:(0,a.k6)((()=>[(0,a.Lk)("div",m,[(0,a.bF)(w,{type:"success",onClick:n.handleSave},{default:(0,a.k6)((()=>[(0,a.eW)("确定更改")])),_:1},8,["onClick"])])])),default:(0,a.k6)((()=>[(0,a.Lk)("div",null,[(0,a.bF)(f,{"label-width":"auto"},{default:(0,a.k6)((()=>[(0,a.bF)(p,{label:"服务器地址"},{default:(0,a.k6)((()=>[(0,a.Lk)("div",u,[(0,a.bF)(s,{class:"flex-1",modelValue:n.state.list.Host,"onUpdate:modelValue":l[0]||(l[0]=e=>n.state.list.Host=e),onChange:n.handleSave},null,8,["modelValue","onChange"]),i])])),_:1}),(0,a.bF)(p,{label:"信标密钥"},{default:(0,a.k6)((()=>[(0,a.Lk)("div",c,[(0,a.bF)(s,{class:"flex-1",type:"password","show-password":"",maxlength:"36",modelValue:n.state.list.SecretKey,"onUpdate:modelValue":l[1]||(l[1]=e=>n.state.list.SecretKey=e),onChange:n.handleSave},null,8,["modelValue","onChange"]),h])])),_:1}),(0,a.bF)(g),(0,a.bF)(k),(0,a.bF)(b)])),_:1})])])),_:1})],4)}var g=t(9299),k=t(1219);const b={class:"flex"},f=(0,a.Lk)("span",null,"密钥正确时可使用内网穿透",-1);function w(e,l,t,n,o,r){const s=(0,a.g2)("el-input"),d=(0,a.g2)("el-form-item");return(0,a.uX)(),(0,a.Wv)(d,{label:"服务器穿透密钥"},{default:(0,a.k6)((()=>[(0,a.Lk)("div",b,[(0,a.bF)(s,{class:"flex-1",type:"password","show-password":"",modelValue:n.state.SForwardSecretKey,"onUpdate:modelValue":l[0]||(l[0]=e=>n.state.SForwardSecretKey=e),maxlength:"36",onBlur:n.handleChange},null,8,["modelValue","onBlur"]),f])])),_:1})}var y=t(743),v={setup(e){const l=(0,r.Kh)({SForwardSecretKey:""}),t=()=>{(0,y.Ap)().then((e=>{l.SForwardSecretKey=e}))},n=()=>{l.SForwardSecretKey&&(0,y.Co)(l.SForwardSecretKey).then((()=>{k.nk.success("已操作")})).catch((e=>{console.log(e),k.nk.error("操作失败")}))},o=()=>{n()};return(0,a.sV)((()=>{t()})),{state:l,handleChange:o}}},C=t(1241);const F=(0,C.A)(v,[["render",w]]);var S=F;const V={class:"flex"},_=(0,a.Lk)("span",null,"密钥正确时可更新服务端",-1);function x(e,l,t,n,o,r){const s=(0,a.g2)("el-input"),d=(0,a.g2)("el-form-item"),u=(0,a.g2)("el-input-number");return(0,a.uX)(),(0,a.CE)(a.FK,null,[(0,a.bF)(d,{label:"服务器更新密钥"},{default:(0,a.k6)((()=>[(0,a.Lk)("div",V,[(0,a.bF)(s,{class:"flex-1",type:"password","show-password":"",modelValue:n.state.secretKey,"onUpdate:modelValue":l[0]||(l[0]=e=>n.state.secretKey=e),maxlength:"36",onBlur:n.handleChange},null,8,["modelValue","onBlur"]),_])])),_:1}),(0,a.bF)(d,{label:"客户端更新检测频率"},{default:(0,a.k6)((()=>[(0,a.Lk)("div",null,[(0,a.Lk)("div",null,[(0,a.bF)(u,{modelValue:n.state.year,"onUpdate:modelValue":l[1]||(l[1]=e=>n.state.year=e),min:0,max:99,style:{width:"12rem"},onChange:n.handleSecChange},null,8,["modelValue","onChange"]),(0,a.eW)(" 年 "),(0,a.bF)(u,{modelValue:n.state.month,"onUpdate:modelValue":l[2]||(l[2]=e=>n.state.month=e),min:0,max:99,style:{width:"12rem"},onChange:n.handleSecChange},null,8,["modelValue","onChange"]),(0,a.eW)(" 月 "),(0,a.bF)(u,{modelValue:n.state.day,"onUpdate:modelValue":l[3]||(l[3]=e=>n.state.day=e),min:0,max:99,style:{width:"12rem"},onChange:n.handleSecChange},null,8,["modelValue","onChange"]),(0,a.eW)(" 日 ")]),(0,a.Lk)("div",null,[(0,a.bF)(u,{modelValue:n.state.hour,"onUpdate:modelValue":l[4]||(l[4]=e=>n.state.hour=e),min:0,max:99,style:{width:"12rem"},onChange:n.handleSecChange},null,8,["modelValue","onChange"]),(0,a.eW)(" 时 "),(0,a.bF)(u,{modelValue:n.state.min,"onUpdate:modelValue":l[5]||(l[5]=e=>n.state.min=e),min:0,max:99,style:{width:"12rem"},onChange:n.handleSecChange},null,8,["modelValue","onChange"]),(0,a.eW)(" 分 "),(0,a.bF)(u,{modelValue:n.state.sec,"onUpdate:modelValue":l[6]||(l[6]=e=>n.state.sec=e),min:0,max:99,style:{width:"12rem"},onChange:n.handleSecChange},null,8,["modelValue","onChange"]),(0,a.eW)(" 秒 ")])])])),_:1})],64)}var K=t(920),G={setup(e){const l=(0,s.B)(),t=(0,r.Kh)({secretKey:"",year:0,month:0,day:0,hour:0,min:1,sec:0}),n=()=>{(0,K.yN)().then((e=>{t.secretKey=e}))},o=()=>{t.secretKey&&(0,K.ir)(t.secretKey).then((()=>{k.nk.success("已操作")})).catch((e=>{console.log(e),k.nk.error("操作失败")}))},d=()=>{const e=31536e3*t.year+2592e3*t.month+86400*t.day+3600*t.hour+60*t.min+t.sec;(0,K.PY)(e).then((()=>{k.nk.success("已操作")})).catch((e=>{console.log(e),k.nk.error("操作失败")}))},u=()=>{d()},i=()=>{o()};return(0,a.sV)((()=>{n();let e=l.value.config.Common.UpdateIntervalSeconds;t.year=Math.floor(e/31536e3),e%=31536e3,t.month=Math.floor(e/2592e3),e%=2592e3,t.day=Math.floor(e/86400),e%=86400,t.hour=Math.floor(e/3600),e%=3600,t.min=Math.floor(e/60),e%=60,t.sec=e})),{state:t,handleChange:i,handleSecChange:u}}};const z=(0,C.A)(G,[["render",x]]);var B=z;const E={key:0},U={key:1},W={key:0},L={key:1},X={key:0},I={key:1};function A(e,l,t,n,o,r){const s=(0,a.g2)("el-input"),u=(0,a.g2)("el-checkbox"),i=(0,a.g2)("el-form-item"),c=(0,a.g2)("el-table-column"),h=(0,a.g2)("el-switch"),m=(0,a.g2)("el-table"),p=(0,a.g2)("el-dialog");return(0,a.uX)(),(0,a.CE)(a.FK,null,[(0,a.bF)(i,{label:"中继密钥"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{type:"password","show-password":"",modelValue:n.state.list.SecretKey,"onUpdate:modelValue":l[0]||(l[0]=e=>n.state.list.SecretKey=e),maxlength:"36",onChange:n.handleSave},null,8,["modelValue","onChange"]),(0,a.bF)(u,{modelValue:n.state.list.SSL,"onUpdate:modelValue":l[1]||(l[1]=e=>n.state.list.SSL=e),label:"使用ssl",size:"large",onChange:n.handleSave},null,8,["modelValue","onChange"]),(0,a.bF)(u,{modelValue:n.state.list.Disabled,"onUpdate:modelValue":l[2]||(l[2]=e=>n.state.list.Disabled=e),label:"禁用中继",size:"large",onChange:n.handleSave},null,8,["modelValue","onChange"]),(0,a.Lk)("a",{href:"javascript:;",onClick:l[3]||(l[3]=e=>n.state.show=!0),class:(0,d.C4)(["delay a-line",{red:0==n.state.nodes.length,green:n.state.nodes.length>0}])}," 中继节点 : "+(0,d.v_)(n.state.nodes.length),3)])),_:1}),(0,a.bF)(p,{modelValue:n.state.show,"onUpdate:modelValue":l[4]||(l[4]=e=>n.state.show=e),title:"中继节点",width:"760",top:"2vh"},{default:(0,a.k6)((()=>[(0,a.Lk)("div",null,[(0,a.bF)(m,{data:n.state.nodes,size:"small",border:"",height:"500"},{default:(0,a.k6)((()=>[(0,a.bF)(c,{property:"Name",label:"名称"}),(0,a.bF)(c,{property:"MaxGbTotal",label:"月流量",width:"160"},{default:(0,a.k6)((e=>[0==e.row.MaxGbTotal?((0,a.uX)(),(0,a.CE)("span",E,"无限制")):((0,a.uX)(),(0,a.CE)("span",U,(0,d.v_)((e.row.MaxGbTotalLastBytes/1024/1024/1024).toFixed(2))+"GB / "+(0,d.v_)(e.row.MaxGbTotal)+"GB",1))])),_:1}),(0,a.bF)(c,{property:"MaxBandwidth",label:"连接带宽",width:"80"},{default:(0,a.k6)((e=>[0==e.row.MaxBandwidth?((0,a.uX)(),(0,a.CE)("span",W,"无限制")):((0,a.uX)(),(0,a.CE)("span",L,(0,d.v_)(e.row.MaxBandwidth)+"Mbps",1))])),_:1}),(0,a.bF)(c,{property:"MaxBandwidthTotal",label:"总带宽",width:"80"},{default:(0,a.k6)((e=>[0==e.row.MaxBandwidthTotal?((0,a.uX)(),(0,a.CE)("span",X,"无限制")):((0,a.uX)(),(0,a.CE)("span",I,(0,d.v_)(e.row.MaxBandwidthTotal)+"Mbps",1))])),_:1}),(0,a.bF)(c,{property:"BandwidthRatio",label:"带宽速率",width:"66"},{default:(0,a.k6)((e=>[(0,a.Lk)("span",null,(0,d.v_)(100*e.row.BandwidthRatio)+"%",1)])),_:1}),(0,a.bF)(c,{property:"ConnectionRatio",label:"连接数",width:"60"},{default:(0,a.k6)((e=>[(0,a.Lk)("span",null,(0,d.v_)(100*e.row.ConnectionRatio)+"%",1)])),_:1}),(0,a.bF)(c,{property:"Delay",label:"延迟",width:"60"},{default:(0,a.k6)((e=>[(0,a.Lk)("span",null,(0,d.v_)(e.row.Delay)+"ms",1)])),_:1}),(0,a.bF)(c,{property:"Public",label:"公开",width:"60"},{default:(0,a.k6)((e=>[(0,a.bF)(h,{disabled:"",modelValue:e.row.Public,"onUpdate:modelValue":l=>e.row.Public=l,size:"small"},null,8,["modelValue","onUpdate:modelValue"])])),_:1})])),_:1},8,["data"])])])),_:1},8,["modelValue"])],64)}var M=t(9232),P={setup(e){const l=(0,s.B)(),t=(0,r.Kh)({list:l.value.config.Client.Relay.Server,show:!1,nodes:[],timer:0});(0,a.wB)((()=>l.value.config.Client.Relay.Server),(()=>{t.list.Delay=l.value.config.Client.Relay.Server.Delay}));const n=()=>{(0,M.q)(t.list).then((()=>{k.nk.success("已操作")})).catch((e=>{console.log(e),k.nk.error("操作失败")}))},o=()=>{(0,M.W4)().then((e=>{t.nodes=e,t.timer=setTimeout(o,1e3)})).catch((()=>{t.timer=setTimeout(o,1e3)}))};return(0,a.sV)((()=>{o()})),(0,a.hi)((()=>{clearTimeout(t.timer)})),{state:t,handleSave:n}}};const T=(0,C.A)(P,[["render",A],["__scopeId","data-v-3a883663"]]);var D=T,N={components:{SForward:S,Updater:B,RelayServers:D},setup(e){const l=(0,s.B)(),t=(0,r.Kh)({list:l.value.config.Client.Server,height:(0,a.EW)((()=>l.value.height-90))}),n=()=>{(0,g.jU)(t.list).then((()=>{k.nk.success("已操作,请在右下角【信标服务器】重连")})).catch((e=>{console.log(e),k.nk.error("操作失败")}))};return{state:t,handleSave:n}}};const R=(0,C.A)(N,[["render",p]]);var $=R;function Q(e,l,t,n,o,r){const s=(0,a.g2)("el-input"),u=(0,a.g2)("el-table-column"),i=(0,a.g2)("Delete"),c=(0,a.g2)("el-icon"),h=(0,a.g2)("el-button"),m=(0,a.g2)("el-popconfirm"),p=(0,a.g2)("Plus"),g=(0,a.g2)("el-table");return(0,a.uX)(),(0,a.Wv)(g,{stripe:"",data:n.state.list,border:"",size:"small",width:"100%",height:`${n.state.height}px`,onCellDblclick:n.handleCellClick},{default:(0,a.k6)((()=>[(0,a.bF)(u,{prop:"Name",label:"名称",width:"100"},{default:(0,a.k6)((e=>[e.row.NameEditing?((0,a.uX)(),(0,a.Wv)(s,{key:0,autofocus:"",size:"small",modelValue:e.row.Name,"onUpdate:modelValue":l=>e.row.Name=l,onBlur:l=>n.handleEditBlur(e.row,"Name")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,a.uX)(),(0,a.CE)(a.FK,{key:1},[(0,a.eW)((0,d.v_)(e.row.Name),1)],64))])),_:1}),(0,a.bF)(u,{prop:"Id",label:"Id"},{default:(0,a.k6)((e=>[e.row.IdEditing?((0,a.uX)(),(0,a.Wv)(s,{key:0,autofocus:"",size:"small",modelValue:e.row.Id,"onUpdate:modelValue":l=>e.row.Id=l,onBlur:l=>n.handleEditBlur(e.row,"Id")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,a.uX)(),(0,a.CE)(a.FK,{key:1},[(0,a.eW)((0,d.v_)(e.row.Id),1)],64))])),_:1}),(0,a.bF)(u,{prop:"Password",label:"密码"},{default:(0,a.k6)((e=>[e.row.PasswordEditing?((0,a.uX)(),(0,a.Wv)(s,{key:0,type:"password","show-password":"",size:"small",modelValue:e.row.Password,"onUpdate:modelValue":l=>e.row.Password=l,onBlur:l=>n.handleEditBlur(e.row,"Password")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,a.uX)(),(0,a.CE)(a.FK,{key:1},[(0,a.eW)((0,d.v_)(e.row.Password.replace(/.{1}/g,"*")),1)],64))])),_:1}),(0,a.bF)(u,{prop:"Oper",label:"操作",width:"110"},{default:(0,a.k6)((e=>[(0,a.Lk)("div",null,[(0,a.bF)(m,{title:"删除不可逆,是否确认?",onConfirm:l=>n.handleDel(e.$index)},{reference:(0,a.k6)((()=>[(0,a.bF)(h,{type:"danger",size:"small"},{default:(0,a.k6)((()=>[(0,a.bF)(c,null,{default:(0,a.k6)((()=>[(0,a.bF)(i)])),_:1})])),_:1})])),_:2},1032,["onConfirm"]),(0,a.bF)(h,{type:"primary",size:"small",onClick:l=>n.handleAdd(e.$index)},{default:(0,a.k6)((()=>[(0,a.bF)(c,null,{default:(0,a.k6)((()=>[(0,a.bF)(p)])),_:1})])),_:2},1032,["onClick"])])])),_:1})])),_:1},8,["data","height","onCellDblclick"])}var Y=t(7477),j={components:{Delete:Y.epd,Plus:Y.FWt,Select:Y.l6P},setup(e){const l=(0,s.B)(),t=(0,r.Kh)({list:l.value.config.Client.Groups||[],height:(0,a.EW)((()=>l.value.height-90))});(0,a.wB)((()=>l.value.config.Client.Groups),(()=>{0==t.list.filter((e=>e["__editing"])).length&&(t.list=l.value.config.Client.Groups)}));const n=(e,l)=>{o(e,l.property)},o=(e,l)=>{t.list.forEach((e=>{e["NameEditing"]=!1,e["IdEditing"]=!1,e["PasswordEditing"]=!1})),e[`${l}Editing`]=!0,e["__editing"]=!0},d=(e,l)=>{e[`${l}Editing`]=!1,e["__editing"]=!1,c()},u=e=>{t.list.splice(e,1),c()},i=e=>{t.list.filter((e=>""==e.Id||""==e.Name)).length>0||(t.list.splice(e+1,0,{Name:"",Id:"",Password:""}),c())},c=()=>{(0,g.zp)(t.list).then((()=>{k.nk.success("已操作,请在右下角【信标服务器】重连")})).catch((e=>{console.log(e),k.nk.error("操作失败")}))};return{state:t,handleCellClick:n,handleEditBlur:d,handleDel:u,handleAdd:i}}};const q=(0,C.A)(j,[["render",Q]]);var H=q;const J={class:"t-c"};function O(e,l,t,n,o,r){const s=(0,a.g2)("el-checkbox"),u=(0,a.g2)("el-col"),i=(0,a.g2)("el-row"),c=(0,a.g2)("el-checkbox-group"),h=(0,a.g2)("el-button"),m=(0,a.g2)("el-card");return(0,a.uX)(),(0,a.CE)("div",{style:(0,d.Tr)({height:`${n.state.height}px`})},[(0,a.bF)(m,{shadow:"never"},{header:(0,a.k6)((()=>[(0,a.eW)("选择你需要同步的项,将这些配置同步到本组所有客户端")])),footer:(0,a.k6)((()=>[(0,a.Lk)("div",J,[(0,a.bF)(h,{type:"success",onClick:n.handleSync},{default:(0,a.k6)((()=>[(0,a.eW)("确定同步")])),_:1},8,["onClick"])])])),default:(0,a.k6)((()=>[(0,a.Lk)("div",null,[(0,a.bF)(s,{modelValue:n.state.checkAll,"onUpdate:modelValue":l[0]||(l[0]=e=>n.state.checkAll=e),indeterminate:n.state.isIndeterminate,onChange:n.handleCheckAllChange},{default:(0,a.k6)((()=>[(0,a.eW)("全选")])),_:1},8,["modelValue","indeterminate","onChange"]),(0,a.bF)(c,{modelValue:n.state.checkeds,"onUpdate:modelValue":l[1]||(l[1]=e=>n.state.checkeds=e),onChange:n.handleCheckedsChange},{default:(0,a.k6)((()=>[(0,a.bF)(i,null,{default:(0,a.k6)((()=>[((0,a.uX)(!0),(0,a.CE)(a.FK,null,(0,a.pI)(n.state.names,(e=>((0,a.uX)(),(0,a.Wv)(u,{span:8},{default:(0,a.k6)((()=>[((0,a.uX)(),(0,a.Wv)(s,{key:e.name,label:e.label,value:e.name},{default:(0,a.k6)((()=>[(0,a.eW)((0,d.v_)(e.label),1)])),_:2},1032,["label","value"]))])),_:2},1024)))),256))])),_:1})])),_:1},8,["modelValue","onChange"])])])),_:1})],4)}var Z=t(8835),ee={label:"同步配置",name:"async",order:7,setup(e){const l=(0,s.B)(),t=(0,r.Kh)({names:[],checkAll:!1,isIndeterminate:!1,checkeds:[],height:(0,a.EW)((()=>l.value.height-90))}),n=e=>{t.checkeds=e?t.names.map((e=>e.name)):[],t.isIndeterminate=!1},o=e=>{const l=e.length;t.checkAll=l===t.names.length,t.isIndeterminate=l>0&&l{(0,Z.Iv)().then((e=>{t.names=e.map((e=>({name:e,label:d[e]})))}))}));const u=()=>{0!=t.checkeds.length?(0,Z.E1)(t.checkeds).then((e=>{k.nk.success("已操作")})):k.nk.error("至少选择一个")};return{state:t,handleCheckAllChange:n,handleCheckedsChange:o,handleSync:u}}};const le=(0,C.A)(ee,[["render",O]]);var te=le,ae={components:{SignInServers:$,Groups:H,Async:te},setup(e){const l=(0,s.B)(),t=(0,a.EW)((()=>l.value.hasAccess("Config"))),n=(0,a.EW)((()=>l.value.hasAccess("Sync"))),o=(0,r.Kh)({tab:"signin"});return{state:o,hasConfig:t,hasSync:n}}};const ne=(0,C.A)(ae,[["render",o],["__scopeId","data-v-11926c68"]]);var oe=ne}}]); \ No newline at end of file diff --git a/linker.tray.win/web/js/966.bd0145e0.js b/linker.tray.win/web/js/966.bd0145e0.js new file mode 100644 index 00000000..1d03d9fe --- /dev/null +++ b/linker.tray.win/web/js/966.bd0145e0.js @@ -0,0 +1 @@ +"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[966],{673:function(e,a,t){t.r(a),t.d(a,{default:function(){return M}});var n=t(6768);const l={class:"net-wrap app-wrap"},s={class:"inner absolute flex flex-column flex-nowrap"},r={class:"head"},i={class:"body flex-1 relative"},u={class:"status"};function c(e,a,t,c,d,o){const g=(0,n.g2)("Head"),p=(0,n.g2)("List"),v=(0,n.g2)("Status");return(0,n.uX)(),(0,n.CE)("div",l,[(0,n.Lk)("div",s,[(0,n.Lk)("div",r,[(0,n.bF)(g)]),(0,n.Lk)("div",i,[(0,n.bF)(p)]),(0,n.Lk)("div",u,[(0,n.bF)(v,{config:!1})])])])}t(4114);const d=e=>((0,n.Qi)("data-v-3bb95ac8"),e=e(),(0,n.jt)(),e),o={class:"head-wrap"},g={class:"tools flex"},p=d((()=>(0,n.Lk)("span",{class:"label"},"服务器 ",-1))),v=d((()=>(0,n.Lk)("span",{class:"flex-1"},null,-1))),h={style:{"margin-left":"1rem"}};function f(e,a,t,l,s,r){const i=(0,n.g2)("el-option"),u=(0,n.g2)("el-select"),c=(0,n.g2)("Refresh"),d=(0,n.g2)("el-icon"),f=(0,n.g2)("el-button"),k=(0,n.g2)("Background");return(0,n.uX)(),(0,n.CE)("div",o,[(0,n.Lk)("div",g,[p,(0,n.bF)(u,{modelValue:l.state.server,"onUpdate:modelValue":a[0]||(a[0]=e=>l.state.server=e),placeholder:"服务器",style:{width:"16rem"},size:"small"},{default:(0,n.k6)((()=>[((0,n.uX)(!0),(0,n.CE)(n.FK,null,(0,n.pI)(l.state.servers,(e=>((0,n.uX)(),(0,n.Wv)(i,{key:e.Host,label:e.Name,value:e.Host},null,8,["label","value"])))),128))])),_:1},8,["modelValue"]),v,(0,n.bF)(f,{size:"small",onClick:l.handleRefresh},{default:(0,n.k6)((()=>[(0,n.eW)(" 刷新(F5)"),(0,n.bF)(d,null,{default:(0,n.k6)((()=>[(0,n.bF)(c)])),_:1})])),_:1},8,["onClick"]),(0,n.Lk)("div",h,[(0,n.bF)(k,{name:"net"})])])])}var k=t(3830),b=t(144),m=t(7477),C=t(5096),L={components:{Edit:m.ffu,Refresh:m.C42,Background:C.A},setup(){const e=(0,k.B)(),a=(0,b.Kh)({server:"linker.snltty.com:1802",servers:[]});(0,n.wB)((()=>e.value.config.Client.Servers),(()=>{a.servers=(e.value.config.Client.Servers||[]).slice(0,1),a.server=e.value.config.Client.Server.Host}));const t=()=>{window.location.reload()};return{state:a,handleRefresh:t}}},w=t(1241);const S=(0,w.A)(L,[["render",f],["__scopeId","data-v-3bb95ac8"]]);var _=S;const F=e=>((0,n.Qi)("data-v-b6ab4f06"),e=e(),(0,n.jt)(),e),x={class:"net-list-wrap flex flex-column absolute"},z={class:"flex-1 scrollbar"},E={class:"flex"},I=F((()=>(0,n.Lk)("div",{class:"flex-1"},null,-1))),T={class:"tuntap"},A={class:"page t-c"},B={class:"page-wrap t-c"};function P(e,a,t,l,s,r){const i=(0,n.g2)("DeviceName"),u=(0,n.g2)("UpdaterBtn"),c=(0,n.g2)("TuntapShow"),d=(0,n.g2)("el-pagination");return(0,n.uX)(),(0,n.CE)("div",x,[(0,n.Lk)("div",z,[(0,n.Lk)("ul",null,[((0,n.uX)(!0),(0,n.CE)(n.FK,null,(0,n.pI)(l.devices.page.List,((e,a)=>((0,n.uX)(),(0,n.CE)("li",{key:a},[(0,n.Lk)("dl",null,[(0,n.Lk)("dt",E,[(0,n.Lk)("div",null,[(0,n.bF)(i,{item:e},null,8,["item"])]),I,(0,n.Lk)("div",null,[(0,n.bF)(u,{config:!1,item:e},null,8,["item"])])]),(0,n.Lk)("dd",T,[l.tuntap.list[e.MachineId]?((0,n.uX)(),(0,n.Wv)(c,{key:0,item:e},null,8,["item"])):(0,n.Q3)("",!0)])])])))),128))])]),(0,n.Lk)("div",A,[(0,n.Lk)("div",B,[(0,n.bF)(d,{size:"small",background:"",layout:"prev,pager, next","pager-count":5,total:l.devices.page.Count,"page-size":l.devices.page.Request.Size,"current-page":l.devices.page.Request.Page,onCurrentChange:l.handlePageChange,onSizeChange:l.handlePageSizeChange,"page-sizes":[10,20,50,100,255]},null,8,["total","page-size","current-page","onCurrentChange","onSizeChange"])])])])}var y=t(8104),X=t(7985),R=t(9383),D=t(167),U=t(3347),H=t(2950),N={components:{StarFilled:m.BQ2,UpdaterBtn:D.A,DeviceName:U.A,TuntapShow:H.A},setup(e){(0,k.B)();const a=(0,b.Kh)({}),{devices:t,machineId:l,_getSignList:s,_getSignList1:r,handleDeviceEdit:i,handlePageChange:u,handlePageSizeChange:c,handleDel:d,clearDevicesTimeout:o}=(0,X.r)(),{tuntap:g,_getTuntapInfo:p,handleTuntapRefresh:v,clearTuntapTimeout:h,handleTuntapEdit:f,sortTuntapIP:m}=(0,y.O)(),{_getUpdater:C,_subscribeUpdater:L,clearUpdaterTimeout:w}=(0,R.d)();return(0,n.sV)((()=>{u(),v(),s(),r(),p(),C(),L()})),(0,n.hi)((()=>{o(),h(),w()})),{state:a,devices:t,machineId:l,handlePageChange:u,handlePageSizeChange:c,tuntap:g}}};const V=(0,w.A)(N,[["render",P],["__scopeId","data-v-b6ab4f06"]]);var K=V,Q=t(3269),W=t(1387),j={components:{Head:_,List:K,Status:Q.A},setup(){document.addEventListener("contextmenu",(function(e){e.preventDefault()}));const e=(0,k.B)(),a=(0,W.rd)();return(0,n.sV)((()=>{0==e.value.hasAccess("NetManager")&&a.push({name:"NoPermission"})})),{}}};const q=(0,w.A)(j,[["render",c],["__scopeId","data-v-6a3f3b43"]]);var M=q}}]); \ No newline at end of file diff --git a/linker.tray.win/web/js/app.1a3b60a6.js b/linker.tray.win/web/js/app.1a3b60a6.js new file mode 100644 index 00000000..5006627b --- /dev/null +++ b/linker.tray.win/web/js/app.1a3b60a6.js @@ -0,0 +1 @@ +(function(){"use strict";var e={8835:function(e,n,t){t.d(n,{E1:function(){return s},Iv:function(){return u},P$:function(){return c},ai:function(){return i},zj:function(){return r}});var o=t(4);const r=()=>(0,o.zG)("configclient/get"),i=e=>(0,o.zG)("configclient/install",e),c=e=>(0,o.zG)("configclient/export",e),u=()=>(0,o.zG)("configclient/SyncNames"),s=e=>(0,o.zG)("configclient/Sync",e)},4:function(e,n,t){t.d(n,{a1:function(){return v},e3:function(){return b},jH:function(){return C},zG:function(){return y}});t(4114),t(6573),t(8100),t(7936);var o=t(1219);let r=0,i=null,c="",u=1,s="";const a={},l={connected:!1,connecting:!1},d=()=>{const e=Date.now();for(let n in a){const t=a[n];e-t.time>t.timeout&&(t.reject("超时~"),delete a[n])}setTimeout(d,1e3)};d();const f={subs:{},add:function(e,n){"function"==typeof n&&(this.subs[e]||(this.subs[e]=[]),this.subs[e].push(n))},remove(e,n){let t=this.subs[e]||[];for(let o=t.length-1;o>=0;o--)t[o]==n&&t.splice(o,1)},push(e,n){let t=this.subs[e]||[];for(let o=t.length-1;o>=0;o--)t[o](n)}},p=()=>{l.connected=!0,l.connecting=!1,f.push(w,l.connected)},h=e=>{l.connected=!1,l.connecting=!1,f.push(w,l.connected),setTimeout((()=>{v()}),1e3)},g=e=>{if("string"!=typeof e.data)return void e.data.arrayBuffer().then((n=>{const t=new DataView(n).getInt8(),o=new FileReader;o.readAsText(e.data.slice(4,4+t),"utf8"),o.onload=()=>{let r=JSON.parse(o.result);r.Content={Name:r.Content,Img:e.data.slice(4+t,e.data.length),ArrayBuffer:n},m(r)}}));let n=JSON.parse(e.data);m(n)},m=e=>{let n=a[e.RequestId];n?(0==e.Code?n.resolve(e.Content):1==e.Code?n.reject(e.Content):255==e.Code?(n.reject(e.Content),n.errHandle||o.nk.error(`${n.path}:${e.Content}`)):f.push(e.Path,e.Content),delete a[e.RequestId]):f.push(e.Path,e.Content)},v=(e=c,n=s)=>{if(s=n,c=e,l.connecting||l.connected)return;null!=i&&i.close(),l.connecting=!0;const t=n||"snltty";i=new WebSocket(c,[t]),i.iddd=++u,i.onopen=p,i.onclose=h,i.onmessage=g},b=()=>{i&&i.close()},y=(e,n={},t=!1,o=15e3)=>new Promise(((c,u)=>{let s=++r;try{a[s]={resolve:c,reject:u,errHandle:t,path:e,time:Date.now(),timeout:o};let r=JSON.stringify({Path:e,RequestId:s,Content:"string"==typeof n?n:JSON.stringify(n)});l.connected&&1==i.readyState?i.send(r):u("网络错误~")}catch(d){console.log(d),u("网络错误~"),delete a[s]}})),w=Symbol(),C=e=>{f.add(w,e)}},9299:function(e,n,t){t.d(n,{BS:function(){return a},SZ:function(){return c},Se:function(){return l},VN:function(){return u},gC:function(){return d},jU:function(){return i},nD:function(){return s},rd:function(){return r},zp:function(){return f}});var o=t(4);const r=e=>(0,o.zG)("signInclient/set",e),i=e=>(0,o.zG)("signInclient/setservers",e),c=()=>(0,o.zG)("signInclient/info"),u=e=>(0,o.zG)("signInclient/setorder",e),s=e=>(0,o.zG)("signInclient/List",e),a=e=>(0,o.zG)("signInclient/ids",e),l=e=>(0,o.zG)("signInclient/del",e),d=e=>(0,o.zG)("signInclient/setname",e),f=e=>(0,o.zG)("signInclient/SetGroups",e)},3616:function(e,n,t){var o=t(5130),r=t(6768);function i(e,n,t,o,i,c){const u=(0,r.g2)("router-view"),s=(0,r.g2)("Api");return(0,r.uX)(),(0,r.CE)("div",null,[o.configed?((0,r.uX)(),(0,r.Wv)(u,{key:0})):(0,r.Q3)("",!0),(0,r.bF)(s)])}var c=t(3830);const u={class:"port-wrap t-c"},s={class:"pdt-10"};function a(e,n,t,o,i,c){const a=(0,r.g2)("el-input"),l=(0,r.g2)("el-button"),d=(0,r.g2)("el-dialog");return(0,r.uX)(),(0,r.Wv)(d,{class:"options-center",title:"管理接口","destroy-on-close":"",modelValue:o.showPort,"onUpdate:modelValue":n[2]||(n[2]=e=>o.showPort=e),center:"","show-close":!1,"close-on-click-modal":!1,"align-center":"",width:"200"},{footer:(0,r.k6)((()=>[(0,r.bF)(l,{type:"success",onClick:o.handleConnect1,plain:""},{default:(0,r.k6)((()=>[(0,r.eW)("确 定")])),_:1},8,["onClick"])])),default:(0,r.k6)((()=>[(0,r.Lk)("div",u,[(0,r.Lk)("div",null,[(0,r.eW)(" 接口 : "),(0,r.bF)(a,{modelValue:o.state.api,"onUpdate:modelValue":n[0]||(n[0]=e=>o.state.api=e),style:{width:"70%"}},null,8,["modelValue"])]),(0,r.Lk)("div",s,[(0,r.eW)(" 秘钥 : "),(0,r.bF)(a,{type:"password",modelValue:o.state.psd,"onUpdate:modelValue":n[1]||(n[1]=e=>o.state.psd=e),style:{width:"70%"}},null,8,["modelValue"])])])])),_:1},8,["modelValue"])}var l=t(1387),d=t(144),f=t(4),p=t(9299),h=t(8835),g=t(7477),m={components:{Tools:g.S0q},props:["config"],setup(e){const n=(0,c.B)(),t=(0,l.rd)(),o=(0,l.lq)(),i={api:`${window.location.hostname}:1803`,psd:"snltty"},u=JSON.parse(localStorage.getItem("api-cache")||JSON.stringify(i)),s=(0,d.Kh)({api:u.api,psd:u.psd,showPort:!1}),a=(0,r.EW)((()=>0==n.value.api.connected&&s.showPort)),g=()=>{u.api=s.api,u.psd=s.psd,localStorage.setItem("api-cache",JSON.stringify(u)),(0,f.e3)();const e=`ws${"https:"===window.location.protocol?"s":""}://${s.api}`;(0,f.a1)(e,s.psd)},m=()=>{g(),window.location.reload()},v=()=>{(0,h.zj)().then((e=>{n.value.config.Common=e.Common,n.value.config.Client=e.Client,n.value.config.Server=e.Server,n.value.config.Running=e.Running,n.value.config.configed=!0,setTimeout((()=>{v()}),1e3)})).catch((e=>{setTimeout((()=>{v()}),1e3)}))},b=()=>{(0,p.SZ)().then((e=>{n.value.signin.Connected=e.Connected,n.value.signin.Connecting=e.Connecting,n.value.signin.Version=e.Version,setTimeout((()=>{b()}),1e3)})).catch((e=>{setTimeout((()=>{b()}),1e3)}))};return(0,r.sV)((()=>{setTimeout((()=>{s.showPort=!0}),500),(0,f.jH)((e=>{e&&(v(),b())})),t.isReady().then((()=>{s.api=o.query.api?`${window.location.hostname}:${o.query.api}`:s.api,s.psd=o.query.psd||s.psd,g()}))})),{state:s,showPort:a,handleConnect1:m}}},v=t(1241);const b=(0,v.A)(m,[["render",a],["__scopeId","data-v-08751c59"]]);var y=b,w={components:{Api:y},setup(e){const n=(0,c.v)(),t=(0,r.EW)((()=>n.value.config.configed));return{configed:t}}};const C=(0,v.A)(w,[["render",i]]);var S=C;const k=[{path:"/",name:"Full",component:()=>Promise.all([t.e(39),t.e(642),t.e(734)]).then(t.bind(t,8933)),redirect:"/full/index.html",children:[{path:"/full/index.html",name:"FullIndex",component:()=>Promise.all([t.e(39),t.e(848),t.e(855)]).then(t.bind(t,8163))},{path:"/full/servers.html",name:"FullServers",component:()=>t.e(857).then(t.bind(t,5857))},{path:"/full/transport.html",name:"FullTransport",component:()=>t.e(225).then(t.bind(t,3225))},{path:"/full/action.html",name:"FullAction",component:()=>t.e(402).then(t.bind(t,402))},{path:"/full/logger.html",name:"FullLogger",component:()=>t.e(352).then(t.bind(t,352))}]},{path:"/net/index.html",name:"Network",component:()=>Promise.all([t.e(39),t.e(642),t.e(848),t.e(966)]).then(t.bind(t,673))},{path:"/no-permission.html",name:"NoPermission",component:()=>t.e(31).then(t.bind(t,4083))}],P=(0,l.aE)({history:(0,l.Bt)(),routes:k});var A=P,B=t(6161);t(4188),t(2355),t(1862);const I=(0,o.Ef)(S);I.use(B.A,{size:"default"}).use(A).mount("#app")},3830:function(e,n,t){t.d(n,{B:function(){return s},v:function(){return u}});var o=t(4),r=t(144),i=t(6768);const c=Symbol(),u=()=>{const e=(0,r.KR)({api:{connected:!1},height:0,config:{Common:{},Client:{Servers:[],Accesss:{}},Server:{},Running:{Relay:{Servers:[]},Tuntap:{IP:"",PrefixLength:24},Client:{Servers:[]},AutoSyncs:{}},configed:!1},signin:{Connected:!1,Connecting:!1,Version:"v1.0.0.0"},bufferSize:["1KB","2KB","4KB","8KB","16KB","32KB","64KB","128KB","256KB","512KB","1024KB"],updater:{},self:{},hasAccess(e){if(void 0==this.config.Client.Accesss[e])return!1;const n=this.config.Client.Accesss[e].Value||-1,t=this.config.Client.Access||-1;return t>=0&&(0==t||+(BigInt(t)&BigInt(n)).toString()==n)}});return(0,o.jH)((n=>{e.value.api.connected=n})),(0,i.Gt)(c,e),e},s=()=>(0,i.WQ)(c)}},n={};function t(o){var r=n[o];if(void 0!==r)return r.exports;var i=n[o]={exports:{}};return e[o].call(i.exports,i,i.exports,t),i.exports}t.m=e,function(){var e=[];t.O=function(n,o,r,i){if(!o){var c=1/0;for(l=0;l=i)&&Object.keys(t.O).every((function(e){return t.O[e](o[s])}))?o.splice(s--,1):(u=!1,i0&&e[l-1][2]>i;l--)e[l]=e[l-1];e[l]=[o,r,i]}}(),function(){t.n=function(e){var n=e&&e.__esModule?function(){return e["default"]}:function(){return e};return t.d(n,{a:n}),n}}(),function(){t.d=function(e,n){for(var o in n)t.o(n,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:n[o]})}}(),function(){t.f={},t.e=function(e){return Promise.all(Object.keys(t.f).reduce((function(n,o){return t.f[o](e,n),n}),[]))}}(),function(){t.u=function(e){return"js/"+e+"."+{31:"01e549ae",39:"695c2adf",225:"8a3da4f8",352:"678c694a",402:"024283d6",642:"8d1a79df",734:"bccc9e7e",848:"33bffbdc",855:"46fe678b",857:"f520b520",966:"bd0145e0"}[e]+".js"}}(),function(){t.miniCssF=function(e){return"css/"+e+"."+{31:"64181b05",225:"4f041b3c",352:"56e27aad",402:"bc681d99",734:"19603134",855:"f4293598",857:"4e351ac8",966:"149bc7b3"}[e]+".css"}}(),function(){t.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)}}(),function(){var e={},n="linker.web:";t.l=function(o,r,i,c){if(e[o])e[o].push(r);else{var u,s;if(void 0!==i)for(var a=document.getElementsByTagName("script"),l=0;l(0,o.zG)("configclient/get"),i=e=>(0,o.zG)("configclient/install",e),c=e=>(0,o.zG)("configclient/export",e),u=()=>(0,o.zG)("configclient/SyncNames"),a=e=>(0,o.zG)("configclient/Sync",e)},4:function(e,n,t){t.d(n,{a1:function(){return v},e3:function(){return b},jH:function(){return C},zG:function(){return y}});t(4114),t(6573),t(8100),t(7936);var o=t(1219);let r=0,i=null,c="",u=1,a="";const s={},l={connected:!1,connecting:!1},d=()=>{const e=Date.now();for(let n in s){const t=s[n];e-t.time>t.timeout&&(t.reject("超时~"),delete s[n])}setTimeout(d,1e3)};d();const f={subs:{},add:function(e,n){"function"==typeof n&&(this.subs[e]||(this.subs[e]=[]),this.subs[e].push(n))},remove(e,n){let t=this.subs[e]||[];for(let o=t.length-1;o>=0;o--)t[o]==n&&t.splice(o,1)},push(e,n){let t=this.subs[e]||[];for(let o=t.length-1;o>=0;o--)t[o](n)}},p=()=>{l.connected=!0,l.connecting=!1,f.push(w,l.connected)},h=e=>{l.connected=!1,l.connecting=!1,f.push(w,l.connected),setTimeout((()=>{v()}),1e3)},g=e=>{if("string"!=typeof e.data)return void e.data.arrayBuffer().then((n=>{const t=new DataView(n).getInt8(),o=new FileReader;o.readAsText(e.data.slice(4,4+t),"utf8"),o.onload=()=>{let r=JSON.parse(o.result);r.Content={Name:r.Content,Img:e.data.slice(4+t,e.data.length),ArrayBuffer:n},m(r)}}));let n=JSON.parse(e.data);m(n)},m=e=>{let n=s[e.RequestId];n?(0==e.Code?n.resolve(e.Content):1==e.Code?n.reject(e.Content):255==e.Code?(n.reject(e.Content),n.errHandle||o.nk.error(`${n.path}:${e.Content}`)):f.push(e.Path,e.Content),delete s[e.RequestId]):f.push(e.Path,e.Content)},v=(e=c,n=a)=>{if(a=n,c=e,l.connecting||l.connected)return;null!=i&&i.close(),l.connecting=!0;const t=n||"snltty";i=new WebSocket(c,[t]),i.iddd=++u,i.onopen=p,i.onclose=h,i.onmessage=g},b=()=>{i&&i.close()},y=(e,n={},t=!1,o=15e3)=>new Promise(((c,u)=>{let a=++r;try{s[a]={resolve:c,reject:u,errHandle:t,path:e,time:Date.now(),timeout:o};let r=JSON.stringify({Path:e,RequestId:a,Content:"string"==typeof n?n:JSON.stringify(n)});l.connected&&1==i.readyState?i.send(r):u("网络错误~")}catch(d){console.log(d),u("网络错误~"),delete s[a]}})),w=Symbol(),C=e=>{f.add(w,e)}},9299:function(e,n,t){t.d(n,{BS:function(){return s},SZ:function(){return c},Se:function(){return l},VN:function(){return u},gC:function(){return d},jU:function(){return i},nD:function(){return a},rd:function(){return r},zp:function(){return f}});var o=t(4);const r=e=>(0,o.zG)("signInclient/set",e),i=e=>(0,o.zG)("signInclient/setservers",e),c=()=>(0,o.zG)("signInclient/info"),u=e=>(0,o.zG)("signInclient/setorder",e),a=e=>(0,o.zG)("signInclient/List",e),s=e=>(0,o.zG)("signInclient/ids",e),l=e=>(0,o.zG)("signInclient/del",e),d=e=>(0,o.zG)("signInclient/setname",e),f=e=>(0,o.zG)("signInclient/SetGroups",e)},3616:function(e,n,t){var o=t(5130),r=t(6768);function i(e,n,t,o,i,c){const u=(0,r.g2)("router-view"),a=(0,r.g2)("Api");return(0,r.uX)(),(0,r.CE)("div",null,[o.configed?((0,r.uX)(),(0,r.Wv)(u,{key:0})):(0,r.Q3)("",!0),(0,r.bF)(a)])}var c=t(3830);const u={class:"port-wrap t-c"},a={class:"pdt-10"};function s(e,n,t,o,i,c){const s=(0,r.g2)("el-input"),l=(0,r.g2)("el-button"),d=(0,r.g2)("el-dialog");return(0,r.uX)(),(0,r.Wv)(d,{class:"options-center",title:"管理接口","destroy-on-close":"",modelValue:o.showPort,"onUpdate:modelValue":n[2]||(n[2]=e=>o.showPort=e),center:"","show-close":!1,"close-on-click-modal":!1,"align-center":"",width:"200"},{footer:(0,r.k6)((()=>[(0,r.bF)(l,{type:"success",onClick:o.handleConnect1,plain:""},{default:(0,r.k6)((()=>[(0,r.eW)("确 定")])),_:1},8,["onClick"])])),default:(0,r.k6)((()=>[(0,r.Lk)("div",u,[(0,r.Lk)("div",null,[(0,r.eW)(" 接口 : "),(0,r.bF)(s,{modelValue:o.state.api,"onUpdate:modelValue":n[0]||(n[0]=e=>o.state.api=e),style:{width:"70%"}},null,8,["modelValue"])]),(0,r.Lk)("div",a,[(0,r.eW)(" 秘钥 : "),(0,r.bF)(s,{type:"password",modelValue:o.state.psd,"onUpdate:modelValue":n[1]||(n[1]=e=>o.state.psd=e),style:{width:"70%"}},null,8,["modelValue"])])])])),_:1},8,["modelValue"])}var l=t(1387),d=t(144),f=t(4),p=t(9299),h=t(8835),g=t(7477),m={components:{Tools:g.S0q},props:["config"],setup(e){const n=(0,c.B)(),t=(0,l.rd)(),o=(0,l.lq)(),i={api:`${window.location.hostname}:1803`,psd:"snltty"},u=JSON.parse(localStorage.getItem("api-cache")||JSON.stringify(i)),a=(0,d.Kh)({api:u.api,psd:u.psd,showPort:!1}),s=(0,r.EW)((()=>0==n.value.api.connected&&a.showPort)),g=()=>{u.api=a.api,u.psd=a.psd,localStorage.setItem("api-cache",JSON.stringify(u)),(0,f.e3)();const e=`ws${"https:"===window.location.protocol?"s":""}://${a.api}`;(0,f.a1)(e,a.psd)},m=()=>{g(),window.location.reload()},v=()=>{(0,h.zj)().then((e=>{n.value.config.Common=e.Common,n.value.config.Client=e.Client,n.value.config.Server=e.Server,n.value.config.Running=e.Running,n.value.config.configed=!0,setTimeout((()=>{v()}),1e3)})).catch((e=>{setTimeout((()=>{v()}),1e3)}))},b=()=>{(0,p.SZ)().then((e=>{n.value.signin.Connected=e.Connected,n.value.signin.Connecting=e.Connecting,n.value.signin.Version=e.Version,setTimeout((()=>{b()}),1e3)})).catch((e=>{setTimeout((()=>{b()}),1e3)}))};return(0,r.sV)((()=>{setTimeout((()=>{a.showPort=!0}),500),(0,f.jH)((e=>{e&&(v(),b())})),t.isReady().then((()=>{a.api=o.query.api?`${window.location.hostname}:${o.query.api}`:a.api,a.psd=o.query.psd||a.psd,g()}))})),{state:a,showPort:s,handleConnect1:m}}},v=t(1241);const b=(0,v.A)(m,[["render",s],["__scopeId","data-v-08751c59"]]);var y=b,w={components:{Api:y},setup(e){const n=(0,c.v)(),t=(0,r.EW)((()=>n.value.config.configed));return{configed:t}}};const C=(0,v.A)(w,[["render",i]]);var S=C;const k=[{path:"/",name:"Full",component:()=>Promise.all([t.e(39),t.e(183),t.e(827)]).then(t.bind(t,3112)),redirect:"/full/index.html",children:[{path:"/full/index.html",name:"FullIndex",component:()=>Promise.all([t.e(39),t.e(110),t.e(509)]).then(t.bind(t,2712))},{path:"/full/servers.html",name:"FullServers",component:()=>t.e(256).then(t.bind(t,256))},{path:"/full/transport.html",name:"FullTransport",component:()=>t.e(225).then(t.bind(t,3225))},{path:"/full/action.html",name:"FullAction",component:()=>t.e(424).then(t.bind(t,6424))},{path:"/full/logger.html",name:"FullLogger",component:()=>t.e(352).then(t.bind(t,352))}]},{path:"/net/index.html",name:"Network",component:()=>Promise.all([t.e(39),t.e(183),t.e(110),t.e(76)]).then(t.bind(t,9256))},{path:"/no-permission.html",name:"NoPermission",component:()=>t.e(31).then(t.bind(t,4083))}],P=(0,l.aE)({history:(0,l.Bt)(),routes:k});var A=P,B=t(6161);t(4188),t(2355),t(1862);const I=(0,o.Ef)(S);I.use(B.A,{size:"default"}).use(A).mount("#app")},3830:function(e,n,t){t.d(n,{B:function(){return a},v:function(){return u}});var o=t(4),r=t(144),i=t(6768);const c=Symbol(),u=()=>{const e=(0,r.KR)({api:{connected:!1},height:0,config:{Common:{},Client:{Servers:[],Accesss:{}},Server:{},Running:{Relay:{Servers:[]},Tuntap:{IP:"",PrefixLength:24},Client:{Servers:[]},AutoSyncs:{}},configed:!1},signin:{Connected:!1,Connecting:!1,Version:"v1.0.0.0"},bufferSize:["1KB","2KB","4KB","8KB","16KB","32KB","64KB","128KB","256KB","512KB","1024KB"],updater:{},self:{},hasAccess(e){if(void 0==this.config.Client.Accesss[e])return!1;const n=this.config.Client.Accesss[e].Value||-1,t=this.config.Client.Access||-1;return t>=0&&(0==t||+(BigInt(t)&BigInt(n)).toString()==n)}});return(0,o.jH)((n=>{e.value.api.connected=n})),(0,i.Gt)(c,e),e},a=()=>(0,i.WQ)(c)}},n={};function t(o){var r=n[o];if(void 0!==r)return r.exports;var i=n[o]={exports:{}};return e[o].call(i.exports,i,i.exports,t),i.exports}t.m=e,function(){var e=[];t.O=function(n,o,r,i){if(!o){var c=1/0;for(l=0;l=i)&&Object.keys(t.O).every((function(e){return t.O[e](o[a])}))?o.splice(a--,1):(u=!1,i0&&e[l-1][2]>i;l--)e[l]=e[l-1];e[l]=[o,r,i]}}(),function(){t.n=function(e){var n=e&&e.__esModule?function(){return e["default"]}:function(){return e};return t.d(n,{a:n}),n}}(),function(){t.d=function(e,n){for(var o in n)t.o(n,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:n[o]})}}(),function(){t.f={},t.e=function(e){return Promise.all(Object.keys(t.f).reduce((function(n,o){return t.f[o](e,n),n}),[]))}}(),function(){t.u=function(e){return"js/"+e+"."+{31:"01e549ae",39:"695c2adf",76:"61170c94",110:"0106ebd8",183:"9a80af0b",225:"8a3da4f8",256:"8161f834",352:"678c694a",424:"f2a1d18e",509:"b1ccc755",827:"ca8f5e05"}[e]+".js"}}(),function(){t.miniCssF=function(e){return"css/"+e+"."+{31:"64181b05",76:"a8147928",225:"4f041b3c",256:"4e351ac8",352:"56e27aad",424:"a59dc963",509:"8ac32231",827:"8be8ee26"}[e]+".css"}}(),function(){t.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)}}(),function(){var e={},n="linker.web:";t.l=function(o,r,i,c){if(e[o])e[o].push(r);else{var u,a;if(void 0!==i)for(var s=document.getElementsByTagName("script"),l=0;l /// public bool Write(ReadOnlyMemory buffer); + + /// + /// 检查网卡是否可用 + /// + /// + public Task CheckAvailable(); } /// diff --git a/linker.tun/LinkerLinuxTunDevice.cs b/linker.tun/LinkerLinuxTunDevice.cs index 837778d0..f79f4cb0 100644 --- a/linker.tun/LinkerLinuxTunDevice.cs +++ b/linker.tun/LinkerLinuxTunDevice.cs @@ -303,6 +303,12 @@ namespace linker.tun public void Clear() { } + + public async Task CheckAvailable() + { + string output = CommandHelper.Linux(string.Empty, new string[] { $"ip linker show {Name}" }); + return await Task.FromResult(output.Contains("state UP")); + } } diff --git a/linker.tun/LinkerOsxTunDevice.cs b/linker.tun/LinkerOsxTunDevice.cs index 9af3a333..0e68db5d 100644 --- a/linker.tun/LinkerOsxTunDevice.cs +++ b/linker.tun/LinkerOsxTunDevice.cs @@ -179,5 +179,10 @@ namespace linker.tun { } + + public async Task CheckAvailable() + { + return await Task.FromResult(true); + } } } diff --git a/linker.tun/LinkerTunDeviceAdapter.cs b/linker.tun/LinkerTunDeviceAdapter.cs index 23cc5898..48e37b44 100644 --- a/linker.tun/LinkerTunDeviceAdapter.cs +++ b/linker.tun/LinkerTunDeviceAdapter.cs @@ -276,5 +276,11 @@ namespace linker.tun sum = ~sum; return ((ushort)sum); } + + + public async Task CheckAvailable() + { + return await linkerTunDevice?.CheckAvailable(); + } } } diff --git a/linker.tun/LinkerWinTunDevice.cs b/linker.tun/LinkerWinTunDevice.cs index f2d63bb9..3b3656cb 100644 --- a/linker.tun/LinkerWinTunDevice.cs +++ b/linker.tun/LinkerWinTunDevice.cs @@ -372,6 +372,48 @@ namespace linker.tun { } } + + public async Task CheckAvailable() + { + NetworkInterface networkInterface = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(c => c.Name == Name); + return networkInterface != null && networkInterface.OperationalStatus == OperationalStatus.Up && await InterfacePing(); + + async Task InterfacePing() + { + try + { + using Ping ping = new Ping(); + PingReply pingReply = await ping.SendPingAsync(address, 100); + return pingReply.Status == IPStatus.Success; + } + catch (Exception) + { + return false; + } + } + } + private void InterfaceOrder() + { + NetworkInterface linker = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(c => c.Name == Name); + NetworkInterface first = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(); + + if (linker != null && linker.Name != first.Name) + { + int metricv4 = 0; + int metricv6 = 0; + List commands = new List { + $"netsh interface ipv4 set interface \"{Name}\" metric={++metricv4}", + $"netsh interface ipv6 set interface \"{Name}\" metric={++metricv6}" + }; + commands.AddRange(NetworkInterface.GetAllNetworkInterfaces() + .Where(c => c.Name != Name) + .Select(c => $"netsh interface ipv4 set interface \"{c.Name}\" metric={++metricv4}")); + commands.AddRange(NetworkInterface.GetAllNetworkInterfaces() + .Where(c => c.Name != Name) + .Select(c => $"netsh interface ipv6 set interface \"{c.Name}\" metric={++metricv6}")); + CommandHelper.Windows(string.Empty, commands.ToArray()); + } + } } } diff --git a/linker.tunnel/TunnelTransfer.cs b/linker.tunnel/TunnelTransfer.cs index 36570a31..c436aa2b 100644 --- a/linker.tunnel/TunnelTransfer.cs +++ b/linker.tunnel/TunnelTransfer.cs @@ -112,25 +112,27 @@ namespace linker.tunnel } private void RefreshNetwork() { - TimerHelper.Async(async () => + TimerHelper.Async(() => { networkInfo.RouteLevel = NetworkHelper.GetRouteLevel(tunnelMessengerAdapter.ServerHost.ToString(), out List ips); networkInfo.LocalIps = NetworkHelper.GetIPV6().Concat(NetworkHelper.GetIPV4()).ToArray(); networkInfo.MachineId = tunnelMessengerAdapter.MachineId; - networkInfo.LocalIp = await GetLocalIP(tunnelMessengerAdapter.ServerHost); - if (tunnelMessengerAdapter.PortMapPrivate > 0) + GetLocalIP(tunnelMessengerAdapter.ServerHost).ContinueWith((result) => { - tunnelUpnpTransfer.SetMap(tunnelMessengerAdapter.PortMapPrivate, tunnelMessengerAdapter.PortMapPublic); - } - else - { - if (networkInfo.LocalIp.Equals(IPAddress.Any) == false) + if (tunnelMessengerAdapter.PortMapPrivate > 0) { - int ip = networkInfo.LocalIp.GetAddressBytes()[3]; - tunnelUpnpTransfer.SetMap(18180 + ip); + tunnelUpnpTransfer.SetMap(tunnelMessengerAdapter.PortMapPrivate, tunnelMessengerAdapter.PortMapPublic); } - } + else + { + if (result.Result.Equals(IPAddress.Any) == false) + { + int ip = result.Result.GetAddressBytes()[3]; + tunnelUpnpTransfer.SetMap(18180 + ip); + } + } + }); async Task GetLocalIP(IPEndPoint server) { @@ -211,12 +213,13 @@ namespace linker.tunnel foreach (TunnelTransportItemInfo transportItem in _transports.OrderBy(c => c.Order).Where(c => c.Disabled == false)) { ITunnelTransport transport = transports.FirstOrDefault(c => c.Name == transportItem.Name); - transport.SetSSL(tunnelMessengerAdapter.Certificate); + //找不到这个打洞协议,或者是不支持的协议 if (transport == null || (transport.ProtocolType & denyProtocols) == transport.ProtocolType) { continue; } + transport.SetSSL(tunnelMessengerAdapter.Certificate); foreach (var wanPortProtocol in tunnelWanPortTransfer.Protocols) { @@ -394,15 +397,13 @@ namespace linker.tunnel { LocalIps = networkInfo.LocalIps.Where(c => excludeips.Contains(c) == false).ToArray(), RouteLevel = networkInfo.RouteLevel + tunnelMessengerAdapter.RouteLevelPlus, - MachineId = tunnelMessengerAdapter.MachineId, - LocalIp = networkInfo.LocalIp, + MachineId = tunnelMessengerAdapter.MachineId }; if (string.IsNullOrWhiteSpace(network.MachineId)) { return null; } - Console.WriteLine(network.ToJson()); - TunnelWanPortEndPoint ip = await tunnelWanPortTransfer.GetWanPortAsync(tunnelMessengerAdapter.ServerHost, network.LocalIp, tunnelWanPortProtocolType).ConfigureAwait(false); + TunnelWanPortEndPoint ip = await tunnelWanPortTransfer.GetWanPortAsync(tunnelMessengerAdapter.ServerHost, tunnelWanPortProtocolType).ConfigureAwait(false); if (ip != null) { MapInfo portMapInfo = tunnelUpnpTransfer.PortMap ?? new MapInfo { PrivatePort = 0, PublicPort = 0 }; diff --git a/linker.tunnel/transport/ITunnelTransport.cs b/linker.tunnel/transport/ITunnelTransport.cs index 84e19247..4cba84a0 100644 --- a/linker.tunnel/transport/ITunnelTransport.cs +++ b/linker.tunnel/transport/ITunnelTransport.cs @@ -224,10 +224,6 @@ namespace linker.tunnel.transport /// public IPAddress[] LocalIps { get; set; } = Array.Empty(); /// - /// 本机网卡IP - /// - public IPAddress LocalIp { get; set; } = IPAddress.Any; - /// /// 本机与外网的距离,通过多少网关,可以通过NetworkHelper.GetRouteLevel 获取 /// public int RouteLevel { get; set; } diff --git a/linker.tunnel/transport/TransportTcpNutssb.cs b/linker.tunnel/transport/TransportTcpNutssb.cs index a815eb6b..4b0a9838 100644 --- a/linker.tunnel/transport/TransportTcpNutssb.cs +++ b/linker.tunnel/transport/TransportTcpNutssb.cs @@ -163,7 +163,6 @@ namespace linker.tunnel.transport try { - targetSocket.IPv6Only(ep.Address.AddressFamily, false); targetSocket.KeepAlive(); targetSocket.ReuseBind(new IPEndPoint(ep.AddressFamily == AddressFamily.InterNetwork ? IPAddress.Any : IPAddress.IPv6Any, tunnelTransportInfo.Local.Local.Port)); @@ -218,7 +217,6 @@ namespace linker.tunnel.transport Socket targetSocket = new(ip.AddressFamily, SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); try { - targetSocket.IPv6Only(ip.Address.AddressFamily, false); targetSocket.Ttl = ip.Address.AddressFamily == AddressFamily.InterNetworkV6 ? (short)2 : (short)(tunnelTransportInfo.Local.RouteLevel); targetSocket.ReuseBind(new IPEndPoint(ip.AddressFamily == AddressFamily.InterNetwork ? IPAddress.Any : IPAddress.IPv6Any, tunnelTransportInfo.Local.Local.Port)); _ = targetSocket.ConnectAsync(ip); @@ -324,8 +322,8 @@ namespace linker.tunnel.transport Socket socket = new Socket(localIP.AddressFamily, SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); //socket.ReceiveBufferSize = 5 * 1024 * 1024; - socket.IPv6Only(localIP.AddressFamily, false); - socket.ReuseBind(new IPEndPoint(localIP, local.Port)); + //socket.IPv6Only(localIP.AddressFamily, false); + socket.Bind(new IPEndPoint(localIP, local.Port)); socket.Listen(int.MaxValue); try diff --git a/linker.tunnel/transport/TransportTcpP2PNAT.cs b/linker.tunnel/transport/TransportTcpP2PNAT.cs index 7726e277..596cd4b5 100644 --- a/linker.tunnel/transport/TransportTcpP2PNAT.cs +++ b/linker.tunnel/transport/TransportTcpP2PNAT.cs @@ -119,18 +119,21 @@ namespace linker.tunnel.transport LoggerHelper.Instance.Warning($"{Name} connect to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName} {string.Join("\r\n", tunnelTransportInfo.RemoteEndPoints.Select(c => c.ToString()))}"); } - IPEndPoint ep = tunnelTransportInfo.Remote.Remote; + IPEndPoint ep = tunnelTransportInfo.Remote.LocalIps.Any(c=>c.AddressFamily == AddressFamily.InterNetworkV6) + && tunnelTransportInfo.Local.LocalIps.Any(c => c.AddressFamily == AddressFamily.InterNetworkV6) + ? new IPEndPoint(tunnelTransportInfo.Remote.LocalIps.FirstOrDefault(c=>c.AddressFamily == AddressFamily.InterNetworkV6), tunnelTransportInfo.Remote.Remote.Port) + : tunnelTransportInfo.Remote.Remote; Socket targetSocket = new(ep.AddressFamily, SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); try { targetSocket.KeepAlive(); - targetSocket.ReuseBind(new IPEndPoint(tunnelTransportInfo.Local.Local.Address, tunnelTransportInfo.Local.Local.Port)); + targetSocket.ReuseBind(new IPEndPoint(ep.AddressFamily == AddressFamily.InterNetwork ? tunnelTransportInfo.Local.Local.Address : IPAddress.IPv6Any, tunnelTransportInfo.Local.Local.Port)); if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) { LoggerHelper.Instance.Warning($"{Name} connect to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName} {ep}"); } - await targetSocket.ConnectAsync(ep).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false); + await targetSocket.ConnectAsync(ep).WaitAsync(TimeSpan.FromMilliseconds(2000)).ConfigureAwait(false); if (mode == TunnelMode.Client) { diff --git a/linker.tunnel/transport/TransportTcpPortMap.cs b/linker.tunnel/transport/TransportTcpPortMap.cs index 803e090b..f1f792ed 100644 --- a/linker.tunnel/transport/TransportTcpPortMap.cs +++ b/linker.tunnel/transport/TransportTcpPortMap.cs @@ -73,11 +73,11 @@ namespace linker.tunnel.transport socket?.SafeClose(); - IPAddress localIP = IPAddress.Any; + IPAddress localIP = IPAddress.IPv6Any; Socket _socket = new Socket(localIP.AddressFamily, SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); _socket.IPv6Only(localIP.AddressFamily, false); - _socket.ReuseBind(new IPEndPoint(localIP, localPort)); + _socket.Bind(new IPEndPoint(localIP, localPort)); _socket.Listen(int.MaxValue); socket = _socket; @@ -300,56 +300,66 @@ namespace linker.tunnel.transport LoggerHelper.Instance.Warning($"{Name} connect to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName} {string.Join("\r\n", tunnelTransportInfo.RemoteEndPoints.Select(c => c.ToString()))}"); } - IPEndPoint ep = new IPEndPoint(tunnelTransportInfo.Remote.Remote.Address, tunnelTransportInfo.Remote.PortMapWan); - Socket targetSocket = new(ep.AddressFamily, SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); - try + List eps = new List(); + if (tunnelTransportInfo.Remote.LocalIps.Any(c => c.AddressFamily == AddressFamily.InterNetworkV6) + && tunnelTransportInfo.Local.LocalIps.Any(c => c.AddressFamily == AddressFamily.InterNetworkV6)) { - targetSocket.KeepAlive(); - targetSocket.ReuseBind(new IPEndPoint(tunnelTransportInfo.Local.Local.Address, tunnelTransportInfo.Local.Local.Port)); - - if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) - { - LoggerHelper.Instance.Warning($"{Name} connect to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName} {ep}"); - } - await targetSocket.ConnectAsync(ep).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false); - - await targetSocket.SendAsync($"{tunnelTransportInfo.Local.MachineId}-{tunnelTransportInfo.FlowId}".ToBytes()); - await targetSocket.ReceiveAsync(new byte[1024]).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false); ; - - //需要ssl - SslStream sslStream = null; - if (tunnelTransportInfo.SSL) - { - sslStream = new SslStream(new NetworkStream(targetSocket, false), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null); - await sslStream.AuthenticateAsClientAsync(new SslClientAuthenticationOptions { EnabledSslProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13 }).ConfigureAwait(false); - } - - return new TunnelConnectionTcp - { - Stream = sslStream, - Socket = targetSocket, - IPEndPoint = targetSocket.RemoteEndPoint as IPEndPoint, - TransactionId = tunnelTransportInfo.TransactionId, - TransactionTag = tunnelTransportInfo.TransactionTag, - RemoteMachineId = tunnelTransportInfo.Remote.MachineId, - RemoteMachineName = tunnelTransportInfo.Remote.MachineName, - TransportName = Name, - Direction = tunnelTransportInfo.Direction, - ProtocolType = ProtocolType, - Type = TunnelType.P2P, - Mode = TunnelMode.Client, - Label = string.Empty, - SSL = tunnelTransportInfo.SSL, - BufferSize = tunnelTransportInfo.BufferSize, - }; + eps.Add(new IPEndPoint(tunnelTransportInfo.Remote.LocalIps.FirstOrDefault(c => c.AddressFamily == AddressFamily.InterNetworkV6), tunnelTransportInfo.Remote.PortMapWan)); } - catch (Exception ex) + eps.Add(new IPEndPoint(tunnelTransportInfo.Remote.Remote.Address, tunnelTransportInfo.Remote.PortMapWan)); + + foreach (var ep in eps) { - if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) + Socket targetSocket = new(ep.AddressFamily, SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); + try { - LoggerHelper.Instance.Error($"{Name} connect {ep} fail {ex}"); + targetSocket.KeepAlive(); + targetSocket.ReuseBind(new IPEndPoint(ep.AddressFamily == AddressFamily.InterNetwork ? tunnelTransportInfo.Local.Local.Address : IPAddress.IPv6Any, tunnelTransportInfo.Local.Local.Port)); + + if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) + { + LoggerHelper.Instance.Warning($"{Name} connect to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName} {ep}"); + } + await targetSocket.ConnectAsync(ep).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false); + + await targetSocket.SendAsync($"{tunnelTransportInfo.Local.MachineId}-{tunnelTransportInfo.FlowId}".ToBytes()); + await targetSocket.ReceiveAsync(new byte[1024]).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false); ; + + //需要ssl + SslStream sslStream = null; + if (tunnelTransportInfo.SSL) + { + sslStream = new SslStream(new NetworkStream(targetSocket, false), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null); + await sslStream.AuthenticateAsClientAsync(new SslClientAuthenticationOptions { EnabledSslProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13 }).ConfigureAwait(false); + } + + return new TunnelConnectionTcp + { + Stream = sslStream, + Socket = targetSocket, + IPEndPoint = targetSocket.RemoteEndPoint as IPEndPoint, + TransactionId = tunnelTransportInfo.TransactionId, + TransactionTag = tunnelTransportInfo.TransactionTag, + RemoteMachineId = tunnelTransportInfo.Remote.MachineId, + RemoteMachineName = tunnelTransportInfo.Remote.MachineName, + TransportName = Name, + Direction = tunnelTransportInfo.Direction, + ProtocolType = ProtocolType, + Type = TunnelType.P2P, + Mode = TunnelMode.Client, + Label = string.Empty, + SSL = tunnelTransportInfo.SSL, + BufferSize = tunnelTransportInfo.BufferSize, + }; + } + catch (Exception ex) + { + if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) + { + LoggerHelper.Instance.Error($"{Name} connect {ep} fail {ex}"); + } + targetSocket.SafeClose(); } - targetSocket.SafeClose(); } return null; } diff --git a/linker.tunnel/transport/TransportUdpPortMap.cs b/linker.tunnel/transport/TransportUdpPortMap.cs index 41d34f3d..34697776 100644 --- a/linker.tunnel/transport/TransportUdpPortMap.cs +++ b/linker.tunnel/transport/TransportUdpPortMap.cs @@ -73,11 +73,12 @@ namespace linker.tunnel.transport socket?.SafeClose(); if (localPort == 0) return; - IPAddress localIP = IPAddress.Any; + IPAddress localIP = IPAddress.IPv6Any; socket = new Socket(localIP.AddressFamily, SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp); socket.WindowsUdpBug(); - socket.ReuseBind(new IPEndPoint(localIP, localPort)); + socket.IPv6Only(localIP.AddressFamily, false); + socket.Bind(new IPEndPoint(localIP, localPort)); if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) { @@ -299,54 +300,64 @@ namespace linker.tunnel.transport LoggerHelper.Instance.Warning($"{Name} connect to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName} {string.Join("\r\n", tunnelTransportInfo.RemoteEndPoints.Select(c => c.ToString()))}"); } - IPEndPoint ep = new IPEndPoint(tunnelTransportInfo.Remote.Remote.Address, tunnelTransportInfo.Remote.PortMapWan); - Socket targetSocket = new(ep.AddressFamily, SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp); - try + List eps = new List(); + if (tunnelTransportInfo.Remote.LocalIps.Any(c => c.AddressFamily == AddressFamily.InterNetworkV6) + && tunnelTransportInfo.Local.LocalIps.Any(c => c.AddressFamily == AddressFamily.InterNetworkV6)) { - targetSocket.WindowsUdpBug(); - targetSocket.ReuseBind(new IPEndPoint(tunnelTransportInfo.Local.Local.Address, tunnelTransportInfo.Local.Local.Port)); - - if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) - { - LoggerHelper.Instance.Warning($"{Name} connect to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName} {ep}"); - } - - await targetSocket.SendToAsync($"{flagTexts}-{tunnelTransportInfo.Local.MachineId}-{tunnelTransportInfo.FlowId}".ToBytes(), ep).ConfigureAwait(false); - await targetSocket.ReceiveFromAsync(new byte[1024], new IPEndPoint(IPAddress.Any, 0)).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false); - - if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) - LoggerHelper.Instance.Debug($"{Name} connect to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName} {ep} success"); - - TunnelConnectionUdp result = new TunnelConnectionUdp - { - IPEndPoint = ep, - TransactionId = tunnelTransportInfo.TransactionId, - TransactionTag = tunnelTransportInfo.TransactionTag, - RemoteMachineId = tunnelTransportInfo.Remote.MachineId, - RemoteMachineName = tunnelTransportInfo.Remote.MachineName, - TransportName = Name, - Direction = tunnelTransportInfo.Direction, - ProtocolType = TunnelProtocolType.Udp, - Type = TunnelType.P2P, - Mode = TunnelMode.Client, - Label = string.Empty, - BufferSize = tunnelTransportInfo.BufferSize, - Receive = true, - UdpClient = targetSocket, - SSL = tunnelTransportInfo.SSL, - Crypto = CryptoFactory.CreateSymmetric(tunnelTransportInfo.Remote.MachineId) - }; - ConnectionCacheInfo cache = new ConnectionCacheInfo { Connection = result }; - connectionsDic.AddOrUpdate(ep, cache, (a, b) => cache); - return result; + eps.Add(new IPEndPoint(tunnelTransportInfo.Remote.LocalIps.FirstOrDefault(c => c.AddressFamily == AddressFamily.InterNetworkV6), tunnelTransportInfo.Remote.PortMapWan)); } - catch (Exception ex) + eps.Add(new IPEndPoint(tunnelTransportInfo.Remote.Remote.Address, tunnelTransportInfo.Remote.PortMapWan)); + + foreach (var ep in eps) { - if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) + Socket targetSocket = new(ep.AddressFamily, SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp); + try { - LoggerHelper.Instance.Error($"{Name} connect {ep} fail {ex}"); + targetSocket.WindowsUdpBug(); + targetSocket.ReuseBind(new IPEndPoint(ep.AddressFamily == AddressFamily.InterNetwork ? tunnelTransportInfo.Local.Local.Address : IPAddress.IPv6Any, tunnelTransportInfo.Local.Local.Port)); + + if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) + { + LoggerHelper.Instance.Warning($"{Name} connect to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName} {ep}"); + } + + await targetSocket.SendToAsync($"{flagTexts}-{tunnelTransportInfo.Local.MachineId}-{tunnelTransportInfo.FlowId}".ToBytes(), ep).ConfigureAwait(false); + await targetSocket.ReceiveFromAsync(new byte[1024], new IPEndPoint(ep.AddressFamily == AddressFamily.InterNetwork ? IPAddress.Any: IPAddress.IPv6Any, 0)).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false); + + if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) + LoggerHelper.Instance.Debug($"{Name} connect to {tunnelTransportInfo.Remote.MachineId}->{tunnelTransportInfo.Remote.MachineName} {ep} success"); + + TunnelConnectionUdp result = new TunnelConnectionUdp + { + IPEndPoint = ep, + TransactionId = tunnelTransportInfo.TransactionId, + TransactionTag = tunnelTransportInfo.TransactionTag, + RemoteMachineId = tunnelTransportInfo.Remote.MachineId, + RemoteMachineName = tunnelTransportInfo.Remote.MachineName, + TransportName = Name, + Direction = tunnelTransportInfo.Direction, + ProtocolType = TunnelProtocolType.Udp, + Type = TunnelType.P2P, + Mode = TunnelMode.Client, + Label = string.Empty, + BufferSize = tunnelTransportInfo.BufferSize, + Receive = true, + UdpClient = targetSocket, + SSL = tunnelTransportInfo.SSL, + Crypto = CryptoFactory.CreateSymmetric(tunnelTransportInfo.Remote.MachineId) + }; + ConnectionCacheInfo cache = new ConnectionCacheInfo { Connection = result }; + connectionsDic.AddOrUpdate(ep, cache, (a, b) => cache); + return result; + } + catch (Exception ex) + { + if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) + { + LoggerHelper.Instance.Error($"{Name} connect {ep} fail {ex}"); + } + targetSocket.SafeClose(); } - targetSocket.SafeClose(); } return null; } diff --git a/linker.tunnel/wanport/ITunnelWanPortProtocol.cs b/linker.tunnel/wanport/ITunnelWanPortProtocol.cs index 471af45c..7cb6d6e2 100644 --- a/linker.tunnel/wanport/ITunnelWanPortProtocol.cs +++ b/linker.tunnel/wanport/ITunnelWanPortProtocol.cs @@ -14,10 +14,9 @@ namespace linker.tunnel.wanport /// /// 获取外网端口 /// - /// 本地网卡 /// 服务器 /// - public Task GetAsync(IPAddress inter, IPEndPoint server); + public Task GetAsync(IPEndPoint server); } diff --git a/linker.tunnel/wanport/TunnelWanPortProtocolLinker.cs b/linker.tunnel/wanport/TunnelWanPortProtocolLinker.cs index 0534f4a6..def25e1b 100644 --- a/linker.tunnel/wanport/TunnelWanPortProtocolLinker.cs +++ b/linker.tunnel/wanport/TunnelWanPortProtocolLinker.cs @@ -21,12 +21,11 @@ namespace linker.tunnel.wanport } - public async Task GetAsync(IPAddress localIP, IPEndPoint server) + public async Task GetAsync( IPEndPoint server) { UdpClient udpClient = new UdpClient(AddressFamily.InterNetwork); - udpClient.Client.ReuseBind(new IPEndPoint(localIP, 0)); + udpClient.Client.ReuseBind(new IPEndPoint(IPAddress.Any, 0)); udpClient.Client.WindowsUdpBug(); - udpClient.Connect(server); byte[] buffer = ArrayPool.Shared.Rent(1024); try @@ -98,13 +97,13 @@ namespace linker.tunnel.wanport } - public async Task GetAsync(IPAddress localIP, IPEndPoint server) + public async Task GetAsync(IPEndPoint server) { byte[] buffer = ArrayPool.Shared.Rent(1024); try { Socket socket = new Socket(server.AddressFamily, SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); - socket.ReuseBind(new IPEndPoint(localIP, 0)); + socket.ReuseBind(new IPEndPoint(IPAddress.Any, 0)); await socket.ConnectAsync(server).ConfigureAwait(false); await socket.SendAsync(BuildSendData(buffer, (byte)new Random().Next(0, 255))); diff --git a/linker.tunnel/wanport/TunnelWanPortProtocolStun.cs b/linker.tunnel/wanport/TunnelWanPortProtocolStun.cs index 9a5c2197..63eec035 100644 --- a/linker.tunnel/wanport/TunnelWanPortProtocolStun.cs +++ b/linker.tunnel/wanport/TunnelWanPortProtocolStun.cs @@ -15,10 +15,10 @@ namespace linker.tunnel.wanport { } - public async Task GetAsync(IPAddress localIP, IPEndPoint server) + public async Task GetAsync(IPEndPoint server) { UdpClient udpClient = new UdpClient(AddressFamily.InterNetwork); - udpClient.Client.ReuseBind(new IPEndPoint(localIP, 0)); + udpClient.Client.ReuseBind(new IPEndPoint(IPAddress.Any, 0)); udpClient.Client.WindowsUdpBug(); try { diff --git a/linker.tunnel/wanport/TunnelWanPortTransfer.cs b/linker.tunnel/wanport/TunnelWanPortTransfer.cs index 460fe2c3..2ac17093 100644 --- a/linker.tunnel/wanport/TunnelWanPortTransfer.cs +++ b/linker.tunnel/wanport/TunnelWanPortTransfer.cs @@ -1,7 +1,5 @@ using linker.libs; -using linker.libs.extends; using System.Net; -using System.Net.Sockets; namespace linker.tunnel.wanport { @@ -26,18 +24,14 @@ namespace linker.tunnel.wanport ///
/// 你的局域网IP /// - public async Task GetWanPortAsync(IPEndPoint server,IPAddress localIP, TunnelWanPortProtocolType protocolType) + public async Task GetWanPortAsync(IPEndPoint server, TunnelWanPortProtocolType protocolType) { var tunnelWanPort = tunnelWanPorts.FirstOrDefault(c => c.ProtocolType == protocolType); if (tunnelWanPort == null) return null; try { - TunnelWanPortEndPoint wanPort = await tunnelWanPort.GetAsync(localIP, server).ConfigureAwait(false); - if (wanPort != null) - { - wanPort.Local.Address = localIP; - return wanPort; - } + TunnelWanPortEndPoint wanPort = await tunnelWanPort.GetAsync(server).ConfigureAwait(false); + return wanPort; } catch (Exception ex) { diff --git a/linker/Program.cs b/linker/Program.cs index c355ff12..79b426ef 100644 --- a/linker/Program.cs +++ b/linker/Program.cs @@ -11,6 +11,12 @@ namespace linker { static async Task Main(string[] args) { + //linker.libs.FireWallHelper.Write(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); +#if DEBUG +#else + linker.libs.FireWallHelper.Write(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); +#endif + if (Environment.UserInteractive == false && OperatingSystem.IsWindows()) { AppDomain.CurrentDomain.UnhandledException += (a, b) => diff --git a/linker/linker.csproj b/linker/linker.csproj index d03e1940..760f3564 100644 --- a/linker/linker.csproj +++ b/linker/linker.csproj @@ -59,15 +59,15 @@ - - Analyzer - false - false - + + + + + + - @@ -75,7 +75,6 @@ - diff --git a/linker/plugins/access/AccessDecenter.cs b/linker/plugins/access/AccessDecenter.cs deleted file mode 100644 index af382452..00000000 --- a/linker/plugins/access/AccessDecenter.cs +++ /dev/null @@ -1,54 +0,0 @@ -using linker.config; -using linker.libs; -using linker.plugins.client; -using linker.plugins.decenter; -using MemoryPack; - -namespace linker.plugins.access -{ - public sealed class AccessDecenter : IDecenter - { - public string Name => "access"; - public VersionManager SyncVersion { get; } = new VersionManager(); - public VersionManager DataVersion { get; } = new VersionManager(); - - public Dictionary Accesss { get; } = new Dictionary(); - - private readonly ClientConfigTransfer clientConfigTransfer; - private readonly AccessTransfer accessTransfer; - public AccessDecenter(ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer, AccessTransfer accessTransfer) - { - this.clientConfigTransfer = clientConfigTransfer; - this.accessTransfer = accessTransfer; - - clientSignInState.NetworkEnabledHandle += (times) => SyncVersion.Add(); - accessTransfer.OnChanged += SyncVersion.Add; - } - public void Refresh() - { - SyncVersion.Add(); - } - public Memory GetData() - { - ConfigAccessInfo info = new ConfigAccessInfo { MachineId = clientConfigTransfer.Id, Access = accessTransfer.Access }; - Accesss[info.MachineId] = info.Access; - DataVersion.Add(); - return MemoryPackSerializer.Serialize(info); - } - public void SetData(Memory data) - { - ConfigAccessInfo access = MemoryPackSerializer.Deserialize(data.Span); - Accesss[access.MachineId] = access.Access; - DataVersion.Add(); - } - public void SetData(List> data) - { - List list = data.Select(c => MemoryPackSerializer.Deserialize(c.Span)).ToList(); - foreach (var item in list) - { - Accesss[item.MachineId] = item.Access; - } - DataVersion.Add(); - } - } -} diff --git a/linker/plugins/access/AccessStartup.cs b/linker/plugins/access/AccessStartup.cs deleted file mode 100644 index 453ce34d..00000000 --- a/linker/plugins/access/AccessStartup.cs +++ /dev/null @@ -1,42 +0,0 @@ -using linker.config; -using linker.plugins.access.messenger; -using linker.startup; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.plugins.access -{ - public sealed class AccessStartup : IStartup - { - public string Name => "access"; - - public bool Required => true; - - public StartupLevel Level => StartupLevel.Top; - - public string[] Dependent => new string[] { "messenger", "signin", "serialize" }; - - public StartupLoadType LoadType => StartupLoadType.Normal; - - public void AddClient(ServiceCollection serviceCollection, FileConfig config) - { - serviceCollection.AddSingleton(); - - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - } - - public void AddServer(ServiceCollection serviceCollection, FileConfig config) - { - serviceCollection.AddSingleton(); - } - - public void UseClient(ServiceProvider serviceProvider, FileConfig config) - { - } - - public void UseServer(ServiceProvider serviceProvider, FileConfig config) - { - } - } -} diff --git a/linker/plugins/access/config/Config.cs b/linker/plugins/access/config/Config.cs deleted file mode 100644 index 54a2bed3..00000000 --- a/linker/plugins/access/config/Config.cs +++ /dev/null @@ -1,207 +0,0 @@ -using MemoryPack; -using System.Reflection; - -namespace linker.config -{ - public sealed partial class ConfigClientInfo - { - private Dictionary accesss; - public Dictionary Accesss - { - get - { - if (accesss == null) - { - accesss = new Dictionary(); - Type enumType = typeof(ClientApiAccess); - // 获取所有字段值 - foreach (var value in Enum.GetValues(enumType)) - { - // 获取字段信息 - FieldInfo fieldInfo = enumType.GetField(value.ToString()); - var attribute = fieldInfo.GetCustomAttribute(false); - if (attribute != null) - { - accesss.TryAdd(fieldInfo.Name, new ClientApiAccessInfo { Text = attribute.Value, Value = (ulong)value }); - } - } - } - - return accesss; - } - } - /// - /// 管理权限 - /// - public ClientApiAccess Access { get; set; } = ClientApiAccess.Full; - - } - - - [AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)] - public sealed class ClientApiAccessAttribute : Attribute - { - public ClientApiAccess Value { get; set; } - - public ClientApiAccessAttribute(ClientApiAccess value) - { - Value = value; - } - } - - [AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)] - public sealed class ClientAccessDisplayAttribute : Attribute - { - public string Value { get; set; } - - public ClientAccessDisplayAttribute(string value) - { - Value = value; - } - } - - [Flags] - public enum ClientApiAccess : ulong - { - None = 0, - - [ClientAccessDisplayAttribute("简单管理")] - NetManager = 1, - [ClientAccessDisplayAttribute("专业管理")] - FullManager = 1 << 1, - - [ClientAccessDisplayAttribute("服务器配置")] - Config = 1 << 2, - - [ClientAccessDisplayAttribute("日志列表")] - LoggerShow = 1 << 3, - [ClientAccessDisplayAttribute("日志配置")] - LoggerLevel = 1 << 4, - - [ClientAccessDisplayAttribute("修改本机设备名")] - RenameSelf = 1 << 5, - [ClientAccessDisplayAttribute("修改所有设备名")] - RenameOther = 1 << 6, - [ClientAccessDisplayAttribute("显示公网信息")] - ExternalShow = 1 << 7, - - [ClientAccessDisplayAttribute("升级本机")] - UpdateSelf = 1 << 8, - [ClientAccessDisplayAttribute("升级所有设备")] - UpdateOther = 1 << 9, - [ClientAccessDisplayAttribute("升级服务器")] - UpdateServer = 1 << 10, - - [ClientAccessDisplayAttribute("开关本机网卡")] - TuntapStatusSelf = 1 << 11, - [ClientAccessDisplayAttribute("开关所有网卡")] - TuntapStatusOther = 1 << 12, - [ClientAccessDisplayAttribute("修改本机网卡")] - TuntapChangeSelf = 1 << 13, - [ClientAccessDisplayAttribute("修改所有网卡")] - TuntapChangeOther = 1 << 14, - - [ClientAccessDisplayAttribute("显示本机端口转发")] - ForwardShowSelf = 1 << 15, - [ClientAccessDisplayAttribute("显示所有设备端口转发")] - ForwardShowOther = 1 << 16, - [ClientAccessDisplayAttribute("配置本机端口转发")] - ForwardSelf = 1 << 17, - [ClientAccessDisplayAttribute("配置所有设备端口转发")] - ForwardOther = 1 << 18, - - [ClientAccessDisplayAttribute("重启其它设备")] - Reboot = 1 << 19, - [ClientAccessDisplayAttribute("删除其它设备")] - Remove = 1 << 20, - - [ClientAccessDisplayAttribute("修改本机网关")] - TunnelChangeSelf = 1 << 21, - [ClientAccessDisplayAttribute("修改所有设备网关")] - TunnelChangeOther = 1 << 22, - [ClientAccessDisplayAttribute("删除隧道连接")] - TunnelRemove = 1 << 23, - - [ClientAccessDisplayAttribute("开启管理API")] - Api = 1 << 24, - [ClientAccessDisplayAttribute("开启管理网页")] - Web = 1 << 25, - - [ClientAccessDisplayAttribute("导出配置")] - Export = 1 << 26, - - [ClientAccessDisplayAttribute("修改权限")] - Access = 1 << 27, - - [ClientAccessDisplayAttribute("修改打洞协议")] - Transport = 1 << 28, - - [ClientAccessDisplayAttribute("修改验证参数")] - Action = 1 << 29, - - [ClientAccessDisplayAttribute("查看内网穿透流量")] - SForwardFlow = 1 << 30, - - [ClientAccessDisplayAttribute("查看中继流量")] - RelayFlow = ((ulong)1 << 31), - - [ClientAccessDisplayAttribute("查看信标流量")] - SigninFlow = ((ulong)1 << 32), - - [ClientAccessDisplayAttribute("查看流量")] - Flow = ((ulong)1 << 33), - - [ClientAccessDisplayAttribute("同步配置")] - Sync = ((ulong)1 << 34), - - [ClientAccessDisplayAttribute("配置组网网络")] - Lease = ((ulong)1 << 35), - - [ClientAccessDisplayAttribute("开关本机socks5")] - Socks5StatusSelf = ((ulong)1 << 36), - [ClientAccessDisplayAttribute("开关所有socks5")] - Socks5StatusOther = ((ulong)1 << 37), - [ClientAccessDisplayAttribute("修改本机socks5")] - Socks5ChangeSelf = ((ulong)1 << 38), - [ClientAccessDisplayAttribute("修改所有socks5")] - Socks5ChangeOther = ((ulong)1 << 39), - - Full = ulong.MaxValue >> (64 - 52), - } - - public sealed class ClientApiAccessInfo - { - public ulong Value { get; set; } - public string Text { get; set; } - } - - [MemoryPackable] - public sealed partial class ConfigUpdateAccessInfo - { - /// - /// 设备 - /// - public string FromMachineId { get; set; } - /// - /// 设备 - /// - public string ToMachineId { get; set; } - /// - /// 权限 - /// - public ulong Access { get; set; } - } - - [MemoryPackable] - public sealed partial class ConfigAccessInfo - { - /// - /// 设备 - /// - public string MachineId { get; set; } - /// - /// 权限 - /// - public ClientApiAccess Access { get; set; } - } -} diff --git a/linker/plugins/action/ActionApiController.cs b/linker/plugins/action/ActionApiController.cs deleted file mode 100644 index 6e6824d0..00000000 --- a/linker/plugins/action/ActionApiController.cs +++ /dev/null @@ -1,37 +0,0 @@ -using linker.libs.api; -using linker.plugins.capi; -using linker.plugins.action; -using linker.plugins.client; -using linker.libs.extends; -using linker.config; - -namespace linker.plugins.signin -{ - public sealed class ActionApiController : IApiClientController - { - private readonly ActionTransfer actionTransfer; - private readonly ClientSignInTransfer clientSignInTransfer; - - public ActionApiController(ActionTransfer actionTransfer, ClientSignInTransfer clientSignInTransfer) - { - this.actionTransfer = actionTransfer; - this.clientSignInTransfer = clientSignInTransfer; - } - - - [ClientApiAccessAttribute(ClientApiAccess.Action)] - public bool SetArgs(ApiControllerParamsInfo param) - { - actionTransfer.SetActionArg(param.Content); - return true; - } - - [ClientApiAccessAttribute(ClientApiAccess.Action)] - public bool SetServerArgs(ApiControllerParamsInfo param) - { - actionTransfer.SetActionArgs(param.Content.DeJson>()); - return true; - } - } - -} diff --git a/linker/plugins/action/ActionStartup.cs b/linker/plugins/action/ActionStartup.cs deleted file mode 100644 index 986184e6..00000000 --- a/linker/plugins/action/ActionStartup.cs +++ /dev/null @@ -1,48 +0,0 @@ -using linker.config; -using linker.plugins.action; -using linker.startup; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.plugins.signin -{ - public sealed class ActionStartup : IStartup - { - public StartupLevel Level => StartupLevel.Normal; - public string Name => "action"; - - public bool Required => false; - - public string[] Dependent => new string[] { "signin", }; - - public StartupLoadType LoadType => StartupLoadType.Normal; - - - public void AddClient(ServiceCollection serviceCollection, FileConfig config) - { - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - } - - public void AddServer(ServiceCollection serviceCollection, FileConfig config) - { - serviceCollection.AddSingleton(); - - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - } - - public void UseClient(ServiceProvider serviceProvider, FileConfig config) - { - } - - public void UseServer(ServiceProvider serviceProvider, FileConfig config) - { - } - } -} diff --git a/linker/plugins/capi/ApiClientTypesLoader.cs b/linker/plugins/capi/ApiClientTypesLoader.cs deleted file mode 100644 index f537c015..00000000 --- a/linker/plugins/capi/ApiClientTypesLoader.cs +++ /dev/null @@ -1,17 +0,0 @@ -using linker.libs; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.plugins.capi -{ - public sealed partial class ApiClientTypesLoader - { - public ApiClientTypesLoader(IApiClientServer apiClientServer, ServiceProvider serviceProvider) - { - var types = GetSourceGeneratorTypes(); - var flows = types.Select(c => serviceProvider.GetService(c)).Where(c => c != null).ToList(); - apiClientServer.LoadPlugins(flows); - - LoggerHelper.Instance.Info($"load client apis :{string.Join(",", flows.Select(c => c.GetType().Name))}"); - } - } -} diff --git a/linker/plugins/capi/CApiStartup.cs b/linker/plugins/capi/CApiStartup.cs deleted file mode 100644 index e256e686..00000000 --- a/linker/plugins/capi/CApiStartup.cs +++ /dev/null @@ -1,57 +0,0 @@ -using linker.config; -using linker.startup; -using linker.libs; -using Microsoft.Extensions.DependencyInjection; -using linker.plugins.access; - -namespace linker.plugins.capi -{ - public sealed class CApiStartup : IStartup - { - public StartupLevel Level => StartupLevel.Normal; - public string Name => "capi"; - public bool Required => false; - public string[] Dependent => new string[] { }; - public StartupLoadType LoadType => StartupLoadType.Normal; - - public void AddClient(ServiceCollection serviceCollection, FileConfig config) - { - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - serviceCollection.AddSingleton(); - } - - public void UseClient(ServiceProvider serviceProvider, FileConfig config) - { - ApiClientTypesLoader apiClientTypesLoader = serviceProvider.GetService(); - AccessTransfer accessTransfer = serviceProvider.GetService(); - - if (config.Data.Client.CApi.ApiPort > 0) - { - LoggerHelper.Instance.Info($"start client api server"); - IApiClientServer clientServer = serviceProvider.GetService(); - clientServer.Websocket(config.Data.Client.CApi.ApiPort, config.Data.Client.CApi.ApiPassword); - LoggerHelper.Instance.Warning($"client api listen:{config.Data.Client.CApi.ApiPort}"); - if (accessTransfer.HasAccess(ClientApiAccess.Api)) - LoggerHelper.Instance.Warning($"client api password:{config.Data.Client.CApi.ApiPassword}"); - } - - if (config.Data.Client.CApi.WebPort > 0 && accessTransfer.HasAccess(ClientApiAccess.Web)) - { - IWebClientServer webServer = serviceProvider.GetService(); - webServer.Start(config.Data.Client.CApi.WebPort, config.Data.Client.CApi.WebRoot); - LoggerHelper.Instance.Warning($"client web listen:{config.Data.Client.CApi.WebPort}"); - } - } - - - public void AddServer(ServiceCollection serviceCollection, FileConfig config) - { - - } - public void UseServer(ServiceProvider serviceProvider, FileConfig config) - { - } - } -} diff --git a/linker/plugins/capi/IApiClientController.cs b/linker/plugins/capi/IApiClientController.cs deleted file mode 100644 index 242a407d..00000000 --- a/linker/plugins/capi/IApiClientController.cs +++ /dev/null @@ -1,15 +0,0 @@ -using linker.libs.api; - -namespace linker.plugins.capi -{ - public interface IApiClientController : IApiController - { - - } - - public interface IApiClientServer : IApiServer - { - public void LoadPlugins(List list); - } - -} diff --git a/linker/plugins/capi/WebClientServer.cs b/linker/plugins/capi/WebClientServer.cs deleted file mode 100644 index f0b671fd..00000000 --- a/linker/plugins/capi/WebClientServer.cs +++ /dev/null @@ -1,16 +0,0 @@ -using linker.libs.web; - -namespace linker.plugins.capi -{ - public interface IWebClientServer : IWebServer - { - } - - /// - /// 本地web管理端服务器 - /// - public sealed class WebClientServer : WebServer, IWebClientServer - { - } - -} diff --git a/linker/plugins/client/ClientConfigSync.cs b/linker/plugins/client/ClientConfigSync.cs deleted file mode 100644 index 3df04f50..00000000 --- a/linker/plugins/client/ClientConfigSync.cs +++ /dev/null @@ -1,49 +0,0 @@ -using linker.config; -using linker.plugins.config; -using MemoryPack; - -namespace linker.plugins.client -{ - public sealed class ClientConfigSyncSecretKey : IConfigSync - { - public string Name => "SignInSecretKey"; - - private readonly FileConfig fileConfig; - private readonly ClientConfigTransfer clientConfigTransfer; - public ClientConfigSyncSecretKey(FileConfig fileConfig, ClientConfigTransfer clientConfigTransfer) - { - this.fileConfig = fileConfig; - this.clientConfigTransfer = clientConfigTransfer; - } - public Memory GetData() - { - return MemoryPackSerializer.Serialize(clientConfigTransfer.Server.SecretKey); - } - - public void SetData(Memory data) - { - clientConfigTransfer.SetSecretKey(MemoryPackSerializer.Deserialize(data.Span)); - } - } - public sealed class ClientConfigSyncGroupSecretKey : IConfigSync - { - public string Name => "GroupSecretKey"; - - private readonly FileConfig fileConfig; - private readonly ClientConfigTransfer clientConfigTransfer; - public ClientConfigSyncGroupSecretKey(FileConfig fileConfig, ClientConfigTransfer clientConfigTransfer) - { - this.fileConfig = fileConfig; - this.clientConfigTransfer = clientConfigTransfer; - } - public Memory GetData() - { - return MemoryPackSerializer.Serialize(clientConfigTransfer.Group.Password); - } - - public void SetData(Memory data) - { - clientConfigTransfer.SetGroupPassword(MemoryPackSerializer.Deserialize(data.Span)); - } - } -} diff --git a/linker/plugins/client/ClientStartup.cs b/linker/plugins/client/ClientStartup.cs deleted file mode 100644 index 25c36708..00000000 --- a/linker/plugins/client/ClientStartup.cs +++ /dev/null @@ -1,54 +0,0 @@ -using linker.libs; -using linker.startup; -using Microsoft.Extensions.DependencyInjection; -using linker.config; - -namespace linker.plugins.client -{ - /// - /// 客户端插件 - /// - public sealed class ClientStartup : IStartup - { - public StartupLevel Level => StartupLevel.Bottom; - public string Name => "client"; - public bool Required => true; - public string[] Dependent => new string[] { "messenger", "firewall", "signin", "serialize", "config" }; - public StartupLoadType LoadType => StartupLoadType.Normal; - - public void AddClient(ServiceCollection serviceCollection, FileConfig config) - { - - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - serviceCollection.AddSingleton(); - - } - - public void UseClient(ServiceProvider serviceProvider, FileConfig config) - { - LoggerHelper.Instance.Info($"start client"); - - LoggerHelper.Instance.Info($"start client signin transfer"); - ClientSignInTransfer clientTransfer = serviceProvider.GetService(); - clientTransfer.SignInTask(); - } - - - public void AddServer(ServiceCollection serviceCollection, FileConfig config) - { - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - } - public void UseServer(ServiceProvider serviceProvider, FileConfig config) - { - } - } -} diff --git a/linker/plugins/client/RouteExcludeIP.cs b/linker/plugins/client/RouteExcludeIP.cs deleted file mode 100644 index 571e8b75..00000000 --- a/linker/plugins/client/RouteExcludeIP.cs +++ /dev/null @@ -1,18 +0,0 @@ -using linker.plugins.route; -using System.Net; - -namespace linker.plugins.client -{ - public sealed class RouteExcludeIPSignin : IRouteExcludeIP - { - private readonly ClientSignInState clientSignInState; - public RouteExcludeIPSignin(ClientSignInState clientSignInState) - { - this.clientSignInState = clientSignInState; - } - public List Get() - { - return new List { clientSignInState.Connection?.Address.Address ?? IPAddress.Any }; - } - } -} diff --git a/linker/plugins/client/config/Config.cs b/linker/plugins/client/config/Config.cs deleted file mode 100644 index e4d56a84..00000000 --- a/linker/plugins/client/config/Config.cs +++ /dev/null @@ -1,144 +0,0 @@ -using linker.libs; -using linker.libs.extends; -using MemoryPack; -using System.Net; -using System.Text; - -namespace linker.config -{ - public sealed partial class ConfigInfo - { - public ConfigClientInfo Client { get; set; } = new ConfigClientInfo(); - } - - public sealed partial class ConfigClientInfo : IConfig - { - private ICrypto crypto; - public ConfigClientInfo() - { - crypto = CryptoFactory.CreateSymmetric(Helper.GlobalString); - accesss?.Clear(); - } - - public bool OnlyNode { get; set; } - - - private ClientServerInfo[] servers = new ClientServerInfo[] { -#if DEBUG - new ClientServerInfo{ Name="Linker", Host=new IPEndPoint(IPAddress.Loopback, 1802).ToString() } -#else - new ClientServerInfo{ Name="Linker", Host="linker.snltty.com:1802" } -#endif - }; - public ClientServerInfo Server => Servers[0]; - public ClientServerInfo[] Servers - { - get => servers; set { servers = value; } - } - - private string id = string.Empty; - public string Id - { - get => id; set - { - id = value.SubStr(0, 36); - } - } - - private string name = Dns.GetHostName().SubStr(0, 12); - public string Name - { - get => name; set - { - name = value.SubStr(0, 12); - } - } - - private ClientGroupInfo[] groups = new[] { new ClientGroupInfo { } }; - public ClientGroupInfo Group => Groups[0]; - public ClientGroupInfo[] Groups - { - get => groups; set - { - groups = value; - if (groups.Length == 0) groups = new[] { new ClientGroupInfo { } }; - } - } - - /// - /// 加密证书 - /// - public ClientCertificateInfo SSL { get; set; } = new ClientCertificateInfo(); - - public string Serialize(object obj) - { -#if DEBUG - return obj.ToJsonFormat(); -#else - return Convert.ToBase64String(crypto.Encode(Encoding.UTF8.GetBytes(obj.ToJson()))); -#endif - } - public object Deserialize(string text) - { - if (text.Contains("ApiPassword")) - { - return text.DeJson(); - } - return Encoding.UTF8.GetString(crypto.Decode(Convert.FromBase64String(text)).ToArray()).DeJson(); - } - - } - - [MemoryPackable] - public sealed partial class ClientGroupInfo - { - public ClientGroupInfo() { } - - public string Name { get; set; } = Helper.GlobalString; - -#if DEBUG - private string id = Helper.GlobalString; -#else - private string id = string.Empty; -#endif - public string Id - { - get => id; set - { - id = value.SubStr(0, 36); - } - } - -#if DEBUG - private string passord = Helper.GlobalString; -#else - private string passord = string.Empty; -#endif - public string Password - { - get => passord; set - { - passord = value.SubStr(0, 36); - } - } - } - - [MemoryPackable] - public sealed partial class ClientCertificateInfo - { - public ClientCertificateInfo() { } - public string File { get; set; } = "./snltty.pfx"; - public string Password { get; set; } = "oeq9tw1o"; - } - - [MemoryPackable] - public sealed partial class ClientServerInfo - { - public ClientServerInfo() { } - public string Name { get; set; } = string.Empty; - public string Host { get; set; } = string.Empty; - public string SecretKey { get; set; } = string.Empty; - - } - -} diff --git a/linker/plugins/config/ConfigStartup.cs b/linker/plugins/config/ConfigStartup.cs deleted file mode 100644 index 8ef1901b..00000000 --- a/linker/plugins/config/ConfigStartup.cs +++ /dev/null @@ -1,52 +0,0 @@ -using linker.client.config; -using linker.config; -using linker.plugins.config.messenger; -using linker.startup; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.plugins.config -{ - public sealed class ConfigStartup : IStartup - { - public string Name => "config"; - - public bool Required => true; - - public StartupLevel Level => StartupLevel.Top; - - public string[] Dependent => new string[] { "messenger", "signin", "serialize" }; - - public StartupLoadType LoadType => StartupLoadType.Normal; - - public void AddClient(ServiceCollection serviceCollection, FileConfig config) - { - serviceCollection.AddSingleton(); - - serviceCollection.AddSingleton(); - - serviceCollection.AddSingleton(); - - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - - } - - public void AddServer(ServiceCollection serviceCollection, FileConfig config) - { - serviceCollection.AddSingleton(); - } - - public void UseClient(ServiceProvider serviceProvider, FileConfig config) - { - RunningConfig runningConfig = serviceProvider.GetService(); - - ConfigSyncTreansfer configSyncTreansfer = serviceProvider.GetService(); - ConfigSyncTypesLoader configSyncTypesLoader = serviceProvider.GetService(); - } - - public void UseServer(ServiceProvider serviceProvider, FileConfig config) - { - } - } -} diff --git a/linker/plugins/config/ConfigSyncTypesLoader.cs b/linker/plugins/config/ConfigSyncTypesLoader.cs deleted file mode 100644 index a1e31510..00000000 --- a/linker/plugins/config/ConfigSyncTypesLoader.cs +++ /dev/null @@ -1,17 +0,0 @@ -using linker.libs; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.plugins.config -{ - public sealed partial class ConfigSyncTypesLoader - { - public ConfigSyncTypesLoader(ConfigSyncTreansfer configSyncTreansfer, ServiceProvider serviceProvider) - { - var types = GetSourceGeneratorTypes(); - var syncs = types.Select(c => (IConfigSync)serviceProvider.GetService(c)).Where(c => c != null).ToList(); - configSyncTreansfer.LoadConfigSyncs(syncs); - - LoggerHelper.Instance.Info($"load config sync transport:{string.Join(",", syncs.Select(c => c.GetType().Name))}"); - } - } -} diff --git a/linker/plugins/decenter/DecenterStartup.cs b/linker/plugins/decenter/DecenterStartup.cs deleted file mode 100644 index 1373d360..00000000 --- a/linker/plugins/decenter/DecenterStartup.cs +++ /dev/null @@ -1,43 +0,0 @@ -using linker.config; -using linker.plugins.decenter.messenger; -using linker.startup; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.plugins.decenter -{ - public sealed class DecenterStartup : IStartup - { - public string Name => "decenter"; - - public bool Required => true; - - public StartupLevel Level => StartupLevel.Top; - - public string[] Dependent => new string[] { "messenger", "signin", "serialize" }; - - public StartupLoadType LoadType => StartupLoadType.Normal; - - public void AddClient(ServiceCollection serviceCollection, FileConfig config) - { - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - serviceCollection.AddSingleton(); - } - - public void AddServer(ServiceCollection serviceCollection, FileConfig config) - { - serviceCollection.AddSingleton(); - } - - public void UseClient(ServiceProvider serviceProvider, FileConfig config) - { - DecenterTransfer decenterTransfer = serviceProvider.GetService(); - DecenterTypesLoader decenterTypesLoader = serviceProvider.GetService(); - } - - public void UseServer(ServiceProvider serviceProvider, FileConfig config) - { - } - } -} diff --git a/linker/plugins/decenter/DecenterTypesLoader.cs b/linker/plugins/decenter/DecenterTypesLoader.cs deleted file mode 100644 index d4063d7d..00000000 --- a/linker/plugins/decenter/DecenterTypesLoader.cs +++ /dev/null @@ -1,17 +0,0 @@ -using linker.libs; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.plugins.decenter -{ - public sealed partial class DecenterTypesLoader - { - public DecenterTypesLoader(DecenterTransfer decenterTransfer, ServiceProvider serviceProvider) - { - var types = GetSourceGeneratorTypes(); - var syncs = types.Select(c => (IDecenter)serviceProvider.GetService(c)).Where(c => c != null).ToList(); - decenterTransfer.LoadDecenters(syncs); - - LoggerHelper.Instance.Info($"load decenter transport:{string.Join(",", syncs.Select(c => c.GetType().Name))}"); - } - } -} diff --git a/linker/plugins/firewall/FireWallStartup.cs b/linker/plugins/firewall/FireWallStartup.cs deleted file mode 100644 index c7d7758d..00000000 --- a/linker/plugins/firewall/FireWallStartup.cs +++ /dev/null @@ -1,36 +0,0 @@ -using linker.config; -using linker.startup; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.plugins.firewall -{ - public sealed class FireWallStartup : IStartup - { - public StartupLevel Level => StartupLevel.Hight9; - public string Name => "firewall"; - public bool Required => false; - public string[] Dependent => new string[] { }; - public StartupLoadType LoadType => StartupLoadType.Dependent; - - public void AddClient(ServiceCollection serviceCollection, FileConfig config) - { - //linker.libs.FireWallHelper.Write(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); -#if DEBUG -#else - linker.libs.FireWallHelper.Write(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); -#endif - } - - public void AddServer(ServiceCollection serviceCollection, FileConfig config) - { - } - - public void UseClient(ServiceProvider serviceProvider, FileConfig config) - { - } - - public void UseServer(ServiceProvider serviceProvider, FileConfig config) - { - } - } -} diff --git a/linker/plugins/flow/ExternalFlow.cs b/linker/plugins/flow/ExternalFlow.cs index 6e6c2b47..dee157d1 100644 --- a/linker/plugins/flow/ExternalFlow.cs +++ b/linker/plugins/flow/ExternalFlow.cs @@ -1,5 +1,4 @@ using linker.messenger.tunnel; -using linker.plugins.tunnel; namespace linker.plugins.flow { public sealed class ExternalFlow : IFlow @@ -19,7 +18,7 @@ namespace linker.plugins.flow /// /// 外网端口处理器 /// - public sealed class ExternalResolverFlow : PlusTunnelExternalResolver + public sealed class ExternalResolverFlow : TunnelServerExternalResolver { private readonly ExternalFlow externalFlow; public ExternalResolverFlow(ExternalFlow externalFlow) diff --git a/linker/plugins/flow/FlowClientApiController.cs b/linker/plugins/flow/FlowClientApiController.cs index 1dc27b3a..daff88f4 100644 --- a/linker/plugins/flow/FlowClientApiController.cs +++ b/linker/plugins/flow/FlowClientApiController.cs @@ -1,31 +1,31 @@ using linker.libs.api; using linker.config; -using MemoryPack; +using linker.serializer; using linker.client.config; using linker.plugins.client; using linker.plugins.capi; -using linker.plugins.messenger; using linker.plugins.flow.messenger; using linker.libs.extends; using linker.plugins.relay.client; using linker.plugins.sforward; using linker.messenger; +using linker.messenger.signin; namespace linker.plugins.flow { public sealed class FlowClientApiController : IApiClientController { private readonly IMessengerSender messengerSender; - private readonly ClientSignInState clientSignInState; + private readonly SignInClientState signInClientState; private readonly FileConfig config; private readonly RunningConfig runningConfig; private readonly RelayClientConfigTransfer relayClientConfigTransfer; private readonly SForwardTransfer sForwardTransfer; - public FlowClientApiController(IMessengerSender messengerSender, ClientSignInState clientSignInState, FileConfig config, RunningConfig runningConfig, RelayClientConfigTransfer relayClientConfigTransfer, SForwardTransfer sForwardTransfer) + public FlowClientApiController(IMessengerSender messengerSender, SignInClientState signInClientState, FileConfig config, RunningConfig runningConfig, RelayClientConfigTransfer relayClientConfigTransfer, SForwardTransfer sForwardTransfer) { this.messengerSender = messengerSender; - this.clientSignInState = clientSignInState; + this.signInClientState = signInClientState; this.config = config; this.runningConfig = runningConfig; this.relayClientConfigTransfer = relayClientConfigTransfer; @@ -36,12 +36,12 @@ namespace linker.plugins.flow { MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)FlowMessengerIds.List, }); if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0) { - return MemoryPackSerializer.Deserialize(resp.Data.Span); + return Serializer.Deserialize(resp.Data.Span); } return new FlowInfo(); } @@ -49,12 +49,12 @@ namespace linker.plugins.flow { MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)FlowMessengerIds.Messenger, }); if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0) { - return MemoryPackSerializer.Deserialize>(resp.Data.Span); + return Serializer.Deserialize>(resp.Data.Span); } return new Dictionary(); } @@ -67,13 +67,13 @@ namespace linker.plugins.flow MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)FlowMessengerIds.SForward, - Payload = MemoryPackSerializer.Serialize(info) + Payload = Serializer.Serialize(info) }); if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0) { - return MemoryPackSerializer.Deserialize(resp.Data.Span); + return Serializer.Deserialize(resp.Data.Span); } return new SForwardFlowResponseInfo(); } @@ -86,13 +86,13 @@ namespace linker.plugins.flow MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)FlowMessengerIds.Relay, - Payload = MemoryPackSerializer.Serialize(info) + Payload = Serializer.Serialize(info) }); if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0) { - return MemoryPackSerializer.Deserialize(resp.Data.Span); + return Serializer.Deserialize(resp.Data.Span); } return new RelayFlowResponseInfo(); } diff --git a/linker/plugins/flow/FlowResolver.cs b/linker/plugins/flow/FlowResolver.cs index fcdbad18..eb86c999 100644 --- a/linker/plugins/flow/FlowResolver.cs +++ b/linker/plugins/flow/FlowResolver.cs @@ -1,7 +1,7 @@ using linker.libs; using linker.libs.extends; +using linker.messenger; using linker.messenger.signin; -using linker.plugins.resolver; using System.Buffers; using System.Collections.Concurrent; using System.Net; @@ -25,8 +25,8 @@ namespace linker.plugins.flow private ConcurrentDictionary servers = new ConcurrentDictionary(new IPAddressComparer()); - private readonly SignCaching signCaching; - public FlowResolver(SignCaching signCaching) + private readonly SignInServerCaching signCaching; + public FlowResolver(SignInServerCaching signCaching) { this.signCaching = signCaching; OnlineTask(); diff --git a/linker/plugins/flow/FlowStartup.cs b/linker/plugins/flow/FlowStartup.cs index e9d5b417..e584cf00 100644 --- a/linker/plugins/flow/FlowStartup.cs +++ b/linker/plugins/flow/FlowStartup.cs @@ -1,5 +1,7 @@ using linker.config; using linker.messenger; +using linker.messenger.relay.server; +using linker.messenger.tunnel; using linker.plugins.flow.messenger; using linker.plugins.messenger; using linker.plugins.relay.server; @@ -42,12 +44,12 @@ namespace linker.plugins.flow serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); diff --git a/linker/plugins/flow/MessengerFlow.cs b/linker/plugins/flow/MessengerFlow.cs index 91e817ac..2d1a6149 100644 --- a/linker/plugins/flow/MessengerFlow.cs +++ b/linker/plugins/flow/MessengerFlow.cs @@ -1,5 +1,4 @@ using linker.messenger; -using linker.plugins.messenger; namespace linker.plugins.flow { diff --git a/linker/plugins/flow/RelayFlow.cs b/linker/plugins/flow/RelayFlow.cs index 3c1e1de6..1020c243 100644 --- a/linker/plugins/flow/RelayFlow.cs +++ b/linker/plugins/flow/RelayFlow.cs @@ -1,6 +1,5 @@ using linker.libs; using linker.messenger.relay.server; -using linker.plugins.relay.server; using MemoryPack; using System.Text.Json.Serialization; @@ -20,7 +19,7 @@ namespace linker.plugins.flow } - public sealed class RelayReportResolverFlow : PlusRelayServerReportResolver + public sealed class RelayReportResolverFlow : RelayServerReportResolver { private readonly RelayReportFlow relayReportFlow; public RelayReportResolverFlow(RelayReportFlow relayReportFlow, RelayServerMasterTransfer relayServerTransfer) : base(relayServerTransfer) @@ -35,7 +34,7 @@ namespace linker.plugins.flow - public sealed class RelayResolverFlow : PlusRelayServerResolver + public sealed class RelayResolverFlow : RelayServerResolver { private readonly RelayFlow relayFlow; public RelayResolverFlow(RelayFlow relayFlow, RelayServerNodeTransfer relayServerNodeTransfer,ISerializer serializer) : base(relayServerNodeTransfer, serializer) diff --git a/linker/plugins/flow/messenger/FlowMessenger.cs b/linker/plugins/flow/messenger/FlowMessenger.cs index 58c65c98..112cd585 100644 --- a/linker/plugins/flow/messenger/FlowMessenger.cs +++ b/linker/plugins/flow/messenger/FlowMessenger.cs @@ -3,7 +3,7 @@ using linker.messenger; using linker.messenger.signin; using linker.plugins.relay.server; using linker.plugins.sforward; -using MemoryPack; +using linker.serializer; namespace linker.plugins.flow.messenger { @@ -13,14 +13,14 @@ namespace linker.plugins.flow.messenger private readonly MessengerFlow messengerFlow; private readonly SForwardFlow sForwardFlow; private readonly RelayFlow relayFlow; - private readonly SignCaching signCaching; + private readonly SignInServerCaching signCaching; private readonly FileConfig fileConfig; private readonly RelayServerConfigTransfer relayServerConfigTransfer; private readonly SForwardServerConfigTransfer sForwardServerConfigTransfer; private DateTime start = DateTime.Now; - public FlowMessenger(FlowTransfer flowTransfer, MessengerFlow messengerFlow, SForwardFlow sForwardFlow, RelayFlow relayFlow, SignCaching signCaching, FileConfig fileConfig, RelayServerConfigTransfer relayServerConfigTransfer, SForwardServerConfigTransfer sForwardServerConfigTransfer) + public FlowMessenger(FlowTransfer flowTransfer, MessengerFlow messengerFlow, SForwardFlow sForwardFlow, RelayFlow relayFlow, SignInServerCaching signCaching, FileConfig fileConfig, RelayServerConfigTransfer relayServerConfigTransfer, SForwardServerConfigTransfer sForwardServerConfigTransfer) { this.flowTransfer = flowTransfer; this.messengerFlow = messengerFlow; @@ -46,20 +46,20 @@ namespace linker.plugins.flow.messenger Start = start, Now = DateTime.Now, }; - connection.Write(MemoryPackSerializer.Serialize(serverFlowInfo)); + connection.Write(Serializer.Serialize(serverFlowInfo)); } [MessengerId((ushort)FlowMessengerIds.Messenger)] public void Messenger(IConnection connection) { - connection.Write(MemoryPackSerializer.Serialize(messengerFlow.GetFlows())); + connection.Write(Serializer.Serialize(messengerFlow.GetFlows())); } [MessengerId((ushort)FlowMessengerIds.SForward)] public void SForward(IConnection connection) { sForwardFlow.Update(); - SForwardFlowRequestInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + SForwardFlowRequestInfo info = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (sForwardServerConfigTransfer.SecretKey == info.SecretKey) { @@ -77,14 +77,14 @@ namespace linker.plugins.flow.messenger } } - connection.Write(MemoryPackSerializer.Serialize(sForwardFlow.GetFlows(info))); + connection.Write(Serializer.Serialize(sForwardFlow.GetFlows(info))); } [MessengerId((ushort)FlowMessengerIds.Relay)] public void Relay(IConnection connection) { relayFlow.Update(); - RelayFlowRequestInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + RelayFlowRequestInfo info = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (relayServerConfigTransfer.SecretKey == info.SecretKey) { info.GroupId = string.Empty; @@ -101,7 +101,7 @@ namespace linker.plugins.flow.messenger } } - connection.Write(MemoryPackSerializer.Serialize(relayFlow.GetFlows(info))); + connection.Write(Serializer.Serialize(relayFlow.GetFlows(info))); } } diff --git a/linker/plugins/forward/ForwardApiController.cs b/linker/plugins/forward/ForwardApiController.cs index 8c5a2715..cd1942c9 100644 --- a/linker/plugins/forward/ForwardApiController.cs +++ b/linker/plugins/forward/ForwardApiController.cs @@ -7,13 +7,14 @@ using linker.plugins.forward.proxy; using linker.tunnel.connection; using System.Collections.Concurrent; using linker.plugins.forward.messenger; -using MemoryPack; +using linker.serializer; using linker.plugins.client; using linker.plugins.capi; using linker.plugins.messenger; using linker.config; using linker.plugins.access; using linker.messenger; +using linker.messenger.signin; namespace linker.plugins.forward { @@ -22,19 +23,19 @@ namespace linker.plugins.forward private readonly ForwardTransfer forwardTransfer; private readonly ForwardProxy forwardProxy; private readonly IMessengerSender messengerSender; - private readonly ClientSignInState clientSignInState; + private readonly SignInClientState signInClientState; private readonly AccessTransfer accessTransfer; - private readonly ClientConfigTransfer clientConfigTransfer; + private readonly ISignInClientStore signInClientStore; private readonly ForwardDecenter forwardDecenter; - public ForwardClientApiController(ForwardTransfer forwardTransfer, ForwardProxy forwardProxy, IMessengerSender messengerSender, ClientSignInState clientSignInState, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer, ForwardDecenter forwardDecenter) + public ForwardClientApiController(ForwardTransfer forwardTransfer, ForwardProxy forwardProxy, IMessengerSender messengerSender, SignInClientState signInClientState, AccessTransfer accessTransfer, ISignInClientStore signInClientStore, ForwardDecenter forwardDecenter) { this.forwardTransfer = forwardTransfer; this.forwardProxy = forwardProxy; this.messengerSender = messengerSender; - this.clientSignInState = clientSignInState; + this.signInClientState = signInClientState; this.accessTransfer = accessTransfer; - this.clientConfigTransfer = clientConfigTransfer; + this.signInClientStore = signInClientStore; this.forwardDecenter = forwardDecenter; } @@ -88,7 +89,7 @@ namespace linker.plugins.forward /// public async Task> Get(ApiControllerParamsInfo param) { - if (param.Content == clientConfigTransfer.Id) + if (param.Content == signInClientStore.Id) { if (accessTransfer.HasAccess(ClientApiAccess.ForwardShowSelf) == false) return new List(); return forwardTransfer.Get(); @@ -97,13 +98,13 @@ namespace linker.plugins.forward var resp = await messengerSender.SendReply(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)ForwardMessengerIds.GetForward, - Payload = MemoryPackSerializer.Serialize(param.Content) + Payload = Serializer.Serialize(param.Content) }); if (resp.Code == MessageResponeCodes.OK) { - return MemoryPackSerializer.Deserialize>(resp.Data.Span); + return Serializer.Deserialize>(resp.Data.Span); } return new List(); } @@ -116,7 +117,7 @@ namespace linker.plugins.forward public async Task Add(ApiControllerParamsInfo param) { ForwardAddForwardInfo info = param.Content.DeJson(); - if (info.MachineId == clientConfigTransfer.Id) + if (info.MachineId == signInClientStore.Id) { if (accessTransfer.HasAccess(ClientApiAccess.ForwardSelf) == false) return false; return forwardTransfer.Add(info.Data); @@ -125,9 +126,9 @@ namespace linker.plugins.forward return await messengerSender.SendOnly(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)ForwardMessengerIds.AddClientForward, - Payload = MemoryPackSerializer.Serialize(info) + Payload = Serializer.Serialize(info) }); } @@ -139,7 +140,7 @@ namespace linker.plugins.forward public async Task Remove(ApiControllerParamsInfo param) { ForwardRemoveForwardInfo info = param.Content.DeJson(); - if (info.MachineId == clientConfigTransfer.Id) + if (info.MachineId == signInClientStore.Id) { if (accessTransfer.HasAccess(ClientApiAccess.ForwardSelf) == false) return false; return forwardTransfer.Remove(info.Id); @@ -148,9 +149,9 @@ namespace linker.plugins.forward if (accessTransfer.HasAccess(ClientApiAccess.ForwardOther) == false) return false; return await messengerSender.SendOnly(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)ForwardMessengerIds.RemoveClientForward, - Payload = MemoryPackSerializer.Serialize(info) + Payload = Serializer.Serialize(info) }); } } diff --git a/linker/plugins/forward/ForwardDecenter.cs b/linker/plugins/forward/ForwardDecenter.cs index f069f61a..803a44ac 100644 --- a/linker/plugins/forward/ForwardDecenter.cs +++ b/linker/plugins/forward/ForwardDecenter.cs @@ -1,7 +1,8 @@ using linker.libs; +using linker.messenger.decenter; +using linker.messenger.signin; using linker.plugins.client; -using linker.plugins.decenter; -using MemoryPack; +using linker.serializer; using System.Collections.Concurrent; namespace linker.plugins.forward @@ -14,11 +15,11 @@ namespace linker.plugins.forward public ConcurrentDictionary CountDic { get; }= new ConcurrentDictionary(); - private readonly ClientConfigTransfer clientConfigTransfer; + private readonly ISignInClientStore signInClientStore; private readonly ForwardTransfer forwardTransfer; - public ForwardDecenter(ClientConfigTransfer clientConfigTransfer, ForwardTransfer forwardTransfer) + public ForwardDecenter(ISignInClientStore signInClientStore, ForwardTransfer forwardTransfer) { - this.clientConfigTransfer = clientConfigTransfer; + this.signInClientStore = signInClientStore; this.forwardTransfer = forwardTransfer; forwardTransfer.OnReset += CountDic.Clear; forwardTransfer.OnChanged += SyncVersion.Add; @@ -26,20 +27,20 @@ namespace linker.plugins.forward public Memory GetData() { - CountInfo info = new CountInfo { MachineId = clientConfigTransfer.Id, Count = forwardTransfer.Count }; + CountInfo info = new CountInfo { MachineId = signInClientStore.Id, Count = forwardTransfer.Count }; CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count); DataVersion.Add(); - return MemoryPackSerializer.Serialize(info); + return Serializer.Serialize(info); } public void SetData(Memory data) { - CountInfo info = MemoryPackSerializer.Deserialize(data.Span); + CountInfo info = Serializer.Deserialize(data.Span); CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count); DataVersion.Add(); } public void SetData(List> data) { - List list = data.Select(c => MemoryPackSerializer.Deserialize(c.Span)).ToList(); + List list = data.Select(c => Serializer.Deserialize(c.Span)).ToList(); foreach (var info in list) { CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count); diff --git a/linker/plugins/forward/ForwardTransfer.cs b/linker/plugins/forward/ForwardTransfer.cs index 007fb224..fa808953 100644 --- a/linker/plugins/forward/ForwardTransfer.cs +++ b/linker/plugins/forward/ForwardTransfer.cs @@ -1,36 +1,36 @@ using linker.client.config; using linker.libs; using linker.messenger; +using linker.messenger.signin; using linker.plugins.client; using linker.plugins.forward.proxy; -using linker.plugins.messenger; using MemoryPack; namespace linker.plugins.forward { public sealed class ForwardTransfer { - public int Count => running.Data.Forwards.Count(c => c.GroupId == clientConfigTransfer.Group.Id); + public int Count => running.Data.Forwards.Count(c => c.GroupId == signInClientStore.Group.Id); public Action OnChanged { get; set; } = () => { }; public Action OnReset{ get; set; } = () => { }; private readonly RunningConfig running; private readonly ForwardProxy forwardProxy; - private readonly ClientSignInState clientSignInState; + private readonly SignInClientState signInClientState; private readonly IMessengerSender messengerSender; - private readonly ClientConfigTransfer clientConfigTransfer; + private readonly ISignInClientStore signInClientStore; private readonly NumberSpaceUInt32 ns = new NumberSpaceUInt32(); - public ForwardTransfer( RunningConfig running, ForwardProxy forwardProxy, ClientSignInState clientSignInState, IMessengerSender messengerSender, ClientConfigTransfer clientConfigTransfer) + public ForwardTransfer( RunningConfig running, ForwardProxy forwardProxy, SignInClientState signInClientState, IMessengerSender messengerSender, ISignInClientStore signInClientStore) { this.running = running; this.forwardProxy = forwardProxy; - this.clientSignInState = clientSignInState; + this.signInClientState = signInClientState; this.messengerSender = messengerSender; - this.clientConfigTransfer = clientConfigTransfer; + this.signInClientStore = signInClientStore; - clientSignInState.NetworkEnabledHandle += Reset; + signInClientState.NetworkEnabledHandle += Reset; } string groupid = string.Empty; @@ -42,17 +42,17 @@ namespace linker.plugins.forward { foreach (var item in running.Data.Forwards) { - item.GroupId = clientConfigTransfer.Group.Id; + item.GroupId = signInClientStore.Group.Id; } running.Data.Update(); } - if (groupid != clientConfigTransfer.Group.Id) + if (groupid != signInClientStore.Group.Id) { OnReset(); Stop(); } - groupid = clientConfigTransfer.Group.Id; + groupid = signInClientStore.Group.Id; await Task.Delay(5000).ConfigureAwait(false); Start(false); @@ -66,7 +66,7 @@ namespace linker.plugins.forward uint maxid = running.Data.Forwards.Count > 0 ? running.Data.Forwards.Max(c => c.Id) : 1; ns.Reset(maxid); - foreach (var item in running.Data.Forwards.Where(c => c.GroupId == clientConfigTransfer.Group.Id)) + foreach (var item in running.Data.Forwards.Where(c => c.GroupId == signInClientStore.Group.Id)) { if (item.Started) { @@ -150,7 +150,7 @@ namespace linker.plugins.forward public List Get() { - return running.Data.Forwards.Where(c => c.GroupId == clientConfigTransfer.Group.Id).ToList(); + return running.Data.Forwards.Where(c => c.GroupId == signInClientStore.Group.Id).ToList(); } public bool Add(ForwardInfo forwardInfo) { @@ -171,12 +171,12 @@ namespace linker.plugins.forward old.MachineName = forwardInfo.MachineName; old.Started = forwardInfo.Started; old.BufferSize = forwardInfo.BufferSize; - old.GroupId = clientConfigTransfer.Group.Id; + old.GroupId = signInClientStore.Group.Id; } else { forwardInfo.Id = ns.Increment(); - forwardInfo.GroupId = clientConfigTransfer.Group.Id; + forwardInfo.GroupId = signInClientStore.Group.Id; running.Data.Forwards.Add(forwardInfo); } running.Data.Update(); diff --git a/linker/plugins/forward/messenger/ForwardMessenger.cs b/linker/plugins/forward/messenger/ForwardMessenger.cs index 33a45189..7a716ea3 100644 --- a/linker/plugins/forward/messenger/ForwardMessenger.cs +++ b/linker/plugins/forward/messenger/ForwardMessenger.cs @@ -1,6 +1,7 @@ using linker.client.config; using linker.messenger; using linker.messenger.signin; +using linker.serializer; using MemoryPack; namespace linker.plugins.forward.messenger @@ -9,9 +10,9 @@ namespace linker.plugins.forward.messenger { private readonly IMessengerSender sender; - private readonly SignCaching signCaching; + private readonly SignInServerCaching signCaching; - public ForwardServerMessenger(IMessengerSender sender, SignCaching signCaching) + public ForwardServerMessenger(IMessengerSender sender, SignInServerCaching signCaching) { this.sender = sender; this.signCaching = signCaching; @@ -24,7 +25,7 @@ namespace linker.plugins.forward.messenger [MessengerId((ushort)ForwardMessengerIds.GetForward)] public void GetForward(IConnection connection) { - string machineId = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + string machineId = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (signCaching.TryGet(machineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId) { uint requestid = connection.ReceiveRequestWrap.RequestId; @@ -55,7 +56,7 @@ namespace linker.plugins.forward.messenger [MessengerId((ushort)ForwardMessengerIds.AddClientForward)] public async Task AddClientForward(IConnection connection) { - ForwardAddForwardInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + ForwardAddForwardInfo info = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId) { uint requestid = connection.ReceiveRequestWrap.RequestId; @@ -63,7 +64,7 @@ namespace linker.plugins.forward.messenger { Connection = cacheTo.Connection, MessengerId = (ushort)ForwardMessengerIds.AddClient, - Payload = MemoryPackSerializer.Serialize(info.Data) + Payload = Serializer.Serialize(info.Data) }); } } @@ -74,7 +75,7 @@ namespace linker.plugins.forward.messenger [MessengerId((ushort)ForwardMessengerIds.RemoveClientForward)] public async Task RemoveClientForward(IConnection connection) { - ForwardRemoveForwardInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + ForwardRemoveForwardInfo info = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId) { uint requestid = connection.ReceiveRequestWrap.RequestId; @@ -82,7 +83,7 @@ namespace linker.plugins.forward.messenger { Connection = cacheTo.Connection, MessengerId = (ushort)ForwardMessengerIds.RemoveClient, - Payload = MemoryPackSerializer.Serialize(info.Id) + Payload = Serializer.Serialize(info.Id) }); } } @@ -103,7 +104,7 @@ namespace linker.plugins.forward.messenger [MessengerId((ushort)ForwardMessengerIds.Get)] public void Get(IConnection connection) { - connection.Write(MemoryPackSerializer.Serialize(forwardTransfer.Get())); + connection.Write(Serializer.Serialize(forwardTransfer.Get())); } /// /// 添加 @@ -112,7 +113,7 @@ namespace linker.plugins.forward.messenger [MessengerId((ushort)ForwardMessengerIds.AddClient)] public void AddClient(IConnection connection) { - ForwardInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + ForwardInfo info = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); forwardTransfer.Add(info); } // @@ -122,7 +123,7 @@ namespace linker.plugins.forward.messenger [MessengerId((ushort)ForwardMessengerIds.RemoveClient)] public void RemoveClient(IConnection connection) { - uint id = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + uint id = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); forwardTransfer.Remove(id); } } diff --git a/linker/plugins/forward/proxy/ForwardProxyTunnel.cs b/linker/plugins/forward/proxy/ForwardProxyTunnel.cs index 0d7b3228..74ddf82c 100644 --- a/linker/plugins/forward/proxy/ForwardProxyTunnel.cs +++ b/linker/plugins/forward/proxy/ForwardProxyTunnel.cs @@ -7,6 +7,7 @@ using linker.plugins.tunnel; using linker.plugins.relay.client; using linker.plugins.pcp; using linker.messenger.relay.client; +using linker.messenger.signin; namespace linker.plugins.forward.proxy { @@ -18,8 +19,8 @@ namespace linker.plugins.forward.proxy protected override string TransactionId => "forward"; - public ForwardProxy(ClientConfigTransfer clientConfigTransfer, TunnelTransfer tunnelTransfer, RelayClientTransfer relayTransfer, PcpTransfer pcpTransfer, ClientSignInTransfer clientSignInTransfer, ClientSignInState clientSignInState, RelayClientConfigTransfer relayClientConfigTransfer) - : base(tunnelTransfer, relayTransfer, pcpTransfer, clientSignInTransfer, clientSignInState, clientConfigTransfer, relayClientConfigTransfer) + public ForwardProxy(ISignInClientStore signInClientStore, TunnelTransfer tunnelTransfer, RelayClientTransfer relayTransfer, PcpTransfer pcpTransfer, SignInClientTransfer signInClientTransfer, RelayClientConfigTransfer relayClientConfigTransfer) + : base(tunnelTransfer, relayTransfer, pcpTransfer, signInClientTransfer, signInClientStore, relayClientConfigTransfer) { TaskUdp(); } diff --git a/linker/plugins/messenger/MessengerResolverResolver.cs b/linker/plugins/messenger/MessengerResolverResolver.cs deleted file mode 100644 index fd4f1c29..00000000 --- a/linker/plugins/messenger/MessengerResolverResolver.cs +++ /dev/null @@ -1,26 +0,0 @@ -using linker.plugins.resolver; -using System.Net.Sockets; -using System.Net; -using linker.messenger; - -namespace linker.plugins.messenger -{ - public sealed class MessengerResolverResolver : IResolver - { - public ResolverType Type => ResolverType.Messenger; - - private readonly IMessengerResolver messengerResolver; - public MessengerResolverResolver(IMessengerResolver messengerResolver) - { - this.messengerResolver = messengerResolver; - } - public async Task Resolve(Socket socket, Memory memory) - { - await messengerResolver.BeginReceiveServer(socket, memory); - } - public async Task Resolve(Socket socket, IPEndPoint ep, Memory memory) - { - await messengerResolver.BeginReceiveServer(socket, ep, memory); - } - } -} diff --git a/linker/plugins/messenger/MessengerResolverTypesLoader.cs b/linker/plugins/messenger/MessengerResolverTypesLoader.cs deleted file mode 100644 index 96b69ff3..00000000 --- a/linker/plugins/messenger/MessengerResolverTypesLoader.cs +++ /dev/null @@ -1,19 +0,0 @@ -using linker.libs; -using linker.messenger; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.plugins.messenger -{ - public sealed partial class MessengerResolverTypesLoader - { - public MessengerResolverTypesLoader(IMessengerResolver messengerResolver, ServiceProvider serviceProvider) - { - var types = GetSourceGeneratorTypes(); - - var messengers = types.Select(c => (IMessenger)serviceProvider.GetService(c)).Where(c => c != null).ToList(); - messengerResolver.LoadMessenger(messengers); - - LoggerHelper.Instance.Info($"load messengers :{string.Join(",", messengers.Select(c => c.GetType().Name))}"); - } - } -} diff --git a/linker/plugins/messenger/MessengerStartup.cs b/linker/plugins/messenger/MessengerStartup.cs deleted file mode 100644 index 49455b3f..00000000 --- a/linker/plugins/messenger/MessengerStartup.cs +++ /dev/null @@ -1,73 +0,0 @@ -using linker.config; -using linker.messenger; -using linker.plugins.client; -using linker.plugins.server; -using linker.startup; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.plugins.messenger -{ - /// - /// 服务端插件 - /// - public sealed class MessengerStartup : IStartup - { - public StartupLevel Level => StartupLevel.Normal; - public string Name => "messenger"; - public bool Required => true; - public string[] Dependent => new string[] { }; - public StartupLoadType LoadType => StartupLoadType.Normal; - - public void AddClient(ServiceCollection serviceCollection, FileConfig config) - { - - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - serviceCollection.AddSingleton(); - - - } - - public void AddServer(ServiceCollection serviceCollection, FileConfig config) - { - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - } - - - private bool loaded = false; - public void UseClient(ServiceProvider serviceProvider, FileConfig config) - { - if (loaded == false) - { - loaded = true; - - IMessengerResolver messengerResolver = serviceProvider.GetService(); - ClientConfigTransfer clientConfigTransfer = serviceProvider.GetService(); - messengerResolver.Initialize(clientConfigTransfer.Certificate); - - MessengerResolverTypesLoader messengerResolverTypesLoader = serviceProvider.GetService(); - - } - } - - public void UseServer(ServiceProvider serviceProvider, FileConfig config) - { - if (loaded == false) - { - loaded = true; - - ServerConfigTransfer serverConfigTransfer = serviceProvider.GetService(); - - IMessengerResolver messengerResolver = serviceProvider.GetService(); - messengerResolver.Initialize(serverConfigTransfer.SSL.File, serverConfigTransfer.SSL.Password); - - MessengerResolverTypesLoader messengerResolverTypesLoader = serviceProvider.GetService(); - } - } - } -} diff --git a/linker/plugins/pcp/PcpConfigTransfer.cs b/linker/plugins/pcp/PcpConfigTransfer.cs deleted file mode 100644 index d45cb08a..00000000 --- a/linker/plugins/pcp/PcpConfigTransfer.cs +++ /dev/null @@ -1,80 +0,0 @@ -using linker.client.config; -using linker.config; -using linker.libs; -using linker.plugins.client; -using linker.plugins.decenter; -using linker.tunnel.connection; -using MemoryPack; -using System.Collections.Concurrent; - -namespace linker.plugins.pcp -{ - public sealed class PcpConfigTransfer : IDecenter - { - public string Name => "pcp"; - public VersionManager SyncVersion { get; } = new VersionManager(); - public VersionManager DataVersion { get; } = new VersionManager(); - - private ConcurrentDictionary> history = new ConcurrentDictionary>(); - private readonly RunningConfig runningConfig; - private readonly FileConfig fileConfig; - private readonly ClientSignInState clientSignInState; - private readonly ClientConfigTransfer clientConfigTransfer; - - public PcpConfigTransfer(RunningConfig runningConfig, FileConfig fileConfig, ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer) - { - this.runningConfig = runningConfig; - this.fileConfig = fileConfig; - this.clientSignInState = clientSignInState; - this.clientConfigTransfer = clientConfigTransfer; - - clientSignInState.NetworkEnabledHandle += (times) => SyncVersion.Add(); - } - - public void AddHistory(ITunnelConnection connection) - { - if (connection.Connected && connection.Type == TunnelType.P2P && runningConfig.Data.TunnelHistory.History.Contains(connection.RemoteMachineId) == false) - { - runningConfig.Data.TunnelHistory.History.Add(connection.RemoteMachineId); - runningConfig.Data.Update(); - SyncVersion.Add(); - } - } - public List GetNodes(string fromMachineId, string toMachineId) - { - if (history.TryGetValue(fromMachineId, out List from) && history.TryGetValue(toMachineId, out List to)) - { - - } - return new List(); - } - - public Memory GetData() - { - HistoryDecenterInfo historyDecenterInfo = new HistoryDecenterInfo { MachineId = clientConfigTransfer.Id, List = runningConfig.Data.TunnelHistory.History }; - history.AddOrUpdate(historyDecenterInfo.MachineId, historyDecenterInfo.List, (a, b) => historyDecenterInfo.List); - return MemoryPackSerializer.Serialize(historyDecenterInfo); - } - public void SetData(Memory data) - { - HistoryDecenterInfo historyDecenterInfo = MemoryPackSerializer.Deserialize(data.Span); - history.AddOrUpdate(historyDecenterInfo.MachineId, historyDecenterInfo.List, (a, b) => historyDecenterInfo.List); - } - public void SetData(List> data) - { - List list = data.Select(c => MemoryPackSerializer.Deserialize(c.Span)).ToList(); - foreach (var historyDecenterInfo in list) - { - history.AddOrUpdate(historyDecenterInfo.MachineId, historyDecenterInfo.List, (a, b) => historyDecenterInfo.List); - } - } - - } - - [MemoryPackable] - public sealed partial class HistoryDecenterInfo - { - public string MachineId { get; set; } - public List List { get; set; } - } -} diff --git a/linker/plugins/pcp/PcpStartup.cs b/linker/plugins/pcp/PcpStartup.cs deleted file mode 100644 index a6d797bc..00000000 --- a/linker/plugins/pcp/PcpStartup.cs +++ /dev/null @@ -1,44 +0,0 @@ -using linker.config; -using linker.plugins.pcp.messenger; -using linker.startup; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.plugins.pcp -{ - /// - /// 节点中继插件 - /// - public sealed class PcpStartup : IStartup - { - public StartupLevel Level => StartupLevel.Normal; - public string Name => "pcp"; - - public bool Required => false; - - public string[] Dependent => new string[] { "messenger", "signin", "serialize", "config" }; - - public StartupLoadType LoadType => StartupLoadType.Normal; - - public void AddClient(ServiceCollection serviceCollection, FileConfig config) - { - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - serviceCollection.AddSingleton(); - } - - public void AddServer(ServiceCollection serviceCollection, FileConfig config) - { - serviceCollection.AddSingleton(); - } - - public void UseClient(ServiceProvider serviceProvider, FileConfig config) - { - PcpTransfer pcpTransfer = serviceProvider.GetService(); - } - - public void UseServer(ServiceProvider serviceProvider, FileConfig config) - { - } - } -} diff --git a/linker/plugins/pcp/config/Config.cs b/linker/plugins/pcp/config/Config.cs deleted file mode 100644 index 6a2b2437..00000000 --- a/linker/plugins/pcp/config/Config.cs +++ /dev/null @@ -1,18 +0,0 @@ - -namespace linker.client.config -{ - public sealed partial class RunningConfigInfo - { - /// - /// 打洞历史记录 - /// - public TunnelHistoryInfo TunnelHistory { get; set; } = new TunnelHistoryInfo(); - } - - public sealed class TunnelHistoryInfo - { - public TunnelHistoryInfo() { } - - public List History { get; set; } = new List(); - } -} diff --git a/linker/plugins/relay/RelayStartup.cs b/linker/plugins/relay/RelayStartup.cs deleted file mode 100644 index af1a34fa..00000000 --- a/linker/plugins/relay/RelayStartup.cs +++ /dev/null @@ -1,100 +0,0 @@ -using linker.config; -using linker.messenger.relay.client; -using linker.messenger.relay.client.transport; -using linker.messenger.relay.server; -using linker.messenger.relay.server.caching; -using linker.messenger.relay.server.validator; -using linker.plugins.relay.client; -using linker.plugins.relay.messenger; -using linker.plugins.relay.server; -using linker.plugins.relay.server.validator; -using linker.startup; -using MemoryPack; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.plugins.relay -{ - /// - /// 中继插件 - /// - public sealed class RelayStartup : IStartup - { - public StartupLevel Level => StartupLevel.Normal; - public string Name => "relay"; - - public bool Required => false; - - public string[] Dependent => new string[] { "messenger", "signin", "serialize", "config" }; - - public StartupLoadType LoadType => StartupLoadType.Normal; - - public void AddClient(ServiceCollection serviceCollection, FileConfig config) - { - serviceCollection.AddSingleton(); - - - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - - MemoryPackFormatterProvider.Register(new RelayTestInfoFormatter()); - MemoryPackFormatterProvider.Register(new RelayInfoFormatter()); - MemoryPackFormatterProvider.Register(new RelayServerNodeReportInfoFormatter()); - MemoryPackFormatterProvider.Register(new RelayAskResultInfoFormatter()); - MemoryPackFormatterProvider.Register(new RelayCacheInfoFormatter()); - MemoryPackFormatterProvider.Register(new RelayMessageInfoFormatter()); - - - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - } - - public void AddServer(ServiceCollection serviceCollection, FileConfig config) - { - - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - MemoryPackFormatterProvider.Register(new RelayTestInfoFormatter()); - MemoryPackFormatterProvider.Register(new RelayInfoFormatter()); - MemoryPackFormatterProvider.Register(new RelayServerNodeReportInfoFormatter()); - MemoryPackFormatterProvider.Register(new RelayAskResultInfoFormatter()); - MemoryPackFormatterProvider.Register(new RelayCacheInfoFormatter()); - MemoryPackFormatterProvider.Register(new RelayMessageInfoFormatter()); - - - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - } - - public void UseClient(ServiceProvider serviceProvider, FileConfig config) - { - RelayClientTransfer relayTransfer = serviceProvider.GetService(); - RelayClientTypesLoader relayTypesLoader = serviceProvider.GetService(); - } - - public void UseServer(ServiceProvider serviceProvider, FileConfig config) - { - RelayServerValidatorTypeLoader relayValidatorTypeLoader = serviceProvider.GetService(); - IRelayServerCaching relayCaching = serviceProvider.GetService(); - - PlusRelayServerReportResolver relayReportResolver = serviceProvider.GetService(); - - - RelayServerMasterTransfer relayServerMasterTransfer = serviceProvider.GetService(); - RelayServerNodeTransfer relayServerNodeTransfer = serviceProvider.GetService(); - } - } -} diff --git a/linker/plugins/relay/client/PlusRelayClientStore.cs b/linker/plugins/relay/client/PlusRelayClientStore.cs deleted file mode 100644 index 5a18f262..00000000 --- a/linker/plugins/relay/client/PlusRelayClientStore.cs +++ /dev/null @@ -1,36 +0,0 @@ -using linker.messenger; -using linker.messenger.relay.client; -using linker.messenger.relay.client.transport; -using linker.plugins.client; -using linker.plugins.resolver; -using System.Security.Cryptography.X509Certificates; - -namespace linker.plugins.relay.client -{ - public sealed class PlusRelayClientStore : IRelayClientStore - { - public byte Flag => (byte)(ResolverType.Relay); - - public X509Certificate2 Certificate => clientConfigTransfer.Certificate; - - public IConnection SigninConnection => clientSignInState.Connection; - - public string SecretKey => relayClientConfigTransfer.Server.SecretKey; - - public bool Disabled => relayClientConfigTransfer.Server.Disabled; - - public bool SSL => relayClientConfigTransfer.Server.SSL; - - public RelayClientType RelayType => relayClientConfigTransfer.Server.RelayType; - - private readonly RelayClientConfigTransfer relayClientConfigTransfer; - private readonly ClientSignInState clientSignInState; - private readonly ClientConfigTransfer clientConfigTransfer; - public PlusRelayClientStore(RelayClientConfigTransfer relayClientConfigTransfer, ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer) - { - this.relayClientConfigTransfer = relayClientConfigTransfer; - this.clientSignInState = clientSignInState; - this.clientConfigTransfer = clientConfigTransfer; - } - } -} diff --git a/linker/plugins/relay/client/RelaConfigSync.cs b/linker/plugins/relay/client/RelaConfigSync.cs deleted file mode 100644 index d049dcb4..00000000 --- a/linker/plugins/relay/client/RelaConfigSync.cs +++ /dev/null @@ -1,26 +0,0 @@ -using linker.plugins.config; -using MemoryPack; - -namespace linker.plugins.relay.client -{ - public sealed class RelaConfigSyncSecretKey : IConfigSync - { - public string Name => "RelaySecretKey"; - - private readonly RelayClientConfigTransfer relayClientConfigTransfer; - public RelaConfigSyncSecretKey(RelayClientConfigTransfer relayClientConfigTransfer) - { - this.relayClientConfigTransfer = relayClientConfigTransfer; - } - public Memory GetData() - { - return MemoryPackSerializer.Serialize(relayClientConfigTransfer.Server.SecretKey); - } - - public void SetData(Memory data) - { - string value = MemoryPackSerializer.Deserialize(data.Span); - relayClientConfigTransfer.SetServerSecretKey(value); - } - } -} diff --git a/linker/plugins/relay/client/RelayClientTypesLoader.cs b/linker/plugins/relay/client/RelayClientTypesLoader.cs deleted file mode 100644 index 7bf66dd3..00000000 --- a/linker/plugins/relay/client/RelayClientTypesLoader.cs +++ /dev/null @@ -1,13 +0,0 @@ -using linker.libs; -using linker.messenger.relay.client; -using Microsoft.Extensions.DependencyInjection; -namespace linker.plugins.relay.client -{ - public sealed partial class RelayClientTypesLoader - { - public RelayClientTypesLoader(RelayClientTransfer relayTransfer, ServiceProvider serviceProvider) - { - LoggerHelper.Instance.Info($"load relay transport:{string.Join(",", relayTransfer.Transports.Select(c => c.GetType().Name))}"); - } - } -} diff --git a/linker/plugins/relay/messenger/PlusRelayMessenger.cs b/linker/plugins/relay/messenger/PlusRelayMessenger.cs deleted file mode 100644 index a21ee33d..00000000 --- a/linker/plugins/relay/messenger/PlusRelayMessenger.cs +++ /dev/null @@ -1,33 +0,0 @@ -using linker.libs; -using linker.messenger; -using linker.messenger.signin; -using linker.messenger.relay.messenger; -using linker.messenger.relay.client; -using linker.messenger.relay.server; -using linker.messenger.relay.server.validator; - -namespace linker.plugins.relay.messenger -{ - /// - /// 中继客户端 - /// - public sealed class PlusRelayClientMessenger : RelayClientMessenger, IMessenger - { - private readonly RelayClientTransfer relayTransfer; - public PlusRelayClientMessenger(RelayClientTransfer relayTransfer, ISerializer serializer) : base(relayTransfer, serializer) - { - this.relayTransfer = relayTransfer; - } - } - - /// - /// 中继服务端 - /// - public sealed class PlusRelayServerMessenger : RelayServerMessenger, IMessenger - { - public PlusRelayServerMessenger(IMessengerSender messengerSender, SignCaching signCaching, RelayServerMasterTransfer relayServerTransfer, RelayServerValidatorTransfer relayValidatorTransfer, ISerializer serializer) - : base(messengerSender, signCaching, serializer, relayServerTransfer, relayValidatorTransfer) - { - } - } -} diff --git a/linker/plugins/relay/server/PlusRelayServerMasterStore.cs b/linker/plugins/relay/server/PlusRelayServerMasterStore.cs deleted file mode 100644 index 42b2f5dc..00000000 --- a/linker/plugins/relay/server/PlusRelayServerMasterStore.cs +++ /dev/null @@ -1,16 +0,0 @@ -using linker.messenger.relay.server; - -namespace linker.plugins.relay.server -{ - public sealed class PlusRelayServerMasterStore : IRelayServerMasterStore - { - public RelayServerMasterInfo Master => relayServerConfigTransfer.Master; - - private readonly RelayServerConfigTransfer relayServerConfigTransfer; - public PlusRelayServerMasterStore(RelayServerConfigTransfer relayServerConfigTransfer) - { - this.relayServerConfigTransfer = relayServerConfigTransfer; - } - - } -} diff --git a/linker/plugins/relay/server/PlusRelayServerNodeStore.cs b/linker/plugins/relay/server/PlusRelayServerNodeStore.cs deleted file mode 100644 index 53be40a6..00000000 --- a/linker/plugins/relay/server/PlusRelayServerNodeStore.cs +++ /dev/null @@ -1,38 +0,0 @@ -using linker.messenger.relay.server; -using linker.plugins.resolver; -using linker.plugins.server; - -namespace linker.plugins.relay.server -{ - public sealed class PlusRelayServerNodeStore : IRelayServerNodeStore - { - public byte Flag => (byte)ResolverType.RelayReport; - - public int ServicePort => serverConfigTransfer.Port; - - public RelayServerNodeInfo Node => relayServerConfigTransfer.Node; - - private readonly RelayServerConfigTransfer relayServerConfigTransfer; - private readonly ServerConfigTransfer serverConfigTransfer; - public PlusRelayServerNodeStore(RelayServerConfigTransfer relayServerConfigTransfer, ServerConfigTransfer serverConfigTransfer) - { - this.relayServerConfigTransfer = relayServerConfigTransfer; - this.serverConfigTransfer = serverConfigTransfer; - } - - public void Confirm() - { - relayServerConfigTransfer.Update(); - } - - public void SetMaxGbTotalLastBytes(ulong value) - { - relayServerConfigTransfer.SetMaxGbTotalLastBytes(value); - } - - public void SetMaxGbTotalMonth(int month) - { - relayServerConfigTransfer.SetMaxGbTotalMonth(month); - } - } -} diff --git a/linker/plugins/relay/server/PlusRelayServerReportResolver.cs b/linker/plugins/relay/server/PlusRelayServerReportResolver.cs deleted file mode 100644 index 57c9869b..00000000 --- a/linker/plugins/relay/server/PlusRelayServerReportResolver.cs +++ /dev/null @@ -1,15 +0,0 @@ -using linker.messenger.relay.server; -using linker.plugins.resolver; - -namespace linker.plugins.relay.server -{ - public class PlusRelayServerReportResolver : RelayServerReportResolver, IResolver - { - public ResolverType Type => ResolverType.RelayReport; - - public PlusRelayServerReportResolver(RelayServerMasterTransfer relayServerTransfer):base(relayServerTransfer) - { - } - - } -} diff --git a/linker/plugins/relay/server/PlusRelayServerResolver.cs b/linker/plugins/relay/server/PlusRelayServerResolver.cs deleted file mode 100644 index 4a379b82..00000000 --- a/linker/plugins/relay/server/PlusRelayServerResolver.cs +++ /dev/null @@ -1,18 +0,0 @@ -using linker.plugins.resolver; -using linker.libs; -using linker.messenger.relay.server; - -namespace linker.plugins.relay.server -{ - /// - /// 中继连接处理 - /// - public class PlusRelayServerResolver : RelayServerResolver, IResolver - { - public ResolverType Type => ResolverType.Relay; - - public PlusRelayServerResolver(RelayServerNodeTransfer relayServerNodeTransfer,ISerializer serializer):base(relayServerNodeTransfer, serializer) - { - } - } -} \ No newline at end of file diff --git a/linker/plugins/relay/server/RelayServerConfigTransfer.cs b/linker/plugins/relay/server/RelayServerConfigTransfer.cs deleted file mode 100644 index efc08c53..00000000 --- a/linker/plugins/relay/server/RelayServerConfigTransfer.cs +++ /dev/null @@ -1,32 +0,0 @@ -using linker.config; -using linker.messenger.relay.server; - -namespace linker.plugins.relay.server -{ - public sealed class RelayServerConfigTransfer - { - public string SecretKey => config.Data.Server.Relay.SecretKey; - public RelayServerNodeInfo Node=> config.Data.Server.Relay.Distributed.Node; - public RelayServerMasterInfo Master => config.Data.Server.Relay.Distributed.Master; - - - private readonly FileConfig config; - public RelayServerConfigTransfer(FileConfig config) - { - this.config = config; - } - - public void SetMaxGbTotalMonth(int month) - { - Node.MaxGbTotalMonth = month; - } - public void SetMaxGbTotalLastBytes(ulong value) - { - Node.MaxGbTotalLastBytes = value; - } - public void Update() - { - config.Data.Update(); - } - } -} diff --git a/linker/plugins/relay/server/validator/RelayServerValidatorSecretKey.cs b/linker/plugins/relay/server/validator/RelayServerValidatorSecretKey.cs deleted file mode 100644 index b47a2043..00000000 --- a/linker/plugins/relay/server/validator/RelayServerValidatorSecretKey.cs +++ /dev/null @@ -1,28 +0,0 @@ -using linker.config; -using linker.messenger.relay.server.validator; -using linker.messenger.signin; - -namespace linker.plugins.relay.server.validator -{ - public sealed class RelayServerValidatorSecretKey : IRelayServerValidator - { - private readonly FileConfig fileConfig; - private readonly RelayServerConfigTransfer relayServerConfigTransfer; - public RelayServerValidatorSecretKey(FileConfig fileConfig, RelayServerConfigTransfer relayServerConfigTransfer) - { - this.fileConfig = fileConfig; - this.relayServerConfigTransfer = relayServerConfigTransfer; - } - - public async Task Validate(linker.messenger.relay.client.transport.RelayInfo relayInfo, SignCacheInfo fromMachine, SignCacheInfo toMachine) - { - if (relayInfo.SecretKey != relayServerConfigTransfer.SecretKey) - { - return $"SecretKey validate fail"; - } - - await Task.CompletedTask; - return string.Empty; - } - } -} diff --git a/linker/plugins/relay/server/validator/RelayServerValidatorTypeLoader.cs b/linker/plugins/relay/server/validator/RelayServerValidatorTypeLoader.cs deleted file mode 100644 index 2e33c082..00000000 --- a/linker/plugins/relay/server/validator/RelayServerValidatorTypeLoader.cs +++ /dev/null @@ -1,18 +0,0 @@ -using linker.libs; -using linker.messenger.relay.server.validator; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.plugins.relay.server.validator -{ - public sealed partial class RelayServerValidatorTypeLoader - { - public RelayServerValidatorTypeLoader(RelayServerValidatorTransfer relayValidatorTransfer, ServiceProvider serviceProvider) - { - var types = GetSourceGeneratorTypes(); - var validators = types.Select(c => (IRelayServerValidator)serviceProvider.GetService(c)).Where(c => c != null).ToList(); - relayValidatorTransfer.LoadValidators(validators); - - LoggerHelper.Instance.Info($"load relay validators:{string.Join(",", validators.Select(c => c.GetType().Name))}"); - } - } -} diff --git a/linker/plugins/resolver/ResolverStartup.cs b/linker/plugins/resolver/ResolverStartup.cs deleted file mode 100644 index 7cc12ce8..00000000 --- a/linker/plugins/resolver/ResolverStartup.cs +++ /dev/null @@ -1,54 +0,0 @@ -using linker.config; -using linker.startup; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.plugins.resolver -{ - /// - /// 服务端插件 - /// - public sealed class ResolverStartup : IStartup - { - public StartupLevel Level => StartupLevel.Normal; - public string Name => "resolver"; - public bool Required => true; - public string[] Dependent => new string[] { }; - public StartupLoadType LoadType => StartupLoadType.Normal; - - public void AddClient(ServiceCollection serviceCollection, FileConfig config) - { - - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - } - - public void AddServer(ServiceCollection serviceCollection, FileConfig config) - { - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - } - - - private bool loaded = false; - public void UseClient(ServiceProvider serviceProvider, FileConfig config) - { - if (loaded == false) - { - loaded = true; - ResolverTypesLoader resolver = serviceProvider.GetService(); - - } - } - - public void UseServer(ServiceProvider serviceProvider, FileConfig config) - { - if (loaded == false) - { - loaded = true; - ResolverTypesLoader resolver = serviceProvider.GetService(); - } - } - } -} diff --git a/linker/plugins/resolver/ResolverTypesLoader.cs b/linker/plugins/resolver/ResolverTypesLoader.cs deleted file mode 100644 index 24e7824e..00000000 --- a/linker/plugins/resolver/ResolverTypesLoader.cs +++ /dev/null @@ -1,17 +0,0 @@ -using linker.libs; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.plugins.resolver -{ - public sealed partial class ResolverTypesLoader - { - public ResolverTypesLoader(ResolverTransfer resolverTransfer, ServiceProvider serviceProvider) - { - var types = GetSourceGeneratorTypes(); - var resolvers = types.Select(c => (IResolver)serviceProvider.GetService(c)).Where(c => c != null).ToList(); - resolverTransfer.LoadResolvers(resolvers); - - LoggerHelper.Instance.Info($"load resolvers:{string.Join(",", resolvers.Select(c => c.GetType().Name))}"); - } - } -} diff --git a/linker/plugins/route/RouteExcludeIPTransfer.cs b/linker/plugins/route/RouteExcludeIPTransfer.cs deleted file mode 100644 index 3e17e0a8..00000000 --- a/linker/plugins/route/RouteExcludeIPTransfer.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System.Net; - -namespace linker.plugins.route -{ - public sealed partial class RouteExcludeIPTransfer - { - private List excludeIPs; - - public RouteExcludeIPTransfer() - { - } - - public void LoadTunnelExcludeIPs(List list) - { - excludeIPs = list; - - } - - public List Get() - { - List result = new List(); - foreach (var item in excludeIPs) - { - result.AddRange(item.Get()); - } - return result; - } - } -} diff --git a/linker/plugins/route/RouteExcludeIPTypesLoader.cs b/linker/plugins/route/RouteExcludeIPTypesLoader.cs deleted file mode 100644 index 6161a0d7..00000000 --- a/linker/plugins/route/RouteExcludeIPTypesLoader.cs +++ /dev/null @@ -1,17 +0,0 @@ -using linker.libs; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.plugins.route -{ - public sealed partial class RouteExcludeIPTypesLoader - { - public RouteExcludeIPTypesLoader(RouteExcludeIPTransfer tunnelExcludeIPTransfer, ServiceProvider serviceProvider) - { - var types = GetSourceGeneratorTypes(); - var flows = types.Select(c => (IRouteExcludeIP)serviceProvider.GetService(c)).Where(c => c != null).ToList(); - tunnelExcludeIPTransfer.LoadTunnelExcludeIPs(flows); - - LoggerHelper.Instance.Info($"load route excludeips :{string.Join(",", flows.Select(c => c.GetType().Name))}"); - } - } -} diff --git a/linker/plugins/route/RouteStartup.cs b/linker/plugins/route/RouteStartup.cs deleted file mode 100644 index 98d9f79d..00000000 --- a/linker/plugins/route/RouteStartup.cs +++ /dev/null @@ -1,40 +0,0 @@ -using linker.config; -using linker.startup; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.plugins.route -{ - public sealed class RouteStartup : IStartup - { - public StartupLevel Level => StartupLevel.Normal; - public string Name => "route"; - - public bool Required => false; - - public string[] Dependent => new string[] { "messenger", "signin", "serialize", "config" }; - - public StartupLoadType LoadType => StartupLoadType.Normal; - - public void AddClient(ServiceCollection serviceCollection, FileConfig config) - { - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - } - - public void AddServer(ServiceCollection serviceCollection, FileConfig config) - { - } - - public void UseClient(ServiceProvider serviceProvider, FileConfig config) - { - RouteExcludeIPTransfer excludeIPTransfer = serviceProvider.GetService(); - RouteExcludeIPTypesLoader ruteExcludeIPTypesLoader = serviceProvider.GetService(); - - } - - public void UseServer(ServiceProvider serviceProvider, FileConfig config) - { - - } - } -} diff --git a/linker/plugins/server/ServerConfigTransfer.cs b/linker/plugins/server/ServerConfigTransfer.cs deleted file mode 100644 index c472bb20..00000000 --- a/linker/plugins/server/ServerConfigTransfer.cs +++ /dev/null @@ -1,16 +0,0 @@ -using linker.config; - -namespace linker.plugins.server -{ - public sealed class ServerConfigTransfer - { - public int Port => config.Data.Server.ServicePort; - public ServerCertificateInfo SSL => config.Data.Server.SSL; - - private readonly FileConfig config; - public ServerConfigTransfer(FileConfig config) - { - this.config = config; - } - } -} diff --git a/linker/plugins/server/ServerStartup.cs b/linker/plugins/server/ServerStartup.cs deleted file mode 100644 index dd68b38b..00000000 --- a/linker/plugins/server/ServerStartup.cs +++ /dev/null @@ -1,51 +0,0 @@ -using linker.config; -using linker.startup; -using linker.libs; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.plugins.server -{ - /// - /// 服务端插件 - /// - public sealed class ServerStartup : IStartup - { - public StartupLevel Level => StartupLevel.Normal; - public string Name => "server"; - public bool Required => true; - public string[] Dependent => new string[] { "messenger", "serialize", "firewall", "signin", "config" }; - public StartupLoadType LoadType => StartupLoadType.Normal; - - public void AddClient(ServiceCollection serviceCollection, FileConfig config) - { - } - - public void AddServer(ServiceCollection serviceCollection, FileConfig config) - { - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - } - - public void UseClient(ServiceProvider serviceProvider, FileConfig config) - { - } - - public void UseServer(ServiceProvider serviceProvider, FileConfig config) - { - ServerConfigTransfer serverConfigTransfer = serviceProvider.GetService(); - LoggerHelper.Instance.Info($"start server"); - try - { - //服务 - TcpServer tcpServer = serviceProvider.GetService(); - tcpServer.Start(serverConfigTransfer.Port); - } - catch (Exception ex) - { - LoggerHelper.Instance.Error(ex); - } - LoggerHelper.Instance.Warning($"server listen:{serverConfigTransfer.Port}"); - - } - } -} diff --git a/linker/plugins/server/config/Config.cs b/linker/plugins/server/config/Config.cs deleted file mode 100644 index 871708fe..00000000 --- a/linker/plugins/server/config/Config.cs +++ /dev/null @@ -1,31 +0,0 @@ -using linker.libs.extends; -namespace linker.config -{ - public sealed partial class ConfigInfo - { - public ConfigServerInfo Server { get; set; } = new ConfigServerInfo(); - } - public sealed partial class ConfigServerInfo : IConfig - { - public ConfigServerInfo() { } - public int ServicePort { get; set; } = 1802; - - public ServerCertificateInfo SSL { get; set; } = new ServerCertificateInfo(); - - public object Deserialize(string text) - { - return text.DeJson(); - } - public string Serialize(object obj) - { - return obj.ToJsonFormat(); - } - } - - public sealed partial class ServerCertificateInfo - { - public ServerCertificateInfo() { } - public string File { get; set; } = "./snltty.pfx"; - public string Password { get; set; } = "oeq9tw1o"; - } -} diff --git a/linker/plugins/sforward/SForwardApiController.cs b/linker/plugins/sforward/SForwardApiController.cs index 47b50975..9cc1dbf7 100644 --- a/linker/plugins/sforward/SForwardApiController.cs +++ b/linker/plugins/sforward/SForwardApiController.cs @@ -1,15 +1,15 @@ using linker.libs.api; using linker.libs.extends; using linker.client.config; -using MemoryPack; +using linker.serializer; using linker.plugins.sforward.messenger; using linker.plugins.client; using linker.plugins.capi; -using linker.plugins.messenger; using linker.config; using System.Collections.Concurrent; using linker.plugins.access; using linker.messenger; +using linker.messenger.signin; namespace linker.plugins.sforward { @@ -17,18 +17,18 @@ namespace linker.plugins.sforward { private readonly SForwardTransfer forwardTransfer; private readonly IMessengerSender messengerSender; - private readonly ClientSignInState clientSignInState; + private readonly SignInClientState signInClientState; private readonly AccessTransfer accessTransfer; - private readonly ClientConfigTransfer clientConfigTransfer; + private readonly ISignInClientStore signInClientStore; private readonly SForwardDecenter sForwardDecenter; - public SForwardClientApiController(SForwardTransfer forwardTransfer, IMessengerSender messengerSender, ClientSignInState clientSignInState, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer, SForwardDecenter sForwardDecenter) + public SForwardClientApiController(SForwardTransfer forwardTransfer, IMessengerSender messengerSender, SignInClientState signInClientState, AccessTransfer accessTransfer, ISignInClientStore signInClientStore, SForwardDecenter sForwardDecenter) { this.forwardTransfer = forwardTransfer; this.messengerSender = messengerSender; - this.clientSignInState = clientSignInState; + this.signInClientState = signInClientState; this.accessTransfer = accessTransfer; - this.clientConfigTransfer = clientConfigTransfer; + this.signInClientStore = signInClientStore; this.sForwardDecenter = sForwardDecenter; } @@ -82,7 +82,7 @@ namespace linker.plugins.sforward /// public async Task> Get(ApiControllerParamsInfo param) { - if (param.Content == clientConfigTransfer.Id) + if (param.Content == signInClientStore.Id) { if (accessTransfer.HasAccess(ClientApiAccess.ForwardShowSelf) == false) return new List(); return forwardTransfer.Get(); @@ -91,13 +91,13 @@ namespace linker.plugins.sforward var resp = await messengerSender.SendReply(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)SForwardMessengerIds.GetForward, - Payload = MemoryPackSerializer.Serialize(param.Content) + Payload = Serializer.Serialize(param.Content) }); if (resp.Code == MessageResponeCodes.OK) { - return MemoryPackSerializer.Deserialize>(resp.Data.Span); + return Serializer.Deserialize>(resp.Data.Span); } return new List(); } @@ -110,7 +110,7 @@ namespace linker.plugins.sforward public async Task Add(ApiControllerParamsInfo param) { SForwardAddForwardInfo info = param.Content.DeJson(); - if (info.MachineId == clientConfigTransfer.Id) + if (info.MachineId == signInClientStore.Id) { if (accessTransfer.HasAccess(ClientApiAccess.ForwardSelf) == false) return false; return forwardTransfer.Add(info.Data); @@ -119,9 +119,9 @@ namespace linker.plugins.sforward return await messengerSender.SendOnly(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)SForwardMessengerIds.AddClientForward, - Payload = MemoryPackSerializer.Serialize(info) + Payload = Serializer.Serialize(info) }); } @@ -133,7 +133,7 @@ namespace linker.plugins.sforward public async Task Remove(ApiControllerParamsInfo param) { SForwardRemoveForwardInfo info = param.Content.DeJson(); - if (info.MachineId == clientConfigTransfer.Id) + if (info.MachineId == signInClientStore.Id) { if (accessTransfer.HasAccess(ClientApiAccess.ForwardSelf) == false) return false; return forwardTransfer.Remove(info.Id); @@ -142,9 +142,9 @@ namespace linker.plugins.sforward if (accessTransfer.HasAccess(ClientApiAccess.ForwardOther) == false) return false; return await messengerSender.SendOnly(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)SForwardMessengerIds.RemoveClientForward, - Payload = MemoryPackSerializer.Serialize(info) + Payload = Serializer.Serialize(info) }); } @@ -155,16 +155,16 @@ namespace linker.plugins.sforward /// public async Task TestLocal(ApiControllerParamsInfo param) { - if (param.Content == clientConfigTransfer.Id) + if (param.Content == signInClientStore.Id) { forwardTransfer.TestLocal(); return true; } await messengerSender.SendOnly(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)SForwardMessengerIds.TestClientForward, - Payload = MemoryPackSerializer.Serialize(param.Content) + Payload = Serializer.Serialize(param.Content) }); return true; } diff --git a/linker/plugins/sforward/SForwardConfigSync.cs b/linker/plugins/sforward/SForwardConfigSync.cs index a6dc278c..029ff45b 100644 --- a/linker/plugins/sforward/SForwardConfigSync.cs +++ b/linker/plugins/sforward/SForwardConfigSync.cs @@ -1,5 +1,5 @@ using linker.plugins.config; -using MemoryPack; +using linker.serializer; namespace linker.plugins.sforward { @@ -14,12 +14,12 @@ namespace linker.plugins.sforward } public Memory GetData() { - return MemoryPackSerializer.Serialize(sForwardTransfer.SecretKey); + return Serializer.Serialize(sForwardTransfer.SecretKey); } public void SetData(Memory data) { - sForwardTransfer.SetSecretKey(MemoryPackSerializer.Deserialize(data.Span)); + sForwardTransfer.SetSecretKey(Serializer.Deserialize(data.Span)); } } } diff --git a/linker/plugins/sforward/SForwardDecenter.cs b/linker/plugins/sforward/SForwardDecenter.cs index 99b17c9f..b01eff7a 100644 --- a/linker/plugins/sforward/SForwardDecenter.cs +++ b/linker/plugins/sforward/SForwardDecenter.cs @@ -1,8 +1,10 @@ using linker.libs; using linker.plugins.client; -using linker.plugins.decenter; -using MemoryPack; +using linker.serializer; using System.Collections.Concurrent; +using MemoryPack; +using linker.messenger.decenter; +using linker.messenger.signin; namespace linker.plugins.sforward { @@ -13,11 +15,11 @@ namespace linker.plugins.sforward public VersionManager DataVersion { get; } = new VersionManager(); public ConcurrentDictionary CountDic { get; } = new ConcurrentDictionary(); - private readonly ClientConfigTransfer clientConfigTransfer; + private readonly ISignInClientStore signInClientStore; private readonly SForwardTransfer sForwardTransfer; - public SForwardDecenter(ClientConfigTransfer clientConfigTransfer, SForwardTransfer sForwardTransfer) + public SForwardDecenter(ISignInClientStore signInClientStore, SForwardTransfer sForwardTransfer) { - this.clientConfigTransfer = clientConfigTransfer; + this.signInClientStore = signInClientStore; this.sForwardTransfer = sForwardTransfer; } @@ -28,20 +30,20 @@ namespace linker.plugins.sforward public Memory GetData() { - CountInfo info = new CountInfo { MachineId = clientConfigTransfer.Id, Count = sForwardTransfer.Count }; + CountInfo info = new CountInfo { MachineId = signInClientStore.Id, Count = sForwardTransfer.Count }; CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count); DataVersion.Add(); - return MemoryPackSerializer.Serialize(info); + return Serializer.Serialize(info); } public void SetData(Memory data) { - CountInfo info = MemoryPackSerializer.Deserialize(data.Span); + CountInfo info = Serializer.Deserialize(data.Span); CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count); DataVersion.Add(); } public void SetData(List> data) { - List list = data.Select(c => MemoryPackSerializer.Deserialize(c.Span)).ToList(); + List list = data.Select(c => Serializer.Deserialize(c.Span)).ToList(); foreach (var info in list) { CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count); diff --git a/linker/plugins/sforward/SForwardTransfer.cs b/linker/plugins/sforward/SForwardTransfer.cs index b6a67efb..d27bde8b 100644 --- a/linker/plugins/sforward/SForwardTransfer.cs +++ b/linker/plugins/sforward/SForwardTransfer.cs @@ -1,7 +1,7 @@ using linker.client.config; using linker.libs; using linker.plugins.sforward.messenger; -using MemoryPack; +using linker.serializer; using linker.plugins.sforward.config; using System.Net.Sockets; using System.Net; @@ -10,6 +10,7 @@ using linker.plugins.client; using linker.plugins.messenger; using linker.config; using linker.messenger; +using linker.messenger.signin; namespace linker.plugins.sforward { @@ -22,22 +23,22 @@ namespace linker.plugins.sforward private readonly FileConfig fileConfig; private readonly RunningConfig running; - private readonly ClientSignInState clientSignInState; + private readonly SignInClientState signInClientState; private readonly IMessengerSender messengerSender; - private readonly ClientConfigTransfer clientConfigTransfer; + private readonly ISignInClientStore signInClientStore; private readonly NumberSpaceUInt32 ns = new NumberSpaceUInt32(); private readonly OperatingManager operatingManager = new OperatingManager(); - public SForwardTransfer(FileConfig fileConfig, RunningConfig running, ClientSignInState clientSignInState, IMessengerSender messengerSender, ClientConfigTransfer clientConfigTransfer) + public SForwardTransfer(FileConfig fileConfig, RunningConfig running, SignInClientState signInClientState, IMessengerSender messengerSender, ISignInClientStore signInClientStore) { this.fileConfig = fileConfig; this.running = running; - this.clientSignInState = clientSignInState; + this.signInClientState = signInClientState; this.messengerSender = messengerSender; - this.clientConfigTransfer = clientConfigTransfer; + this.signInClientStore = signInClientStore; - clientSignInState.NetworkFirstEnabledHandle += () => Start(); + signInClientState.NetworkFirstEnabledHandle += () => Start(); } @@ -80,14 +81,14 @@ namespace linker.plugins.sforward { messengerSender.SendReply(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)SForwardMessengerIds.Add, - Payload = MemoryPackSerializer.Serialize(new SForwardAddInfo { Domain = forwardInfo.Domain, RemotePort = forwardInfo.RemotePort, SecretKey = fileConfig.Data.Client.SForward.SecretKey }) + Payload = Serializer.Serialize(new SForwardAddInfo { Domain = forwardInfo.Domain, RemotePort = forwardInfo.RemotePort, SecretKey = fileConfig.Data.Client.SForward.SecretKey }) }).ContinueWith((result) => { if (result.Result.Code == MessageResponeCodes.OK) { - SForwardAddResultInfo sForwardAddResultInfo = MemoryPackSerializer.Deserialize(result.Result.Data.Span); + SForwardAddResultInfo sForwardAddResultInfo = Serializer.Deserialize(result.Result.Data.Span); forwardInfo.BufferSize = sForwardAddResultInfo.BufferSize; if (sForwardAddResultInfo.Success) { @@ -120,14 +121,14 @@ namespace linker.plugins.sforward { messengerSender.SendReply(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)SForwardMessengerIds.Remove, - Payload = MemoryPackSerializer.Serialize(new SForwardAddInfo { Domain = forwardInfo.Domain, RemotePort = forwardInfo.RemotePort, SecretKey = fileConfig.Data.Client.SForward.SecretKey }) + Payload = Serializer.Serialize(new SForwardAddInfo { Domain = forwardInfo.Domain, RemotePort = forwardInfo.RemotePort, SecretKey = fileConfig.Data.Client.SForward.SecretKey }) }).ContinueWith((result) => { if (result.Result.Code == MessageResponeCodes.OK) { - SForwardAddResultInfo sForwardAddResultInfo = MemoryPackSerializer.Deserialize(result.Result.Data.Span); + SForwardAddResultInfo sForwardAddResultInfo = Serializer.Deserialize(result.Result.Data.Span); if (sForwardAddResultInfo.Success) { forwardInfo.Proxy = false; diff --git a/linker/plugins/sforward/config/SForwardServerCahing.cs b/linker/plugins/sforward/config/SForwardServerCahing.cs index a56c8ed1..49e72387 100644 --- a/linker/plugins/sforward/config/SForwardServerCahing.cs +++ b/linker/plugins/sforward/config/SForwardServerCahing.cs @@ -11,8 +11,8 @@ namespace linker.plugins.sforward.config private ConcurrentDictionary serverDoamins = new ConcurrentDictionary(); private ConcurrentDictionary serverPorts = new ConcurrentDictionary(); - private readonly SignCaching signCaching; - public SForwardServerCahing(SignCaching signCaching) + private readonly SignInServerCaching signCaching; + public SForwardServerCahing(SignInServerCaching signCaching) { this.signCaching = signCaching; } diff --git a/linker/plugins/sforward/messenger/SForwardMessenger.cs b/linker/plugins/sforward/messenger/SForwardMessenger.cs index 124f4175..999181e4 100644 --- a/linker/plugins/sforward/messenger/SForwardMessenger.cs +++ b/linker/plugins/sforward/messenger/SForwardMessenger.cs @@ -1,7 +1,7 @@ using linker.client.config; using linker.plugins.sforward.config; using linker.plugins.sforward.validator; -using MemoryPack; +using linker.serializer; using linker.plugins.sforward.proxy; using linker.config; using LiteDB; @@ -9,6 +9,7 @@ using System.Net; using linker.libs; using linker.messenger; using linker.messenger.signin; +using MemoryPack; namespace linker.plugins.sforward.messenger { @@ -21,12 +22,12 @@ namespace linker.plugins.sforward.messenger private readonly SForwardProxy proxy; private readonly ISForwardServerCahing sForwardServerCahing; private readonly IMessengerSender sender; - private readonly SignCaching signCaching; + private readonly SignInServerCaching signCaching; private readonly FileConfig configWrap; private readonly ISForwardValidator validator; private readonly SForwardServerConfigTransfer sForwardServerConfigTransfer; - public SForwardServerMessenger(SForwardProxy proxy, ISForwardServerCahing sForwardServerCahing, IMessengerSender sender, SignCaching signCaching, FileConfig configWrap, ISForwardValidator validator, SForwardServerConfigTransfer sForwardServerConfigTransfer) + public SForwardServerMessenger(SForwardProxy proxy, ISForwardServerCahing sForwardServerCahing, IMessengerSender sender, SignInServerCaching signCaching, FileConfig configWrap, ISForwardValidator validator, SForwardServerConfigTransfer sForwardServerConfigTransfer) { this.proxy = proxy; proxy.WebConnect = WebConnect; @@ -47,7 +48,7 @@ namespace linker.plugins.sforward.messenger [MessengerId((ushort)SForwardMessengerIds.Add)] public async Task Add(IConnection connection) { - SForwardAddInfo sForwardAddInfo = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + SForwardAddInfo sForwardAddInfo = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); SForwardAddResultInfo result = new SForwardAddResultInfo { Success = true, BufferSize = sForwardServerConfigTransfer.BufferSize }; if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) == false) @@ -139,7 +140,7 @@ namespace linker.plugins.sforward.messenger } finally { - connection.Write(MemoryPackSerializer.Serialize(result)); + connection.Write(Serializer.Serialize(result)); } } @@ -151,7 +152,7 @@ namespace linker.plugins.sforward.messenger [MessengerId((ushort)SForwardMessengerIds.Remove)] public async Task Remove(IConnection connection) { - SForwardAddInfo sForwardAddInfo = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + SForwardAddInfo sForwardAddInfo = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); SForwardAddResultInfo result = new SForwardAddResultInfo { Success = true }; if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) == false) @@ -206,7 +207,7 @@ namespace linker.plugins.sforward.messenger } finally { - connection.Write(MemoryPackSerializer.Serialize(result)); + connection.Write(Serializer.Serialize(result)); } } @@ -218,7 +219,7 @@ namespace linker.plugins.sforward.messenger [MessengerId((ushort)SForwardMessengerIds.GetForward)] public void GetForward(IConnection connection) { - string machineId = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + string machineId = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (signCaching.TryGet(machineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId) { uint requestid = connection.ReceiveRequestWrap.RequestId; @@ -249,7 +250,7 @@ namespace linker.plugins.sforward.messenger [MessengerId((ushort)SForwardMessengerIds.AddClientForward)] public async Task AddClientForward(IConnection connection) { - SForwardAddForwardInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + SForwardAddForwardInfo info = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId) { uint requestid = connection.ReceiveRequestWrap.RequestId; @@ -257,7 +258,7 @@ namespace linker.plugins.sforward.messenger { Connection = cacheTo.Connection, MessengerId = (ushort)SForwardMessengerIds.AddClient, - Payload = MemoryPackSerializer.Serialize(info.Data) + Payload = Serializer.Serialize(info.Data) }); } } @@ -268,7 +269,7 @@ namespace linker.plugins.sforward.messenger [MessengerId((ushort)SForwardMessengerIds.RemoveClientForward)] public async Task RemoveClientForward(IConnection connection) { - SForwardRemoveForwardInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + SForwardRemoveForwardInfo info = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId) { uint requestid = connection.ReceiveRequestWrap.RequestId; @@ -276,7 +277,7 @@ namespace linker.plugins.sforward.messenger { Connection = cacheTo.Connection, MessengerId = (ushort)SForwardMessengerIds.RemoveClient, - Payload = MemoryPackSerializer.Serialize(info.Id) + Payload = Serializer.Serialize(info.Id) }); } } @@ -288,7 +289,7 @@ namespace linker.plugins.sforward.messenger [MessengerId((ushort)SForwardMessengerIds.TestClientForward)] public async Task TestClientForward(IConnection connection) { - string machineid = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + string machineid = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (signCaching.TryGet(machineid, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId) { uint requestid = connection.ReceiveRequestWrap.RequestId; @@ -316,7 +317,7 @@ namespace linker.plugins.sforward.messenger { Connection = sign.Connection, MessengerId = (ushort)SForwardMessengerIds.Proxy, - Payload = MemoryPackSerializer.Serialize(new SForwardProxyInfo { Domain = host, RemotePort = port, Id = id, BufferSize = sForwardServerConfigTransfer.BufferSize }) + Payload = Serializer.Serialize(new SForwardProxyInfo { Domain = host, RemotePort = port, Id = id, BufferSize = sForwardServerConfigTransfer.BufferSize }) }).ConfigureAwait(false); } return false; @@ -336,7 +337,7 @@ namespace linker.plugins.sforward.messenger { Connection = sign.Connection, MessengerId = (ushort)SForwardMessengerIds.Proxy, - Payload = MemoryPackSerializer.Serialize(new SForwardProxyInfo { RemotePort = port, Id = id, BufferSize = sForwardServerConfigTransfer.BufferSize }) + Payload = Serializer.Serialize(new SForwardProxyInfo { RemotePort = port, Id = id, BufferSize = sForwardServerConfigTransfer.BufferSize }) }).ConfigureAwait(false); } return false; @@ -356,7 +357,7 @@ namespace linker.plugins.sforward.messenger { Connection = sign.Connection, MessengerId = (ushort)SForwardMessengerIds.ProxyUdp, - Payload = MemoryPackSerializer.Serialize(new SForwardProxyInfo { RemotePort = port, Id = id, BufferSize = sForwardServerConfigTransfer.BufferSize }) + Payload = Serializer.Serialize(new SForwardProxyInfo { RemotePort = port, Id = id, BufferSize = sForwardServerConfigTransfer.BufferSize }) }).ConfigureAwait(false); } return false; @@ -394,7 +395,7 @@ namespace linker.plugins.sforward.messenger public void Get(IConnection connection) { List result = sForwardTransfer.Get(); - connection.Write(MemoryPackSerializer.Serialize(result)); + connection.Write(Serializer.Serialize(result)); } /// /// 添加 @@ -403,7 +404,7 @@ namespace linker.plugins.sforward.messenger [MessengerId((ushort)SForwardMessengerIds.AddClient)] public void AddClient(IConnection connection) { - SForwardInfo sForwardInfo = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + SForwardInfo sForwardInfo = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); sForwardTransfer.Add(sForwardInfo); } // @@ -413,7 +414,7 @@ namespace linker.plugins.sforward.messenger [MessengerId((ushort)SForwardMessengerIds.RemoveClient)] public void RemoveClient(IConnection connection) { - uint id = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + uint id = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); sForwardTransfer.Remove(id); } // @@ -434,7 +435,7 @@ namespace linker.plugins.sforward.messenger [MessengerId((ushort)SForwardMessengerIds.Proxy)] public void Proxy(IConnection connection) { - SForwardProxyInfo sForwardProxyInfo = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + SForwardProxyInfo sForwardProxyInfo = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); //是http if (string.IsNullOrWhiteSpace(sForwardProxyInfo.Domain) == false) @@ -464,7 +465,7 @@ namespace linker.plugins.sforward.messenger [MessengerId((ushort)SForwardMessengerIds.ProxyUdp)] public void ProxyUdp(IConnection connection) { - SForwardProxyInfo sForwardProxyInfo = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + SForwardProxyInfo sForwardProxyInfo = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (sForwardProxyInfo.RemotePort > 0) { IPEndPoint localEP = GetLocalEP(sForwardProxyInfo); diff --git a/linker/plugins/sforward/proxy/SForwardProxyTcp.cs b/linker/plugins/sforward/proxy/SForwardProxyTcp.cs index 52a3c292..0c11ffb9 100644 --- a/linker/plugins/sforward/proxy/SForwardProxyTcp.cs +++ b/linker/plugins/sforward/proxy/SForwardProxyTcp.cs @@ -233,12 +233,12 @@ namespace linker.plugins.sforward.proxy { //连接服务器 sourceSocket = new Socket(server.AddressFamily, SocketType.Stream, ProtocolType.Tcp); - sourceSocket.IPv6Only(server.AddressFamily, false); + //sourceSocket.IPv6Only(server.AddressFamily, false); await sourceSocket.ConnectAsync(server).ConfigureAwait(false); //连接本地服务 targetSocket = new Socket(service.AddressFamily, SocketType.Stream, ProtocolType.Tcp); - targetSocket.IPv6Only(service.AddressFamily, false); + //targetSocket.IPv6Only(service.AddressFamily, false); await targetSocket.ConnectAsync(service).ConfigureAwait(false); //给服务器回复,带上id diff --git a/linker/plugins/signIn/PlusSignInMessenger.cs b/linker/plugins/signIn/PlusSignInMessenger.cs deleted file mode 100644 index 753273c2..00000000 --- a/linker/plugins/signIn/PlusSignInMessenger.cs +++ /dev/null @@ -1,60 +0,0 @@ -using MemoryPack; -using linker.plugins.client; -using linker.messenger; -using linker.libs; -using linker.messenger.signin; -using linker.plugins.signin; - -namespace linker.plugins.signIn -{ - public sealed class PlusSignInClientMessenger : IMessenger - { - private readonly ClientConfigTransfer clientConfigTransfer; - private readonly ClientSignInTransfer clientSignInTransfer; - public PlusSignInClientMessenger(ClientConfigTransfer clientConfigTransfer, ClientSignInTransfer clientSignInTransfer) - { - this.clientConfigTransfer = clientConfigTransfer; - this.clientSignInTransfer = clientSignInTransfer; - } - - [MessengerId((ushort)SignInMessengerIds.SetName)] - public void Name(IConnection connection) - { - ConfigSetNameInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); - clientConfigTransfer.SetName(info.NewName); - clientSignInTransfer.ReSignIn(); - } - - } - - public sealed class PlusSignInServerMessenger : SignInServerMessenger, IMessenger - { - private readonly SignCaching signCaching; - private readonly IMessengerSender messengerSender; - - public PlusSignInServerMessenger(SignCaching signCaching, IMessengerSender messengerSender, ISerializer serializer) : base(messengerSender,signCaching, serializer) - { - this.signCaching = signCaching; - this.messengerSender = messengerSender; - } - - [MessengerId((ushort)SignInMessengerIds.SetNameForward)] - public async Task NameForward(IConnection connection) - { - ConfigSetNameInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); - if (signCaching.TryGet(info.Id, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId) - { - if (info.Id != connection.Id) - { - await messengerSender.SendOnly(new MessageRequestWrap - { - Connection = cache.Connection, - MessengerId = (ushort)SignInMessengerIds.SetName, - Payload = connection.ReceiveRequestWrap.Payload, - }).ConfigureAwait(false); - } - } - } - - } -} diff --git a/linker/plugins/signIn/SignInApiController.cs b/linker/plugins/signIn/SignInApiController.cs deleted file mode 100644 index ae7b261e..00000000 --- a/linker/plugins/signIn/SignInApiController.cs +++ /dev/null @@ -1,150 +0,0 @@ -using linker.config; -using linker.libs.api; -using linker.libs.extends; -using MemoryPack; -using linker.plugins.client; -using linker.plugins.capi; -using linker.plugins.access; -using linker.messenger; -using linker.messenger.signin; - -namespace linker.plugins.signin -{ - public sealed class SignInClientApiController : IApiClientController - { - private readonly FileConfig config; - private readonly ClientSignInState clientSignInState; - private readonly ClientConfigTransfer clientConfigTransfer; - private readonly IMessengerSender messengerSender; - private readonly AccessTransfer accessTransfer; - private readonly ClientSignInTransfer clientSignInTransfer; - - public SignInClientApiController(FileConfig config, ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer, IMessengerSender messengerSender, AccessTransfer accessTransfer, ClientSignInTransfer clientSignInTransfer) - { - this.config = config; - this.clientSignInState = clientSignInState; - this.clientConfigTransfer = clientConfigTransfer; - this.messengerSender = messengerSender; - this.accessTransfer = accessTransfer; - this.clientSignInTransfer = clientSignInTransfer; - } - - public void Set(ApiControllerParamsInfo param) - { - ConfigSetInfo info = param.Content.DeJson(); - clientConfigTransfer.SetName(info.Name); - clientConfigTransfer.SetGroup(info.Groups); - clientSignInTransfer.ReSignIn(); - } - - public async Task SetName(ApiControllerParamsInfo param) - { - ConfigSetNameInfo info = param.Content.DeJson(); - - if (info.Id == clientConfigTransfer.Id) - { - if (accessTransfer.HasAccess(ClientApiAccess.RenameSelf) == false) return false; - - clientConfigTransfer.SetName(info.NewName); - clientSignInTransfer.ReSignIn(); - } - else - { - if (accessTransfer.HasAccess(ClientApiAccess.RenameOther) == false) return false; - - await messengerSender.SendOnly(new MessageRequestWrap - { - Connection = clientSignInState.Connection, - MessengerId = (ushort)SignInMessengerIds.SetNameForward, - Payload = MemoryPackSerializer.Serialize(info) - }).ConfigureAwait(false); - } - return true; - } - public void SetGroups(ApiControllerParamsInfo param) - { - ClientGroupInfo[] info = param.Content.DeJson(); - clientConfigTransfer.SetGroup(info); - //clientSignInTransfer.ReSignIn(); - } - - [ClientApiAccessAttribute(ClientApiAccess.Config)] - public bool SetServers(ApiControllerParamsInfo param) - { - ClientServerInfo servers = param.Content.DeJson(); - clientConfigTransfer.SetServer([servers]); - //clientSignInTransfer.ReSignIn(); - return true; - } - - public ClientSignInState Info(ApiControllerParamsInfo param) - { - return clientSignInState; - } - - [ClientApiAccessAttribute(ClientApiAccess.RenameOther)] - public async Task Del(ApiControllerParamsInfo param) - { - await messengerSender.SendOnly(new MessageRequestWrap - { - Connection = clientSignInState.Connection, - MessengerId = (ushort)SignInMessengerIds.Delete, - Payload = MemoryPackSerializer.Serialize(param.Content) - }).ConfigureAwait(false); - } - public async Task SetOrder(ApiControllerParamsInfo param) - { - await messengerSender.SendOnly(new MessageRequestWrap - { - Connection = clientSignInState.Connection, - MessengerId = (ushort)SignInMessengerIds.SetOrder, - Payload = MemoryPackSerializer.Serialize(param.Content.DeJson()) - }).ConfigureAwait(false); - } - public async Task List(ApiControllerParamsInfo param) - { - SignInListRequestInfo request = param.Content.DeJson(); - MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap - { - Connection = clientSignInState.Connection, - MessengerId = (ushort)SignInMessengerIds.List, - Payload = MemoryPackSerializer.Serialize(request) - }).ConfigureAwait(false); - if (resp.Code == MessageResponeCodes.OK) - { - return MemoryPackSerializer.Deserialize(resp.Data.Span); - } - return new SignInListResponseInfo { }; - } - public async Task Ids(ApiControllerParamsInfo param) - { - SignInIdsRequestInfo request = param.Content.DeJson(); - MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap - { - Connection = clientSignInState.Connection, - MessengerId = (ushort)SignInMessengerIds.Ids, - Payload = MemoryPackSerializer.Serialize(request) - }).ConfigureAwait(false); - if (resp.Code == MessageResponeCodes.OK) - { - return MemoryPackSerializer.Deserialize(resp.Data.Span); - } - return new SignInIdsResponseInfo { }; - } - - } - - [MemoryPackable] - public sealed partial class ConfigSetNameInfo - { - public string Id { get; set; } - public string NewName { get; set; } - } - - public sealed class ConfigSetInfo - { - public string Name { get; set; } - public ClientGroupInfo[] Groups { get; set; } - } - -} diff --git a/linker/plugins/signIn/SignInConfigTransfer.cs b/linker/plugins/signIn/SignInConfigTransfer.cs deleted file mode 100644 index 38dbd696..00000000 --- a/linker/plugins/signIn/SignInConfigTransfer.cs +++ /dev/null @@ -1,31 +0,0 @@ -using linker.config; - -namespace linker.plugins.signIn -{ - public sealed class SignInConfigTransfer - { - public string SecretKey => config.Data.Server.SignIn.SecretKey; - - private readonly FileConfig config; - public SignInConfigTransfer(FileConfig config) - { - this.config = config; - } - } -} - -namespace linker.config -{ - public partial class ConfigServerInfo - { - /// - /// 登入 - /// - public SignInConfigServerInfo SignIn { get; set; } = new SignInConfigServerInfo(); - } - - public sealed class SignInConfigServerInfo - { - public string SecretKey { get; set; } = string.Empty; - } -} diff --git a/linker/plugins/signIn/SignInStartup.cs b/linker/plugins/signIn/SignInStartup.cs deleted file mode 100644 index 186b5c3c..00000000 --- a/linker/plugins/signIn/SignInStartup.cs +++ /dev/null @@ -1,81 +0,0 @@ -using linker.config; -using linker.messenger.signin; -using linker.plugins.signIn; -using linker.plugins.signIn.args; -using linker.startup; -using MemoryPack; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.plugins.signin -{ - public sealed class SignInStartup : IStartup - { - public StartupLevel Level => StartupLevel.Normal; - public string Name => "signin"; - - public bool Required => false; - - public string[] Dependent => new string[] { "messenger" }; - - public StartupLoadType LoadType => StartupLoadType.Normal; - - - public void AddClient(ServiceCollection serviceCollection, FileConfig config) - { - serviceCollection.AddSingleton(); - - MemoryPackFormatterProvider.Register(new SignInfoFormatter()); - MemoryPackFormatterProvider.Register(new SignCacheInfoFormatter()); - MemoryPackFormatterProvider.Register(new SignInListRequestInfoFormatter()); - MemoryPackFormatterProvider.Register(new SignInListResponseInfoFormatter()); - MemoryPackFormatterProvider.Register(new SignInIdsRequestInfoFormatter()); - MemoryPackFormatterProvider.Register(new SignInIdsResponseInfoFormatter()); - MemoryPackFormatterProvider.Register(new SignInIdsResponseItemInfoFormatter()); - MemoryPackFormatterProvider.Register(new SignInResponseInfoFormatter()); - - - serviceCollection.AddSingleton(); - - - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - } - - public void AddServer(ServiceCollection serviceCollection, FileConfig config) - { - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - MemoryPackFormatterProvider.Register(new SignInfoFormatter()); - MemoryPackFormatterProvider.Register(new SignCacheInfoFormatter()); - MemoryPackFormatterProvider.Register(new SignInListRequestInfoFormatter()); - MemoryPackFormatterProvider.Register(new SignInListResponseInfoFormatter()); - MemoryPackFormatterProvider.Register(new SignInIdsRequestInfoFormatter()); - MemoryPackFormatterProvider.Register(new SignInIdsResponseInfoFormatter()); - MemoryPackFormatterProvider.Register(new SignInIdsResponseItemInfoFormatter()); - MemoryPackFormatterProvider.Register(new SignInResponseInfoFormatter()); - - - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - } - - public void UseClient(ServiceProvider serviceProvider, FileConfig config) - { - SignInArgsTypesLoader signInArgsTypesLoader = serviceProvider.GetService(); - } - - public void UseServer(ServiceProvider serviceProvider, FileConfig config) - { - SignInArgsTypesLoader signInArgsTypesLoader = serviceProvider.GetService(); - } - } -} diff --git a/linker/plugins/signIn/args/SignInArgsTypesLoader.cs b/linker/plugins/signIn/args/SignInArgsTypesLoader.cs deleted file mode 100644 index f53c2186..00000000 --- a/linker/plugins/signIn/args/SignInArgsTypesLoader.cs +++ /dev/null @@ -1,19 +0,0 @@ - -using linker.libs; -using linker.messenger.signin; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.plugins.signIn.args -{ - public sealed partial class SignInArgsTypesLoader - { - public SignInArgsTypesLoader(SignInArgsTransfer signInArgsTransfer, ServiceProvider serviceProvider) - { - var types = GetSourceGeneratorTypes(); - var args = types.Select(c => (ISignInArgs)serviceProvider.GetService(c)).Where(c => c != null).ToList(); - signInArgsTransfer.LoadArgs(args); - - LoggerHelper.Instance.Info($"load sign in args:{string.Join(",", args.Select(c => c.GetType().Name))}"); - } - } -} diff --git a/linker/plugins/socks5/RouteExcludeIP.cs b/linker/plugins/socks5/RouteExcludeIP.cs deleted file mode 100644 index 7f6385c3..00000000 --- a/linker/plugins/socks5/RouteExcludeIP.cs +++ /dev/null @@ -1,18 +0,0 @@ -using linker.plugins.route; -using System.Net; - -namespace linker.plugins.socks5 -{ - public sealed class RouteExcludeIPSocks5 : IRouteExcludeIP - { - private readonly Socks5ConfigTransfer socks5ConfigTransfer; - public RouteExcludeIPSocks5(Socks5ConfigTransfer socks5ConfigTransfer) - { - this.socks5ConfigTransfer = socks5ConfigTransfer; - } - public List Get() - { - return socks5ConfigTransfer.Lans.Select(c => c.IP).ToList(); - } - } -} diff --git a/linker/plugins/socks5/Socks5ConfigTransfer.cs b/linker/plugins/socks5/Socks5ConfigTransfer.cs deleted file mode 100644 index 41469bf7..00000000 --- a/linker/plugins/socks5/Socks5ConfigTransfer.cs +++ /dev/null @@ -1,76 +0,0 @@ -using linker.client.config; -using linker.config; -using linker.libs; -using linker.plugins.socks5.config; - -namespace linker.plugins.socks5 -{ - public sealed class Socks5ConfigTransfer - { - public List Lans=> runningConfig.Data.Socks5.Lans; - public int Port=> runningConfig.Data.Socks5.Port; - - public Action OnChanged { get; set; } = () => { }; - - private readonly FileConfig config; - private readonly RunningConfig runningConfig; - private readonly TunnelProxy tunnelProxy; - private readonly SemaphoreSlim slim = new SemaphoreSlim(1); - public Socks5ConfigTransfer(FileConfig config, RunningConfig runningConfig, TunnelProxy tunnelProxy) - { - this.config = config; - this.runningConfig = runningConfig; - this.tunnelProxy = tunnelProxy; - - if (runningConfig.Data.Socks5.Running) Retstart(); - - } - - /// - /// 重启 - /// - /// - public void Retstart() - { - tunnelProxy.Start(runningConfig.Data.Socks5.Port); - runningConfig.Data.Socks5.Running = tunnelProxy.Running; - runningConfig.Data.Update(); - OnChanged(); - } - /// - /// 网卡 - /// - public void Stop() - { - tunnelProxy.Stop(); - runningConfig.Data.Socks5.Running = tunnelProxy.Running; - runningConfig.Data.Update(); - OnChanged(); - } - - /// - /// 更新本机信息 - /// - /// - public void UpdateConfig(Socks5Info info) - { - TimerHelper.Async(() => - { - int port = runningConfig.Data.Socks5.Port; - - runningConfig.Data.Socks5.Port = info.Port; - runningConfig.Data.Socks5.Lans = info.Lans; - runningConfig.Data.Update(); - - bool needReboot = (port != runningConfig.Data.Socks5.Port && runningConfig.Data.Socks5.Running) - || (runningConfig.Data.Socks5.Running && tunnelProxy.Running == false); - - if (needReboot) - { - Retstart(); - } - OnChanged(); - }); - } - } -} diff --git a/linker/plugins/socks5/Socks5Startup.cs b/linker/plugins/socks5/Socks5Startup.cs deleted file mode 100644 index 8d512146..00000000 --- a/linker/plugins/socks5/Socks5Startup.cs +++ /dev/null @@ -1,51 +0,0 @@ -using linker.config; -using linker.plugins.socks5; -using linker.plugins.socks5.messenger; -using linker.startup; -using linker.tun; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.plugins.Socks5 -{ - public sealed class Socks5Startup : IStartup - { - public StartupLevel Level => StartupLevel.Normal; - public string Name => "socks5"; - public bool Required => false; - public string[] Dependent => new string[] { "messenger", "relay", "tunnel", "signin", "serialize", "config" }; - - public StartupLoadType LoadType => StartupLoadType.Normal; - - - public void AddClient(ServiceCollection serviceCollection, FileConfig config) - { - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - serviceCollection.AddSingleton(); - - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - } - - public void AddServer(ServiceCollection serviceCollection, FileConfig config) - { - serviceCollection.AddSingleton(); - - } - - public void UseClient(ServiceProvider serviceProvider, FileConfig config) - { - TunnelProxy socks5Proxy = serviceProvider.GetService(); - - Socks5ConfigTransfer socks5ConfigTransfer = serviceProvider.GetService(); - - } - - public void UseServer(ServiceProvider serviceProvider, FileConfig config) - { - } - } -} diff --git a/linker/plugins/tunnel/PlusTunnelExternalResolver.cs b/linker/plugins/tunnel/PlusTunnelExternalResolver.cs deleted file mode 100644 index 71d83d88..00000000 --- a/linker/plugins/tunnel/PlusTunnelExternalResolver.cs +++ /dev/null @@ -1,17 +0,0 @@ -using linker.plugins.resolver; -using linker.messenger.tunnel; - -namespace linker.plugins.tunnel -{ - /// - /// 外网端口处理器 - /// - public class PlusTunnelExternalResolver : TunnelExternalResolver, IResolver - { - public ResolverType Type => ResolverType.External; - - public PlusTunnelExternalResolver() - { - } - } -} \ No newline at end of file diff --git a/linker/plugins/tunnel/PlusTunnelMessenger.cs b/linker/plugins/tunnel/PlusTunnelMessenger.cs deleted file mode 100644 index 077d921f..00000000 --- a/linker/plugins/tunnel/PlusTunnelMessenger.cs +++ /dev/null @@ -1,67 +0,0 @@ -using linker.config; -using linker.tunnel; -using linker.libs; -using linker.messenger; -using linker.messenger.tunnel; -using linker.messenger.signin; - -namespace linker.plugins.tunnel -{ - public sealed class PlusTunnelClientMessenger : TunnelClientMessenger, IMessenger - { - private readonly TunnelTransfer tunnel; - private readonly TunnelConfigTransfer tunnelConfigTransfer; - private readonly IMessengerSender messengerSender; - private readonly ISerializer serializer; - - public PlusTunnelClientMessenger(TunnelTransfer tunnel, IMessengerSender messengerSender, ISerializer serializer, TunnelConfigTransfer tunnelConfigTransfer) - : base(tunnel, messengerSender, serializer) - { - this.tunnel = tunnel; - this.messengerSender = messengerSender; - this.serializer = serializer; - this.tunnelConfigTransfer = tunnelConfigTransfer; - } - - [MessengerId((ushort)TunnelMessengerIds.RouteLevel)] - public void RouteLevel(IConnection connection) - { - TunnelTransportRouteLevelInfo tunnelTransportFileConfigInfo = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); - tunnelConfigTransfer.OnLocalRouteLevel(tunnelTransportFileConfigInfo); - } - - } - - public sealed class PlusTunnelServerMessenger : TunnelServerMessenger, IMessenger - { - private readonly SignCaching signCaching; - private readonly IMessengerSender messengerSender; - private readonly ISerializer serializer; - - public PlusTunnelServerMessenger(SignCaching signCaching, IMessengerSender messengerSender, ISerializer serializer) - : base(messengerSender, signCaching, serializer) - { - this.messengerSender = messengerSender; - this.signCaching = signCaching; - this.serializer = serializer; - } - - - [MessengerId((ushort)TunnelMessengerIds.RouteLevelForward)] - public async Task RouteLevelForward(IConnection connection) - { - TunnelTransportRouteLevelInfo tunnelTransportInfo = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); - if (signCaching.TryGet(tunnelTransportInfo.MachineId, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId) - { - await messengerSender.SendOnly(new MessageRequestWrap - { - Connection = cache.Connection, - MessengerId = (ushort)TunnelMessengerIds.RouteLevel, - Payload = connection.ReceiveRequestWrap.Payload - }).ConfigureAwait(false); - } - - } - - } -} diff --git a/linker/plugins/tunnel/PlusTunnelMessengerAdapter.cs b/linker/plugins/tunnel/PlusTunnelMessengerAdapter.cs deleted file mode 100644 index 6dc64a33..00000000 --- a/linker/plugins/tunnel/PlusTunnelMessengerAdapter.cs +++ /dev/null @@ -1,14 +0,0 @@ -using linker.plugins.client; -using linker.tunnel; - -namespace linker.plugins.tunnel -{ - public sealed class PlusTunnelMessengerAdapter - { - public PlusTunnelMessengerAdapter(ClientSignInState clientSignInState, TunnelConfigTransfer tunnelConfigTransfer, TunnelTransfer tunnelTransfer) - { - clientSignInState.NetworkEnabledHandle += (times) => tunnelTransfer.Refresh(); - tunnelConfigTransfer.OnChanged += () => tunnelTransfer.Refresh(); - } - } -} diff --git a/linker/plugins/tunnel/PlusTunnelMessengerAdapterStore.cs b/linker/plugins/tunnel/PlusTunnelMessengerAdapterStore.cs deleted file mode 100644 index fb280bfa..00000000 --- a/linker/plugins/tunnel/PlusTunnelMessengerAdapterStore.cs +++ /dev/null @@ -1,40 +0,0 @@ -using linker.tunnel.transport; -using linker.plugins.client; -using linker.messenger; -using System.Security.Cryptography.X509Certificates; -using linker.tunnel; - -namespace linker.plugins.tunnel -{ - public sealed class PlusTunnelMessengerAdapterStore : ITunnelMessengerAdapterStore - { - public IConnection SignConnection => clientSignInState.Connection; - public X509Certificate2 Certificate => tunnelConfigTransfer.Certificate; - public List TunnelTransports => tunnelConfigTransfer.Transports; - public int RouteLevelPlus => tunnelConfigTransfer.RouteLevelPlus; - - public int PortMapPrivate => tunnelConfigTransfer.PortMapLan; - public int PortMapPublic => tunnelConfigTransfer.PortMapWan; - - private readonly ClientSignInState clientSignInState; - private readonly ClientConfigTransfer clientConfigTransfer; - private readonly TunnelConfigTransfer tunnelConfigTransfer; - public PlusTunnelMessengerAdapterStore(ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer, TunnelConfigTransfer tunnelConfigTransfer) - { - this.clientSignInState = clientSignInState; - this.clientConfigTransfer = clientConfigTransfer; - this.tunnelConfigTransfer = tunnelConfigTransfer; - } - public async Task SetTunnelTransports(List list) - { - tunnelConfigTransfer.SetTransports(list); - return await Task.FromResult(true); - } - - public async Task> GetTunnelTransports() - { - return await Task.FromResult(tunnelConfigTransfer.Transports); - } - - } -} diff --git a/linker/plugins/tunnel/TunnelConfigSync.cs b/linker/plugins/tunnel/TunnelConfigSync.cs deleted file mode 100644 index dfe2bf80..00000000 --- a/linker/plugins/tunnel/TunnelConfigSync.cs +++ /dev/null @@ -1,26 +0,0 @@ -using linker.plugins.config; -using linker.tunnel.transport; -using MemoryPack; - -namespace linker.plugins.tunnel -{ - public sealed class TunnelConfigSyncTransports : IConfigSync - { - public string Name => "TunnelTransports"; - - private readonly TunnelConfigTransfer tunnelConfigTransfer; - public TunnelConfigSyncTransports( TunnelConfigTransfer tunnelConfigTransfer) - { - this.tunnelConfigTransfer = tunnelConfigTransfer; - } - public Memory GetData() - { - return MemoryPackSerializer.Serialize(tunnelConfigTransfer.Transports); - } - - public void SetData(Memory data) - { - tunnelConfigTransfer.SetTransports(MemoryPackSerializer.Deserialize>(data.Span)); - } - } -} diff --git a/linker/plugins/tunnel/TunnelConfigTransfer.cs b/linker/plugins/tunnel/TunnelConfigTransfer.cs deleted file mode 100644 index 430e5d41..00000000 --- a/linker/plugins/tunnel/TunnelConfigTransfer.cs +++ /dev/null @@ -1,200 +0,0 @@ -using linker.client.config; -using linker.config; -using linker.libs; -using linker.messenger; -using linker.plugins.client; -using linker.tunnel; -using linker.tunnel.transport; -using LiteDB; -using System.Net; -using System.Net.Quic; -using System.Security.Cryptography.X509Certificates; -using MemoryPack; -using System.Text.Json.Serialization; - - - -namespace linker.plugins.tunnel -{ - public sealed class TunnelConfigTransfer - { - public int RouteLevelPlus => running.Data.Tunnel.RouteLevelPlus; - public IPAddress[] LocalIPs => config.Data.Client.Tunnel.LocalIPs; - public IPAddress[] RouteIPs => config.Data.Client.Tunnel.RouteIPs; - public int PortMapLan => running.Data.Tunnel.PortMapLan; - public int PortMapWan => running.Data.Tunnel.PortMapWan; - public List Transports => config.Data.Client.Tunnel.Transports; - public X509Certificate2 Certificate => clientConfigTransfer.Certificate; - - private readonly FileConfig config; - private readonly RunningConfig running; - private readonly ClientSignInState clientSignInState; - private readonly IMessengerSender messengerSender; - private readonly ClientConfigTransfer clientConfigTransfer; - - public Action OnChanged { get; set; } = () => { }; - - public TunnelConfigTransfer(FileConfig config, RunningConfig running, ClientSignInState clientSignInState, IMessengerSender messengerSender, ClientConfigTransfer clientConfigTransfer) - { - this.config = config; - this.running = running; - this.clientSignInState = clientSignInState; - this.messengerSender = messengerSender; - this.clientConfigTransfer = clientConfigTransfer; - clientSignInState.NetworkEnabledHandle += (times) => - { - TimerHelper.Async(RefreshRouteLevel); - }; - TestQuic(); - } - - public void SetTransports(List transports) - { - config.Data.Client.Tunnel.Transports = transports; - config.Data.Update(); - } - - /// - /// 刷新网关等级数据 - /// - public void RefreshRouteLevel() - { - config.Data.Client.Tunnel.RouteLevel = NetworkHelper.GetRouteLevel(clientConfigTransfer.Server.Host, out List ips); - config.Data.Client.Tunnel.RouteIPs = ips.ToArray(); - config.Data.Client.Tunnel.LocalIPs = NetworkHelper.GetIPV6().Concat(NetworkHelper.GetIPV4()).ToArray(); - OnChanged(); - } - - /// - /// 修改自己的网关层级信息 - /// - /// - public void OnLocalRouteLevel(TunnelTransportRouteLevelInfo tunnelTransportRouteLevelInfo) - { - running.Data.Tunnel.RouteLevelPlus = tunnelTransportRouteLevelInfo.RouteLevelPlus; - running.Data.Tunnel.PortMapWan = tunnelTransportRouteLevelInfo.PortMapWan; - running.Data.Tunnel.PortMapLan = tunnelTransportRouteLevelInfo.PortMapLan; - running.Data.Update(); - OnChanged(); - } - public TunnelTransportRouteLevelInfo GetLocalRouteLevel() - { - return new TunnelTransportRouteLevelInfo - { - MachineId = clientConfigTransfer.Id, - RouteLevel = config.Data.Client.Tunnel.RouteLevel, - RouteLevelPlus = running.Data.Tunnel.RouteLevelPlus, - PortMapWan = running.Data.Tunnel.PortMapWan, - PortMapLan = running.Data.Tunnel.PortMapLan, - NeedReboot = false - }; - } - - private void TestQuic() - { - if (OperatingSystem.IsWindows()) - { - if (QuicListener.IsSupported == false) - { - try - { - if (File.Exists("msquic-openssl.dll")) - { - LoggerHelper.Instance.Warning($"copy msquic-openssl.dll -> msquic.dll,please restart linker"); - File.Move("msquic.dll", "msquic.dll.temp", true); - File.Move("msquic-openssl.dll", "msquic.dll", true); - - if (Environment.UserInteractive == false && OperatingSystem.IsWindows()) - { - Environment.Exit(1); - } - } - } - catch (Exception) - { - } - } - try - { - if (File.Exists("msquic.dll.temp")) - { - File.Delete("msquic.dll.temp"); - } - if (File.Exists("msquic-openssl.dll")) - { - File.Delete("msquic-openssl.dll"); - } - } - catch (Exception) - { - } - } - } - - } -} - - -namespace linker.client.config -{ - public sealed partial class RunningConfigInfo - { - /// - /// 打洞配置 - /// - public TunnelRunningInfo Tunnel { get; set; } = new TunnelRunningInfo(); - } - - public sealed class TunnelRunningInfo - { - public TunnelRunningInfo() { } - public ObjectId Id { get; set; } - /// - /// 附加的网关层级 - /// - public int RouteLevelPlus { get; set; } - - public int PortMapWan { get; set; } - public int PortMapLan { get; set; } - - } -} - -namespace linker.config -{ - public partial class ConfigClientInfo - { - public TunnelConfigClientInfo Tunnel { get; set; } = new TunnelConfigClientInfo(); - } - public sealed class TunnelConfigClientInfo - { - [JsonIgnore] - public int RouteLevel { get; set; } - - [JsonIgnore] - public IPAddress[] LocalIPs { get; set; } - - [JsonIgnore] - public IPAddress[] RouteIPs { get; set; } - - /// - /// 打洞协议列表 - /// - public List Transports { get; set; } = new List(); - } - - - [MemoryPackable] - public sealed partial class TunnelTransportRouteLevelInfo - { - public string MachineId { get; set; } - public int RouteLevel { get; set; } - public int RouteLevelPlus { get; set; } - - public bool NeedReboot { get; set; } - - public int PortMapWan { get; set; } - public int PortMapLan { get; set; } - } - -} diff --git a/linker/plugins/tunnel/TunnelDecenter.cs b/linker/plugins/tunnel/TunnelDecenter.cs deleted file mode 100644 index 5505cd7e..00000000 --- a/linker/plugins/tunnel/TunnelDecenter.cs +++ /dev/null @@ -1,51 +0,0 @@ -using linker.config; -using linker.libs; -using linker.plugins.decenter; -using MemoryPack; -using System.Collections.Concurrent; -namespace linker.plugins.tunnel -{ - public sealed class TunnelDecenter:IDecenter - { - public string Name => "tunnel"; - public VersionManager SyncVersion { get; } = new VersionManager(); - - public VersionManager DataVersion { get; } = new VersionManager(); - public ConcurrentDictionary Config { get; } = new ConcurrentDictionary(); - - private readonly TunnelConfigTransfer tunnelConfigTransfer; - public TunnelDecenter(TunnelConfigTransfer tunnelConfigTransfer) - { - this.tunnelConfigTransfer = tunnelConfigTransfer; - tunnelConfigTransfer.OnChanged += Refresh; - } - public void Refresh() - { - SyncVersion.Add(); - } - public Memory GetData() - { - TunnelTransportRouteLevelInfo tunnelTransportRouteLevelInfo = tunnelConfigTransfer.GetLocalRouteLevel(); - Config.AddOrUpdate(tunnelTransportRouteLevelInfo.MachineId, tunnelTransportRouteLevelInfo, (a, b) => tunnelTransportRouteLevelInfo); - DataVersion.Add(); - return MemoryPackSerializer.Serialize(tunnelTransportRouteLevelInfo); - } - public void SetData(Memory data) - { - TunnelTransportRouteLevelInfo tunnelTransportRouteLevelInfo = MemoryPackSerializer.Deserialize(data.Span); - Config.AddOrUpdate(tunnelTransportRouteLevelInfo.MachineId, tunnelTransportRouteLevelInfo, (a, b) => tunnelTransportRouteLevelInfo); - DataVersion.Add(); - } - public void SetData(List> data) - { - List list = data.Select(c => MemoryPackSerializer.Deserialize(c.Span)).ToList(); - foreach (var item in list) - { - Config.AddOrUpdate(item.MachineId, item, (a, b) => item); - } - TunnelTransportRouteLevelInfo config = tunnelConfigTransfer.GetLocalRouteLevel(); - Config.AddOrUpdate(config.MachineId, config, (a, b) => config); - DataVersion.Add(); - } - } -} diff --git a/linker/plugins/tunnel/TunnelExcludeIPTypesLoader.cs b/linker/plugins/tunnel/TunnelExcludeIPTypesLoader.cs deleted file mode 100644 index 10b56109..00000000 --- a/linker/plugins/tunnel/TunnelExcludeIPTypesLoader.cs +++ /dev/null @@ -1,18 +0,0 @@ -using linker.libs; -using linker.messenger.tunnel; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.plugins.tunnel -{ - public sealed partial class TunnelExcludeIPTypesLoader - { - public TunnelExcludeIPTypesLoader(TunnelExcludeIPTransfer tunnelExcludeIPTransfer, ServiceProvider serviceProvider) - { - var types = GetSourceGeneratorTypes(); - var flows = types.Select(c => (ITunnelExcludeIP)serviceProvider.GetService(c)).Where(c => c != null).ToList(); - tunnelExcludeIPTransfer.LoadTunnelExcludeIPs(flows); - - LoggerHelper.Instance.Info($"load tunnel excludeips :{string.Join(",", flows.Select(c => c.GetType().Name))}"); - } - } -} diff --git a/linker/plugins/tunnel/TunnelRouteExcludeIP.cs b/linker/plugins/tunnel/TunnelRouteExcludeIP.cs deleted file mode 100644 index 9d1738dd..00000000 --- a/linker/plugins/tunnel/TunnelRouteExcludeIP.cs +++ /dev/null @@ -1,20 +0,0 @@ -using linker.plugins.route; -using System.Net; - -namespace linker.plugins.tunnel -{ - public sealed class TunnelRouteExcludeIP : IRouteExcludeIP - { - private readonly TunnelConfigTransfer tunnelConfigTransfer; - public TunnelRouteExcludeIP(TunnelConfigTransfer tunnelConfigTransfer) - { - this.tunnelConfigTransfer = tunnelConfigTransfer; - } - public List Get() - { - return tunnelConfigTransfer.LocalIPs.Where(c => c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) - //路由上的IP - .Concat(tunnelConfigTransfer.RouteIPs).ToList(); - } - } -} diff --git a/linker/plugins/tunnel/TunnelStartup.cs b/linker/plugins/tunnel/TunnelStartup.cs deleted file mode 100644 index ec53feac..00000000 --- a/linker/plugins/tunnel/TunnelStartup.cs +++ /dev/null @@ -1,81 +0,0 @@ -using linker.config; -using linker.startup; -using linker.tunnel; -using MemoryPack; -using Microsoft.Extensions.DependencyInjection; -using linker.plugins.client; -using linker.messenger.tunnel; - -namespace linker.plugins.tunnel -{ - /// - /// 打洞插件 - /// - public sealed class TunnelStartup : IStartup - { - public StartupLevel Level => StartupLevel.Normal; - public string Name => "tunnel"; - - public bool Required => false; - - public string[] Dependent => new string[] { "messenger", "signin", "serialize", "config" }; - - public StartupLoadType LoadType => StartupLoadType.Normal; - - public void AddClient(ServiceCollection serviceCollection, FileConfig config) - { - //打洞协议 - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - //命令接口 - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - - //序列化扩展 - MemoryPackFormatterProvider.Register(new TunnelTransportWanPortInfoFormatter()); - MemoryPackFormatterProvider.Register(new TunnelTransportItemInfoFormatter()); - MemoryPackFormatterProvider.Register(new TunnelTransportInfoFormatter()); - MemoryPackFormatterProvider.Register(new TunnelWanPortProtocolInfoFormatter()); - - - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - } - - public void AddServer(ServiceCollection serviceCollection, FileConfig config) - { - MemoryPackFormatterProvider.Register(new TunnelTransportWanPortInfoFormatter()); - MemoryPackFormatterProvider.Register(new TunnelTransportItemInfoFormatter()); - MemoryPackFormatterProvider.Register(new TunnelTransportInfoFormatter()); - MemoryPackFormatterProvider.Register(new TunnelWanPortProtocolInfoFormatter()); - - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - } - - public void UseClient(ServiceProvider serviceProvider, FileConfig config) - { - TunnelExcludeIPTransfer excludeIPTransfer = serviceProvider.GetService(); - TunnelExcludeIPTypesLoader tunnelExcludeIPTypesLoader = serviceProvider.GetService(); - - ClientConfigTransfer clientConfigTransfer = serviceProvider.GetService(); - TunnelConfigTransfer tunnelConfigTransfer = serviceProvider.GetService(); - - ITunnelMessengerAdapterStore tunnelAdapter = serviceProvider.GetService(); - PlusTunnelMessengerAdapter plusTunnelMessengerAdapter = serviceProvider.GetService(); - } - - public void UseServer(ServiceProvider serviceProvider, FileConfig config) - { - - } - } -} diff --git a/linker/plugins/tuntap/ExcludeIP.cs b/linker/plugins/tuntap/ExcludeIP.cs index 2d2e483d..cf7396c1 100644 --- a/linker/plugins/tuntap/ExcludeIP.cs +++ b/linker/plugins/tuntap/ExcludeIP.cs @@ -4,7 +4,7 @@ using System.Net; namespace linker.plugins.tuntap { - public sealed class ExcludeIP : ITunnelExcludeIP + public sealed class ExcludeIP : ITunnelClientExcludeIP { private readonly TuntapConfigTransfer tuntapConfigTransfer; public ExcludeIP(TuntapConfigTransfer tuntapConfigTransfer) diff --git a/linker/plugins/tuntap/TuntapAdapter.cs b/linker/plugins/tuntap/TuntapAdapter.cs index 058534d9..9f27386c 100644 --- a/linker/plugins/tuntap/TuntapAdapter.cs +++ b/linker/plugins/tuntap/TuntapAdapter.cs @@ -1,4 +1,5 @@ using linker.libs; +using linker.messenger.signin; using linker.plugins.client; using linker.plugins.route; using linker.plugins.tuntap.config; @@ -16,27 +17,34 @@ namespace linker.plugins.tuntap private readonly TuntapConfigTransfer tuntapConfigTransfer; private readonly TuntapDecenter tuntapDecenter; private readonly TuntapProxy tuntapProxy; - private readonly ClientConfigTransfer clientConfigTransfer; + private readonly ISignInClientStore signInClientStore; private readonly RouteExcludeIPTransfer routeExcludeIPTransfer; public TuntapAdapter(TuntapTransfer tuntapTransfer, TuntapConfigTransfer tuntapConfigTransfer, TuntapDecenter tuntapDecenter, TuntapProxy tuntapProxy, - ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer, RouteExcludeIPTransfer routeExcludeIPTransfer) + SignInClientState signInClientState, ISignInClientStore signInClientStore, RouteExcludeIPTransfer routeExcludeIPTransfer) { this.tuntapTransfer = tuntapTransfer; this.tuntapConfigTransfer = tuntapConfigTransfer; this.tuntapDecenter = tuntapDecenter; this.tuntapProxy = tuntapProxy; - this.clientConfigTransfer = clientConfigTransfer; + this.signInClientStore = signInClientStore; this.routeExcludeIPTransfer = routeExcludeIPTransfer; + //与服务器连接,刷新一下IP + signInClientState.NetworkEnabledHandle += (times) => tuntapConfigTransfer.RefreshIP(); + //初始化网卡 tuntapTransfer.Init(tuntapConfigTransfer.DeviceName, this); - //与服务器连接,刷新一下IP - clientSignInState.NetworkEnabledHandle += (times) => tuntapConfigTransfer.RefreshIP(); - //配置又更新,去同步一下 + //网卡状态发生变化,同步一下信息 + tuntapTransfer.OnSetupBefore += () => { tuntapDecenter.Refresh(); }; + tuntapTransfer.OnSetupAfter += () => { tuntapDecenter.Refresh(); }; + tuntapTransfer.OnSetupSuccess += () => { AddForward(); tuntapConfigTransfer.SetRunning(true); }; + tuntapTransfer.OnShutdownBefore += () => { tuntapDecenter.Refresh(); }; + tuntapTransfer.OnShutdownAfter += () => { tuntapDecenter.Refresh(); }; + tuntapTransfer.OnShutdownSuccess += () => { DeleteForward(); tuntapConfigTransfer.SetRunning(false); }; + + //配置有更新,去同步一下 tuntapConfigTransfer.OnUpdate += tuntapDecenter.Refresh; - //配置发生变化,重启网卡 - tuntapConfigTransfer.OnChanged += RetstartDevice; //收到新的信息,添加一下路由 tuntapDecenter.OnChangeBefore += DelRoute; @@ -44,14 +52,6 @@ namespace linker.plugins.tuntap tuntapDecenter.OnReset += tuntapProxy.ClearIPs; tuntapDecenter.HandleCurrentInfo = GetCurrentInfo; - //网卡状态发生变化,同步一下信息 - tuntapTransfer.OnSetupBefore += tuntapDecenter.Refresh; - tuntapTransfer.OnSetupAfter += tuntapDecenter.Refresh; - tuntapTransfer.OnSetupSuccess += () => { tuntapDecenter.Refresh(); AddForward(); tuntapConfigTransfer.SetRunning(true); }; - tuntapTransfer.OnShutdownBefore += tuntapDecenter.Refresh; - tuntapTransfer.OnShutdownAfter += tuntapDecenter.Refresh; - tuntapTransfer.OnShutdownSuccess += () => { tuntapDecenter.Refresh(); DeleteForward(); tuntapConfigTransfer.SetRunning(false); }; - //隧道关闭 tuntapProxy.OnTunnelClose += async (connection) => { tuntapDecenter.Refresh(); await Task.CompletedTask; }; //收到隧道数据包,写入网卡 @@ -59,6 +59,24 @@ namespace linker.plugins.tuntap //IP没找到,是否需要同步一下数据 tuntapProxy.OnIPNotFound += (ip) => tuntapDecenter.Refresh(); + CheckDeviceTask(); + } + + private void CheckDeviceTask() + { + ulong configVersion = 0; + TimerHelper.SetInterval(async () => + { + bool restart = + (tuntapConfigTransfer.Version.Eq(configVersion, out ulong _version) == false || await tuntapTransfer.CheckAvailable() == false) + && tuntapConfigTransfer.Running && tuntapTransfer.Status != TuntapStatus.Running && tuntapTransfer.Status != TuntapStatus.Operating; + if (restart) + { + configVersion = _version; + await RetstartDevice(); + } + return true; + }, () => 30000); } private TuntapInfo GetCurrentInfo() { @@ -67,7 +85,7 @@ namespace linker.plugins.tuntap IP = tuntapConfigTransfer.Info.IP, Lans = tuntapConfigTransfer.Info.Lans.Where(c => c.IP != null && c.IP.Equals(IPAddress.Any) == false).Select(c => { c.Exists = false; return c; }).ToList(), PrefixLength = tuntapConfigTransfer.Info.PrefixLength, - MachineId = clientConfigTransfer.Id, + MachineId = signInClientStore.Id, Status = tuntapTransfer.Status, SetupError = tuntapTransfer.SetupError, NatError = tuntapTransfer.NatError, @@ -167,13 +185,13 @@ namespace linker.plugins.tuntap private List ParseIPs(List infos) { //排除的IP, - uint[] excludeIps = routeExcludeIPTransfer.Get().Select(NetworkHelper.IP2Value) .ToArray(); + uint[] excludeIps = routeExcludeIPTransfer.Get().Select(NetworkHelper.IP2Value).ToArray(); HashSet hashSet = new HashSet(); return infos - .Where(c => c.MachineId != clientConfigTransfer.Id) + .Where(c => c.MachineId != signInClientStore.Id) .OrderByDescending(c => c.Status) - .OrderByDescending(c => c.IP) + .OrderBy(c => c.IP, new IPAddressComparer()) .Select(c => { @@ -221,5 +239,13 @@ namespace linker.plugins.tuntap } + class IPAddressComparer : IComparer + { + public int Compare(IPAddress x, IPAddress y) + { + return (int)(NetworkHelper.IP2Value(x) - NetworkHelper.IP2Value(y)); + } + } + } } diff --git a/linker/plugins/tuntap/TuntapApiController.cs b/linker/plugins/tuntap/TuntapApiController.cs index 2648c995..2e209b6d 100644 --- a/linker/plugins/tuntap/TuntapApiController.cs +++ b/linker/plugins/tuntap/TuntapApiController.cs @@ -1,6 +1,6 @@ using linker.libs.api; using linker.plugins.tuntap.messenger; -using MemoryPack; +using linker.serializer; using linker.libs.extends; using System.Collections.Concurrent; using linker.config; @@ -15,6 +15,7 @@ using System.Net; using linker.libs; using linker.plugins.access; using linker.messenger; +using linker.messenger.signin; namespace linker.plugins.tuntap { @@ -22,29 +23,29 @@ namespace linker.plugins.tuntap { private readonly IMessengerSender messengerSender; private readonly TuntapTransfer tuntapTransfer; - private readonly ClientSignInState clientSignInState; + private readonly SignInClientState signInClientState; private readonly TuntapProxy tuntapProxy; private readonly TuntapConfigTransfer tuntapConfigTransfer; private readonly LeaseClientTreansfer leaseClientTreansfer; private readonly TuntapPingTransfer pingTransfer; private readonly AccessTransfer accessTransfer; - private readonly ClientConfigTransfer clientConfigTransfer; + private readonly ISignInClientStore signInClientStore; private readonly TuntapDecenter tuntapDecenter; private readonly TuntapAdapter tuntapAdapter; - public TuntapClientApiController(IMessengerSender messengerSender, TuntapTransfer tuntapTransfer, ClientSignInState clientSignInState, + public TuntapClientApiController(IMessengerSender messengerSender, TuntapTransfer tuntapTransfer, SignInClientState signInClientState, TuntapProxy tuntapProxy,TuntapConfigTransfer tuntapConfigTransfer, LeaseClientTreansfer leaseClientTreansfer, - TuntapPingTransfer pingTransfer, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer, TuntapDecenter tuntapDecenter, TuntapAdapter tuntapAdapter) + TuntapPingTransfer pingTransfer, AccessTransfer accessTransfer, ISignInClientStore signInClientStore, TuntapDecenter tuntapDecenter, TuntapAdapter tuntapAdapter) { this.messengerSender = messengerSender; this.tuntapTransfer = tuntapTransfer; - this.clientSignInState = clientSignInState; + this.signInClientState = signInClientState; this.tuntapProxy = tuntapProxy; this.tuntapConfigTransfer = tuntapConfigTransfer; this.leaseClientTreansfer = leaseClientTreansfer; this.pingTransfer = pingTransfer; this.accessTransfer = accessTransfer; - this.clientConfigTransfer = clientConfigTransfer; + this.signInClientStore = signInClientStore; this.tuntapDecenter = tuntapDecenter; this.tuntapAdapter = tuntapAdapter; } @@ -104,7 +105,7 @@ namespace linker.plugins.tuntap public async Task Run(ApiControllerParamsInfo param) { //运行自己的 - if (param.Content == clientConfigTransfer.Id) + if (param.Content == signInClientStore.Id) { if (accessTransfer.HasAccess(ClientApiAccess.TuntapStatusSelf) == false) return false; @@ -116,9 +117,9 @@ namespace linker.plugins.tuntap //运行别人的 await messengerSender.SendOnly(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)TuntapMessengerIds.RunForward, - Payload = MemoryPackSerializer.Serialize(param.Content) + Payload = Serializer.Serialize(param.Content) }).ConfigureAwait(false); } return true; @@ -131,7 +132,7 @@ namespace linker.plugins.tuntap public async Task Stop(ApiControllerParamsInfo param) { //停止自己的 - if (param.Content == clientConfigTransfer.Id) + if (param.Content == signInClientStore.Id) { if (accessTransfer.HasAccess(ClientApiAccess.TuntapStatusSelf) == false) return false; tuntapAdapter.StopDevice(); @@ -142,9 +143,9 @@ namespace linker.plugins.tuntap //停止别人的 await messengerSender.SendOnly(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)TuntapMessengerIds.StopForward, - Payload = MemoryPackSerializer.Serialize(param.Content) + Payload = Serializer.Serialize(param.Content) }).ConfigureAwait(false); } return true; @@ -160,7 +161,7 @@ namespace linker.plugins.tuntap TuntapInfo info = param.Content.DeJson(); //更新自己的 - if (info.MachineId == clientConfigTransfer.Id) + if (info.MachineId == signInClientStore.Id) { if (accessTransfer.HasAccess(ClientApiAccess.TuntapChangeSelf) == false) return false; tuntapConfigTransfer.Update(info); @@ -171,9 +172,9 @@ namespace linker.plugins.tuntap //更新别人的 await messengerSender.SendOnly(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)TuntapMessengerIds.UpdateForward, - Payload = MemoryPackSerializer.Serialize(info) + Payload = Serializer.Serialize(info) }).ConfigureAwait(false); } return true; @@ -242,7 +243,7 @@ namespace linker.plugins.tuntap { TuntapForwardTestWrapInfo tuntapForwardTestWrapInfo = param.Content.DeJson(); - if (tuntapForwardTestWrapInfo.MachineId == clientConfigTransfer.Id) + if (tuntapForwardTestWrapInfo.MachineId == signInClientStore.Id) { await pingTransfer.SubscribeForwardTest(tuntapForwardTestWrapInfo.List); } @@ -250,14 +251,14 @@ namespace linker.plugins.tuntap { MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)TuntapMessengerIds.SubscribeForwardTestForward, - Payload = MemoryPackSerializer.Serialize(tuntapForwardTestWrapInfo), + Payload = Serializer.Serialize(tuntapForwardTestWrapInfo), Timeout = 2000 }).ConfigureAwait(false); if (resp.Code == MessageResponeCodes.OK && resp.Data.Span.Length > 0) { - tuntapForwardTestWrapInfo = MemoryPackSerializer.Deserialize(resp.Data.Span); + tuntapForwardTestWrapInfo = Serializer.Deserialize(resp.Data.Span); } } return tuntapForwardTestWrapInfo; diff --git a/linker/plugins/tuntap/TuntapConfigTransfer.cs b/linker/plugins/tuntap/TuntapConfigTransfer.cs index 58cdc15a..8fe68706 100644 --- a/linker/plugins/tuntap/TuntapConfigTransfer.cs +++ b/linker/plugins/tuntap/TuntapConfigTransfer.cs @@ -4,6 +4,7 @@ using System.Net; using linker.plugins.client; using linker.plugins.tuntap.config; using linker.plugins.tuntap.lease; +using linker.messenger.signin; namespace linker.plugins.tuntap { @@ -14,20 +15,24 @@ namespace linker.plugins.tuntap public bool Running => Info.Running; public TuntapSwitch Switch => Info.Switch; + public VersionManager Version { get; } = new VersionManager(); + public string DeviceName => "linker"; private readonly RunningConfig runningConfig; private readonly LeaseClientTreansfer leaseClientTreansfer; - private readonly ClientConfigTransfer clientConfigTransfer; + private readonly ISignInClientStore signInClientStore; + /// + /// 有操作 + /// public Action OnUpdate { get; set; } = () => { }; - public Func OnChanged { get; set; } = async () => { await Task.CompletedTask; }; - public TuntapConfigTransfer(RunningConfig runningConfig, LeaseClientTreansfer leaseClientTreansfer, ClientConfigTransfer clientConfigTransfer) + public TuntapConfigTransfer(RunningConfig runningConfig, LeaseClientTreansfer leaseClientTreansfer, ISignInClientStore signInClientStore) { this.runningConfig = runningConfig; this.leaseClientTreansfer = leaseClientTreansfer; - this.clientConfigTransfer = clientConfigTransfer; + this.signInClientStore = signInClientStore; } /// @@ -63,7 +68,7 @@ namespace linker.plugins.tuntap if ((ip.Equals(Info.IP) == false || prefixLength != Info.PrefixLength) && Info.Running) { - await OnChanged(); + Version.Add(); } OnUpdate(); @@ -83,7 +88,7 @@ namespace linker.plugins.tuntap if ((oldIP.Equals(Info.IP) == false || prefixLength != Info.PrefixLength) && Info.Running) { - await OnChanged(); + Version.Add(); } OnUpdate(); }); @@ -109,7 +114,7 @@ namespace linker.plugins.tuntap private void LoadGroupIP() { - if (Info.Group2IP.TryGetValue(clientConfigTransfer.Group.Id, out TuntapGroup2IPInfo tuntapGroup2IPInfo)) + if (Info.Group2IP.TryGetValue(signInClientStore.Group.Id, out TuntapGroup2IPInfo tuntapGroup2IPInfo)) { if (tuntapGroup2IPInfo.IP.Equals(Info.IP) == false || tuntapGroup2IPInfo.PrefixLength != Info.PrefixLength) { @@ -121,7 +126,7 @@ namespace linker.plugins.tuntap private void SetGroupIP() { TuntapGroup2IPInfo tuntapGroup2IPInfo = new TuntapGroup2IPInfo { IP = Info.IP, PrefixLength = Info.PrefixLength }; - Info.Group2IP.AddOrUpdate(clientConfigTransfer.Group.Id, tuntapGroup2IPInfo, (a, b) => tuntapGroup2IPInfo); + Info.Group2IP.AddOrUpdate(signInClientStore.Group.Id, tuntapGroup2IPInfo, (a, b) => tuntapGroup2IPInfo); } } diff --git a/linker/plugins/tuntap/TuntapDecenter.cs b/linker/plugins/tuntap/TuntapDecenter.cs index fed26567..bd2486bb 100644 --- a/linker/plugins/tuntap/TuntapDecenter.cs +++ b/linker/plugins/tuntap/TuntapDecenter.cs @@ -1,9 +1,10 @@ using linker.libs; using linker.plugins.client; -using linker.plugins.decenter; +using linker.messenger.decenter; using linker.plugins.tuntap.config; -using MemoryPack; +using linker.serializer; using System.Collections.Concurrent; +using linker.messenger.signin; namespace linker.plugins.tuntap { @@ -24,21 +25,21 @@ namespace linker.plugins.tuntap public Func HandleCurrentInfo { get; set; } = () => { return null; }; - private readonly ClientConfigTransfer clientConfigTransfer; - public TuntapDecenter(ClientConfigTransfer clientConfigTransfer, ClientSignInState clientSignInState) + private readonly ISignInClientStore signInClientStore; + public TuntapDecenter(ISignInClientStore signInClientStore, SignInClientState signInClientState) { - this.clientConfigTransfer = clientConfigTransfer; - clientSignInState.NetworkEnabledHandle += NetworkEnable; + this.signInClientStore = signInClientStore; + signInClientState.NetworkEnabledHandle += NetworkEnable; } string groupid = string.Empty; private void NetworkEnable(int times) { - if (groupid != clientConfigTransfer.Group.Id) + if (groupid != signInClientStore.Group.Id) { tuntapInfos.Clear(); OnReset(); } - groupid = clientConfigTransfer.Group.Id; + groupid = signInClientStore.Group.Id; } public void Refresh() @@ -51,11 +52,11 @@ namespace linker.plugins.tuntap TuntapInfo info = HandleCurrentInfo(); tuntapInfos.AddOrUpdate(info.MachineId, info, (a, b) => info); DataVersion.Add(); - return MemoryPackSerializer.Serialize(info); + return Serializer.Serialize(info); } public void SetData(Memory data) { - TuntapInfo info = MemoryPackSerializer.Deserialize(data.Span); + TuntapInfo info = Serializer.Deserialize(data.Span); if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) { LoggerHelper.Instance.Debug($"tuntap got {info.IP}"); @@ -83,7 +84,7 @@ namespace linker.plugins.tuntap } public void SetData(List> data) { - List list = data.Select(c => MemoryPackSerializer.Deserialize(c.Span)).ToList(); + List list = data.Select(c => Serializer.Deserialize(c.Span)).ToList(); TimerHelper.Async(async () => { await slim.WaitAsync(); @@ -96,7 +97,7 @@ namespace linker.plugins.tuntap tuntapInfos.AddOrUpdate(item.MachineId, item, (a, b) => item); item.LastTicks.Update(); } - var removes = tuntapInfos.Keys.Except(list.Select(c => c.MachineId)).Where(c => c != clientConfigTransfer.Id).ToList(); + var removes = tuntapInfos.Keys.Except(list.Select(c => c.MachineId)).Where(c => c != signInClientStore.Id).ToList(); foreach (var item in removes) { if (tuntapInfos.TryGetValue(item, out TuntapInfo tuntapInfo)) diff --git a/linker/plugins/tuntap/TuntapDeviceStatusTransfer.cs b/linker/plugins/tuntap/TuntapDeviceStatusTransfer.cs deleted file mode 100644 index 2e64fb03..00000000 --- a/linker/plugins/tuntap/TuntapDeviceStatusTransfer.cs +++ /dev/null @@ -1,91 +0,0 @@ -using linker.libs; -using linker.plugins.tuntap.config; -using System.Net.NetworkInformation; - -namespace linker.plugins.tuntap -{ - public sealed class TuntapDeviceStatusTransfer - { - private readonly TuntapTransfer tuntapTransfer; - private readonly TuntapConfigTransfer tuntapConfigTransfer; - private readonly TuntapAdapter tuntapAdapter; - private ulong setupTimes = 0; - public TuntapDeviceStatusTransfer(TuntapTransfer tuntapTransfer, TuntapConfigTransfer tuntapConfigTransfer, TuntapAdapter tuntapAdapter) - { - this.tuntapTransfer = tuntapTransfer; - this.tuntapConfigTransfer = tuntapConfigTransfer; - this.tuntapAdapter = tuntapAdapter; - - tuntapTransfer.OnSetupSuccess += () => { setupTimes++; }; - - CheckTuntapStatusTask(); - - } - private void CheckTuntapStatusTask() - { - TimerHelper.SetInterval(async () => - { - if (setupTimes > 0 && tuntapConfigTransfer.Running && OperatingSystem.IsWindows()) - { - await InterfaceCheck().ConfigureAwait(false); - InterfaceOrder(); - } - return true; - }, () => 15000); - } - private async Task InterfaceCheck() - { - if (await InterfaceAvailable() == false && tuntapTransfer.Status != TuntapStatus.Operating) - { - LoggerHelper.Instance.Error($"tuntap inerface {tuntapConfigTransfer.DeviceName} is down, restarting"); - await Task.Delay(5000).ConfigureAwait(false); - if (await InterfaceAvailable() == false && tuntapTransfer.Status != TuntapStatus.Operating) - { - await tuntapAdapter.RetstartDevice().ConfigureAwait(false); - } - } - } - private async Task InterfaceAvailable() - { - NetworkInterface networkInterface = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(c => c.Name == tuntapConfigTransfer.DeviceName); - return networkInterface != null && networkInterface.OperationalStatus == OperationalStatus.Up && await InterfacePing(); - - async Task InterfacePing() - { - try - { - using Ping ping = new Ping(); - PingReply pingReply = await ping.SendPingAsync(tuntapConfigTransfer.IP, 500); - return pingReply.Status == IPStatus.Success; - } - catch (Exception) - { - return false; - } - } - } - - private void InterfaceOrder() - { - NetworkInterface linker = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(c => c.Name == tuntapConfigTransfer.DeviceName); - NetworkInterface first = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(); - - if (linker != null && linker.Name != first.Name) - { - int metricv4 = 0; - int metricv6 = 0; - List commands = new List { - $"netsh interface ipv4 set interface \"{tuntapConfigTransfer.DeviceName}\" metric={++metricv4}", - $"netsh interface ipv6 set interface \"{tuntapConfigTransfer.DeviceName}\" metric={++metricv6}" - }; - commands.AddRange(NetworkInterface.GetAllNetworkInterfaces() - .Where(c => c.Name != tuntapConfigTransfer.DeviceName) - .Select(c => $"netsh interface ipv4 set interface \"{c.Name}\" metric={++metricv4}")); - commands.AddRange(NetworkInterface.GetAllNetworkInterfaces() - .Where(c => c.Name != tuntapConfigTransfer.DeviceName) - .Select(c => $"netsh interface ipv6 set interface \"{c.Name}\" metric={++metricv6}")); - CommandHelper.Windows(string.Empty, commands.ToArray()); - } - } - } -} diff --git a/linker/plugins/tuntap/TuntapPingTransfer.cs b/linker/plugins/tuntap/TuntapPingTransfer.cs index 3e03d58e..37516a85 100644 --- a/linker/plugins/tuntap/TuntapPingTransfer.cs +++ b/linker/plugins/tuntap/TuntapPingTransfer.cs @@ -6,6 +6,7 @@ using System.Net; using System.Net.Sockets; using linker.libs.extends; using linker.plugins.client; +using linker.messenger.signin; namespace linker.plugins.tuntap { @@ -14,15 +15,15 @@ namespace linker.plugins.tuntap private readonly TuntapTransfer tuntapTransfer; private readonly TuntapConfigTransfer tuntapConfigTransfer; private readonly TuntapProxy tuntapProxy; - private readonly ClientConfigTransfer clientConfigTransfer; + private readonly ISignInClientStore signInClientStore; private readonly TuntapDecenter tuntapDecenter; - public TuntapPingTransfer(TuntapTransfer tuntapTransfer, TuntapConfigTransfer tuntapConfigTransfer, TuntapProxy tuntapProxy, ClientConfigTransfer clientConfigTransfer, TuntapDecenter tuntapDecenter) + public TuntapPingTransfer(TuntapTransfer tuntapTransfer, TuntapConfigTransfer tuntapConfigTransfer, TuntapProxy tuntapProxy, ISignInClientStore signInClientStore, TuntapDecenter tuntapDecenter) { this.tuntapTransfer = tuntapTransfer; this.tuntapConfigTransfer = tuntapConfigTransfer; this.tuntapProxy = tuntapProxy; - this.clientConfigTransfer = clientConfigTransfer; + this.signInClientStore = signInClientStore; this.tuntapDecenter = tuntapDecenter; PingTask(); @@ -53,7 +54,7 @@ namespace linker.plugins.tuntap if ((tuntapConfigTransfer.Switch & TuntapSwitch.AutoConnect) != TuntapSwitch.AutoConnect) { var connections = tuntapProxy.GetConnections(); - items = items.Where(c => connections.TryGetValue(c.MachineId, out ITunnelConnection connection) && connection.Connected || c.MachineId == clientConfigTransfer.Id); + items = items.Where(c => connections.TryGetValue(c.MachineId, out ITunnelConnection connection) && connection.Connected || c.MachineId == signInClientStore.Id); } await Task.WhenAll(items.Select(async c => diff --git a/linker/plugins/tuntap/TuntapProxy.cs b/linker/plugins/tuntap/TuntapProxy.cs index 5893dbff..6bcfd0df 100644 --- a/linker/plugins/tuntap/TuntapProxy.cs +++ b/linker/plugins/tuntap/TuntapProxy.cs @@ -11,6 +11,7 @@ using System.Buffers; using linker.plugins.relay.client; using linker.plugins.pcp; using linker.messenger.relay.client; +using linker.messenger.signin; namespace linker.plugins.tuntap { @@ -29,11 +30,10 @@ namespace linker.plugins.tuntap private HashSet ipRefreshCache = new HashSet(); protected override string TransactionId => "tuntap"; - public TuntapProxy(ClientConfigTransfer clientConfigTransfer, + public TuntapProxy(ISignInClientStore signInClientStore, TunnelTransfer tunnelTransfer, RelayClientTransfer relayTransfer, PcpTransfer pcpTransfer, - ClientSignInTransfer clientSignInTransfer, TuntapTransfer tuntapTransfer, ClientSignInState clientSignInState, - RelayClientConfigTransfer relayClientConfigTransfer, TuntapConfigTransfer tuntapConfigTransfer) - : base(tunnelTransfer, relayTransfer, pcpTransfer, clientSignInTransfer, clientSignInState, clientConfigTransfer, relayClientConfigTransfer) + SignInClientTransfer signInClientTransfer, RelayClientConfigTransfer relayClientConfigTransfer) + : base(tunnelTransfer, relayTransfer, pcpTransfer, signInClientTransfer, signInClientStore, relayClientConfigTransfer) { } diff --git a/linker/plugins/tuntap/TuntapStartup.cs b/linker/plugins/tuntap/TuntapStartup.cs index 00ad55b9..4cf9f2c6 100644 --- a/linker/plugins/tuntap/TuntapStartup.cs +++ b/linker/plugins/tuntap/TuntapStartup.cs @@ -34,7 +34,6 @@ namespace linker.plugins.tuntap serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); @@ -57,7 +56,6 @@ namespace linker.plugins.tuntap TuntapConfigTransfer tuntapConfigTransfer = serviceProvider.GetService(); TuntapPingTransfer tuntapPingTransfer = serviceProvider.GetService(); - TuntapDeviceStatusTransfer tuntapDeviceStatusTransfer = serviceProvider.GetService(); TuntapAdapter tuntapAdapter = serviceProvider.GetService(); } diff --git a/linker/plugins/tuntap/TuntapTransfer.cs b/linker/plugins/tuntap/TuntapTransfer.cs index c31e34d8..88ba2458 100644 --- a/linker/plugins/tuntap/TuntapTransfer.cs +++ b/linker/plugins/tuntap/TuntapTransfer.cs @@ -133,6 +133,9 @@ namespace linker.plugins.tuntap { linkerTunDeviceAdapter.DelRoute(ips); } - + public async Task CheckAvailable() + { + return await linkerTunDeviceAdapter.CheckAvailable(); + } } } diff --git a/linker/plugins/tuntap/config/config.cs b/linker/plugins/tuntap/config/config.cs index c1b8ffbf..aaafa154 100644 --- a/linker/plugins/tuntap/config/config.cs +++ b/linker/plugins/tuntap/config/config.cs @@ -5,7 +5,6 @@ using System.Collections.Concurrent; using System.Net; - namespace linker.client.config { public sealed partial class RunningConfigInfo diff --git a/linker/plugins/tuntap/lease/LeaseClientTreansfer.cs b/linker/plugins/tuntap/lease/LeaseClientTreansfer.cs index 5b86a06d..f77330fb 100644 --- a/linker/plugins/tuntap/lease/LeaseClientTreansfer.cs +++ b/linker/plugins/tuntap/lease/LeaseClientTreansfer.cs @@ -1,22 +1,22 @@ using System.Net; -using MemoryPack; +using linker.serializer; using linker.plugins.client; -using linker.plugins.messenger; using linker.plugins.tuntap.messenger; using linker.libs; using linker.messenger; +using linker.messenger.signin; namespace linker.plugins.tuntap.lease { public sealed class LeaseClientTreansfer { private readonly IMessengerSender messengerSender; - private readonly ClientSignInState clientSignInState; + private readonly SignInClientState signInClientState; - public LeaseClientTreansfer(IMessengerSender messengerSender, ClientSignInState clientSignInState) + public LeaseClientTreansfer(IMessengerSender messengerSender, SignInClientState signInClientState) { this.messengerSender = messengerSender; - this.clientSignInState = clientSignInState; + this.signInClientState = signInClientState; LeaseExpTask(); } @@ -25,22 +25,22 @@ namespace linker.plugins.tuntap.lease { await messengerSender.SendOnly(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)TuntapMessengerIds.LeaseAddNetwork, - Payload = MemoryPackSerializer.Serialize(info) + Payload = Serializer.Serialize(info) }); } public async Task GetNetwork() { MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)TuntapMessengerIds.LeaseGetNetwork }); if (resp.Code == MessageResponeCodes.OK) { - LeaseInfo info = MemoryPackSerializer.Deserialize(resp.Data.Span); + LeaseInfo info = Serializer.Deserialize(resp.Data.Span); return info; } return new LeaseInfo { IP = IPAddress.Any, PrefixLength = 24 }; @@ -49,7 +49,7 @@ namespace linker.plugins.tuntap.lease { await messengerSender.SendOnly(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)TuntapMessengerIds.LeaseChangeForward }); } @@ -58,14 +58,14 @@ namespace linker.plugins.tuntap.lease { MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)TuntapMessengerIds.LeaseIP, - Payload = MemoryPackSerializer.Serialize(new LeaseInfo { IP = ip, PrefixLength = prefixLength }) + Payload = Serializer.Serialize(new LeaseInfo { IP = ip, PrefixLength = prefixLength }) }); if (resp.Code == MessageResponeCodes.OK) { - LeaseInfo newip = MemoryPackSerializer.Deserialize(resp.Data.Span); + LeaseInfo newip = Serializer.Deserialize(resp.Data.Span); if (newip.Equals(IPAddress.Any) == false) { return newip; @@ -80,7 +80,7 @@ namespace linker.plugins.tuntap.lease { await messengerSender.SendReply(new MessageRequestWrap { - Connection = clientSignInState.Connection, + Connection = signInClientState.Connection, MessengerId = (ushort)TuntapMessengerIds.LeaseExp, }); diff --git a/linker/plugins/tuntap/messenger/TuntapMessenger.cs b/linker/plugins/tuntap/messenger/TuntapMessenger.cs index 7d816255..3e97c7c2 100644 --- a/linker/plugins/tuntap/messenger/TuntapMessenger.cs +++ b/linker/plugins/tuntap/messenger/TuntapMessenger.cs @@ -4,7 +4,7 @@ using linker.messenger; using linker.messenger.signin; using linker.plugins.tuntap.config; using linker.plugins.tuntap.lease; -using MemoryPack; +using linker.serializer; namespace linker.plugins.tuntap.messenger { @@ -57,7 +57,7 @@ namespace linker.plugins.tuntap.messenger [MessengerId((ushort)TuntapMessengerIds.Update)] public void Update(IConnection connection) { - TuntapInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + TuntapInfo info = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); tuntapConfigTransfer.Update(info); } @@ -75,7 +75,7 @@ namespace linker.plugins.tuntap.messenger [MessengerId((ushort)TuntapMessengerIds.SubscribeForwardTest)] public void SubscribeForwardTest(IConnection connection) { - TuntapForwardTestWrapInfo tuntapForwardTestWrapInfo = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + TuntapForwardTestWrapInfo tuntapForwardTestWrapInfo = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); uint requestid = connection.ReceiveRequestWrap.RequestId; pingTransfer.SubscribeForwardTest(tuntapForwardTestWrapInfo.List).ContinueWith((result) => @@ -85,7 +85,7 @@ namespace linker.plugins.tuntap.messenger Connection = connection, RequestId = requestid, Code = MessageResponeCodes.OK, - Payload = MemoryPackSerializer.Serialize(tuntapForwardTestWrapInfo) + Payload = Serializer.Serialize(tuntapForwardTestWrapInfo) }, (ushort)TuntapMessengerIds.SubscribeForwardTest); }); } @@ -95,11 +95,11 @@ namespace linker.plugins.tuntap.messenger public sealed class TuntapServerMessenger : IMessenger { private readonly IMessengerSender messengerSender; - private readonly SignCaching signCaching; + private readonly SignInServerCaching signCaching; private readonly FileConfig config; private readonly LeaseServerTreansfer leaseTreansfer; - public TuntapServerMessenger(IMessengerSender messengerSender, SignCaching signCaching, FileConfig config, LeaseServerTreansfer leaseTreansfer) + public TuntapServerMessenger(IMessengerSender messengerSender, SignInServerCaching signCaching, FileConfig config, LeaseServerTreansfer leaseTreansfer) { this.messengerSender = messengerSender; this.signCaching = signCaching; @@ -115,7 +115,7 @@ namespace linker.plugins.tuntap.messenger [MessengerId((ushort)TuntapMessengerIds.RunForward)] public async Task RunForward(IConnection connection) { - string name = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + string name = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (signCaching.TryGet(name, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId) { await messengerSender.SendOnly(new MessageRequestWrap @@ -135,7 +135,7 @@ namespace linker.plugins.tuntap.messenger [MessengerId((ushort)TuntapMessengerIds.StopForward)] public async Task StopForward(IConnection connection) { - string name = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + string name = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (signCaching.TryGet(name, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId) { await messengerSender.SendOnly(new MessageRequestWrap @@ -155,7 +155,7 @@ namespace linker.plugins.tuntap.messenger [MessengerId((ushort)TuntapMessengerIds.UpdateForward)] public async Task UpdateForward(IConnection connection) { - TuntapInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + TuntapInfo info = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (signCaching.TryGet(info.MachineId, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId) { await messengerSender.SendOnly(new MessageRequestWrap @@ -176,7 +176,7 @@ namespace linker.plugins.tuntap.messenger [MessengerId((ushort)TuntapMessengerIds.LeaseAddNetwork)] public void LeaseAddNetwork(IConnection connection) { - LeaseInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + LeaseInfo info = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (signCaching.TryGet(connection.Id, out SignCacheInfo cache)) { leaseTreansfer.AddNetwork(cache.GroupId, info); @@ -192,7 +192,7 @@ namespace linker.plugins.tuntap.messenger { if (signCaching.TryGet(connection.Id, out SignCacheInfo cache)) { - connection.Write(MemoryPackSerializer.Serialize(leaseTreansfer.GetNetwork(cache.GroupId))); + connection.Write(Serializer.Serialize(leaseTreansfer.GetNetwork(cache.GroupId))); } } /// @@ -203,11 +203,11 @@ namespace linker.plugins.tuntap.messenger [MessengerId((ushort)TuntapMessengerIds.LeaseIP)] public void LeaseIP(IConnection connection) { - LeaseInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + LeaseInfo info = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (signCaching.TryGet(connection.Id, out SignCacheInfo cache)) { LeaseInfo result = leaseTreansfer.LeaseIP(cache.MachineId, cache.GroupId, info); - connection.Write(MemoryPackSerializer.Serialize(result)); + connection.Write(Serializer.Serialize(result)); } } /// @@ -253,7 +253,7 @@ namespace linker.plugins.tuntap.messenger public void SubscribeForwardTestForward(IConnection connection) { uint requestid = connection.ReceiveRequestWrap.RequestId; - TuntapForwardTestWrapInfo tuntapForwardTestWrapInfo = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + TuntapForwardTestWrapInfo tuntapForwardTestWrapInfo = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); if (signCaching.TryGet(tuntapForwardTestWrapInfo.MachineId, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId) { diff --git a/linker/plugins/updater/UpdaterConfigSync.cs b/linker/plugins/updater/UpdaterConfigSync.cs deleted file mode 100644 index 7486eed4..00000000 --- a/linker/plugins/updater/UpdaterConfigSync.cs +++ /dev/null @@ -1,25 +0,0 @@ -using linker.plugins.config; -using MemoryPack; - -namespace linker.plugins.updater -{ - public sealed class UpdaterConfigSyncSecretKey : IConfigSync - { - public string Name => "UpdaterSecretKey"; - - private readonly UpdaterClientTransfer updaterClientTransfer; - public UpdaterConfigSyncSecretKey(UpdaterClientTransfer updaterClientTransfer) - { - this.updaterClientTransfer = updaterClientTransfer; - } - public Memory GetData() - { - return MemoryPackSerializer.Serialize(updaterClientTransfer.SecretKey); - } - - public void SetData(Memory data) - { - updaterClientTransfer.SetSecretKey(MemoryPackSerializer.Deserialize(data.Span)); - } - } -} diff --git a/linker/plugins/updater/UpdaterStartup.cs b/linker/plugins/updater/UpdaterStartup.cs deleted file mode 100644 index d98c7883..00000000 --- a/linker/plugins/updater/UpdaterStartup.cs +++ /dev/null @@ -1,56 +0,0 @@ -using linker.config; -using linker.plugins.updater.messenger; -using linker.startup; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.plugins.updater -{ - /// - /// 自动更新组件 - /// - public sealed class UpdaterStartup : IStartup - { - public string Name => "updater"; - - public bool Required => false; - - public StartupLevel Level => StartupLevel.Normal; - - public string[] Dependent => new string[] { "messenger", "signin", "serialize", "config" }; - - public StartupLoadType LoadType => StartupLoadType.Normal; - - public void AddClient(ServiceCollection serviceCollection, FileConfig config) - { - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - serviceCollection.AddSingleton(); - - serviceCollection.AddSingleton(); - } - - public void AddServer(ServiceCollection serviceCollection, FileConfig config) - { - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - - serviceCollection.AddSingleton(); - - serviceCollection.AddSingleton(); - } - - public void UseClient(ServiceProvider serviceProvider, FileConfig config) - { - _ = serviceProvider.GetService(); - } - - public void UseServer(ServiceProvider serviceProvider, FileConfig config) - { - _ = serviceProvider.GetService(); - } - } -} diff --git a/linker/plugins/updater/config/config.cs b/linker/plugins/updater/config/config.cs deleted file mode 100644 index 71b230cb..00000000 --- a/linker/plugins/updater/config/config.cs +++ /dev/null @@ -1,81 +0,0 @@ -using linker.libs; -using MemoryPack; - - -namespace linker.config -{ - public sealed partial class ConfigCommonInfo - { - public string UpdateUrl { get; set; } = "https://static.qbcode.cn/downloads/linker"; - public int UpdateIntervalSeconds { get; set; } = 60; - } -} - -namespace linker.plugins.updater.config -{ - [MemoryPackable] - public sealed partial class UpdaterConfirmInfo - { - public string MachineId { get; set; } - public string Version { get; set; } - public string SecretKey { get; set; } - public bool GroupAll { get; set; } - public bool All { get; set; } - } - [MemoryPackable] - public sealed partial class UpdaterConfirmV149Info - { - public string MachineId { get; set; } - public string Version { get; set; } - public bool All { get; set; } - } - - [MemoryPackable] - public sealed partial class UpdaterConfirmServerInfo - { - public string SecretKey { get; set; } - public string Version { get; set; } - } -} - - -namespace linker.config -{ - public partial class ConfigClientInfo - { - /// - /// 服务器穿透配置 - /// - public UpdaterConfigClientInfo Updater { get; set; } = new UpdaterConfigClientInfo(); - } - - public sealed class UpdaterConfigClientInfo - { - /// - /// 密钥 - /// - public string SecretKey { get; set; } = Helper.GlobalString; - } - - public partial class ConfigServerInfo - { - /// - /// 服务器穿透配置 - /// - public UpdaterConfigServerInfo Updater { get; set; } = new UpdaterConfigServerInfo(); - } - - public sealed class UpdaterConfigServerInfo - { - /// - /// 密钥 - /// -#if DEBUG - public string SecretKey { get; set; } = Helper.GlobalString; -#else - public string SecretKey { get; set; } = Guid.NewGuid().ToString().ToUpper(); -#endif - } - - -} \ No newline at end of file diff --git a/linker/serializer/SerializerStartup.cs b/linker/serializer/SerializerStartup.cs deleted file mode 100644 index ad31d154..00000000 --- a/linker/serializer/SerializerStartup.cs +++ /dev/null @@ -1,49 +0,0 @@ -using linker.config; -using linker.libs; -using linker.startup; -using MemoryPack; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.serializer -{ - /// - /// MemoryPack 序列化扩展加载插件 - /// - public sealed class SerializerStartup : IStartup - { - public StartupLevel Level => StartupLevel.Hight9; - public string Name => "serialize"; - public bool Required => false; - public string[] Dependent => Array.Empty(); - public StartupLoadType LoadType => StartupLoadType.Normal; - - public void AddClient(ServiceCollection serviceCollection, FileConfig config) - { - MemoryPackFormatterProvider.Register(new IPEndPointFormatter()); - MemoryPackFormatterProvider.Register(new IPAddressFormatter()); - MemoryPackFormatterProvider.Register(new TunnelConnectionFormatter()); - MemoryPackFormatterProvider.Register(new ConnectionFormatter()); - - serviceCollection.AddSingleton(); - } - - public void AddServer(ServiceCollection serviceCollection, FileConfig config) - { - MemoryPackFormatterProvider.Register(new IPEndPointFormatter()); - MemoryPackFormatterProvider.Register(new IPAddressFormatter()); - MemoryPackFormatterProvider.Register(new TunnelConnectionFormatter()); - MemoryPackFormatterProvider.Register(new ConnectionFormatter()); - - serviceCollection.AddSingleton(); - } - - - public void UseClient(ServiceProvider serviceProvider, FileConfig config) - { - } - - public void UseServer(ServiceProvider serviceProvider, FileConfig config) - { - } - } -} diff --git a/linker/startup/IStartup.cs b/linker/startup/IStartup.cs deleted file mode 100644 index 4782f205..00000000 --- a/linker/startup/IStartup.cs +++ /dev/null @@ -1,74 +0,0 @@ -using linker.config; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.startup -{ - public interface IStartup - { - /// - /// 插件名 - /// - public string Name { get; } - /// - /// 必须的 - /// - public bool Required { get; } - /// - /// 加载顺序 - /// - public StartupLevel Level { get; } - /// - /// 依赖哪些插件 - /// - public string[] Dependent { get; } - /// - /// 加载方式 - /// - public StartupLoadType LoadType { get; } - - public void AddClient(ServiceCollection serviceCollection, FileConfig config); - public void UseClient(ServiceProvider serviceProvider, FileConfig config); - - public void AddServer(ServiceCollection serviceCollection, FileConfig config); - public void UseServer(ServiceProvider serviceProvider, FileConfig config); - } - - public enum StartupLoadType - { - /// - /// 正常加载 - /// - Normal = 0, - /// - /// 作为依赖,不主动加载,当被其它插件依赖时加载 - /// - Dependent = 1, - } - - public enum StartupLevel - { - Bottom = int.MinValue, - - Low9 = -9, - Low8 = -8, - Low7 = -7, - Low6 = -6, - Low5 = -5, - Low4 = -4, - Low3 = -3, - Low2 = -2, - Low1 = -1, - Normal = 0, - Hight1 = 1, - Hight2 = 2, - Hight3 = 3, - Hight4 = 4, - Hight5 = 5, - Hight6 = 6, - Hight7 = 7, - Hight8 = 8, - Hight9 = 9, - - Top = int.MaxValue - } -} diff --git a/linker/startup/StartupTransfer.cs b/linker/startup/StartupTransfer.cs deleted file mode 100644 index 76627325..00000000 --- a/linker/startup/StartupTransfer.cs +++ /dev/null @@ -1,63 +0,0 @@ -using linker.config; -using linker.libs; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.startup -{ - public static partial class StartupTransfer - { - static List startups = new List(); - /// - /// 反射读取所有插件 - /// - /// - /// - public static void Init(FileConfig config) - { - startups = GetSourceGeneratorInstances().OrderByDescending(c => c.Level).Distinct().ToList(); - } - - /// - /// 注入 - /// - /// - /// - public static void Add(ServiceCollection serviceCollection, FileConfig config) - { - LoggerHelper.Instance.Info($"add startup : {string.Join(",", startups.Select(c => c.GetType().Name))}"); - foreach (var startup in startups) - { - if (config.Data.Common.Modes.Contains("client")) - { - startup.AddClient(serviceCollection, config); - } - if (config.Data.Common.Modes.Contains("server")) - { - startup.AddServer(serviceCollection, config); - } - } - } - - /// - /// 启动 - /// - /// - /// - /// - public static void Use(ServiceProvider serviceProvider, FileConfig config) - { - LoggerHelper.Instance.Info($"use startup : {string.Join(",", startups.Select(c => c.GetType().Name))}"); - foreach (var startup in startups) - { - if (config.Data.Common.Modes.Contains("client")) - { - startup.UseClient(serviceProvider, config); - } - if (config.Data.Common.Modes.Contains("server")) - { - startup.UseServer(serviceProvider, config); - } - } - } - } -} diff --git a/linker/store/StoreStartup.cs b/linker/store/StoreStartup.cs deleted file mode 100644 index f3c2ad76..00000000 --- a/linker/store/StoreStartup.cs +++ /dev/null @@ -1,46 +0,0 @@ -using linker.config; -using linker.startup; -using Microsoft.Extensions.DependencyInjection; - -namespace linker.store -{ - /// - /// 持久化加载插件 - /// - public sealed class StoreStartup : IStartup - { - public StartupLevel Level => StartupLevel.Normal; - public string Name => "database"; - public bool Required => false; - public string[] Dependent => Array.Empty(); - public StartupLoadType LoadType => StartupLoadType.Normal; - - bool loaded = false; - public void AddClient(ServiceCollection serviceCollection, FileConfig config) - { - Add(serviceCollection, config); - } - - public void AddServer(ServiceCollection serviceCollection, FileConfig config) - { - Add(serviceCollection, config); - } - - private void Add(ServiceCollection serviceCollection, FileConfig config) - { - if (loaded == false) - { - loaded = true; - serviceCollection.AddSingleton(); - } - } - - public void UseClient(ServiceProvider serviceProvider, FileConfig config) - { - } - - public void UseServer(ServiceProvider serviceProvider, FileConfig config) - { - } - } -} diff --git a/version.txt b/version.txt index 6de01f3d..50072840 100644 --- a/version.txt +++ b/version.txt @@ -1,5 +1,5 @@ v1.6.4 -2024-12-22 17:59:01 +2024-12-29 20:38:35 1. 优化代码,解耦,简单几步将打洞和中继集成到你自己的项目中 2. 增加了组件组合demo 3. 测试中,不要更,不要更,不要更 \ No newline at end of file diff --git a/ymls/nuget.yml b/ymls/nuget.yml index 800f68a1..08c7e5ca 100644 --- a/ymls/nuget.yml +++ b/ymls/nuget.yml @@ -28,6 +28,7 @@ jobs: dotnet build ./linker.messenger.relay -c release dotnet build ./linker.messenger.signin -c release dotnet build ./linker.messenger.tunnel -c release + dotnet build ./linker.messenger.decenter -c release - name: Pack run: | @@ -38,6 +39,7 @@ jobs: dotnet pack ./linker.messenger.relay -c release dotnet pack ./linker.messenger.signin -c release dotnet pack ./linker.messenger.tunnel -c release + dotnet pack ./linker.messenger.decenter -c release - name: Install Nuget uses: nuget/setup-nuget@v1 @@ -53,3 +55,4 @@ jobs: nuget push ./linker.messenger/bin/release/linker.messenger.relay.{{version}}.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol nuget push ./linker.messenger/bin/release/linker.messenger.signin.{{version}}.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol nuget push ./linker.messenger/bin/release/linker.messenger.tunnel.{{version}}.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol + nuget push ./linker.messenger/bin/release/linker.messenger.decenter.{{version}}.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol