From ec19ca5d8bbb65532a7de573f790942ed1d5190e Mon Sep 17 00:00:00 2001 From: snltty <1069410172@qq.com> Date: Sun, 7 Jul 2024 20:01:27 +0800 Subject: [PATCH] sync --- linker.tunnel/TunnelTransfer.cs | 6 +- linker.tunnel/adapter/ITunnelAdapter.cs | 4 +- .../wanport/TunnelWanPortTransfer.cs | 1 + linker.web/src/apis/forward.js | 3 + linker.web/src/apis/running.js | 5 + linker.web/src/apis/sforward.js | 3 + linker.web/src/apis/signin.js | 3 + linker.web/src/assets/style.css | 9 +- linker.web/src/components/Head.vue | 89 ---- linker.web/src/components/status/Api.vue | 99 ++++- linker.web/src/main.js | 3 +- .../src/views/devices/ConnectionsEdit.vue | 9 +- linker.web/src/views/devices/Device.vue | 12 +- linker.web/src/views/devices/Forward.vue | 12 +- linker.web/src/views/devices/ForwardCopy.vue | 154 +++++++ linker.web/src/views/devices/ForwardEdit.vue | 13 +- linker.web/src/views/devices/List.vue | 411 +++--------------- linker.web/src/views/devices/SForwardCopy.vue | 146 +++++++ linker.web/src/views/devices/SForwardEdit.vue | 13 +- linker.web/src/views/devices/Tunnel.vue | 19 +- linker.web/src/views/devices/TunnelEdit.vue | 5 +- linker.web/src/views/devices/Tuntap.vue | 17 +- linker.web/src/views/devices/TuntapEdit.vue | 6 +- linker.web/src/views/devices/connections.js | 102 +++++ linker.web/src/views/devices/devices.js | 95 ++++ linker.web/src/views/devices/forward.js | 69 +++ linker.web/src/views/devices/sforward.js | 61 +++ linker.web/src/views/devices/tunnel.js | 49 +++ linker.web/src/views/devices/tuntap.js | 62 +++ linker.web/src/views/settings/ExcludeIP.vue | 5 +- .../src/views/settings/RelayServers.vue | 5 +- linker.web/src/views/settings/SForward.vue | 3 + .../src/views/settings/SignInServers.vue | 5 +- linker.web/src/views/settings/Transports.vue | 5 +- .../src/views/settings/TunnelServers.vue | 5 +- linker.web/src/views/settings/Version.vue | 50 +++ linker/client/ClientSignInTransfer.cs | 1 + linker/client/ClientStartup.cs | 5 +- .../config/RunningConfigApiController.cs | 28 ++ linker/client/config/RunningConfigTransfer.cs | 37 +- .../plugins/forward/ForwardApiController.cs | 26 +- linker/plugins/forward/config/Config.cs | 6 + .../forward/messenger/ForwardMessenger.cs | 54 +++ .../forward/messenger/ForwardMessengerIds.cs | 3 + linker/plugins/relay/RelayTransfer.cs | 1 + .../plugins/sforward/SForwardApiController.cs | 22 +- linker/plugins/sforward/SForwardTransfer.cs | 2 +- .../sforward/messenger/SForwardMessenger.cs | 68 ++- .../messenger/SForwardMessengerIds.cs | 3 + linker/plugins/signIn/SignInApiController.cs | 15 + .../signIn/messenger/SignInMessenger.cs | 67 ++- .../signIn/messenger/SignInMessengerIds.cs | 2 + linker/plugins/tunnel/TunnelAdapter.cs | 8 +- linker/plugins/tunnel/TunnelApiController.cs | 4 +- linker/plugins/tunnel/TunnelConfigTransfer.cs | 19 +- .../tunnel/messenger/TunnelMessenger.cs | 6 +- 56 files changed, 1384 insertions(+), 551 deletions(-) create mode 100644 linker.web/src/apis/running.js create mode 100644 linker.web/src/views/devices/ForwardCopy.vue create mode 100644 linker.web/src/views/devices/SForwardCopy.vue create mode 100644 linker.web/src/views/devices/connections.js create mode 100644 linker.web/src/views/devices/devices.js create mode 100644 linker.web/src/views/devices/forward.js create mode 100644 linker.web/src/views/devices/sforward.js create mode 100644 linker.web/src/views/devices/tunnel.js create mode 100644 linker.web/src/views/devices/tuntap.js create mode 100644 linker.web/src/views/settings/Version.vue create mode 100644 linker/client/config/RunningConfigApiController.cs diff --git a/linker.tunnel/TunnelTransfer.cs b/linker.tunnel/TunnelTransfer.cs index 579227db..06ddbb78 100644 --- a/linker.tunnel/TunnelTransfer.cs +++ b/linker.tunnel/TunnelTransfer.cs @@ -42,6 +42,7 @@ namespace linker.tunnel } var transportItems = tunnelAdapter.GetTunnelTransports(); + var names = transportItems.Select(c => c.Name); transportItems = transportItems.Concat(transports.Select(c => new TunnelTransportItemInfo { Label = c.Label, @@ -74,8 +75,7 @@ namespace linker.tunnel } } - - tunnelAdapter.SetTunnelTransports(transportItems); + tunnelAdapter.SetTunnelTransports(transportItems, names.SequenceEqual(transportItems.Select(c => c.Name)) == false); LoggerHelper.Instance.Warning($"load tunnel transport:{string.Join(",", transports.Select(c => c.Name))}"); LoggerHelper.Instance.Warning($"used tunnel transport:{string.Join(",", transportItems.Where(c => c.Disabled == false).Select(c => c.Name))}"); @@ -136,7 +136,7 @@ namespace linker.tunnel foreach (var wanPortProtocol in tunnelAdapter.GetTunnelWanPortProtocols().Where(c => c.Disabled == false && string.IsNullOrWhiteSpace(c.Host) == false)) { - + //这个打洞协议不支持这个外网端口协议 if ((transport.AllowWanPortProtocolType & wanPortProtocol.ProtocolType) != wanPortProtocol.ProtocolType) { diff --git a/linker.tunnel/adapter/ITunnelAdapter.cs b/linker.tunnel/adapter/ITunnelAdapter.cs index 5f48fe6c..b50b043d 100644 --- a/linker.tunnel/adapter/ITunnelAdapter.cs +++ b/linker.tunnel/adapter/ITunnelAdapter.cs @@ -26,7 +26,7 @@ namespace linker.tunnel.adapter /// 保存外网端口协议列表 /// /// - public void SetTunnelWanPortProtocols(List protocols); + public void SetTunnelWanPortProtocols(List protocols,bool updateVersion); /// /// 获取打洞协议列表 @@ -37,7 +37,7 @@ namespace linker.tunnel.adapter /// 保存打洞协议列表 /// /// - public void SetTunnelTransports(List transports); + public void SetTunnelTransports(List transports, bool updateVersion); /// /// 获取本地网络信息 diff --git a/linker.tunnel/wanport/TunnelWanPortTransfer.cs b/linker.tunnel/wanport/TunnelWanPortTransfer.cs index 716ccc51..a4a266e4 100644 --- a/linker.tunnel/wanport/TunnelWanPortTransfer.cs +++ b/linker.tunnel/wanport/TunnelWanPortTransfer.cs @@ -14,6 +14,7 @@ namespace linker.tunnel.wanport public TunnelWanPortTransfer() { + } /// diff --git a/linker.web/src/apis/forward.js b/linker.web/src/apis/forward.js index 4c854826..9145e190 100644 --- a/linker.web/src/apis/forward.js +++ b/linker.web/src/apis/forward.js @@ -10,6 +10,9 @@ export const removeForwardConnection = (id) => { export const getForwardInfo = () => { return sendWebsocketMsg('forwardclient/get'); } +export const getForwardRemoteInfo = (data) => { + return sendWebsocketMsg('forwardclient/getremote', data); +} export const getForwardIpv4 = () => { return sendWebsocketMsg('forwardclient/bindips'); } diff --git a/linker.web/src/apis/running.js b/linker.web/src/apis/running.js new file mode 100644 index 00000000..50513199 --- /dev/null +++ b/linker.web/src/apis/running.js @@ -0,0 +1,5 @@ +import { sendWebsocketMsg } from './request' + +export const updateVersion = (data) => { + return sendWebsocketMsg('RunningConfig/UpdateVersion', data); +} diff --git a/linker.web/src/apis/sforward.js b/linker.web/src/apis/sforward.js index a72e31a9..7aa098a5 100644 --- a/linker.web/src/apis/sforward.js +++ b/linker.web/src/apis/sforward.js @@ -9,6 +9,9 @@ export const setSForwardSecretKey = (data) => { export const getSForwardInfo = () => { return sendWebsocketMsg('sforwardclient/get'); } +export const getSForwardRemoteInfo = (data) => { + return sendWebsocketMsg('sforwardclient/getremote', data); +} export const removeSForwardInfo = (id) => { return sendWebsocketMsg('sforwardclient/remove', id); } diff --git a/linker.web/src/apis/signin.js b/linker.web/src/apis/signin.js index 204b4ff1..9e786323 100644 --- a/linker.web/src/apis/signin.js +++ b/linker.web/src/apis/signin.js @@ -16,6 +16,9 @@ export const getSignInfo = () => { export const getSignInList = (data) => { return sendWebsocketMsg('signInclient/List', data); } +export const getSignInIds = (data) => { + return sendWebsocketMsg('signInclient/ids', data); +} export const signInDel = (machineId) => { return sendWebsocketMsg('signInclient/del', machineId); } diff --git a/linker.web/src/assets/style.css b/linker.web/src/assets/style.css index 01037771..9becf7a4 100644 --- a/linker.web/src/assets/style.css +++ b/linker.web/src/assets/style.css @@ -304,14 +304,11 @@ span.split-pad10 { background-color: #fafafa; } -.el-table--border, -.el-table--group, -.el-table-filter, -.el-table td, -.el-table th.is-leaf { - border-color: var(--main-border-color); +.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); } diff --git a/linker.web/src/components/Head.vue b/linker.web/src/components/Head.vue index bae38401..3f07466a 100644 --- a/linker.web/src/components/Head.vue +++ b/linker.web/src/components/Head.vue @@ -20,105 +20,16 @@ - -
-
- 接口 : -
-
- 秘钥 : -
-
- -
diff --git a/linker.web/src/main.js b/linker.web/src/main.js index 760fa33f..891e756a 100644 --- a/linker.web/src/main.js +++ b/linker.web/src/main.js @@ -15,7 +15,7 @@ import 'element-plus/theme-chalk/display.css' import 'element-plus/theme-chalk/dark/css-vars.css' import { - ArrowDown, Top, Bottom, Delete, Plus, Select, Refresh + ArrowDown, Top, Bottom, Delete, Plus, Select, Refresh, Search } from '@element-plus/icons-vue' app.component(ArrowDown.name, ArrowDown); app.component(Top.name, Top); @@ -24,6 +24,7 @@ app.component(Delete.name, Delete); app.component(Plus.name, Plus); app.component(Select.name, Select); app.component(Refresh.name, Refresh); +app.component(Search.name, Search); app.use(ElementPlus, { size: 'default' }).use(router).mount('#app'); diff --git a/linker.web/src/views/devices/ConnectionsEdit.vue b/linker.web/src/views/devices/ConnectionsEdit.vue index e90cac01..5c42ab6f 100644 --- a/linker.web/src/views/devices/ConnectionsEdit.vue +++ b/linker.web/src/views/devices/ConnectionsEdit.vue @@ -51,16 +51,17 @@ + \ No newline at end of file diff --git a/linker.web/src/views/devices/ForwardEdit.vue b/linker.web/src/views/devices/ForwardEdit.vue index 884d1802..9d5909bb 100644 --- a/linker.web/src/views/devices/ForwardEdit.vue +++ b/linker.web/src/views/devices/ForwardEdit.vue @@ -4,6 +4,7 @@
添加 刷新 + 复制转发配置
@@ -96,11 +97,12 @@ + \ No newline at end of file diff --git a/linker.web/src/views/devices/SForwardEdit.vue b/linker.web/src/views/devices/SForwardEdit.vue index 20e740eb..e16a04fd 100644 --- a/linker.web/src/views/devices/SForwardEdit.vue +++ b/linker.web/src/views/devices/SForwardEdit.vue @@ -1,9 +1,10 @@ + \ No newline at end of file diff --git a/linker/client/ClientSignInTransfer.cs b/linker/client/ClientSignInTransfer.cs index df919cef..9792905b 100644 --- a/linker/client/ClientSignInTransfer.cs +++ b/linker/client/ClientSignInTransfer.cs @@ -176,6 +176,7 @@ namespace linker.client public async Task UpdateServers(ClientServerInfo[] servers) { await SetServers(servers); + runningConfigTransfer.IncrementVersion(configKey); SyncServers(); } private void SetServers(Memory data) diff --git a/linker/client/ClientStartup.cs b/linker/client/ClientStartup.cs index 07c309af..0ce5ef36 100644 --- a/linker/client/ClientStartup.cs +++ b/linker/client/ClientStartup.cs @@ -5,6 +5,7 @@ using System.Reflection; using linker.client.args; using linker.client.config; using linker.config; +using linker.client.config.messenger; namespace linker.client { @@ -23,6 +24,8 @@ namespace linker.client { serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); @@ -43,7 +46,7 @@ namespace linker.client public void AddServer(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) { - + serviceCollection.AddSingleton(); } public void UseServer(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) { diff --git a/linker/client/config/RunningConfigApiController.cs b/linker/client/config/RunningConfigApiController.cs new file mode 100644 index 00000000..94749e51 --- /dev/null +++ b/linker/client/config/RunningConfigApiController.cs @@ -0,0 +1,28 @@ +using linker.libs.api; +using linker.client.capi; +using linker.libs.extends; + +namespace linker.client.config +{ + public sealed class RunningConfigApiController : IApiClientController + { + private readonly RunningConfigTransfer runningConfigTransfer; + + public RunningConfigApiController(RunningConfigTransfer runningConfigTransfer) + { + this.runningConfigTransfer = runningConfigTransfer; + } + + public void UpdateVersion(ApiControllerParamsInfo param) + { + UpdateVersionInfo info = param.Content.DeJson(); + runningConfigTransfer.UpdateVersion(info.Key, info.Version); + } + + public sealed class UpdateVersionInfo + { + public string Key { get; set; } + public ulong Version { get; set; } + } + } +} diff --git a/linker/client/config/RunningConfigTransfer.cs b/linker/client/config/RunningConfigTransfer.cs index dbfd5312..69fa2ce6 100644 --- a/linker/client/config/RunningConfigTransfer.cs +++ b/linker/client/config/RunningConfigTransfer.cs @@ -2,7 +2,6 @@ using linker.libs; using linker.server; using MemoryPack; -using System; using System.Collections.Concurrent; namespace linker.client.config @@ -45,7 +44,7 @@ namespace linker.client.config public Memory InputConfig(ConfigVersionInfo info) { - CheckVersion(info.Key, out ulong version); + ulong version = GetVersion(info.Key); if (setters.TryGetValue(info.Key, out Action> setter) && info.Version > version) { @@ -54,7 +53,12 @@ namespace linker.client.config } else if (getters.TryGetValue(info.Key, out Func> getter) && version > info.Version) { - return getter(); + return MemoryPackSerializer.Serialize(new ConfigVersionInfo + { + Data = getter(), + Key = info.Key, + Version = version + }); } return Helper.EmptyArray; @@ -64,8 +68,7 @@ namespace linker.client.config private object syncLockObj = new(); public void Sync(string key, Memory data) { - CheckVersion(key, out ulong version); - + ulong version = GetVersion(key); sender.SendReply(new MessageRequestWrap { Connection = clientSignInState.Connection, @@ -93,31 +96,25 @@ namespace linker.client.config }); } - private void CheckVersion(string key, out ulong version) - { - if (runningConfig.Data.Versions.TryGetValue(key, out version) == false) - { - version = 1; - } - else - { - version++; - } - runningConfig.Data.Versions[key] = version; - runningConfig.Data.Update(); - } private ulong GetVersion(string key) { if (runningConfig.Data.Versions.TryGetValue(key, out ulong version) == false) { - return 0; + version = 1; + runningConfig.Data.Versions[key] = version; + runningConfig.Data.Update(); } return version; } - private void UpdateVersion(string key, ulong version) + public void UpdateVersion(string key, ulong version) { runningConfig.Data.Versions[key] = version; runningConfig.Data.Update(); } + public void IncrementVersion(string key) + { + ulong version = GetVersion(key); + UpdateVersion(key, version + 1); + } } } diff --git a/linker/plugins/forward/ForwardApiController.cs b/linker/plugins/forward/ForwardApiController.cs index c1882b91..da19c4ac 100644 --- a/linker/plugins/forward/ForwardApiController.cs +++ b/linker/plugins/forward/ForwardApiController.cs @@ -7,6 +7,10 @@ using linker.libs; using linker.plugins.forward.proxy; using linker.tunnel.connection; using System.Collections.Concurrent; +using linker.plugins.forward.messenger; +using linker.server; +using linker.client; +using MemoryPack; namespace linker.plugins.forward { @@ -14,11 +18,15 @@ namespace linker.plugins.forward { private readonly ForwardTransfer forwardTransfer; private readonly ForwardProxy forwardProxy; + private readonly MessengerSender messengerSender; + private readonly ClientSignInState clientSignInState; - public ForwardClientApiController(ForwardTransfer forwardTransfer, ForwardProxy forwardProxy) + public ForwardClientApiController(ForwardTransfer forwardTransfer, ForwardProxy forwardProxy, MessengerSender messengerSender, ClientSignInState clientSignInState) { this.forwardTransfer = forwardTransfer; this.forwardProxy = forwardProxy; + this.messengerSender = messengerSender; + this.clientSignInState = clientSignInState; } public ConcurrentDictionary Connections(ApiControllerParamsInfo param) @@ -51,6 +59,21 @@ namespace linker.plugins.forward { return forwardTransfer.Get(); } + public async Task> GetRemote(ApiControllerParamsInfo param) + { + GetForwardInfo request = param.Content.DeJson(); + MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap + { + Connection = clientSignInState.Connection, + MessengerId = (ushort)ForwardMessengerIds.GetForward, + Payload = MemoryPackSerializer.Serialize(request) + }).ConfigureAwait(false); + if (resp.Code == MessageResponeCodes.OK) + { + return MemoryPackSerializer.Deserialize>(resp.Data.Span); + } + return new List(); + } public IPAddress[] BindIPs(ApiControllerParamsInfo param) { @@ -62,7 +85,6 @@ namespace linker.plugins.forward ForwardInfo info = param.Content.DeJson(); return forwardTransfer.Add(info); } - public bool Remove(ApiControllerParamsInfo param) { if (uint.TryParse(param.Content, out uint id)) diff --git a/linker/plugins/forward/config/Config.cs b/linker/plugins/forward/config/Config.cs index a0a965c2..53efa1a4 100644 --- a/linker/plugins/forward/config/Config.cs +++ b/linker/plugins/forward/config/Config.cs @@ -40,4 +40,10 @@ namespace linker.client.config public List EndPoints { get; set; } } + [MemoryPackable] + public sealed partial class GetForwardInfo + { + public string MachineId { get; set; } + public string ToMachineId { get; set; } + } } diff --git a/linker/plugins/forward/messenger/ForwardMessenger.cs b/linker/plugins/forward/messenger/ForwardMessenger.cs index 0cd7bfe0..ed8d98f0 100644 --- a/linker/plugins/forward/messenger/ForwardMessenger.cs +++ b/linker/plugins/forward/messenger/ForwardMessenger.cs @@ -1,7 +1,9 @@ using linker.client.config; using linker.plugins.signin.messenger; using linker.server; +using LiteDB; using MemoryPack; +using System.Net; namespace linker.plugins.forward.messenger { @@ -45,6 +47,34 @@ namespace linker.plugins.forward.messenger }); } } + + [MessengerId((ushort)ForwardMessengerIds.GetForward)] + public void GetForward(IConnection connection) + { + GetForwardInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + if (signCaching.TryGet(info.MachineId, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache1.GroupId == cache.GroupId) + { + uint requestid = connection.ReceiveRequestWrap.RequestId; + sender.SendReply(new MessageRequestWrap + { + Connection = cache.Connection, + MessengerId = (ushort)ForwardMessengerIds.Get, + Payload = connection.ReceiveRequestWrap.Payload + }).ContinueWith(async (result) => + { + if (result.Result.Code == MessageResponeCodes.OK) + { + await sender.ReplyOnly(new MessageResponseWrap + { + Connection = connection, + Code = MessageResponeCodes.OK, + Payload = result.Result.Data, + RequestId = requestid + }).ConfigureAwait(false); + } + }); + } + } } public sealed class ForwardClientMessenger : IMessenger @@ -75,7 +105,31 @@ namespace linker.plugins.forward.messenger }).ConfigureAwait(false); }); } + + [MessengerId((ushort)ForwardMessengerIds.Get)] + public void Get(IConnection connection) + { + GetForwardInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + if (forwardTransfer.Get().TryGetValue(info.ToMachineId, out List list)) + { + var result = list.Select(c => new ForwardRemoteInfo { BufferSize = c.BufferSize, Name = c.Name, Port = c.Port, TargetEP = c.TargetEP }).ToList(); + connection.Write(MemoryPackSerializer.Serialize(result)); + return; + } + connection.Write(MemoryPackSerializer.Serialize(new List())); + } } + [MemoryPackable] + public sealed partial class ForwardRemoteInfo + { + public string Name { get; set; } + public int Port { get; set; } + + [MemoryPackAllowSerialize] + public IPEndPoint TargetEP { get; set; } + + public byte BufferSize { get; set; } = 3; + } } diff --git a/linker/plugins/forward/messenger/ForwardMessengerIds.cs b/linker/plugins/forward/messenger/ForwardMessengerIds.cs index 6bf64f19..4a7cf461 100644 --- a/linker/plugins/forward/messenger/ForwardMessengerIds.cs +++ b/linker/plugins/forward/messenger/ForwardMessengerIds.cs @@ -7,6 +7,9 @@ TestForward = 2401, Test = 2402, + GetForward = 2403, + Get = 2404, + Max = 2499 } } diff --git a/linker/plugins/relay/RelayTransfer.cs b/linker/plugins/relay/RelayTransfer.cs index 8c14d213..69d95134 100644 --- a/linker/plugins/relay/RelayTransfer.cs +++ b/linker/plugins/relay/RelayTransfer.cs @@ -85,6 +85,7 @@ namespace linker.plugins.relay { running.Data.Relay.Servers = servers; running.Data.Update(); + runningConfigTransfer.IncrementVersion(configKey); SyncServers(); } private void SetServers(Memory data) diff --git a/linker/plugins/sforward/SForwardApiController.cs b/linker/plugins/sforward/SForwardApiController.cs index 4e1a746a..7d48b7e4 100644 --- a/linker/plugins/sforward/SForwardApiController.cs +++ b/linker/plugins/sforward/SForwardApiController.cs @@ -2,24 +2,22 @@ using linker.libs.extends; using linker.client.capi; using linker.client.config; -using linker.server; using linker.client; -using linker.plugins.sforward.messenger; +using linker.server; using MemoryPack; +using linker.plugins.sforward.messenger; namespace linker.plugins.sforward { public sealed class SForwardClientApiController : IApiClientController { private readonly SForwardTransfer forwardTransfer; - private readonly RunningConfig runningConfig; private readonly MessengerSender messengerSender; private readonly ClientSignInState clientSignInState; - public SForwardClientApiController(SForwardTransfer forwardTransfer, RunningConfig runningConfig, MessengerSender messengerSender, ClientSignInState clientSignInState) + public SForwardClientApiController(SForwardTransfer forwardTransfer, MessengerSender messengerSender, ClientSignInState clientSignInState) { this.forwardTransfer = forwardTransfer; - this.runningConfig = runningConfig; this.messengerSender = messengerSender; this.clientSignInState = clientSignInState; } @@ -38,6 +36,20 @@ namespace linker.plugins.sforward { return forwardTransfer.Get(); } + public async Task> GetRemote(ApiControllerParamsInfo param) + { + MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap + { + Connection = clientSignInState.Connection, + MessengerId = (ushort)SForwardMessengerIds.GetForward, + Payload = MemoryPackSerializer.Serialize(param.Content) + }).ConfigureAwait(false); + if (resp.Code == MessageResponeCodes.OK) + { + return MemoryPackSerializer.Deserialize>(resp.Data.Span); + } + return new List(); + } public bool Add(ApiControllerParamsInfo param) { diff --git a/linker/plugins/sforward/SForwardTransfer.cs b/linker/plugins/sforward/SForwardTransfer.cs index a59db280..40bf83ca 100644 --- a/linker/plugins/sforward/SForwardTransfer.cs +++ b/linker/plugins/sforward/SForwardTransfer.cs @@ -46,6 +46,7 @@ namespace linker.plugins.sforward { running.Data.SForwardSecretKey = key; running.Data.Update(); + runningConfigTransfer.IncrementVersion(configKey); SyncKey(); } private void SetSecretKey(Memory data) @@ -237,7 +238,6 @@ namespace linker.plugins.sforward Start(); running.Data.SForwards.Remove(old); running.Data.Update(); - return true; } } diff --git a/linker/plugins/sforward/messenger/SForwardMessenger.cs b/linker/plugins/sforward/messenger/SForwardMessenger.cs index f5d82447..0aedd645 100644 --- a/linker/plugins/sforward/messenger/SForwardMessenger.cs +++ b/linker/plugins/sforward/messenger/SForwardMessenger.cs @@ -6,6 +6,9 @@ using linker.server; using MemoryPack; using linker.plugins.sforward.proxy; using linker.config; +using LiteDB; +using System.Net; +using linker.plugins.forward.messenger; namespace linker.plugins.sforward.messenger { @@ -151,6 +154,34 @@ namespace linker.plugins.sforward.messenger } } + [MessengerId((ushort)SForwardMessengerIds.GetForward)] + public void GetForward(IConnection connection) + { + string machineId = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + if (signCaching.TryGet(machineId, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache1.GroupId == cache.GroupId) + { + uint requestid = connection.ReceiveRequestWrap.RequestId; + sender.SendReply(new MessageRequestWrap + { + Connection = cache.Connection, + MessengerId = (ushort)SForwardMessengerIds.Get, + Payload = connection.ReceiveRequestWrap.Payload + }).ContinueWith(async (result) => + { + if (result.Result.Code == MessageResponeCodes.OK) + { + await sender.ReplyOnly(new MessageResponseWrap + { + Connection = connection, + Code = MessageResponeCodes.OK, + Payload = result.Result.Data, + RequestId = requestid + }).ConfigureAwait(false); + } + }); + } + } + private async Task WebConnect(string host, int port, ulong id) { if (sForwardServerCahing.TryGet(host, out string machineId) && signCaching.TryGet(machineId, out SignCacheInfo sign) && sign.Connected) @@ -159,7 +190,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= configWrap.Data.Server.SForward.BufferSize }) + Payload = MemoryPackSerializer.Serialize(new SForwardProxyInfo { Domain = host, RemotePort = port, Id = id, BufferSize = configWrap.Data.Server.SForward.BufferSize }) }).ConfigureAwait(false); } return false; @@ -196,11 +227,13 @@ namespace linker.plugins.sforward.messenger { private readonly SForwardProxy proxy; private readonly RunningConfig runningConfig; + private readonly SForwardTransfer sForwardTransfer; - public SForwardClientMessenger(SForwardProxy proxy, RunningConfig runningConfig) + public SForwardClientMessenger(SForwardProxy proxy, RunningConfig runningConfig, SForwardTransfer sForwardTransfer) { this.proxy = proxy; this.runningConfig = runningConfig; + this.sForwardTransfer = sForwardTransfer; } [MessengerId((ushort)SForwardMessengerIds.Proxy)] @@ -213,7 +246,7 @@ namespace linker.plugins.sforward.messenger SForwardInfo sForwardInfo = runningConfig.Data.SForwards.FirstOrDefault(c => c.Domain == sForwardProxyInfo.Domain); if (sForwardInfo != null) { - _ = proxy.OnConnectTcp(sForwardProxyInfo.BufferSize,sForwardProxyInfo.Id, new System.Net.IPEndPoint(connection.Address.Address, sForwardProxyInfo.RemotePort), sForwardInfo.LocalEP); + _ = proxy.OnConnectTcp(sForwardProxyInfo.BufferSize, sForwardProxyInfo.Id, new System.Net.IPEndPoint(connection.Address.Address, sForwardProxyInfo.RemotePort), sForwardInfo.LocalEP); } } else if (sForwardProxyInfo.RemotePort > 0) @@ -225,6 +258,7 @@ namespace linker.plugins.sforward.messenger } } } + [MessengerId((ushort)SForwardMessengerIds.ProxyUdp)] public void ProxyUdp(IConnection connection) { @@ -238,5 +272,33 @@ namespace linker.plugins.sforward.messenger } } } + + [MessengerId((ushort)SForwardMessengerIds.Get)] + public void Get(IConnection connection) + { + List result = sForwardTransfer.Get().Select(c => new SForwardRemoteInfo + { + BufferSize = c.BufferSize, + Domain = c.Domain, + LocalEP = c.LocalEP, + Name = c.Name, + RemotePort = c.RemotePort, + }).ToList(); + connection.Write(MemoryPackSerializer.Serialize(result)); + } + } + + [MemoryPackable] + public sealed partial class SForwardRemoteInfo + { + public string Name { get; set; } + + public string Domain { get; set; } + public int RemotePort { get; set; } + + public byte BufferSize { get; set; } = 3; + + [MemoryPackAllowSerialize] + public IPEndPoint LocalEP { get; set; } } } diff --git a/linker/plugins/sforward/messenger/SForwardMessengerIds.cs b/linker/plugins/sforward/messenger/SForwardMessengerIds.cs index 2c46a503..7d57693d 100644 --- a/linker/plugins/sforward/messenger/SForwardMessengerIds.cs +++ b/linker/plugins/sforward/messenger/SForwardMessengerIds.cs @@ -10,6 +10,9 @@ Proxy = 2303, ProxyUdp = 2304, + GetForward = 2305, + Get = 2306, + Max = 2399 } } diff --git a/linker/plugins/signIn/SignInApiController.cs b/linker/plugins/signIn/SignInApiController.cs index ae62078f..b0a46628 100644 --- a/linker/plugins/signIn/SignInApiController.cs +++ b/linker/plugins/signIn/SignInApiController.cs @@ -74,6 +74,21 @@ namespace linker.plugins.signin } 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 { }; + } public async Task SetName(ApiControllerParamsInfo param) { diff --git a/linker/plugins/signIn/messenger/SignInMessenger.cs b/linker/plugins/signIn/messenger/SignInMessenger.cs index c73cb125..d3bca969 100644 --- a/linker/plugins/signIn/messenger/SignInMessenger.cs +++ b/linker/plugins/signIn/messenger/SignInMessenger.cs @@ -8,11 +8,9 @@ namespace linker.plugins.signin.messenger { public sealed class SignInClientMessenger : IMessenger { - private readonly ConfigWrap config; private readonly ClientSignInTransfer clientSignInTransfer; public SignInClientMessenger(ConfigWrap config, ClientSignInTransfer clientSignInTransfer) { - this.config = config; this.clientSignInTransfer = clientSignInTransfer; } @@ -58,13 +56,12 @@ namespace linker.plugins.signin.messenger public void List(IConnection connection) { SignInListRequestInfo request = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); - if (signCaching.TryGet(connection.Id, out SignCacheInfo cache)) { IEnumerable list = signCaching.Get(cache.GroupId).OrderByDescending(c => c.MachineName).OrderByDescending(c => c.LastSignIn).OrderByDescending(c => c.Version).ToList(); if (string.IsNullOrWhiteSpace(request.Name) == false) { - list = list.Where(c => c.MachineName.Contains(request.Name)); + list = list.Where(c => c.Version.Contains(request.Name) || c.IP.ToString().Contains(request.Name) || c.MachineName.Contains(request.Name) || request.Ids.Contains(c.MachineId)); } int count = list.Count(); list = list.Skip((request.Page - 1) * request.Size).Take(request.Size); @@ -109,6 +106,31 @@ namespace linker.plugins.signin.messenger connection.Write(MemoryPackSerializer.Serialize(config.Data.Version)); } + + [MessengerId((ushort)SignInMessengerIds.Ids)] + public void Ids(IConnection connection) + { + SignInIdsRequestInfo request = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + if (signCaching.TryGet(connection.Id, out SignCacheInfo cache)) + { + IEnumerable list = signCaching.Get(cache.GroupId).OrderByDescending(c => c.MachineName).OrderByDescending(c => c.LastSignIn).OrderByDescending(c => c.Version).ToList(); + if (string.IsNullOrWhiteSpace(request.Name) == false) + { + list = list.Where(c => c.MachineName.Contains(request.Name)); + } + int count = list.Count(); + list = list.Skip((request.Page - 1) * request.Size).Take(request.Size); + + SignInIdsResponseInfo response = new SignInIdsResponseInfo + { + Request = request, + Count = count, + List = list.Select(c => new SignInIdsResponseItemInfo { MachineId = c.MachineId, MachineName = c.MachineName }).ToList() + }; + + connection.Write(MemoryPackSerializer.Serialize(response)); + } + } } [MemoryPackable] @@ -130,6 +152,10 @@ namespace linker.plugins.signin.messenger /// 按名称搜索 ///
public string Name { get; set; } + /// + /// 按id获取 + /// + public string[] Ids { get; set; } } [MemoryPackable] @@ -139,4 +165,37 @@ namespace linker.plugins.signin.messenger public int Count { get; set; } public List List { get; set; } = new List(); } + + + [MemoryPackable] + public sealed partial class SignInIdsRequestInfo + { + /// + /// 当前页 + /// + public int Page { get; set; } = 1; + /// + /// 每页大小 + /// + public int Size { get; set; } = 10; + /// + /// 按名称搜索 + /// + public string Name { get; set; } + } + + [MemoryPackable] + public sealed partial class SignInIdsResponseInfo + { + public SignInIdsRequestInfo Request { get; set; } = new SignInIdsRequestInfo(); + public int Count { get; set; } + public List List { get; set; } = new List(); + } + + [MemoryPackable] + public sealed partial class SignInIdsResponseItemInfo + { + public string MachineId { get; set; } + public string MachineName { get; set; } + } } diff --git a/linker/plugins/signIn/messenger/SignInMessengerIds.cs b/linker/plugins/signIn/messenger/SignInMessengerIds.cs index 91438414..bcd64f76 100644 --- a/linker/plugins/signIn/messenger/SignInMessengerIds.cs +++ b/linker/plugins/signIn/messenger/SignInMessengerIds.cs @@ -11,6 +11,8 @@ Version = 7, + Ids = 8, + None = 99 } } diff --git a/linker/plugins/tunnel/TunnelAdapter.cs b/linker/plugins/tunnel/TunnelAdapter.cs index 6d5838f2..0991c2cc 100644 --- a/linker/plugins/tunnel/TunnelAdapter.cs +++ b/linker/plugins/tunnel/TunnelAdapter.cs @@ -68,10 +68,12 @@ namespace linker.plugins.tunnel { return running.Data.Tunnel.Servers; } - public void SetTunnelWanPortProtocols(List compacts) + public void SetTunnelWanPortProtocols(List compacts, bool updateVersion) { running.Data.Tunnel.Servers = compacts; running.Data.Update(); + if (updateVersion) + runningConfigTransfer.IncrementVersion(wanPortConfigKey); SyncWanPort(); } private void SetTunnelWanPortProtocols(Memory data) @@ -84,10 +86,12 @@ namespace linker.plugins.tunnel { return running.Data.Tunnel.Transports; } - public void SetTunnelTransports(List transports) + public void SetTunnelTransports(List transports, bool updateVersion) { running.Data.Tunnel.Transports = transports; running.Data.Update(); + if (updateVersion) + runningConfigTransfer.IncrementVersion(transportConfigKey); SyncTransport(); } private void SetTunnelTransports(Memory data) diff --git a/linker/plugins/tunnel/TunnelApiController.cs b/linker/plugins/tunnel/TunnelApiController.cs index 96a9c17c..c9769afc 100644 --- a/linker/plugins/tunnel/TunnelApiController.cs +++ b/linker/plugins/tunnel/TunnelApiController.cs @@ -81,7 +81,7 @@ namespace linker.plugins.tunnel public bool SetServers(ApiControllerParamsInfo param) { List info = param.Content.DeJson>(); - tunnelMessengerAdapter.SetTunnelWanPortProtocols(info); + tunnelMessengerAdapter.SetTunnelWanPortProtocols(info,true); return true; } @@ -127,7 +127,7 @@ namespace linker.plugins.tunnel public bool SetTransports(ApiControllerParamsInfo param) { List info = param.Content.DeJson>(); - tunnelMessengerAdapter.SetTunnelTransports(info); + tunnelMessengerAdapter.SetTunnelTransports(info, true); return true; } diff --git a/linker/plugins/tunnel/TunnelConfigTransfer.cs b/linker/plugins/tunnel/TunnelConfigTransfer.cs index 5df7bdd1..44785aa3 100644 --- a/linker/plugins/tunnel/TunnelConfigTransfer.cs +++ b/linker/plugins/tunnel/TunnelConfigTransfer.cs @@ -3,6 +3,7 @@ using linker.client.config; using linker.config; using linker.plugins.tunnel.messenger; using linker.server; +using linker.tunnel.adapter; using linker.tunnel.wanport; using MemoryPack; using System.Collections.Concurrent; @@ -16,6 +17,7 @@ namespace linker.plugins.tunnel private readonly ClientSignInState clientSignInState; private readonly MessengerSender messengerSender; private readonly RunningConfigTransfer runningConfigTransfer; + private readonly ITunnelAdapter tunnelAdapter; private string exipConfigKey = "excludeIPConfig"; @@ -24,13 +26,14 @@ namespace linker.plugins.tunnel private ConcurrentDictionary configs = new ConcurrentDictionary(); public ConcurrentDictionary Config => configs; - public TunnelConfigTransfer(ConfigWrap config, RunningConfig running, ClientSignInState clientSignInState, MessengerSender messengerSender, RunningConfigTransfer runningConfigTransfer) + public TunnelConfigTransfer(ConfigWrap config, RunningConfig running, ClientSignInState clientSignInState, MessengerSender messengerSender, RunningConfigTransfer runningConfigTransfer, ITunnelAdapter tunnelAdapter) { this.config = config; this.running = running; this.clientSignInState = clientSignInState; this.messengerSender = messengerSender; this.runningConfigTransfer = runningConfigTransfer; + this.tunnelAdapter = tunnelAdapter; clientSignInState.NetworkEnabledHandle += (times) => { @@ -48,9 +51,11 @@ namespace linker.plugins.tunnel } private void InitConfig() { - if (running.Data.Tunnel.Servers.FirstOrDefault(c => c.Type == TunnelWanPortType.Linker && c.ProtocolType == TunnelWanPortProtocolType.Udp) == null) + bool updateVersion = false; + List server = running.Data.Tunnel.Servers; + if (server.FirstOrDefault(c => c.Type == TunnelWanPortType.Linker && c.ProtocolType == TunnelWanPortProtocolType.Udp) == null) { - running.Data.Tunnel.Servers.Add(new TunnelWanPortInfo + server.Add(new TunnelWanPortInfo { Name = "Linker Udp", Type = TunnelWanPortType.Linker, @@ -58,10 +63,11 @@ namespace linker.plugins.tunnel Disabled = false, Host = running.Data.Client.Servers.FirstOrDefault().Host, }); + updateVersion = true; } - if (running.Data.Tunnel.Servers.FirstOrDefault(c => c.Type == TunnelWanPortType.Linker && c.ProtocolType == TunnelWanPortProtocolType.Tcp) == null) + if (server.FirstOrDefault(c => c.Type == TunnelWanPortType.Linker && c.ProtocolType == TunnelWanPortProtocolType.Tcp) == null) { - running.Data.Tunnel.Servers.Add(new TunnelWanPortInfo + server.Add(new TunnelWanPortInfo { Name = "Linker Tcp", Type = TunnelWanPortType.Linker, @@ -69,7 +75,9 @@ namespace linker.plugins.tunnel Disabled = false, Host = running.Data.Client.Servers.FirstOrDefault().Host, }); + updateVersion = true; } + tunnelAdapter.SetTunnelWanPortProtocols(server, updateVersion); } /// @@ -147,6 +155,7 @@ namespace linker.plugins.tunnel { running.Data.Tunnel.ExcludeIPs = ips; running.Data.Update(); + runningConfigTransfer.IncrementVersion(exipConfigKey); SyncExcludeIP(); } private void SettExcludeIPs(Memory data) diff --git a/linker/plugins/tunnel/messenger/TunnelMessenger.cs b/linker/plugins/tunnel/messenger/TunnelMessenger.cs index db92ff9d..265f5299 100644 --- a/linker/plugins/tunnel/messenger/TunnelMessenger.cs +++ b/linker/plugins/tunnel/messenger/TunnelMessenger.cs @@ -6,8 +6,6 @@ using linker.tunnel.adapter; using linker.tunnel.transport; using linker.libs; using MemoryPack; -using linker.tunnel.wanport; -using linker.client.config; namespace linker.plugins.tunnel.messenger { @@ -15,13 +13,11 @@ namespace linker.plugins.tunnel.messenger { private readonly TunnelTransfer tunnel; private readonly TunnelConfigTransfer tunnelConfigTransfer; - private readonly ITunnelAdapter tunnelMessengerAdapter; - public TunnelClientMessenger(TunnelTransfer tunnel, TunnelConfigTransfer tunnelConfigTransfer, ITunnelAdapter tunnelMessengerAdapter) + public TunnelClientMessenger(TunnelTransfer tunnel, TunnelConfigTransfer tunnelConfigTransfer) { this.tunnel = tunnel; this.tunnelConfigTransfer = tunnelConfigTransfer; - this.tunnelMessengerAdapter = tunnelMessengerAdapter; } [MessengerId((ushort)TunnelMessengerIds.Begin)]