From ec0da6b0d4fe6cbdb616825c16a5a9b8ace2e2d0 Mon Sep 17 00:00:00 2001 From: snltty <1069410172@qq.com> Date: Sat, 20 Jul 2024 15:32:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E5=A4=9A=E6=8F=90=E9=86=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/dotnet.yml | 15 +- linker.libs/linker.libs.csproj | 4 +- linker.service/linker.service.csproj | 4 +- linker.tunnel/linker.tunnel.csproj | 4 +- linker.tunnel/transport/TransportMsQuic.cs | 31 +-- linker.web/src/assets/style.css | 11 + linker.web/src/components/status/Server.vue | 15 +- linker.web/src/main.js | 15 - .../src/views/devices/ConnectionsEdit.vue | 3 +- linker.web/src/views/devices/Device.vue | 13 +- linker.web/src/views/devices/Forward.vue | 4 +- linker.web/src/views/devices/ForwardEdit.vue | 4 +- linker.web/src/views/devices/List.vue | 15 +- linker.web/src/views/devices/Oper.vue | 86 ++++++ linker.web/src/views/devices/SForwardEdit.vue | 4 +- linker.web/src/views/devices/Tunnel.vue | 17 +- linker.web/src/views/devices/TunnelEdit.vue | 1 - linker.web/src/views/devices/Tuntap.vue | 4 +- linker.web/src/views/devices/TuntapEdit.vue | 4 +- linker.web/src/views/devices/devices.js | 2 + linker.web/src/views/devices/updater.js | 5 +- linker.web/src/views/settings/ExcludeIP.vue | 3 +- .../src/views/settings/RelayServers.vue | 3 +- .../src/views/settings/SignInServers.vue | 3 +- linker.web/src/views/settings/Transports.vue | 3 +- .../src/views/settings/TunnelServers.vue | 5 +- linker/linker.csproj | 4 +- linker/plugins/capi/ApiClientServer.cs | 3 +- linker/plugins/capi/CApiStartup.cs | 3 +- .../capi/IApiClientController.cs | 2 +- .../{ => plugins}/client/ClientSignInState.cs | 4 +- .../client/ClientSignInTransfer.cs | 36 +-- linker/{ => plugins}/client/ClientStartup.cs | 15 +- .../{ => plugins}/client/args/ISignInArgs.cs | 2 +- .../client/args/SignInArgsTransfer.cs | 4 +- linker/{ => plugins}/client/config/Config.cs | 0 linker/plugins/config/ConfigApiController.cs | 2 +- linker/plugins/config/ConfigStartup.cs | 17 +- .../config/RunningConfig.cs | 0 .../config/RunningConfigApiController.cs | 7 +- .../config/RunningConfigTransfer.cs | 8 +- .../config/messenger/ConfigMessenger.cs | 7 +- .../config/messenger/ConfigMessengerIds.cs | 2 +- .../plugins/forward/ForwardApiController.cs | 6 +- linker/plugins/forward/ForwardStartup.cs | 2 +- linker/plugins/forward/ForwardTransfer.cs | 6 +- .../forward/messenger/ForwardMessenger.cs | 2 +- linker/plugins/logger/LoggerController.cs | 2 +- .../messenger}/IConnection.cs | 16 +- .../messenger}/IMessenger.cs | 2 +- .../messenger}/MessengerResolver.cs | 132 ++++++++- .../messenger}/MessengerSender.cs | 2 +- .../messenger/MessengerStartup.cs} | 31 +-- .../messenger/MessengerWrap.cs} | 2 +- linker/plugins/relay/RelayApiController.cs | 8 +- linker/plugins/relay/RelayStartup.cs | 2 +- linker/plugins/relay/RelayTransfer.cs | 2 +- .../plugins/relay/messenger/RelayMessenger.cs | 3 +- .../relay/transport/TransportSelfHost.cs | 13 +- .../serializes/IPAddressFormatter.cs | 4 +- .../serializes/IPEndPointFormatter.cs | 2 +- .../serializes/SerializeStartup.cs | 2 +- linker/plugins/server/ServerStartup.cs | 53 ++++ linker/plugins/server/TcpServer.cs | 127 +++++++++ linker/{ => plugins}/server/config/Config.cs | 0 .../plugins/sforward/SForwardApiController.cs | 6 +- linker/plugins/sforward/SForwardStartup.cs | 2 +- linker/plugins/sforward/SForwardTransfer.cs | 4 +- .../sforward/messenger/SForwardMessenger.cs | 2 +- .../plugins/sforward/validator/IValidator.cs | 4 +- .../plugins/sforward/validator/Validator.cs | 2 +- linker/plugins/signIn/SignInApiController.cs | 6 +- linker/plugins/signIn/SignInStartup.cs | 2 +- .../plugins/signIn/messenger/SignCaching.cs | 2 +- .../signIn/messenger/SignInMessenger.cs | 8 +- linker/plugins/tunnel/TunnelAdapter.cs | 6 +- linker/plugins/tunnel/TunnelApiController.cs | 9 +- linker/plugins/tunnel/TunnelConfigTransfer.cs | 80 ++++-- linker/plugins/tunnel/TunnelStartup.cs | 2 +- linker/plugins/tunnel/config/Config.cs | 2 + .../tunnel/messenger/TunnelMessenger.cs | 2 +- linker/plugins/tuntap/TuntapApiController.cs | 10 +- linker/plugins/tuntap/TuntapStartup.cs | 2 +- linker/plugins/tuntap/TuntapTransfer.cs | 6 +- .../tuntap/messenger/TuntapMessenger.cs | 4 +- .../updater/UpdaterClientApiController.cs | 8 +- .../plugins/updater/UpdaterClientTransfer.cs | 8 +- linker/plugins/updater/UpdaterHelper.cs | 7 +- linker/plugins/updater/UpdaterStartup.cs | 2 +- .../updater/messenger/UpdaterMessenger.cs | 3 +- linker/server/TcpServer.cs | 258 ------------------ 91 files changed, 702 insertions(+), 558 deletions(-) create mode 100644 linker.web/src/views/devices/Oper.vue rename linker/{client => plugins}/capi/IApiClientController.cs (89%) rename linker/{ => plugins}/client/ClientSignInState.cs (94%) rename linker/{ => plugins}/client/ClientSignInTransfer.cs (93%) rename linker/{ => plugins}/client/ClientStartup.cs (72%) rename linker/{ => plugins}/client/args/ISignInArgs.cs (73%) rename linker/{ => plugins}/client/args/SignInArgsTransfer.cs (87%) rename linker/{ => plugins}/client/config/Config.cs (100%) rename linker/{client => plugins}/config/RunningConfig.cs (100%) rename linker/{client => plugins}/config/RunningConfigApiController.cs (81%) rename linker/{client => plugins}/config/RunningConfigTransfer.cs (97%) rename linker/{client => plugins}/config/messenger/ConfigMessenger.cs (95%) rename linker/{client => plugins}/config/messenger/ConfigMessengerIds.cs (77%) rename linker/{server => plugins/messenger}/IConnection.cs (98%) rename linker/{server => plugins/messenger}/IMessenger.cs (93%) rename linker/{server => plugins/messenger}/MessengerResolver.cs (54%) rename linker/{server => plugins/messenger}/MessengerSender.cs (99%) rename linker/{server/ServerStartup.cs => plugins/messenger/MessengerStartup.cs} (62%) rename linker/{server/ServerMessageWrap.cs => plugins/messenger/MessengerWrap.cs} (99%) rename linker/{ => plugins}/serializes/IPAddressFormatter.cs (92%) rename linker/{ => plugins}/serializes/IPEndPointFormatter.cs (97%) rename linker/{ => plugins}/serializes/SerializeStartup.cs (97%) create mode 100644 linker/plugins/server/ServerStartup.cs create mode 100644 linker/plugins/server/TcpServer.cs rename linker/{ => plugins}/server/config/Config.cs (100%) delete mode 100644 linker/server/TcpServer.cs diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index a087ac33..242870d3 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -48,18 +48,15 @@ jobs: env: GITHUB_TOKEN: '${{ secrets.ACTIONS_TOKEN }}' with: - tag_name: v1.1.2.2 - release_name: v1.1.2.2.${{ steps.date.outputs.today }} + tag_name: v1.1.2.3 + release_name: v1.1.2.3.${{ steps.date.outputs.today }} draft: false prerelease: false body: | - 1. 更新配置同步方式,以版本同步 - 2. 设备列表搜索,按 设备名/设备IP/虚拟网卡IP/端口转发端口和IP 搜索 - 3. 端口转发配置复制,可以将A转发到B的配置复制给C转发到B - 4. 服务器代理穿透配置复制 - 5. 修复虚拟网卡添加路由错误 - 6. 自动更新,管理所有客户端更新 - 7. 请更新服务端 + 1. 修复虚拟网卡添加路由错误 + 2. 自动更新,客户端和服务端 + 3. 更多的消息提醒,需要重启时提醒 + 4. 请更新服务端 - name: upload win x64 id: upload-win-x64 diff --git a/linker.libs/linker.libs.csproj b/linker.libs/linker.libs.csproj index 09a58101..094cb2d4 100644 --- a/linker.libs/linker.libs.csproj +++ b/linker.libs/linker.libs.csproj @@ -15,8 +15,8 @@ https://github.com/snltty/linker https://github.com/snltty/linker 1.1.2 - 1.1.2.2 - 1.1.2.2 + 1.1.2.3 + 1.1.2.3 full diff --git a/linker.service/linker.service.csproj b/linker.service/linker.service.csproj index 20aff259..e9fcc421 100644 --- a/linker.service/linker.service.csproj +++ b/linker.service/linker.service.csproj @@ -22,8 +22,8 @@ https://github.com/snltty/linker https://github.com/snltty/linker snltty service - 1.1.2.2 - 1.1.2.2 + 1.1.2.3 + 1.1.2.3 diff --git a/linker.tunnel/linker.tunnel.csproj b/linker.tunnel/linker.tunnel.csproj index 8ec90307..abb4f232 100644 --- a/linker.tunnel/linker.tunnel.csproj +++ b/linker.tunnel/linker.tunnel.csproj @@ -17,8 +17,8 @@ https://github.com/snltty/linker https://github.com/snltty/linker linker tunnel - 1.1.2.2 - 1.1.2.2 + 1.1.2.3 + 1.1.2.3 diff --git a/linker.tunnel/transport/TransportMsQuic.cs b/linker.tunnel/transport/TransportMsQuic.cs index 0bd600ff..1d152a54 100644 --- a/linker.tunnel/transport/TransportMsQuic.cs +++ b/linker.tunnel/transport/TransportMsQuic.cs @@ -10,8 +10,6 @@ using System.Net.Sockets; using System.Security.Authentication; using System.Text; using linker.tunnel.wanport; -using System.Runtime.InteropServices; -using System.IO; namespace linker.tunnel.transport { @@ -664,7 +662,6 @@ namespace linker.tunnel.transport { if (OperatingSystem.IsWindows() || OperatingSystem.IsLinux() || OperatingSystem.IsMacOS()) { - TestQuic(); if (QuicListener.IsSupported == false) { LoggerHelper.Instance.Error($"msquic not supported, need win11+,or linux, or try to restart linker"); @@ -729,28 +726,7 @@ namespace linker.tunnel.transport } } } - private void TestQuic() - { - if (OperatingSystem.IsWindows()) - { - if (QuicListener.IsSupported == false) - { - try - { - if (File.Exists("msquic-openssl.dll")) - { - LoggerHelper.Instance.Info($"copy msquic-openssl.dll -> msquic.dll"); - File.Move("msquic-openssl.dll", "msquic.dll", true); - } - } - catch (Exception) - { - } - } - } - } - - + sealed class ListenAsyncToken { /// @@ -773,10 +749,5 @@ namespace linker.tunnel.transport } } - enum ListenStep : byte - { - Auth = 0, - Forward = 1 - } } } diff --git a/linker.web/src/assets/style.css b/linker.web/src/assets/style.css index f22f8b74..03537231 100644 --- a/linker.web/src/assets/style.css +++ b/linker.web/src/assets/style.css @@ -157,6 +157,14 @@ span.split-pad10 { color: red; } +.green { + color: green; +} + +.yellow { + color: #e68906 +} + .scrollbar, .scrollbar-1, .scrollbar-4, @@ -214,6 +222,9 @@ span.split-pad10 { --el-color-primary-dark-2: var(--el-color-success-dark-2) !important; } +.el-table .cell { + overflow: visible !important; +} .el-table--scrollable-y .el-table__body-wrapper::-webkit-scrollbar { background: #f5f5f5 diff --git a/linker.web/src/components/status/Server.vue b/linker.web/src/components/status/Server.vue index e312424a..94ad09b7 100644 --- a/linker.web/src/components/status/Server.vue +++ b/linker.web/src/components/status/Server.vue @@ -56,8 +56,11 @@ export default { setup(props) { const globalData = injectGlobalData(); - const updaterCurrent = ref({Version: '', Status: 0, Length: 0, Current: 0}); + const updaterCurrent = ref({Version: '', Msg: [], DateTime: '', Status: 0, Length: 0, Current: 0}); const updaterServer = ref({Version: '', Status: 0, Length: 0, Current: 0}); + const updaterMsg = computed(()=>{ + return `${updaterCurrent.value.Version}->${updaterCurrent.value.DateTime}\n${updaterCurrent.value.Msg.map((value,index)=>`${index+1}、${value}`).join('\n')}`; + }); const state = reactive({ show: false, @@ -75,10 +78,12 @@ export default { const _getUpdaterCurrent = ()=>{ getUpdaterCurrent().then((res)=>{ + updaterCurrent.value.DateTime = res.DateTime; updaterCurrent.value.Version = res.Version; updaterCurrent.value.Status = res.Status; updaterCurrent.value.Length = res.Length; updaterCurrent.value.Current = res.Current; + updaterCurrent.value.Msg = res.Msg; setTimeout(()=>{ _getUpdaterCurrent(); },1000); @@ -111,8 +116,8 @@ export default { } if(updaterServer.value.Status <= 2) { return state.version != updaterCurrent.value.Version - ? `不是最新版本(${updaterCurrent.value.Version}),建议更新` - : '是最新版本,但我无法阻止你喜欢更新' + ? `不是最新版本(${updaterCurrent.value.Version}),建议更新\n${updaterMsg.value}` + : `是最新版本,但我无法阻止你喜欢更新\n${updaterMsg.value}` } return { 3:'正在下载', @@ -216,12 +221,8 @@ export default { } a.download{ - &.green{color:green} - &.red{color:red} - &.yellow{color:#e68906} .el-icon{ font-weight:bold; - &.yellow{color:#e68906} &.loading{ animation:loading 1s linear infinite; } diff --git a/linker.web/src/main.js b/linker.web/src/main.js index 891e756a..948dbb7c 100644 --- a/linker.web/src/main.js +++ b/linker.web/src/main.js @@ -2,8 +2,6 @@ import { createApp } from 'vue' import App from './App.vue' import router from './router' -// import VConsole from 'vconsole'; -// new VConsole(); const app = createApp(App); @@ -14,17 +12,4 @@ import 'element-plus/dist/index.css' import 'element-plus/theme-chalk/display.css' import 'element-plus/theme-chalk/dark/css-vars.css' -import { - ArrowDown, Top, Bottom, Delete, Plus, Select, Refresh, Search -} from '@element-plus/icons-vue' -app.component(ArrowDown.name, ArrowDown); -app.component(Top.name, Top); -app.component(Bottom.name, Bottom); -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 5c42ab6f..574d8241 100644 --- a/linker.web/src/views/devices/ConnectionsEdit.vue +++ b/linker.web/src/views/devices/ConnectionsEdit.vue @@ -54,9 +54,11 @@ import { reactive, watch,computed } from 'vue'; import { ElMessage } from 'element-plus'; import { useConnections, useForwardConnections, useTuntapConnections } from './connections'; +import { Delete } from '@element-plus/icons-vue'; export default { props: ['modelValue'], emits: ['change','update:modelValue'], + components: {Delete}, setup(props, { emit }) { const connections = useConnections(); @@ -97,5 +99,4 @@ export default { \ No newline at end of file diff --git a/linker.web/src/views/devices/Device.vue b/linker.web/src/views/devices/Device.vue index ec3e0956..15232b3b 100644 --- a/linker.web/src/views/devices/Device.vue +++ b/linker.web/src/views/devices/Device.vue @@ -18,7 +18,7 @@

{{ scope.row.IP }} - + {{scope.row.Version}} - @@ -83,6 +82,5 @@ a{ text-decoration: underline; font-weight:bold; } -span.green,a.green{color:green} span.error{color:red} \ 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 9d5909bb..fd582523 100644 --- a/linker.web/src/views/devices/ForwardEdit.vue +++ b/linker.web/src/views/devices/ForwardEdit.vue @@ -100,13 +100,13 @@ import { onMounted, onUnmounted, reactive, watch } from 'vue'; import { getForwardInfo, removeForwardInfo, addForwardInfo ,getForwardIpv4,testTargetForwardInfo,testListenForwardInfo } from '@/apis/forward' import { ElMessage } from 'element-plus'; -import {WarnTriangleFilled} from '@element-plus/icons-vue' +import {WarnTriangleFilled,Delete} from '@element-plus/icons-vue' import { injectGlobalData } from '@/provide'; import { useForward } from './forward'; export default { props: ['data','modelValue'], emits: ['update:modelValue'], - components:{WarnTriangleFilled}, + components:{WarnTriangleFilled,Delete}, setup(props, { emit }) { const globalData = injectGlobalData(); diff --git a/linker.web/src/views/devices/List.vue b/linker.web/src/views/devices/List.vue index 0208d005..b27469e9 100644 --- a/linker.web/src/views/devices/List.vue +++ b/linker.web/src/views/devices/List.vue @@ -5,15 +5,7 @@ - - - +

@@ -36,6 +28,7 @@ import { subWebsocketState } from '@/apis/request.js' import { injectGlobalData } from '@/provide.js' import { reactive, onMounted, onUnmounted, computed } from 'vue' +import Oper from './Oper.vue' import Device from './Device.vue' import DeviceEdit from './DeviceEdit.vue' import Tuntap from './Tuntap.vue' @@ -57,7 +50,7 @@ import { provideSforward } from './sforward' import { provideDevices } from './devices' import { provideUpdater } from './updater' export default { - components: {Device,DeviceEdit,Tunnel,TunnelEdit,ConnectionsEdit, Tuntap,TuntapEdit, Forward,ForwardEdit,ForwardCopy,SForwardEdit,SForwardCopy }, + components: {Oper,Device,DeviceEdit,Tunnel,TunnelEdit,ConnectionsEdit, Tuntap,TuntapEdit, Forward,ForwardEdit,ForwardCopy,SForwardEdit,SForwardCopy }, setup(props) { const globalData = injectGlobalData(); @@ -164,8 +157,6 @@ export default { .home-list-wrap{ padding:1rem; - .green{color:green;} - .page{padding-top:1rem} .page-wrap{ display:inline-block; diff --git a/linker.web/src/views/devices/Oper.vue b/linker.web/src/views/devices/Oper.vue new file mode 100644 index 00000000..0e5a237b --- /dev/null +++ b/linker.web/src/views/devices/Oper.vue @@ -0,0 +1,86 @@ + + + + + \ 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 e16a04fd..76c7b8b0 100644 --- a/linker.web/src/views/devices/SForwardEdit.vue +++ b/linker.web/src/views/devices/SForwardEdit.vue @@ -89,13 +89,13 @@ import { onMounted, onUnmounted, reactive, watch } from 'vue'; import { getSForwardInfo, removeSForwardInfo, addSForwardInfo,testLocalSForwardInfo } from '@/apis/sforward' import { ElMessage } from 'element-plus'; -import {WarnTriangleFilled} from '@element-plus/icons-vue' +import {WarnTriangleFilled,Delete} from '@element-plus/icons-vue' import { injectGlobalData } from '@/provide'; import { useSforward } from './sforward'; export default { props: ['data','modelValue'], emits: ['update:modelValue'], - components:{WarnTriangleFilled}, + components:{WarnTriangleFilled,Delete}, setup(props, { emit }) { const globalData = injectGlobalData(); diff --git a/linker.web/src/views/devices/Tunnel.vue b/linker.web/src/views/devices/Tunnel.vue index ceded5b4..77186e8d 100644 --- a/linker.web/src/views/devices/Tunnel.vue +++ b/linker.web/src/views/devices/Tunnel.vue @@ -2,17 +2,18 @@ @@ -54,6 +55,6 @@ export default { } \ No newline at end of file diff --git a/linker.web/src/views/devices/TunnelEdit.vue b/linker.web/src/views/devices/TunnelEdit.vue index bd129c93..55fc6f61 100644 --- a/linker.web/src/views/devices/TunnelEdit.vue +++ b/linker.web/src/views/devices/TunnelEdit.vue @@ -82,6 +82,5 @@ export default { } \ No newline at end of file diff --git a/linker.web/src/views/devices/Tuntap.vue b/linker.web/src/views/devices/Tuntap.vue index 7ccd35dc..7a62632b 100644 --- a/linker.web/src/views/devices/Tuntap.vue +++ b/linker.web/src/views/devices/Tuntap.vue @@ -9,7 +9,7 @@ @@ -67,8 +67,6 @@ export default { } \ No newline at end of file diff --git a/linker.web/src/views/devices/devices.js b/linker.web/src/views/devices/devices.js index ae886811..9f41dec3 100644 --- a/linker.web/src/views/devices/devices.js +++ b/linker.web/src/views/devices/devices.js @@ -25,6 +25,7 @@ export const provideDevices = () => { devices.page.Count = res.Count; for (let j in res.List) { res.List[j].showDel = machineId.value != res.List[j].MachineId && res.List[j].Connected == false; + res.List[j].showReboot = res.List[j].Connected; res.List[j].isSelf = machineId.value == res.List[j].MachineId; } devices.page.List = res.List.sort((a, b) => b.Connected - a.Connected); @@ -41,6 +42,7 @@ export const provideDevices = () => { item.LastSignIn = res.List[j].LastSignIn; item.Args = res.List[j].Args; item.showDel = machineId.value != res.List[j].MachineId && res.List[j].Connected == false; + item.showReboot = res.List[j].Connected; item.isSelf = machineId.value == res.List[j].MachineId; } } diff --git a/linker.web/src/views/devices/updater.js b/linker.web/src/views/devices/updater.js index 1fcfaaa9..c68a745c 100644 --- a/linker.web/src/views/devices/updater.js +++ b/linker.web/src/views/devices/updater.js @@ -8,18 +8,21 @@ export const provideUpdater = () => { const updater = ref({ timer: 0, list: {}, - current: { Version: '', Status: 0, Length: 0, Current: 0 } + current: { Version: '', Msg: [], DateTime: '', Status: 0, Length: 0, Current: 0 } }); provide(updaterSymbol, updater); const _getUpdater = () => { if (globalData.value.api.connected) { getUpdater().then((res) => { + console.log(res); const self = Object.values(res).filter(c => !!c.Version)[0]; if (self) { + updater.value.current.DateTime = self.DateTime; updater.value.current.Version = self.Version; updater.value.current.Status = self.Status; updater.value.current.Length = self.Length; updater.value.current.Current = self.Current; + updater.value.current.Msg = self.Msg; } updater.value.list = res; updater.value.timer = setTimeout(_getUpdater, 800); diff --git a/linker.web/src/views/settings/ExcludeIP.vue b/linker.web/src/views/settings/ExcludeIP.vue index 8653d326..d4209a41 100644 --- a/linker.web/src/views/settings/ExcludeIP.vue +++ b/linker.web/src/views/settings/ExcludeIP.vue @@ -45,11 +45,12 @@ import { injectGlobalData } from '@/provide'; import { ElMessage } from 'element-plus'; import { computed, inject, onMounted, reactive } from 'vue' import Version from './Version.vue'; +import { Delete,Plus } from '@element-plus/icons-vue'; export default { label:'打洞排除IP', name:'excludeIP', order:3, - components:{Version}, + components:{Version,Delete,Plus}, setup(props) { const globalData = injectGlobalData(); const state = reactive({ diff --git a/linker.web/src/views/settings/RelayServers.vue b/linker.web/src/views/settings/RelayServers.vue index 69fcf60b..785cc1a2 100644 --- a/linker.web/src/views/settings/RelayServers.vue +++ b/linker.web/src/views/settings/RelayServers.vue @@ -83,11 +83,12 @@ import { injectGlobalData } from '@/provide'; import { ElMessage } from 'element-plus'; import { computed, inject, onMounted, reactive } from 'vue' import Version from './Version.vue'; +import { Delete,Plus,Top,Bottom } from '@element-plus/icons-vue'; export default { label:'中继服务器', name:'relayServers', order:4, - components:{Version}, + components:{Version,Delete,Plus,Top,Bottom}, setup(props) { const globalData = injectGlobalData(); const state = reactive({ diff --git a/linker.web/src/views/settings/SignInServers.vue b/linker.web/src/views/settings/SignInServers.vue index 9e55f859..0d7f4b3d 100644 --- a/linker.web/src/views/settings/SignInServers.vue +++ b/linker.web/src/views/settings/SignInServers.vue @@ -52,11 +52,12 @@ import { injectGlobalData } from '@/provide'; import { ElMessage } from 'element-plus'; import { computed, inject, reactive } from 'vue' import Version from './Version.vue'; +import { Delete,Plus,Select } from '@element-plus/icons-vue'; export default { label:'信标服务器', name:'signInServers', order:0, - components:{Version}, + components:{Version,Delete,Plus,Select }, setup(props) { const globalData = injectGlobalData(); const state = reactive({ diff --git a/linker.web/src/views/settings/Transports.vue b/linker.web/src/views/settings/Transports.vue index 8ea60708..813a3c9f 100644 --- a/linker.web/src/views/settings/Transports.vue +++ b/linker.web/src/views/settings/Transports.vue @@ -46,11 +46,12 @@ import { injectGlobalData } from '@/provide'; import { ElMessage } from 'element-plus'; import { computed, inject, onMounted, reactive } from 'vue' import Version from './Version.vue'; +import { Delete,Plus,Top,Bottom } from '@element-plus/icons-vue'; export default { label:'打洞协议', name:'transports', order:2, - components:{Version}, + components:{Version, Delete,Plus,Top,Bottom}, setup(props) { const globalData = injectGlobalData(); const state = reactive({ diff --git a/linker.web/src/views/settings/TunnelServers.vue b/linker.web/src/views/settings/TunnelServers.vue index 26e9e90b..9e4b0f85 100644 --- a/linker.web/src/views/settings/TunnelServers.vue +++ b/linker.web/src/views/settings/TunnelServers.vue @@ -78,13 +78,14 @@ import { setTunnelServers,getTunnelTypes } from '@/apis/tunnel'; import { injectGlobalData } from '@/provide'; import { ElMessage } from 'element-plus'; -import { computed, inject, onMounted, reactive } from 'vue' +import { computed, onMounted, reactive } from 'vue' import Version from './Version.vue'; +import { Delete,Plus,Top,Bottom } from '@element-plus/icons-vue'; export default { label:'端口服务器', name:'tunnelServers', order:1, - components:{Version}, + components:{Version,Delete,Plus,Top,Bottom}, setup(props) { const globalData = injectGlobalData(); const list = ((globalData.value.config.Running.Tunnel || {Servers:[]}).Servers || []).sort((a,b)=>a.Disabled - b.Disabled); diff --git a/linker/linker.csproj b/linker/linker.csproj index 542615f7..c25fa421 100644 --- a/linker/linker.csproj +++ b/linker/linker.csproj @@ -25,8 +25,8 @@ https://github.com/snltty/linker https://github.com/snltty/linker linker - 1.1.2.2 - 1.1.2.2 + 1.1.2.3 + 1.1.2.3 diff --git a/linker/plugins/capi/ApiClientServer.cs b/linker/plugins/capi/ApiClientServer.cs index a125b295..c6c71bf7 100644 --- a/linker/plugins/capi/ApiClientServer.cs +++ b/linker/plugins/capi/ApiClientServer.cs @@ -1,5 +1,4 @@ -using linker.client.capi; -using linker.config; +using linker.config; using linker.libs; using linker.libs.api; using Microsoft.Extensions.DependencyInjection; diff --git a/linker/plugins/capi/CApiStartup.cs b/linker/plugins/capi/CApiStartup.cs index c3909b4a..c3b488ec 100644 --- a/linker/plugins/capi/CApiStartup.cs +++ b/linker/plugins/capi/CApiStartup.cs @@ -1,5 +1,4 @@ -using linker.client.capi; -using linker.config; +using linker.config; using linker.startup; using linker.libs; using Microsoft.Extensions.DependencyInjection; diff --git a/linker/client/capi/IApiClientController.cs b/linker/plugins/capi/IApiClientController.cs similarity index 89% rename from linker/client/capi/IApiClientController.cs rename to linker/plugins/capi/IApiClientController.cs index 625913c5..8cc45118 100644 --- a/linker/client/capi/IApiClientController.cs +++ b/linker/plugins/capi/IApiClientController.cs @@ -1,7 +1,7 @@ using linker.libs.api; using System.Reflection; -namespace linker.client.capi +namespace linker.plugins.capi { public interface IApiClientController : IApiController { diff --git a/linker/client/ClientSignInState.cs b/linker/plugins/client/ClientSignInState.cs similarity index 94% rename from linker/client/ClientSignInState.cs rename to linker/plugins/client/ClientSignInState.cs index 749bad0f..ec39b3ee 100644 --- a/linker/client/ClientSignInState.cs +++ b/linker/plugins/client/ClientSignInState.cs @@ -1,7 +1,7 @@ -using linker.server; +using linker.plugins.messenger; using System.Text.Json.Serialization; -namespace linker.client +namespace linker.plugins.client { /// /// 登入对象 diff --git a/linker/client/ClientSignInTransfer.cs b/linker/plugins/client/ClientSignInTransfer.cs similarity index 93% rename from linker/client/ClientSignInTransfer.cs rename to linker/plugins/client/ClientSignInTransfer.cs index 49989db7..486106b5 100644 --- a/linker/client/ClientSignInTransfer.cs +++ b/linker/plugins/client/ClientSignInTransfer.cs @@ -1,15 +1,16 @@ -using linker.client.args; -using linker.client.config; +using linker.client.config; using linker.config; using linker.plugins.signin.messenger; -using linker.server; using linker.libs; using linker.libs.extends; using MemoryPack; using System.Net; using System.Net.Sockets; +using linker.plugins.client.args; +using linker.plugins.server; +using linker.plugins.messenger; -namespace linker.client +namespace linker.plugins.client { /// /// 登入 @@ -19,20 +20,20 @@ namespace linker.client private readonly ClientSignInState clientSignInState; private readonly RunningConfig runningConfig; private readonly FileConfig config; - private readonly TcpServer tcpServer; private readonly MessengerSender messengerSender; + private readonly MessengerResolver messengerResolver; private readonly SignInArgsTransfer signInArgsTransfer; private readonly RunningConfigTransfer runningConfigTransfer; private string configKey = "signServers"; - public ClientSignInTransfer(ClientSignInState clientSignInState, RunningConfig runningConfig, FileConfig config, TcpServer tcpServer, MessengerSender messengerSender, SignInArgsTransfer signInArgsTransfer, RunningConfigTransfer runningConfigTransfer) + public ClientSignInTransfer(ClientSignInState clientSignInState, RunningConfig runningConfig, FileConfig config, MessengerSender messengerSender, MessengerResolver messengerResolver, SignInArgsTransfer signInArgsTransfer, RunningConfigTransfer runningConfigTransfer) { this.clientSignInState = clientSignInState; this.runningConfig = runningConfig; this.config = config; - this.tcpServer = tcpServer; this.messengerSender = messengerSender; + this.messengerResolver = messengerResolver; this.signInArgsTransfer = signInArgsTransfer; this.runningConfigTransfer = runningConfigTransfer; @@ -131,7 +132,7 @@ namespace linker.client Socket socket = new Socket(remote.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp); socket.KeepAlive(); await socket.ConnectAsync(remote).WaitAsync(TimeSpan.FromMilliseconds(5000)).ConfigureAwait(false); - clientSignInState.Connection = await tcpServer.BeginReceive(socket).ConfigureAwait(false); + clientSignInState.Connection = await messengerResolver.BeginReceiveClient(socket).ConfigureAwait(false); return true; } @@ -169,6 +170,16 @@ namespace linker.client clientSignInState.Connection?.Disponse(6); return false; } + + /// + /// 登出 + /// + public void SignOut() + { + if (clientSignInState.Connected) + clientSignInState.Connection.Disponse(5); + } + /// /// 获取服务器版本 /// @@ -189,14 +200,7 @@ namespace linker.client clientSignInState.Version = "v1.0.0.0"; } } - /// - /// 登出 - /// - public void SignOut() - { - if (clientSignInState.Connected) - clientSignInState.Connection.Disponse(5); - } + /// /// 修改客户端名称 diff --git a/linker/client/ClientStartup.cs b/linker/plugins/client/ClientStartup.cs similarity index 72% rename from linker/client/ClientStartup.cs rename to linker/plugins/client/ClientStartup.cs index 4c227968..8cb1f46b 100644 --- a/linker/client/ClientStartup.cs +++ b/linker/plugins/client/ClientStartup.cs @@ -2,12 +2,10 @@ using linker.startup; using Microsoft.Extensions.DependencyInjection; using System.Reflection; -using linker.client.args; -using linker.client.config; using linker.config; -using linker.client.config.messenger; +using linker.plugins.client.args; -namespace linker.client +namespace linker.plugins.client { /// /// 客户端插件 @@ -17,16 +15,11 @@ namespace linker.client public StartupLevel Level => StartupLevel.Bottom; public string Name => "client"; public bool Required => true; - public string[] Dependent => new string[] { "firewall", "signin", "serialize" }; + public string[] Dependent => new string[] { "messenger", "firewall", "signin", "serialize", "config" }; public StartupLoadType LoadType => StartupLoadType.Normal; public void AddClient(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); @@ -46,7 +39,7 @@ namespace linker.client public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { - serviceCollection.AddSingleton(); + } public void UseServer(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { diff --git a/linker/client/args/ISignInArgs.cs b/linker/plugins/client/args/ISignInArgs.cs similarity index 73% rename from linker/client/args/ISignInArgs.cs rename to linker/plugins/client/args/ISignInArgs.cs index fc59a772..cd176269 100644 --- a/linker/client/args/ISignInArgs.cs +++ b/linker/plugins/client/args/ISignInArgs.cs @@ -1,4 +1,4 @@ -namespace linker.client.args +namespace linker.plugins.client.args { public interface ISignInArgs { diff --git a/linker/client/args/SignInArgsTransfer.cs b/linker/plugins/client/args/SignInArgsTransfer.cs similarity index 87% rename from linker/client/args/SignInArgsTransfer.cs rename to linker/plugins/client/args/SignInArgsTransfer.cs index 36eaf10e..84630fdb 100644 --- a/linker/client/args/SignInArgsTransfer.cs +++ b/linker/plugins/client/args/SignInArgsTransfer.cs @@ -3,7 +3,7 @@ using linker.libs; using Microsoft.Extensions.DependencyInjection; using System; -namespace linker.client.args +namespace linker.plugins.client.args { public sealed class SignInArgsTransfer { @@ -12,7 +12,7 @@ namespace linker.client.args public SignInArgsTransfer(ServiceProvider serviceProvider, FileConfig config) { var types = ReflectionHelper.GetInterfaceSchieves(typeof(ISignInArgs)); - startups = types.Select(c => serviceProvider.GetService(c) as ISignInArgs).Where(c=>c != null).ToList(); + startups = types.Select(c => serviceProvider.GetService(c) as ISignInArgs).Where(c => c != null).ToList(); } public void Invoke(Dictionary args) diff --git a/linker/client/config/Config.cs b/linker/plugins/client/config/Config.cs similarity index 100% rename from linker/client/config/Config.cs rename to linker/plugins/client/config/Config.cs diff --git a/linker/plugins/config/ConfigApiController.cs b/linker/plugins/config/ConfigApiController.cs index 531b497b..c29c1a68 100644 --- a/linker/plugins/config/ConfigApiController.cs +++ b/linker/plugins/config/ConfigApiController.cs @@ -1,8 +1,8 @@ using linker.config; using linker.libs.api; using linker.libs.extends; -using linker.client.capi; using linker.client.config; +using linker.plugins.capi; namespace linker.plugins.config { diff --git a/linker/plugins/config/ConfigStartup.cs b/linker/plugins/config/ConfigStartup.cs index 0351c433..2e99d81a 100644 --- a/linker/plugins/config/ConfigStartup.cs +++ b/linker/plugins/config/ConfigStartup.cs @@ -1,4 +1,6 @@ -using linker.config; +using linker.client.config; +using linker.config; +using linker.plugins.config.messenger; using linker.startup; using Microsoft.Extensions.DependencyInjection; using System.Reflection; @@ -11,19 +13,26 @@ namespace linker.plugins.config public bool Required => true; - public StartupLevel Level => StartupLevel.Normal; + public StartupLevel Level => StartupLevel.Normal; - public string[] Dependent => Array.Empty(); + public string[] Dependent => new string[] { "messenger", "signin", "serialize" }; - public StartupLoadType LoadType => StartupLoadType.Normal; + public StartupLoadType LoadType => StartupLoadType.Normal; public void AddClient(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); } public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { + serviceCollection.AddSingleton(); } public void UseClient(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) diff --git a/linker/client/config/RunningConfig.cs b/linker/plugins/config/RunningConfig.cs similarity index 100% rename from linker/client/config/RunningConfig.cs rename to linker/plugins/config/RunningConfig.cs diff --git a/linker/client/config/RunningConfigApiController.cs b/linker/plugins/config/RunningConfigApiController.cs similarity index 81% rename from linker/client/config/RunningConfigApiController.cs rename to linker/plugins/config/RunningConfigApiController.cs index 94749e51..e913eb42 100644 --- a/linker/client/config/RunningConfigApiController.cs +++ b/linker/plugins/config/RunningConfigApiController.cs @@ -1,12 +1,13 @@ using linker.libs.api; -using linker.client.capi; using linker.libs.extends; +using linker.client.config; +using linker.plugins.capi; -namespace linker.client.config +namespace linker.plugins.config { public sealed class RunningConfigApiController : IApiClientController { - private readonly RunningConfigTransfer runningConfigTransfer; + private readonly RunningConfigTransfer runningConfigTransfer; public RunningConfigApiController(RunningConfigTransfer runningConfigTransfer) { diff --git a/linker/client/config/RunningConfigTransfer.cs b/linker/plugins/config/RunningConfigTransfer.cs similarity index 97% rename from linker/client/config/RunningConfigTransfer.cs rename to linker/plugins/config/RunningConfigTransfer.cs index c2f0497d..a3f273a5 100644 --- a/linker/client/config/RunningConfigTransfer.cs +++ b/linker/plugins/config/RunningConfigTransfer.cs @@ -1,6 +1,7 @@ -using linker.client.config.messenger; -using linker.libs; -using linker.server; +using linker.libs; +using linker.plugins.client; +using linker.plugins.config.messenger; +using linker.plugins.messenger; using MemoryPack; using System.Collections.Concurrent; @@ -30,6 +31,7 @@ namespace linker.client.config /// public Memory Data { get; set; } } + /// /// 配置同步 /// diff --git a/linker/client/config/messenger/ConfigMessenger.cs b/linker/plugins/config/messenger/ConfigMessenger.cs similarity index 95% rename from linker/client/config/messenger/ConfigMessenger.cs rename to linker/plugins/config/messenger/ConfigMessenger.cs index daebd6af..08a99fbd 100644 --- a/linker/client/config/messenger/ConfigMessenger.cs +++ b/linker/plugins/config/messenger/ConfigMessenger.cs @@ -1,8 +1,9 @@ -using linker.plugins.signin.messenger; -using linker.server; +using linker.client.config; +using linker.plugins.messenger; +using linker.plugins.signin.messenger; using MemoryPack; -namespace linker.client.config.messenger +namespace linker.plugins.config.messenger { public sealed class ConfigServerMessenger : IMessenger { diff --git a/linker/client/config/messenger/ConfigMessengerIds.cs b/linker/plugins/config/messenger/ConfigMessengerIds.cs similarity index 77% rename from linker/client/config/messenger/ConfigMessengerIds.cs rename to linker/plugins/config/messenger/ConfigMessengerIds.cs index a0df61b5..1b6b510c 100644 --- a/linker/client/config/messenger/ConfigMessengerIds.cs +++ b/linker/plugins/config/messenger/ConfigMessengerIds.cs @@ -1,4 +1,4 @@ -namespace linker.client.config.messenger +namespace linker.plugins.config.messenger { public enum ConfigMessengerIds : ushort { diff --git a/linker/plugins/forward/ForwardApiController.cs b/linker/plugins/forward/ForwardApiController.cs index da19c4ac..f58a6205 100644 --- a/linker/plugins/forward/ForwardApiController.cs +++ b/linker/plugins/forward/ForwardApiController.cs @@ -1,6 +1,5 @@ using linker.libs.api; using linker.libs.extends; -using linker.client.capi; using linker.client.config; using System.Net; using linker.libs; @@ -8,9 +7,10 @@ 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; +using linker.plugins.client; +using linker.plugins.capi; +using linker.plugins.messenger; namespace linker.plugins.forward { diff --git a/linker/plugins/forward/ForwardStartup.cs b/linker/plugins/forward/ForwardStartup.cs index 2c29ca2b..e2fe00f2 100644 --- a/linker/plugins/forward/ForwardStartup.cs +++ b/linker/plugins/forward/ForwardStartup.cs @@ -12,7 +12,7 @@ namespace linker.plugins.forward public StartupLevel Level => StartupLevel.Normal; public string Name => "forward"; public bool Required => false; - public string[] Dependent => new string[] { "relay", "tunnel" }; + public string[] Dependent => new string[] { "messenger", "relay", "tunnel", "signin", "serialize", "config" }; public StartupLoadType LoadType => StartupLoadType.Normal; diff --git a/linker/plugins/forward/ForwardTransfer.cs b/linker/plugins/forward/ForwardTransfer.cs index 52e830ea..aadc179e 100644 --- a/linker/plugins/forward/ForwardTransfer.cs +++ b/linker/plugins/forward/ForwardTransfer.cs @@ -1,10 +1,10 @@ -using linker.client; -using linker.client.config; +using linker.client.config; using linker.libs; using linker.libs.extends; +using linker.plugins.client; using linker.plugins.forward.messenger; using linker.plugins.forward.proxy; -using linker.server; +using linker.plugins.messenger; using MemoryPack; using System.Collections.Concurrent; using System.Net; diff --git a/linker/plugins/forward/messenger/ForwardMessenger.cs b/linker/plugins/forward/messenger/ForwardMessenger.cs index ed8d98f0..a0c8a40d 100644 --- a/linker/plugins/forward/messenger/ForwardMessenger.cs +++ b/linker/plugins/forward/messenger/ForwardMessenger.cs @@ -1,6 +1,6 @@ using linker.client.config; +using linker.plugins.messenger; using linker.plugins.signin.messenger; -using linker.server; using LiteDB; using MemoryPack; using System.Net; diff --git a/linker/plugins/logger/LoggerController.cs b/linker/plugins/logger/LoggerController.cs index c3338ea6..7040ea3e 100644 --- a/linker/plugins/logger/LoggerController.cs +++ b/linker/plugins/logger/LoggerController.cs @@ -2,7 +2,7 @@ using linker.libs.api; using linker.libs; using linker.config; -using linker.client.capi; +using linker.plugins.capi; namespace linker.plugins.logger { diff --git a/linker/server/IConnection.cs b/linker/plugins/messenger/IConnection.cs similarity index 98% rename from linker/server/IConnection.cs rename to linker/plugins/messenger/IConnection.cs index 97447b0f..3d13c07e 100644 --- a/linker/server/IConnection.cs +++ b/linker/plugins/messenger/IConnection.cs @@ -6,7 +6,7 @@ using System.Net.Security; using System.Net.Sockets; using System.Text; -namespace linker.server +namespace linker.plugins.messenger { public interface IConnectionReceiveCallback { @@ -405,7 +405,7 @@ namespace linker.server { try { - await callback.Receive(this, packet, this.userToken).ConfigureAwait(false); + await callback.Receive(this, packet, userToken).ConfigureAwait(false); } catch (Exception) { @@ -422,7 +422,7 @@ namespace linker.server if (Environment.TickCount64 - ticks > 3000) { pingStart = Environment.TickCount64; - await SendPingPong(pingBytes).ConfigureAwait(false); + await SendPingPong(pingBytes).ConfigureAwait(false); } await Task.Delay(3000).ConfigureAwait(false); @@ -442,7 +442,7 @@ namespace linker.server data.Length.ToBytes(heartData); data.AsMemory().CopyTo(heartData.AsMemory(4)); - await semaphoreSlim.WaitAsync().ConfigureAwait(false); + await semaphoreSlim.WaitAsync().ConfigureAwait(false); try { if (SourceStream != null) @@ -451,7 +451,7 @@ namespace linker.server } else { - await SourceSocket.SendAsync(heartData.AsMemory(0, length), cancellationTokenSource.Token).ConfigureAwait(false); + await SourceSocket.SendAsync(heartData.AsMemory(0, length), cancellationTokenSource.Token).ConfigureAwait(false); } } @@ -481,7 +481,7 @@ namespace linker.server if (SourceStream != null) await SourceStream.WriteAsync(data, cancellationTokenSourceWrite.Token).ConfigureAwait(false); else - await SourceSocket.SendAsync(data, cancellationTokenSourceWrite.Token).ConfigureAwait(false); + await SourceSocket.SendAsync(data, cancellationTokenSourceWrite.Token).ConfigureAwait(false); SendBytes += data.Length; ticks = Environment.TickCount64; } @@ -505,7 +505,7 @@ namespace linker.server } public override async Task SendAsync(byte[] data, int length) { - return await SendAsync(data.AsMemory(0, length)).ConfigureAwait(false); + return await SendAsync(data.AsMemory(0, length)).ConfigureAwait(false); } public override async Task RelayAsync(byte bufferSize) @@ -529,7 +529,7 @@ namespace linker.server TryLimit(ref length); while (length > 0) { - await Task.Delay(30).ConfigureAwait(false); + await Task.Delay(30).ConfigureAwait(false); TryLimit(ref length); } } diff --git a/linker/server/IMessenger.cs b/linker/plugins/messenger/IMessenger.cs similarity index 93% rename from linker/server/IMessenger.cs rename to linker/plugins/messenger/IMessenger.cs index a763cb78..fe415013 100644 --- a/linker/server/IMessenger.cs +++ b/linker/plugins/messenger/IMessenger.cs @@ -1,4 +1,4 @@ -namespace linker.server +namespace linker.plugins.messenger { /// /// 消息接口 diff --git a/linker/server/MessengerResolver.cs b/linker/plugins/messenger/MessengerResolver.cs similarity index 54% rename from linker/server/MessengerResolver.cs rename to linker/plugins/messenger/MessengerResolver.cs index c6233675..3d4127b8 100644 --- a/linker/server/MessengerResolver.cs +++ b/linker/plugins/messenger/MessengerResolver.cs @@ -1,8 +1,15 @@ using linker.libs; using Microsoft.Extensions.DependencyInjection; +using System.Net.Security; +using System.Net.Sockets; +using System.Net; using System.Reflection; +using System.Security.Authentication; +using System.Security.Cryptography.X509Certificates; +using System.Buffers; +using linker.libs.extends; -namespace linker.server +namespace linker.plugins.messenger { /// /// 消息处理总线 @@ -17,12 +24,135 @@ namespace linker.server private readonly MessengerSender messengerSender; private readonly ServiceProvider serviceProvider; + private X509Certificate serverCertificate; public MessengerResolver(MessengerSender messengerSender, ServiceProvider serviceProvider) { this.messengerSender = messengerSender; this.serviceProvider = serviceProvider; } + public void Init(string certificate, string password) + { + string path = Path.GetFullPath(certificate); + if (File.Exists(path)) + { + serverCertificate = new X509Certificate(path, password); + } + else + { + LoggerHelper.Instance.Error($"file {path} not found"); + Environment.Exit(0); + } + } + public async Task BeginReceiveServer(Socket socket) + { + try + { + if (socket == null || socket.RemoteEndPoint == null) + { + return; + } + socket.KeepAlive(); + + if (await ReceiveType(socket).ConfigureAwait(false) == 0) + { + return; + } + + NetworkStream networkStream = new NetworkStream(socket, false); + SslStream sslStream = new SslStream(networkStream, true); + await sslStream.AuthenticateAsServerAsync(serverCertificate, false, SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13, false).ConfigureAwait(false); + IConnection connection = CreateConnection(sslStream, networkStream, socket, socket.LocalEndPoint as IPEndPoint, socket.RemoteEndPoint as IPEndPoint); + + connection.BeginReceive(this, null, true); + } + catch (Exception ex) + { + if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) + LoggerHelper.Instance.Error(ex); + } + } + public async Task BeginReceiveClient(Socket socket) + { + try + { + if (socket == null || socket.RemoteEndPoint == null) + { + return null; + } + socket.KeepAlive(); + await socket.SendAsync(new byte[] { 1 }).ConfigureAwait(false); + NetworkStream networkStream = new NetworkStream(socket, false); + SslStream sslStream = new SslStream(networkStream, true, new RemoteCertificateValidationCallback(ValidateServerCertificate), null); + await sslStream.AuthenticateAsClientAsync(new SslClientAuthenticationOptions + { + AllowRenegotiation = true, + EnabledSslProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13 + }).ConfigureAwait(false); + IConnection connection = CreateConnection(sslStream, networkStream, socket, socket.LocalEndPoint as IPEndPoint, socket.RemoteEndPoint as IPEndPoint); + + connection.BeginReceive(this, null, true); + + return connection; + } + catch (Exception ex) + { + if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) + LoggerHelper.Instance.Error(ex); + } + return null; + } + private bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + { + return true; + } + private IConnection CreateConnection(SslStream stream, NetworkStream networkStream, Socket socket, IPEndPoint local, IPEndPoint remote) + { + return new TcpConnection(stream, networkStream, socket, local, remote) + { + ReceiveRequestWrap = new MessageRequestWrap(), + ReceiveResponseWrap = new MessageResponseWrap() + }; + } + public Memory BuildSendData(byte[] data, IPEndPoint ep) + { + //给客户端返回他的IP+端口 + data[0] = (byte)ep.AddressFamily; + ep.Address.TryWriteBytes(data.AsSpan(1), out int length); + ((ushort)ep.Port).ToBytes(data.AsMemory(1 + length)); + + //防止一些网关修改掉它的外网IP + for (int i = 0; i < 1 + length + 2; i++) + { + data[i] = (byte)(data[i] ^ byte.MaxValue); + } + return data.AsMemory(0, 1 + length + 2); + } + private async Task ReceiveType(Socket socket) + { + byte[] sendData = ArrayPool.Shared.Rent(20); + try + { + await socket.ReceiveAsync(sendData.AsMemory(0, 1), SocketFlags.None).ConfigureAwait(false); + byte type = sendData[0]; + if (type == 0) + { + Memory memory = BuildSendData(sendData, socket.RemoteEndPoint as IPEndPoint); + await socket.SendAsync(memory, SocketFlags.None).ConfigureAwait(false); + } + return type; + } + catch (Exception) + { + } + finally + { + ArrayPool.Shared.Return(sendData); + } + return 1; + } + + /// /// 加载所有消息处理器 /// diff --git a/linker/server/MessengerSender.cs b/linker/plugins/messenger/MessengerSender.cs similarity index 99% rename from linker/server/MessengerSender.cs rename to linker/plugins/messenger/MessengerSender.cs index 06326fd0..22766426 100644 --- a/linker/server/MessengerSender.cs +++ b/linker/plugins/messenger/MessengerSender.cs @@ -1,7 +1,7 @@ using linker.libs; using System.Collections.Concurrent; -namespace linker.server +namespace linker.plugins.messenger { /// /// 消息发送器 diff --git a/linker/server/ServerStartup.cs b/linker/plugins/messenger/MessengerStartup.cs similarity index 62% rename from linker/server/ServerStartup.cs rename to linker/plugins/messenger/MessengerStartup.cs index 5f7e1b57..6c730865 100644 --- a/linker/server/ServerStartup.cs +++ b/linker/plugins/messenger/MessengerStartup.cs @@ -1,34 +1,31 @@ using linker.config; using linker.startup; -using linker.libs; using Microsoft.Extensions.DependencyInjection; using System.Reflection; -namespace linker.server +namespace linker.plugins.messenger { /// /// 服务端插件 /// - public sealed class ServerStartup : IStartup + public sealed class MessengerStartup : IStartup { public StartupLevel Level => StartupLevel.Normal; - public string Name => "server"; + public string Name => "messenger"; public bool Required => true; - public string[] Dependent => new string[] { "serialize", "firewall", "signin" }; + public string[] Dependent => new string[] { }; public StartupLoadType LoadType => StartupLoadType.Normal; public void AddClient(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); } public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); } @@ -40,6 +37,7 @@ namespace linker.server { MessengerResolver messengerResolver = serviceProvider.GetService(); messengerResolver.LoadMessenger(assemblies); + messengerResolver.Init(config.Data.Server.Certificate, config.Data.Server.Password); loaded = true; } } @@ -50,26 +48,9 @@ namespace linker.server { MessengerResolver messengerResolver = serviceProvider.GetService(); messengerResolver.LoadMessenger(assemblies); + messengerResolver.Init(config.Data.Server.Certificate, config.Data.Server.Password); loaded = true; } - - LoggerHelper.Instance.Info($"start server"); - try - { - //服务 - TcpServer tcpServer = serviceProvider.GetService(); - tcpServer.Init(config.Data.Server.Certificate, config.Data.Server.Password); - if(config.Data.Server.ServicePort > 0) - { - tcpServer.Start(config.Data.Server.ServicePort); - } - } - catch (Exception ex) - { - LoggerHelper.Instance.Error(ex); - } - LoggerHelper.Instance.Info($"server listen:{config.Data.Server.ServicePort}"); - } } } diff --git a/linker/server/ServerMessageWrap.cs b/linker/plugins/messenger/MessengerWrap.cs similarity index 99% rename from linker/server/ServerMessageWrap.cs rename to linker/plugins/messenger/MessengerWrap.cs index fe80367c..5d3a7fd0 100644 --- a/linker/server/ServerMessageWrap.cs +++ b/linker/plugins/messenger/MessengerWrap.cs @@ -2,7 +2,7 @@ using System.Buffers; using System.ComponentModel; -namespace linker.server +namespace linker.plugins.messenger { /// /// 请求数据包 diff --git a/linker/plugins/relay/RelayApiController.cs b/linker/plugins/relay/RelayApiController.cs index beff547c..752e7129 100644 --- a/linker/plugins/relay/RelayApiController.cs +++ b/linker/plugins/relay/RelayApiController.cs @@ -1,11 +1,11 @@ -using linker.client; -using linker.client.capi; -using linker.config; +using linker.config; using linker.plugins.relay.messenger; -using linker.server; using linker.libs.api; using linker.libs.extends; using MemoryPack; +using linker.plugins.client; +using linker.plugins.capi; +using linker.plugins.messenger; namespace linker.plugins.relay { diff --git a/linker/plugins/relay/RelayStartup.cs b/linker/plugins/relay/RelayStartup.cs index adf1f28d..aa81dcde 100644 --- a/linker/plugins/relay/RelayStartup.cs +++ b/linker/plugins/relay/RelayStartup.cs @@ -17,7 +17,7 @@ namespace linker.plugins.relay public bool Required => false; - public string[] Dependent => new string[] { }; + public string[] Dependent => new string[] { "messenger", "signin", "serialize", "config" }; public StartupLoadType LoadType => StartupLoadType.Normal; diff --git a/linker/plugins/relay/RelayTransfer.cs b/linker/plugins/relay/RelayTransfer.cs index 69d95134..27f61295 100644 --- a/linker/plugins/relay/RelayTransfer.cs +++ b/linker/plugins/relay/RelayTransfer.cs @@ -9,7 +9,7 @@ using System.Collections.Concurrent; using System.Net; using System.Reflection; using MemoryPack; -using linker.client; +using linker.plugins.client; namespace linker.plugins.relay { diff --git a/linker/plugins/relay/messenger/RelayMessenger.cs b/linker/plugins/relay/messenger/RelayMessenger.cs index 7ca8db8e..cecc345b 100644 --- a/linker/plugins/relay/messenger/RelayMessenger.cs +++ b/linker/plugins/relay/messenger/RelayMessenger.cs @@ -1,10 +1,11 @@ using linker.config; using linker.plugins.relay.transport; using linker.plugins.signin.messenger; -using linker.server; using linker.libs; using MemoryPack; using System.Collections.Concurrent; +using linker.plugins.server; +using linker.plugins.messenger; namespace linker.plugins.relay.messenger { diff --git a/linker/plugins/relay/transport/TransportSelfHost.cs b/linker/plugins/relay/transport/TransportSelfHost.cs index 44d454e6..122cc9d4 100644 --- a/linker/plugins/relay/transport/TransportSelfHost.cs +++ b/linker/plugins/relay/transport/TransportSelfHost.cs @@ -1,6 +1,5 @@ using linker.config; using linker.plugins.relay.messenger; -using linker.server; using linker.tunnel.connection; using linker.libs; using linker.libs.extends; @@ -11,6 +10,8 @@ using System.Net.Security; using System.Net.Sockets; using System.Security.Authentication; using System.Security.Cryptography.X509Certificates; +using linker.plugins.server; +using linker.plugins.messenger; namespace linker.plugins.relay.transport { @@ -20,15 +21,15 @@ namespace linker.plugins.relay.transport public RelayType Type => RelayType.Linker; public TunnelProtocolType ProtocolType => TunnelProtocolType.Tcp; - private readonly TcpServer tcpServer; + private readonly MessengerResolver messengerResolver; private readonly MessengerSender messengerSender; private X509Certificate2 certificate; - public TransportSelfHost(TcpServer tcpServer, MessengerSender messengerSender, FileConfig config) + public TransportSelfHost(MessengerResolver messengerResolver, MessengerSender messengerSender, FileConfig config) { - this.tcpServer = tcpServer; + this.messengerResolver = messengerResolver; this.messengerSender = messengerSender; string path = Path.GetFullPath(config.Data.Client.Certificate); @@ -46,7 +47,7 @@ namespace linker.plugins.relay.transport socket.KeepAlive(); await socket.ConnectAsync(relayInfo.Server).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false); - IConnection connection = await tcpServer.BeginReceive(socket); + IConnection connection = await messengerResolver.BeginReceiveClient(socket); MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap { Connection = connection, @@ -114,7 +115,7 @@ namespace linker.plugins.relay.transport socket.KeepAlive(); await socket.ConnectAsync(relayInfo.Server).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false); - IConnection connection = await tcpServer.BeginReceive(socket); + IConnection connection = await messengerResolver.BeginReceiveClient(socket); await messengerSender.SendOnly(new MessageRequestWrap { Connection = connection, diff --git a/linker/serializes/IPAddressFormatter.cs b/linker/plugins/serializes/IPAddressFormatter.cs similarity index 92% rename from linker/serializes/IPAddressFormatter.cs rename to linker/plugins/serializes/IPAddressFormatter.cs index e8289b40..a4822468 100644 --- a/linker/serializes/IPAddressFormatter.cs +++ b/linker/plugins/serializes/IPAddressFormatter.cs @@ -1,7 +1,7 @@ using MemoryPack; using System.Net; -namespace linker.serializes +namespace linker.plugins.serializes { /// /// MemoryPack 的 IPAddress序列化扩展 @@ -25,7 +25,7 @@ namespace linker.serializes span[0] = (byte)bytesWritten; writer.WriteCollectionHeader(bytesWritten + 4); - writer.WriteSpan(span.Slice(0, bytesWritten+1)); + writer.WriteSpan(span.Slice(0, bytesWritten + 1)); } public override void Deserialize(ref MemoryPackReader reader, scoped ref IPAddress value) diff --git a/linker/serializes/IPEndPointFormatter.cs b/linker/plugins/serializes/IPEndPointFormatter.cs similarity index 97% rename from linker/serializes/IPEndPointFormatter.cs rename to linker/plugins/serializes/IPEndPointFormatter.cs index 30650ec9..35711a09 100644 --- a/linker/serializes/IPEndPointFormatter.cs +++ b/linker/plugins/serializes/IPEndPointFormatter.cs @@ -2,7 +2,7 @@ using MemoryPack; using System.Net; -namespace linker.serializes +namespace linker.plugins.serializes { /// /// MemoryPack 的 IPEndPoint序列化扩展 diff --git a/linker/serializes/SerializeStartup.cs b/linker/plugins/serializes/SerializeStartup.cs similarity index 97% rename from linker/serializes/SerializeStartup.cs rename to linker/plugins/serializes/SerializeStartup.cs index e79c227d..7a039c13 100644 --- a/linker/serializes/SerializeStartup.cs +++ b/linker/plugins/serializes/SerializeStartup.cs @@ -4,7 +4,7 @@ using MemoryPack; using Microsoft.Extensions.DependencyInjection; using System.Reflection; -namespace linker.serializes +namespace linker.plugins.serializes { /// /// MemoryPack 序列化扩展加载插件 diff --git a/linker/plugins/server/ServerStartup.cs b/linker/plugins/server/ServerStartup.cs new file mode 100644 index 00000000..b6a45a82 --- /dev/null +++ b/linker/plugins/server/ServerStartup.cs @@ -0,0 +1,53 @@ +using linker.config; +using linker.startup; +using linker.libs; +using Microsoft.Extensions.DependencyInjection; +using System.Reflection; + +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, Assembly[] assemblies) + { + } + + public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) + { + serviceCollection.AddSingleton(); + } + + public void UseClient(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) + { + } + + public void UseServer(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) + { + LoggerHelper.Instance.Info($"start server"); + try + { + //服务 + TcpServer tcpServer = serviceProvider.GetService(); + if (config.Data.Server.ServicePort > 0) + { + tcpServer.Start(config.Data.Server.ServicePort); + } + } + catch (Exception ex) + { + LoggerHelper.Instance.Error(ex); + } + LoggerHelper.Instance.Info($"server listen:{config.Data.Server.ServicePort}"); + + } + } +} diff --git a/linker/plugins/server/TcpServer.cs b/linker/plugins/server/TcpServer.cs new file mode 100644 index 00000000..d05f512d --- /dev/null +++ b/linker/plugins/server/TcpServer.cs @@ -0,0 +1,127 @@ +using linker.libs.extends; +using linker.plugins.messenger; +using System.Net; +using System.Net.Sockets; + +namespace linker.plugins.server +{ + public sealed class TcpServer + { + private Socket socket; + private Socket socketUdp; + private CancellationTokenSource cancellationTokenSource; + private readonly MessengerResolver messengerResolver; + + public TcpServer(MessengerResolver messengerResolver) + { + this.messengerResolver = messengerResolver; + cancellationTokenSource = new CancellationTokenSource(); + + } + + public void Start(int port) + { + if (socket == null) + { + socket = BindAccept(port); + } + } + + private async Task BindUdp(int port) + { + socketUdp = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + socketUdp.Bind(new IPEndPoint(IPAddress.Any, port)); + socketUdp.WindowsUdpBug(); + IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, IPEndPoint.MinPort); + byte[] buffer = new byte[1024]; + byte[] sendData = new byte[20]; + while (true) + { + try + { + SocketReceiveFromResult result = await socketUdp.ReceiveFromAsync(buffer, SocketFlags.None, endPoint).ConfigureAwait(false); + IPEndPoint ep = result.RemoteEndPoint as IPEndPoint; + try + { + Memory memory = messengerResolver.BuildSendData(sendData, ep); + + await socketUdp.SendToAsync(memory, ep).ConfigureAwait(false); + } + catch (Exception) + { + } + } + catch (Exception) + { + break; + } + } + } + + private Socket BindAccept(int port) + { + IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, port); + Socket socket = new Socket(localEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); + socket.IPv6Only(localEndPoint.AddressFamily, false); + socket.ReuseBind(localEndPoint); + socket.Listen(int.MaxValue); + + SocketAsyncEventArgs acceptEventArg = new SocketAsyncEventArgs + { + UserToken = socket, + SocketFlags = SocketFlags.None, + }; + acceptEventArg.Completed += IO_Completed; + StartAccept(acceptEventArg); + + _ = BindUdp(port); + return socket; + } + private void StartAccept(SocketAsyncEventArgs acceptEventArg) + { + acceptEventArg.AcceptSocket = null; + Socket token = (Socket)acceptEventArg.UserToken; + try + { + if (token.AcceptAsync(acceptEventArg) == false) + { + ProcessAccept(acceptEventArg); + } + } + catch (Exception) + { + token?.SafeClose(); + } + } + private void IO_Completed(object sender, SocketAsyncEventArgs e) + { + switch (e.LastOperation) + { + case SocketAsyncOperation.Accept: + ProcessAccept(e); + break; + default: + break; + } + } + private void ProcessAccept(SocketAsyncEventArgs e) + { + if (e.AcceptSocket != null) + { + _ = messengerResolver.BeginReceiveServer(e.AcceptSocket); + StartAccept(e); + } + } + + public void Stop() + { + cancellationTokenSource?.Cancel(); + socket?.SafeClose(); + socket = null; + } + public void Disponse() + { + Stop(); + } + } +} diff --git a/linker/server/config/Config.cs b/linker/plugins/server/config/Config.cs similarity index 100% rename from linker/server/config/Config.cs rename to linker/plugins/server/config/Config.cs diff --git a/linker/plugins/sforward/SForwardApiController.cs b/linker/plugins/sforward/SForwardApiController.cs index 7d48b7e4..9f75766f 100644 --- a/linker/plugins/sforward/SForwardApiController.cs +++ b/linker/plugins/sforward/SForwardApiController.cs @@ -1,11 +1,11 @@ using linker.libs.api; using linker.libs.extends; -using linker.client.capi; using linker.client.config; -using linker.client; -using linker.server; using MemoryPack; using linker.plugins.sforward.messenger; +using linker.plugins.client; +using linker.plugins.capi; +using linker.plugins.messenger; namespace linker.plugins.sforward { diff --git a/linker/plugins/sforward/SForwardStartup.cs b/linker/plugins/sforward/SForwardStartup.cs index cf5016e0..51902cd3 100644 --- a/linker/plugins/sforward/SForwardStartup.cs +++ b/linker/plugins/sforward/SForwardStartup.cs @@ -18,7 +18,7 @@ namespace linker.plugins.sforward public StartupLevel Level => StartupLevel.Normal; - public string[] Dependent => Array.Empty(); + public string[] Dependent => new string[] { "messenger", "signin", "serialize", "config" }; public StartupLoadType LoadType => StartupLoadType.Normal; diff --git a/linker/plugins/sforward/SForwardTransfer.cs b/linker/plugins/sforward/SForwardTransfer.cs index 40bf83ca..5b2a9974 100644 --- a/linker/plugins/sforward/SForwardTransfer.cs +++ b/linker/plugins/sforward/SForwardTransfer.cs @@ -1,13 +1,13 @@ using linker.client.config; -using linker.client; using linker.libs; -using linker.server; using linker.plugins.sforward.messenger; using MemoryPack; using linker.plugins.sforward.config; using System.Net.Sockets; using System.Net; using linker.libs.extends; +using linker.plugins.client; +using linker.plugins.messenger; namespace linker.plugins.sforward { diff --git a/linker/plugins/sforward/messenger/SForwardMessenger.cs b/linker/plugins/sforward/messenger/SForwardMessenger.cs index fba9040a..1b6234db 100644 --- a/linker/plugins/sforward/messenger/SForwardMessenger.cs +++ b/linker/plugins/sforward/messenger/SForwardMessenger.cs @@ -2,13 +2,13 @@ using linker.plugins.sforward.config; using linker.plugins.sforward.validator; using linker.plugins.signin.messenger; -using linker.server; using MemoryPack; using linker.plugins.sforward.proxy; using linker.config; using LiteDB; using System.Net; using linker.plugins.forward.messenger; +using linker.plugins.messenger; namespace linker.plugins.sforward.messenger { diff --git a/linker/plugins/sforward/validator/IValidator.cs b/linker/plugins/sforward/validator/IValidator.cs index a13ee9c9..b8272c1c 100644 --- a/linker/plugins/sforward/validator/IValidator.cs +++ b/linker/plugins/sforward/validator/IValidator.cs @@ -1,5 +1,5 @@ -using linker.plugins.sforward.config; -using linker.server; +using linker.plugins.messenger; +using linker.plugins.sforward.config; namespace linker.plugins.sforward.validator { diff --git a/linker/plugins/sforward/validator/Validator.cs b/linker/plugins/sforward/validator/Validator.cs index 3bd7af7f..f04adf8c 100644 --- a/linker/plugins/sforward/validator/Validator.cs +++ b/linker/plugins/sforward/validator/Validator.cs @@ -1,6 +1,6 @@ using linker.config; +using linker.plugins.messenger; using linker.plugins.sforward.config; -using linker.server; namespace linker.plugins.sforward.validator { diff --git a/linker/plugins/signIn/SignInApiController.cs b/linker/plugins/signIn/SignInApiController.cs index be2ebbd6..eaca1908 100644 --- a/linker/plugins/signIn/SignInApiController.cs +++ b/linker/plugins/signIn/SignInApiController.cs @@ -2,10 +2,10 @@ using linker.plugins.signin.messenger; using linker.libs.api; using linker.libs.extends; -using linker.client; -using linker.server; using MemoryPack; -using linker.client.capi; +using linker.plugins.client; +using linker.plugins.capi; +using linker.plugins.messenger; namespace linker.plugins.signin { diff --git a/linker/plugins/signIn/SignInStartup.cs b/linker/plugins/signIn/SignInStartup.cs index e40fd9c7..877a4599 100644 --- a/linker/plugins/signIn/SignInStartup.cs +++ b/linker/plugins/signIn/SignInStartup.cs @@ -13,7 +13,7 @@ namespace linker.plugins.signin public bool Required => false; - public string[] Dependent => new string[] { }; + public string[] Dependent => new string[] { "messenger", }; public StartupLoadType LoadType => StartupLoadType.Normal; diff --git a/linker/plugins/signIn/messenger/SignCaching.cs b/linker/plugins/signIn/messenger/SignCaching.cs index 3043ca1c..a2ea27dc 100644 --- a/linker/plugins/signIn/messenger/SignCaching.cs +++ b/linker/plugins/signIn/messenger/SignCaching.cs @@ -1,11 +1,11 @@ using linker.store; -using linker.server; using linker.libs; using LiteDB; using MemoryPack; using System.Collections.Concurrent; using System.Net; using System.Text.Json.Serialization; +using linker.plugins.messenger; namespace linker.plugins.signin.messenger { diff --git a/linker/plugins/signIn/messenger/SignInMessenger.cs b/linker/plugins/signIn/messenger/SignInMessenger.cs index 6bcbd187..d7c25cd0 100644 --- a/linker/plugins/signIn/messenger/SignInMessenger.cs +++ b/linker/plugins/signIn/messenger/SignInMessenger.cs @@ -1,8 +1,8 @@ -using linker.client; -using linker.config; -using linker.server; -using linker.libs; +using linker.config; using MemoryPack; +using linker.plugins.client; +using linker.plugins.server; +using linker.plugins.messenger; namespace linker.plugins.signin.messenger { diff --git a/linker/plugins/tunnel/TunnelAdapter.cs b/linker/plugins/tunnel/TunnelAdapter.cs index 8d55a197..3784f1ae 100644 --- a/linker/plugins/tunnel/TunnelAdapter.cs +++ b/linker/plugins/tunnel/TunnelAdapter.cs @@ -1,8 +1,6 @@ -using linker.client; -using linker.client.config; +using linker.client.config; using linker.config; using linker.plugins.tunnel.messenger; -using linker.server; using linker.tunnel.adapter; using linker.tunnel.transport; using linker.libs; @@ -11,6 +9,8 @@ using System.Net; using System.Security.Cryptography.X509Certificates; using linker.tunnel.wanport; using System.Buffers.Binary; +using linker.plugins.client; +using linker.plugins.messenger; namespace linker.plugins.tunnel { diff --git a/linker/plugins/tunnel/TunnelApiController.cs b/linker/plugins/tunnel/TunnelApiController.cs index baad11b7..1f13792c 100644 --- a/linker/plugins/tunnel/TunnelApiController.cs +++ b/linker/plugins/tunnel/TunnelApiController.cs @@ -1,8 +1,5 @@ -using linker.client; -using linker.client.capi; -using linker.config; +using linker.config; using linker.plugins.tunnel.messenger; -using linker.server; using linker.tunnel.adapter; using linker.tunnel.transport; using linker.libs.api; @@ -11,6 +8,10 @@ using MemoryPack; using System.Collections.Concurrent; using linker.tunnel.wanport; using linker.client.config; +using linker.plugins.client; +using linker.plugins.server; +using linker.plugins.capi; +using linker.plugins.messenger; namespace linker.plugins.tunnel { diff --git a/linker/plugins/tunnel/TunnelConfigTransfer.cs b/linker/plugins/tunnel/TunnelConfigTransfer.cs index 1cd79726..6aaaa7e4 100644 --- a/linker/plugins/tunnel/TunnelConfigTransfer.cs +++ b/linker/plugins/tunnel/TunnelConfigTransfer.cs @@ -1,12 +1,14 @@ -using linker.client; -using linker.client.config; +using linker.client.config; using linker.config; +using linker.libs; +using linker.plugins.client; +using linker.plugins.messenger; using linker.plugins.tunnel.messenger; -using linker.server; using linker.tunnel.adapter; using linker.tunnel.wanport; using MemoryPack; using System.Collections.Concurrent; +using System.Net.Quic; namespace linker.plugins.tunnel { @@ -35,20 +37,14 @@ namespace linker.plugins.tunnel this.runningConfigTransfer = runningConfigTransfer; this.tunnelAdapter = tunnelAdapter; - clientSignInState.NetworkEnabledHandle += (times) => - { - GetRemoveRouteLevel(); - }; - clientSignInState.NetworkFirstEnabledHandle += () => - { - SyncExcludeIP(); - }; + + InitRouteLevel(); + InitExcludeIP(); InitConfig(); - runningConfigTransfer.Setter(exipConfigKey, SettExcludeIPs); - runningConfigTransfer.Getter(exipConfigKey, () => MemoryPackSerializer.Serialize(GetExcludeIPs())); - + TestQuic(); } + private void InitConfig() { bool updateVersion = false; @@ -85,7 +81,7 @@ namespace linker.plugins.tunnel /// public void RefreshConfig() { - GetRemoveRouteLevel(); + GetRemoteRouteLevel(); } /// /// 修改自己的网关层级信息 @@ -95,7 +91,7 @@ namespace linker.plugins.tunnel { running.Data.Tunnel.RouteLevelPlus = tunnelTransportFileConfigInfo.RouteLevelPlus; running.Data.Update(); - GetRemoveRouteLevel(); + GetRemoteRouteLevel(); } /// /// 收到别人发给我的修改我的信息 @@ -108,7 +104,7 @@ namespace linker.plugins.tunnel Interlocked.Increment(ref version); return GetLocalRouteLevel(); } - private void GetRemoveRouteLevel() + private void GetRemoteRouteLevel() { TunnelTransportRouteLevelInfo config = GetLocalRouteLevel(); messengerSender.SendReply(new MessageRequestWrap @@ -138,11 +134,28 @@ namespace linker.plugins.tunnel { MachineId = config.Data.Client.Id, RouteLevel = config.Data.Client.Tunnel.RouteLevel, - RouteLevelPlus = running.Data.Tunnel.RouteLevelPlus + RouteLevelPlus = running.Data.Tunnel.RouteLevelPlus, + NeedReboot = reboot + }; + } + private void InitRouteLevel() + { + clientSignInState.NetworkEnabledHandle += (times) => + { + GetRemoteRouteLevel(); }; } + private void InitExcludeIP() + { + clientSignInState.NetworkFirstEnabledHandle += () => + { + SyncExcludeIP(); + }; + runningConfigTransfer.Setter(exipConfigKey, SettExcludeIPs); + runningConfigTransfer.Getter(exipConfigKey, () => MemoryPackSerializer.Serialize(GetExcludeIPs())); + } private void SyncExcludeIP() { runningConfigTransfer.Sync(exipConfigKey, MemoryPackSerializer.Serialize(running.Data.Tunnel.ExcludeIPs)); @@ -163,5 +176,36 @@ namespace linker.plugins.tunnel running.Data.Tunnel.ExcludeIPs = MemoryPackSerializer.Deserialize(data.Span); running.Data.Update(); } + + + bool reboot = 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); + + reboot = true; + } + } + catch (Exception) + { + } + } + + if (File.Exists("msquic.dll.temp")) + { + File.Delete("msquic.dll.temp"); + } + } + } } } diff --git a/linker/plugins/tunnel/TunnelStartup.cs b/linker/plugins/tunnel/TunnelStartup.cs index da18b148..70bc6ed9 100644 --- a/linker/plugins/tunnel/TunnelStartup.cs +++ b/linker/plugins/tunnel/TunnelStartup.cs @@ -23,7 +23,7 @@ namespace linker.plugins.tunnel public bool Required => false; - public string[] Dependent => new string[] { }; + public string[] Dependent => new string[] { "messenger", "signin", "serialize", "config" }; public StartupLoadType LoadType => StartupLoadType.Normal; diff --git a/linker/plugins/tunnel/config/Config.cs b/linker/plugins/tunnel/config/Config.cs index 7ebc460c..cd273aa5 100644 --- a/linker/plugins/tunnel/config/Config.cs +++ b/linker/plugins/tunnel/config/Config.cs @@ -72,6 +72,8 @@ namespace linker.config public string MachineId { get; set; } public int RouteLevel { get; set; } = 0; public int RouteLevelPlus { get; set; } = 0; + + public bool NeedReboot { get; set; } } diff --git a/linker/plugins/tunnel/messenger/TunnelMessenger.cs b/linker/plugins/tunnel/messenger/TunnelMessenger.cs index e7e29fe3..aa863b4b 100644 --- a/linker/plugins/tunnel/messenger/TunnelMessenger.cs +++ b/linker/plugins/tunnel/messenger/TunnelMessenger.cs @@ -1,11 +1,11 @@ using linker.config; using linker.plugins.signin.messenger; -using linker.server; using linker.tunnel; using linker.tunnel.adapter; using linker.tunnel.transport; using linker.libs; using MemoryPack; +using linker.plugins.messenger; namespace linker.plugins.tunnel.messenger { diff --git a/linker/plugins/tuntap/TuntapApiController.cs b/linker/plugins/tuntap/TuntapApiController.cs index 9bfc5ae3..dce98f24 100644 --- a/linker/plugins/tuntap/TuntapApiController.cs +++ b/linker/plugins/tuntap/TuntapApiController.cs @@ -1,16 +1,16 @@ -using linker.server; -using linker.libs.api; +using linker.libs.api; using linker.plugins.tuntap.vea; -using linker.client; using linker.plugins.tuntap.messenger; using MemoryPack; using linker.libs.extends; -using linker.client.capi; using System.Collections.Concurrent; using linker.config; -using linker.plugins.forward.proxy; using linker.tunnel.connection; using linker.plugins.tuntap.proxy; +using linker.plugins.client; +using linker.plugins.server; +using linker.plugins.capi; +using linker.plugins.messenger; namespace linker.plugins.tuntap { diff --git a/linker/plugins/tuntap/TuntapStartup.cs b/linker/plugins/tuntap/TuntapStartup.cs index fc85379b..beb0e50c 100644 --- a/linker/plugins/tuntap/TuntapStartup.cs +++ b/linker/plugins/tuntap/TuntapStartup.cs @@ -16,7 +16,7 @@ namespace linker.plugins.tuntap public StartupLevel Level => StartupLevel.Normal; public string Name => "tuntap"; public bool Required => false; - public string[] Dependent => new string[] { "relay", "tunnel" }; + public string[] Dependent => new string[] {"messenger", "relay", "tunnel", "signin", "serialize", "config" }; public StartupLoadType LoadType => StartupLoadType.Normal; diff --git a/linker/plugins/tuntap/TuntapTransfer.cs b/linker/plugins/tuntap/TuntapTransfer.cs index 261aee98..935de274 100644 --- a/linker/plugins/tuntap/TuntapTransfer.cs +++ b/linker/plugins/tuntap/TuntapTransfer.cs @@ -1,10 +1,8 @@ -using linker.client; -using linker.client.config; +using linker.client.config; using linker.config; using linker.plugins.tuntap.messenger; using linker.plugins.tuntap.proxy; using linker.plugins.tuntap.vea; -using linker.server; using linker.libs; using MemoryPack; using System.Buffers.Binary; @@ -13,6 +11,8 @@ using System.Net; using System.Net.NetworkInformation; using System.Net.Sockets; using linker.libs.extends; +using linker.plugins.client; +using linker.plugins.messenger; namespace linker.plugins.tuntap { diff --git a/linker/plugins/tuntap/messenger/TuntapMessenger.cs b/linker/plugins/tuntap/messenger/TuntapMessenger.cs index d2a104b2..944bda48 100644 --- a/linker/plugins/tuntap/messenger/TuntapMessenger.cs +++ b/linker/plugins/tuntap/messenger/TuntapMessenger.cs @@ -1,6 +1,6 @@ -using linker.plugins.signin.messenger; +using linker.plugins.messenger; +using linker.plugins.signin.messenger; using linker.plugins.tuntap.vea; -using linker.server; using MemoryPack; namespace linker.plugins.tuntap.messenger diff --git a/linker/plugins/updater/UpdaterClientApiController.cs b/linker/plugins/updater/UpdaterClientApiController.cs index 5322fbb1..d9c02445 100644 --- a/linker/plugins/updater/UpdaterClientApiController.cs +++ b/linker/plugins/updater/UpdaterClientApiController.cs @@ -1,7 +1,4 @@ -using linker.server; -using linker.libs.api; -using linker.client; -using linker.client.capi; +using linker.libs.api; using linker.config; using linker.plugins.updater.messenger; using MemoryPack; @@ -9,6 +6,9 @@ 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; namespace linker.plugins.updater { diff --git a/linker/plugins/updater/UpdaterClientTransfer.cs b/linker/plugins/updater/UpdaterClientTransfer.cs index 2273d3f1..cd7e86ac 100644 --- a/linker/plugins/updater/UpdaterClientTransfer.cs +++ b/linker/plugins/updater/UpdaterClientTransfer.cs @@ -1,8 +1,9 @@ -using linker.client; -using linker.client.config; +using linker.client.config; using linker.config; +using linker.plugins.client; +using linker.plugins.messenger; +using linker.plugins.server; using linker.plugins.updater.messenger; -using linker.server; using MemoryPack; using System.Collections.Concurrent; @@ -78,7 +79,6 @@ namespace linker.plugins.updater { updaterHelper.Confirm(updateInfo, version); } - /// /// 来自别的客户端的更新信息 /// diff --git a/linker/plugins/updater/UpdaterHelper.cs b/linker/plugins/updater/UpdaterHelper.cs index 00a10588..fed9f8b3 100644 --- a/linker/plugins/updater/UpdaterHelper.cs +++ b/linker/plugins/updater/UpdaterHelper.cs @@ -36,10 +36,11 @@ namespace linker.plugins.updater using HttpClient httpClient = new HttpClient(); string str = await httpClient.GetStringAsync("http://gh.snltty.com:1808/https://github.com/snltty/linker/releases/latest").WaitAsync(TimeSpan.FromSeconds(15)); - Match match = new Regex(@"/snltty/linker/tree/(v[\d.]+)").Match(str); - string tag = match.Groups[1].Value; + string datetime = DateTime.Parse(new Regex("datetime=\"(.+)\"").Match(str).Groups[1].Value).ToString("yyyy-MM-dd HH:mm:ss"); + string tag = new Regex(@"/snltty/linker/tree/(v[\d.]+)").Match(str).Groups[1].Value; string[] msg = new Regex(@"
  • (.+)
  • ").Matches(str).Select(c => c.Groups[1].Value).ToArray(); + updateInfo.DateTime = datetime; updateInfo.Msg = msg; updateInfo.Version = tag; @@ -243,6 +244,8 @@ namespace linker.plugins.updater public string Version { get; set; } [MemoryPackIgnore] public string[] Msg { get; set; } + [MemoryPackIgnore] + public string DateTime { get; set; } public string MachineId { get; set; } public UpdateStatus Status { get; set; } = UpdateStatus.None; diff --git a/linker/plugins/updater/UpdaterStartup.cs b/linker/plugins/updater/UpdaterStartup.cs index 19cb78fe..597691f3 100644 --- a/linker/plugins/updater/UpdaterStartup.cs +++ b/linker/plugins/updater/UpdaterStartup.cs @@ -17,7 +17,7 @@ namespace linker.plugins.updater public StartupLevel Level => StartupLevel.Normal; - public string[] Dependent => Array.Empty(); + public string[] Dependent => new string[] { "messenger", "signin", "serialize", "config" }; public StartupLoadType LoadType => StartupLoadType.Normal; diff --git a/linker/plugins/updater/messenger/UpdaterMessenger.cs b/linker/plugins/updater/messenger/UpdaterMessenger.cs index d4c53375..4e95571d 100644 --- a/linker/plugins/updater/messenger/UpdaterMessenger.cs +++ b/linker/plugins/updater/messenger/UpdaterMessenger.cs @@ -1,7 +1,8 @@ using linker.config; +using linker.plugins.messenger; +using linker.plugins.server; using linker.plugins.signin.messenger; using linker.plugins.updater.config; -using linker.server; using MemoryPack; namespace linker.plugins.updater.messenger diff --git a/linker/server/TcpServer.cs b/linker/server/TcpServer.cs deleted file mode 100644 index 0cd44074..00000000 --- a/linker/server/TcpServer.cs +++ /dev/null @@ -1,258 +0,0 @@ -using linker.libs; -using linker.libs.extends; -using System.Buffers; -using System.Net; -using System.Net.Security; -using System.Net.Sockets; -using System.Security.Authentication; -using System.Security.Cryptography.X509Certificates; - -namespace linker.server -{ - public sealed class TcpServer - { - private Socket socket; - private Socket socketUdp; - private CancellationTokenSource cancellationTokenSource; - private X509Certificate serverCertificate; - - private readonly IConnectionReceiveCallback connectionReceiveCallback; - public TcpServer(MessengerResolver connectionReceiveCallback) - { - cancellationTokenSource = new CancellationTokenSource(); - this.connectionReceiveCallback = connectionReceiveCallback; - } - - public void Init(string certificate, string password) - { - string path = Path.GetFullPath(certificate); - if (File.Exists(path)) - { - serverCertificate = new X509Certificate(path, password); - } - else - { - LoggerHelper.Instance.Error($"file {path} not found"); - Environment.Exit(0); - } - } - - public void Start(int port) - { - if (socket == null) - { - socket = BindAccept(port); - } - } - private Socket BindAccept(int port) - { - IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, port); - Socket socket = new Socket(localEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); - socket.IPv6Only(localEndPoint.AddressFamily, false); - socket.ReuseBind(localEndPoint); - socket.Listen(int.MaxValue); - - SocketAsyncEventArgs acceptEventArg = new SocketAsyncEventArgs - { - UserToken = socket, - SocketFlags = SocketFlags.None, - }; - acceptEventArg.Completed += IO_Completed; - StartAccept(acceptEventArg); - - _ = BindUdp(port); - return socket; - } - - - private Memory BuildSendData(byte[] data, IPEndPoint ep) - { - //给客户端返回他的IP+端口 - data[0] = (byte)ep.AddressFamily; - ep.Address.TryWriteBytes(data.AsSpan(1), out int length); - ((ushort)ep.Port).ToBytes(data.AsMemory(1 + length)); - - //防止一些网关修改掉它的外网IP - for (int i = 0; i < 1 + length + 2; i++) - { - data[i] = (byte)(data[i] ^ byte.MaxValue); - } - return data.AsMemory(0, 1 + length + 2); - } - - private async Task BindUdp(int port) - { - socketUdp = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - socketUdp.Bind(new IPEndPoint(IPAddress.Any, port)); - socketUdp.WindowsUdpBug(); - IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, IPEndPoint.MinPort); - byte[] buffer = new byte[1024]; - byte[] sendData = new byte[20]; - while (true) - { - try - { - SocketReceiveFromResult result = await socketUdp.ReceiveFromAsync(buffer, SocketFlags.None, endPoint).ConfigureAwait(false); - IPEndPoint ep = result.RemoteEndPoint as IPEndPoint; - try - { - Memory memory = BuildSendData(sendData, ep); - - await socketUdp.SendToAsync(memory, ep).ConfigureAwait(false); - } - catch (Exception) - { - } - } - catch (Exception) - { - break; - } - } - } - - private void StartAccept(SocketAsyncEventArgs acceptEventArg) - { - acceptEventArg.AcceptSocket = null; - Socket token = (Socket)acceptEventArg.UserToken; - try - { - if (token.AcceptAsync(acceptEventArg) == false) - { - ProcessAccept(acceptEventArg); - } - } - catch (Exception) - { - token?.SafeClose(); - } - } - private void IO_Completed(object sender, SocketAsyncEventArgs e) - { - switch (e.LastOperation) - { - case SocketAsyncOperation.Accept: - ProcessAccept(e); - break; - default: - break; - } - } - private void ProcessAccept(SocketAsyncEventArgs e) - { - if (e.AcceptSocket != null) - { - _ = BeginReceiveServer(e.AcceptSocket); - StartAccept(e); - } - } - - private async Task ReceiveType(Socket socket) - { - byte[] sendData = ArrayPool.Shared.Rent(20); - try - { - await socket.ReceiveAsync(sendData.AsMemory(0, 1), SocketFlags.None).ConfigureAwait(false); - byte type = sendData[0]; - if (type == 0) - { - Memory memory = BuildSendData(sendData, socket.RemoteEndPoint as IPEndPoint); - await socket.SendAsync(memory, SocketFlags.None).ConfigureAwait(false); - } - return type; - } - catch (Exception) - { - } - finally - { - ArrayPool.Shared.Return(sendData); - } - return 1; - } - private async Task BeginReceiveServer(Socket socket) - { - try - { - if (socket == null || socket.RemoteEndPoint == null) - { - return; - } - socket.KeepAlive(); - - if (await ReceiveType(socket).ConfigureAwait(false) == 0) - { - return; - } - - NetworkStream networkStream = new NetworkStream(socket, false); - SslStream sslStream = new SslStream(networkStream, true); - await sslStream.AuthenticateAsServerAsync(serverCertificate, false, SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13, false).ConfigureAwait(false); - IConnection connection = CreateConnection(sslStream, networkStream, socket, socket.LocalEndPoint as IPEndPoint, socket.RemoteEndPoint as IPEndPoint); - - - connection.BeginReceive(connectionReceiveCallback, null, true); - } - catch (Exception ex) - { - if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) - LoggerHelper.Instance.Error(ex); - } - } - - private bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) - { - return true; - } - public async Task BeginReceive(Socket socket) - { - try - { - if (socket == null || socket.RemoteEndPoint == null) - { - return null; - } - socket.KeepAlive(); - await socket.SendAsync(new byte[] { 1 }).ConfigureAwait(false); - NetworkStream networkStream = new NetworkStream(socket, false); - SslStream sslStream = new SslStream(networkStream, true, new RemoteCertificateValidationCallback(ValidateServerCertificate), null); - await sslStream.AuthenticateAsClientAsync(new SslClientAuthenticationOptions - { - AllowRenegotiation = true, - EnabledSslProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13 - }).ConfigureAwait(false); - IConnection connection = CreateConnection(sslStream, networkStream, socket, socket.LocalEndPoint as IPEndPoint, socket.RemoteEndPoint as IPEndPoint); - - connection.BeginReceive(connectionReceiveCallback, null, true); - - return connection; - } - catch (Exception ex) - { - if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) - LoggerHelper.Instance.Error(ex); - } - return null; - } - - public IConnection CreateConnection(SslStream stream, NetworkStream networkStream, Socket socket, IPEndPoint local, IPEndPoint remote) - { - return new TcpConnection(stream, networkStream, socket, local, remote) - { - ReceiveRequestWrap = new MessageRequestWrap(), - ReceiveResponseWrap = new MessageResponseWrap() - }; - } - - public void Stop() - { - cancellationTokenSource?.Cancel(); - socket?.SafeClose(); - socket = null; - } - public void Disponse() - { - Stop(); - } - } -}