diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index a5d87631..01a7a163 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -19,7 +19,7 @@ jobs: release_name: v1.9.7.${{ steps.date.outputs.today }} draft: false prerelease: false - body: "1. 一些累计更新,一些BUG修复\r\n2. 重构中继和穿透的多节点模式\r\n3. 中继连接合并到隧道协议中\r\n4. 修复socks代理模块\r\n5. 发布飞牛fpk安装包(docker+bin)\r\n6. 先不要更新,作者测试中" + body: "1. 一些累计更新,一些BUG修复\r\n2. 重构中继和穿透的多节点模式\r\n3. 中继连接合并到隧道协议中\r\n4. 修复socks代理模块\r\n5. 发布飞牛fpk安装包(docker+bin)\r\n6. 优化虚拟网卡自动连接表现\r\n7. 简化加入分组操作\r\n8. 先不要更新,作者测试中" - name: setup node.js uses: actions/setup-node@v2 with: diff --git a/linker.messenger.node/INodeMasterDenyStore.cs b/linker.messenger.node/INodeMasterDenyStore.cs index 46efed13..d1fe6585 100644 --- a/linker.messenger.node/INodeMasterDenyStore.cs +++ b/linker.messenger.node/INodeMasterDenyStore.cs @@ -1,15 +1,41 @@ -namespace linker.messenger.node +using System.Net; + +namespace linker.messenger.node { + /// + /// 禁用的主机 + /// public interface INodeMasterDenyStore { public Task Get(MasterDenyStoreRequestInfo request); - public Task Get(uint ip); - public Task Add(string str); - public Task Delete(int id); + public Task Get(uint ip,int plus); + public Task Add(MasterDenyAddInfo info); + public Task Delete(MasterDenyDelInfo info); } + public sealed class MastersRequestInfo + { + public string NodeId { get; set; } + public int Page { get; set; } + public int Sise { get; set; } + } + public sealed class MastersResponseInfo + { + public int Page { get; set; } + public int Sise { get; set; } + public int Count { get; set; } + public List List { get; set; } = new List(); + } + public sealed class MasterConnInfo + { + public IPEndPoint Addr { get; set; } + public string NodeId { get; set; } + } + + public sealed class MasterDenyStoreRequestInfo { + public string NodeId { get; set; } public int Page { get; set; } public int Sise { get; set; } public string Str { get; set; } @@ -27,6 +53,20 @@ public uint Ip { get; set; } public uint Plus { get; set; } public string Str { get; set; } + public string Remark { get; set; } } + + public sealed class MasterDenyAddInfo + { + public string NodeId { get; set; } + public int Id { get; set; } + public string Str { get; set; } + public string Remark { get; set; } + } + public sealed class MasterDenyDelInfo + { + public string NodeId { get; set; } + public int Id { get; set; } + } } diff --git a/linker.messenger.node/NodeReportTransfer.cs b/linker.messenger.node/NodeReportTransfer.cs index 43192d11..cfe0e51b 100644 --- a/linker.messenger.node/NodeReportTransfer.cs +++ b/linker.messenger.node/NodeReportTransfer.cs @@ -21,6 +21,10 @@ namespace linker.messenger.node public virtual ushort MessengerIdExitForward { get; } public virtual ushort MessengerIdReport { get; } public virtual ushort MessengerIdSignIn { get; } + public virtual ushort MessengerIdMastersForward { get; } + public virtual ushort MessengerIdDenysForward { get; } + public virtual ushort MessengerIdDenysAddForward { get; } + public virtual ushort MessengerIdDenysDelForward { get; } private int connectionNum = 0; @@ -36,10 +40,11 @@ namespace linker.messenger.node private readonly IMessengerSender messengerSender; private readonly INodeStore nodeStore; private readonly IMessengerResolver messengerResolver; + private readonly INodeMasterDenyStore nodeMasterDenyStore; public NodeReportTransfer(NodeConnectionTransfer nodeConnectionTransfer, INodeConfigStore nodeConfigStore, ISerializer serializer, IMessengerSender messengerSender, INodeStore nodeStore, - IMessengerResolver messengerResolver, ICommonStore commonStore) + IMessengerResolver messengerResolver, ICommonStore commonStore, INodeMasterDenyStore nodeMasterDenyStore) { this.nodeConnectionTransfer = nodeConnectionTransfer; this.nodeConfigStore = nodeConfigStore; @@ -47,6 +52,7 @@ namespace linker.messenger.node this.messengerSender = messengerSender; this.nodeStore = nodeStore; this.messengerResolver = messengerResolver; + this.nodeMasterDenyStore = nodeMasterDenyStore; md5 = Config.NodeId.Md5(); @@ -97,6 +103,10 @@ namespace linker.messenger.node { return false; } + if (await nodeMasterDenyStore.Get(NetworkHelper.ToValue(connection.Address.Address), 0).ConfigureAwait(false)) + { + return false; + } connection.Id = serverId; nodeConnectionTransfer.TryAdd(ConnectionSideType.Master, connection.Id, connection); @@ -116,7 +126,7 @@ namespace linker.messenger.node Connection = connection, MessengerId = MessengerIdSahre, Payload = serializer.Serialize(store.MasterKey) - }); + }).ConfigureAwait(false); if (resp.Code == MessageResponeCodes.OK) { return serializer.Deserialize(resp.Data.Span); @@ -172,7 +182,7 @@ namespace linker.messenger.node Connection = connection, MessengerId = MessengerIdUpdateForward, Payload = serializer.Serialize(info) - }); + }).ConfigureAwait(false); } return await nodeStore.Update(info).ConfigureAwait(false); @@ -192,7 +202,7 @@ namespace linker.messenger.node Connection = connection, MessengerId = MessengerIdUpgradeForward, Payload = serializer.Serialize(new KeyValuePair(store.MasterKey, version)) - }); + }).ConfigureAwait(false); return true; } @@ -209,7 +219,6 @@ namespace linker.messenger.node public async Task ExitForward(string nodeId) { TStore store = await nodeStore.GetByNodeId(nodeId); - if (store != null && store.Manageable && nodeConnectionTransfer.TryGet(ConnectionSideType.Node, nodeId, out var connection)) { await messengerSender.SendOnly(new MessageRequestWrap @@ -217,7 +226,7 @@ namespace linker.messenger.node Connection = connection, MessengerId = MessengerIdExitForward, Payload = serializer.Serialize(new KeyValuePair(store.MasterKey, nodeId)) - }); + }).ConfigureAwait(false); return true; } @@ -232,11 +241,123 @@ namespace linker.messenger.node return true; } - /// - /// 获取节点列表 - /// - /// 是否已认证 - /// + + public async Task MastersForward(MastersRequestInfo info) + { + TStore store = await nodeStore.GetByNodeId(info.NodeId); + if (store != null && store.Manageable && nodeConnectionTransfer.TryGet(ConnectionSideType.Node, info.NodeId, out var connection)) + { + info.NodeId = store.MasterKey; + var resp = await messengerSender.SendReply(new MessageRequestWrap + { + Connection = connection, + MessengerId = MessengerIdMastersForward, + Payload = serializer.Serialize(info) + }).ConfigureAwait(false); + if (resp.Code == MessageResponeCodes.OK) + { + return serializer.Deserialize(resp.Data.Span); + } + } + + return new MastersResponseInfo(); + } + public async Task Masters(MastersRequestInfo info) + { + if (info.NodeId != Config.MasterKey) + { + return new MastersResponseInfo(); + } + + var connections = nodeConnectionTransfer.Get(ConnectionSideType.Master); + return new MastersResponseInfo + { + Page = info.Page, + Sise = info.Sise, + Count = connections.Count, + List = connections.Skip((info.Page - 1) * info.Sise).Take(info.Sise).Select(c => new MasterConnInfo { Addr = c.Address, NodeId = c.Id }).ToList() + }; + } + public async Task DenysForward(MasterDenyStoreRequestInfo info) + { + TStore store = await nodeStore.GetByNodeId(info.NodeId); + if (store != null && store.Manageable && nodeConnectionTransfer.TryGet(ConnectionSideType.Node, info.NodeId, out var connection)) + { + info.NodeId = store.MasterKey; + var resp = await messengerSender.SendReply(new MessageRequestWrap + { + Connection = connection, + MessengerId = MessengerIdDenysForward, + Payload = serializer.Serialize(info) + }).ConfigureAwait(false); + if (resp.Code == MessageResponeCodes.OK) + { + return serializer.Deserialize(resp.Data.Span); + } + } + + return new MasterDenyStoreResponseInfo(); + } + public async Task Denys(MasterDenyStoreRequestInfo info) + { + if (info.NodeId != Config.MasterKey) + { + return new MasterDenyStoreResponseInfo(); + } + return await nodeMasterDenyStore.Get(info).ConfigureAwait(false); + } + public async Task DenysAddForward(MasterDenyAddInfo info) + { + TStore store = await nodeStore.GetByNodeId(info.NodeId); + if (store != null && store.Manageable && nodeConnectionTransfer.TryGet(ConnectionSideType.Node, info.NodeId, out var connection)) + { + info.NodeId = store.MasterKey; + var resp = await messengerSender.SendReply(new MessageRequestWrap + { + Connection = connection, + MessengerId = MessengerIdDenysAddForward, + Payload = serializer.Serialize(info) + }).ConfigureAwait(false); + return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray); + } + + return false; + } + public async Task DenysAdd(MasterDenyAddInfo info) + { + if (info.NodeId != Config.MasterKey) + { + return false; + } + return await nodeMasterDenyStore.Add(info).ConfigureAwait(false); + } + public async Task DenysDelForward(MasterDenyDelInfo info) + { + TStore store = await nodeStore.GetByNodeId(info.NodeId); + if (store != null && store.Manageable && nodeConnectionTransfer.TryGet(ConnectionSideType.Node, info.NodeId, out var connection)) + { + info.NodeId = store.MasterKey; + var resp = await messengerSender.SendReply(new MessageRequestWrap + { + Connection = connection, + MessengerId = MessengerIdDenysDelForward, + Payload = serializer.Serialize(info) + }).ConfigureAwait(false); + return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray); + } + + return false; + } + public async Task DenysDel(MasterDenyDelInfo info) + { + if (info.NodeId != Config.MasterKey) + { + return false; + } + return await nodeMasterDenyStore.Delete(info).ConfigureAwait(false); + } + + public virtual async Task> GetNodes(bool super, string userid, string machineId) { return []; @@ -256,7 +377,6 @@ namespace linker.messenger.node { } - private async Task BuildShareKey() { try diff --git a/shells/version.txt b/shells/version.txt index 991a68cb..380e5a7c 100644 --- a/shells/version.txt +++ b/shells/version.txt @@ -1,8 +1,10 @@ v1.9.7 -2025-12-10 17:13:38 +2025-12-11 17:30:06 1. 一些累计更新,一些BUG修复 2. 重构中继和穿透的多节点模式 3. 中继连接合并到隧道协议中 4. 修复socks代理模块 5. 发布飞牛fpk安装包(docker+bin) -6. 先不要更新,作者测试中 \ No newline at end of file +6. 优化虚拟网卡自动连接表现 +7. 简化加入分组操作 +8. 先不要更新,作者测试中 \ No newline at end of file diff --git a/src/linker.doc.web/docs/95、一些常见问题.md b/src/linker.doc.web/docs/95、一些常见问题.md index 5ba6133d..4b6527c5 100644 --- a/src/linker.doc.web/docs/95、一些常见问题.md +++ b/src/linker.doc.web/docs/95、一些常见问题.md @@ -18,7 +18,7 @@ slug: /question 3. `Windows 无法验证此文件的数字签名`,大概率出现再win7/8,可以尝试安装KB3033929 全球化补丁 4. `group id are empty` 客户端尚未初始化 5. `rtsp`,关于rtsp,默认使用UDP协议传输音视频,在rtsp握手的SETUP阶段报告客户端UDP端口,所以在经过NAT后服务端无法正确向客户端发送数据,请使用TCP -6. 在windows,如果1802-1804端口被占用,但是`netstat -ano` 又查不到,那可能是hyper-v占用的可以尝试重启winnat服务解决 +6. 在windows,如果1802-1804端口被占用,但是`netstat -ano` 又查不到,那可能是hyper-v占用的,可以尝试重启winnat服务解决 ``` net stop winnat net start winnat diff --git a/src/linker.messenger.relay/client/RelayApiController.cs b/src/linker.messenger.relay/client/RelayApiController.cs index 7a6e400b..c9bdce40 100644 --- a/src/linker.messenger.relay/client/RelayApiController.cs +++ b/src/linker.messenger.relay/client/RelayApiController.cs @@ -1,6 +1,7 @@ using linker.libs; using linker.libs.extends; using linker.libs.web; +using linker.messenger.node; using linker.messenger.relay.messenger; using linker.messenger.relay.server; using linker.messenger.signin; @@ -130,6 +131,55 @@ namespace linker.messenger.relay.client }); return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray); } + + public async Task Masters(ApiControllerParamsInfo param) + { + var resp = await messengerSender.SendReply(new MessageRequestWrap + { + Connection = signInClientState.Connection, + MessengerId = (ushort)RelayMessengerIds.MastersForward, + Payload = serializer.Serialize(param.Content.DeJson()) + }); + if (resp.Code == MessageResponeCodes.OK) + { + return serializer.Deserialize(resp.Data.Span); + } + return new MastersResponseInfo(); + } + public async Task Denys(ApiControllerParamsInfo param) + { + var resp = await messengerSender.SendReply(new MessageRequestWrap + { + Connection = signInClientState.Connection, + MessengerId = (ushort)RelayMessengerIds.DenysForward, + Payload = serializer.Serialize(param.Content.DeJson()) + }); + if (resp.Code == MessageResponeCodes.OK) + { + return serializer.Deserialize(resp.Data.Span); + } + return new MasterDenyStoreResponseInfo(); + } + public async Task DenysAdd(ApiControllerParamsInfo param) + { + var resp = await messengerSender.SendReply(new MessageRequestWrap + { + Connection = signInClientState.Connection, + MessengerId = (ushort)RelayMessengerIds.DenysAddForward, + Payload = serializer.Serialize(param.Content.DeJson()) + }); + return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray); + } + public async Task DenysDel(ApiControllerParamsInfo param) + { + var resp = await messengerSender.SendReply(new MessageRequestWrap + { + Connection = signInClientState.Connection, + MessengerId = (ushort)RelayMessengerIds.DenysDelForward, + Payload = serializer.Serialize(param.Content.DeJson()) + }); + return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray); + } } diff --git a/src/linker.messenger.relay/messenger/RelayMessenger.cs b/src/linker.messenger.relay/messenger/RelayMessenger.cs index 723248d2..e42e2307 100644 --- a/src/linker.messenger.relay/messenger/RelayMessenger.cs +++ b/src/linker.messenger.relay/messenger/RelayMessenger.cs @@ -1,5 +1,6 @@  using linker.libs; +using linker.messenger.node; using linker.messenger.relay.server; using linker.messenger.relay.server.validator; using linker.messenger.signin; @@ -16,7 +17,7 @@ namespace linker.messenger.relay.messenger public RelayClientMessenger() { } - + } /// @@ -230,6 +231,91 @@ namespace linker.messenger.relay.messenger } + + [MessengerId((ushort)RelayMessengerIds.MastersForward)] + public async Task MastersForward(IConnection connection) + { + MastersRequestInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + if (signCaching.TryGet(connection.Id, out SignCacheInfo from) == false || from.Super == false) + { + connection.Write(serializer.Serialize(new MastersResponseInfo())); + return; + } + + MastersResponseInfo resp = await relayServerNodeReportTransfer.MastersForward(info).ConfigureAwait(false); + connection.Write(serializer.Serialize(resp)); + } + [MessengerId((ushort)RelayMessengerIds.Masters)] + public async Task Masters(IConnection connection) + { + MastersRequestInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + MastersResponseInfo resp = await relayServerNodeReportTransfer.Masters(info).ConfigureAwait(false); + connection.Write(serializer.Serialize(resp)); + } + + + [MessengerId((ushort)RelayMessengerIds.DenysForward)] + public async Task DenysForward(IConnection connection) + { + MasterDenyStoreRequestInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + if (signCaching.TryGet(connection.Id, out SignCacheInfo from) == false || from.Super == false) + { + connection.Write(serializer.Serialize(new MasterDenyStoreResponseInfo())); + return; + } + + MasterDenyStoreResponseInfo resp = await relayServerNodeReportTransfer.DenysForward(info).ConfigureAwait(false); + connection.Write(serializer.Serialize(resp)); + } + [MessengerId((ushort)RelayMessengerIds.Denys)] + public async Task Denys(IConnection connection) + { + MasterDenyStoreRequestInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + MasterDenyStoreResponseInfo resp = await relayServerNodeReportTransfer.Denys(info).ConfigureAwait(false); + connection.Write(serializer.Serialize(resp)); + } + [MessengerId((ushort)RelayMessengerIds.DenysAddForward)] + public async Task DenysAddForward(IConnection connection) + { + MasterDenyAddInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + if (signCaching.TryGet(connection.Id, out SignCacheInfo from) == false || from.Super == false) + { + connection.Write(Helper.FalseArray); + return; + } + + bool resp = await relayServerNodeReportTransfer.DenysAddForward(info).ConfigureAwait(false); + connection.Write(resp ? Helper.TrueArray : Helper.FalseArray); + } + [MessengerId((ushort)RelayMessengerIds.DenysAdd)] + public async Task DenysAdd(IConnection connection) + { + MasterDenyAddInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + bool resp = await relayServerNodeReportTransfer.DenysAdd(info).ConfigureAwait(false); + connection.Write(resp ? Helper.TrueArray : Helper.FalseArray); + } + [MessengerId((ushort)RelayMessengerIds.DenysDelForward)] + public async Task DenysDelForward(IConnection connection) + { + MasterDenyDelInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + if (signCaching.TryGet(connection.Id, out SignCacheInfo from) == false || from.Super == false) + { + connection.Write(Helper.FalseArray); + return; + } + + bool resp = await relayServerNodeReportTransfer.DenysDelForward(info).ConfigureAwait(false); + connection.Write(resp ? Helper.TrueArray : Helper.FalseArray); + } + [MessengerId((ushort)RelayMessengerIds.DenysDel)] + public async Task DenysDel(IConnection connection) + { + MasterDenyDelInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + bool resp = await relayServerNodeReportTransfer.DenysDel(info).ConfigureAwait(false); + connection.Write(resp ? Helper.TrueArray : Helper.FalseArray); + } + + [MessengerId((ushort)RelayMessengerIds.NodeReport)] public async Task NodeReport(IConnection connection) { @@ -251,5 +337,9 @@ namespace linker.messenger.relay.messenger } connection.Write(serializer.Serialize(VersionHelper.Version)); } + + + + } } diff --git a/src/linker.messenger.relay/messenger/RelayMessengerIds.cs b/src/linker.messenger.relay/messenger/RelayMessengerIds.cs index 1d8617cf..c51195bc 100644 --- a/src/linker.messenger.relay/messenger/RelayMessengerIds.cs +++ b/src/linker.messenger.relay/messenger/RelayMessengerIds.cs @@ -28,6 +28,16 @@ UpgradeForward = 2144, Upgrade = 2145, + MastersForward = 2146, + Masters = 2147, + + DenysForward = 2148, + Denys = 2149, + DenysAddForward = 2150, + DenysAdd = 2151, + DenysDelForward = 2152, + DenysDel = 2153, + Max = 2199 } } diff --git a/src/linker.messenger.relay/server/IRelayServerMasterDenyStore.cs b/src/linker.messenger.relay/server/IRelayServerMasterDenyStore.cs new file mode 100644 index 00000000..eceaec66 --- /dev/null +++ b/src/linker.messenger.relay/server/IRelayServerMasterDenyStore.cs @@ -0,0 +1,8 @@ +using linker.messenger.node; + +namespace linker.messenger.relay.server +{ + public interface IRelayServerMasterDenyStore:INodeMasterDenyStore + { + } +} diff --git a/src/linker.messenger.relay/server/RelayServerNodeReportTransfer.cs b/src/linker.messenger.relay/server/RelayServerNodeReportTransfer.cs index c74fd54f..cea198c9 100644 --- a/src/linker.messenger.relay/server/RelayServerNodeReportTransfer.cs +++ b/src/linker.messenger.relay/server/RelayServerNodeReportTransfer.cs @@ -12,6 +12,10 @@ namespace linker.messenger.relay.server public override ushort MessengerIdExitForward => (ushort)RelayMessengerIds.ExitForward; public override ushort MessengerIdReport => (ushort)RelayMessengerIds.Report; public override ushort MessengerIdSignIn => (ushort)RelayMessengerIds.SignIn; + public override ushort MessengerIdMastersForward => (ushort)RelayMessengerIds.MastersForward; + public override ushort MessengerIdDenysForward => (ushort)RelayMessengerIds.DenysForward; + public override ushort MessengerIdDenysAddForward => (ushort)RelayMessengerIds.DenysAddForward; + public override ushort MessengerIdDenysDelForward => (ushort)RelayMessengerIds.DenysDelForward; private readonly IRelayServerWhiteListStore relayServerWhiteListStore; private readonly INodeConfigStore nodeConfigStore; @@ -21,8 +25,8 @@ namespace linker.messenger.relay.server public RelayServerNodeReportTransfer(IRelayServerWhiteListStore relayServerWhiteListStore, RelayServerConnectionTransfer nodeConnectionTransfer, INodeConfigStore nodeConfigStore, ISerializer serializer, IMessengerSender messengerSender, INodeStore nodeStore, - IMessengerResolver messengerResolver, ICommonStore commonStore) - : base(nodeConnectionTransfer, nodeConfigStore, serializer, messengerSender, nodeStore, messengerResolver, commonStore) + IMessengerResolver messengerResolver, ICommonStore commonStore,IRelayServerMasterDenyStore relayServerMasterDenyStore) + : base(nodeConnectionTransfer, nodeConfigStore, serializer, messengerSender, nodeStore, messengerResolver, commonStore, relayServerMasterDenyStore) { this.relayServerWhiteListStore = relayServerWhiteListStore; this.nodeConfigStore = nodeConfigStore; diff --git a/src/linker.messenger.sforward/client/SForwardApiController.cs b/src/linker.messenger.sforward/client/SForwardApiController.cs index c9dbeffa..8bc9c87d 100644 --- a/src/linker.messenger.sforward/client/SForwardApiController.cs +++ b/src/linker.messenger.sforward/client/SForwardApiController.cs @@ -1,10 +1,11 @@ -using linker.libs.extends; -using linker.messenger.signin; -using linker.libs; -using linker.messenger.api; +using linker.libs; +using linker.libs.extends; using linker.libs.web; -using linker.messenger.sforward.server; +using linker.messenger.api; +using linker.messenger.node; using linker.messenger.sforward.messenger; +using linker.messenger.sforward.server; +using linker.messenger.signin; namespace linker.messenger.sforward.client { @@ -236,5 +237,54 @@ namespace linker.messenger.sforward.client return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray); } + + public async Task Masters(ApiControllerParamsInfo param) + { + var resp = await messengerSender.SendReply(new MessageRequestWrap + { + Connection = signInClientState.Connection, + MessengerId = (ushort)SForwardMessengerIds.MastersForward, + Payload = serializer.Serialize(param.Content.DeJson()) + }); + if (resp.Code == MessageResponeCodes.OK) + { + return serializer.Deserialize(resp.Data.Span); + } + return new MastersResponseInfo(); + } + public async Task Denys(ApiControllerParamsInfo param) + { + var resp = await messengerSender.SendReply(new MessageRequestWrap + { + Connection = signInClientState.Connection, + MessengerId = (ushort)SForwardMessengerIds.DenysForward, + Payload = serializer.Serialize(param.Content.DeJson()) + }); + if (resp.Code == MessageResponeCodes.OK) + { + return serializer.Deserialize(resp.Data.Span); + } + return new MasterDenyStoreResponseInfo(); + } + public async Task DenysAdd(ApiControllerParamsInfo param) + { + var resp = await messengerSender.SendReply(new MessageRequestWrap + { + Connection = signInClientState.Connection, + MessengerId = (ushort)SForwardMessengerIds.DenysAddForward, + Payload = serializer.Serialize(param.Content.DeJson()) + }); + return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray); + } + public async Task DenysDel(ApiControllerParamsInfo param) + { + var resp = await messengerSender.SendReply(new MessageRequestWrap + { + Connection = signInClientState.Connection, + MessengerId = (ushort)SForwardMessengerIds.DenysDelForward, + Payload = serializer.Serialize(param.Content.DeJson()) + }); + return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray); + } } } diff --git a/src/linker.messenger.sforward/messenger/SForwardMessenger.cs b/src/linker.messenger.sforward/messenger/SForwardMessenger.cs index 8a278664..bb87f8dd 100644 --- a/src/linker.messenger.sforward/messenger/SForwardMessenger.cs +++ b/src/linker.messenger.sforward/messenger/SForwardMessenger.cs @@ -1,6 +1,7 @@ using linker.libs; using linker.libs.extends; using linker.libs.timer; +using linker.messenger.node; using linker.messenger.sforward.client; using linker.messenger.sforward.server; using linker.messenger.sforward.server.validator; @@ -695,6 +696,68 @@ namespace linker.messenger.sforward.messenger await sForwardServerNodeReportTransfer.Exit(masterKey).ConfigureAwait(false); } + /// + /// 信标服务器 + /// + /// + /// + [MessengerId((ushort)SForwardMessengerIds.MastersForward)] + public async Task MastersForward(IConnection connection) + { + MastersRequestInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + if (signCaching.TryGet(connection.Id, out SignCacheInfo from) == false || from.Super == false) + { + connection.Write(serializer.Serialize(new MastersResponseInfo())); + return; + } + + MastersResponseInfo resp = await sForwardServerNodeReportTransfer.MastersForward(info).ConfigureAwait(false); + connection.Write(serializer.Serialize(resp)); + } + /// + /// 节点服务器 + /// + /// + /// + [MessengerId((ushort)SForwardMessengerIds.Masters)] + public async Task Masters(IConnection connection) + { + MastersRequestInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + MastersResponseInfo resp = await sForwardServerNodeReportTransfer.Masters(info).ConfigureAwait(false); + connection.Write(serializer.Serialize(resp)); + } + + /// + /// 信标服务器 + /// + /// + /// + [MessengerId((ushort)SForwardMessengerIds.DenysForward)] + public async Task DenysForward(IConnection connection) + { + MasterDenyStoreRequestInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + if (signCaching.TryGet(connection.Id, out SignCacheInfo from) == false || from.Super == false) + { + connection.Write(serializer.Serialize(new MasterDenyStoreResponseInfo())); + return; + } + + MasterDenyStoreResponseInfo resp = await sForwardServerNodeReportTransfer.DenysForward(info).ConfigureAwait(false); + connection.Write(serializer.Serialize(resp)); + } + /// + /// 节点服务器 + /// + /// + /// + [MessengerId((ushort)SForwardMessengerIds.Denys)] + public async Task Denys(IConnection connection) + { + MasterDenyStoreRequestInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + MasterDenyStoreResponseInfo resp = await sForwardServerNodeReportTransfer.Denys(info).ConfigureAwait(false); + connection.Write(serializer.Serialize(resp)); + } + /// diff --git a/src/linker.messenger.sforward/messenger/SForwardMessengerIds.cs b/src/linker.messenger.sforward/messenger/SForwardMessengerIds.cs index 688fbff3..6d9c3eef 100644 --- a/src/linker.messenger.sforward/messenger/SForwardMessengerIds.cs +++ b/src/linker.messenger.sforward/messenger/SForwardMessengerIds.cs @@ -50,6 +50,16 @@ Proxy = 2352, ProxyForward = 2353, + MastersForward = 2354, + Masters = 2355, + + DenysForward = 2356, + Denys = 2357, + DenysAddForward = 2358, + DenysAdd = 2359, + DenysDelForward = 2360, + DenysDel = 2361, + Max = 2399 } } diff --git a/src/linker.messenger.sforward/server/ISForwardServerMasterDenyStore.cs b/src/linker.messenger.sforward/server/ISForwardServerMasterDenyStore.cs new file mode 100644 index 00000000..f6bbc71f --- /dev/null +++ b/src/linker.messenger.sforward/server/ISForwardServerMasterDenyStore.cs @@ -0,0 +1,8 @@ +using linker.messenger.node; + +namespace linker.messenger.sforward.server +{ + public interface ISForwardServerMasterDenyStore : INodeMasterDenyStore + { + } +} diff --git a/src/linker.messenger.sforward/server/SForwardServerNodeReportTransfer.cs b/src/linker.messenger.sforward/server/SForwardServerNodeReportTransfer.cs index e42f22e9..f3e93374 100644 --- a/src/linker.messenger.sforward/server/SForwardServerNodeReportTransfer.cs +++ b/src/linker.messenger.sforward/server/SForwardServerNodeReportTransfer.cs @@ -12,17 +12,20 @@ namespace linker.messenger.sforward.server public override ushort MessengerIdExitForward => (ushort)SForwardMessengerIds.ExitForward; public override ushort MessengerIdReport => (ushort)SForwardMessengerIds.Report; public override ushort MessengerIdSignIn => (ushort)SForwardMessengerIds.SignIn; + public override ushort MessengerIdMastersForward => (ushort)SForwardMessengerIds.MastersForward; + public override ushort MessengerIdDenysForward => (ushort)SForwardMessengerIds.DenysForward; + public override ushort MessengerIdDenysAddForward => (ushort)SForwardMessengerIds.DenysAddForward; + public override ushort MessengerIdDenysDelForward => (ushort)SForwardMessengerIds.DenysDelForward; private readonly ISForwardServerWhiteListStore sforwardServerWhiteListStore; private readonly INodeConfigStore nodeConfigStore; private readonly INodeStore nodeStore; - public SForwardServerNodeReportTransfer(ISForwardServerWhiteListStore sforwardServerWhiteListStore, SForwardServerConnectionTransfer nodeConnectionTransfer, INodeConfigStore nodeConfigStore, ISerializer serializer, IMessengerSender messengerSender, INodeStore nodeStore, - IMessengerResolver messengerResolver, ICommonStore commonStore) - : base(nodeConnectionTransfer, nodeConfigStore, serializer, messengerSender, nodeStore, messengerResolver, commonStore) + IMessengerResolver messengerResolver, ICommonStore commonStore,ISForwardServerMasterDenyStore sforwardServerMasterDenyStore) + : base(nodeConnectionTransfer, nodeConfigStore, serializer, messengerSender, nodeStore, messengerResolver, commonStore, sforwardServerMasterDenyStore) { this.sforwardServerWhiteListStore = sforwardServerWhiteListStore; this.nodeConfigStore = nodeConfigStore; diff --git a/src/linker.messenger.signin/Config.cs b/src/linker.messenger.signin/Config.cs index 0ce24109..ff333003 100644 --- a/src/linker.messenger.signin/Config.cs +++ b/src/linker.messenger.signin/Config.cs @@ -12,7 +12,7 @@ namespace linker.messenger.signin #if DEBUG private string id = Helper.GlobalString; #else - private string id = string.Empty; + private string id = Guid.NewGuid().ToString(); #endif public string Id { @@ -25,7 +25,7 @@ namespace linker.messenger.signin #if DEBUG private string passord = Helper.GlobalString; #else - private string passord = string.Empty; + private string passord = Guid.NewGuid().ToString(); #endif public string Password { diff --git a/src/linker.messenger.signin/SignInApiController.cs b/src/linker.messenger.signin/SignInApiController.cs index 57aea77e..f1ced043 100644 --- a/src/linker.messenger.signin/SignInApiController.cs +++ b/src/linker.messenger.signin/SignInApiController.cs @@ -157,8 +157,12 @@ namespace linker.messenger.signin { await signInClientTransfer.CheckSuper().ConfigureAwait(false); } + + + } + public sealed class ConfigSetInfo { diff --git a/src/linker.messenger.signin/SignInClientTransfer.cs b/src/linker.messenger.signin/SignInClientTransfer.cs index 7739f741..3b4d1ffa 100644 --- a/src/linker.messenger.signin/SignInClientTransfer.cs +++ b/src/linker.messenger.signin/SignInClientTransfer.cs @@ -20,9 +20,10 @@ namespace linker.messenger.signin private readonly SignInArgsTransfer signInArgsTransfer; private readonly ISignInClientStore signInClientStore; private readonly ISerializer serializer; + private readonly ICommonStore commonStore; public SignInClientTransfer(SignInClientState clientSignInState, IMessengerSender messengerSender, IMessengerResolver messengerResolver, - SignInArgsTransfer signInArgsTransfer, ISignInClientStore signInClientStore, ISerializer serializer) + SignInArgsTransfer signInArgsTransfer, ISignInClientStore signInClientStore, ISerializer serializer, ICommonStore commonStore) { this.clientSignInState = clientSignInState; this.messengerSender = messengerSender; @@ -30,6 +31,7 @@ namespace linker.messenger.signin this.signInArgsTransfer = signInArgsTransfer; this.signInClientStore = signInClientStore; this.serializer = serializer; + this.commonStore = commonStore; } /// @@ -105,6 +107,11 @@ namespace linker.messenger.signin /// private async Task SignIn(string host) { + if(commonStore.Installed == false) + { + LoggerHelper.Instance.Error($"not initialized"); + return 1; + } if (string.IsNullOrWhiteSpace(signInClientStore.Group.Id)) { LoggerHelper.Instance.Error($"group id are empty"); diff --git a/src/linker.messenger.signin/args/SignInArgsMachineKey.cs b/src/linker.messenger.signin/args/SignInArgsMachineKey.cs index ad9733cb..bb384ca9 100644 --- a/src/linker.messenger.signin/args/SignInArgsMachineKey.cs +++ b/src/linker.messenger.signin/args/SignInArgsMachineKey.cs @@ -56,7 +56,5 @@ namespace linker.messenger.signin.args } return await Task.FromResult(string.Empty); } - - } } diff --git a/src/linker.messenger.store.file/ConfigApiController.cs b/src/linker.messenger.store.file/ConfigApiController.cs index cdd49d08..eef61f9c 100644 --- a/src/linker.messenger.store.file/ConfigApiController.cs +++ b/src/linker.messenger.store.file/ConfigApiController.cs @@ -77,8 +77,8 @@ namespace linker.messenger.store.file config.Data.Server.SignIn.Anonymous = info.Server.Anonymous; config.Data.Server.SignIn.SuperKey = info.Server.SuperKey; config.Data.Server.SignIn.SuperPassword = info.Server.SuperPassword; - config.Data.Server.SForward.WebPort = info.Server.SForward.WebPort; - config.Data.Server.SForward.TunnelPorts = info.Server.SForward.TunnelPorts; + //config.Data.Server.SForward.WebPort = info.Server.SForward.WebPort; + //config.Data.Server.SForward.TunnelPorts = info.Server.SForward.TunnelPorts; } config.Data.Common.Modes = info.Common.Modes; @@ -300,6 +300,61 @@ namespace linker.messenger.store.file }, common, new { Install = true, Modes = new string[] { "client" } }); } + [Access(AccessValue.Export)] + public string ShareGroup(ApiControllerParamsInfo param) + { + ICrypto crypto = CryptoFactory.CreateSymmetric(Helper.GlobalString); + + try + { + return Convert.ToBase64String(crypto.Encode(new ShareGroupInfo + { + Server = config.Data.Client.Server.Host, + Id = config.Data.Client.Group.Id, + Pwd = config.Data.Client.Group.Password + }.ToJson().ToBytes())); + } + catch (Exception) + { + } + finally + { + crypto.Dispose(); + } + return string.Empty; + } + public bool JoinGroup(ApiControllerParamsInfo param) + { + ICrypto crypto = CryptoFactory.CreateSymmetric(Helper.GlobalString); + + try + { + ShareGroupInfo info = crypto.Decode(Convert.FromBase64String(param.Content)).GetString().DeJson(); + config.Data.Client.Server.Host = info.Server; + config.Data.Client.Group.Id = info.Id; + config.Data.Client.Group.Password = info.Pwd; + config.Data.Update(); + + signInClientTransfer.ReSignIn(); + return true; + } + catch (Exception) + { + } + finally + { + crypto.Dispose(); + } + + return false; + } + } + + public sealed class ShareGroupInfo + { + public string Server { get; set; } + public string Id { get; set; } + public string Pwd { get; set; } } public sealed class GetConfigParamsInfo diff --git a/src/linker.messenger.store.file/Entry.cs b/src/linker.messenger.store.file/Entry.cs index 4d32dfa4..04cc322c 100644 --- a/src/linker.messenger.store.file/Entry.cs +++ b/src/linker.messenger.store.file/Entry.cs @@ -73,7 +73,8 @@ namespace linker.messenger.store.file serviceCollection.AddSingleton, RelayServerConfigStore>(); serviceCollection.AddSingleton, RelayServerNodeStore>(); serviceCollection.AddSingleton(); - + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); @@ -101,6 +102,7 @@ namespace linker.messenger.store.file serviceCollection.AddSingleton, SForwardServerConfigStore>(); serviceCollection.AddSingleton, SForwardServerNodeStore>(); serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); diff --git a/src/linker.messenger.store.file/node/NodeMasterDenyStore.cs b/src/linker.messenger.store.file/node/NodeMasterDenyStore.cs new file mode 100644 index 00000000..90d75d78 --- /dev/null +++ b/src/linker.messenger.store.file/node/NodeMasterDenyStore.cs @@ -0,0 +1,63 @@ +using linker.libs; +using linker.messenger.node; +using LiteDB; +using System.Net; +using IPNetwork = System.Net.IPNetwork; + +namespace linker.messenger.store.file.node +{ + public class NodeMasterDenyStore : INodeMasterDenyStore + { + public virtual string StoreName => "relay"; + + protected readonly ILiteCollection liteCollection; + public NodeMasterDenyStore(Storefactory storefactory) + { + liteCollection = storefactory.GetCollection($"{StoreName}_server_master_deny"); + } + + public async Task Add(MasterDenyAddInfo info) + { + IPNetwork net = info.Str.AsSpan().IndexOf('/') < 0 ? new IPNetwork(IPAddress.Parse(info.Str), 32) : IPNetwork.Parse(info.Str); + + uint ip = NetworkHelper.ToValue(net.BaseAddress); + uint prefixValue = NetworkHelper.ToPrefixValue((byte)net.PrefixLength); + uint network = NetworkHelper.ToNetworkValue(ip, prefixValue); + uint broadcast = NetworkHelper.ToBroadcastValue(ip, prefixValue); + liteCollection.Insert(new MasterDenyStoreInfo + { + Str = info.Str, + Ip = ip, + Plus = broadcast - network, + Remark = info.Remark, + }); + return true; + } + + public async Task Delete(MasterDenyDelInfo info) + { + return liteCollection.Delete(info.Id); + } + + public async Task Get(MasterDenyStoreRequestInfo request) + { + var query = liteCollection.FindAll(); + if (string.IsNullOrWhiteSpace(request.Str) == false) + { + query = query.Where(c => (string.IsNullOrWhiteSpace(c.Str) == false && c.Str.Contains(request.Str)) || string.IsNullOrWhiteSpace(c.Remark) == false && c.Remark.Contains(request.Str)); + } + return new MasterDenyStoreResponseInfo + { + Page = request.Page, + Sise = request.Sise, + Count = query.Count(), + List = query.Skip((request.Page - 1) * request.Sise).Take(request.Sise).ToList() + }; + } + + public async Task Get(uint ip, int plus) + { + return liteCollection.Find(c => ip >= c.Ip && ip <= c.Ip + c.Plus).Any(); + } + } +} diff --git a/src/linker.messenger.store.file/relay/RelayNodeWhiteListStore.cs b/src/linker.messenger.store.file/relay/RelayNodeWhiteListStore.cs index be3645ed..f0c4506f 100644 --- a/src/linker.messenger.store.file/relay/RelayNodeWhiteListStore.cs +++ b/src/linker.messenger.store.file/relay/RelayNodeWhiteListStore.cs @@ -5,8 +5,9 @@ namespace linker.messenger.store.file.relay { public class RelayNodeWhiteListStore : node.NodeWhiteListStore, IRelayServerWhiteListStore { + public override string TypeName => "Relay"; public RelayNodeWhiteListStore(IWhiteListServerStore whiteListServerStore) : base(whiteListServerStore) { } - public override string TypeName => "Relay"; + } } diff --git a/src/linker.messenger.store.file/relay/RelayServerMasterDenyStore.cs b/src/linker.messenger.store.file/relay/RelayServerMasterDenyStore.cs new file mode 100644 index 00000000..3508c5ca --- /dev/null +++ b/src/linker.messenger.store.file/relay/RelayServerMasterDenyStore.cs @@ -0,0 +1,12 @@ +using linker.messenger.relay.server; +using linker.messenger.store.file.node; + +namespace linker.messenger.store.file.relay +{ + public class RelayServerMasterDenyStore : NodeMasterDenyStore, IRelayServerMasterDenyStore + { + public override string StoreName => "relay"; + public RelayServerMasterDenyStore(Storefactory storefactory) : base(storefactory) + { } + } +} diff --git a/src/linker.messenger.store.file/sforward/SForwardNodeWhiteListStore.cs b/src/linker.messenger.store.file/sforward/SForwardNodeWhiteListStore.cs index aa28515c..ace26233 100644 --- a/src/linker.messenger.store.file/sforward/SForwardNodeWhiteListStore.cs +++ b/src/linker.messenger.store.file/sforward/SForwardNodeWhiteListStore.cs @@ -6,8 +6,9 @@ namespace linker.messenger.store.file.sforward { public class SForwardNodeWhiteListStore : node.NodeWhiteListStore, ISForwardServerWhiteListStore { + public override string TypeName => "SForward"; public SForwardNodeWhiteListStore(IWhiteListServerStore whiteListServerStore) : base(whiteListServerStore) { } - public override string TypeName => "SForward"; + } } diff --git a/src/linker.messenger.store.file/sforward/SForwardServerMasterDenyStore.cs b/src/linker.messenger.store.file/sforward/SForwardServerMasterDenyStore.cs new file mode 100644 index 00000000..2b180850 --- /dev/null +++ b/src/linker.messenger.store.file/sforward/SForwardServerMasterDenyStore.cs @@ -0,0 +1,12 @@ +using linker.messenger.sforward.server; +using linker.messenger.store.file.node; + +namespace linker.messenger.store.file.sforward +{ + public class SForwardServerMasterDenyStore : NodeMasterDenyStore, ISForwardServerMasterDenyStore + { + public override string StoreName => "sforward"; + public SForwardServerMasterDenyStore(Storefactory storefactory) :base(storefactory) + { } + } +} diff --git a/src/linker.messenger.store.file/sforward/SForwardServerNodeStore.cs b/src/linker.messenger.store.file/sforward/SForwardServerNodeStore.cs index 11c8e8b6..25008e52 100644 --- a/src/linker.messenger.store.file/sforward/SForwardServerNodeStore.cs +++ b/src/linker.messenger.store.file/sforward/SForwardServerNodeStore.cs @@ -1,9 +1,7 @@ using linker.libs.extends; using linker.messenger.node; -using linker.messenger.relay.server; using linker.messenger.sforward.server; using linker.messenger.store.file.node; -using LiteDB; namespace linker.messenger.store.file.sforward { diff --git a/src/linker.web/src/apis/config.js b/src/linker.web/src/apis/config.js index 0bbfa5bd..90fa5718 100644 --- a/src/linker.web/src/apis/config.js +++ b/src/linker.web/src/apis/config.js @@ -21,4 +21,10 @@ export const copyConfig = (data) => { } export const saveConfig = (data) => { return sendWebsocketMsg('config/save', data); +} +export const shareGroup = () => { + return sendWebsocketMsg('config/sharegroup'); +} +export const joinGroup = (data) => { + return sendWebsocketMsg('config/joingroup', data); } \ No newline at end of file diff --git a/src/linker.web/src/apis/relay.js b/src/linker.web/src/apis/relay.js index 46a20f82..ff2f519b 100644 --- a/src/linker.web/src/apis/relay.js +++ b/src/linker.web/src/apis/relay.js @@ -29,4 +29,16 @@ export const relayImport = (data) => { } export const relayShare = (id) => { return sendWebsocketMsg('relay/Share', id); +} +export const relayMasters = (data) => { + return sendWebsocketMsg('relay/Masters', data); +} +export const relayDenys = (data) => { + return sendWebsocketMsg('relay/Denys', data); +} +export const relayDenysAdd = (data) => { + return sendWebsocketMsg('relay/DenysAdd', data); +} +export const relayDenysDel = (data) => { + return sendWebsocketMsg('relay/DenysDel', data); } \ No newline at end of file diff --git a/src/linker.web/src/apis/sforward.js b/src/linker.web/src/apis/sforward.js index b1716bec..790873e7 100644 --- a/src/linker.web/src/apis/sforward.js +++ b/src/linker.web/src/apis/sforward.js @@ -44,4 +44,16 @@ export const sforwardImport = (data) => { } export const sforwardShare = (id) => { return sendWebsocketMsg('sforward/Share', id); +} +export const sforwardMasters = (data) => { + return sendWebsocketMsg('sforward/Masters', data); +} +export const sforwardDenys = (data) => { + return sendWebsocketMsg('sforward/Denys', data); +} +export const sforwardDenysAdd = (data) => { + return sendWebsocketMsg('sforward/DenysAdd', data); +} +export const sforwardDenysDel = (data) => { + return sendWebsocketMsg('sforward/DenysDel', data); } \ No newline at end of file diff --git a/src/linker.web/src/lang/en-us.js b/src/linker.web/src/lang/en-us.js index 080e3716..54cb0617 100644 --- a/src/linker.web/src/lang/en-us.js +++ b/src/linker.web/src/lang/en-us.js @@ -11,6 +11,7 @@ export default { 'common.relay': 'Relay', 'common.p2p': 'P2P', 'common.refresh': 'Refresh', + 'common.copied': 'Copied', 'head.home': 'Home', 'head.server': 'Server', @@ -85,6 +86,8 @@ export default { 'permission.clear': 'Clear connection', 'status.group': 'Group manager', + 'status.groupShare': 'Group share', + 'status.groupPlus': 'Group join', 'status.groupName': 'Name', 'status.groupPassword': 'Password', 'status.groupOper': 'Oper', @@ -349,6 +352,10 @@ export default { 'server.sforwardLogo': 'Logo', 'server.sforwardHost': 'Host', + 'server.denyTitle':'connections on 【{0}】', + 'server.denyMasters':'Online', + 'server.denyList':'Deny list', + 'server.updater':'Updater', 'server.updaterSecretKey': 'Server update secretKey', 'server.updaterSync2Server': 'Auto update to server version', diff --git a/src/linker.web/src/lang/zh-cn.js b/src/linker.web/src/lang/zh-cn.js index e96e6eb7..60361305 100644 --- a/src/linker.web/src/lang/zh-cn.js +++ b/src/linker.web/src/lang/zh-cn.js @@ -11,6 +11,7 @@ export default { 'common.relay': '中继', 'common.p2p': '打洞', 'common.refresh': '刷新', + 'common.copied': '已复制', 'head.home': '首页', 'head.server': '服务器', @@ -86,6 +87,8 @@ export default { 'permission.clear': '清除连接', 'status.group': '管理分组', + 'status.groupShare': '分享分组', + 'status.groupPlus': '加入分组', 'status.groupName': '名称', 'status.groupPassword': '密码', 'status.groupOper': '操作', @@ -440,6 +443,10 @@ export default { 'server.sforwardLogo': 'Logo', 'server.sforwardHost': '主机', + 'server.denyTitle':'【{0}】上的主机', + 'server.denyMasters':'在线的主机', + 'server.denyList':'禁用列表', + 'server.updater': '更新', 'server.updaterSecretKey': '服务器更新密钥', 'server.updaterSync2Server': '自动更新到服务器版本', diff --git a/src/linker.web/src/views/components/forward/Nodes.vue b/src/linker.web/src/views/components/forward/Nodes.vue index ed67057f..af52a15d 100644 --- a/src/linker.web/src/views/components/forward/Nodes.vue +++ b/src/linker.web/src/views/components/forward/Nodes.vue @@ -24,7 +24,7 @@

- + {{ scope.row.Name }} @@ -112,6 +112,7 @@

+ diff --git a/src/linker.web/src/views/components/groups/Index.vue b/src/linker.web/src/views/components/groups/Index.vue index 54431540..ec2f443c 100644 --- a/src/linker.web/src/views/components/groups/Index.vue +++ b/src/linker.web/src/views/components/groups/Index.vue @@ -6,12 +6,14 @@ @@ -19,13 +21,14 @@ + + \ No newline at end of file diff --git a/src/linker.web/src/views/components/node/Index.vue b/src/linker.web/src/views/components/node/Index.vue new file mode 100644 index 00000000..cbd270e8 --- /dev/null +++ b/src/linker.web/src/views/components/node/Index.vue @@ -0,0 +1,39 @@ + + + + + \ No newline at end of file diff --git a/src/linker.web/src/views/components/node/Masters.vue b/src/linker.web/src/views/components/node/Masters.vue new file mode 100644 index 00000000..ae674b5f --- /dev/null +++ b/src/linker.web/src/views/components/node/Masters.vue @@ -0,0 +1,70 @@ + + + + + \ No newline at end of file diff --git a/src/linker.web/src/views/components/relay/Nodes.vue b/src/linker.web/src/views/components/relay/Nodes.vue index 4ad4b734..670d0b32 100644 --- a/src/linker.web/src/views/components/relay/Nodes.vue +++ b/src/linker.web/src/views/components/relay/Nodes.vue @@ -24,7 +24,7 @@

- + {{ scope.row.Name }} @@ -128,6 +128,7 @@

+ diff --git a/src/linker.web/src/views/components/status/Api.vue b/src/linker.web/src/views/components/status/Api.vue index bf330183..a503746d 100644 --- a/src/linker.web/src/views/components/status/Api.vue +++ b/src/linker.web/src/views/components/status/Api.vue @@ -6,7 +6,7 @@ :title="$t('status.apiAlterConfirm')" @cancel="handleShow" @confirm="handleResetConnect" > @@ -17,9 +17,9 @@ import {injectGlobalData} from '@/provide' import { computed} from 'vue'; import { initWebsocket,closeWebsocket } from '@/apis/request' -import {Tools} from '@element-plus/icons-vue' +import {Flag} from '@element-plus/icons-vue' export default { - components:{Tools}, + components:{Flag}, props:['config'], setup(props) { const globalData = injectGlobalData(); diff --git a/src/linker.web/src/views/components/status/Index.vue b/src/linker.web/src/views/components/status/Index.vue index 350d7e93..89e1214f 100644 --- a/src/linker.web/src/views/components/status/Index.vue +++ b/src/linker.web/src/views/components/status/Index.vue @@ -1,11 +1,7 @@ + + \ No newline at end of file diff --git a/src/linker.web/src/views/layout/full/config/Config.vue b/src/linker.web/src/views/layout/full/config/Config.vue index 18b77f7b..09311434 100644 --- a/src/linker.web/src/views/layout/full/config/Config.vue +++ b/src/linker.web/src/views/layout/full/config/Config.vue @@ -1,7 +1,13 @@