using linker.libs.api; using linker.libs.extends; using linker.plugins.sforward.messenger; using System.Collections.Concurrent; using linker.messenger.signin; using linker.libs; using linker.messenger.api; namespace linker.messenger.sforward.client { public sealed class SForwardApiController : IApiController { private readonly SForwardClientTransfer forwardTransfer; private readonly IMessengerSender messengerSender; private readonly SignInClientState signInClientState; private readonly ISignInClientStore signInClientStore; private readonly SForwardDecenter sForwardDecenter; private readonly ISForwardClientStore sForwardClientStore; private readonly ISerializer serializer; private readonly IAccessStore accessStore; public SForwardApiController(SForwardClientTransfer forwardTransfer, IMessengerSender messengerSender, SignInClientState signInClientState, ISignInClientStore signInClientStore, SForwardDecenter sForwardDecenter, ISForwardClientStore sForwardClientStore, ISerializer serializer, IAccessStore accessStore) { this.forwardTransfer = forwardTransfer; this.messengerSender = messengerSender; this.signInClientState = signInClientState; this.signInClientStore = signInClientStore; this.sForwardDecenter = sForwardDecenter; this.sForwardClientStore = sForwardClientStore; this.serializer = serializer; this.accessStore = accessStore; } /// /// 获取密钥 /// /// /// public string GetSecretKey(ApiControllerParamsInfo param) { return sForwardClientStore.SecretKey; } /// /// 设置密钥 /// /// [Access(AccessValue.Config)] public void SetSecretKey(ApiControllerParamsInfo param) { sForwardClientStore.SetSecretKey(param.Content); } public void Refresh(ApiControllerParamsInfo param) { sForwardDecenter.Refresh(); } /// /// 获取数量 /// /// /// public SForwardListInfo GetCount(ApiControllerParamsInfo param) { ulong hashCode = ulong.Parse(param.Content); if (sForwardDecenter.DataVersion.Eq(hashCode, out ulong version) == false) { return new SForwardListInfo { List = sForwardDecenter.CountDic, HashCode = version }; } return new SForwardListInfo { HashCode = version }; } /// /// 获取穿透列表 /// /// /// public async Task> Get(ApiControllerParamsInfo param) { if (param.Content == signInClientStore.Id) { if (accessStore.HasAccess(AccessValue.ForwardShowSelf) == false) return new List(); return sForwardClientStore.Get(); } if (accessStore.HasAccess(AccessValue.ForwardShowOther) == false) return new List(); var resp = await messengerSender.SendReply(new MessageRequestWrap { Connection = signInClientState.Connection, MessengerId = (ushort)SForwardMessengerIds.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) { SForwardAddForwardInfo 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)SForwardMessengerIds.AddClientForward, Payload = serializer.Serialize(info) }); } /// /// 删除穿透 /// /// /// public async Task Remove(ApiControllerParamsInfo param) { SForwardRemoveForwardInfo 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)SForwardMessengerIds.RemoveClientForward, Payload = serializer.Serialize(info) }); } /// /// 测试服务 /// /// /// public async Task TestLocal(ApiControllerParamsInfo param) { if (param.Content == signInClientStore.Id) { forwardTransfer.TestLocal(); return true; } await messengerSender.SendOnly(new MessageRequestWrap { Connection = signInClientState.Connection, MessengerId = (ushort)SForwardMessengerIds.TestClientForward, Payload = serializer.Serialize(param.Content) }); return true; } } public sealed class SForwardListInfo { public ConcurrentDictionary List { get; set; } public ulong HashCode { get; set; } } }