using linker.libs.api; using linker.libs.extends; using System.Net; using linker.libs; using linker.tunnel.connection; using System.Collections.Concurrent; using linker.messenger.signin; using linker.messenger.forward.proxy; using linker.messenger.api; namespace linker.messenger.forward { public sealed class ForwardApiController : IApiController { private readonly ForwardTransfer forwardTransfer; private readonly ForwardProxy forwardProxy; private readonly IMessengerSender messengerSender; private readonly SignInClientState signInClientState; private readonly IAccessStore accessStore; private readonly ISignInClientStore signInClientStore; private readonly ForwardDecenter forwardDecenter; private readonly ISerializer serializer; public ForwardApiController(ForwardTransfer forwardTransfer, ForwardProxy forwardProxy, IMessengerSender messengerSender, SignInClientState signInClientState, IAccessStore accessStore, ISignInClientStore signInClientStore, ForwardDecenter forwardDecenter, ISerializer serializer) { this.forwardTransfer = forwardTransfer; this.forwardProxy = forwardProxy; this.messengerSender = messengerSender; this.signInClientState = signInClientState; this.accessStore = accessStore; this.signInClientStore = signInClientStore; this.forwardDecenter = forwardDecenter; this.serializer = serializer; } public ConnectionListInfo Connections(ApiControllerParamsInfo param) { ulong hashCode = ulong.Parse(param.Content); if (forwardProxy.Version.Eq(hashCode, out ulong version) == false) { return new ConnectionListInfo { List = forwardProxy.GetConnections(), HashCode = version }; } return new ConnectionListInfo { HashCode = version }; } [Access(AccessValue.TunnelRemove)] public void RemoveConnection(ApiControllerParamsInfo param) { forwardProxy.RemoveConnection(param.Content); } public IPAddress[] BindIPs(ApiControllerParamsInfo param) { return NetworkHelper.GetIPV4(); } public void Refresh(ApiControllerParamsInfo param) { forwardDecenter.Refresh(); } public ForwardListInfo GetCount(ApiControllerParamsInfo param) { ulong hashCode = ulong.Parse(param.Content); if (forwardDecenter.DataVersion.Eq(hashCode, out ulong version) == false) { return new ForwardListInfo { List = forwardDecenter.CountDic, HashCode = version }; } return new ForwardListInfo { HashCode = version }; } /// /// 获取列表 /// /// /// public async Task> Get(ApiControllerParamsInfo param) { if (param.Content == signInClientStore.Id) { if (accessStore.HasAccess(AccessValue.ForwardShowSelf) == false) return new List(); return forwardTransfer.Get(); } if (accessStore.HasAccess(AccessValue.ForwardShowOther) == false) return new List(); var resp = await messengerSender.SendReply(new MessageRequestWrap { Connection = signInClientState.Connection, MessengerId = (ushort)ForwardMessengerIds.GetForward, Payload = serializer.Serialize(param.Content) }); if (resp.Code == MessageResponeCodes.OK) { return serializer.Deserialize>(resp.Data.Span); } return new List(); } /// /// 添加 /// /// /// public async Task Add(ApiControllerParamsInfo param) { ForwardAddForwardInfo info = param.Content.DeJson(); if (info.MachineId == signInClientStore.Id) { if (accessStore.HasAccess(AccessValue.ForwardSelf) == false) return false; return forwardTransfer.Add(info.Data); } if (accessStore.HasAccess(AccessValue.ForwardOther) == false) return false; return await messengerSender.SendOnly(new MessageRequestWrap { Connection = signInClientState.Connection, MessengerId = (ushort)ForwardMessengerIds.AddClientForward, Payload = serializer.Serialize(info) }); } /// /// 删除 /// /// /// public async Task Remove(ApiControllerParamsInfo param) { ForwardRemoveForwardInfo info = param.Content.DeJson(); if (info.MachineId == signInClientStore.Id) { if (accessStore.HasAccess(AccessValue.ForwardSelf) == false) return false; return forwardTransfer.Remove(info.Id); } if (accessStore.HasAccess(AccessValue.ForwardOther) == false) return false; return await messengerSender.SendOnly(new MessageRequestWrap { Connection = signInClientState.Connection, MessengerId = (ushort)ForwardMessengerIds.RemoveClientForward, Payload = serializer.Serialize(info) }); } /// /// 检测 /// /// /// public async Task Test(ApiControllerParamsInfo param) { if (param.Content == signInClientStore.Id) { forwardTransfer.SubscribeTest(); return true; } await messengerSender.SendOnly(new MessageRequestWrap { Connection = signInClientState.Connection, MessengerId = (ushort)ForwardMessengerIds.TestClientForward, Payload = serializer.Serialize(param.Content) }); return true; } } public sealed class ForwardListInfo { public ConcurrentDictionary List { get; set; } public ulong HashCode { get; set; } } public sealed class ConnectionListInfo { public ConcurrentDictionary List { get; set; } public ulong HashCode { get; set; } } }