diff --git a/shells/version.txt b/shells/version.txt index 1309a9ff..68814437 100644 --- a/shells/version.txt +++ b/shells/version.txt @@ -1,5 +1,5 @@ v1.9.6 -2025-11-30 17:05:07 +2025-12-01 17:42:29 1. 一些累计更新,一些BUG修复 2. 优化客户端数据同步,减少服务器流量 3. 去除cdkey,改为发电解锁中继速度 diff --git a/src/linker.doc.web/docs/3、打洞和中继/3.2、中继.md b/src/linker.doc.web/docs/3、打洞和中继/3.2、中继.md index 90ca51ff..ef5e778b 100644 --- a/src/linker.doc.web/docs/3、打洞和中继/3.2、中继.md +++ b/src/linker.doc.web/docs/3、打洞和中继/3.2、中继.md @@ -9,8 +9,8 @@ slug: /p2p/relay :::tip[说明] -1. 如果你自建信标服务器,填写你服务器的管理密钥和管理密码,则可以管理服务器的中继cdkey,发布cdkey给别人使用 -2. 如果你使用别人的服务器,你没有密钥可以不填写,则需要使用别人服务器的公开中继节点,或使用他提供的cdkey +1. 如果你自建信标服务器,填写你服务器的管理密钥和管理密码 +2. 如果你使用别人的服务器,你没有密钥可以不填写 3. `按喜好调整好即可,往后的所有通信都是自动的,无需其它操作` ::: @@ -19,56 +19,39 @@ slug: /p2p/relay :::tip[说明] 1. 如果你有多个服务器,希望将这些服务器作为一个中继节点 -2. 在主服务器外的其它服务器部署一个服务端 -3. 然后 `configs/server.json` 中(`Relay->Distributed`)下修改配置 +2. 在主服务器外的其它服务器部署一个服务端,然后 + - 可以打开`configs/server.json`,将`Relay->ShareKey`中的内容复制到主服务中节点列表处导入 + - 也可以留意程序运行时类似`build relay share key : xxx`的输出,复制内容主服务中节点列表处导入 +3. 默认配置就是可用的,但是也可以对中继配置进行一些修改,在`configs/server.json->Relay` 下修改配置 ```json -//中继 "Relay": { - //多节点 - "Distributed": { - //作为节点时 - "Node": { - //节点Id - "Id": "279DBACF-6F0B-46D4-9BA9-902EB6824849", - //节点名称 - "Name": "default", - //节点地址 域名/IP:端口 或 域名/IP,当只填写域名/IP时,默认使用 ServicePort - "Host": "0.0.0.0:1802", - //节点最大连接数 - "MaxConnection": 0, - //节点连接最大带宽 - "MaxBandwidth": 0, - //节点最大总带宽 - "MaxBandwidthTotal": 0, - //节点最大流量 - "MaxGbTotal": 0, - //节点剩余流量 - "MaxGbTotalLastBytes": 0, - //当前月份,月份变化时重置剩余流量 - "MaxGbTotalMonth": 0, - //节点是否公开 - "Public": false, - //主机地址 - "MasterHost": "127.0.0.1:1802", - //主机密钥 - "MasterSecretKey": "snltty", - //随便url,管理页面展示时点击跳转 - "Url": "https://linker-doc.snltty.com", - //支持TCP - "AllowTcp": true, - //支持UDP - "AllowUdp": false, - //与主机同步版本 - "Sync2Server": false, - //主机备用地址,默认不填即可 - "MasterHosts": [] - }, - //作为主机时 - "Master": { - "SecretKey": "snltty" - } - } + //分享key,自动生成,【无需修改】 + "ShareKey": "", + //管理密钥,自动生成,第一个导入此中继的信标服务可以修改本中继节点配置,【无需修改】 + "MasterKey": "d763f00a21cd1e0a71e7d833ed2a4e51", + //如果你修改了DataEachMonth的值,则修改为0,等待程序启动后计算剩余流量 + "DataMonth": 0, + //域名,可以不填 + "Domain": "", + //节点id,自动生成,,【无需修改】 + "NodeId": "111FF038-C0D6-422C-9076-B8A47A81F1C0", + //节点名称 + "Name": "default", + //节点协议,1为TCP,2为UDP,3为TCP+UDP + "Protocol": 1, + //最大连接数,0为不限制 + "Connections": 0, + //带宽限制,0为不限制 + "Bandwidth": 0, + //月流量,0为不限制 + "DataEachMonth": 0, + //剩余流量,自动生成,【无需修改】 + "DataRemain": 0, + //跳转地址,可以填写你喜欢的地址,在节点列表中点击节点名称跳转到此地址 + "Url": "https://linker.snltty.com", + //节点图标,可以填写你喜欢的图标,在节点列表中展示 + "Logo": "https://linker.snltty.com/img/logo.png" } ``` ::: \ No newline at end of file diff --git a/src/linker.messenger.relay/client/RelayApiController.cs b/src/linker.messenger.relay/client/RelayApiController.cs index e77f8d73..8d8d3f27 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.relay.messenger; using linker.messenger.relay.server; using linker.messenger.signin; using linker.messenger.sync; @@ -14,20 +15,25 @@ namespace linker.messenger.relay.client { private readonly RelayClientTestTransfer relayTestTransfer; private readonly IRelayClientStore relayClientStore; + private readonly IMessengerSender messengerSender; private readonly ISerializer serializer; private readonly ISignInClientStore signInClientStore; private readonly SyncTreansfer syncTreansfer; private readonly TunnelTransfer tunnelTransfer; + private readonly SignInClientState signInClientState; + public RelayApiController(RelayClientTestTransfer relayTestTransfer, IRelayClientStore relayClientStore, IMessengerSender messengerSender, ISerializer serializer, - ISignInClientStore signInClientStore, SyncTreansfer syncTreansfer, TunnelTransfer tunnelTransfer) + ISignInClientStore signInClientStore, SyncTreansfer syncTreansfer, TunnelTransfer tunnelTransfer, SignInClientState signInClientState) { this.relayTestTransfer = relayTestTransfer; this.relayClientStore = relayClientStore; + this.messengerSender = messengerSender; this.serializer = serializer; this.signInClientStore = signInClientStore; this.syncTreansfer = syncTreansfer; this.tunnelTransfer = tunnelTransfer; + this.signInClientState = signInClientState; } public List Subscribe(ApiControllerParamsInfo param) @@ -35,6 +41,13 @@ namespace linker.messenger.relay.client relayTestTransfer.Subscribe(); return relayTestTransfer.Nodes; } + public bool Connect(ApiControllerParamsInfo param) + { + RelayConnectInfo relayConnectInfo = param.Content.DeJson(); + _ = tunnelTransfer.ConnectAsync(relayConnectInfo.ToMachineId, relayConnectInfo.TransactionId, TunnelProtocolType.Udp, + new RelayInfo { NodeId = relayConnectInfo.NodeId }.ToJson(), transportNames: ["TcpRelay"]); + return true; + } public KeyValueInfo GetDefault(ApiControllerParamsInfo param) { @@ -51,14 +64,36 @@ namespace linker.messenger.relay.client } } - public bool Connect(ApiControllerParamsInfo param) - { - RelayConnectInfo relayConnectInfo = param.Content.DeJson(); - _ = tunnelTransfer.ConnectAsync(relayConnectInfo.ToMachineId, relayConnectInfo.TransactionId, TunnelProtocolType.Udp, - new RelayInfo { NodeId = relayConnectInfo.NodeId }.ToJson(), transportNames: ["TcpRelay"]); - return true; - } + public async Task Share(ApiControllerParamsInfo param) + { + var resp = await messengerSender.SendReply(new MessageRequestWrap + { + Connection = signInClientState.Connection, + MessengerId = (ushort)RelayMessengerIds.Share, + }); + return resp.Code == MessageResponeCodes.OK ? serializer.Deserialize(resp.Data.Span) : $"network error:{resp.Code}"; + } + public async Task Import(ApiControllerParamsInfo param) + { + var resp = await messengerSender.SendReply(new MessageRequestWrap + { + Connection = signInClientState.Connection, + MessengerId = (ushort)RelayMessengerIds.Import, + Payload = serializer.Serialize(param.Content) + }); + return resp.Code == MessageResponeCodes.OK ? serializer.Deserialize(resp.Data.Span) : $"network error:{resp.Code}"; + } + public async Task Remove(ApiControllerParamsInfo param) + { + var resp = await messengerSender.SendReply(new MessageRequestWrap + { + Connection = signInClientState.Connection, + MessengerId = (ushort)RelayMessengerIds.Remove, + Payload = serializer.Serialize(int.Parse(param.Content)) + }); + return resp.Code == MessageResponeCodes.OK ? serializer.Deserialize(resp.Data.Span) : $"network error:{resp.Code}"; + } } diff --git a/src/linker.messenger.relay/messenger/RelayMessenger.cs b/src/linker.messenger.relay/messenger/RelayMessenger.cs index 2a711125..f07015db 100644 --- a/src/linker.messenger.relay/messenger/RelayMessenger.cs +++ b/src/linker.messenger.relay/messenger/RelayMessenger.cs @@ -31,7 +31,8 @@ namespace linker.messenger.relay.messenger private readonly RelayServerNodeReportTransfer relayServerNodeReportTransfer; public RelayServerMessenger(SignInServerCaching signCaching, ISerializer serializer, RelayServerValidatorTransfer relayValidatorTransfer, - RelayServerReportResolver relayServerReportResolver, RelayServerMasterTransfer relayServerMasterTransfer, RelayServerNodeReportTransfer relayServerNodeReportTransfer) + RelayServerReportResolver relayServerReportResolver, RelayServerMasterTransfer relayServerMasterTransfer, + RelayServerNodeReportTransfer relayServerNodeReportTransfer) { this.signCaching = signCaching; this.relayValidatorTransfer = relayValidatorTransfer; @@ -122,6 +123,46 @@ namespace linker.messenger.relay.messenger } + [MessengerId((ushort)RelayMessengerIds.Share)] + public async Task Share(IConnection connection) + { + if (signCaching.TryGet(connection.Id, out SignCacheInfo from) == false || from.Super == false) + { + connection.Write(serializer.Serialize("need super key")); + return; + } + connection.Write(serializer.Serialize(relayServerNodeReportTransfer.Config.ShareKey)); + } + [MessengerId((ushort)RelayMessengerIds.Import)] + public async Task Import(IConnection connection) + { + string sharekey = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + + if (signCaching.TryGet(connection.Id, out SignCacheInfo from) == false || from.Super == false) + { + connection.Write(serializer.Serialize("need super key")); + return; + } + + string result = await relayServerNodeReportTransfer.Import(sharekey).ConfigureAwait(false); + connection.Write(serializer.Serialize(result)); + } + [MessengerId((ushort)RelayMessengerIds.Remove)] + public async Task Remove(IConnection connection) + { + int id = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + if (signCaching.TryGet(connection.Id, out SignCacheInfo from) == false || from.Super == false) + { + connection.Write(serializer.Serialize("need super key")); + return; + } + + bool result = await relayServerNodeReportTransfer.Remove(id).ConfigureAwait(false); + connection.Write(serializer.Serialize(result ? string.Empty : "remove fail")); + } + + + [MessengerId((ushort)RelayMessengerIds.NodeReport)] public async Task NodeReport(IConnection connection) { diff --git a/src/linker.messenger.relay/messenger/RelayMessengerIds.cs b/src/linker.messenger.relay/messenger/RelayMessengerIds.cs index 896b05c5..eb7f69d7 100644 --- a/src/linker.messenger.relay/messenger/RelayMessengerIds.cs +++ b/src/linker.messenger.relay/messenger/RelayMessengerIds.cs @@ -14,6 +14,11 @@ SignIn = 2134, Report = 2135, + Share = 2136, + Import = 2137, + Remove = 2138, + + Max = 2199 } } diff --git a/src/linker.messenger.relay/server/IRelayServerConfigStore.cs b/src/linker.messenger.relay/server/IRelayServerConfigStore.cs index 03ed97a6..e356d94f 100644 --- a/src/linker.messenger.relay/server/IRelayServerConfigStore.cs +++ b/src/linker.messenger.relay/server/IRelayServerConfigStore.cs @@ -32,6 +32,7 @@ namespace linker.messenger.relay.server public void SetDataRemain(long value); public void SetShareKey(string shareKey); + public void SetMasterKey(string masterKey); /// /// 提交保存 @@ -44,11 +45,11 @@ namespace linker.messenger.relay.server private string nodeId = Guid.NewGuid().ToString().ToUpper(); public string NodeId { get => nodeId; set { nodeId = value.SubStr(0, 36); } } - private string name = Dns.GetHostName().SubStr(0, 32); + private string name = "default"; public string Name { get => name; set { name = value.SubStr(0, 32); } } public TunnelProtocolType Protocol { get; set; } = TunnelProtocolType.Tcp; - public int Connections { get; set; } = 1000; + public int Connections { get; set; } public int Bandwidth { get; set; } public int DataEachMonth { get; set; } public long DataRemain { get; set; } @@ -60,12 +61,14 @@ namespace linker.messenger.relay.server public sealed class RelayServerConfigInfo : RelayServerNodeInfo { public string ShareKey { get; set; } = string.Empty; + public string MasterKey { get; set; } = string.Empty; public int DataMonth { get; set; } public string Domain { get; set; } = string.Empty; } public class RelayServerNodeReportInfo : RelayServerNodeInfo { + public string MasterKey { get; set; } = string.Empty; public string Version { get; set; } = string.Empty; public int ConnectionsRatio { get; set; } public double BandwidthRatio { get; set; } @@ -79,12 +82,14 @@ namespace linker.messenger.relay.server public string Host { get; set; } = string.Empty; - public int BandwidthEachConnection { get; set; } = 50; + public int BandwidthEach { get; set; } = 50; public bool Public { get; set; } public long LastTicks { get; set; } public int Delay { get; set; } + + public bool Manageable { get; set; } } diff --git a/src/linker.messenger.relay/server/IRelayServerNodeStore.cs b/src/linker.messenger.relay/server/IRelayServerNodeStore.cs index 82f6efaf..b69ce627 100644 --- a/src/linker.messenger.relay/server/IRelayServerNodeStore.cs +++ b/src/linker.messenger.relay/server/IRelayServerNodeStore.cs @@ -6,6 +6,7 @@ public Task GetByNodeId(string nodeId); public Task Add(RelayServerNodeStoreInfo info); public Task Report(RelayServerNodeReportInfo info); + public Task Delete(int id); } diff --git a/src/linker.messenger.relay/server/RelayServerMasterTransfer.cs b/src/linker.messenger.relay/server/RelayServerMasterTransfer.cs index 907280c1..2e02db69 100644 --- a/src/linker.messenger.relay/server/RelayServerMasterTransfer.cs +++ b/src/linker.messenger.relay/server/RelayServerMasterTransfer.cs @@ -11,7 +11,8 @@ namespace linker.messenger.relay.server private readonly IRelayServerCaching relayCaching; private readonly IRelayServerWhiteListStore relayServerWhiteListStore; private readonly RelayServerConnectionTransfer relayServerConnectionTransfer; - public RelayServerMasterTransfer(IRelayServerCaching relayCaching, IRelayServerWhiteListStore relayServerWhiteListStore, RelayServerConnectionTransfer relayServerConnectionTransfer) + public RelayServerMasterTransfer(IRelayServerCaching relayCaching, IRelayServerWhiteListStore relayServerWhiteListStore, + RelayServerConnectionTransfer relayServerConnectionTransfer) { this.relayCaching = relayCaching; this.relayServerWhiteListStore = relayServerWhiteListStore; diff --git a/src/linker.messenger.relay/server/RelayServerNodeReportTransfer.cs b/src/linker.messenger.relay/server/RelayServerNodeReportTransfer.cs index 3c5ce048..d7addc19 100644 --- a/src/linker.messenger.relay/server/RelayServerNodeReportTransfer.cs +++ b/src/linker.messenger.relay/server/RelayServerNodeReportTransfer.cs @@ -14,6 +14,7 @@ namespace linker.messenger.relay.server private int connectionNum = 0; private ulong bytes = 0; private ulong lastBytes = 0; + private string md5 = string.Empty; private readonly ICrypto crypto = CryptoFactory.CreateSymmetric(Helper.GlobalString); @@ -38,6 +39,8 @@ namespace linker.messenger.relay.server this.relayServerWhiteListStore = relayServerWhiteListStore; this.messengerResolver = messengerResolver; + md5 = Config.NodeId.Md5(); + _ = ReportTask(); SignInTask(); @@ -67,7 +70,7 @@ namespace linker.messenger.relay.server } public async Task Report(RelayServerNodeReportInfo info) { - if (relayServerConnectionTransfer.TryGet(ConnectionSideType.Node, info.NodeId, out IConnection connection) == false) return false; + if (relayServerConnectionTransfer.TryGet(ConnectionSideType.Node, info.NodeId, out _) == false) return false; return await relayServerNodeStore.Report(info).ConfigureAwait(false); } @@ -80,16 +83,51 @@ namespace linker.messenger.relay.server connection.Id = serverId; relayServerConnectionTransfer.TryAdd(ConnectionSideType.Master, connection.Id, connection); + + //未被配置,或默认配置的,设它为管理端 + if (string.IsNullOrWhiteSpace(Config.MasterKey) || md5 == Config.MasterKey) + { + relayServerConfigStore.SetMasterKey(serverId.Md5()); + relayServerConfigStore.Confirm(); + } return true; } + public async Task Import(string shareKey) + { + try + { + RelayServerNodeShareInfo info = serializer.Deserialize(crypto.Decode(Convert.FromBase64String(shareKey)).Span); + + bool result = await relayServerNodeStore.Add(new RelayServerNodeStoreInfo + { + NodeId = info.NodeId, + Host = info.Host, + Name = info.Name, + LastTicks = Environment.TickCount64 + }).ConfigureAwait(false); + if (result == false) + { + return "node already exists"; + } + } + catch (Exception ex) + { + return ex.Message; + } + return string.Empty; + } + public async Task Remove(int id) + { + return await relayServerNodeStore.Delete(id).ConfigureAwait(false); + } public async Task> GetNodes(bool validated, string userid, string machineId) { var nodes = (await relayServerWhiteListStore.GetNodes(userid, machineId)).Where(c => c.Bandwidth >= 0).SelectMany(c => c.Nodes); var result = (await relayServerNodeStore.GetAll()) - .Where(c => Environment.TickCount64 - c.LastTicks < 15000) + .Where(c => validated || Environment.TickCount64 - c.LastTicks < 15000) .Where(c => { return validated || nodes.Contains(c.NodeId) || nodes.Contains("*") @@ -100,7 +138,7 @@ namespace linker.messenger.relay.server return result.OrderByDescending(x => x.Connections == 0 ? int.MaxValue : x.Connections) .ThenBy(x => x.ConnectionsRatio) .ThenBy(x => x.BandwidthRatio) - .ThenByDescending(x => x.BandwidthEachConnection == 0 ? int.MaxValue : x.BandwidthEachConnection) + .ThenByDescending(x => x.BandwidthEach == 0 ? int.MaxValue : x.BandwidthEach) .ThenByDescending(x => x.Bandwidth == 0 ? int.MaxValue : x.Bandwidth) .ThenByDescending(x => x.DataEachMonth == 0 ? int.MaxValue : x.DataEachMonth) .ThenByDescending(x => x.DataRemain == 0 ? long.MaxValue : x.DataRemain) @@ -116,7 +154,7 @@ namespace linker.messenger.relay.server return result.OrderByDescending(x => x.Connections == 0 ? int.MaxValue : x.Connections) .ThenBy(x => x.ConnectionsRatio) .ThenBy(x => x.BandwidthRatio) - .ThenByDescending(x => x.BandwidthEachConnection == 0 ? int.MaxValue : x.BandwidthEachConnection) + .ThenByDescending(x => x.BandwidthEach == 0 ? int.MaxValue : x.BandwidthEach) .ThenByDescending(x => x.Bandwidth == 0 ? int.MaxValue : x.Bandwidth) .ThenByDescending(x => x.DataEachMonth == 0 ? int.MaxValue : x.DataEachMonth) .ThenByDescending(x => x.DataRemain == 0 ? long.MaxValue : x.DataRemain) @@ -130,8 +168,8 @@ namespace linker.messenger.relay.server { await relayServerNodeStore.Add(new RelayServerNodeStoreInfo { - NodeId = Config.NodeId, - Name = Config.Name, + NodeId = relayServerConfigStore.Config.NodeId, + Name = "default", Host = $"{IPAddress.Loopback}:{relayServerConfigStore.ServicePort}" }).ConfigureAwait(false); @@ -240,7 +278,7 @@ namespace linker.messenger.relay.server }).ConfigureAwait(false); if (resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray)) { - Console.WriteLine($"relay sign in to node {c.NodeId} success"); + LoggerHelper.Instance.Debug($"relay sign in to node {c.NodeId} success"); relayServerConnectionTransfer.TryAdd(ConnectionSideType.Node, c.NodeId, connection); } else diff --git a/src/linker.messenger.relay/webapi/WebApiRelayNodesController.cs b/src/linker.messenger.relay/webapi/WebApiRelayNodesController.cs index f2169d6d..5ee23dfc 100644 --- a/src/linker.messenger.relay/webapi/WebApiRelayNodesController.cs +++ b/src/linker.messenger.relay/webapi/WebApiRelayNodesController.cs @@ -24,7 +24,7 @@ namespace linker.messenger.relay.webapi Version = c.Version, BandwidthMaxMbps = c.Bandwidth, - BandwidthConnMbps = c.BandwidthEachConnection, + BandwidthConnMbps = c.BandwidthEach, BandwidthCurrentMbps = c.BandwidthRatio, BandwidthGbMonth = c.DataEachMonth, diff --git a/src/linker.messenger.serializer.memorypack/RelaySerializer.cs b/src/linker.messenger.serializer.memorypack/RelaySerializer.cs index db6b1254..b072e7de 100644 --- a/src/linker.messenger.serializer.memorypack/RelaySerializer.cs +++ b/src/linker.messenger.serializer.memorypack/RelaySerializer.cs @@ -242,6 +242,8 @@ namespace linker.messenger.serializer.memorypack [MemoryPackInclude] string Logo => info.Logo; [MemoryPackInclude] + string MasterKey => info.MasterKey; + [MemoryPackInclude] string Version => info.Version; [MemoryPackInclude] int ConnectionsRatio => info.ConnectionsRatio; @@ -252,7 +254,7 @@ namespace linker.messenger.serializer.memorypack [MemoryPackConstructor] SerializableRelayServerNodeReportInfo(string nodeId, string name, TunnelProtocolType protocol, int connections, int bandwidth, int dataEachMonth, - long dataRemain, string url, string logo, string version, int connectionsRatio, double bandwidthRatio, IPEndPoint[] masters) + long dataRemain, string url, string logo, string masterKey, string version, int connectionsRatio, double bandwidthRatio, IPEndPoint[] masters) { var info = new RelayServerNodeReportInfo { @@ -265,6 +267,7 @@ namespace linker.messenger.serializer.memorypack DataRemain = dataRemain, Url = url, Logo = logo, + MasterKey = masterKey, Version = version, ConnectionsRatio = connectionsRatio, BandwidthRatio = bandwidthRatio, @@ -311,6 +314,7 @@ namespace linker.messenger.serializer.memorypack value.DataRemain = reader.ReadValue(); value.Url = reader.ReadValue(); value.Logo = reader.ReadValue(); + value.MasterKey = reader.ReadValue(); value.Version = reader.ReadValue(); value.ConnectionsRatio = reader.ReadValue(); value.BandwidthRatio = reader.ReadValue(); @@ -344,7 +348,10 @@ namespace linker.messenger.serializer.memorypack [MemoryPackInclude] string Logo => info.Logo; [MemoryPackInclude] + string MasterKey => info.MasterKey; + [MemoryPackInclude] string Version => info.Version; + [MemoryPackInclude] int ConnectionsRatio => info.ConnectionsRatio; [MemoryPackInclude] @@ -358,17 +365,19 @@ namespace linker.messenger.serializer.memorypack [MemoryPackInclude] string Host => info.Host; [MemoryPackInclude] - int BandwidthEachConnection => info.BandwidthEachConnection; + int BandwidthEachConnection => info.BandwidthEach; [MemoryPackInclude] bool Public => info.Public; [MemoryPackInclude] long LastTicks => info.LastTicks; + [MemoryPackInclude] + bool Manageable => info.Manageable; [MemoryPackConstructor] SerializableRelayServerNodeStoreInfo(string nodeId, string name, TunnelProtocolType protocol, int connections, int bandwidth, int dataEachMonth, - long dataRemain, string url, string logo, string version, int connectionsRatio, double bandwidthRatio, IPEndPoint[] servers, - int id, string host, int bandwidthEachConnection, bool Public, long lastTicks) + long dataRemain, string url, string logo, string masterKey, string version, int connectionsRatio, double bandwidthRatio, IPEndPoint[] servers, + int id, string host, int bandwidthEachConnection, bool Public, long lastTicks, bool manageable) { var info = new RelayServerNodeStoreInfo { @@ -381,15 +390,17 @@ namespace linker.messenger.serializer.memorypack DataRemain = dataRemain, Url = url, Logo = logo, + MasterKey = masterKey, Version = version, ConnectionsRatio = connectionsRatio, BandwidthRatio = bandwidthRatio, Masters = servers, Id = id, Host = host, - BandwidthEachConnection = bandwidthEachConnection, + BandwidthEach = bandwidthEachConnection, Public = Public, - LastTicks = lastTicks + LastTicks = lastTicks, + Manageable = manageable }; this.info = info; } @@ -432,15 +443,17 @@ namespace linker.messenger.serializer.memorypack value.DataRemain = reader.ReadValue(); value.Url = reader.ReadValue(); value.Logo = reader.ReadValue(); + value.MasterKey = reader.ReadValue(); value.Version = reader.ReadValue(); value.ConnectionsRatio = reader.ReadValue(); value.BandwidthRatio = reader.ReadValue(); value.Masters = reader.ReadValue(); value.Id = reader.ReadValue(); value.Host = reader.ReadValue(); - value.BandwidthEachConnection = reader.ReadValue(); + value.BandwidthEach = reader.ReadValue(); value.Public = reader.ReadValue(); value.LastTicks = reader.ReadValue(); + value.Manageable = reader.ReadValue(); } } @@ -463,9 +476,9 @@ namespace linker.messenger.serializer.memorypack { var info = new RelayServerNodeShareInfo { - NodeId= nodeId, - Host= host, - Name= name + NodeId = nodeId, + Host = host, + Name = name }; this.info = info; } diff --git a/src/linker.messenger.store.file/relay/RelayServerConfigStore.cs b/src/linker.messenger.store.file/relay/RelayServerConfigStore.cs index c22790a7..3eeeb494 100644 --- a/src/linker.messenger.store.file/relay/RelayServerConfigStore.cs +++ b/src/linker.messenger.store.file/relay/RelayServerConfigStore.cs @@ -7,8 +7,6 @@ namespace linker.messenger.store.file.relay public int ServicePort => config.Data.Server.ServicePort; public RelayServerConfigInfo Config => config.Data.Server.Relay; - - private readonly FileConfig config; public RelayServerConfigStore(FileConfig config) { @@ -38,5 +36,10 @@ namespace linker.messenger.store.file.relay { config.Data.Server.Relay.ShareKey = shareKey; } + + public void SetMasterKey(string masterKey) + { + config.Data.Server.Relay.MasterKey = masterKey; + } } } diff --git a/src/linker.messenger.store.file/relay/RelayServerNodeStore.cs b/src/linker.messenger.store.file/relay/RelayServerNodeStore.cs index beacc3b3..6deeb681 100644 --- a/src/linker.messenger.store.file/relay/RelayServerNodeStore.cs +++ b/src/linker.messenger.store.file/relay/RelayServerNodeStore.cs @@ -1,4 +1,5 @@ -using linker.messenger.relay.server; +using linker.libs.extends; +using linker.messenger.relay.server; using LiteDB; namespace linker.messenger.store.file.relay @@ -7,9 +8,11 @@ namespace linker.messenger.store.file.relay { private readonly ILiteCollection liteCollection; - public RelayServerNodeStore(Storefactory storefactory) + private string md5 = string.Empty; + public RelayServerNodeStore(Storefactory storefactory, IRelayServerConfigStore relayServerConfigStore) { liteCollection = storefactory.GetCollection("relay_server_master"); + md5 = relayServerConfigStore.Config.NodeId.Md5(); } public async Task Add(RelayServerNodeStoreInfo info) @@ -22,6 +25,11 @@ namespace linker.messenger.store.file.relay return await Task.FromResult(true).ConfigureAwait(false); } + public async Task Delete(int id) + { + return await Task.FromResult(liteCollection.Delete(id)).ConfigureAwait(false); + } + public async Task> GetAll() { return await Task.FromResult(liteCollection.FindAll().ToList()).ConfigureAwait(false); @@ -48,6 +56,10 @@ namespace linker.messenger.store.file.relay DataRemain = info.DataRemain, Name = info.Name, Protocol = info.Protocol, + MasterKey = info.MasterKey, + Masters = info.Masters, + //是我初始化的,可以管理 + Manageable = info.MasterKey == md5 }, c => c.NodeId == info.NodeId); return await Task.FromResult(length > 0).ConfigureAwait(false); ;