mirror of
https://github.com/snltty/linker.git
synced 2025-10-05 01:02:44 +08:00
sync
This commit is contained in:
84
.github/workflows/nuget.yml
vendored
84
.github/workflows/nuget.yml
vendored
@@ -22,24 +22,60 @@ jobs:
|
|||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
run: |
|
||||||
dotnet build ./linker.libs -c release
|
dotnet build ./linker.libs -c release
|
||||||
dotnet build ./linker.tunnel -c release
|
|
||||||
dotnet build ./linker.tun -c release
|
|
||||||
dotnet build ./linker.messenger -c release
|
dotnet build ./linker.messenger -c release
|
||||||
dotnet build ./linker.messenger.relay -c release
|
dotnet build ./linker.messenger.access -c release
|
||||||
dotnet build ./linker.messenger.signin -c release
|
dotnet build ./linker.messenger.action -c release
|
||||||
dotnet build ./linker.messenger.tunnel -c release
|
dotnet build ./linker.messenger.api -c release
|
||||||
|
dotnet build ./linker.messenger.channel -c release
|
||||||
dotnet build ./linker.messenger.decenter -c release
|
dotnet build ./linker.messenger.decenter -c release
|
||||||
|
dotnet build ./linker.messenger.entry -c release
|
||||||
|
dotnet build ./linker.messenger.exroute -c release
|
||||||
|
dotnet build ./linker.messenger.flow -c release
|
||||||
|
dotnet build ./linker.messenger.forward -c release
|
||||||
|
dotnet build ./linker.messenger.listen -c release
|
||||||
|
dotnet build ./linker.messenger.logger -c release
|
||||||
|
dotnet build ./linker.messenger.pcp -c release
|
||||||
|
dotnet build ./linker.messenger.relay -c release
|
||||||
|
dotnet build ./linker.messenger.serializer.memorypack -c release
|
||||||
|
dotnet build ./linker.messenger.sforward -c release
|
||||||
|
dotnet build ./linker.messenger.signin -c release
|
||||||
|
dotnet build ./linker.messenger.socks5 -c release
|
||||||
|
dotnet build ./linker.messenger.store.file -c release
|
||||||
|
dotnet build ./linker.messenger.sync -c release
|
||||||
|
dotnet build ./linker.messenger.tunnel -c release
|
||||||
|
dotnet build ./linker.messenger.tuntap -c release
|
||||||
|
dotnet build ./linker.messenger.updater -c release
|
||||||
|
dotnet build ./linker.tun -c release
|
||||||
|
dotnet build ./linker.tunnel -c release
|
||||||
|
|
||||||
- name: Pack
|
- name: Pack
|
||||||
run: |
|
run: |
|
||||||
dotnet pack ./linker.libs -c release
|
dotnet pack ./linker.libs -c release
|
||||||
dotnet pack ./linker.tunnel -c release
|
|
||||||
dotnet pack ./linker.tun -c release
|
|
||||||
dotnet pack ./linker.messenger -c release
|
dotnet pack ./linker.messenger -c release
|
||||||
dotnet pack ./linker.messenger.relay -c release
|
dotnet pack ./linker.messenger.access -c release
|
||||||
dotnet pack ./linker.messenger.signin -c release
|
dotnet pack ./linker.messenger.action -c release
|
||||||
dotnet pack ./linker.messenger.tunnel -c release
|
dotnet pack ./linker.messenger.api -c release
|
||||||
|
dotnet pack ./linker.messenger.channel -c release
|
||||||
dotnet pack ./linker.messenger.decenter -c release
|
dotnet pack ./linker.messenger.decenter -c release
|
||||||
|
dotnet pack ./linker.messenger.entry -c release
|
||||||
|
dotnet pack ./linker.messenger.exroute -c release
|
||||||
|
dotnet pack ./linker.messenger.flow -c release
|
||||||
|
dotnet pack ./linker.messenger.forward -c release
|
||||||
|
dotnet pack ./linker.messenger.listen -c release
|
||||||
|
dotnet pack ./linker.messenger.logger -c release
|
||||||
|
dotnet pack ./linker.messenger.pcp -c release
|
||||||
|
dotnet pack ./linker.messenger.relay -c release
|
||||||
|
dotnet pack ./linker.messenger.serializer.memorypack -c release
|
||||||
|
dotnet pack ./linker.messenger.sforward -c release
|
||||||
|
dotnet pack ./linker.messenger.signin -c release
|
||||||
|
dotnet pack ./linker.messenger.socks5 -c release
|
||||||
|
dotnet pack ./linker.messenger.store.file -c release
|
||||||
|
dotnet pack ./linker.messenger.sync -c release
|
||||||
|
dotnet pack ./linker.messenger.tunnel -c release
|
||||||
|
dotnet pack ./linker.messenger.tuntap -c release
|
||||||
|
dotnet pack ./linker.messenger.updater -c release
|
||||||
|
dotnet pack ./linker.tun -c release
|
||||||
|
dotnet pack ./linker.tunnel -c release
|
||||||
|
|
||||||
- name: Install Nuget
|
- name: Install Nuget
|
||||||
uses: nuget/setup-nuget@v1
|
uses: nuget/setup-nuget@v1
|
||||||
@@ -48,11 +84,29 @@ jobs:
|
|||||||
|
|
||||||
- name: Push
|
- name: Push
|
||||||
run: |
|
run: |
|
||||||
nuget push ./linker.tunnel/bin/release/linker.tunnel.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
|
||||||
nuget push ./linker.libs/bin/release/linker.libs.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
nuget push ./linker.libs/bin/release/linker.libs.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
nuget push ./linker.tun/bin/release/linker.tun.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
|
||||||
nuget push ./linker.messenger/bin/release/linker.messenger.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
nuget push ./linker.messenger/bin/release/linker.messenger.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
nuget push ./linker.messenger/bin/release/linker.messenger.relay.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
nuget push ./linker.messenger/bin/release/linker.messenger.access.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
nuget push ./linker.messenger/bin/release/linker.messenger.signin.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
nuget push ./linker.messenger/bin/release/linker.messenger.action.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
nuget push ./linker.messenger/bin/release/linker.messenger.tunnel.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
nuget push ./linker.messenger/bin/release/linker.messenger.api.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
|
nuget push ./linker.messenger/bin/release/linker.messenger.channel.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
nuget push ./linker.messenger/bin/release/linker.messenger.decenter.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
nuget push ./linker.messenger/bin/release/linker.messenger.decenter.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
|
nuget push ./linker.messenger/bin/release/linker.messenger.entry.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
|
nuget push ./linker.messenger/bin/release/linker.messenger.exroute.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
|
nuget push ./linker.messenger/bin/release/linker.messenger.flow.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
|
nuget push ./linker.messenger/bin/release/linker.messenger.forward.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
|
nuget push ./linker.messenger/bin/release/linker.messenger.listen.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
|
nuget push ./linker.messenger/bin/release/linker.messenger.logger.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
|
nuget push ./linker.messenger/bin/release/linker.messenger.pcp.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
|
nuget push ./linker.messenger/bin/release/linker.messenger.relay.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
|
nuget push ./linker.messenger/bin/release/linker.messenger.serializer.memorypack.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
|
nuget push ./linker.messenger/bin/release/linker.messenger.sforward.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
|
nuget push ./linker.messenger/bin/release/linker.messenger.signin.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
|
nuget push ./linker.messenger/bin/release/linker.messenger.socks5.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
|
nuget push ./linker.messenger/bin/release/linker.messenger.store.file.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
|
nuget push ./linker.messenger/bin/release/linker.messenger.sync.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
|
nuget push ./linker.messenger/bin/release/linker.messenger.tunnel.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
|
nuget push ./linker.messenger/bin/release/linker.messenger.tuntap.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
|
nuget push ./linker.messenger/bin/release/linker.messenger.updater.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
|
nuget push ./linker.tun/bin/release/linker.tun.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
|
nuget push ./linker.tunnel/bin/release/linker.tunnel.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
using linker.libs.extends;
|
using linker.libs.extends;
|
||||||
using linker.libs;
|
using linker.libs;
|
||||||
using linker.messenger.signin;
|
using linker.messenger.signin;
|
||||||
|
using linker.messenger.api;
|
||||||
|
|
||||||
namespace linker.messenger.access
|
namespace linker.messenger.access
|
||||||
{
|
{
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
using linker.libs;
|
using linker.libs;
|
||||||
|
using linker.messenger.api;
|
||||||
using linker.messenger.decenter;
|
using linker.messenger.decenter;
|
||||||
using linker.messenger.signin;
|
using linker.messenger.signin;
|
||||||
|
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
using linker.libs;
|
using linker.libs;
|
||||||
|
using linker.messenger.api;
|
||||||
using linker.messenger.signin;
|
using linker.messenger.signin;
|
||||||
|
|
||||||
namespace linker.messenger.access
|
namespace linker.messenger.access
|
||||||
|
@@ -1,6 +1,4 @@
|
|||||||
using linker.libs;
|
using linker.messenger.access;
|
||||||
using linker.libs.web;
|
|
||||||
using linker.messenger.access;
|
|
||||||
using linker.messenger.decenter;
|
using linker.messenger.decenter;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
namespace linker.messenger.api
|
namespace linker.messenger.api
|
||||||
|
@@ -36,6 +36,5 @@
|
|||||||
<ProjectReference Include="..\linker.messenger.decenter\linker.messenger.decenter.csproj" />
|
<ProjectReference Include="..\linker.messenger.decenter\linker.messenger.decenter.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.signin\linker.messenger.signin.csproj" />
|
<ProjectReference Include="..\linker.messenger.signin\linker.messenger.signin.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger\linker.messenger.csproj" />
|
<ProjectReference Include="..\linker.messenger\linker.messenger.csproj" />
|
||||||
<ProjectReference Include="..\linker.signin\linker.messenger.signin.csproj" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
using linker.libs.api;
|
using linker.libs.api;
|
||||||
using linker.libs.extends;
|
using linker.libs.extends;
|
||||||
|
using linker.messenger.api;
|
||||||
|
|
||||||
namespace linker.messenger.action
|
namespace linker.messenger.action
|
||||||
{
|
{
|
||||||
@@ -13,12 +14,13 @@ namespace linker.messenger.action
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[Access(AccessValue.Action)]
|
||||||
public bool SetArgs(ApiControllerParamsInfo param)
|
public bool SetArgs(ApiControllerParamsInfo param)
|
||||||
{
|
{
|
||||||
actionStore.SetActionArg(param.Content);
|
actionStore.SetActionArg(param.Content);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
[Access(AccessValue.Action)]
|
||||||
public bool SetServerArgs(ApiControllerParamsInfo param)
|
public bool SetServerArgs(ApiControllerParamsInfo param)
|
||||||
{
|
{
|
||||||
actionStore.SetActionArgs(param.Content.DeJson<Dictionary<string, string>>());
|
actionStore.SetActionArgs(param.Content.DeJson<Dictionary<string, string>>());
|
||||||
|
@@ -1,4 +1,7 @@
|
|||||||
using linker.messenger.action;
|
using linker.messenger.action;
|
||||||
|
using linker.messenger.relay.server.validator;
|
||||||
|
using linker.messenger.sforward.server.validator;
|
||||||
|
using linker.messenger.signin.args;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
namespace linker.messenger.api
|
namespace linker.messenger.api
|
||||||
{
|
{
|
||||||
@@ -10,15 +13,16 @@ namespace linker.messenger.api
|
|||||||
|
|
||||||
serviceCollection.AddSingleton<ActionTransfer>();
|
serviceCollection.AddSingleton<ActionTransfer>();
|
||||||
serviceCollection.AddSingleton<SignInArgsAction>();
|
serviceCollection.AddSingleton<SignInArgsAction>();
|
||||||
serviceCollection.AddSingleton<RelayValidatorAction>();
|
|
||||||
serviceCollection.AddSingleton<SForwardValidatorAction>();
|
|
||||||
return serviceCollection;
|
return serviceCollection;
|
||||||
}
|
}
|
||||||
public static ServiceProvider UseActionClient(this ServiceProvider serviceProvider)
|
public static ServiceProvider UseActionClient(this ServiceProvider serviceProvider)
|
||||||
{
|
{
|
||||||
ApiServer apiServer=serviceProvider.GetService<ApiServer>();
|
IApiServer apiServer = serviceProvider.GetService<IApiServer>();
|
||||||
apiServer.AddPlugins(new List<libs.api.IApiController> { serviceProvider.GetService<ActionApiController>() });
|
apiServer.AddPlugins(new List<libs.api.IApiController> { serviceProvider.GetService<ActionApiController>() });
|
||||||
|
|
||||||
|
SignInArgsTransfer signInArgsTransfer = serviceProvider.GetService<SignInArgsTransfer>();
|
||||||
|
signInArgsTransfer.AddArgs(new List<ISignInArgs> { serviceProvider.GetService<SignInArgsAction>() });
|
||||||
|
|
||||||
return serviceProvider;
|
return serviceProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,6 +36,14 @@ namespace linker.messenger.api
|
|||||||
}
|
}
|
||||||
public static ServiceProvider UseActionServer(this ServiceProvider serviceProvider)
|
public static ServiceProvider UseActionServer(this ServiceProvider serviceProvider)
|
||||||
{
|
{
|
||||||
|
SignInArgsTransfer signInArgsTransfer = serviceProvider.GetService<SignInArgsTransfer>();
|
||||||
|
signInArgsTransfer.AddArgs(new List<ISignInArgs> { serviceProvider.GetService<SignInArgsAction>() });
|
||||||
|
|
||||||
|
RelayServerValidatorTransfer relayServerValidatorTransfer = serviceProvider.GetService<RelayServerValidatorTransfer>();
|
||||||
|
relayServerValidatorTransfer.AddValidators(new List<IRelayServerValidator> { serviceProvider.GetService<RelayValidatorAction>() });
|
||||||
|
|
||||||
|
SForwardValidatorTransfer sForwardValidatorTransfer = serviceProvider.GetService<SForwardValidatorTransfer>();
|
||||||
|
sForwardValidatorTransfer.AddValidators(new List<ISForwardValidator> { serviceProvider.GetService<SForwardValidatorAction>() });
|
||||||
return serviceProvider;
|
return serviceProvider;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
public sealed class ActionInfo
|
public sealed class ActionInfo
|
||||||
{
|
{
|
||||||
public string Arg { get; set; }
|
public string Arg { get; set; } = string.Empty;
|
||||||
public Dictionary<string, string> Args { get; set; } = new Dictionary<string, string>();
|
public Dictionary<string, string> Args { get; set; } = new Dictionary<string, string>();
|
||||||
}
|
}
|
||||||
public interface IActionStore
|
public interface IActionStore
|
||||||
|
@@ -1,5 +1,7 @@
|
|||||||
using linker.libs.extends;
|
using linker.libs.extends;
|
||||||
using linker.messenger.relay.server.validator;
|
using linker.messenger.relay.server.validator;
|
||||||
|
using linker.messenger.sforward;
|
||||||
|
using linker.messenger.sforward.server.validator;
|
||||||
using linker.messenger.signin;
|
using linker.messenger.signin;
|
||||||
using linker.messenger.signin.args;
|
using linker.messenger.signin.args;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
|
@@ -34,8 +34,8 @@
|
|||||||
<ProjectReference Include="..\linker.libs\linker.libs.csproj" />
|
<ProjectReference Include="..\linker.libs\linker.libs.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.api\linker.messenger.api.csproj" />
|
<ProjectReference Include="..\linker.messenger.api\linker.messenger.api.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.relay\linker.messenger.relay.csproj" />
|
<ProjectReference Include="..\linker.messenger.relay\linker.messenger.relay.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.sforward\linker.messenger.sforward.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.signin\linker.messenger.signin.csproj" />
|
<ProjectReference Include="..\linker.messenger.signin\linker.messenger.signin.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger\linker.messenger.csproj" />
|
<ProjectReference Include="..\linker.messenger\linker.messenger.csproj" />
|
||||||
<ProjectReference Include="..\linker.signin\linker.messenger.signin.csproj" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
using linker.libs.api;
|
using linker.libs;
|
||||||
|
using linker.libs.api;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
|
||||||
namespace linker.messenger.api
|
namespace linker.messenger.api
|
||||||
@@ -8,8 +9,10 @@ namespace linker.messenger.api
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public sealed partial class ApiServer : libs.api.ApiServer, IApiServer
|
public sealed partial class ApiServer : libs.api.ApiServer, IApiServer
|
||||||
{
|
{
|
||||||
public ApiServer()
|
private readonly IAccessStore accessStore;
|
||||||
|
public ApiServer(IAccessStore accessStore)
|
||||||
{
|
{
|
||||||
|
this.accessStore = accessStore;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -19,6 +22,8 @@ namespace linker.messenger.api
|
|||||||
{
|
{
|
||||||
Type voidType = typeof(void);
|
Type voidType = typeof(void);
|
||||||
|
|
||||||
|
LoggerHelper.Instance.Info($"add api {string.Join(",", list.Select(c => c.GetType().Name))}");
|
||||||
|
|
||||||
foreach (IApiController obj in list)
|
foreach (IApiController obj in list)
|
||||||
{
|
{
|
||||||
Type type = obj.GetType();
|
Type type = obj.GetType();
|
||||||
@@ -30,14 +35,14 @@ namespace linker.messenger.api
|
|||||||
{
|
{
|
||||||
bool istask = method.ReturnType.GetProperty("IsCompleted") != null && method.ReturnType.GetMethod("GetAwaiter") != null;
|
bool istask = method.ReturnType.GetProperty("IsCompleted") != null && method.ReturnType.GetMethod("GetAwaiter") != null;
|
||||||
bool isTaskResult = method.ReturnType.GetProperty("Result") != null;
|
bool isTaskResult = method.ReturnType.GetProperty("Result") != null;
|
||||||
/*
|
|
||||||
ClientApiAccessAttribute accessAttr = method.GetCustomAttribute<ClientApiAccessAttribute>();
|
AccessAttribute accessAttr = method.GetCustomAttribute<AccessAttribute>();
|
||||||
ulong access = 0;
|
ulong access = 0;
|
||||||
if (accessAttr != null)
|
if (accessAttr != null)
|
||||||
{
|
{
|
||||||
access = (ulong)accessAttr.Value;
|
access = (ulong)accessAttr.Value;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
plugins.TryAdd(key, new PluginPathCacheInfo
|
plugins.TryAdd(key, new PluginPathCacheInfo
|
||||||
{
|
{
|
||||||
IsVoid = method.ReturnType == voidType,
|
IsVoid = method.ReturnType == voidType,
|
||||||
@@ -54,8 +59,7 @@ namespace linker.messenger.api
|
|||||||
}
|
}
|
||||||
private bool HasAccess(ulong access)
|
private bool HasAccess(ulong access)
|
||||||
{
|
{
|
||||||
return true;
|
return accessStore.HasAccess((AccessValue)access);
|
||||||
//return accessTransfer.HasAccess((ClientApiAccess)access);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
namespace linker.messenger.access
|
namespace linker.messenger.api
|
||||||
{
|
{
|
||||||
[AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)]
|
[AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)]
|
||||||
public sealed class AccessAttribute : Attribute
|
public sealed class AccessAttribute : Attribute
|
@@ -14,17 +14,19 @@ namespace linker.messenger.api
|
|||||||
public static ServiceProvider UseApiClient(this ServiceProvider serviceProvider)
|
public static ServiceProvider UseApiClient(this ServiceProvider serviceProvider)
|
||||||
{
|
{
|
||||||
IApiStore apiStore = serviceProvider.GetService<IApiStore>();
|
IApiStore apiStore = serviceProvider.GetService<IApiStore>();
|
||||||
if (apiStore.Info.ApiPort > 0)
|
IAccessStore accessStore = serviceProvider.GetService<IAccessStore>();
|
||||||
|
if (apiStore.Info.ApiPort > 0 && accessStore.HasAccess(AccessValue.Api))
|
||||||
{
|
{
|
||||||
LoggerHelper.Instance.Info($"start client api server");
|
LoggerHelper.Instance.Info($"start client api");
|
||||||
IApiServer server = serviceProvider.GetService<IApiServer>();
|
IApiServer server = serviceProvider.GetService<IApiServer>();
|
||||||
server.Websocket(apiStore.Info.ApiPort, apiStore.Info.ApiPassword);
|
server.Websocket(apiStore.Info.ApiPort, apiStore.Info.ApiPassword);
|
||||||
LoggerHelper.Instance.Warning($"client api listen:{apiStore.Info.ApiPort}");
|
LoggerHelper.Instance.Warning($"client api listen:{apiStore.Info.ApiPort}");
|
||||||
LoggerHelper.Instance.Warning($"client api password:{apiStore.Info.ApiPassword}");
|
LoggerHelper.Instance.Warning($"client api password:{apiStore.Info.ApiPassword}");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (apiStore.Info.WebPort > 0)
|
if (apiStore.Info.WebPort > 0 && accessStore.HasAccess(AccessValue.Web))
|
||||||
{
|
{
|
||||||
|
LoggerHelper.Instance.Info($"start client web");
|
||||||
IWebServer webServer = serviceProvider.GetService<IWebServer>();
|
IWebServer webServer = serviceProvider.GetService<IWebServer>();
|
||||||
webServer.Start(apiStore.Info.WebPort, apiStore.Info.WebRoot);
|
webServer.Start(apiStore.Info.WebPort, apiStore.Info.WebRoot);
|
||||||
LoggerHelper.Instance.Warning($"client web listen:{apiStore.Info.WebPort}");
|
LoggerHelper.Instance.Warning($"client web listen:{apiStore.Info.WebPort}");
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
namespace linker.messenger.access
|
namespace linker.messenger.api
|
||||||
{
|
{
|
||||||
public interface IAccessStore
|
public interface IAccessStore
|
||||||
{
|
{
|
@@ -27,6 +27,7 @@ namespace linker.messenger.decenter
|
|||||||
|
|
||||||
public void AddDecenters(List<IDecenter> list)
|
public void AddDecenters(List<IDecenter> list)
|
||||||
{
|
{
|
||||||
|
LoggerHelper.Instance.Info($"add decenter {string.Join(",", list.Select(c => c.GetType().Name))}");
|
||||||
syncs = syncs.Concat(list).Distinct().ToList();
|
syncs = syncs.Concat(list).Distinct().ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -33,7 +33,6 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\linker.libs\linker.libs.csproj" />
|
<ProjectReference Include="..\linker.libs\linker.libs.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.signin\linker.messenger.signin.csproj" />
|
<ProjectReference Include="..\linker.messenger.signin\linker.messenger.signin.csproj" />
|
||||||
<ProjectReference Include="..\linker.signin\linker.messenger.signin.csproj" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
145
linker.messenger.entry/LinkerMessengerEntry.cs
Normal file
145
linker.messenger.entry/LinkerMessengerEntry.cs
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
using linker.messenger.api;
|
||||||
|
using linker.messenger.decenter;
|
||||||
|
using linker.messenger.exroute;
|
||||||
|
using linker.messenger.flow;
|
||||||
|
using linker.messenger.forward;
|
||||||
|
using linker.messenger.listen;
|
||||||
|
using linker.messenger.logger;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using linker.messenger.pcp;
|
||||||
|
using linker.messenger.relay;
|
||||||
|
using linker.messenger.sforward;
|
||||||
|
using linker.messenger.signin;
|
||||||
|
using linker.messenger.socks5;
|
||||||
|
using linker.messenger.sync;
|
||||||
|
using linker.messenger.tunnel;
|
||||||
|
using linker.messenger.tuntap;
|
||||||
|
using linker.messenger.updater;
|
||||||
|
using linker.messenger.store.file;
|
||||||
|
using linker.messenger.serializer.memorypack;
|
||||||
|
using linker.libs;
|
||||||
|
|
||||||
|
namespace linker.messenger.entry
|
||||||
|
{
|
||||||
|
public static class LinkerMessengerEntry
|
||||||
|
{
|
||||||
|
private static ServiceCollection serviceCollection;
|
||||||
|
private static ServiceProvider serviceProvider;
|
||||||
|
private static OperatingManager inited = new OperatingManager();
|
||||||
|
private static OperatingManager builded = new OperatingManager();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 开始初始化
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static void Initialize()
|
||||||
|
{
|
||||||
|
if (inited.StartOperation() == false) return;
|
||||||
|
|
||||||
|
serviceCollection = new ServiceCollection();
|
||||||
|
|
||||||
|
serviceCollection
|
||||||
|
//日志
|
||||||
|
.AddLoggerClient()
|
||||||
|
//api接口和web
|
||||||
|
.AddApiClient()
|
||||||
|
//路由排除
|
||||||
|
.AddExRoute()
|
||||||
|
|
||||||
|
//服务器监听
|
||||||
|
.AddListen()
|
||||||
|
|
||||||
|
//权限
|
||||||
|
.AddAccessClient().AddAccessServer()
|
||||||
|
//自定义验证
|
||||||
|
.AddActionClient().AddActionServer()
|
||||||
|
//数据同步
|
||||||
|
.AddDecenterClient().AddDecenterServer()
|
||||||
|
//端口转发
|
||||||
|
.AddForwardClient().AddForwardServer()
|
||||||
|
//pcp
|
||||||
|
.AddPcpClient().AddPcpServer()
|
||||||
|
//中继
|
||||||
|
.AddRelayClient().AddRelayServer()
|
||||||
|
//服务器穿透
|
||||||
|
.AddSForwardClient().AddSForwardServer()
|
||||||
|
//登录
|
||||||
|
.AddSignInClient().AddSignInServer()
|
||||||
|
//socks5
|
||||||
|
.AddSocks5Client().AddSocks5Server()
|
||||||
|
//同步
|
||||||
|
.AddSyncClient().AddSyncServer()
|
||||||
|
//打洞
|
||||||
|
.AddTunnelClient().AddTunnelServer()
|
||||||
|
//虚拟网卡
|
||||||
|
.AddTuntapClient().AddTuntapServer()
|
||||||
|
//更新
|
||||||
|
.AddUpdaterClient().AddUpdaterServer()
|
||||||
|
//流量统计
|
||||||
|
.AddFlowClient().AddFlowServer()
|
||||||
|
|
||||||
|
//信标
|
||||||
|
.AddMessenger()
|
||||||
|
//持久化,文件
|
||||||
|
.AddStoreFile()
|
||||||
|
//序列化 MemoryPack
|
||||||
|
.AddSerializerMemoryPack();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 注入
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TService"></typeparam>
|
||||||
|
public static void AddService<TService>() where TService : class
|
||||||
|
{
|
||||||
|
serviceCollection.AddSingleton<TService>();
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 注入
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TService"></typeparam>
|
||||||
|
/// <typeparam name="TImplementation"></typeparam>
|
||||||
|
public static void AddService<TService, TImplementation>() where TService : class where TImplementation : class, TService
|
||||||
|
{
|
||||||
|
serviceCollection.AddSingleton<TService, TImplementation>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 运行起来
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static void Build()
|
||||||
|
{
|
||||||
|
if (builded.StartOperation() == false) return;
|
||||||
|
|
||||||
|
serviceProvider = serviceCollection.BuildServiceProvider();
|
||||||
|
serviceProvider.UseMessenger().UseStoreFile().UseSerializerMemoryPack();
|
||||||
|
|
||||||
|
ICommonStore commonStore = serviceProvider.GetService<ICommonStore>();
|
||||||
|
if ((commonStore.Modes & CommonModes.Server) == CommonModes.Server)
|
||||||
|
{
|
||||||
|
serviceProvider.UseAccessServer().UseActionServer().UseDecenterServer().UseForwardServer().UsePcpServer().UseRelayServer().UseSForwardServer().UseSignInServer().UseSocks5Server().UseSyncServer().UseTunnelServer().UseTuntapServer().UseUpdaterServer().UseFlowServer();
|
||||||
|
|
||||||
|
serviceProvider.UseListen();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((commonStore.Modes & CommonModes.Client) == CommonModes.Client)
|
||||||
|
{
|
||||||
|
serviceProvider.UseLoggerClient().UseApiClient().UseExRoute().UseAccessClient().UseActionClient().UseDecenterClient().UseForwardClient().UsePcpClient().UseRelayClient().UseSForwardClient().UseSocks5Client().UseSyncClient().UseTunnelClient().UseTuntapClient().UseUpdaterClient().UseFlowClient();
|
||||||
|
|
||||||
|
serviceProvider.UseSignInClient();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取服务
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TService"></typeparam>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static TService GetService<TService>() where TService : class
|
||||||
|
{
|
||||||
|
return serviceProvider.GetService<TService>();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@@ -30,4 +30,28 @@
|
|||||||
<DebugSymbols>false</DebugSymbols>
|
<DebugSymbols>false</DebugSymbols>
|
||||||
<Optimize>True</Optimize>
|
<Optimize>True</Optimize>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\linker.messenger.access\linker.messenger.access.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.action\linker.messenger.action.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.api\linker.messenger.api.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.channel\linker.messenger.channel.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.decenter\linker.messenger.decenter.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.exroute\linker.messenger.exroute.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.flow\linker.messenger.flow.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.forward\linker.messenger.forward.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.listen\linker.messenger.listen.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.logger\linker.messenger.logger.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.pcp\linker.messenger.pcp.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.relay\linker.messenger.relay.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.serializer.memorypack\linker.messenger.serializer.memorypack.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.sforward\linker.messenger.sforward.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.signin\linker.messenger.signin.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.socks5\linker.messenger.socks5.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.store.file\linker.messenger.store.file.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.sync\linker.messenger.sync.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.tunnel\linker.messenger.tunnel.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.tuntap\linker.messenger.tuntap.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.updater\linker.messenger.updater.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger\linker.messenger.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
@@ -1,540 +0,0 @@
|
|||||||
using linker.libs;
|
|
||||||
using linker.libs.extends;
|
|
||||||
using linker.messenger.relay.client;
|
|
||||||
using linker.messenger.relay.client.transport;
|
|
||||||
using linker.messenger.relay.messenger;
|
|
||||||
using linker.messenger.relay.server;
|
|
||||||
using linker.messenger.relay.server.caching;
|
|
||||||
using linker.messenger.relay.server.validator;
|
|
||||||
using linker.messenger.signin;
|
|
||||||
using linker.messenger.signin.args;
|
|
||||||
using linker.messenger.tunnel;
|
|
||||||
using linker.plugins.tunnel;
|
|
||||||
using linker.tunnel;
|
|
||||||
using linker.tunnel.connection;
|
|
||||||
using linker.tunnel.transport;
|
|
||||||
using System.Net;
|
|
||||||
using System.Net.Sockets;
|
|
||||||
using System.Security.Cryptography.X509Certificates;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace linker.messenger.example
|
|
||||||
{
|
|
||||||
internal class Program
|
|
||||||
{
|
|
||||||
public static PublicConfigInfo publicConfigInfo = new PublicConfigInfo
|
|
||||||
{
|
|
||||||
Certificate = new X509Certificate2("./snltty.pfx", "oeq9tw1o"),
|
|
||||||
TunnelTransports = new List<TunnelTransportItemInfo>
|
|
||||||
{
|
|
||||||
new TunnelTransportItemInfo{ BufferSize=3, Disabled=false, DisableReverse=false, DisableSSL=false, Name="udp", Order=1, ProtocolType= TunnelProtocolType.Udp.ToString(), Reverse=true, SSL=true },
|
|
||||||
// new TunnelTransportItemInfo{ BufferSize=3, Disabled=false, DisableReverse=false, DisableSSL=false, Name="UdpPortMap", Order=2, ProtocolType= TunnelProtocolType.Udp.ToString(), Reverse=true, SSL=true },
|
|
||||||
new TunnelTransportItemInfo{ BufferSize=3, Disabled=false, DisableReverse=false, DisableSSL=false, Name="TcpP2PNAT", Order=3, ProtocolType= TunnelProtocolType.Tcp.ToString(), Reverse=true, SSL=true },
|
|
||||||
// new TunnelTransportItemInfo{ BufferSize=3, Disabled=false, DisableReverse=false, DisableSSL=false, Name="TransportUdpPortMap", Order=4, ProtocolType= TunnelProtocolType.Tcp.ToString(), Reverse=true, SSL=true },
|
|
||||||
// new TunnelTransportItemInfo{ BufferSize=3, Disabled=false, DisableReverse=false, DisableSSL=false, Name="TcpPortMap", Order=5, ProtocolType= TunnelProtocolType.Tcp.ToString(), Reverse=true, SSL=true },
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static async Task Main(string[] args)
|
|
||||||
{
|
|
||||||
LoggerConsole();
|
|
||||||
|
|
||||||
Console.WriteLine($"输入server 或者 client:");
|
|
||||||
string type = Console.ReadLine();
|
|
||||||
|
|
||||||
if (type == "server")
|
|
||||||
{
|
|
||||||
Server();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
await Client();
|
|
||||||
}
|
|
||||||
|
|
||||||
Console.ReadLine();
|
|
||||||
}
|
|
||||||
|
|
||||||
public sealed class TunnelConnectionReceiveCallback : ITunnelConnectionReceiveCallback
|
|
||||||
{
|
|
||||||
public async Task Closed(ITunnelConnection connection, object state)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"{(connection.Type == TunnelType.P2P ? "打洞" : "中继")}关闭,收到 {connection.IPEndPoint} {connection.RemoteMachineId} 的关闭");
|
|
||||||
await Task.CompletedTask;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task Receive(ITunnelConnection connection, ReadOnlyMemory<byte> data, object state)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"{(connection.Type == TunnelType.P2P ? "打洞" : "中继")}数据,收到 {connection.IPEndPoint} {connection.RemoteMachineId} 的数据:{data.Span.GetString()}");
|
|
||||||
await Task.CompletedTask;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private static async Task Client()
|
|
||||||
{
|
|
||||||
//序列化
|
|
||||||
ISerializer serializer = new Serializer();
|
|
||||||
|
|
||||||
//信标发送和接受
|
|
||||||
IMessengerSender messengerSender = new MessengerSender();
|
|
||||||
IMessengerResolver messengerResolver = new MessengerResolver(messengerSender);
|
|
||||||
|
|
||||||
//打洞相关
|
|
||||||
TunnelClientExcludeIPTransfer tunnelExcludeIPTransfer = new TunnelClientExcludeIPTransfer();
|
|
||||||
//tunnelExcludeIPTransfer.LoadTunnelExcludeIPs(new List<ITunnelExcludeIP>());
|
|
||||||
TunnelClientMessengerAdapter tunnelMessengerAdapter = new TunnelClientMessengerAdapter(messengerSender, tunnelExcludeIPTransfer, serializer, new TunnelMessengerAdapterStore());
|
|
||||||
TunnelTransfer tunnelTransfer = new TunnelTransfer(tunnelMessengerAdapter);
|
|
||||||
tunnelTransfer.SetConnectedCallback("default", (connection) =>
|
|
||||||
{
|
|
||||||
Console.WriteLine($"打洞成功,收到 {connection.IPEndPoint} {connection.RemoteMachineId} 的连接");
|
|
||||||
connection.BeginReceive(new TunnelConnectionReceiveCallback(), null);
|
|
||||||
});
|
|
||||||
TunnelClientMessenger tunnelClientMessenger = new TunnelClientMessenger(tunnelTransfer, messengerSender, serializer);
|
|
||||||
|
|
||||||
|
|
||||||
//中继相关
|
|
||||||
IRelayClientStore relayClientStore = new RelayClientStore();
|
|
||||||
RelayClientTransfer relayClientTransfer = new RelayClientTransfer(messengerSender, serializer, relayClientStore);
|
|
||||||
relayClientTransfer.SetConnectedCallback("default", (connection) =>
|
|
||||||
{
|
|
||||||
Console.WriteLine($"中继成功,收到 {connection.IPEndPoint} {connection.RemoteMachineId} 的连接");
|
|
||||||
connection.BeginReceive(new TunnelConnectionReceiveCallback(), null);
|
|
||||||
});
|
|
||||||
RelayClientMessenger relayClientMessenger = new RelayClientMessenger(relayClientTransfer, serializer);
|
|
||||||
|
|
||||||
//加载这些信标处理器
|
|
||||||
messengerResolver.AddMessenger(new List<IMessenger>
|
|
||||||
{
|
|
||||||
tunnelClientMessenger,
|
|
||||||
relayClientMessenger
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
//加载登录参数
|
|
||||||
SignInArgsTransfer signInArgsTransfer = new SignInArgsTransfer();
|
|
||||||
signInArgsTransfer.AddArgs(new List<ISignInArgs> {
|
|
||||||
new MySignInArgs()
|
|
||||||
});
|
|
||||||
Dictionary<string, string> argsDic = new Dictionary<string, string>();
|
|
||||||
await signInArgsTransfer.Invoke(string.Empty, argsDic);
|
|
||||||
|
|
||||||
Console.WriteLine($"输入服务端ip端口:");
|
|
||||||
publicConfigInfo.Host = Console.ReadLine();
|
|
||||||
|
|
||||||
Console.WriteLine($"开始连接服务器");
|
|
||||||
IPEndPoint server = NetworkHelper.GetEndPoint(publicConfigInfo.Host, 1802);
|
|
||||||
Socket socket = new Socket(server.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
|
|
||||||
socket.KeepAlive();
|
|
||||||
await socket.ConnectAsync(server).WaitAsync(TimeSpan.FromMilliseconds(5000)).ConfigureAwait(false);
|
|
||||||
publicConfigInfo.SignConnection = await messengerResolver.BeginReceiveClient(socket, true, (byte)ResolverType.Messenger).ConfigureAwait(false);
|
|
||||||
|
|
||||||
Console.WriteLine($"开始登录");
|
|
||||||
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
|
|
||||||
{
|
|
||||||
Connection = publicConfigInfo.SignConnection,
|
|
||||||
MessengerId = (ushort)SignInMessengerIds.SignIn_V_1_3_1,
|
|
||||||
Timeout = 2000,
|
|
||||||
Payload = serializer.Serialize(new SignInfo
|
|
||||||
{
|
|
||||||
MachineName = Dns.GetHostName(),
|
|
||||||
MachineId = string.Empty,
|
|
||||||
Version = VersionHelper.version,
|
|
||||||
Args = argsDic,
|
|
||||||
GroupId = "default"
|
|
||||||
})
|
|
||||||
}).ConfigureAwait(false);
|
|
||||||
if (resp.Code != MessageResponeCodes.OK)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"登录失败 : {resp.Code}");
|
|
||||||
publicConfigInfo.SignConnection?.Disponse(6);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SignInResponseInfo signResp = serializer.Deserialize<string>(resp.Data.Span).DeJson<SignInResponseInfo>();
|
|
||||||
if (signResp.Status == false)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"登录失败 : {signResp.Msg}");
|
|
||||||
publicConfigInfo.SignConnection?.Disponse(6);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
publicConfigInfo.SignConnection.Id = signResp.MachineId;
|
|
||||||
Console.WriteLine($"你的id:{signResp.MachineId}");
|
|
||||||
tunnelTransfer.Refresh();
|
|
||||||
|
|
||||||
|
|
||||||
//获取在线列表,其它功能,参照 SignInServerMessenger 里的方法serializer.Deserialize 什么,就传什么
|
|
||||||
resp = await messengerSender.SendReply(new MessageRequestWrap
|
|
||||||
{
|
|
||||||
Connection = publicConfigInfo.SignConnection,
|
|
||||||
MessengerId = (ushort)SignInMessengerIds.List,
|
|
||||||
Timeout = 2000,
|
|
||||||
Payload = serializer.Serialize(new SignInListRequestInfo
|
|
||||||
{
|
|
||||||
Asc = true,
|
|
||||||
Page = 1,
|
|
||||||
Size = 10
|
|
||||||
})
|
|
||||||
}).ConfigureAwait(false);
|
|
||||||
if (resp.Code == MessageResponeCodes.OK)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"当前在线 : {serializer.Deserialize<SignInListResponseInfo>(resp.Data.Span).List.ToJson()}");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Console.WriteLine($"去连接吗?,1打洞,2中继:");
|
|
||||||
string connect = Console.ReadLine();
|
|
||||||
|
|
||||||
Console.WriteLine($"输入对方id:");
|
|
||||||
string id = Console.ReadLine();
|
|
||||||
|
|
||||||
ITunnelConnection tunnelConnection = null;
|
|
||||||
switch (connect)
|
|
||||||
{
|
|
||||||
case "1":
|
|
||||||
{
|
|
||||||
Console.WriteLine($"正在打洞.......");
|
|
||||||
tunnelConnection = await tunnelTransfer.ConnectAsync(id, "default", TunnelProtocolType.None);
|
|
||||||
Console.WriteLine($"打洞==》{(tunnelConnection == null ? "失败" : "成功")}");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case "2":
|
|
||||||
{
|
|
||||||
Console.WriteLine($"正在中继.......");
|
|
||||||
tunnelConnection = await relayClientTransfer.ConnectAsync(publicConfigInfo.SignConnection.Id, id, "default");
|
|
||||||
Console.WriteLine($"中继==》{(tunnelConnection == null ? "失败" : "成功")}");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (tunnelConnection != null)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < 10; i++)
|
|
||||||
{
|
|
||||||
string msg = $"hello {i}";
|
|
||||||
Console.WriteLine($"发送:{msg}");
|
|
||||||
var msgBytes = msg.ToBytes();
|
|
||||||
|
|
||||||
//首部4字节存长度,剩下的才是真实数据
|
|
||||||
byte[] bytes = new byte[4 + msgBytes.Length];
|
|
||||||
msgBytes.Length.ToBytes(bytes);
|
|
||||||
msgBytes.AsMemory().CopyTo(bytes.AsMemory(4));
|
|
||||||
|
|
||||||
await tunnelConnection.SendAsync(bytes);
|
|
||||||
await Task.Delay(1000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void Server()
|
|
||||||
{
|
|
||||||
Console.WriteLine($"输入服务端端口:");
|
|
||||||
publicConfigInfo.Port = int.Parse(Console.ReadLine());
|
|
||||||
|
|
||||||
//序列化
|
|
||||||
ISerializer serializer = new Serializer();
|
|
||||||
|
|
||||||
//信标发送和接受
|
|
||||||
IMessengerSender messengerSender = new MessengerSender();
|
|
||||||
IMessengerResolver messengerResolver = new MessengerResolver(messengerSender);
|
|
||||||
messengerResolver.Initialize(publicConfigInfo.Certificate);
|
|
||||||
MessengerResolverResolver messengerResolverResolver = new MessengerResolverResolver(messengerResolver);
|
|
||||||
|
|
||||||
//登录相关
|
|
||||||
SignInArgsTransfer signInArgsTransfer = new SignInArgsTransfer();
|
|
||||||
signInArgsTransfer.AddArgs(new List<ISignInArgs> {
|
|
||||||
new MySignInArgs()
|
|
||||||
});
|
|
||||||
ISignInServerStore signInStore = new SignInStore();
|
|
||||||
SignInServerCaching signCaching = new SignInServerCaching(signInStore, signInArgsTransfer);
|
|
||||||
SignInServerMessenger signInServerMessenger = new SignInServerMessenger(messengerSender, signCaching, serializer);
|
|
||||||
|
|
||||||
//打洞相关
|
|
||||||
TunnelServerExternalResolver tunnelExternalResolver = new TunnelServerExternalResolver();
|
|
||||||
TunnelServerMessenger tunnelServerMessenger = new TunnelServerMessenger(messengerSender, signCaching, serializer);
|
|
||||||
|
|
||||||
//中继相关
|
|
||||||
IRelayServerMasterStore relayServerMasterStore = new RelayServerMasterStore();
|
|
||||||
IRelayServerNodeStore relayServerNodeStore = new RelayServerNodeStore();
|
|
||||||
RelayServerNodeTransfer relayServerNodeTransfer = new RelayServerNodeTransfer(serializer, relayServerNodeStore, relayServerMasterStore);
|
|
||||||
RelayServerResolver relayServerResolver = new RelayServerResolver(relayServerNodeTransfer, serializer);
|
|
||||||
IRelayServerCaching relayServerCaching = new RelayServerCachingMemory(serializer);
|
|
||||||
RelayServerMasterTransfer relayServerMasterTransfer = new RelayServerMasterTransfer(relayServerCaching, serializer, relayServerMasterStore);
|
|
||||||
RelayServerReportResolver relayServerReportResolver = new RelayServerReportResolver(relayServerMasterTransfer);
|
|
||||||
//自定义中继验证
|
|
||||||
RelayServerValidatorTransfer relayServerValidatorTransfer = new RelayServerValidatorTransfer();
|
|
||||||
//relayServerValidatorTransfer.LoadValidators(new List<IRelayServerValidator> { });
|
|
||||||
RelayServerMessenger relayServerMessenger = new RelayServerMessenger(messengerSender, signCaching, serializer, relayServerMasterTransfer, relayServerValidatorTransfer);
|
|
||||||
|
|
||||||
//加载信标处理器
|
|
||||||
messengerResolver.AddMessenger(new List<IMessenger>
|
|
||||||
{
|
|
||||||
signInServerMessenger,
|
|
||||||
tunnelServerMessenger,
|
|
||||||
relayServerMessenger
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
//加载消息分发器
|
|
||||||
ResolverTransfer resolverTransfer = new ResolverTransfer();
|
|
||||||
resolverTransfer.AddResolvers(new List<IResolver> {
|
|
||||||
messengerResolverResolver,
|
|
||||||
tunnelExternalResolver,
|
|
||||||
relayServerReportResolver,
|
|
||||||
relayServerResolver
|
|
||||||
});
|
|
||||||
|
|
||||||
//TCP
|
|
||||||
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
|
||||||
socket.Bind(new IPEndPoint(IPAddress.Any, publicConfigInfo.Port));
|
|
||||||
socket.Listen(int.MaxValue);
|
|
||||||
TimerHelper.Async(async () =>
|
|
||||||
{
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
var client = await socket.AcceptAsync();
|
|
||||||
_ = resolverTransfer.BeginReceive(client);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
//UDP
|
|
||||||
Socket socketUdp = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
|
|
||||||
socketUdp.Bind(new IPEndPoint(IPAddress.Any, publicConfigInfo.Port));
|
|
||||||
socketUdp.WindowsUdpBug();
|
|
||||||
TimerHelper.Async(async () =>
|
|
||||||
{
|
|
||||||
IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, IPEndPoint.MinPort);
|
|
||||||
byte[] buffer = new byte[1 * 1024 * 1024];
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
SocketReceiveFromResult result = await socketUdp.ReceiveFromAsync(buffer, SocketFlags.None, endPoint).ConfigureAwait(false);
|
|
||||||
IPEndPoint ep = result.RemoteEndPoint as IPEndPoint;
|
|
||||||
_ = resolverTransfer.BeginReceive(socketUdp, ep, buffer.AsMemory(0, result.ReceivedBytes));
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
LoggerHelper.Instance.Error(ex);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void LoggerConsole()
|
|
||||||
{
|
|
||||||
LoggerHelper.Instance.OnLogger += (model) =>
|
|
||||||
{
|
|
||||||
ConsoleColor currentForeColor = Console.ForegroundColor;
|
|
||||||
switch (model.Type)
|
|
||||||
{
|
|
||||||
case LoggerTypes.DEBUG:
|
|
||||||
Console.ForegroundColor = ConsoleColor.Blue;
|
|
||||||
break;
|
|
||||||
case LoggerTypes.INFO:
|
|
||||||
Console.ForegroundColor = ConsoleColor.White;
|
|
||||||
break;
|
|
||||||
case LoggerTypes.WARNING:
|
|
||||||
Console.ForegroundColor = ConsoleColor.Yellow;
|
|
||||||
break;
|
|
||||||
case LoggerTypes.ERROR:
|
|
||||||
Console.ForegroundColor = ConsoleColor.Red;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
string line = $"[{model.Type,-7}][{model.Time:yyyy-MM-dd HH:mm:ss}]:{model.Content}";
|
|
||||||
Console.WriteLine(line);
|
|
||||||
Console.ForegroundColor = currentForeColor;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public sealed class MyRelayServerValidator : IRelayServerValidator
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 验证,服务端会调用
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="relayInfo">中继参数</param>
|
|
||||||
/// <param name="fromMachine">来源客户端</param>
|
|
||||||
/// <param name="toMachine">目标客户端</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public async Task<string> Validate(RelayInfo relayInfo, SignCacheInfo fromMachine, SignCacheInfo toMachine)
|
|
||||||
{
|
|
||||||
//返回空字符串,表示成功,不空为错误信息则登录失败
|
|
||||||
return await Task.FromResult(string.Empty);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public sealed class MySignInArgs : ISignInArgs
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 客户端调用
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="host"></param>
|
|
||||||
/// <param name="args"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public async Task<string> Invoke(string host, Dictionary<string, string> args)
|
|
||||||
{
|
|
||||||
//在这里加入你喜欢的数据
|
|
||||||
|
|
||||||
//返回空字符串,表示成功,不空为错误信息
|
|
||||||
return await Task.FromResult(string.Empty);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 服务端调用
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="signInfo">本次登录的信息</param>
|
|
||||||
/// <param name="cache">如果以前登录过就有信息,否则MachineId为空</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
/// <exception cref="NotImplementedException"></exception>
|
|
||||||
public async Task<string> Validate(SignInfo signInfo, SignCacheInfo cache)
|
|
||||||
{
|
|
||||||
//在这里进行你的验证
|
|
||||||
|
|
||||||
//返回空字符串,表示成功,不空为错误信息则登录失败
|
|
||||||
return await Task.FromResult(string.Empty);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public sealed class PublicConfigInfo
|
|
||||||
{
|
|
||||||
public IConnection SignConnection { get; set; }
|
|
||||||
public X509Certificate2 Certificate { get; set; }
|
|
||||||
public List<TunnelTransportItemInfo> TunnelTransports { get; set; }
|
|
||||||
|
|
||||||
public string Host { get; set; }
|
|
||||||
public int Port { get; set; } = 12345;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 中继的客户端存储库
|
|
||||||
/// </summary>
|
|
||||||
public sealed class RelayClientStore : IRelayClientStore
|
|
||||||
{
|
|
||||||
public X509Certificate2 Certificate => Program.publicConfigInfo.Certificate;
|
|
||||||
|
|
||||||
public IConnection SigninConnection => Program.publicConfigInfo.SignConnection;
|
|
||||||
|
|
||||||
public string SecretKey => string.Empty;
|
|
||||||
|
|
||||||
public bool Disabled => false;
|
|
||||||
|
|
||||||
public bool SSL => true;
|
|
||||||
|
|
||||||
public RelayClientType RelayType => RelayClientType.Linker;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 中继节点信息存储库
|
|
||||||
/// </summary>
|
|
||||||
public sealed class RelayServerNodeStore : IRelayServerNodeStore
|
|
||||||
{
|
|
||||||
public int ServicePort => Program.publicConfigInfo.Port;
|
|
||||||
|
|
||||||
public RelayServerNodeInfo Node => new RelayServerNodeInfo { };
|
|
||||||
|
|
||||||
public void Confirm()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetMaxGbTotalLastBytes(ulong value)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetMaxGbTotalMonth(int month)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// 中继主机信息存储库
|
|
||||||
/// </summary>
|
|
||||||
public sealed class RelayServerMasterStore : IRelayServerMasterStore
|
|
||||||
{
|
|
||||||
public RelayServerMasterInfo Master => new RelayServerMasterInfo { SecretKey = "snltty" };
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 自定义打洞的存储库
|
|
||||||
/// </summary>
|
|
||||||
public sealed class TunnelMessengerAdapterStore : ITunnelClientStore
|
|
||||||
{
|
|
||||||
public IConnection SignConnection => Program.publicConfigInfo.SignConnection;
|
|
||||||
public X509Certificate2 Certificate => Program.publicConfigInfo.Certificate;
|
|
||||||
|
|
||||||
public int RouteLevelPlus => 0;
|
|
||||||
public int PortMapPrivate => 0;
|
|
||||||
public int PortMapPublic => 0;
|
|
||||||
|
|
||||||
public TunnelMessengerAdapterStore()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<List<TunnelTransportItemInfo>> GetTunnelTransports()
|
|
||||||
{
|
|
||||||
return await Task.FromResult(Program.publicConfigInfo.TunnelTransports);
|
|
||||||
}
|
|
||||||
public async Task<bool> SetTunnelTransports(List<TunnelTransportItemInfo> list)
|
|
||||||
{
|
|
||||||
return await Task.FromResult(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 自定义序列化
|
|
||||||
/// </summary>
|
|
||||||
public sealed class Serializer : ISerializer
|
|
||||||
{
|
|
||||||
public T Deserialize<T>(ReadOnlySpan<byte> buffer)
|
|
||||||
{
|
|
||||||
return buffer.GetString().DeJson<T>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public byte[] Serialize<T>(T value)
|
|
||||||
{
|
|
||||||
return value.ToJson().ToBytes();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// 自定义登录持久化存储
|
|
||||||
/// </summary>
|
|
||||||
public sealed class SignInStore : ISignInServerStore
|
|
||||||
{
|
|
||||||
public void Confirm()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Delete(string id)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public SignCacheInfo Find(string id)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IEnumerable<SignCacheInfo> Find()
|
|
||||||
{
|
|
||||||
return new List<SignCacheInfo>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public string Insert(SignCacheInfo value)
|
|
||||||
{
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
public string NewId()
|
|
||||||
{
|
|
||||||
return Guid.NewGuid().ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Update(SignCacheInfo value)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@@ -1,27 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
|
||||||
<Nullable>enable</Nullable>
|
|
||||||
<EnablePreviewFeatures>true</EnablePreviewFeatures>
|
|
||||||
<Version>1.6.4</Version>
|
|
||||||
<AssemblyVersion>1.6.4</AssemblyVersion>
|
|
||||||
<FileVersion>1.6.4</FileVersion>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\linker.messenger.relay\linker.messenger.relay.csproj" />
|
|
||||||
<ProjectReference Include="..\linker.messenger.tunnel\linker.messenger.tunnel.csproj" />
|
|
||||||
<ProjectReference Include="..\linker.messenger\linker.messenger.csproj" />
|
|
||||||
<ProjectReference Include="..\linker.signin\linker.messenger.signin.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<None Update="snltty.pfx">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</None>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
Binary file not shown.
@@ -1,4 +1,5 @@
|
|||||||
using System.Net;
|
using linker.libs;
|
||||||
|
using System.Net;
|
||||||
|
|
||||||
namespace linker.messenger.exroute
|
namespace linker.messenger.exroute
|
||||||
{
|
{
|
||||||
@@ -12,6 +13,7 @@ namespace linker.messenger.exroute
|
|||||||
|
|
||||||
public void AddExRoutes(List<IExRoute> list)
|
public void AddExRoutes(List<IExRoute> list)
|
||||||
{
|
{
|
||||||
|
LoggerHelper.Instance.Info($"add exroute {string.Join(",", list.Select(c => c.GetType().Name))}");
|
||||||
excludes = excludes.Concat(list).Distinct().ToList();
|
excludes = excludes.Concat(list).Distinct().ToList();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
78
linker.messenger.flow/Entry.cs
Normal file
78
linker.messenger.flow/Entry.cs
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
using linker.messenger.api;
|
||||||
|
using linker.messenger.flow.messenger;
|
||||||
|
using linker.messenger.relay.server;
|
||||||
|
using linker.messenger.tunnel;
|
||||||
|
using linker.plugins.sforward.proxy;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
namespace linker.messenger.flow
|
||||||
|
{
|
||||||
|
public static class Entry
|
||||||
|
{
|
||||||
|
public static ServiceCollection AddFlowClient(this ServiceCollection serviceCollection)
|
||||||
|
{
|
||||||
|
serviceCollection.AddSingleton<FlowApiController>();
|
||||||
|
serviceCollection.AddSingleton<FlowTransfer>();
|
||||||
|
|
||||||
|
serviceCollection.AddSingleton<MessengerFlow>();
|
||||||
|
serviceCollection.AddSingleton<IMessengerResolver, MessengerResolverFlow>();
|
||||||
|
serviceCollection.AddSingleton<IMessengerSender, MessengerSenderFlow>();
|
||||||
|
|
||||||
|
return serviceCollection;
|
||||||
|
}
|
||||||
|
public static ServiceProvider UseFlowClient(this ServiceProvider serviceProvider)
|
||||||
|
{
|
||||||
|
IApiServer apiServer = serviceProvider.GetService<IApiServer>();
|
||||||
|
apiServer.AddPlugins(new List<libs.api.IApiController> { serviceProvider.GetService<FlowApiController>() });
|
||||||
|
|
||||||
|
FlowTransfer flowTransfer = serviceProvider.GetService<FlowTransfer>();
|
||||||
|
flowTransfer.AddFlows(new List<IFlow> { serviceProvider.GetService<MessengerFlow>() });
|
||||||
|
|
||||||
|
return serviceProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static ServiceCollection AddFlowServer(this ServiceCollection serviceCollection)
|
||||||
|
{
|
||||||
|
serviceCollection.AddSingleton<FlowMessenger>();
|
||||||
|
serviceCollection.AddSingleton<FlowTransfer>();
|
||||||
|
serviceCollection.AddSingleton<FlowResolver>();
|
||||||
|
|
||||||
|
serviceCollection.AddSingleton<MessengerFlow>();
|
||||||
|
serviceCollection.AddSingleton<IMessengerResolver, MessengerResolverFlow>();
|
||||||
|
serviceCollection.AddSingleton<IMessengerSender, MessengerSenderFlow>();
|
||||||
|
|
||||||
|
serviceCollection.AddSingleton<RelayFlow>();
|
||||||
|
serviceCollection.AddSingleton<RelayServerResolver, RelayResolverFlow>();
|
||||||
|
serviceCollection.AddSingleton<RelayReportFlow>();
|
||||||
|
serviceCollection.AddSingleton<RelayServerReportResolver, RelayReportResolverFlow>();
|
||||||
|
|
||||||
|
serviceCollection.AddSingleton<ExternalFlow>();
|
||||||
|
serviceCollection.AddSingleton<TunnelServerExternalResolver, ExternalResolverFlow>();
|
||||||
|
|
||||||
|
serviceCollection.AddSingleton<SForwardFlow>();
|
||||||
|
serviceCollection.AddSingleton<SForwardProxy, SForwardProxyFlow>();
|
||||||
|
return serviceCollection;
|
||||||
|
}
|
||||||
|
public static ServiceProvider UseFlowServer(this ServiceProvider serviceProvider)
|
||||||
|
{
|
||||||
|
|
||||||
|
FlowTransfer flowTransfer = serviceProvider.GetService<FlowTransfer>();
|
||||||
|
flowTransfer.AddFlows(new List<IFlow> {
|
||||||
|
serviceProvider.GetService<MessengerFlow>(),
|
||||||
|
serviceProvider.GetService<RelayFlow>(),
|
||||||
|
serviceProvider.GetService<RelayReportFlow>(),
|
||||||
|
serviceProvider.GetService<ExternalFlow>(),
|
||||||
|
serviceProvider.GetService<SForwardFlow>(),
|
||||||
|
});
|
||||||
|
|
||||||
|
IMessengerResolver messengerResolver = serviceProvider.GetService<IMessengerResolver>();
|
||||||
|
messengerResolver.AddMessenger(new List<IMessenger> { serviceProvider.GetService<FlowMessenger>() });
|
||||||
|
|
||||||
|
|
||||||
|
ResolverTransfer resolverTransfer = serviceProvider.GetService<ResolverTransfer>();
|
||||||
|
resolverTransfer.AddResolvers(new List<IResolver> { serviceProvider.GetService<FlowResolver>() });
|
||||||
|
|
||||||
|
return serviceProvider;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -1,5 +1,5 @@
|
|||||||
using linker.messenger.tunnel;
|
using linker.messenger.tunnel;
|
||||||
namespace linker.plugins.flow
|
namespace linker.messenger.flow
|
||||||
{
|
{
|
||||||
public sealed class ExternalFlow : IFlow
|
public sealed class ExternalFlow : IFlow
|
||||||
{
|
{
|
@@ -1,35 +1,28 @@
|
|||||||
using linker.libs.api;
|
using linker.libs;
|
||||||
using linker.config;
|
using linker.libs.api;
|
||||||
using linker.serializer;
|
|
||||||
using linker.client.config;
|
|
||||||
using linker.plugins.client;
|
|
||||||
using linker.plugins.capi;
|
|
||||||
using linker.plugins.flow.messenger;
|
|
||||||
using linker.libs.extends;
|
using linker.libs.extends;
|
||||||
using linker.plugins.relay.client;
|
using linker.messenger.api;
|
||||||
using linker.plugins.sforward;
|
using linker.messenger.flow.messenger;
|
||||||
using linker.messenger;
|
using linker.messenger.relay.client;
|
||||||
|
using linker.messenger.sforward.client;
|
||||||
using linker.messenger.signin;
|
using linker.messenger.signin;
|
||||||
|
|
||||||
namespace linker.plugins.flow
|
namespace linker.messenger.flow
|
||||||
{
|
{
|
||||||
public sealed class FlowClientApiController : IApiClientController
|
public sealed class FlowApiController : IApiController
|
||||||
{
|
{
|
||||||
private readonly IMessengerSender messengerSender;
|
private readonly IMessengerSender messengerSender;
|
||||||
private readonly SignInClientState signInClientState;
|
private readonly SignInClientState signInClientState;
|
||||||
private readonly FileConfig config;
|
private readonly IRelayClientStore relayClientStore;
|
||||||
private readonly RunningConfig runningConfig;
|
private readonly ISForwardClientStore sForwardClientStore;
|
||||||
private readonly RelayClientConfigTransfer relayClientConfigTransfer;
|
private readonly ISerializer serializer;
|
||||||
private readonly SForwardTransfer sForwardTransfer;
|
public FlowApiController(IMessengerSender messengerSender, SignInClientState signInClientState, IRelayClientStore relayClientStore, ISForwardClientStore sForwardClientStore, ISerializer serializer)
|
||||||
|
|
||||||
public FlowClientApiController(IMessengerSender messengerSender, SignInClientState signInClientState, FileConfig config, RunningConfig runningConfig, RelayClientConfigTransfer relayClientConfigTransfer, SForwardTransfer sForwardTransfer)
|
|
||||||
{
|
{
|
||||||
this.messengerSender = messengerSender;
|
this.messengerSender = messengerSender;
|
||||||
this.signInClientState = signInClientState;
|
this.signInClientState = signInClientState;
|
||||||
this.config = config;
|
this.relayClientStore = relayClientStore;
|
||||||
this.runningConfig = runningConfig;
|
this.sForwardClientStore = sForwardClientStore;
|
||||||
this.relayClientConfigTransfer = relayClientConfigTransfer;
|
this.serializer = serializer;
|
||||||
this.sForwardTransfer = sForwardTransfer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<FlowInfo> GetFlows(ApiControllerParamsInfo param)
|
public async Task<FlowInfo> GetFlows(ApiControllerParamsInfo param)
|
||||||
@@ -41,7 +34,7 @@ namespace linker.plugins.flow
|
|||||||
});
|
});
|
||||||
if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0)
|
if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0)
|
||||||
{
|
{
|
||||||
return Serializer.Deserialize<FlowInfo>(resp.Data.Span);
|
return serializer.Deserialize<FlowInfo>(resp.Data.Span);
|
||||||
}
|
}
|
||||||
return new FlowInfo();
|
return new FlowInfo();
|
||||||
}
|
}
|
||||||
@@ -54,45 +47,45 @@ namespace linker.plugins.flow
|
|||||||
});
|
});
|
||||||
if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0)
|
if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0)
|
||||||
{
|
{
|
||||||
return Serializer.Deserialize<Dictionary<ushort, FlowItemInfo>>(resp.Data.Span);
|
return serializer.Deserialize<Dictionary<ushort, FlowItemInfo>>(resp.Data.Span);
|
||||||
}
|
}
|
||||||
return new Dictionary<ushort, FlowItemInfo>();
|
return new Dictionary<ushort, FlowItemInfo>();
|
||||||
}
|
}
|
||||||
|
|
||||||
[ClientApiAccessAttribute(ClientApiAccess.SForwardFlow)]
|
[Access(AccessValue.SForwardFlow)]
|
||||||
public async Task<SForwardFlowResponseInfo> GetSForwardFlows(ApiControllerParamsInfo param)
|
public async Task<SForwardFlowResponseInfo> GetSForwardFlows(ApiControllerParamsInfo param)
|
||||||
{
|
{
|
||||||
SForwardFlowRequestInfo info = param.Content.DeJson<SForwardFlowRequestInfo>();
|
SForwardFlowRequestInfo info = param.Content.DeJson<SForwardFlowRequestInfo>();
|
||||||
info.SecretKey = sForwardTransfer.SecretKey;
|
info.SecretKey = sForwardClientStore.SecretKey;
|
||||||
|
|
||||||
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
|
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
|
||||||
{
|
{
|
||||||
Connection = signInClientState.Connection,
|
Connection = signInClientState.Connection,
|
||||||
MessengerId = (ushort)FlowMessengerIds.SForward,
|
MessengerId = (ushort)FlowMessengerIds.SForward,
|
||||||
Payload = Serializer.Serialize(info)
|
Payload = serializer.Serialize(info)
|
||||||
});
|
});
|
||||||
if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0)
|
if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0)
|
||||||
{
|
{
|
||||||
return Serializer.Deserialize<SForwardFlowResponseInfo>(resp.Data.Span);
|
return serializer.Deserialize<SForwardFlowResponseInfo>(resp.Data.Span);
|
||||||
}
|
}
|
||||||
return new SForwardFlowResponseInfo();
|
return new SForwardFlowResponseInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
[ClientApiAccessAttribute(ClientApiAccess.RelayFlow)]
|
[Access(AccessValue.RelayFlow)]
|
||||||
public async Task<RelayFlowResponseInfo> GetRelayFlows(ApiControllerParamsInfo param)
|
public async Task<RelayFlowResponseInfo> GetRelayFlows(ApiControllerParamsInfo param)
|
||||||
{
|
{
|
||||||
RelayFlowRequestInfo info = param.Content.DeJson<RelayFlowRequestInfo>();
|
RelayFlowRequestInfo info = param.Content.DeJson<RelayFlowRequestInfo>();
|
||||||
info.SecretKey = relayClientConfigTransfer.Server.SecretKey;
|
info.SecretKey = relayClientStore.Server.SecretKey;
|
||||||
|
|
||||||
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
|
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
|
||||||
{
|
{
|
||||||
Connection = signInClientState.Connection,
|
Connection = signInClientState.Connection,
|
||||||
MessengerId = (ushort)FlowMessengerIds.Relay,
|
MessengerId = (ushort)FlowMessengerIds.Relay,
|
||||||
Payload = Serializer.Serialize(info)
|
Payload = serializer.Serialize(info)
|
||||||
});
|
});
|
||||||
if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0)
|
if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0)
|
||||||
{
|
{
|
||||||
return Serializer.Deserialize<RelayFlowResponseInfo>(resp.Data.Span);
|
return serializer.Deserialize<RelayFlowResponseInfo>(resp.Data.Span);
|
||||||
}
|
}
|
||||||
return new RelayFlowResponseInfo();
|
return new RelayFlowResponseInfo();
|
||||||
}
|
}
|
@@ -1,13 +1,12 @@
|
|||||||
using linker.libs;
|
using linker.libs;
|
||||||
using linker.libs.extends;
|
using linker.libs.extends;
|
||||||
using linker.messenger;
|
|
||||||
using linker.messenger.signin;
|
using linker.messenger.signin;
|
||||||
using System.Buffers;
|
using System.Buffers;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
|
|
||||||
namespace linker.plugins.flow
|
namespace linker.messenger.flow
|
||||||
{
|
{
|
||||||
public sealed class FlowResolver : IResolver, IFlow
|
public sealed class FlowResolver : IResolver, IFlow
|
||||||
{
|
{
|
@@ -1,4 +1,6 @@
|
|||||||
namespace linker.plugins.flow
|
using linker.libs;
|
||||||
|
|
||||||
|
namespace linker.messenger.flow
|
||||||
{
|
{
|
||||||
public sealed class FlowTransfer
|
public sealed class FlowTransfer
|
||||||
{
|
{
|
||||||
@@ -7,9 +9,10 @@
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LoadFlows(List<IFlow> flows)
|
public void AddFlows(List<IFlow> list)
|
||||||
{
|
{
|
||||||
this.flows = flows;
|
LoggerHelper.Instance.Info($"add flow {string.Join(",", list.Select(c => c.GetType().Name))}");
|
||||||
|
this.flows = this.flows.Concat(list).Distinct().ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Dictionary<string, FlowItemInfo> GetFlows()
|
public Dictionary<string, FlowItemInfo> GetFlows()
|
@@ -1,7 +1,6 @@
|
|||||||
using MemoryPack;
|
using System.Text.Json.Serialization;
|
||||||
using System.Text.Json.Serialization;
|
|
||||||
|
|
||||||
namespace linker.plugins.flow
|
namespace linker.messenger.flow
|
||||||
{
|
{
|
||||||
public interface IFlow
|
public interface IFlow
|
||||||
{
|
{
|
||||||
@@ -10,17 +9,15 @@ namespace linker.plugins.flow
|
|||||||
public string FlowName { get; }
|
public string FlowName { get; }
|
||||||
}
|
}
|
||||||
|
|
||||||
[MemoryPackable]
|
|
||||||
public partial class FlowItemInfo
|
public partial class FlowItemInfo
|
||||||
{
|
{
|
||||||
public ulong ReceiveBytes { get; set; }
|
public ulong ReceiveBytes { get; set; }
|
||||||
public ulong SendtBytes { get; set; }
|
public ulong SendtBytes { get; set; }
|
||||||
|
|
||||||
[MemoryPackIgnore, JsonIgnore]
|
[JsonIgnore]
|
||||||
public string FlowName { get; set; }
|
public string FlowName { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
[MemoryPackable]
|
|
||||||
public sealed partial class FlowInfo
|
public sealed partial class FlowInfo
|
||||||
{
|
{
|
||||||
public Dictionary<string, FlowItemInfo> Items { get; set; }
|
public Dictionary<string, FlowItemInfo> Items { get; set; }
|
@@ -1,12 +1,10 @@
|
|||||||
using linker.messenger;
|
namespace linker.messenger.flow
|
||||||
|
|
||||||
namespace linker.plugins.flow
|
|
||||||
{
|
{
|
||||||
|
|
||||||
public sealed class MessengerResolverFlow : MessengerResolver
|
public sealed class MessengerResolverFlow : MessengerResolver
|
||||||
{
|
{
|
||||||
private readonly MessengerFlow messengerFlow;
|
private readonly MessengerFlow messengerFlow;
|
||||||
public MessengerResolverFlow(IMessengerSender sender, MessengerFlow messengerFlow) : base(sender)
|
public MessengerResolverFlow(IMessengerSender sender, MessengerFlow messengerFlow,IMessengerStore messengerStore) : base(sender, messengerStore)
|
||||||
{
|
{
|
||||||
this.messengerFlow = messengerFlow;
|
this.messengerFlow = messengerFlow;
|
||||||
}
|
}
|
@@ -1,9 +1,8 @@
|
|||||||
using linker.libs;
|
using linker.libs;
|
||||||
using linker.messenger.relay.server;
|
using linker.messenger.relay.server;
|
||||||
using MemoryPack;
|
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
namespace linker.plugins.flow
|
namespace linker.messenger.flow
|
||||||
{
|
{
|
||||||
public sealed class RelayReportFlow : IFlow
|
public sealed class RelayReportFlow : IFlow
|
||||||
{
|
{
|
||||||
@@ -37,7 +36,7 @@ namespace linker.plugins.flow
|
|||||||
public sealed class RelayResolverFlow : RelayServerResolver
|
public sealed class RelayResolverFlow : RelayServerResolver
|
||||||
{
|
{
|
||||||
private readonly RelayFlow relayFlow;
|
private readonly RelayFlow relayFlow;
|
||||||
public RelayResolverFlow(RelayFlow relayFlow, RelayServerNodeTransfer relayServerNodeTransfer,ISerializer serializer) : base(relayServerNodeTransfer, serializer)
|
public RelayResolverFlow(RelayFlow relayFlow, RelayServerNodeTransfer relayServerNodeTransfer, ISerializer serializer) : base(relayServerNodeTransfer, serializer)
|
||||||
{
|
{
|
||||||
this.relayFlow = relayFlow;
|
this.relayFlow = relayFlow;
|
||||||
}
|
}
|
||||||
@@ -184,7 +183,6 @@ namespace linker.plugins.flow
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[MemoryPackable]
|
|
||||||
public sealed partial class RelayFlowItemInfo : FlowItemInfo
|
public sealed partial class RelayFlowItemInfo : FlowItemInfo
|
||||||
{
|
{
|
||||||
public ulong DiffReceiveBytes { get; set; }
|
public ulong DiffReceiveBytes { get; set; }
|
||||||
@@ -192,21 +190,18 @@ namespace linker.plugins.flow
|
|||||||
public string FromName { get; set; }
|
public string FromName { get; set; }
|
||||||
public string ToName { get; set; }
|
public string ToName { get; set; }
|
||||||
|
|
||||||
[MemoryPackIgnore]
|
|
||||||
public string GroupId { get; set; }
|
public string GroupId { get; set; }
|
||||||
|
|
||||||
[MemoryPackIgnore, JsonIgnore]
|
[JsonIgnore]
|
||||||
public ulong OldReceiveBytes { get; set; }
|
public ulong OldReceiveBytes { get; set; }
|
||||||
[MemoryPackIgnore, JsonIgnore]
|
[JsonIgnore]
|
||||||
public ulong OldSendtBytes { get; set; }
|
public ulong OldSendtBytes { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
[MemoryPackable]
|
|
||||||
public sealed partial class RelayFlowRequestInfo
|
public sealed partial class RelayFlowRequestInfo
|
||||||
{
|
{
|
||||||
public string Key { get; set; } = string.Empty;
|
public string Key { get; set; } = string.Empty;
|
||||||
|
|
||||||
[MemoryPackIgnore]
|
|
||||||
public string GroupId { get; set; } = string.Empty;
|
public string GroupId { get; set; } = string.Empty;
|
||||||
public string SecretKey { get; set; } = string.Empty;
|
public string SecretKey { get; set; } = string.Empty;
|
||||||
public int Page { get; set; } = 1;
|
public int Page { get; set; } = 1;
|
||||||
@@ -228,7 +223,6 @@ namespace linker.plugins.flow
|
|||||||
Asc = 1,
|
Asc = 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
[MemoryPackable]
|
|
||||||
public sealed partial class RelayFlowResponseInfo
|
public sealed partial class RelayFlowResponseInfo
|
||||||
{
|
{
|
||||||
public int Page { get; set; }
|
public int Page { get; set; }
|
@@ -1,9 +1,8 @@
|
|||||||
using linker.libs;
|
using linker.libs;
|
||||||
using linker.plugins.sforward.proxy;
|
using linker.plugins.sforward.proxy;
|
||||||
using MemoryPack;
|
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
namespace linker.plugins.flow
|
namespace linker.messenger.flow
|
||||||
{
|
{
|
||||||
public sealed class SForwardProxyFlow: SForwardProxy
|
public sealed class SForwardProxyFlow: SForwardProxy
|
||||||
{
|
{
|
||||||
@@ -125,28 +124,24 @@ namespace linker.plugins.flow
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[MemoryPackable]
|
|
||||||
public sealed partial class SForwardFlowItemInfo : FlowItemInfo
|
public sealed partial class SForwardFlowItemInfo : FlowItemInfo
|
||||||
{
|
{
|
||||||
public ulong DiffReceiveBytes { get; set; }
|
public ulong DiffReceiveBytes { get; set; }
|
||||||
public ulong DiffSendtBytes { get; set; }
|
public ulong DiffSendtBytes { get; set; }
|
||||||
public string Key { get; set; }
|
public string Key { get; set; }
|
||||||
|
|
||||||
[MemoryPackIgnore]
|
|
||||||
public string GroupId { get; set; }
|
public string GroupId { get; set; }
|
||||||
|
|
||||||
[MemoryPackIgnore, JsonIgnore]
|
[ JsonIgnore]
|
||||||
public ulong OldReceiveBytes { get; set; }
|
public ulong OldReceiveBytes { get; set; }
|
||||||
[MemoryPackIgnore, JsonIgnore]
|
[ JsonIgnore]
|
||||||
public ulong OldSendtBytes { get; set; }
|
public ulong OldSendtBytes { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
[MemoryPackable]
|
|
||||||
public sealed partial class SForwardFlowRequestInfo
|
public sealed partial class SForwardFlowRequestInfo
|
||||||
{
|
{
|
||||||
public string Key { get; set; } = string.Empty;
|
public string Key { get; set; } = string.Empty;
|
||||||
|
|
||||||
[MemoryPackIgnore]
|
|
||||||
public string GroupId { get; set; } = string.Empty;
|
public string GroupId { get; set; } = string.Empty;
|
||||||
public string SecretKey { get; set; } = string.Empty;
|
public string SecretKey { get; set; } = string.Empty;
|
||||||
|
|
||||||
@@ -169,7 +164,6 @@ namespace linker.plugins.flow
|
|||||||
Asc = 1,
|
Asc = 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
[MemoryPackable]
|
|
||||||
public sealed partial class SForwardFlowResponseInfo
|
public sealed partial class SForwardFlowResponseInfo
|
||||||
{
|
{
|
||||||
public int Page { get; set; }
|
public int Page { get; set; }
|
42
linker.messenger.flow/linker.messenger.flow.csproj
Normal file
42
linker.messenger.flow/linker.messenger.flow.csproj
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>disable</Nullable>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<PublishAot>false</PublishAot>
|
||||||
|
<JsonSerializerIsReflectionEnabledByDefault>true</JsonSerializerIsReflectionEnabledByDefault>
|
||||||
|
<EnablePreviewFeatures>True</EnablePreviewFeatures>
|
||||||
|
<Title>linker messenger flow</Title>
|
||||||
|
<Authors>snltty</Authors>
|
||||||
|
<Company>snltty</Company>
|
||||||
|
<Description>linker messenger flow</Description>
|
||||||
|
<Copyright>snltty</Copyright>
|
||||||
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
|
<PackageReleaseNotes>linker messenger flow</PackageReleaseNotes>
|
||||||
|
<Version>1.6.4</Version>
|
||||||
|
<AssemblyVersion>1.6.4</AssemblyVersion>
|
||||||
|
<FileVersion>1.6.4</FileVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||||
|
<DebugType>none</DebugType>
|
||||||
|
<DebugSymbols>false</DebugSymbols>
|
||||||
|
<Optimize>True</Optimize>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\linker.libs\linker.libs.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.relay\linker.messenger.relay.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.sforward\linker.messenger.sforward.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.signin\linker.messenger.signin.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.tunnel\linker.messenger.tunnel.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger\linker.messenger.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
@@ -1,11 +1,9 @@
|
|||||||
using linker.config;
|
using linker.libs;
|
||||||
using linker.messenger;
|
using linker.messenger.relay.server;
|
||||||
|
using linker.messenger.sforward.server;
|
||||||
using linker.messenger.signin;
|
using linker.messenger.signin;
|
||||||
using linker.plugins.relay.server;
|
|
||||||
using linker.plugins.sforward;
|
|
||||||
using linker.serializer;
|
|
||||||
|
|
||||||
namespace linker.plugins.flow.messenger
|
namespace linker.messenger.flow.messenger
|
||||||
{
|
{
|
||||||
public sealed class FlowMessenger : IMessenger
|
public sealed class FlowMessenger : IMessenger
|
||||||
{
|
{
|
||||||
@@ -14,22 +12,22 @@ namespace linker.plugins.flow.messenger
|
|||||||
private readonly SForwardFlow sForwardFlow;
|
private readonly SForwardFlow sForwardFlow;
|
||||||
private readonly RelayFlow relayFlow;
|
private readonly RelayFlow relayFlow;
|
||||||
private readonly SignInServerCaching signCaching;
|
private readonly SignInServerCaching signCaching;
|
||||||
private readonly FileConfig fileConfig;
|
private readonly IRelayServerStore relayServerStore;
|
||||||
private readonly RelayServerConfigTransfer relayServerConfigTransfer;
|
private readonly ISForwardServerStore sForwardServerStore;
|
||||||
private readonly SForwardServerConfigTransfer sForwardServerConfigTransfer;
|
private readonly ISerializer serializer;
|
||||||
|
|
||||||
private DateTime start = DateTime.Now;
|
private DateTime start = DateTime.Now;
|
||||||
|
|
||||||
public FlowMessenger(FlowTransfer flowTransfer, MessengerFlow messengerFlow, SForwardFlow sForwardFlow, RelayFlow relayFlow, SignInServerCaching signCaching, FileConfig fileConfig, RelayServerConfigTransfer relayServerConfigTransfer, SForwardServerConfigTransfer sForwardServerConfigTransfer)
|
public FlowMessenger(FlowTransfer flowTransfer, MessengerFlow messengerFlow, SForwardFlow sForwardFlow, RelayFlow relayFlow, SignInServerCaching signCaching, IRelayServerStore relayServerStore, ISForwardServerStore sForwardServerStore, ISerializer serializer)
|
||||||
{
|
{
|
||||||
this.flowTransfer = flowTransfer;
|
this.flowTransfer = flowTransfer;
|
||||||
this.messengerFlow = messengerFlow;
|
this.messengerFlow = messengerFlow;
|
||||||
this.sForwardFlow = sForwardFlow;
|
this.sForwardFlow = sForwardFlow;
|
||||||
this.relayFlow = relayFlow;
|
this.relayFlow = relayFlow;
|
||||||
this.signCaching = signCaching;
|
this.signCaching = signCaching;
|
||||||
this.fileConfig = fileConfig;
|
this.relayServerStore = relayServerStore;
|
||||||
this.relayServerConfigTransfer = relayServerConfigTransfer;
|
this.sForwardServerStore = sForwardServerStore;
|
||||||
this.sForwardServerConfigTransfer = sForwardServerConfigTransfer;
|
this.serializer = serializer;
|
||||||
}
|
}
|
||||||
|
|
||||||
[MessengerId((ushort)FlowMessengerIds.List)]
|
[MessengerId((ushort)FlowMessengerIds.List)]
|
||||||
@@ -46,22 +44,22 @@ namespace linker.plugins.flow.messenger
|
|||||||
Start = start,
|
Start = start,
|
||||||
Now = DateTime.Now,
|
Now = DateTime.Now,
|
||||||
};
|
};
|
||||||
connection.Write(Serializer.Serialize(serverFlowInfo));
|
connection.Write(serializer.Serialize(serverFlowInfo));
|
||||||
}
|
}
|
||||||
|
|
||||||
[MessengerId((ushort)FlowMessengerIds.Messenger)]
|
[MessengerId((ushort)FlowMessengerIds.Messenger)]
|
||||||
public void Messenger(IConnection connection)
|
public void Messenger(IConnection connection)
|
||||||
{
|
{
|
||||||
connection.Write(Serializer.Serialize(messengerFlow.GetFlows()));
|
connection.Write(serializer.Serialize(messengerFlow.GetFlows()));
|
||||||
}
|
}
|
||||||
|
|
||||||
[MessengerId((ushort)FlowMessengerIds.SForward)]
|
[MessengerId((ushort)FlowMessengerIds.SForward)]
|
||||||
public void SForward(IConnection connection)
|
public void SForward(IConnection connection)
|
||||||
{
|
{
|
||||||
sForwardFlow.Update();
|
sForwardFlow.Update();
|
||||||
SForwardFlowRequestInfo info = Serializer.Deserialize<SForwardFlowRequestInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
SForwardFlowRequestInfo info = serializer.Deserialize<SForwardFlowRequestInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
||||||
|
|
||||||
if (sForwardServerConfigTransfer.SecretKey == info.SecretKey)
|
if (sForwardServerStore.SecretKey == info.SecretKey)
|
||||||
{
|
{
|
||||||
info.GroupId = string.Empty;
|
info.GroupId = string.Empty;
|
||||||
}
|
}
|
||||||
@@ -77,15 +75,15 @@ namespace linker.plugins.flow.messenger
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
connection.Write(Serializer.Serialize(sForwardFlow.GetFlows(info)));
|
connection.Write(serializer.Serialize(sForwardFlow.GetFlows(info)));
|
||||||
}
|
}
|
||||||
|
|
||||||
[MessengerId((ushort)FlowMessengerIds.Relay)]
|
[MessengerId((ushort)FlowMessengerIds.Relay)]
|
||||||
public void Relay(IConnection connection)
|
public void Relay(IConnection connection)
|
||||||
{
|
{
|
||||||
relayFlow.Update();
|
relayFlow.Update();
|
||||||
RelayFlowRequestInfo info = Serializer.Deserialize<RelayFlowRequestInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
RelayFlowRequestInfo info = serializer.Deserialize<RelayFlowRequestInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
||||||
if (relayServerConfigTransfer.SecretKey == info.SecretKey)
|
if (relayServerStore.SecretKey == info.SecretKey)
|
||||||
{
|
{
|
||||||
info.GroupId = string.Empty;
|
info.GroupId = string.Empty;
|
||||||
}
|
}
|
||||||
@@ -101,7 +99,7 @@ namespace linker.plugins.flow.messenger
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
connection.Write(Serializer.Serialize(relayFlow.GetFlows(info)));
|
connection.Write(serializer.Serialize(relayFlow.GetFlows(info)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@@ -1,4 +1,4 @@
|
|||||||
namespace linker.plugins.flow.messenger
|
namespace linker.messenger.flow.messenger
|
||||||
{
|
{
|
||||||
public enum FlowMessengerIds : ushort
|
public enum FlowMessengerIds : ushort
|
||||||
{
|
{
|
@@ -1,22 +1,9 @@
|
|||||||
using LiteDB;
|
using System.Net;
|
||||||
using MemoryPack;
|
namespace linker.messenger.forward
|
||||||
using System.Net;
|
|
||||||
using System.Text.Json.Serialization;
|
|
||||||
|
|
||||||
namespace linker.client.config
|
|
||||||
{
|
{
|
||||||
public sealed partial class RunningConfigInfo
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 端口转发配置
|
|
||||||
/// </summary>
|
|
||||||
public List<ForwardInfo> Forwards { get; set; } = new List<ForwardInfo>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 端口转发配置
|
/// 端口转发配置
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[MemoryPackable]
|
|
||||||
public sealed partial class ForwardInfo
|
public sealed partial class ForwardInfo
|
||||||
{
|
{
|
||||||
public ForwardInfo() { }
|
public ForwardInfo() { }
|
||||||
@@ -34,7 +21,6 @@ namespace linker.client.config
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 本地绑定IP
|
/// 本地绑定IP
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[MemoryPackAllowSerialize]
|
|
||||||
public IPAddress BindIPAddress { get; set; } = IPAddress.Any;
|
public IPAddress BindIPAddress { get; set; } = IPAddress.Any;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 本地监听端口
|
/// 本地监听端口
|
||||||
@@ -43,7 +29,6 @@ namespace linker.client.config
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 目标设备服务
|
/// 目标设备服务
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[MemoryPackAllowSerialize]
|
|
||||||
public IPEndPoint TargetEP { get; set; }
|
public IPEndPoint TargetEP { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 已启动
|
/// 已启动
|
||||||
@@ -63,8 +48,23 @@ namespace linker.client.config
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string TargetMsg { get; set; }
|
public string TargetMsg { get; set; }
|
||||||
|
|
||||||
[JsonIgnore, BsonIgnore, MemoryPackIgnore]
|
|
||||||
public bool Proxy { get; set; }
|
public bool Proxy { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public sealed partial class ForwardAddForwardInfo
|
||||||
|
{
|
||||||
|
public string MachineId { get; set; }
|
||||||
|
public ForwardInfo Data { get; set; }
|
||||||
|
}
|
||||||
|
public sealed partial class ForwardRemoveForwardInfo
|
||||||
|
{
|
||||||
|
public string MachineId { get; set; }
|
||||||
|
public uint Id { get; set; }
|
||||||
|
}
|
||||||
|
public sealed partial class ForwardCountInfo
|
||||||
|
{
|
||||||
|
public string MachineId { get; set; }
|
||||||
|
public int Count { get; set; }
|
||||||
|
}
|
||||||
}
|
}
|
57
linker.messenger.forward/Entry.cs
Normal file
57
linker.messenger.forward/Entry.cs
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
using linker.messenger.api;
|
||||||
|
using linker.messenger.decenter;
|
||||||
|
using linker.messenger.forward.proxy;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
namespace linker.messenger.forward
|
||||||
|
{
|
||||||
|
public static class Entry
|
||||||
|
{
|
||||||
|
public static ServiceCollection AddForwardClient(this ServiceCollection serviceCollection)
|
||||||
|
{
|
||||||
|
serviceCollection.AddSingleton<ForwardApiController>();
|
||||||
|
|
||||||
|
serviceCollection.AddSingleton<ForwardTransfer>();
|
||||||
|
|
||||||
|
serviceCollection.AddSingleton<ForwardClientMessenger>();
|
||||||
|
|
||||||
|
serviceCollection.AddSingleton<ForwardDecenter>();
|
||||||
|
|
||||||
|
|
||||||
|
serviceCollection.AddSingleton<ForwardProxy>();
|
||||||
|
|
||||||
|
return serviceCollection;
|
||||||
|
}
|
||||||
|
public static ServiceProvider UseForwardClient(this ServiceProvider serviceProvider)
|
||||||
|
{
|
||||||
|
IApiServer apiServer = serviceProvider.GetService<IApiServer>();
|
||||||
|
apiServer.AddPlugins(new List<libs.api.IApiController> { serviceProvider.GetService<ForwardApiController>() });
|
||||||
|
|
||||||
|
ForwardTransfer forwardTransfer = serviceProvider.GetService<ForwardTransfer>();
|
||||||
|
|
||||||
|
IMessengerResolver messengerResolver = serviceProvider.GetService<IMessengerResolver>();
|
||||||
|
messengerResolver.AddMessenger(new List<IMessenger> { serviceProvider.GetService<ForwardClientMessenger>() });
|
||||||
|
|
||||||
|
DecenterClientTransfer decenterClientTransfer = serviceProvider.GetService<DecenterClientTransfer>();
|
||||||
|
decenterClientTransfer.AddDecenters(new List<IDecenter> { serviceProvider.GetService<ForwardDecenter>() });
|
||||||
|
|
||||||
|
ForwardProxy forwardProxy= serviceProvider.GetService<ForwardProxy>();
|
||||||
|
|
||||||
|
return serviceProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static ServiceCollection AddForwardServer(this ServiceCollection serviceCollection)
|
||||||
|
{
|
||||||
|
serviceCollection.AddSingleton<ForwardServerMessenger>();
|
||||||
|
|
||||||
|
return serviceCollection;
|
||||||
|
}
|
||||||
|
public static ServiceProvider UseForwardServer(this ServiceProvider serviceProvider)
|
||||||
|
{
|
||||||
|
IMessengerResolver messengerResolver = serviceProvider.GetService<IMessengerResolver>();
|
||||||
|
messengerResolver.AddMessenger(new List<IMessenger> { serviceProvider.GetService<ForwardServerMessenger>() });
|
||||||
|
|
||||||
|
return serviceProvider;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -1,42 +1,36 @@
|
|||||||
using linker.libs.api;
|
using linker.libs.api;
|
||||||
using linker.libs.extends;
|
using linker.libs.extends;
|
||||||
using linker.client.config;
|
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using linker.libs;
|
using linker.libs;
|
||||||
using linker.plugins.forward.proxy;
|
|
||||||
using linker.tunnel.connection;
|
using linker.tunnel.connection;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using linker.plugins.forward.messenger;
|
|
||||||
using linker.serializer;
|
|
||||||
using linker.plugins.client;
|
|
||||||
using linker.plugins.capi;
|
|
||||||
using linker.plugins.messenger;
|
|
||||||
using linker.config;
|
|
||||||
using linker.plugins.access;
|
|
||||||
using linker.messenger;
|
|
||||||
using linker.messenger.signin;
|
using linker.messenger.signin;
|
||||||
|
using linker.messenger.forward.proxy;
|
||||||
|
using linker.messenger.api;
|
||||||
|
|
||||||
namespace linker.plugins.forward
|
namespace linker.messenger.forward
|
||||||
{
|
{
|
||||||
public sealed class ForwardClientApiController : IApiClientController
|
public sealed class ForwardApiController : IApiController
|
||||||
{
|
{
|
||||||
private readonly ForwardTransfer forwardTransfer;
|
private readonly ForwardTransfer forwardTransfer;
|
||||||
private readonly ForwardProxy forwardProxy;
|
private readonly ForwardProxy forwardProxy;
|
||||||
private readonly IMessengerSender messengerSender;
|
private readonly IMessengerSender messengerSender;
|
||||||
private readonly SignInClientState signInClientState;
|
private readonly SignInClientState signInClientState;
|
||||||
private readonly AccessTransfer accessTransfer;
|
private readonly IAccessStore accessStore;
|
||||||
private readonly ISignInClientStore signInClientStore;
|
private readonly ISignInClientStore signInClientStore;
|
||||||
private readonly ForwardDecenter forwardDecenter;
|
private readonly ForwardDecenter forwardDecenter;
|
||||||
|
private readonly ISerializer serializer;
|
||||||
|
|
||||||
public ForwardClientApiController(ForwardTransfer forwardTransfer, ForwardProxy forwardProxy, IMessengerSender messengerSender, SignInClientState signInClientState, AccessTransfer accessTransfer, ISignInClientStore signInClientStore, ForwardDecenter forwardDecenter)
|
public ForwardApiController(ForwardTransfer forwardTransfer, ForwardProxy forwardProxy, IMessengerSender messengerSender, SignInClientState signInClientState, IAccessStore accessStore, ISignInClientStore signInClientStore, ForwardDecenter forwardDecenter, ISerializer serializer)
|
||||||
{
|
{
|
||||||
this.forwardTransfer = forwardTransfer;
|
this.forwardTransfer = forwardTransfer;
|
||||||
this.forwardProxy = forwardProxy;
|
this.forwardProxy = forwardProxy;
|
||||||
this.messengerSender = messengerSender;
|
this.messengerSender = messengerSender;
|
||||||
this.signInClientState = signInClientState;
|
this.signInClientState = signInClientState;
|
||||||
this.accessTransfer = accessTransfer;
|
this.accessStore = accessStore;
|
||||||
this.signInClientStore = signInClientStore;
|
this.signInClientStore = signInClientStore;
|
||||||
this.forwardDecenter = forwardDecenter;
|
this.forwardDecenter = forwardDecenter;
|
||||||
|
this.serializer = serializer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ConnectionListInfo Connections(ApiControllerParamsInfo param)
|
public ConnectionListInfo Connections(ApiControllerParamsInfo param)
|
||||||
@@ -53,7 +47,7 @@ namespace linker.plugins.forward
|
|||||||
return new ConnectionListInfo { HashCode = version };
|
return new ConnectionListInfo { HashCode = version };
|
||||||
}
|
}
|
||||||
|
|
||||||
[ClientApiAccessAttribute(ClientApiAccess.TunnelRemove)]
|
[Access(AccessValue.TunnelRemove)]
|
||||||
public void RemoveConnection(ApiControllerParamsInfo param)
|
public void RemoveConnection(ApiControllerParamsInfo param)
|
||||||
{
|
{
|
||||||
forwardProxy.RemoveConnection(param.Content);
|
forwardProxy.RemoveConnection(param.Content);
|
||||||
@@ -91,20 +85,20 @@ namespace linker.plugins.forward
|
|||||||
{
|
{
|
||||||
if (param.Content == signInClientStore.Id)
|
if (param.Content == signInClientStore.Id)
|
||||||
{
|
{
|
||||||
if (accessTransfer.HasAccess(ClientApiAccess.ForwardShowSelf) == false) return new List<ForwardInfo>();
|
if (accessStore.HasAccess(AccessValue.ForwardShowSelf) == false) return new List<ForwardInfo>();
|
||||||
return forwardTransfer.Get();
|
return forwardTransfer.Get();
|
||||||
}
|
}
|
||||||
if (accessTransfer.HasAccess(ClientApiAccess.ForwardShowOther) == false) return new List<ForwardInfo>();
|
if (accessStore.HasAccess(AccessValue.ForwardShowOther) == false) return new List<ForwardInfo>();
|
||||||
|
|
||||||
var resp = await messengerSender.SendReply(new MessageRequestWrap
|
var resp = await messengerSender.SendReply(new MessageRequestWrap
|
||||||
{
|
{
|
||||||
Connection = signInClientState.Connection,
|
Connection = signInClientState.Connection,
|
||||||
MessengerId = (ushort)ForwardMessengerIds.GetForward,
|
MessengerId = (ushort)ForwardMessengerIds.GetForward,
|
||||||
Payload = Serializer.Serialize(param.Content)
|
Payload = serializer.Serialize(param.Content)
|
||||||
});
|
});
|
||||||
if (resp.Code == MessageResponeCodes.OK)
|
if (resp.Code == MessageResponeCodes.OK)
|
||||||
{
|
{
|
||||||
return Serializer.Deserialize<List<ForwardInfo>>(resp.Data.Span);
|
return serializer.Deserialize<List<ForwardInfo>>(resp.Data.Span);
|
||||||
}
|
}
|
||||||
return new List<ForwardInfo>();
|
return new List<ForwardInfo>();
|
||||||
}
|
}
|
||||||
@@ -119,16 +113,16 @@ namespace linker.plugins.forward
|
|||||||
ForwardAddForwardInfo info = param.Content.DeJson<ForwardAddForwardInfo>();
|
ForwardAddForwardInfo info = param.Content.DeJson<ForwardAddForwardInfo>();
|
||||||
if (info.MachineId == signInClientStore.Id)
|
if (info.MachineId == signInClientStore.Id)
|
||||||
{
|
{
|
||||||
if (accessTransfer.HasAccess(ClientApiAccess.ForwardSelf) == false) return false;
|
if (accessStore.HasAccess(AccessValue.ForwardSelf) == false) return false;
|
||||||
return forwardTransfer.Add(info.Data);
|
return forwardTransfer.Add(info.Data);
|
||||||
}
|
}
|
||||||
if (accessTransfer.HasAccess(ClientApiAccess.ForwardOther) == false) return false;
|
if (accessStore.HasAccess(AccessValue.ForwardOther) == false) return false;
|
||||||
|
|
||||||
return await messengerSender.SendOnly(new MessageRequestWrap
|
return await messengerSender.SendOnly(new MessageRequestWrap
|
||||||
{
|
{
|
||||||
Connection = signInClientState.Connection,
|
Connection = signInClientState.Connection,
|
||||||
MessengerId = (ushort)ForwardMessengerIds.AddClientForward,
|
MessengerId = (ushort)ForwardMessengerIds.AddClientForward,
|
||||||
Payload = Serializer.Serialize(info)
|
Payload = serializer.Serialize(info)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,16 +136,16 @@ namespace linker.plugins.forward
|
|||||||
ForwardRemoveForwardInfo info = param.Content.DeJson<ForwardRemoveForwardInfo>();
|
ForwardRemoveForwardInfo info = param.Content.DeJson<ForwardRemoveForwardInfo>();
|
||||||
if (info.MachineId == signInClientStore.Id)
|
if (info.MachineId == signInClientStore.Id)
|
||||||
{
|
{
|
||||||
if (accessTransfer.HasAccess(ClientApiAccess.ForwardSelf) == false) return false;
|
if (accessStore.HasAccess(AccessValue.ForwardSelf) == false) return false;
|
||||||
return forwardTransfer.Remove(info.Id);
|
return forwardTransfer.Remove(info.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (accessTransfer.HasAccess(ClientApiAccess.ForwardOther) == false) return false;
|
if (accessStore.HasAccess(AccessValue.ForwardOther) == false) return false;
|
||||||
return await messengerSender.SendOnly(new MessageRequestWrap
|
return await messengerSender.SendOnly(new MessageRequestWrap
|
||||||
{
|
{
|
||||||
Connection = signInClientState.Connection,
|
Connection = signInClientState.Connection,
|
||||||
MessengerId = (ushort)ForwardMessengerIds.RemoveClientForward,
|
MessengerId = (ushort)ForwardMessengerIds.RemoveClientForward,
|
||||||
Payload = Serializer.Serialize(info)
|
Payload = serializer.Serialize(info)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -1,46 +1,48 @@
|
|||||||
using linker.libs;
|
using linker.libs;
|
||||||
using linker.messenger.decenter;
|
using linker.messenger.decenter;
|
||||||
using linker.messenger.signin;
|
using linker.messenger.signin;
|
||||||
using linker.plugins.client;
|
|
||||||
using linker.serializer;
|
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
|
|
||||||
namespace linker.plugins.forward
|
namespace linker.messenger.forward
|
||||||
{
|
{
|
||||||
public sealed class ForwardDecenter:IDecenter
|
public sealed class ForwardDecenter : IDecenter
|
||||||
{
|
{
|
||||||
public string Name => "forward";
|
public string Name => "forward";
|
||||||
public VersionManager SyncVersion { get; } = new VersionManager();
|
public VersionManager SyncVersion { get; } = new VersionManager();
|
||||||
public VersionManager DataVersion { get; } = new VersionManager();
|
public VersionManager DataVersion { get; } = new VersionManager();
|
||||||
public ConcurrentDictionary<string, int> CountDic { get; }= new ConcurrentDictionary<string, int>();
|
public ConcurrentDictionary<string, int> CountDic { get; } = new ConcurrentDictionary<string, int>();
|
||||||
|
|
||||||
|
|
||||||
private readonly ISignInClientStore signInClientStore;
|
private readonly ISignInClientStore signInClientStore;
|
||||||
private readonly ForwardTransfer forwardTransfer;
|
private readonly ForwardTransfer forwardTransfer;
|
||||||
public ForwardDecenter(ISignInClientStore signInClientStore, ForwardTransfer forwardTransfer)
|
private readonly ISerializer serializer;
|
||||||
|
public ForwardDecenter(ISignInClientStore signInClientStore, ForwardTransfer forwardTransfer, ISerializer serializer)
|
||||||
{
|
{
|
||||||
this.signInClientStore = signInClientStore;
|
this.signInClientStore = signInClientStore;
|
||||||
this.forwardTransfer = forwardTransfer;
|
this.forwardTransfer = forwardTransfer;
|
||||||
|
this.serializer = serializer;
|
||||||
|
|
||||||
forwardTransfer.OnReset += CountDic.Clear;
|
forwardTransfer.OnReset += CountDic.Clear;
|
||||||
forwardTransfer.OnChanged += SyncVersion.Add;
|
forwardTransfer.OnChanged += SyncVersion.Add;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Memory<byte> GetData()
|
public Memory<byte> GetData()
|
||||||
{
|
{
|
||||||
CountInfo info = new CountInfo { MachineId = signInClientStore.Id, Count = forwardTransfer.Count };
|
ForwardCountInfo info = new ForwardCountInfo { MachineId = signInClientStore.Id, Count = forwardTransfer.Count };
|
||||||
CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
|
CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
|
||||||
DataVersion.Add();
|
DataVersion.Add();
|
||||||
return Serializer.Serialize(info);
|
return serializer.Serialize(info);
|
||||||
}
|
}
|
||||||
public void SetData(Memory<byte> data)
|
public void SetData(Memory<byte> data)
|
||||||
{
|
{
|
||||||
CountInfo info = Serializer.Deserialize<CountInfo>(data.Span);
|
ForwardCountInfo info = serializer.Deserialize<ForwardCountInfo>(data.Span);
|
||||||
CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
|
CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
|
||||||
DataVersion.Add();
|
DataVersion.Add();
|
||||||
}
|
}
|
||||||
public void SetData(List<ReadOnlyMemory<byte>> data)
|
public void SetData(List<ReadOnlyMemory<byte>> data)
|
||||||
{
|
{
|
||||||
List<CountInfo> list = data.Select(c => Serializer.Deserialize<CountInfo>(c.Span)).ToList();
|
List<ForwardCountInfo> list = data.Select(c => serializer.Deserialize<ForwardCountInfo>(c.Span)).ToList();
|
||||||
foreach (var info in list)
|
foreach (var info in list)
|
||||||
{
|
{
|
||||||
CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
|
CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
|
@@ -1,21 +1,19 @@
|
|||||||
using linker.client.config;
|
using linker.libs;
|
||||||
using linker.messenger;
|
|
||||||
using linker.messenger.signin;
|
using linker.messenger.signin;
|
||||||
using linker.serializer;
|
|
||||||
using MemoryPack;
|
|
||||||
|
|
||||||
namespace linker.plugins.forward.messenger
|
namespace linker.messenger.forward
|
||||||
{
|
{
|
||||||
public sealed class ForwardServerMessenger : IMessenger
|
public sealed class ForwardServerMessenger : IMessenger
|
||||||
{
|
{
|
||||||
|
|
||||||
private readonly IMessengerSender sender;
|
private readonly IMessengerSender sender;
|
||||||
private readonly SignInServerCaching signCaching;
|
private readonly SignInServerCaching signCaching;
|
||||||
|
private readonly ISerializer serializer;
|
||||||
public ForwardServerMessenger(IMessengerSender sender, SignInServerCaching signCaching)
|
public ForwardServerMessenger(IMessengerSender sender, SignInServerCaching signCaching, ISerializer serializer)
|
||||||
{
|
{
|
||||||
this.sender = sender;
|
this.sender = sender;
|
||||||
this.signCaching = signCaching;
|
this.signCaching = signCaching;
|
||||||
|
this.serializer = serializer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -25,7 +23,7 @@ namespace linker.plugins.forward.messenger
|
|||||||
[MessengerId((ushort)ForwardMessengerIds.GetForward)]
|
[MessengerId((ushort)ForwardMessengerIds.GetForward)]
|
||||||
public void GetForward(IConnection connection)
|
public void GetForward(IConnection connection)
|
||||||
{
|
{
|
||||||
string machineId = Serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
|
string machineId = serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
|
||||||
if (signCaching.TryGet(machineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
|
if (signCaching.TryGet(machineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
|
||||||
{
|
{
|
||||||
uint requestid = connection.ReceiveRequestWrap.RequestId;
|
uint requestid = connection.ReceiveRequestWrap.RequestId;
|
||||||
@@ -56,7 +54,7 @@ namespace linker.plugins.forward.messenger
|
|||||||
[MessengerId((ushort)ForwardMessengerIds.AddClientForward)]
|
[MessengerId((ushort)ForwardMessengerIds.AddClientForward)]
|
||||||
public async Task AddClientForward(IConnection connection)
|
public async Task AddClientForward(IConnection connection)
|
||||||
{
|
{
|
||||||
ForwardAddForwardInfo info = Serializer.Deserialize<ForwardAddForwardInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
ForwardAddForwardInfo info = serializer.Deserialize<ForwardAddForwardInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
||||||
if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
|
if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
|
||||||
{
|
{
|
||||||
uint requestid = connection.ReceiveRequestWrap.RequestId;
|
uint requestid = connection.ReceiveRequestWrap.RequestId;
|
||||||
@@ -64,7 +62,7 @@ namespace linker.plugins.forward.messenger
|
|||||||
{
|
{
|
||||||
Connection = cacheTo.Connection,
|
Connection = cacheTo.Connection,
|
||||||
MessengerId = (ushort)ForwardMessengerIds.AddClient,
|
MessengerId = (ushort)ForwardMessengerIds.AddClient,
|
||||||
Payload = Serializer.Serialize(info.Data)
|
Payload = serializer.Serialize(info.Data)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -75,7 +73,7 @@ namespace linker.plugins.forward.messenger
|
|||||||
[MessengerId((ushort)ForwardMessengerIds.RemoveClientForward)]
|
[MessengerId((ushort)ForwardMessengerIds.RemoveClientForward)]
|
||||||
public async Task RemoveClientForward(IConnection connection)
|
public async Task RemoveClientForward(IConnection connection)
|
||||||
{
|
{
|
||||||
ForwardRemoveForwardInfo info = Serializer.Deserialize<ForwardRemoveForwardInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
ForwardRemoveForwardInfo info = serializer.Deserialize<ForwardRemoveForwardInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
||||||
if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
|
if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
|
||||||
{
|
{
|
||||||
uint requestid = connection.ReceiveRequestWrap.RequestId;
|
uint requestid = connection.ReceiveRequestWrap.RequestId;
|
||||||
@@ -83,7 +81,7 @@ namespace linker.plugins.forward.messenger
|
|||||||
{
|
{
|
||||||
Connection = cacheTo.Connection,
|
Connection = cacheTo.Connection,
|
||||||
MessengerId = (ushort)ForwardMessengerIds.RemoveClient,
|
MessengerId = (ushort)ForwardMessengerIds.RemoveClient,
|
||||||
Payload = Serializer.Serialize(info.Id)
|
Payload = serializer.Serialize(info.Id)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -94,17 +92,18 @@ namespace linker.plugins.forward.messenger
|
|||||||
{
|
{
|
||||||
private readonly ForwardTransfer forwardTransfer;
|
private readonly ForwardTransfer forwardTransfer;
|
||||||
private readonly IMessengerSender sender;
|
private readonly IMessengerSender sender;
|
||||||
|
private readonly ISerializer serializer;
|
||||||
public ForwardClientMessenger(ForwardTransfer forwardTransfer, IMessengerSender sender)
|
public ForwardClientMessenger(ForwardTransfer forwardTransfer, IMessengerSender sender, ISerializer serializer)
|
||||||
{
|
{
|
||||||
this.forwardTransfer = forwardTransfer;
|
this.forwardTransfer = forwardTransfer;
|
||||||
this.sender = sender;
|
this.sender = sender;
|
||||||
|
this.serializer = serializer;
|
||||||
}
|
}
|
||||||
|
|
||||||
[MessengerId((ushort)ForwardMessengerIds.Get)]
|
[MessengerId((ushort)ForwardMessengerIds.Get)]
|
||||||
public void Get(IConnection connection)
|
public void Get(IConnection connection)
|
||||||
{
|
{
|
||||||
connection.Write(Serializer.Serialize(forwardTransfer.Get()));
|
connection.Write(serializer.Serialize(forwardTransfer.Get()));
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 添加
|
/// 添加
|
||||||
@@ -113,7 +112,7 @@ namespace linker.plugins.forward.messenger
|
|||||||
[MessengerId((ushort)ForwardMessengerIds.AddClient)]
|
[MessengerId((ushort)ForwardMessengerIds.AddClient)]
|
||||||
public void AddClient(IConnection connection)
|
public void AddClient(IConnection connection)
|
||||||
{
|
{
|
||||||
ForwardInfo info = Serializer.Deserialize<ForwardInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
ForwardInfo info = serializer.Deserialize<ForwardInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
||||||
forwardTransfer.Add(info);
|
forwardTransfer.Add(info);
|
||||||
}
|
}
|
||||||
// <summary>
|
// <summary>
|
||||||
@@ -123,21 +122,10 @@ namespace linker.plugins.forward.messenger
|
|||||||
[MessengerId((ushort)ForwardMessengerIds.RemoveClient)]
|
[MessengerId((ushort)ForwardMessengerIds.RemoveClient)]
|
||||||
public void RemoveClient(IConnection connection)
|
public void RemoveClient(IConnection connection)
|
||||||
{
|
{
|
||||||
uint id = Serializer.Deserialize<uint>(connection.ReceiveRequestWrap.Payload.Span);
|
uint id = serializer.Deserialize<uint>(connection.ReceiveRequestWrap.Payload.Span);
|
||||||
forwardTransfer.Remove(id);
|
forwardTransfer.Remove(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[MemoryPackable]
|
|
||||||
public sealed partial class ForwardAddForwardInfo
|
|
||||||
{
|
|
||||||
public string MachineId { get; set; }
|
|
||||||
public ForwardInfo Data { get; set; }
|
|
||||||
}
|
|
||||||
[MemoryPackable]
|
|
||||||
public sealed partial class ForwardRemoveForwardInfo
|
|
||||||
{
|
|
||||||
public string MachineId { get; set; }
|
|
||||||
public uint Id { get; set; }
|
|
||||||
}
|
|
||||||
}
|
}
|
@@ -1,4 +1,4 @@
|
|||||||
namespace linker.plugins.forward.messenger
|
namespace linker.messenger.forward
|
||||||
{
|
{
|
||||||
public enum ForwardMessengerIds : ushort
|
public enum ForwardMessengerIds : ushort
|
||||||
{
|
{
|
@@ -1,20 +1,17 @@
|
|||||||
using linker.client.config;
|
using linker.libs;
|
||||||
using linker.libs;
|
using linker.libs.extends;
|
||||||
using linker.messenger;
|
using linker.messenger.forward.proxy;
|
||||||
using linker.messenger.signin;
|
using linker.messenger.signin;
|
||||||
using linker.plugins.client;
|
|
||||||
using linker.plugins.forward.proxy;
|
|
||||||
using MemoryPack;
|
|
||||||
|
|
||||||
namespace linker.plugins.forward
|
namespace linker.messenger.forward
|
||||||
{
|
{
|
||||||
public sealed class ForwardTransfer
|
public sealed class ForwardTransfer
|
||||||
{
|
{
|
||||||
public int Count => running.Data.Forwards.Count(c => c.GroupId == signInClientStore.Group.Id);
|
public int Count => forwardClientStore.Get().Count(c => c.GroupId == signInClientStore.Group.Id);
|
||||||
public Action OnChanged { get; set; } = () => { };
|
public Action OnChanged { get; set; } = () => { };
|
||||||
public Action OnReset{ get; set; } = () => { };
|
public Action OnReset { get; set; } = () => { };
|
||||||
|
|
||||||
private readonly RunningConfig running;
|
private readonly IForwardClientStore forwardClientStore;
|
||||||
private readonly ForwardProxy forwardProxy;
|
private readonly ForwardProxy forwardProxy;
|
||||||
private readonly SignInClientState signInClientState;
|
private readonly SignInClientState signInClientState;
|
||||||
private readonly IMessengerSender messengerSender;
|
private readonly IMessengerSender messengerSender;
|
||||||
@@ -22,9 +19,9 @@ namespace linker.plugins.forward
|
|||||||
|
|
||||||
private readonly NumberSpaceUInt32 ns = new NumberSpaceUInt32();
|
private readonly NumberSpaceUInt32 ns = new NumberSpaceUInt32();
|
||||||
|
|
||||||
public ForwardTransfer( RunningConfig running, ForwardProxy forwardProxy, SignInClientState signInClientState, IMessengerSender messengerSender, ISignInClientStore signInClientStore)
|
public ForwardTransfer(IForwardClientStore forwardClientStore, ForwardProxy forwardProxy, SignInClientState signInClientState, IMessengerSender messengerSender, ISignInClientStore signInClientStore)
|
||||||
{
|
{
|
||||||
this.running = running;
|
this.forwardClientStore = forwardClientStore;
|
||||||
this.forwardProxy = forwardProxy;
|
this.forwardProxy = forwardProxy;
|
||||||
this.signInClientState = signInClientState;
|
this.signInClientState = signInClientState;
|
||||||
this.messengerSender = messengerSender;
|
this.messengerSender = messengerSender;
|
||||||
@@ -38,15 +35,6 @@ namespace linker.plugins.forward
|
|||||||
{
|
{
|
||||||
TimerHelper.Async(async () =>
|
TimerHelper.Async(async () =>
|
||||||
{
|
{
|
||||||
if (running.Data.Forwards.All(c => string.IsNullOrWhiteSpace(c.GroupId)))
|
|
||||||
{
|
|
||||||
foreach (var item in running.Data.Forwards)
|
|
||||||
{
|
|
||||||
item.GroupId = signInClientStore.Group.Id;
|
|
||||||
}
|
|
||||||
running.Data.Update();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (groupid != signInClientStore.Group.Id)
|
if (groupid != signInClientStore.Group.Id)
|
||||||
{
|
{
|
||||||
OnReset();
|
OnReset();
|
||||||
@@ -58,15 +46,15 @@ namespace linker.plugins.forward
|
|||||||
Start(false);
|
Start(false);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Start(bool errorStop = true)
|
private void Start(bool errorStop = true)
|
||||||
{
|
{
|
||||||
lock (this)
|
lock (this)
|
||||||
{
|
{
|
||||||
uint maxid = running.Data.Forwards.Count > 0 ? running.Data.Forwards.Max(c => c.Id) : 1;
|
uint maxid = forwardClientStore.Count() > 0 ? forwardClientStore.Get().Max(c => c.Id) : 1;
|
||||||
ns.Reset(maxid);
|
ns.Reset(maxid);
|
||||||
|
|
||||||
foreach (var item in running.Data.Forwards.Where(c => c.GroupId == signInClientStore.Group.Id))
|
foreach (var item in forwardClientStore.Get(signInClientStore.Group.Id))
|
||||||
{
|
{
|
||||||
if (item.Started)
|
if (item.Started)
|
||||||
{
|
{
|
||||||
@@ -76,7 +64,9 @@ namespace linker.plugins.forward
|
|||||||
{
|
{
|
||||||
Stop(item);
|
Stop(item);
|
||||||
}
|
}
|
||||||
|
forwardClientStore.Update(item);
|
||||||
}
|
}
|
||||||
|
forwardClientStore.Confirm();
|
||||||
OnChanged();
|
OnChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -124,7 +114,7 @@ namespace linker.plugins.forward
|
|||||||
{
|
{
|
||||||
lock (this)
|
lock (this)
|
||||||
{
|
{
|
||||||
foreach (var item in running.Data.Forwards)
|
foreach (var item in forwardClientStore.Get())
|
||||||
{
|
{
|
||||||
Stop(item);
|
Stop(item);
|
||||||
}
|
}
|
||||||
@@ -136,7 +126,8 @@ namespace linker.plugins.forward
|
|||||||
{
|
{
|
||||||
if (forwardInfo.Proxy)
|
if (forwardInfo.Proxy)
|
||||||
{
|
{
|
||||||
LoggerHelper.Instance.Debug($"stop forward {forwardInfo.Port}->{forwardInfo.MachineId}->{forwardInfo.TargetEP}");
|
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||||
|
LoggerHelper.Instance.Debug($"stop forward {forwardInfo.ToJson()}");
|
||||||
forwardProxy.StopPort(forwardInfo.Port);
|
forwardProxy.StopPort(forwardInfo.Port);
|
||||||
forwardInfo.Proxy = false;
|
forwardInfo.Proxy = false;
|
||||||
}
|
}
|
||||||
@@ -150,19 +141,22 @@ namespace linker.plugins.forward
|
|||||||
|
|
||||||
public List<ForwardInfo> Get()
|
public List<ForwardInfo> Get()
|
||||||
{
|
{
|
||||||
return running.Data.Forwards.Where(c => c.GroupId == signInClientStore.Group.Id).ToList();
|
return forwardClientStore.Get(signInClientStore.Group.Id);
|
||||||
}
|
}
|
||||||
public bool Add(ForwardInfo forwardInfo)
|
public bool Add(ForwardInfo forwardInfo)
|
||||||
{
|
{
|
||||||
//同名或者同端口,但是ID不一样
|
//同名或者同端口,但是ID不一样
|
||||||
ForwardInfo old = running.Data.Forwards.FirstOrDefault(c => (c.Port == forwardInfo.Port && c.Port != 0) && c.MachineId == forwardInfo.MachineId);
|
ForwardInfo old = forwardClientStore.Get().FirstOrDefault(c => (c.Port == forwardInfo.Port && c.Port != 0) && c.MachineId == forwardInfo.MachineId);
|
||||||
if (old != null && old.Id != forwardInfo.Id) return false;
|
if (old != null && old.Id != forwardInfo.Id) return false;
|
||||||
|
|
||||||
if (forwardInfo.Id != 0)
|
if (forwardInfo.Id != 0)
|
||||||
{
|
{
|
||||||
old = running.Data.Forwards.FirstOrDefault(c => c.Id == forwardInfo.Id);
|
old = forwardClientStore.Get(forwardInfo.Id);
|
||||||
if (old == null) return false;
|
if (old == null) return false;
|
||||||
|
|
||||||
|
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||||
|
LoggerHelper.Instance.Debug($"update forward {old.ToJson()}->{forwardInfo.ToJson()}");
|
||||||
|
|
||||||
old.BindIPAddress = forwardInfo.BindIPAddress;
|
old.BindIPAddress = forwardInfo.BindIPAddress;
|
||||||
old.Port = forwardInfo.Port;
|
old.Port = forwardInfo.Port;
|
||||||
old.Name = forwardInfo.Name;
|
old.Name = forwardInfo.Name;
|
||||||
@@ -177,9 +171,13 @@ namespace linker.plugins.forward
|
|||||||
{
|
{
|
||||||
forwardInfo.Id = ns.Increment();
|
forwardInfo.Id = ns.Increment();
|
||||||
forwardInfo.GroupId = signInClientStore.Group.Id;
|
forwardInfo.GroupId = signInClientStore.Group.Id;
|
||||||
running.Data.Forwards.Add(forwardInfo);
|
|
||||||
|
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||||
|
LoggerHelper.Instance.Debug($"add forward {forwardInfo.ToJson()}");
|
||||||
|
|
||||||
|
forwardClientStore.Add(forwardInfo);
|
||||||
}
|
}
|
||||||
running.Data.Update();
|
forwardClientStore.Confirm();
|
||||||
|
|
||||||
Start();
|
Start();
|
||||||
|
|
||||||
@@ -188,24 +186,19 @@ namespace linker.plugins.forward
|
|||||||
public bool Remove(uint id)
|
public bool Remove(uint id)
|
||||||
{
|
{
|
||||||
//同名或者同端口,但是ID不一样
|
//同名或者同端口,但是ID不一样
|
||||||
ForwardInfo old = running.Data.Forwards.FirstOrDefault(c => c.Id == id);
|
ForwardInfo old = forwardClientStore.Get(id);
|
||||||
if (old == null) return false;
|
if (old == null) return false;
|
||||||
|
|
||||||
old.Started = false;
|
old.Started = false;
|
||||||
|
|
||||||
running.Data.Forwards.Remove(old);
|
forwardClientStore.Remove(old.Id);
|
||||||
running.Data.Update();
|
|
||||||
|
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||||
|
LoggerHelper.Instance.Debug($"remove forward {old.ToJson()}");
|
||||||
|
|
||||||
Start();
|
Start();
|
||||||
|
forwardClientStore.Confirm();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[MemoryPackable]
|
|
||||||
public sealed partial class CountInfo
|
|
||||||
{
|
|
||||||
public string MachineId { get; set; }
|
|
||||||
public int Count { get; set; }
|
|
||||||
}
|
|
||||||
}
|
}
|
16
linker.messenger.forward/IForwardClientStore.cs
Normal file
16
linker.messenger.forward/IForwardClientStore.cs
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
namespace linker.messenger.forward
|
||||||
|
{
|
||||||
|
public interface IForwardClientStore
|
||||||
|
{
|
||||||
|
public int Count();
|
||||||
|
|
||||||
|
public List<ForwardInfo> Get();
|
||||||
|
public ForwardInfo Get(uint id);
|
||||||
|
public List<ForwardInfo> Get(string groupId);
|
||||||
|
public bool Add(ForwardInfo info);
|
||||||
|
public bool Update(ForwardInfo info);
|
||||||
|
public bool Remove(uint id);
|
||||||
|
|
||||||
|
public bool Confirm();
|
||||||
|
}
|
||||||
|
}
|
41
linker.messenger.forward/linker.messenger.forward.csproj
Normal file
41
linker.messenger.forward/linker.messenger.forward.csproj
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>disable</Nullable>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<PublishAot>false</PublishAot>
|
||||||
|
<JsonSerializerIsReflectionEnabledByDefault>true</JsonSerializerIsReflectionEnabledByDefault>
|
||||||
|
<EnablePreviewFeatures>True</EnablePreviewFeatures>
|
||||||
|
<Title>linker messenger forward</Title>
|
||||||
|
<Authors>snltty</Authors>
|
||||||
|
<Company>snltty</Company>
|
||||||
|
<Description>linker messenger forward</Description>
|
||||||
|
<Copyright>snltty</Copyright>
|
||||||
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
|
<PackageReleaseNotes>linker messenger forward</PackageReleaseNotes>
|
||||||
|
<Version>1.6.4</Version>
|
||||||
|
<AssemblyVersion>1.6.4</AssemblyVersion>
|
||||||
|
<FileVersion>1.6.4</FileVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||||
|
<DebugType>none</DebugType>
|
||||||
|
<DebugSymbols>false</DebugSymbols>
|
||||||
|
<Optimize>True</Optimize>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\linker.libs\linker.libs.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.channel\linker.messenger.channel.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.decenter\linker.messenger.decenter.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.signin\linker.messenger.signin.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger\linker.messenger.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
@@ -5,7 +5,7 @@ using System.Buffers;
|
|||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
|
|
||||||
namespace linker.plugins.forward.proxy
|
namespace linker.messenger.forward.proxy
|
||||||
{
|
{
|
||||||
|
|
||||||
public partial class ForwardProxy
|
public partial class ForwardProxy
|
@@ -6,7 +6,7 @@ using System.Collections.Concurrent;
|
|||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
|
|
||||||
namespace linker.plugins.forward.proxy
|
namespace linker.messenger.forward.proxy
|
||||||
{
|
{
|
||||||
public partial class ForwardProxy
|
public partial class ForwardProxy
|
||||||
{
|
{
|
@@ -2,16 +2,14 @@
|
|||||||
using linker.tunnel.connection;
|
using linker.tunnel.connection;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using linker.plugins.client;
|
|
||||||
using linker.plugins.tunnel;
|
|
||||||
using linker.plugins.relay.client;
|
|
||||||
using linker.plugins.pcp;
|
|
||||||
using linker.messenger.relay.client;
|
using linker.messenger.relay.client;
|
||||||
using linker.messenger.signin;
|
using linker.messenger.signin;
|
||||||
|
using linker.messenger.channel;
|
||||||
|
using linker.messenger.pcp;
|
||||||
|
|
||||||
namespace linker.plugins.forward.proxy
|
namespace linker.messenger.forward.proxy
|
||||||
{
|
{
|
||||||
public sealed partial class ForwardProxy : TunnelBase, ITunnelConnectionReceiveCallback
|
public sealed partial class ForwardProxy : Channel, ITunnelConnectionReceiveCallback
|
||||||
{
|
{
|
||||||
private readonly ConcurrentDictionary<int, ForwardProxyCacheInfo> caches = new ConcurrentDictionary<int, ForwardProxyCacheInfo>();
|
private readonly ConcurrentDictionary<int, ForwardProxyCacheInfo> caches = new ConcurrentDictionary<int, ForwardProxyCacheInfo>();
|
||||||
private readonly ConcurrentDictionary<string, SemaphoreSlim> locks = new ConcurrentDictionary<string, SemaphoreSlim>();
|
private readonly ConcurrentDictionary<string, SemaphoreSlim> locks = new ConcurrentDictionary<string, SemaphoreSlim>();
|
||||||
@@ -19,8 +17,8 @@ namespace linker.plugins.forward.proxy
|
|||||||
|
|
||||||
protected override string TransactionId => "forward";
|
protected override string TransactionId => "forward";
|
||||||
|
|
||||||
public ForwardProxy(ISignInClientStore signInClientStore, TunnelTransfer tunnelTransfer, RelayClientTransfer relayTransfer, PcpTransfer pcpTransfer, SignInClientTransfer signInClientTransfer, RelayClientConfigTransfer relayClientConfigTransfer)
|
public ForwardProxy(ISignInClientStore signInClientStore, TunnelTransfer tunnelTransfer, RelayClientTransfer relayTransfer, PcpTransfer pcpTransfer, SignInClientTransfer signInClientTransfer, IRelayClientStore relayClientStore)
|
||||||
: base(tunnelTransfer, relayTransfer, pcpTransfer, signInClientTransfer, signInClientStore, relayClientConfigTransfer)
|
: base(tunnelTransfer, relayTransfer, pcpTransfer, signInClientTransfer, signInClientStore, relayClientStore)
|
||||||
{
|
{
|
||||||
TaskUdp();
|
TaskUdp();
|
||||||
}
|
}
|
@@ -5,7 +5,7 @@ using System.Collections.Concurrent;
|
|||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
|
|
||||||
namespace linker.plugins.forward.proxy
|
namespace linker.messenger.forward.proxy
|
||||||
{
|
{
|
||||||
public partial class ForwardProxy
|
public partial class ForwardProxy
|
||||||
{
|
{
|
@@ -1,6 +1,5 @@
|
|||||||
using linker.libs;
|
using linker.libs;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using System.Security.Cryptography.X509Certificates;
|
|
||||||
namespace linker.messenger.listen
|
namespace linker.messenger.listen
|
||||||
{
|
{
|
||||||
public static class Entry
|
public static class Entry
|
||||||
@@ -10,7 +9,7 @@ namespace linker.messenger.listen
|
|||||||
serviceCollection.AddSingleton<TcpServer>();
|
serviceCollection.AddSingleton<TcpServer>();
|
||||||
return serviceCollection;
|
return serviceCollection;
|
||||||
}
|
}
|
||||||
public static ServiceProvider UseListen(this ServiceProvider serviceProvider, X509Certificate2 certificate)
|
public static ServiceProvider UseListen(this ServiceProvider serviceProvider)
|
||||||
{
|
{
|
||||||
TcpServer tcpServer = serviceProvider.GetService<TcpServer>();
|
TcpServer tcpServer = serviceProvider.GetService<TcpServer>();
|
||||||
IListenStore listenStore = serviceProvider.GetService<IListenStore>();
|
IListenStore listenStore = serviceProvider.GetService<IListenStore>();
|
||||||
|
90
linker.messenger.logger/Entry.cs
Normal file
90
linker.messenger.logger/Entry.cs
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
using linker.libs;
|
||||||
|
using linker.messenger.api;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
namespace linker.messenger.logger
|
||||||
|
{
|
||||||
|
public static class Entry
|
||||||
|
{
|
||||||
|
public static ServiceCollection AddLoggerClient(this ServiceCollection serviceCollection)
|
||||||
|
{
|
||||||
|
LoggerConsole();
|
||||||
|
serviceCollection.AddSingleton<LoggerApiController>();
|
||||||
|
return serviceCollection;
|
||||||
|
}
|
||||||
|
public static ServiceProvider UseLoggerClient(this ServiceProvider serviceProvider)
|
||||||
|
{
|
||||||
|
IApiServer apiServer = serviceProvider.GetService<IApiServer>();
|
||||||
|
apiServer.AddPlugins(new List<libs.api.IApiController> { serviceProvider.GetService<LoggerApiController>() });
|
||||||
|
|
||||||
|
IAccessStore accessStore= serviceProvider.GetService<IAccessStore>();
|
||||||
|
ILoggerStore loggerStore= serviceProvider.GetService<ILoggerStore>();
|
||||||
|
if (accessStore.HasAccess(AccessValue.LoggerLevel) == false)
|
||||||
|
{
|
||||||
|
loggerStore.SetLevel( libs.LoggerTypes.WARNING);
|
||||||
|
loggerStore.Confirm();
|
||||||
|
}
|
||||||
|
|
||||||
|
return serviceProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static void LoggerConsole()
|
||||||
|
{
|
||||||
|
if (Directory.Exists("logs") == false)
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory("logs");
|
||||||
|
}
|
||||||
|
LoggerHelper.Instance.OnLogger += (model) =>
|
||||||
|
{
|
||||||
|
ConsoleColor currentForeColor = Console.ForegroundColor;
|
||||||
|
switch (model.Type)
|
||||||
|
{
|
||||||
|
case LoggerTypes.DEBUG:
|
||||||
|
Console.ForegroundColor = ConsoleColor.Blue;
|
||||||
|
break;
|
||||||
|
case LoggerTypes.INFO:
|
||||||
|
Console.ForegroundColor = ConsoleColor.White;
|
||||||
|
break;
|
||||||
|
case LoggerTypes.WARNING:
|
||||||
|
Console.ForegroundColor = ConsoleColor.Yellow;
|
||||||
|
break;
|
||||||
|
case LoggerTypes.ERROR:
|
||||||
|
Console.ForegroundColor = ConsoleColor.Red;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
string line = $"[{model.Type,-7}][{model.Time:yyyy-MM-dd HH:mm:ss}]:{model.Content}";
|
||||||
|
Console.WriteLine(line);
|
||||||
|
Console.ForegroundColor = currentForeColor;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using StreamWriter sw = File.AppendText(Path.Combine("logs", $"{DateTime.Now:yyyy-MM-dd}.log"));
|
||||||
|
sw.WriteLine(line);
|
||||||
|
sw.Flush();
|
||||||
|
sw.Close();
|
||||||
|
sw.Dispose();
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
};
|
||||||
|
TimerHelper.SetInterval(() =>
|
||||||
|
{
|
||||||
|
string[] files = Directory.GetFiles("logs").OrderBy(c => c).ToArray();
|
||||||
|
for (int i = 0; i < files.Length - 180; i++)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
File.Delete(files[i]);
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}, 60 * 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
15
linker.messenger.logger/ILoggerStore.cs
Normal file
15
linker.messenger.logger/ILoggerStore.cs
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
using linker.libs;
|
||||||
|
|
||||||
|
namespace linker.messenger.logger
|
||||||
|
{
|
||||||
|
public interface ILoggerStore
|
||||||
|
{
|
||||||
|
public LoggerTypes LoggerType { get; }
|
||||||
|
public int LoggerSize { get; }
|
||||||
|
|
||||||
|
public bool SetLevel(LoggerTypes level);
|
||||||
|
public bool SetSize(int size);
|
||||||
|
|
||||||
|
public bool Confirm();
|
||||||
|
}
|
||||||
|
}
|
@@ -1,30 +1,28 @@
|
|||||||
using linker.libs.extends;
|
using linker.libs.extends;
|
||||||
using linker.libs.api;
|
using linker.libs.api;
|
||||||
using linker.libs;
|
using linker.libs;
|
||||||
using linker.config;
|
using linker.messenger.api;
|
||||||
using linker.plugins.capi;
|
|
||||||
|
|
||||||
namespace linker.plugins.logger
|
namespace linker.messenger.logger
|
||||||
{
|
{
|
||||||
public sealed class LoggerClientApiController : IApiClientController
|
public sealed class LoggerApiController : IApiController
|
||||||
{
|
{
|
||||||
private readonly List<LoggerModel> loggers = new List<LoggerModel>();
|
private readonly List<LoggerModel> loggers = new List<LoggerModel>();
|
||||||
|
private readonly ILoggerStore loggerStore;
|
||||||
private readonly FileConfig config;
|
public LoggerApiController(ILoggerStore loggerStore)
|
||||||
public LoggerClientApiController(FileConfig config)
|
|
||||||
{
|
{
|
||||||
this.config = config;
|
this.loggerStore = loggerStore;
|
||||||
LoggerHelper.Instance.OnLogger += (LoggerModel logger) =>
|
LoggerHelper.Instance.OnLogger += (LoggerModel logger) =>
|
||||||
{
|
{
|
||||||
loggers.Add(logger);
|
loggers.Add(logger);
|
||||||
if (loggers.Count > config.Data.Common.LoggerSize)
|
if (loggers.Count > loggerStore.LoggerSize)
|
||||||
{
|
{
|
||||||
loggers.RemoveAt(0);
|
loggers.RemoveAt(0);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
[ClientApiAccessAttribute(ClientApiAccess.LoggerShow)]
|
[Access(AccessValue.LoggerShow)]
|
||||||
public LoggerPageInfo Get(ApiControllerParamsInfo param)
|
public LoggerPageInfo Get(ApiControllerParamsInfo param)
|
||||||
{
|
{
|
||||||
LoggerPageParamInfo info = param.Content.DeJson<LoggerPageParamInfo>();
|
LoggerPageParamInfo info = param.Content.DeJson<LoggerPageParamInfo>();
|
||||||
@@ -55,18 +53,18 @@ namespace linker.plugins.logger
|
|||||||
{
|
{
|
||||||
return new LoggerSetParamInfo
|
return new LoggerSetParamInfo
|
||||||
{
|
{
|
||||||
LoggerType = config.Data.Common.LoggerType,
|
LoggerType = loggerStore.LoggerType,
|
||||||
Size = config.Data.Common.LoggerSize
|
Size = loggerStore.LoggerSize
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
[ClientApiAccessAttribute(ClientApiAccess.LoggerLevel)]
|
[Access(AccessValue.LoggerLevel)]
|
||||||
public bool SetConfig(ApiControllerParamsInfo param)
|
public bool SetConfig(ApiControllerParamsInfo param)
|
||||||
{
|
{
|
||||||
LoggerSetParamInfo info = param.Content.DeJson<LoggerSetParamInfo>();
|
LoggerSetParamInfo info = param.Content.DeJson<LoggerSetParamInfo>();
|
||||||
config.Data.Common.LoggerSize = info.Size;
|
loggerStore.SetLevel(info.LoggerType);
|
||||||
config.Data.Common.LoggerType = info.LoggerType;
|
loggerStore.SetSize(info.Size);
|
||||||
config.Data.Update();
|
loggerStore.Confirm();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
38
linker.messenger.logger/linker.messenger.logger.csproj
Normal file
38
linker.messenger.logger/linker.messenger.logger.csproj
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>disable</Nullable>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<PublishAot>false</PublishAot>
|
||||||
|
<JsonSerializerIsReflectionEnabledByDefault>true</JsonSerializerIsReflectionEnabledByDefault>
|
||||||
|
<EnablePreviewFeatures>True</EnablePreviewFeatures>
|
||||||
|
<Title>linker messenger logger</Title>
|
||||||
|
<Authors>snltty</Authors>
|
||||||
|
<Company>snltty</Company>
|
||||||
|
<Description>linker messenger logger</Description>
|
||||||
|
<Copyright>snltty</Copyright>
|
||||||
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
|
<PackageReleaseNotes>linker messenger logger</PackageReleaseNotes>
|
||||||
|
<Version>1.6.4</Version>
|
||||||
|
<AssemblyVersion>1.6.4</AssemblyVersion>
|
||||||
|
<FileVersion>1.6.4</FileVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||||
|
<DebugType>none</DebugType>
|
||||||
|
<DebugSymbols>false</DebugSymbols>
|
||||||
|
<Optimize>True</Optimize>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\linker.libs\linker.libs.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.signin\linker.messenger.signin.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger\linker.messenger.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
@@ -3,13 +3,13 @@ namespace linker.messenger.pcp
|
|||||||
{
|
{
|
||||||
public static class Entry
|
public static class Entry
|
||||||
{
|
{
|
||||||
public static ServiceCollection AddRelayClient(this ServiceCollection serviceCollection)
|
public static ServiceCollection AddPcpClient(this ServiceCollection serviceCollection)
|
||||||
{
|
{
|
||||||
serviceCollection.AddSingleton<PcpTransfer>();
|
serviceCollection.AddSingleton<PcpTransfer>();
|
||||||
serviceCollection.AddSingleton<PcpClientMessenger>();
|
serviceCollection.AddSingleton<PcpClientMessenger>();
|
||||||
return serviceCollection;
|
return serviceCollection;
|
||||||
}
|
}
|
||||||
public static ServiceProvider UseRelayClient(this ServiceProvider serviceProvider)
|
public static ServiceProvider UsePcpClient(this ServiceProvider serviceProvider)
|
||||||
{
|
{
|
||||||
IMessengerResolver messengerResolver = serviceProvider.GetService<IMessengerResolver>();
|
IMessengerResolver messengerResolver = serviceProvider.GetService<IMessengerResolver>();
|
||||||
messengerResolver.AddMessenger(new List<IMessenger> { serviceProvider.GetService<PcpClientMessenger>() });
|
messengerResolver.AddMessenger(new List<IMessenger> { serviceProvider.GetService<PcpClientMessenger>() });
|
||||||
@@ -17,12 +17,12 @@ namespace linker.messenger.pcp
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static ServiceCollection AddRelayServer(this ServiceCollection serviceCollection)
|
public static ServiceCollection AddPcpServer(this ServiceCollection serviceCollection)
|
||||||
{
|
{
|
||||||
serviceCollection.AddSingleton<PcpServerMessenger>();
|
serviceCollection.AddSingleton<PcpServerMessenger>();
|
||||||
return serviceCollection;
|
return serviceCollection;
|
||||||
}
|
}
|
||||||
public static ServiceProvider UseRelayServer(this ServiceProvider serviceProvider)
|
public static ServiceProvider UsePcpServer(this ServiceProvider serviceProvider)
|
||||||
{
|
{
|
||||||
IMessengerResolver messengerResolver = serviceProvider.GetService<IMessengerResolver>();
|
IMessengerResolver messengerResolver = serviceProvider.GetService<IMessengerResolver>();
|
||||||
messengerResolver.AddMessenger(new List<IMessenger> { serviceProvider.GetService<PcpServerMessenger>() });
|
messengerResolver.AddMessenger(new List<IMessenger> { serviceProvider.GetService<PcpServerMessenger>() });
|
||||||
|
@@ -6,12 +6,10 @@ using linker.messenger.relay.server.caching;
|
|||||||
using linker.messenger.relay.server.validator;
|
using linker.messenger.relay.server.validator;
|
||||||
using linker.messenger.sync;
|
using linker.messenger.sync;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using System.Security.Cryptography.X509Certificates;
|
|
||||||
namespace linker.messenger.relay
|
namespace linker.messenger.relay
|
||||||
{
|
{
|
||||||
public static class Entry
|
public static class Entry
|
||||||
{
|
{
|
||||||
public static X509Certificate2 certificate;
|
|
||||||
public static ServiceCollection AddRelayClient(this ServiceCollection serviceCollection)
|
public static ServiceCollection AddRelayClient(this ServiceCollection serviceCollection)
|
||||||
{
|
{
|
||||||
serviceCollection.AddSingleton<RelayClientTransfer>();
|
serviceCollection.AddSingleton<RelayClientTransfer>();
|
||||||
@@ -25,10 +23,8 @@ namespace linker.messenger.relay
|
|||||||
|
|
||||||
return serviceCollection;
|
return serviceCollection;
|
||||||
}
|
}
|
||||||
public static ServiceProvider UseRelayClient(this ServiceProvider serviceProvider, X509Certificate2 certificate)
|
public static ServiceProvider UseRelayClient(this ServiceProvider serviceProvider)
|
||||||
{
|
{
|
||||||
Entry.certificate = certificate;
|
|
||||||
|
|
||||||
IMessengerResolver messengerResolver = serviceProvider.GetService<IMessengerResolver>();
|
IMessengerResolver messengerResolver = serviceProvider.GetService<IMessengerResolver>();
|
||||||
messengerResolver.AddMessenger(new List<IMessenger> { serviceProvider.GetService<RelayClientMessenger>() });
|
messengerResolver.AddMessenger(new List<IMessenger> { serviceProvider.GetService<RelayClientMessenger>() });
|
||||||
|
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
using linker.libs.api;
|
using linker.libs.api;
|
||||||
using linker.libs.extends;
|
using linker.libs.extends;
|
||||||
|
using linker.messenger.api;
|
||||||
using linker.messenger.relay.client;
|
using linker.messenger.relay.client;
|
||||||
using linker.messenger.relay.client.transport;
|
using linker.messenger.relay.client.transport;
|
||||||
using linker.messenger.relay.server;
|
using linker.messenger.relay.server;
|
||||||
@@ -27,6 +28,7 @@ namespace linker.messenger.relay
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="param"></param>
|
/// <param name="param"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
|
[Access(AccessValue.Config)]
|
||||||
public bool SetServers(ApiControllerParamsInfo param)
|
public bool SetServers(ApiControllerParamsInfo param)
|
||||||
{
|
{
|
||||||
RelayServerInfo info = param.Content.DeJson<RelayServerInfo>();
|
RelayServerInfo info = param.Content.DeJson<RelayServerInfo>();
|
||||||
|
@@ -18,11 +18,11 @@ namespace linker.messenger.relay.client
|
|||||||
private Dictionary<string, List<Action<ITunnelConnection>>> OnConnected { get; } = new Dictionary<string, List<Action<ITunnelConnection>>>();
|
private Dictionary<string, List<Action<ITunnelConnection>>> OnConnected { get; } = new Dictionary<string, List<Action<ITunnelConnection>>>();
|
||||||
|
|
||||||
private readonly IRelayClientStore relayClientStore;
|
private readonly IRelayClientStore relayClientStore;
|
||||||
public RelayClientTransfer(IMessengerSender messengerSender,ISerializer serializer,IRelayClientStore relayClientStore,SignInClientState signInClientState)
|
public RelayClientTransfer(IMessengerSender messengerSender,ISerializer serializer,IRelayClientStore relayClientStore,SignInClientState signInClientState,IMessengerStore messengerStore)
|
||||||
{
|
{
|
||||||
this.relayClientStore = relayClientStore;
|
this.relayClientStore = relayClientStore;
|
||||||
Transports = new List<IRelayClientTransport> {
|
Transports = new List<IRelayClientTransport> {
|
||||||
new RelayClientTransportSelfHost(messengerSender,serializer,relayClientStore,signInClientState),
|
new RelayClientTransportSelfHost(messengerSender,serializer,relayClientStore,signInClientState,messengerStore),
|
||||||
};
|
};
|
||||||
LoggerHelper.Instance.Info($"load relay transport:{string.Join(",", Transports.Select(c => c.GetType().Name))}");
|
LoggerHelper.Instance.Info($"load relay transport:{string.Join(",", Transports.Select(c => c.GetType().Name))}");
|
||||||
}
|
}
|
||||||
|
@@ -27,12 +27,14 @@ namespace linker.messenger.relay.client.transport
|
|||||||
private readonly ISerializer serializer;
|
private readonly ISerializer serializer;
|
||||||
private readonly IRelayClientStore relayClientStore;
|
private readonly IRelayClientStore relayClientStore;
|
||||||
private readonly SignInClientState signInClientState;
|
private readonly SignInClientState signInClientState;
|
||||||
public RelayClientTransportSelfHost(IMessengerSender messengerSender, ISerializer serializer, IRelayClientStore relayClientStore, SignInClientState signInClientState)
|
private readonly IMessengerStore messengerStore;
|
||||||
|
public RelayClientTransportSelfHost(IMessengerSender messengerSender, ISerializer serializer, IRelayClientStore relayClientStore, SignInClientState signInClientState, IMessengerStore messengerStore)
|
||||||
{
|
{
|
||||||
this.messengerSender = messengerSender;
|
this.messengerSender = messengerSender;
|
||||||
this.serializer = serializer;
|
this.serializer = serializer;
|
||||||
this.relayClientStore = relayClientStore;
|
this.relayClientStore = relayClientStore;
|
||||||
this.signInClientState = signInClientState;
|
this.signInClientState = signInClientState;
|
||||||
|
this.messengerStore = messengerStore;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<ITunnelConnection> RelayAsync(RelayInfo relayInfo)
|
public async Task<ITunnelConnection> RelayAsync(RelayInfo relayInfo)
|
||||||
@@ -272,7 +274,7 @@ namespace linker.messenger.relay.client.transport
|
|||||||
if (relayInfo.SSL)
|
if (relayInfo.SSL)
|
||||||
{
|
{
|
||||||
sslStream = new SslStream(new NetworkStream(socket, false), false);
|
sslStream = new SslStream(new NetworkStream(socket, false), false);
|
||||||
await sslStream.AuthenticateAsServerAsync(Entry.certificate, false, SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13, false).ConfigureAwait(false);
|
await sslStream.AuthenticateAsServerAsync(messengerStore.Certificate, false, SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13, false).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
return new TunnelConnectionTcp
|
return new TunnelConnectionTcp
|
||||||
{
|
{
|
||||||
|
@@ -48,12 +48,12 @@ namespace linker.messenger.relay.server
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private string name = Dns.GetHostName().SubStr(0, 12);
|
private string name = Dns.GetHostName().SubStr(0, 32);
|
||||||
public string Name
|
public string Name
|
||||||
{
|
{
|
||||||
get => name; set
|
get => name; set
|
||||||
{
|
{
|
||||||
name = value.SubStr(0, 12);
|
name = value.SubStr(0, 32);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public string Host { get; set; } = string.Empty;
|
public string Host { get; set; } = string.Empty;
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
using MemoryPack;
|
using MemoryPack;
|
||||||
using linker.messenger.access;
|
using linker.messenger.access;
|
||||||
|
using linker.messenger.api;
|
||||||
|
|
||||||
namespace linker.messenger.serializer.memorypack
|
namespace linker.messenger.serializer.memorypack
|
||||||
{
|
{
|
||||||
|
@@ -59,6 +59,39 @@ namespace linker.messenger.serializer.memorypack
|
|||||||
MemoryPackFormatterProvider.Register(new Socks5LanInfoFormatter());
|
MemoryPackFormatterProvider.Register(new Socks5LanInfoFormatter());
|
||||||
MemoryPackFormatterProvider.Register(new Socks5InfoFormatter());
|
MemoryPackFormatterProvider.Register(new Socks5InfoFormatter());
|
||||||
|
|
||||||
|
|
||||||
|
MemoryPackFormatterProvider.Register(new SForwardInfoFormatter());
|
||||||
|
MemoryPackFormatterProvider.Register(new SForwardAddInfoFormatter());
|
||||||
|
MemoryPackFormatterProvider.Register(new SForwardAddResultInfoFormatter());
|
||||||
|
MemoryPackFormatterProvider.Register(new SForwardAddForwardInfoFormatter());
|
||||||
|
MemoryPackFormatterProvider.Register(new SForwardRemoveForwardInfoFormatter());
|
||||||
|
MemoryPackFormatterProvider.Register(new SForwardProxyInfoFormatter());
|
||||||
|
MemoryPackFormatterProvider.Register(new SForwardCountInfoFormatter());
|
||||||
|
|
||||||
|
|
||||||
|
MemoryPackFormatterProvider.Register(new ForwardInfoFormatter());
|
||||||
|
MemoryPackFormatterProvider.Register(new ForwardAddForwardInfoFormatter());
|
||||||
|
MemoryPackFormatterProvider.Register(new ForwardRemoveForwardInfoFormatter());
|
||||||
|
MemoryPackFormatterProvider.Register(new ForwardCountInfoFormatter());
|
||||||
|
|
||||||
|
MemoryPackFormatterProvider.Register(new FlowItemInfoFormatter());
|
||||||
|
MemoryPackFormatterProvider.Register(new FlowInfoFormatter());
|
||||||
|
MemoryPackFormatterProvider.Register(new RelayFlowItemInfoFormatter());
|
||||||
|
MemoryPackFormatterProvider.Register(new RelayFlowRequestInfoFormatter());
|
||||||
|
MemoryPackFormatterProvider.Register(new RelayFlowResponseInfoFormatter());
|
||||||
|
MemoryPackFormatterProvider.Register(new SForwardFlowItemInfoFormatter());
|
||||||
|
MemoryPackFormatterProvider.Register(new SForwardFlowRequestInfoFormatter());
|
||||||
|
MemoryPackFormatterProvider.Register(new SForwardFlowResponseInfoFormatter());
|
||||||
|
|
||||||
|
MemoryPackFormatterProvider.Register(new TuntapVeaLanIPAddressFormatter());
|
||||||
|
MemoryPackFormatterProvider.Register(new TuntapVeaLanIPAddressListFormatter());
|
||||||
|
MemoryPackFormatterProvider.Register(new TuntapInfoFormatter());
|
||||||
|
MemoryPackFormatterProvider.Register(new TuntapForwardInfoFormatter());
|
||||||
|
MemoryPackFormatterProvider.Register(new TuntapForwardTestWrapInfoFormatter());
|
||||||
|
MemoryPackFormatterProvider.Register(new TuntapForwardTestInfoFormatter());
|
||||||
|
MemoryPackFormatterProvider.Register(new TuntapLanInfoFormatter());
|
||||||
|
MemoryPackFormatterProvider.Register(new LeaseInfoFormatter());
|
||||||
|
|
||||||
return serviceCollection;
|
return serviceCollection;
|
||||||
}
|
}
|
||||||
public static ServiceProvider UseSerializerMemoryPack(this ServiceProvider serviceProvider)
|
public static ServiceProvider UseSerializerMemoryPack(this ServiceProvider serviceProvider)
|
||||||
|
533
linker.messenger.serializer.memorypack/FlowSerializer.cs
Normal file
533
linker.messenger.serializer.memorypack/FlowSerializer.cs
Normal file
@@ -0,0 +1,533 @@
|
|||||||
|
using MemoryPack;
|
||||||
|
using linker.messenger.flow;
|
||||||
|
|
||||||
|
namespace linker.messenger.serializer.memorypack
|
||||||
|
{
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableFlowItemInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly FlowItemInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
ulong ReceiveBytes => info.ReceiveBytes;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
ulong SendtBytes => info.SendtBytes;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableFlowItemInfo(ulong receiveBytes, ulong sendtBytes)
|
||||||
|
{
|
||||||
|
var info = new FlowItemInfo { ReceiveBytes = receiveBytes, SendtBytes = sendtBytes };
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableFlowItemInfo(FlowItemInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class FlowItemInfoFormatter : MemoryPackFormatter<FlowItemInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref FlowItemInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableFlowItemInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref FlowItemInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableFlowItemInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableFlowInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly FlowInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
Dictionary<string, FlowItemInfo> Items => info.Items;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
DateTime Start => info.Start;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
DateTime Now => info.Now;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableFlowInfo(Dictionary<string, FlowItemInfo> items, DateTime start, DateTime now)
|
||||||
|
{
|
||||||
|
var info = new FlowInfo { Items = items, Now = now, Start = start };
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableFlowInfo(FlowInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class FlowInfoFormatter : MemoryPackFormatter<FlowInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref FlowInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableFlowInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref FlowInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableFlowInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableRelayFlowItemInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly RelayFlowItemInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
ulong ReceiveBytes => info.ReceiveBytes;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
ulong SendtBytes => info.SendtBytes;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
ulong DiffReceiveBytes => info.DiffReceiveBytes;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
ulong DiffSendtBytes => info.DiffSendtBytes;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string FromName => info.FromName;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string ToName => info.ToName;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableRelayFlowItemInfo(ulong receiveBytes, ulong sendtBytes, ulong diffReceiveBytes, ulong diffSendtBytes, string fromName, string toName)
|
||||||
|
{
|
||||||
|
var info = new RelayFlowItemInfo
|
||||||
|
{
|
||||||
|
ReceiveBytes = receiveBytes,
|
||||||
|
SendtBytes = sendtBytes,
|
||||||
|
DiffReceiveBytes = diffReceiveBytes,
|
||||||
|
DiffSendtBytes = diffSendtBytes,
|
||||||
|
FromName = fromName,
|
||||||
|
ToName = toName
|
||||||
|
};
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableRelayFlowItemInfo(RelayFlowItemInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class RelayFlowItemInfoFormatter : MemoryPackFormatter<RelayFlowItemInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref RelayFlowItemInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableRelayFlowItemInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref RelayFlowItemInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableRelayFlowItemInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableRelayFlowRequestInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly RelayFlowRequestInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string Key => info.Key;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string SecretKey => info.SecretKey;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
int Page => info.Page;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
int PageSize => info.PageSize;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
RelayFlowOrder Order => info.Order;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
RelayFlowOrderType OrderType => info.OrderType;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableRelayFlowRequestInfo(string key, string secretKey, int page, int pageSize, RelayFlowOrder order, RelayFlowOrderType orderType)
|
||||||
|
{
|
||||||
|
var info = new RelayFlowRequestInfo
|
||||||
|
{
|
||||||
|
Key = key,
|
||||||
|
Order = order,
|
||||||
|
OrderType = orderType,
|
||||||
|
Page = page,
|
||||||
|
PageSize = pageSize,
|
||||||
|
SecretKey = secretKey
|
||||||
|
};
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableRelayFlowRequestInfo(RelayFlowRequestInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class RelayFlowRequestInfoFormatter : MemoryPackFormatter<RelayFlowRequestInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref RelayFlowRequestInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableRelayFlowRequestInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref RelayFlowRequestInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableRelayFlowRequestInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableRelayFlowResponseInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly RelayFlowResponseInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
int Page => info.Page;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
int PageSize => info.PageSize;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
int Count => info.Count;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
List<RelayFlowItemInfo> Data => info.Data;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableRelayFlowResponseInfo(int page, int pageSize, int count, List<RelayFlowItemInfo> data)
|
||||||
|
{
|
||||||
|
var info = new RelayFlowResponseInfo
|
||||||
|
{
|
||||||
|
Page = page,
|
||||||
|
PageSize = pageSize,
|
||||||
|
Count = count,
|
||||||
|
Data = data
|
||||||
|
};
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableRelayFlowResponseInfo(RelayFlowResponseInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class RelayFlowResponseInfoFormatter : MemoryPackFormatter<RelayFlowResponseInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref RelayFlowResponseInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableRelayFlowResponseInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref RelayFlowResponseInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableRelayFlowResponseInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableSForwardFlowItemInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly SForwardFlowItemInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
ulong ReceiveBytes => info.ReceiveBytes;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
ulong SendtBytes => info.SendtBytes;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
ulong DiffReceiveBytes => info.DiffReceiveBytes;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
ulong DiffSendtBytes => info.DiffSendtBytes;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string Key => info.Key;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableSForwardFlowItemInfo(ulong receiveBytes, ulong sendtBytes, ulong diffReceiveBytes, ulong diffSendtBytes, string key)
|
||||||
|
{
|
||||||
|
var info = new SForwardFlowItemInfo
|
||||||
|
{
|
||||||
|
ReceiveBytes = receiveBytes,
|
||||||
|
SendtBytes = sendtBytes,
|
||||||
|
|
||||||
|
DiffReceiveBytes = diffReceiveBytes,
|
||||||
|
DiffSendtBytes = diffSendtBytes,
|
||||||
|
Key = key
|
||||||
|
};
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableSForwardFlowItemInfo(SForwardFlowItemInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class SForwardFlowItemInfoFormatter : MemoryPackFormatter<SForwardFlowItemInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref SForwardFlowItemInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableSForwardFlowItemInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref SForwardFlowItemInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableSForwardFlowItemInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableSForwardFlowRequestInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly SForwardFlowRequestInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string Key => info.Key;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string SecretKey => info.SecretKey;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
int Page => info.Page;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
int PageSize => info.PageSize;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
SForwardFlowOrder Order => info.Order;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
SForwardFlowOrderType OrderType => info.OrderType;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableSForwardFlowRequestInfo(string key, string secretKey, int page, int pageSize, SForwardFlowOrder order, SForwardFlowOrderType orderType)
|
||||||
|
{
|
||||||
|
var info = new SForwardFlowRequestInfo
|
||||||
|
{
|
||||||
|
Key = key,
|
||||||
|
Order = order,
|
||||||
|
OrderType = orderType,
|
||||||
|
Page = page,
|
||||||
|
PageSize = pageSize,
|
||||||
|
SecretKey = secretKey
|
||||||
|
};
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableSForwardFlowRequestInfo(SForwardFlowRequestInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class SForwardFlowRequestInfoFormatter : MemoryPackFormatter<SForwardFlowRequestInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref SForwardFlowRequestInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableSForwardFlowRequestInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref SForwardFlowRequestInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableSForwardFlowRequestInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableSForwardFlowResponseInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly SForwardFlowResponseInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
int Page => info.Page;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
int PageSize => info.PageSize;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
int Count => info.Count;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
List<SForwardFlowItemInfo> Data => info.Data;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableSForwardFlowResponseInfo(int page, int pageSize, int count, List<SForwardFlowItemInfo> data)
|
||||||
|
{
|
||||||
|
var info = new SForwardFlowResponseInfo
|
||||||
|
{
|
||||||
|
Page = page,
|
||||||
|
PageSize = pageSize,
|
||||||
|
Count = count,
|
||||||
|
Data = data
|
||||||
|
};
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableSForwardFlowResponseInfo(SForwardFlowResponseInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class SForwardFlowResponseInfoFormatter : MemoryPackFormatter<SForwardFlowResponseInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref SForwardFlowResponseInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableSForwardFlowResponseInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref SForwardFlowResponseInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableSForwardFlowResponseInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
269
linker.messenger.serializer.memorypack/ForwardSerializer.cs
Normal file
269
linker.messenger.serializer.memorypack/ForwardSerializer.cs
Normal file
@@ -0,0 +1,269 @@
|
|||||||
|
using MemoryPack;
|
||||||
|
using System.Net;
|
||||||
|
using linker.messenger.forward;
|
||||||
|
|
||||||
|
namespace linker.messenger.serializer.memorypack
|
||||||
|
{
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableForwardInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly ForwardInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
uint Id => info.Id;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string Name => info.Name;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string MachineId => info.MachineId;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string GroupId => info.GroupId;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string MachineName => info.MachineName;
|
||||||
|
|
||||||
|
[MemoryPackInclude, MemoryPackAllowSerialize]
|
||||||
|
IPAddress BindIPAddress => info.BindIPAddress;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
int Port => info.Port;
|
||||||
|
|
||||||
|
[MemoryPackInclude, MemoryPackAllowSerialize]
|
||||||
|
IPEndPoint TargetEP => info.TargetEP;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
bool Started => info.Started;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
byte BufferSize => info.BufferSize;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string Msg => info.Msg;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string TargetMsg => info.TargetMsg;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableForwardInfo(uint id, string name, string machineId, string groupId, string machineName, IPAddress bindIPAddress, int port, IPEndPoint targetEP, bool started, byte bufferSize, string msg, string targetMsg)
|
||||||
|
{
|
||||||
|
this.info = new ForwardInfo
|
||||||
|
{
|
||||||
|
Name = name,
|
||||||
|
BufferSize = bufferSize,
|
||||||
|
Id = id,
|
||||||
|
Started = started,
|
||||||
|
BindIPAddress = bindIPAddress,
|
||||||
|
GroupId = groupId,
|
||||||
|
MachineId = machineId,
|
||||||
|
MachineName = machineName,
|
||||||
|
Msg = msg,
|
||||||
|
Port = port,
|
||||||
|
TargetEP = targetEP,
|
||||||
|
TargetMsg = targetMsg
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableForwardInfo(ForwardInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class ForwardInfoFormatter : MemoryPackFormatter<ForwardInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref ForwardInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableForwardInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref ForwardInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableForwardInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableForwardAddForwardInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly ForwardAddForwardInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string MachineId => info.MachineId;
|
||||||
|
|
||||||
|
[MemoryPackInclude, MemoryPackAllowSerialize]
|
||||||
|
ForwardInfo Data => info.Data;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableForwardAddForwardInfo(string machineId, ForwardInfo data)
|
||||||
|
{
|
||||||
|
this.info = new ForwardAddForwardInfo
|
||||||
|
{
|
||||||
|
MachineId = machineId,
|
||||||
|
Data = data
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableForwardAddForwardInfo(ForwardAddForwardInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class ForwardAddForwardInfoFormatter : MemoryPackFormatter<ForwardAddForwardInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref ForwardAddForwardInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableForwardAddForwardInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref ForwardAddForwardInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableForwardAddForwardInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableForwardRemoveForwardInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly ForwardRemoveForwardInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string MachineId => info.MachineId;
|
||||||
|
|
||||||
|
[MemoryPackInclude, MemoryPackAllowSerialize]
|
||||||
|
uint Id => info.Id;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableForwardRemoveForwardInfo(string machineId, uint id)
|
||||||
|
{
|
||||||
|
this.info = new ForwardRemoveForwardInfo
|
||||||
|
{
|
||||||
|
MachineId = machineId,
|
||||||
|
Id = id
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableForwardRemoveForwardInfo(ForwardRemoveForwardInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class ForwardRemoveForwardInfoFormatter : MemoryPackFormatter<ForwardRemoveForwardInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref ForwardRemoveForwardInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableForwardRemoveForwardInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref ForwardRemoveForwardInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableForwardRemoveForwardInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableForwardCountInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly ForwardCountInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string MachineId => info.MachineId;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
int Count => info.Count;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableForwardCountInfo(string machineId, int count)
|
||||||
|
{
|
||||||
|
this.info = new ForwardCountInfo
|
||||||
|
{
|
||||||
|
MachineId = machineId,
|
||||||
|
Count = count
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableForwardCountInfo(ForwardCountInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class ForwardCountInfoFormatter : MemoryPackFormatter<ForwardCountInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref ForwardCountInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableForwardCountInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref ForwardCountInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableForwardCountInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
444
linker.messenger.serializer.memorypack/SForwardSerializer.cs
Normal file
444
linker.messenger.serializer.memorypack/SForwardSerializer.cs
Normal file
@@ -0,0 +1,444 @@
|
|||||||
|
using MemoryPack;
|
||||||
|
using linker.messenger.sforward;
|
||||||
|
using System.Net;
|
||||||
|
|
||||||
|
namespace linker.messenger.serializer.memorypack
|
||||||
|
{
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableSForwardInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly SForwardInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
uint Id => info.Id;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string Name => info.Name;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string Domain => info.Domain;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
int RemotePort => info.RemotePort;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
byte BufferSize => info.BufferSize;
|
||||||
|
|
||||||
|
[MemoryPackInclude, MemoryPackAllowSerialize]
|
||||||
|
IPEndPoint LocalEP => info.LocalEP;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
bool Started => info.Started;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string Msg => info.Msg;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string LocalMsg => info.LocalMsg;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
int RemotePortMin => info.RemotePortMin;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
int RemotePortMax => info.RemotePortMax;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableSForwardInfo(uint id, string name, string domain, int remotePort, byte bufferSize, IPEndPoint localEP, bool started, string msg, string localMsg, int remotePortMin, int remotePortMax)
|
||||||
|
{
|
||||||
|
this.info = new SForwardInfo
|
||||||
|
{
|
||||||
|
LocalEP = localEP,
|
||||||
|
RemotePort = remotePort,
|
||||||
|
RemotePortMax = remotePortMax,
|
||||||
|
Name = name,
|
||||||
|
BufferSize = bufferSize,
|
||||||
|
Domain = domain,
|
||||||
|
Id = id,
|
||||||
|
LocalMsg = localMsg,
|
||||||
|
Msg = localMsg,
|
||||||
|
RemotePortMin = remotePortMin,
|
||||||
|
Started = started,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableSForwardInfo(SForwardInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class SForwardInfoFormatter : MemoryPackFormatter<SForwardInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref SForwardInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableSForwardInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref SForwardInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableSForwardInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableSForwardAddInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly SForwardAddInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string Domain => info.Domain;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
int RemotePort => info.RemotePort;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string SecretKey => info.SecretKey;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableSForwardAddInfo(string domain, int remotePort, string secretKey)
|
||||||
|
{
|
||||||
|
this.info = new SForwardAddInfo
|
||||||
|
{
|
||||||
|
RemotePort = remotePort,
|
||||||
|
Domain = domain,
|
||||||
|
SecretKey = secretKey
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableSForwardAddInfo(SForwardAddInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class SForwardAddInfoFormatter : MemoryPackFormatter<SForwardAddInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref SForwardAddInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableSForwardAddInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref SForwardAddInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableSForwardAddInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableSForwardAddResultInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly SForwardAddResultInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
bool Success => info.Success;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string Message => info.Message;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
byte BufferSize => info.BufferSize;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableSForwardAddResultInfo(bool success, string message, byte bufferSize)
|
||||||
|
{
|
||||||
|
this.info = new SForwardAddResultInfo
|
||||||
|
{
|
||||||
|
BufferSize = bufferSize,
|
||||||
|
Message = message,
|
||||||
|
Success = success
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableSForwardAddResultInfo(SForwardAddResultInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class SForwardAddResultInfoFormatter : MemoryPackFormatter<SForwardAddResultInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref SForwardAddResultInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableSForwardAddResultInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref SForwardAddResultInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableSForwardAddResultInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableSForwardAddForwardInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly SForwardAddForwardInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string MachineId => info.MachineId;
|
||||||
|
|
||||||
|
[MemoryPackInclude, MemoryPackAllowSerialize]
|
||||||
|
SForwardInfo Data => info.Data;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableSForwardAddForwardInfo(string machineId, SForwardInfo data)
|
||||||
|
{
|
||||||
|
this.info = new SForwardAddForwardInfo
|
||||||
|
{
|
||||||
|
MachineId = machineId,
|
||||||
|
Data = data
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableSForwardAddForwardInfo(SForwardAddForwardInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class SForwardAddForwardInfoFormatter : MemoryPackFormatter<SForwardAddForwardInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref SForwardAddForwardInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableSForwardAddForwardInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref SForwardAddForwardInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableSForwardAddForwardInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableSForwardRemoveForwardInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly SForwardRemoveForwardInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string MachineId => info.MachineId;
|
||||||
|
|
||||||
|
[MemoryPackInclude, MemoryPackAllowSerialize]
|
||||||
|
uint Id => info.Id;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableSForwardRemoveForwardInfo(string machineId, uint id)
|
||||||
|
{
|
||||||
|
this.info = new SForwardRemoveForwardInfo
|
||||||
|
{
|
||||||
|
MachineId = machineId,
|
||||||
|
Id = id
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableSForwardRemoveForwardInfo(SForwardRemoveForwardInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class SForwardRemoveForwardInfoFormatter : MemoryPackFormatter<SForwardRemoveForwardInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref SForwardRemoveForwardInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableSForwardRemoveForwardInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref SForwardRemoveForwardInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableSForwardRemoveForwardInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableSForwardProxyInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly SForwardProxyInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
ulong Id => info.Id;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string Domain => info.Domain;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
int RemotePort => info.RemotePort;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
byte BufferSize => info.BufferSize;
|
||||||
|
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableSForwardProxyInfo(ulong id, string domain, int remotePort, byte bufferSize)
|
||||||
|
{
|
||||||
|
this.info = new SForwardProxyInfo
|
||||||
|
{
|
||||||
|
Id = id,
|
||||||
|
BufferSize = bufferSize,
|
||||||
|
Domain = domain,
|
||||||
|
RemotePort = remotePort
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableSForwardProxyInfo(SForwardProxyInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class SForwardProxyInfoFormatter : MemoryPackFormatter<SForwardProxyInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref SForwardProxyInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableSForwardProxyInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref SForwardProxyInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableSForwardProxyInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableSForwardCountInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly SForwardCountInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string MachineId => info.MachineId;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
int Count => info.Count;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableSForwardCountInfo(string machineId, int count)
|
||||||
|
{
|
||||||
|
this.info = new SForwardCountInfo
|
||||||
|
{
|
||||||
|
MachineId = machineId,
|
||||||
|
Count = count
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableSForwardCountInfo(SForwardCountInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class SForwardCountInfoFormatter : MemoryPackFormatter<SForwardCountInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref SForwardCountInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableSForwardCountInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref SForwardCountInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableSForwardCountInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
535
linker.messenger.serializer.memorypack/TuntapSerializer.cs
Normal file
535
linker.messenger.serializer.memorypack/TuntapSerializer.cs
Normal file
@@ -0,0 +1,535 @@
|
|||||||
|
using MemoryPack;
|
||||||
|
using linker.messenger.tuntap;
|
||||||
|
using System.Net;
|
||||||
|
using linker.messenger.tuntap.lease;
|
||||||
|
|
||||||
|
namespace linker.messenger.serializer.memorypack
|
||||||
|
{
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableTuntapVeaLanIPAddress
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly TuntapVeaLanIPAddress info;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
uint IPAddress => info.IPAddress;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
byte PrefixLength => info.PrefixLength;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
uint MaskValue => info.MaskValue;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
uint NetWork => info.NetWork;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
uint Broadcast => info.Broadcast;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableTuntapVeaLanIPAddress(uint ipAddress, byte prefixLength, uint maskValue, uint netWork, uint broadcast)
|
||||||
|
{
|
||||||
|
var info = new TuntapVeaLanIPAddress
|
||||||
|
{
|
||||||
|
Broadcast = broadcast,
|
||||||
|
IPAddress = ipAddress,
|
||||||
|
PrefixLength = prefixLength,
|
||||||
|
MaskValue = maskValue,
|
||||||
|
NetWork = netWork,
|
||||||
|
};
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableTuntapVeaLanIPAddress(TuntapVeaLanIPAddress info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class TuntapVeaLanIPAddressFormatter : MemoryPackFormatter<TuntapVeaLanIPAddress>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref TuntapVeaLanIPAddress value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableTuntapVeaLanIPAddress(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref TuntapVeaLanIPAddress value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableTuntapVeaLanIPAddress>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableTuntapVeaLanIPAddressList
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly TuntapVeaLanIPAddressList info;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string MachineId => info.MachineId;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
List<TuntapVeaLanIPAddress> IPS => info.IPS;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableTuntapVeaLanIPAddressList(string machineId, List<TuntapVeaLanIPAddress> ips)
|
||||||
|
{
|
||||||
|
var info = new TuntapVeaLanIPAddressList
|
||||||
|
{
|
||||||
|
IPS = ips,
|
||||||
|
MachineId = machineId
|
||||||
|
};
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableTuntapVeaLanIPAddressList(TuntapVeaLanIPAddressList info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class TuntapVeaLanIPAddressListFormatter : MemoryPackFormatter<TuntapVeaLanIPAddressList>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref TuntapVeaLanIPAddressList value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableTuntapVeaLanIPAddressList(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref TuntapVeaLanIPAddressList value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableTuntapVeaLanIPAddressList>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableTuntapInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly TuntapInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string MachineId => info.MachineId;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
TuntapStatus Status => info.Status;
|
||||||
|
|
||||||
|
[MemoryPackInclude, MemoryPackAllowSerialize]
|
||||||
|
IPAddress IP => info.IP;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
byte PrefixLength => info.PrefixLength;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
List<TuntapLanInfo> Lans => info.Lans;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string SetupError => info.SetupError;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string NatError => info.NatError;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string SystemInfo => info.SystemInfo;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
List<TuntapForwardInfo> Forwards => info.Forwards;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
TuntapSwitch Switch => info.Switch;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableTuntapInfo(string machineId, TuntapStatus status, IPAddress ip, byte prefixLength,
|
||||||
|
List<TuntapLanInfo> lans, string setupError, string natError, string systemInfo, List<TuntapForwardInfo> forwards, TuntapSwitch Switch)
|
||||||
|
{
|
||||||
|
var info = new TuntapInfo
|
||||||
|
{
|
||||||
|
MachineId = machineId,
|
||||||
|
Lans = lans,
|
||||||
|
Forwards = forwards,
|
||||||
|
IP = ip,
|
||||||
|
NatError = natError,
|
||||||
|
SystemInfo = systemInfo,
|
||||||
|
SetupError = setupError,
|
||||||
|
PrefixLength = prefixLength,
|
||||||
|
Status = status,
|
||||||
|
Switch = Switch,
|
||||||
|
};
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableTuntapInfo(TuntapInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class TuntapInfoFormatter : MemoryPackFormatter<TuntapInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref TuntapInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableTuntapInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref TuntapInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableTuntapInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableTuntapForwardInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly TuntapForwardInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude, MemoryPackAllowSerialize]
|
||||||
|
IPAddress ListenAddr => info.ListenAddr;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
int ListenPort => info.ListenPort;
|
||||||
|
|
||||||
|
[MemoryPackInclude, MemoryPackAllowSerialize]
|
||||||
|
IPAddress ConnectAddr => info.ConnectAddr;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
int ConnectPort => info.ConnectPort;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string Remark => info.Remark;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableTuntapForwardInfo(IPAddress listenAddr, int listenPort, IPAddress connectAddr, int connectPort, string remark)
|
||||||
|
{
|
||||||
|
var info = new TuntapForwardInfo
|
||||||
|
{
|
||||||
|
ConnectAddr = connectAddr,
|
||||||
|
ConnectPort = connectPort,
|
||||||
|
ListenAddr = listenAddr,
|
||||||
|
ListenPort = listenPort,
|
||||||
|
Remark = remark
|
||||||
|
};
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableTuntapForwardInfo(TuntapForwardInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class TuntapForwardInfoFormatter : MemoryPackFormatter<TuntapForwardInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref TuntapForwardInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableTuntapForwardInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref TuntapForwardInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableTuntapForwardInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableTuntapForwardTestWrapInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly TuntapForwardTestWrapInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude, MemoryPackAllowSerialize]
|
||||||
|
string MachineId => info.MachineId;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
List<TuntapForwardTestInfo> List => info.List;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableTuntapForwardTestWrapInfo(string machineId, List<TuntapForwardTestInfo> list)
|
||||||
|
{
|
||||||
|
var info = new TuntapForwardTestWrapInfo
|
||||||
|
{
|
||||||
|
MachineId = machineId,
|
||||||
|
List = list
|
||||||
|
};
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableTuntapForwardTestWrapInfo(TuntapForwardTestWrapInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class TuntapForwardTestWrapInfoFormatter : MemoryPackFormatter<TuntapForwardTestWrapInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref TuntapForwardTestWrapInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableTuntapForwardTestWrapInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref TuntapForwardTestWrapInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableTuntapForwardTestWrapInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableTuntapForwardTestInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly TuntapForwardTestInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
int ListenPort => info.ListenPort;
|
||||||
|
|
||||||
|
[MemoryPackInclude, MemoryPackAllowSerialize]
|
||||||
|
IPAddress ConnectAddr => info.ConnectAddr;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
int ConnectPort => info.ConnectPort;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string Error => info.Error;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableTuntapForwardTestInfo(int listenPort, IPAddress connectAddr, int connectPort, string error)
|
||||||
|
{
|
||||||
|
var info = new TuntapForwardTestInfo
|
||||||
|
{
|
||||||
|
ConnectAddr = connectAddr,
|
||||||
|
ConnectPort = connectPort,
|
||||||
|
ListenPort = listenPort,
|
||||||
|
Error = error
|
||||||
|
};
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableTuntapForwardTestInfo(TuntapForwardTestInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class TuntapForwardTestInfoFormatter : MemoryPackFormatter<TuntapForwardTestInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref TuntapForwardTestInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableTuntapForwardTestInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref TuntapForwardTestInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableTuntapForwardTestInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableTuntapLanInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly TuntapLanInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude, MemoryPackAllowSerialize]
|
||||||
|
IPAddress IP => info.IP;
|
||||||
|
|
||||||
|
[MemoryPackInclude, MemoryPackAllowSerialize]
|
||||||
|
byte PrefixLength => info.PrefixLength;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
bool Disabled => info.Disabled;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
bool Exists => info.Exists;
|
||||||
|
|
||||||
|
[MemoryPackInclude]
|
||||||
|
string Error => info.Error;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableTuntapLanInfo(IPAddress ip, byte prefixLength, bool disabled, bool exists, string error)
|
||||||
|
{
|
||||||
|
var info = new TuntapLanInfo
|
||||||
|
{
|
||||||
|
Disabled = disabled,
|
||||||
|
Exists = exists,
|
||||||
|
IP = ip,
|
||||||
|
PrefixLength = prefixLength,
|
||||||
|
Error = error
|
||||||
|
};
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableTuntapLanInfo(TuntapLanInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class TuntapLanInfoFormatter : MemoryPackFormatter<TuntapLanInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref TuntapLanInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableTuntapLanInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref TuntapLanInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableTuntapLanInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[MemoryPackable]
|
||||||
|
public readonly partial struct SerializableLeaseInfo
|
||||||
|
{
|
||||||
|
[MemoryPackIgnore]
|
||||||
|
public readonly LeaseInfo info;
|
||||||
|
|
||||||
|
[MemoryPackInclude, MemoryPackAllowSerialize]
|
||||||
|
IPAddress IP => info.IP;
|
||||||
|
|
||||||
|
[MemoryPackInclude, MemoryPackAllowSerialize]
|
||||||
|
byte PrefixLength => info.PrefixLength;
|
||||||
|
|
||||||
|
[MemoryPackConstructor]
|
||||||
|
SerializableLeaseInfo(IPAddress ip, byte prefixLength)
|
||||||
|
{
|
||||||
|
var info = new LeaseInfo
|
||||||
|
{
|
||||||
|
IP = ip,
|
||||||
|
PrefixLength = prefixLength
|
||||||
|
};
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableLeaseInfo(LeaseInfo info)
|
||||||
|
{
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class LeaseInfoFormatter : MemoryPackFormatter<LeaseInfo>
|
||||||
|
{
|
||||||
|
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref LeaseInfo value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
writer.WriteNullObjectHeader();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.WritePackable(new SerializableLeaseInfo(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Deserialize(ref MemoryPackReader reader, scoped ref LeaseInfo value)
|
||||||
|
{
|
||||||
|
if (reader.PeekIsNull())
|
||||||
|
{
|
||||||
|
reader.Advance(1); // skip null block
|
||||||
|
value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapped = reader.ReadPackable<SerializableLeaseInfo>();
|
||||||
|
value = wrapped.info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -37,14 +37,17 @@
|
|||||||
<ProjectReference Include="..\linker.libs\linker.libs.csproj" />
|
<ProjectReference Include="..\linker.libs\linker.libs.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.access\linker.messenger.access.csproj" />
|
<ProjectReference Include="..\linker.messenger.access\linker.messenger.access.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.decenter\linker.messenger.decenter.csproj" />
|
<ProjectReference Include="..\linker.messenger.decenter\linker.messenger.decenter.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.flow\linker.messenger.flow.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.forward\linker.messenger.forward.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.relay\linker.messenger.relay.csproj" />
|
<ProjectReference Include="..\linker.messenger.relay\linker.messenger.relay.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.sforward\linker.messenger.sforward.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.signin\linker.messenger.signin.csproj" />
|
<ProjectReference Include="..\linker.messenger.signin\linker.messenger.signin.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.socks5\linker.messenger.socks5.csproj" />
|
<ProjectReference Include="..\linker.messenger.socks5\linker.messenger.socks5.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.sync\linker.messenger.sync.csproj" />
|
<ProjectReference Include="..\linker.messenger.sync\linker.messenger.sync.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.tunnel\linker.messenger.tunnel.csproj" />
|
<ProjectReference Include="..\linker.messenger.tunnel\linker.messenger.tunnel.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.tuntap\linker.messenger.tuntap.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.updater\linker.messenger.updater.csproj" />
|
<ProjectReference Include="..\linker.messenger.updater\linker.messenger.updater.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger\linker.messenger.csproj" />
|
<ProjectReference Include="..\linker.messenger\linker.messenger.csproj" />
|
||||||
<ProjectReference Include="..\linker.signin\linker.messenger.signin.csproj" />
|
|
||||||
<ProjectReference Include="..\linker.tunnel\linker.tunnel.csproj" />
|
<ProjectReference Include="..\linker.tunnel\linker.tunnel.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
@@ -1,21 +1,9 @@
|
|||||||
using linker.libs;
|
using linker.libs;
|
||||||
using LiteDB;
|
|
||||||
using MemoryPack;
|
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Text.Json.Serialization;
|
|
||||||
|
|
||||||
|
|
||||||
namespace linker.client.config
|
namespace linker.messenger.sforward
|
||||||
{
|
{
|
||||||
public sealed partial class RunningConfigInfo
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 服务器穿透列表
|
|
||||||
/// </summary>
|
|
||||||
public List<SForwardInfo> SForwards { get; set; } = new List<SForwardInfo>();
|
|
||||||
}
|
|
||||||
|
|
||||||
[MemoryPackable]
|
|
||||||
public sealed partial class SForwardInfo
|
public sealed partial class SForwardInfo
|
||||||
{
|
{
|
||||||
public SForwardInfo() { }
|
public SForwardInfo() { }
|
||||||
@@ -42,7 +30,6 @@ namespace linker.client.config
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 本地服务
|
/// 本地服务
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[MemoryPackAllowSerialize]
|
|
||||||
public IPEndPoint LocalEP { get; set; }
|
public IPEndPoint LocalEP { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 已启动
|
/// 已启动
|
||||||
@@ -57,7 +44,6 @@ namespace linker.client.config
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string LocalMsg { get; set; }
|
public string LocalMsg { get; set; }
|
||||||
|
|
||||||
[JsonIgnore, BsonIgnore, MemoryPackIgnore]
|
|
||||||
public bool Proxy { get; set; }
|
public bool Proxy { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -69,28 +55,6 @@ namespace linker.client.config
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public int RemotePortMax { get; set; }
|
public int RemotePortMax { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace linker.config
|
|
||||||
{
|
|
||||||
public sealed partial class ConfigClientInfo
|
|
||||||
{
|
|
||||||
public SForwardConfigInfo SForward { get; set; } = new SForwardConfigInfo();
|
|
||||||
}
|
|
||||||
public sealed class SForwardConfigInfo
|
|
||||||
{
|
|
||||||
public string SecretKey { get; set; } = Helper.GlobalString;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public partial class ConfigServerInfo
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 服务器穿透配置
|
|
||||||
/// </summary>
|
|
||||||
public SForwardConfigServerInfo SForward { get; set; } = new SForwardConfigServerInfo();
|
|
||||||
}
|
|
||||||
public sealed class SForwardConfigServerInfo
|
public sealed class SForwardConfigServerInfo
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -116,14 +80,9 @@ namespace linker.config
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace linker.plugins.sforward.config
|
|
||||||
{
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 往服务器添加穿透
|
/// 往服务器添加穿透
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[MemoryPackable]
|
|
||||||
public sealed partial class SForwardAddInfo
|
public sealed partial class SForwardAddInfo
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -139,11 +98,9 @@ namespace linker.plugins.sforward.config
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string SecretKey { get; set; }
|
public string SecretKey { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 添加穿透结果
|
/// 添加穿透结果
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[MemoryPackable]
|
|
||||||
public sealed partial class SForwardAddResultInfo
|
public sealed partial class SForwardAddResultInfo
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -160,10 +117,20 @@ namespace linker.plugins.sforward.config
|
|||||||
public byte BufferSize { get; set; }
|
public byte BufferSize { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public sealed partial class SForwardAddForwardInfo
|
||||||
|
{
|
||||||
|
public string MachineId { get; set; }
|
||||||
|
public SForwardInfo Data { get; set; }
|
||||||
|
}
|
||||||
|
public sealed partial class SForwardRemoveForwardInfo
|
||||||
|
{
|
||||||
|
public string MachineId { get; set; }
|
||||||
|
public uint Id { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 服务器穿透代理信息
|
/// 服务器穿透代理信息
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[MemoryPackable]
|
|
||||||
public sealed partial class SForwardProxyInfo
|
public sealed partial class SForwardProxyInfo
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -183,4 +150,15 @@ namespace linker.plugins.sforward.config
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public byte BufferSize { get; set; } = 3;
|
public byte BufferSize { get; set; } = 3;
|
||||||
}
|
}
|
||||||
|
public sealed class SForwardConfigClientInfo
|
||||||
|
{
|
||||||
|
public string SecretKey { get; set; } = Helper.GlobalString;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public sealed partial class SForwardCountInfo
|
||||||
|
{
|
||||||
|
public string MachineId { get; set; }
|
||||||
|
public int Count { get; set; }
|
||||||
|
}
|
||||||
}
|
}
|
75
linker.messenger.sforward/Entry.cs
Normal file
75
linker.messenger.sforward/Entry.cs
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
using linker.messenger.api;
|
||||||
|
using linker.messenger.decenter;
|
||||||
|
using linker.messenger.sforward.client;
|
||||||
|
using linker.messenger.sforward.server;
|
||||||
|
using linker.messenger.sforward.server.validator;
|
||||||
|
using linker.messenger.sync;
|
||||||
|
using linker.plugins.sforward.messenger;
|
||||||
|
using linker.plugins.sforward.proxy;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
namespace linker.messenger.sforward
|
||||||
|
{
|
||||||
|
public static class Entry
|
||||||
|
{
|
||||||
|
public static ServiceCollection AddSForwardClient(this ServiceCollection serviceCollection)
|
||||||
|
{
|
||||||
|
serviceCollection.AddSingleton<SForwardApiController>();
|
||||||
|
|
||||||
|
serviceCollection.AddSingleton<SForwardClientTransfer>();
|
||||||
|
|
||||||
|
serviceCollection.AddSingleton<SForwardClientMessenger>();
|
||||||
|
|
||||||
|
serviceCollection.AddSingleton<SForwardSyncSecretKey>();
|
||||||
|
|
||||||
|
serviceCollection.AddSingleton<SForwardDecenter>();
|
||||||
|
|
||||||
|
|
||||||
|
serviceCollection.AddSingleton<SForwardProxy>();
|
||||||
|
|
||||||
|
return serviceCollection;
|
||||||
|
}
|
||||||
|
public static ServiceProvider UseSForwardClient(this ServiceProvider serviceProvider)
|
||||||
|
{
|
||||||
|
IApiServer apiServer = serviceProvider.GetService<IApiServer>();
|
||||||
|
apiServer.AddPlugins(new List<libs.api.IApiController> { serviceProvider.GetService<SForwardApiController>() });
|
||||||
|
|
||||||
|
SForwardClientTransfer sForwardClientTransfer = serviceProvider.GetService<SForwardClientTransfer>();
|
||||||
|
|
||||||
|
IMessengerResolver messengerResolver = serviceProvider.GetService<IMessengerResolver>();
|
||||||
|
messengerResolver.AddMessenger(new List<IMessenger> { serviceProvider.GetService<SForwardClientMessenger>() });
|
||||||
|
|
||||||
|
SyncTreansfer syncTransfer = serviceProvider.GetService<SyncTreansfer>();
|
||||||
|
syncTransfer.AddSyncs(new List<ISync> { serviceProvider.GetService<SForwardSyncSecretKey>() });
|
||||||
|
|
||||||
|
DecenterClientTransfer decenterClientTransfer = serviceProvider.GetService<DecenterClientTransfer>();
|
||||||
|
decenterClientTransfer.AddDecenters(new List<IDecenter> { serviceProvider.GetService<SForwardDecenter>() });
|
||||||
|
|
||||||
|
return serviceProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static ServiceCollection AddSForwardServer(this ServiceCollection serviceCollection)
|
||||||
|
{
|
||||||
|
serviceCollection.AddSingleton<SForwardServerMessenger>();
|
||||||
|
serviceCollection.AddSingleton<ISForwardServerCahing, SForwardServerCahing>();
|
||||||
|
serviceCollection.AddSingleton<SForwardValidatorTransfer>();
|
||||||
|
serviceCollection.AddSingleton<SForwardValidator>();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
serviceCollection.AddSingleton<SForwardProxy>();
|
||||||
|
|
||||||
|
return serviceCollection;
|
||||||
|
}
|
||||||
|
public static ServiceProvider UseSForwardServer(this ServiceProvider serviceProvider)
|
||||||
|
{
|
||||||
|
IMessengerResolver messengerResolver = serviceProvider.GetService<IMessengerResolver>();
|
||||||
|
messengerResolver.AddMessenger(new List<IMessenger> { serviceProvider.GetService<SForwardServerMessenger>() });
|
||||||
|
|
||||||
|
SForwardValidatorTransfer sForwardValidatorTransfer = serviceProvider.GetService<SForwardValidatorTransfer>();
|
||||||
|
sForwardValidatorTransfer.AddValidators(new List<ISForwardValidator> { serviceProvider.GetService<SForwardValidator>() });
|
||||||
|
|
||||||
|
return serviceProvider;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
21
linker.messenger.sforward/client/ISForwardClientStore.cs
Normal file
21
linker.messenger.sforward/client/ISForwardClientStore.cs
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
namespace linker.messenger.sforward.client
|
||||||
|
{
|
||||||
|
public interface ISForwardClientStore
|
||||||
|
{
|
||||||
|
public string SecretKey { get; }
|
||||||
|
|
||||||
|
public bool SetSecretKey(string key);
|
||||||
|
|
||||||
|
public int Count();
|
||||||
|
|
||||||
|
public List<SForwardInfo> Get();
|
||||||
|
public SForwardInfo Get(uint id);
|
||||||
|
public SForwardInfo Get(string domain);
|
||||||
|
public SForwardInfo Get(int port);
|
||||||
|
public bool Add(SForwardInfo info);
|
||||||
|
public bool Update(SForwardInfo info);
|
||||||
|
public bool Remove(uint id);
|
||||||
|
|
||||||
|
public bool Confirm();
|
||||||
|
}
|
||||||
|
}
|
@@ -1,35 +1,34 @@
|
|||||||
using linker.libs.api;
|
using linker.libs.api;
|
||||||
using linker.libs.extends;
|
using linker.libs.extends;
|
||||||
using linker.client.config;
|
|
||||||
using linker.serializer;
|
|
||||||
using linker.plugins.sforward.messenger;
|
using linker.plugins.sforward.messenger;
|
||||||
using linker.plugins.client;
|
|
||||||
using linker.plugins.capi;
|
|
||||||
using linker.config;
|
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using linker.plugins.access;
|
|
||||||
using linker.messenger;
|
|
||||||
using linker.messenger.signin;
|
using linker.messenger.signin;
|
||||||
|
using linker.libs;
|
||||||
|
using linker.messenger.api;
|
||||||
|
|
||||||
namespace linker.plugins.sforward
|
namespace linker.messenger.sforward.client
|
||||||
{
|
{
|
||||||
public sealed class SForwardClientApiController : IApiClientController
|
public sealed class SForwardApiController : IApiController
|
||||||
{
|
{
|
||||||
private readonly SForwardTransfer forwardTransfer;
|
private readonly SForwardClientTransfer forwardTransfer;
|
||||||
private readonly IMessengerSender messengerSender;
|
private readonly IMessengerSender messengerSender;
|
||||||
private readonly SignInClientState signInClientState;
|
private readonly SignInClientState signInClientState;
|
||||||
private readonly AccessTransfer accessTransfer;
|
|
||||||
private readonly ISignInClientStore signInClientStore;
|
private readonly ISignInClientStore signInClientStore;
|
||||||
private readonly SForwardDecenter sForwardDecenter;
|
private readonly SForwardDecenter sForwardDecenter;
|
||||||
|
private readonly ISForwardClientStore sForwardClientStore;
|
||||||
|
private readonly ISerializer serializer;
|
||||||
|
private readonly IAccessStore accessStore;
|
||||||
|
|
||||||
public SForwardClientApiController(SForwardTransfer forwardTransfer, IMessengerSender messengerSender, SignInClientState signInClientState, AccessTransfer accessTransfer, ISignInClientStore signInClientStore, SForwardDecenter sForwardDecenter)
|
public SForwardApiController(SForwardClientTransfer forwardTransfer, IMessengerSender messengerSender, SignInClientState signInClientState, ISignInClientStore signInClientStore, SForwardDecenter sForwardDecenter, ISForwardClientStore sForwardClientStore, ISerializer serializer, IAccessStore accessStore)
|
||||||
{
|
{
|
||||||
this.forwardTransfer = forwardTransfer;
|
this.forwardTransfer = forwardTransfer;
|
||||||
this.messengerSender = messengerSender;
|
this.messengerSender = messengerSender;
|
||||||
this.signInClientState = signInClientState;
|
this.signInClientState = signInClientState;
|
||||||
this.accessTransfer = accessTransfer;
|
|
||||||
this.signInClientStore = signInClientStore;
|
this.signInClientStore = signInClientStore;
|
||||||
this.sForwardDecenter = sForwardDecenter;
|
this.sForwardDecenter = sForwardDecenter;
|
||||||
|
this.sForwardClientStore = sForwardClientStore;
|
||||||
|
this.serializer = serializer;
|
||||||
|
this.accessStore = accessStore;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -39,16 +38,16 @@ namespace linker.plugins.sforward
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public string GetSecretKey(ApiControllerParamsInfo param)
|
public string GetSecretKey(ApiControllerParamsInfo param)
|
||||||
{
|
{
|
||||||
return forwardTransfer.SecretKey;
|
return sForwardClientStore.SecretKey;
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 设置密钥
|
/// 设置密钥
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="param"></param>
|
/// <param name="param"></param>
|
||||||
[ClientApiAccessAttribute(ClientApiAccess.Config)]
|
[Access(AccessValue.Config)]
|
||||||
public void SetSecretKey(ApiControllerParamsInfo param)
|
public void SetSecretKey(ApiControllerParamsInfo param)
|
||||||
{
|
{
|
||||||
forwardTransfer.SetSecretKey(param.Content);
|
sForwardClientStore.SetSecretKey(param.Content);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -84,20 +83,20 @@ namespace linker.plugins.sforward
|
|||||||
{
|
{
|
||||||
if (param.Content == signInClientStore.Id)
|
if (param.Content == signInClientStore.Id)
|
||||||
{
|
{
|
||||||
if (accessTransfer.HasAccess(ClientApiAccess.ForwardShowSelf) == false) return new List<SForwardInfo>();
|
if (accessStore.HasAccess(AccessValue.ForwardShowSelf) == false) return new List<SForwardInfo>();
|
||||||
return forwardTransfer.Get();
|
return sForwardClientStore.Get();
|
||||||
}
|
}
|
||||||
if (accessTransfer.HasAccess(ClientApiAccess.ForwardShowOther) == false) return new List<SForwardInfo>();
|
|
||||||
|
|
||||||
|
if (accessStore.HasAccess(AccessValue.ForwardShowOther) == false) return new List<SForwardInfo>();
|
||||||
var resp = await messengerSender.SendReply(new MessageRequestWrap
|
var resp = await messengerSender.SendReply(new MessageRequestWrap
|
||||||
{
|
{
|
||||||
Connection = signInClientState.Connection,
|
Connection = signInClientState.Connection,
|
||||||
MessengerId = (ushort)SForwardMessengerIds.GetForward,
|
MessengerId = (ushort)SForwardMessengerIds.GetForward,
|
||||||
Payload = Serializer.Serialize(param.Content)
|
Payload = serializer.Serialize(param.Content)
|
||||||
});
|
});
|
||||||
if (resp.Code == MessageResponeCodes.OK)
|
if (resp.Code == MessageResponeCodes.OK)
|
||||||
{
|
{
|
||||||
return Serializer.Deserialize<List<SForwardInfo>>(resp.Data.Span);
|
return serializer.Deserialize<List<SForwardInfo>>(resp.Data.Span);
|
||||||
}
|
}
|
||||||
return new List<SForwardInfo>();
|
return new List<SForwardInfo>();
|
||||||
}
|
}
|
||||||
@@ -112,16 +111,15 @@ namespace linker.plugins.sforward
|
|||||||
SForwardAddForwardInfo info = param.Content.DeJson<SForwardAddForwardInfo>();
|
SForwardAddForwardInfo info = param.Content.DeJson<SForwardAddForwardInfo>();
|
||||||
if (info.MachineId == signInClientStore.Id)
|
if (info.MachineId == signInClientStore.Id)
|
||||||
{
|
{
|
||||||
if (accessTransfer.HasAccess(ClientApiAccess.ForwardSelf) == false) return false;
|
if (accessStore.HasAccess(AccessValue.ForwardSelf) == false) return false;
|
||||||
return forwardTransfer.Add(info.Data);
|
return forwardTransfer.Add(info.Data);
|
||||||
}
|
}
|
||||||
if (accessTransfer.HasAccess(ClientApiAccess.ForwardOther) == false) return false;
|
if (accessStore.HasAccess(AccessValue.ForwardOther) == false) return false;
|
||||||
|
|
||||||
return await messengerSender.SendOnly(new MessageRequestWrap
|
return await messengerSender.SendOnly(new MessageRequestWrap
|
||||||
{
|
{
|
||||||
Connection = signInClientState.Connection,
|
Connection = signInClientState.Connection,
|
||||||
MessengerId = (ushort)SForwardMessengerIds.AddClientForward,
|
MessengerId = (ushort)SForwardMessengerIds.AddClientForward,
|
||||||
Payload = Serializer.Serialize(info)
|
Payload = serializer.Serialize(info)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,16 +133,15 @@ namespace linker.plugins.sforward
|
|||||||
SForwardRemoveForwardInfo info = param.Content.DeJson<SForwardRemoveForwardInfo>();
|
SForwardRemoveForwardInfo info = param.Content.DeJson<SForwardRemoveForwardInfo>();
|
||||||
if (info.MachineId == signInClientStore.Id)
|
if (info.MachineId == signInClientStore.Id)
|
||||||
{
|
{
|
||||||
if (accessTransfer.HasAccess(ClientApiAccess.ForwardSelf) == false) return false;
|
if (accessStore.HasAccess(AccessValue.ForwardSelf) == false) return false;
|
||||||
return forwardTransfer.Remove(info.Id);
|
return forwardTransfer.Remove(info.Id);
|
||||||
}
|
}
|
||||||
|
if (accessStore.HasAccess(AccessValue.ForwardOther) == false) return false;
|
||||||
if (accessTransfer.HasAccess(ClientApiAccess.ForwardOther) == false) return false;
|
|
||||||
return await messengerSender.SendOnly(new MessageRequestWrap
|
return await messengerSender.SendOnly(new MessageRequestWrap
|
||||||
{
|
{
|
||||||
Connection = signInClientState.Connection,
|
Connection = signInClientState.Connection,
|
||||||
MessengerId = (ushort)SForwardMessengerIds.RemoveClientForward,
|
MessengerId = (ushort)SForwardMessengerIds.RemoveClientForward,
|
||||||
Payload = Serializer.Serialize(info)
|
Payload = serializer.Serialize(info)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -164,7 +161,7 @@ namespace linker.plugins.sforward
|
|||||||
{
|
{
|
||||||
Connection = signInClientState.Connection,
|
Connection = signInClientState.Connection,
|
||||||
MessengerId = (ushort)SForwardMessengerIds.TestClientForward,
|
MessengerId = (ushort)SForwardMessengerIds.TestClientForward,
|
||||||
Payload = Serializer.Serialize(param.Content)
|
Payload = serializer.Serialize(param.Content)
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
@@ -1,59 +1,44 @@
|
|||||||
using linker.client.config;
|
using linker.libs;
|
||||||
using linker.libs;
|
|
||||||
using linker.plugins.sforward.messenger;
|
using linker.plugins.sforward.messenger;
|
||||||
using linker.serializer;
|
|
||||||
using linker.plugins.sforward.config;
|
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using linker.libs.extends;
|
using linker.libs.extends;
|
||||||
using linker.plugins.client;
|
|
||||||
using linker.plugins.messenger;
|
|
||||||
using linker.config;
|
|
||||||
using linker.messenger;
|
|
||||||
using linker.messenger.signin;
|
using linker.messenger.signin;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace linker.plugins.sforward
|
namespace linker.messenger.sforward.client
|
||||||
{
|
{
|
||||||
public sealed class SForwardTransfer
|
public sealed class SForwardClientTransfer
|
||||||
{
|
{
|
||||||
public string SecretKey => fileConfig.Data.Client.SForward.SecretKey;
|
|
||||||
public int Count => running.Data.SForwards.Count;
|
|
||||||
|
|
||||||
public Action OnChanged { get; set; } = () => { };
|
public Action OnChanged { get; set; } = () => { };
|
||||||
|
|
||||||
private readonly FileConfig fileConfig;
|
|
||||||
private readonly RunningConfig running;
|
|
||||||
private readonly SignInClientState signInClientState;
|
private readonly SignInClientState signInClientState;
|
||||||
private readonly IMessengerSender messengerSender;
|
private readonly IMessengerSender messengerSender;
|
||||||
private readonly ISignInClientStore signInClientStore;
|
private readonly ISignInClientStore signInClientStore;
|
||||||
|
private readonly ISForwardClientStore sForwardClientStore;
|
||||||
|
private readonly ISerializer serializer;
|
||||||
|
|
||||||
private readonly NumberSpaceUInt32 ns = new NumberSpaceUInt32();
|
private readonly NumberSpaceUInt32 ns = new NumberSpaceUInt32();
|
||||||
private readonly OperatingManager operatingManager = new OperatingManager();
|
private readonly OperatingManager operatingManager = new OperatingManager();
|
||||||
|
|
||||||
public SForwardTransfer(FileConfig fileConfig, RunningConfig running, SignInClientState signInClientState, IMessengerSender messengerSender, ISignInClientStore signInClientStore)
|
public SForwardClientTransfer(SignInClientState signInClientState, IMessengerSender messengerSender, ISignInClientStore signInClientStore, ISForwardClientStore sForwardClientStore, ISerializer serializer)
|
||||||
{
|
{
|
||||||
this.fileConfig = fileConfig;
|
|
||||||
this.running = running;
|
|
||||||
this.signInClientState = signInClientState;
|
this.signInClientState = signInClientState;
|
||||||
this.messengerSender = messengerSender;
|
this.messengerSender = messengerSender;
|
||||||
this.signInClientStore = signInClientStore;
|
this.signInClientStore = signInClientStore;
|
||||||
|
this.sForwardClientStore = sForwardClientStore;
|
||||||
|
|
||||||
signInClientState.NetworkFirstEnabledHandle += () => Start();
|
signInClientState.NetworkFirstEnabledHandle += () => Start();
|
||||||
|
this.serializer = serializer;
|
||||||
}
|
|
||||||
|
|
||||||
public void SetSecretKey(string key)
|
|
||||||
{
|
|
||||||
fileConfig.Data.Client.SForward.SecretKey = key;
|
|
||||||
fileConfig.Data.Update();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Start()
|
private void Start()
|
||||||
{
|
{
|
||||||
uint maxid = running.Data.SForwards.Count > 0 ? running.Data.SForwards.Max(c => c.Id) : 1;
|
var list = sForwardClientStore.Get();
|
||||||
|
uint maxid = list.Count > 0 ? list.Max(c => c.Id) : 1;
|
||||||
ns.Reset(maxid);
|
ns.Reset(maxid);
|
||||||
|
|
||||||
foreach (var item in running.Data.SForwards)
|
foreach (var item in list)
|
||||||
{
|
{
|
||||||
if (item.Started)
|
if (item.Started)
|
||||||
{
|
{
|
||||||
@@ -63,7 +48,8 @@ namespace linker.plugins.sforward
|
|||||||
{
|
{
|
||||||
Stop(item);
|
Stop(item);
|
||||||
}
|
}
|
||||||
|
sForwardClientStore.Update(item);
|
||||||
|
sForwardClientStore.Confirm();
|
||||||
}
|
}
|
||||||
OnChanged();
|
OnChanged();
|
||||||
}
|
}
|
||||||
@@ -79,16 +65,18 @@ namespace linker.plugins.sforward
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||||
|
LoggerHelper.Instance.Info($"start sforward {forwardInfo.ToJson()}");
|
||||||
messengerSender.SendReply(new MessageRequestWrap
|
messengerSender.SendReply(new MessageRequestWrap
|
||||||
{
|
{
|
||||||
Connection = signInClientState.Connection,
|
Connection = signInClientState.Connection,
|
||||||
MessengerId = (ushort)SForwardMessengerIds.Add,
|
MessengerId = (ushort)SForwardMessengerIds.Add,
|
||||||
Payload = Serializer.Serialize(new SForwardAddInfo { Domain = forwardInfo.Domain, RemotePort = forwardInfo.RemotePort, SecretKey = fileConfig.Data.Client.SForward.SecretKey })
|
Payload = serializer.Serialize(new SForwardAddInfo { Domain = forwardInfo.Domain, RemotePort = forwardInfo.RemotePort, SecretKey = sForwardClientStore.SecretKey })
|
||||||
}).ContinueWith((result) =>
|
}).ContinueWith((result) =>
|
||||||
{
|
{
|
||||||
if (result.Result.Code == MessageResponeCodes.OK)
|
if (result.Result.Code == MessageResponeCodes.OK)
|
||||||
{
|
{
|
||||||
SForwardAddResultInfo sForwardAddResultInfo = Serializer.Deserialize<SForwardAddResultInfo>(result.Result.Data.Span);
|
SForwardAddResultInfo sForwardAddResultInfo = serializer.Deserialize<SForwardAddResultInfo>(result.Result.Data.Span);
|
||||||
forwardInfo.BufferSize = sForwardAddResultInfo.BufferSize;
|
forwardInfo.BufferSize = sForwardAddResultInfo.BufferSize;
|
||||||
if (sForwardAddResultInfo.Success)
|
if (sForwardAddResultInfo.Success)
|
||||||
{
|
{
|
||||||
@@ -110,7 +98,6 @@ namespace linker.plugins.sforward
|
|||||||
forwardInfo.Started = false;
|
forwardInfo.Started = false;
|
||||||
LoggerHelper.Instance.Error(ex);
|
LoggerHelper.Instance.Error(ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
OnChanged();
|
OnChanged();
|
||||||
}
|
}
|
||||||
private void Stop(SForwardInfo forwardInfo)
|
private void Stop(SForwardInfo forwardInfo)
|
||||||
@@ -119,16 +106,18 @@ namespace linker.plugins.sforward
|
|||||||
{
|
{
|
||||||
if (forwardInfo.Proxy)
|
if (forwardInfo.Proxy)
|
||||||
{
|
{
|
||||||
|
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||||
|
LoggerHelper.Instance.Info($"stop sforward {forwardInfo.ToJson()}");
|
||||||
messengerSender.SendReply(new MessageRequestWrap
|
messengerSender.SendReply(new MessageRequestWrap
|
||||||
{
|
{
|
||||||
Connection = signInClientState.Connection,
|
Connection = signInClientState.Connection,
|
||||||
MessengerId = (ushort)SForwardMessengerIds.Remove,
|
MessengerId = (ushort)SForwardMessengerIds.Remove,
|
||||||
Payload = Serializer.Serialize(new SForwardAddInfo { Domain = forwardInfo.Domain, RemotePort = forwardInfo.RemotePort, SecretKey = fileConfig.Data.Client.SForward.SecretKey })
|
Payload = serializer.Serialize(new SForwardAddInfo { Domain = forwardInfo.Domain, RemotePort = forwardInfo.RemotePort, SecretKey = sForwardClientStore.SecretKey })
|
||||||
}).ContinueWith((result) =>
|
}).ContinueWith((result) =>
|
||||||
{
|
{
|
||||||
if (result.Result.Code == MessageResponeCodes.OK)
|
if (result.Result.Code == MessageResponeCodes.OK)
|
||||||
{
|
{
|
||||||
SForwardAddResultInfo sForwardAddResultInfo = Serializer.Deserialize<SForwardAddResultInfo>(result.Result.Data.Span);
|
SForwardAddResultInfo sForwardAddResultInfo = serializer.Deserialize<SForwardAddResultInfo>(result.Result.Data.Span);
|
||||||
if (sForwardAddResultInfo.Success)
|
if (sForwardAddResultInfo.Success)
|
||||||
{
|
{
|
||||||
forwardInfo.Proxy = false;
|
forwardInfo.Proxy = false;
|
||||||
@@ -151,21 +140,20 @@ namespace linker.plugins.sforward
|
|||||||
OnChanged();
|
OnChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<SForwardInfo> Get()
|
|
||||||
{
|
|
||||||
return running.Data.SForwards;
|
|
||||||
}
|
|
||||||
public bool Add(SForwardInfo forwardInfo)
|
public bool Add(SForwardInfo forwardInfo)
|
||||||
{
|
{
|
||||||
//同名或者同端口,但是ID不一样
|
//同名或者同端口,但是ID不一样
|
||||||
SForwardInfo old = running.Data.SForwards.FirstOrDefault(c => (forwardInfo.RemotePort > 0 && c.RemotePort == forwardInfo.RemotePort) || (string.IsNullOrWhiteSpace(forwardInfo.Domain) == false && c.Domain == forwardInfo.Domain));
|
SForwardInfo old = sForwardClientStore.Get().FirstOrDefault(c => forwardInfo.RemotePort > 0 && c.RemotePort == forwardInfo.RemotePort || string.IsNullOrWhiteSpace(forwardInfo.Domain) == false && c.Domain == forwardInfo.Domain);
|
||||||
if (old != null && old.Id != forwardInfo.Id) return false;
|
if (old != null && old.Id != forwardInfo.Id) return false;
|
||||||
|
|
||||||
if (forwardInfo.Id != 0)
|
if (forwardInfo.Id != 0)
|
||||||
{
|
{
|
||||||
old = running.Data.SForwards.FirstOrDefault(c => c.Id == forwardInfo.Id);
|
old = sForwardClientStore.Get(forwardInfo.Id);
|
||||||
if (old == null) return false;
|
if (old == null) return false;
|
||||||
|
|
||||||
|
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||||
|
LoggerHelper.Instance.Info($"update sforward {old.ToJson()}->{forwardInfo.ToJson()}");
|
||||||
|
|
||||||
old.RemotePort = forwardInfo.RemotePort;
|
old.RemotePort = forwardInfo.RemotePort;
|
||||||
old.Name = forwardInfo.Name;
|
old.Name = forwardInfo.Name;
|
||||||
old.LocalEP = forwardInfo.LocalEP;
|
old.LocalEP = forwardInfo.LocalEP;
|
||||||
@@ -177,6 +165,7 @@ namespace linker.plugins.sforward
|
|||||||
old.RemotePortMin = min;
|
old.RemotePortMin = min;
|
||||||
old.RemotePortMax = max;
|
old.RemotePortMax = max;
|
||||||
}
|
}
|
||||||
|
sForwardClientStore.Update(old);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -186,10 +175,12 @@ namespace linker.plugins.sforward
|
|||||||
forwardInfo.RemotePortMin = min;
|
forwardInfo.RemotePortMin = min;
|
||||||
forwardInfo.RemotePortMax = max;
|
forwardInfo.RemotePortMax = max;
|
||||||
}
|
}
|
||||||
running.Data.SForwards.Add(forwardInfo);
|
sForwardClientStore.Add(forwardInfo);
|
||||||
|
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||||
|
LoggerHelper.Instance.Info($"add sforward {forwardInfo.ToJson()}");
|
||||||
}
|
}
|
||||||
|
|
||||||
running.Data.Update();
|
sForwardClientStore.Confirm();
|
||||||
Start();
|
Start();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -197,7 +188,7 @@ namespace linker.plugins.sforward
|
|||||||
public bool Remove(uint id)
|
public bool Remove(uint id)
|
||||||
{
|
{
|
||||||
//同名或者同端口,但是ID不一样
|
//同名或者同端口,但是ID不一样
|
||||||
SForwardInfo old = running.Data.SForwards.FirstOrDefault(c => c.Id == id);
|
SForwardInfo old = sForwardClientStore.Get(id);
|
||||||
if (old == null)
|
if (old == null)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@@ -206,8 +197,11 @@ namespace linker.plugins.sforward
|
|||||||
old.Started = false;
|
old.Started = false;
|
||||||
Start();
|
Start();
|
||||||
|
|
||||||
running.Data.SForwards.Remove(old);
|
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||||
running.Data.Update();
|
LoggerHelper.Instance.Info($"remove sforward {old.ToJson()}");
|
||||||
|
|
||||||
|
sForwardClientStore.Remove(id);
|
||||||
|
sForwardClientStore.Confirm();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
private bool PortRange(string str, out int min, out int max)
|
private bool PortRange(string str, out int min, out int max)
|
||||||
@@ -219,7 +213,7 @@ namespace linker.plugins.sforward
|
|||||||
string[] arr = str.Split('/');
|
string[] arr = str.Split('/');
|
||||||
return arr.Length == 2 && int.TryParse(arr[0], out min) && int.TryParse(arr[1], out max);
|
return arr.Length == 2 && int.TryParse(arr[0], out min) && int.TryParse(arr[1], out max);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 测试本机服务
|
/// 测试本机服务
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -231,12 +225,12 @@ namespace linker.plugins.sforward
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var results = running.Data.SForwards.Select(c => c.LocalEP).Select(ConnectAsync);
|
var results = sForwardClientStore.Get().Select(c => c.LocalEP).Select(ConnectAsync);
|
||||||
await Task.Delay(200).ConfigureAwait(false);
|
await Task.Delay(200).ConfigureAwait(false);
|
||||||
|
|
||||||
foreach (var item in results.Select(c => c.Result))
|
foreach (var item in results.Select(c => c.Result))
|
||||||
{
|
{
|
||||||
var forward = running.Data.SForwards.FirstOrDefault(c => c.LocalEP.Equals(item.Item1));
|
var forward = sForwardClientStore.Get().FirstOrDefault(c => c.LocalEP.Equals(item.Item1));
|
||||||
if (forward != null)
|
if (forward != null)
|
||||||
{
|
{
|
||||||
forward.LocalMsg = item.Item2;
|
forward.LocalMsg = item.Item2;
|
@@ -1,12 +1,9 @@
|
|||||||
using linker.libs;
|
using linker.libs;
|
||||||
using linker.plugins.client;
|
|
||||||
using linker.serializer;
|
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using MemoryPack;
|
|
||||||
using linker.messenger.decenter;
|
using linker.messenger.decenter;
|
||||||
using linker.messenger.signin;
|
using linker.messenger.signin;
|
||||||
|
|
||||||
namespace linker.plugins.sforward
|
namespace linker.messenger.sforward.client
|
||||||
{
|
{
|
||||||
public sealed class SForwardDecenter : IDecenter
|
public sealed class SForwardDecenter : IDecenter
|
||||||
{
|
{
|
||||||
@@ -16,11 +13,13 @@ namespace linker.plugins.sforward
|
|||||||
public ConcurrentDictionary<string, int> CountDic { get; } = new ConcurrentDictionary<string, int>();
|
public ConcurrentDictionary<string, int> CountDic { get; } = new ConcurrentDictionary<string, int>();
|
||||||
|
|
||||||
private readonly ISignInClientStore signInClientStore;
|
private readonly ISignInClientStore signInClientStore;
|
||||||
private readonly SForwardTransfer sForwardTransfer;
|
private readonly ISForwardClientStore sForwardClientStore;
|
||||||
public SForwardDecenter(ISignInClientStore signInClientStore, SForwardTransfer sForwardTransfer)
|
private readonly ISerializer serializer;
|
||||||
|
public SForwardDecenter(ISignInClientStore signInClientStore, ISForwardClientStore sForwardClientStore, ISerializer serializer)
|
||||||
{
|
{
|
||||||
this.signInClientStore = signInClientStore;
|
this.signInClientStore = signInClientStore;
|
||||||
this.sForwardTransfer = sForwardTransfer;
|
this.sForwardClientStore = sForwardClientStore;
|
||||||
|
this.serializer = serializer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Refresh()
|
public void Refresh()
|
||||||
@@ -30,20 +29,20 @@ namespace linker.plugins.sforward
|
|||||||
|
|
||||||
public Memory<byte> GetData()
|
public Memory<byte> GetData()
|
||||||
{
|
{
|
||||||
CountInfo info = new CountInfo { MachineId = signInClientStore.Id, Count = sForwardTransfer.Count };
|
SForwardCountInfo info = new SForwardCountInfo { MachineId = signInClientStore.Id, Count = sForwardClientStore.Count() };
|
||||||
CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
|
CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
|
||||||
DataVersion.Add();
|
DataVersion.Add();
|
||||||
return Serializer.Serialize(info);
|
return serializer.Serialize(info);
|
||||||
}
|
}
|
||||||
public void SetData(Memory<byte> data)
|
public void SetData(Memory<byte> data)
|
||||||
{
|
{
|
||||||
CountInfo info = Serializer.Deserialize<CountInfo>(data.Span);
|
SForwardCountInfo info = serializer.Deserialize<SForwardCountInfo>(data.Span);
|
||||||
CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
|
CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
|
||||||
DataVersion.Add();
|
DataVersion.Add();
|
||||||
}
|
}
|
||||||
public void SetData(List<ReadOnlyMemory<byte>> data)
|
public void SetData(List<ReadOnlyMemory<byte>> data)
|
||||||
{
|
{
|
||||||
List<CountInfo> list = data.Select(c => Serializer.Deserialize<CountInfo>(c.Span)).ToList();
|
List<SForwardCountInfo> list = data.Select(c => serializer.Deserialize<SForwardCountInfo>(c.Span)).ToList();
|
||||||
foreach (var info in list)
|
foreach (var info in list)
|
||||||
{
|
{
|
||||||
CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
|
CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
|
||||||
@@ -52,10 +51,5 @@ namespace linker.plugins.sforward
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[MemoryPackable]
|
|
||||||
public sealed partial class CountInfo
|
|
||||||
{
|
|
||||||
public string MachineId { get; set; }
|
|
||||||
public int Count { get; set; }
|
|
||||||
}
|
|
||||||
}
|
}
|
27
linker.messenger.sforward/client/SForwardSync.cs
Normal file
27
linker.messenger.sforward/client/SForwardSync.cs
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
using linker.libs;
|
||||||
|
using linker.messenger.sync;
|
||||||
|
|
||||||
|
namespace linker.messenger.sforward.client
|
||||||
|
{
|
||||||
|
public sealed class SForwardSyncSecretKey : ISync
|
||||||
|
{
|
||||||
|
public string Name => "SForwardSecretKey";
|
||||||
|
|
||||||
|
private readonly ISForwardClientStore sForwardClientStore;
|
||||||
|
private readonly ISerializer serializer;
|
||||||
|
public SForwardSyncSecretKey(ISForwardClientStore sForwardClientStore, ISerializer serializer)
|
||||||
|
{
|
||||||
|
this.sForwardClientStore = sForwardClientStore;
|
||||||
|
this.serializer = serializer;
|
||||||
|
}
|
||||||
|
public Memory<byte> GetData()
|
||||||
|
{
|
||||||
|
return serializer.Serialize(sForwardClientStore.SecretKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetData(Memory<byte> data)
|
||||||
|
{
|
||||||
|
sForwardClientStore.SetSecretKey(serializer.Deserialize<string>(data.Span));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
40
linker.messenger.sforward/linker.messenger.sforward.csproj
Normal file
40
linker.messenger.sforward/linker.messenger.sforward.csproj
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFrameworks>net8.0</TargetFrameworks>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>disable</Nullable>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<PublishAot>false</PublishAot>
|
||||||
|
<JsonSerializerIsReflectionEnabledByDefault>true</JsonSerializerIsReflectionEnabledByDefault>
|
||||||
|
<EnablePreviewFeatures>True</EnablePreviewFeatures>
|
||||||
|
<Title>linker messenger sforward</Title>
|
||||||
|
<Authors>snltty</Authors>
|
||||||
|
<Company>snltty</Company>
|
||||||
|
<Description>linker messenger sforward</Description>
|
||||||
|
<Copyright>snltty</Copyright>
|
||||||
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
|
<PackageReleaseNotes>linker messenger sforward</PackageReleaseNotes>
|
||||||
|
<Version>1.6.4</Version>
|
||||||
|
<AssemblyVersion>1.6.4</AssemblyVersion>
|
||||||
|
<FileVersion>1.6.4</FileVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||||
|
<DebugType>none</DebugType>
|
||||||
|
<DebugSymbols>false</DebugSymbols>
|
||||||
|
<Optimize>True</Optimize>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\linker.libs\linker.libs.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.decenter\linker.messenger.decenter.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.signin\linker.messenger.signin.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.sync\linker.messenger.sync.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger\linker.messenger.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
@@ -1,15 +1,12 @@
|
|||||||
using linker.client.config;
|
using linker.plugins.sforward.proxy;
|
||||||
using linker.plugins.sforward.config;
|
|
||||||
using linker.plugins.sforward.validator;
|
|
||||||
using linker.serializer;
|
|
||||||
using linker.plugins.sforward.proxy;
|
|
||||||
using linker.config;
|
|
||||||
using LiteDB;
|
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using linker.libs;
|
using linker.libs;
|
||||||
using linker.messenger;
|
using linker.messenger;
|
||||||
using linker.messenger.signin;
|
using linker.messenger.signin;
|
||||||
using MemoryPack;
|
using linker.messenger.sforward;
|
||||||
|
using linker.messenger.sforward.server.validator;
|
||||||
|
using linker.messenger.sforward.server;
|
||||||
|
using linker.messenger.sforward.client;
|
||||||
|
|
||||||
namespace linker.plugins.sforward.messenger
|
namespace linker.plugins.sforward.messenger
|
||||||
{
|
{
|
||||||
@@ -23,11 +20,11 @@ namespace linker.plugins.sforward.messenger
|
|||||||
private readonly ISForwardServerCahing sForwardServerCahing;
|
private readonly ISForwardServerCahing sForwardServerCahing;
|
||||||
private readonly IMessengerSender sender;
|
private readonly IMessengerSender sender;
|
||||||
private readonly SignInServerCaching signCaching;
|
private readonly SignInServerCaching signCaching;
|
||||||
private readonly FileConfig configWrap;
|
private readonly SForwardValidatorTransfer validator;
|
||||||
private readonly ISForwardValidator validator;
|
private readonly ISForwardServerStore sForwardServerStore;
|
||||||
private readonly SForwardServerConfigTransfer sForwardServerConfigTransfer;
|
private readonly ISerializer serializer;
|
||||||
|
|
||||||
public SForwardServerMessenger(SForwardProxy proxy, ISForwardServerCahing sForwardServerCahing, IMessengerSender sender, SignInServerCaching signCaching, FileConfig configWrap, ISForwardValidator validator, SForwardServerConfigTransfer sForwardServerConfigTransfer)
|
public SForwardServerMessenger(SForwardProxy proxy, ISForwardServerCahing sForwardServerCahing, IMessengerSender sender, SignInServerCaching signCaching, SForwardValidatorTransfer validator, ISForwardServerStore sForwardServerStore, ISerializer serializer)
|
||||||
{
|
{
|
||||||
this.proxy = proxy;
|
this.proxy = proxy;
|
||||||
proxy.WebConnect = WebConnect;
|
proxy.WebConnect = WebConnect;
|
||||||
@@ -36,9 +33,9 @@ namespace linker.plugins.sforward.messenger
|
|||||||
this.sForwardServerCahing = sForwardServerCahing;
|
this.sForwardServerCahing = sForwardServerCahing;
|
||||||
this.sender = sender;
|
this.sender = sender;
|
||||||
this.signCaching = signCaching;
|
this.signCaching = signCaching;
|
||||||
this.configWrap = configWrap;
|
|
||||||
this.validator = validator;
|
this.validator = validator;
|
||||||
this.sForwardServerConfigTransfer = sForwardServerConfigTransfer;
|
this.sForwardServerStore = sForwardServerStore;
|
||||||
|
this.serializer = serializer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -48,8 +45,8 @@ namespace linker.plugins.sforward.messenger
|
|||||||
[MessengerId((ushort)SForwardMessengerIds.Add)]
|
[MessengerId((ushort)SForwardMessengerIds.Add)]
|
||||||
public async Task Add(IConnection connection)
|
public async Task Add(IConnection connection)
|
||||||
{
|
{
|
||||||
SForwardAddInfo sForwardAddInfo = Serializer.Deserialize<SForwardAddInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
SForwardAddInfo sForwardAddInfo = serializer.Deserialize<SForwardAddInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
||||||
SForwardAddResultInfo result = new SForwardAddResultInfo { Success = true, BufferSize = sForwardServerConfigTransfer.BufferSize };
|
SForwardAddResultInfo result = new SForwardAddResultInfo { Success = true, BufferSize = sForwardServerStore.BufferSize };
|
||||||
|
|
||||||
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) == false)
|
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) == false)
|
||||||
{
|
{
|
||||||
@@ -79,7 +76,7 @@ namespace linker.plugins.sforward.messenger
|
|||||||
if (sForwardServerCahing.TryAdd(port, connection.Id))
|
if (sForwardServerCahing.TryAdd(port, connection.Id))
|
||||||
{
|
{
|
||||||
proxy.Stop(port);
|
proxy.Stop(port);
|
||||||
result.Message = proxy.Start(port, false, sForwardServerConfigTransfer.BufferSize, cache.GroupId);
|
result.Message = proxy.Start(port, false, sForwardServerStore.BufferSize, cache.GroupId);
|
||||||
if (string.IsNullOrWhiteSpace(result.Message) == false)
|
if (string.IsNullOrWhiteSpace(result.Message) == false)
|
||||||
{
|
{
|
||||||
LoggerHelper.Instance.Error(result.Message);
|
LoggerHelper.Instance.Error(result.Message);
|
||||||
@@ -116,7 +113,7 @@ namespace linker.plugins.sforward.messenger
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
proxy.Stop(sForwardAddInfo.RemotePort);
|
proxy.Stop(sForwardAddInfo.RemotePort);
|
||||||
string msg = proxy.Start(sForwardAddInfo.RemotePort, false, sForwardServerConfigTransfer.BufferSize, cache.GroupId);
|
string msg = proxy.Start(sForwardAddInfo.RemotePort, false, sForwardServerStore.BufferSize, cache.GroupId);
|
||||||
if (string.IsNullOrWhiteSpace(msg) == false)
|
if (string.IsNullOrWhiteSpace(msg) == false)
|
||||||
{
|
{
|
||||||
result.Success = false;
|
result.Success = false;
|
||||||
@@ -140,7 +137,7 @@ namespace linker.plugins.sforward.messenger
|
|||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
connection.Write(Serializer.Serialize(result));
|
connection.Write(serializer.Serialize(result));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -152,7 +149,7 @@ namespace linker.plugins.sforward.messenger
|
|||||||
[MessengerId((ushort)SForwardMessengerIds.Remove)]
|
[MessengerId((ushort)SForwardMessengerIds.Remove)]
|
||||||
public async Task Remove(IConnection connection)
|
public async Task Remove(IConnection connection)
|
||||||
{
|
{
|
||||||
SForwardAddInfo sForwardAddInfo = Serializer.Deserialize<SForwardAddInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
SForwardAddInfo sForwardAddInfo = serializer.Deserialize<SForwardAddInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
||||||
SForwardAddResultInfo result = new SForwardAddResultInfo { Success = true };
|
SForwardAddResultInfo result = new SForwardAddResultInfo { Success = true };
|
||||||
|
|
||||||
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) == false)
|
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) == false)
|
||||||
@@ -207,7 +204,7 @@ namespace linker.plugins.sforward.messenger
|
|||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
connection.Write(Serializer.Serialize(result));
|
connection.Write(serializer.Serialize(result));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,7 +216,7 @@ namespace linker.plugins.sforward.messenger
|
|||||||
[MessengerId((ushort)SForwardMessengerIds.GetForward)]
|
[MessengerId((ushort)SForwardMessengerIds.GetForward)]
|
||||||
public void GetForward(IConnection connection)
|
public void GetForward(IConnection connection)
|
||||||
{
|
{
|
||||||
string machineId = Serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
|
string machineId = serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
|
||||||
if (signCaching.TryGet(machineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
|
if (signCaching.TryGet(machineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
|
||||||
{
|
{
|
||||||
uint requestid = connection.ReceiveRequestWrap.RequestId;
|
uint requestid = connection.ReceiveRequestWrap.RequestId;
|
||||||
@@ -250,7 +247,7 @@ namespace linker.plugins.sforward.messenger
|
|||||||
[MessengerId((ushort)SForwardMessengerIds.AddClientForward)]
|
[MessengerId((ushort)SForwardMessengerIds.AddClientForward)]
|
||||||
public async Task AddClientForward(IConnection connection)
|
public async Task AddClientForward(IConnection connection)
|
||||||
{
|
{
|
||||||
SForwardAddForwardInfo info = Serializer.Deserialize<SForwardAddForwardInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
SForwardAddForwardInfo info = serializer.Deserialize<SForwardAddForwardInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
||||||
if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
|
if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
|
||||||
{
|
{
|
||||||
uint requestid = connection.ReceiveRequestWrap.RequestId;
|
uint requestid = connection.ReceiveRequestWrap.RequestId;
|
||||||
@@ -258,7 +255,7 @@ namespace linker.plugins.sforward.messenger
|
|||||||
{
|
{
|
||||||
Connection = cacheTo.Connection,
|
Connection = cacheTo.Connection,
|
||||||
MessengerId = (ushort)SForwardMessengerIds.AddClient,
|
MessengerId = (ushort)SForwardMessengerIds.AddClient,
|
||||||
Payload = Serializer.Serialize(info.Data)
|
Payload = serializer.Serialize(info.Data)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -269,7 +266,7 @@ namespace linker.plugins.sforward.messenger
|
|||||||
[MessengerId((ushort)SForwardMessengerIds.RemoveClientForward)]
|
[MessengerId((ushort)SForwardMessengerIds.RemoveClientForward)]
|
||||||
public async Task RemoveClientForward(IConnection connection)
|
public async Task RemoveClientForward(IConnection connection)
|
||||||
{
|
{
|
||||||
SForwardRemoveForwardInfo info = Serializer.Deserialize<SForwardRemoveForwardInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
SForwardRemoveForwardInfo info = serializer.Deserialize<SForwardRemoveForwardInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
||||||
if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
|
if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
|
||||||
{
|
{
|
||||||
uint requestid = connection.ReceiveRequestWrap.RequestId;
|
uint requestid = connection.ReceiveRequestWrap.RequestId;
|
||||||
@@ -277,7 +274,7 @@ namespace linker.plugins.sforward.messenger
|
|||||||
{
|
{
|
||||||
Connection = cacheTo.Connection,
|
Connection = cacheTo.Connection,
|
||||||
MessengerId = (ushort)SForwardMessengerIds.RemoveClient,
|
MessengerId = (ushort)SForwardMessengerIds.RemoveClient,
|
||||||
Payload = Serializer.Serialize(info.Id)
|
Payload = serializer.Serialize(info.Id)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -289,7 +286,7 @@ namespace linker.plugins.sforward.messenger
|
|||||||
[MessengerId((ushort)SForwardMessengerIds.TestClientForward)]
|
[MessengerId((ushort)SForwardMessengerIds.TestClientForward)]
|
||||||
public async Task TestClientForward(IConnection connection)
|
public async Task TestClientForward(IConnection connection)
|
||||||
{
|
{
|
||||||
string machineid = Serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
|
string machineid = serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
|
||||||
if (signCaching.TryGet(machineid, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
|
if (signCaching.TryGet(machineid, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
|
||||||
{
|
{
|
||||||
uint requestid = connection.ReceiveRequestWrap.RequestId;
|
uint requestid = connection.ReceiveRequestWrap.RequestId;
|
||||||
@@ -317,7 +314,7 @@ namespace linker.plugins.sforward.messenger
|
|||||||
{
|
{
|
||||||
Connection = sign.Connection,
|
Connection = sign.Connection,
|
||||||
MessengerId = (ushort)SForwardMessengerIds.Proxy,
|
MessengerId = (ushort)SForwardMessengerIds.Proxy,
|
||||||
Payload = Serializer.Serialize(new SForwardProxyInfo { Domain = host, RemotePort = port, Id = id, BufferSize = sForwardServerConfigTransfer.BufferSize })
|
Payload = serializer.Serialize(new SForwardProxyInfo { Domain = host, RemotePort = port, Id = id, BufferSize = sForwardServerStore.BufferSize })
|
||||||
}).ConfigureAwait(false);
|
}).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -337,7 +334,7 @@ namespace linker.plugins.sforward.messenger
|
|||||||
{
|
{
|
||||||
Connection = sign.Connection,
|
Connection = sign.Connection,
|
||||||
MessengerId = (ushort)SForwardMessengerIds.Proxy,
|
MessengerId = (ushort)SForwardMessengerIds.Proxy,
|
||||||
Payload = Serializer.Serialize(new SForwardProxyInfo { RemotePort = port, Id = id, BufferSize = sForwardServerConfigTransfer.BufferSize })
|
Payload = serializer.Serialize(new SForwardProxyInfo { RemotePort = port, Id = id, BufferSize = sForwardServerStore.BufferSize })
|
||||||
}).ConfigureAwait(false);
|
}).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -357,7 +354,7 @@ namespace linker.plugins.sforward.messenger
|
|||||||
{
|
{
|
||||||
Connection = sign.Connection,
|
Connection = sign.Connection,
|
||||||
MessengerId = (ushort)SForwardMessengerIds.ProxyUdp,
|
MessengerId = (ushort)SForwardMessengerIds.ProxyUdp,
|
||||||
Payload = Serializer.Serialize(new SForwardProxyInfo { RemotePort = port, Id = id, BufferSize = sForwardServerConfigTransfer.BufferSize })
|
Payload = serializer.Serialize(new SForwardProxyInfo { RemotePort = port, Id = id, BufferSize = sForwardServerStore.BufferSize })
|
||||||
}).ConfigureAwait(false);
|
}).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -377,14 +374,15 @@ namespace linker.plugins.sforward.messenger
|
|||||||
public sealed class SForwardClientMessenger : IMessenger
|
public sealed class SForwardClientMessenger : IMessenger
|
||||||
{
|
{
|
||||||
private readonly SForwardProxy proxy;
|
private readonly SForwardProxy proxy;
|
||||||
private readonly RunningConfig runningConfig;
|
private readonly SForwardClientTransfer sForwardTransfer;
|
||||||
private readonly SForwardTransfer sForwardTransfer;
|
private readonly ISForwardClientStore sForwardClientStore;
|
||||||
|
private readonly ISerializer serializer;
|
||||||
public SForwardClientMessenger(SForwardProxy proxy, RunningConfig runningConfig, SForwardTransfer sForwardTransfer)
|
public SForwardClientMessenger(SForwardProxy proxy, SForwardClientTransfer sForwardTransfer, ISForwardClientStore sForwardClientStore, ISerializer serializer)
|
||||||
{
|
{
|
||||||
this.proxy = proxy;
|
this.proxy = proxy;
|
||||||
this.runningConfig = runningConfig;
|
|
||||||
this.sForwardTransfer = sForwardTransfer;
|
this.sForwardTransfer = sForwardTransfer;
|
||||||
|
this.sForwardClientStore = sForwardClientStore;
|
||||||
|
this.serializer = serializer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -394,8 +392,8 @@ namespace linker.plugins.sforward.messenger
|
|||||||
[MessengerId((ushort)SForwardMessengerIds.Get)]
|
[MessengerId((ushort)SForwardMessengerIds.Get)]
|
||||||
public void Get(IConnection connection)
|
public void Get(IConnection connection)
|
||||||
{
|
{
|
||||||
List<SForwardInfo> result = sForwardTransfer.Get();
|
List<SForwardInfo> result = sForwardClientStore.Get();
|
||||||
connection.Write(Serializer.Serialize(result));
|
connection.Write(serializer.Serialize(result));
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 添加
|
/// 添加
|
||||||
@@ -404,7 +402,7 @@ namespace linker.plugins.sforward.messenger
|
|||||||
[MessengerId((ushort)SForwardMessengerIds.AddClient)]
|
[MessengerId((ushort)SForwardMessengerIds.AddClient)]
|
||||||
public void AddClient(IConnection connection)
|
public void AddClient(IConnection connection)
|
||||||
{
|
{
|
||||||
SForwardInfo sForwardInfo = Serializer.Deserialize<SForwardInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
SForwardInfo sForwardInfo = serializer.Deserialize<SForwardInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
||||||
sForwardTransfer.Add(sForwardInfo);
|
sForwardTransfer.Add(sForwardInfo);
|
||||||
}
|
}
|
||||||
// <summary>
|
// <summary>
|
||||||
@@ -414,7 +412,7 @@ namespace linker.plugins.sforward.messenger
|
|||||||
[MessengerId((ushort)SForwardMessengerIds.RemoveClient)]
|
[MessengerId((ushort)SForwardMessengerIds.RemoveClient)]
|
||||||
public void RemoveClient(IConnection connection)
|
public void RemoveClient(IConnection connection)
|
||||||
{
|
{
|
||||||
uint id = Serializer.Deserialize<uint>(connection.ReceiveRequestWrap.Payload.Span);
|
uint id = serializer.Deserialize<uint>(connection.ReceiveRequestWrap.Payload.Span);
|
||||||
sForwardTransfer.Remove(id);
|
sForwardTransfer.Remove(id);
|
||||||
}
|
}
|
||||||
// <summary>
|
// <summary>
|
||||||
@@ -435,12 +433,12 @@ namespace linker.plugins.sforward.messenger
|
|||||||
[MessengerId((ushort)SForwardMessengerIds.Proxy)]
|
[MessengerId((ushort)SForwardMessengerIds.Proxy)]
|
||||||
public void Proxy(IConnection connection)
|
public void Proxy(IConnection connection)
|
||||||
{
|
{
|
||||||
SForwardProxyInfo sForwardProxyInfo = Serializer.Deserialize<SForwardProxyInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
SForwardProxyInfo sForwardProxyInfo = serializer.Deserialize<SForwardProxyInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
||||||
|
|
||||||
//是http
|
//是http
|
||||||
if (string.IsNullOrWhiteSpace(sForwardProxyInfo.Domain) == false)
|
if (string.IsNullOrWhiteSpace(sForwardProxyInfo.Domain) == false)
|
||||||
{
|
{
|
||||||
SForwardInfo sForwardInfo = runningConfig.Data.SForwards.FirstOrDefault(c => c.Domain == sForwardProxyInfo.Domain);
|
SForwardInfo sForwardInfo = sForwardClientStore.Get(sForwardProxyInfo.Domain);
|
||||||
if (sForwardInfo != null)
|
if (sForwardInfo != null)
|
||||||
{
|
{
|
||||||
_ = proxy.OnConnectTcp(sForwardProxyInfo.BufferSize, sForwardProxyInfo.Id, new System.Net.IPEndPoint(connection.Address.Address, sForwardProxyInfo.RemotePort), sForwardInfo.LocalEP);
|
_ = proxy.OnConnectTcp(sForwardProxyInfo.BufferSize, sForwardProxyInfo.Id, new System.Net.IPEndPoint(connection.Address.Address, sForwardProxyInfo.RemotePort), sForwardInfo.LocalEP);
|
||||||
@@ -465,7 +463,7 @@ namespace linker.plugins.sforward.messenger
|
|||||||
[MessengerId((ushort)SForwardMessengerIds.ProxyUdp)]
|
[MessengerId((ushort)SForwardMessengerIds.ProxyUdp)]
|
||||||
public void ProxyUdp(IConnection connection)
|
public void ProxyUdp(IConnection connection)
|
||||||
{
|
{
|
||||||
SForwardProxyInfo sForwardProxyInfo = Serializer.Deserialize<SForwardProxyInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
SForwardProxyInfo sForwardProxyInfo = serializer.Deserialize<SForwardProxyInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
||||||
if (sForwardProxyInfo.RemotePort > 0)
|
if (sForwardProxyInfo.RemotePort > 0)
|
||||||
{
|
{
|
||||||
IPEndPoint localEP = GetLocalEP(sForwardProxyInfo);
|
IPEndPoint localEP = GetLocalEP(sForwardProxyInfo);
|
||||||
@@ -484,7 +482,7 @@ namespace linker.plugins.sforward.messenger
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private IPEndPoint GetLocalEP(SForwardProxyInfo sForwardProxyInfo)
|
private IPEndPoint GetLocalEP(SForwardProxyInfo sForwardProxyInfo)
|
||||||
{
|
{
|
||||||
SForwardInfo sForwardInfo = runningConfig.Data.SForwards.FirstOrDefault(c => c.RemotePort == sForwardProxyInfo.RemotePort || (c.RemotePortMin <= sForwardProxyInfo.RemotePort && c.RemotePortMax >= sForwardProxyInfo.RemotePort));
|
SForwardInfo sForwardInfo = sForwardClientStore.Get().FirstOrDefault(c => c.RemotePort == sForwardProxyInfo.RemotePort || (c.RemotePortMin <= sForwardProxyInfo.RemotePort && c.RemotePortMax >= sForwardProxyInfo.RemotePort));
|
||||||
if (sForwardInfo != null)
|
if (sForwardInfo != null)
|
||||||
{
|
{
|
||||||
IPEndPoint localEP = IPEndPoint.Parse(sForwardInfo.LocalEP.ToString());
|
IPEndPoint localEP = IPEndPoint.Parse(sForwardInfo.LocalEP.ToString());
|
||||||
@@ -500,18 +498,4 @@ namespace linker.plugins.sforward.messenger
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
[MemoryPackable]
|
|
||||||
public sealed partial class SForwardAddForwardInfo
|
|
||||||
{
|
|
||||||
public string MachineId { get; set; }
|
|
||||||
public SForwardInfo Data { get; set; }
|
|
||||||
}
|
|
||||||
[MemoryPackable]
|
|
||||||
public sealed partial class SForwardRemoveForwardInfo
|
|
||||||
{
|
|
||||||
public string MachineId { get; set; }
|
|
||||||
public uint Id { get; set; }
|
|
||||||
}
|
|
||||||
}
|
}
|
@@ -1,4 +1,4 @@
|
|||||||
namespace linker.plugins.sforward.config
|
namespace linker.messenger.sforward.server
|
||||||
{
|
{
|
||||||
public interface ISForwardServerCahing
|
public interface ISForwardServerCahing
|
||||||
{
|
{
|
10
linker.messenger.sforward/server/ISForwardServerStore.cs
Normal file
10
linker.messenger.sforward/server/ISForwardServerStore.cs
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
namespace linker.messenger.sforward.server
|
||||||
|
{
|
||||||
|
public interface ISForwardServerStore
|
||||||
|
{
|
||||||
|
public string SecretKey { get; }
|
||||||
|
public byte BufferSize { get; }
|
||||||
|
public int WebPort { get; }
|
||||||
|
public int[] TunnelPortRange { get; }
|
||||||
|
}
|
||||||
|
}
|
@@ -1,7 +1,7 @@
|
|||||||
using linker.messenger.signin;
|
using linker.messenger.signin;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
|
|
||||||
namespace linker.plugins.sforward.config
|
namespace linker.messenger.sforward.server
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 服务器穿透缓存,用于识别不同的客户端
|
/// 服务器穿透缓存,用于识别不同的客户端
|
@@ -1,7 +1,6 @@
|
|||||||
using linker.messenger.signin;
|
using linker.messenger.signin;
|
||||||
using linker.plugins.sforward.config;
|
|
||||||
|
|
||||||
namespace linker.plugins.sforward.validator
|
namespace linker.messenger.sforward.server.validator
|
||||||
{
|
{
|
||||||
public interface ISForwardValidator
|
public interface ISForwardValidator
|
||||||
{
|
{
|
@@ -0,0 +1,34 @@
|
|||||||
|
using linker.messenger.signin;
|
||||||
|
|
||||||
|
namespace linker.messenger.sforward.server.validator
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 服务端穿透验证
|
||||||
|
/// </summary>
|
||||||
|
public sealed class SForwardValidator : ISForwardValidator
|
||||||
|
{
|
||||||
|
private readonly ISForwardServerStore sForwardServerStore;
|
||||||
|
public SForwardValidator(ISForwardServerStore sForwardServerStore)
|
||||||
|
{
|
||||||
|
this.sForwardServerStore = sForwardServerStore;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<string> Validate(SignCacheInfo signCacheInfo, SForwardAddInfo sForwardAddInfo)
|
||||||
|
{
|
||||||
|
if (sForwardServerStore.SecretKey != sForwardAddInfo.SecretKey)
|
||||||
|
{
|
||||||
|
return $"sforward secretKey 【{sForwardAddInfo.SecretKey}】 valid fail";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sForwardAddInfo.RemotePort > 0)
|
||||||
|
{
|
||||||
|
if (sForwardAddInfo.RemotePort < sForwardServerStore.TunnelPortRange[0] || sForwardAddInfo.RemotePort > sForwardServerStore.TunnelPortRange[1])
|
||||||
|
{
|
||||||
|
return $"sforward tunnel port range {string.Join("-", sForwardServerStore.TunnelPortRange)}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await Task.CompletedTask;
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,48 @@
|
|||||||
|
using linker.messenger.signin;
|
||||||
|
using linker.libs;
|
||||||
|
|
||||||
|
namespace linker.messenger.sforward.server.validator
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 验证
|
||||||
|
/// </summary>
|
||||||
|
public sealed partial class SForwardValidatorTransfer
|
||||||
|
{
|
||||||
|
private List<ISForwardValidator> validators = new List<ISForwardValidator>();
|
||||||
|
|
||||||
|
public SForwardValidatorTransfer()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 加载验证实现类
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="list"></param>
|
||||||
|
public void AddValidators(List<ISForwardValidator> list)
|
||||||
|
{
|
||||||
|
if (list == null) return;
|
||||||
|
validators = validators.Concat(list).Distinct().ToList();
|
||||||
|
LoggerHelper.Instance.Info($"load sforward server validator :{string.Join(",", list.Select(c => c.GetType().Name))}");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 验证
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="signCacheInfo"></param>
|
||||||
|
/// <param name="sForwardAddInfo"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task<string> Validate(SignCacheInfo signCacheInfo, SForwardAddInfo sForwardAddInfo)
|
||||||
|
{
|
||||||
|
foreach (var item in validators)
|
||||||
|
{
|
||||||
|
string result = await item.Validate(signCacheInfo, sForwardAddInfo);
|
||||||
|
if (string.IsNullOrWhiteSpace(result) == false)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@@ -8,7 +8,7 @@
|
|||||||
public string Name { get; }
|
public string Name { get; }
|
||||||
|
|
||||||
public void SetName(string newName);
|
public void SetName(string newName);
|
||||||
public void SetGroup(SignInClientGroupInfo groups);
|
public void SetGroups(SignInClientGroupInfo[] groups);
|
||||||
public void SetGroupPassword(string password);
|
public void SetGroupPassword(string password);
|
||||||
public void SetServer(SignInClientServerInfo servers);
|
public void SetServer(SignInClientServerInfo servers);
|
||||||
public void SetSecretKey(string secretKey);
|
public void SetSecretKey(string secretKey);
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
using linker.libs;
|
using linker.libs;
|
||||||
using linker.libs.api;
|
using linker.libs.api;
|
||||||
using linker.libs.extends;
|
using linker.libs.extends;
|
||||||
|
using linker.messenger.api;
|
||||||
|
|
||||||
namespace linker.messenger.signin
|
namespace linker.messenger.signin
|
||||||
{
|
{
|
||||||
@@ -11,21 +12,30 @@ namespace linker.messenger.signin
|
|||||||
private readonly IMessengerSender messengerSender;
|
private readonly IMessengerSender messengerSender;
|
||||||
private readonly SignInClientTransfer signInClientTransfer;
|
private readonly SignInClientTransfer signInClientTransfer;
|
||||||
private readonly ISerializer serializer;
|
private readonly ISerializer serializer;
|
||||||
|
private readonly IAccessStore accessStore;
|
||||||
|
|
||||||
public SignInApiController( SignInClientState signInClientState, ISignInClientStore signInClientStore, IMessengerSender messengerSender,SignInClientTransfer signInClientTransfer, ISerializer serializer)
|
public SignInApiController( SignInClientState signInClientState, ISignInClientStore signInClientStore, IMessengerSender messengerSender,SignInClientTransfer signInClientTransfer, ISerializer serializer, IAccessStore accessStore)
|
||||||
{
|
{
|
||||||
this.signInClientState = signInClientState;
|
this.signInClientState = signInClientState;
|
||||||
this.signInClientStore = signInClientStore;
|
this.signInClientStore = signInClientStore;
|
||||||
this.messengerSender = messengerSender;
|
this.messengerSender = messengerSender;
|
||||||
this.signInClientTransfer = signInClientTransfer;
|
this.signInClientTransfer = signInClientTransfer;
|
||||||
this.serializer = serializer;
|
this.serializer = serializer;
|
||||||
|
this.accessStore = accessStore;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Set(ApiControllerParamsInfo param)
|
public void Set(ApiControllerParamsInfo param)
|
||||||
{
|
{
|
||||||
ConfigSetInfo info = param.Content.DeJson<ConfigSetInfo>();
|
ConfigSetInfo info = param.Content.DeJson<ConfigSetInfo>();
|
||||||
signInClientStore.SetName(info.Name);
|
if (accessStore.HasAccess(AccessValue.RenameSelf))
|
||||||
signInClientStore.SetGroup(info.Groups[0]);
|
{
|
||||||
|
signInClientStore.SetName(info.Name);
|
||||||
|
}
|
||||||
|
if (accessStore.HasAccess(AccessValue.RenameSelf))
|
||||||
|
{
|
||||||
|
signInClientStore.SetGroups(info.Groups);
|
||||||
|
}
|
||||||
|
|
||||||
signInClientTransfer.ReSignIn();
|
signInClientTransfer.ReSignIn();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35,11 +45,13 @@ namespace linker.messenger.signin
|
|||||||
|
|
||||||
if (info.Id == signInClientStore.Id)
|
if (info.Id == signInClientStore.Id)
|
||||||
{
|
{
|
||||||
|
if (accessStore.HasAccess(AccessValue.RenameSelf) == false) return false;
|
||||||
signInClientStore.SetName(info.NewName);
|
signInClientStore.SetName(info.NewName);
|
||||||
signInClientTransfer.ReSignIn();
|
signInClientTransfer.ReSignIn();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (accessStore.HasAccess(AccessValue.RenameSelf) == false) return false;
|
||||||
await messengerSender.SendOnly(new MessageRequestWrap
|
await messengerSender.SendOnly(new MessageRequestWrap
|
||||||
{
|
{
|
||||||
Connection = signInClientState.Connection,
|
Connection = signInClientState.Connection,
|
||||||
@@ -49,13 +61,15 @@ namespace linker.messenger.signin
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
[Access(AccessValue.Group)]
|
||||||
public void SetGroups(ApiControllerParamsInfo param)
|
public void SetGroups(ApiControllerParamsInfo param)
|
||||||
{
|
{
|
||||||
SignInClientGroupInfo[] info = param.Content.DeJson<SignInClientGroupInfo[]>();
|
SignInClientGroupInfo[] info = param.Content.DeJson<SignInClientGroupInfo[]>();
|
||||||
signInClientStore.SetGroup(info[0]);
|
signInClientStore.SetGroups(info);
|
||||||
//signInClientTransfer.ReSignIn();
|
//signInClientTransfer.ReSignIn();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Access(AccessValue.Config)]
|
||||||
public bool SetServers(ApiControllerParamsInfo param)
|
public bool SetServers(ApiControllerParamsInfo param)
|
||||||
{
|
{
|
||||||
SignInClientServerInfo servers = param.Content.DeJson<SignInClientServerInfo>();
|
SignInClientServerInfo servers = param.Content.DeJson<SignInClientServerInfo>();
|
||||||
@@ -69,6 +83,7 @@ namespace linker.messenger.signin
|
|||||||
return signInClientState;
|
return signInClientState;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Access(AccessValue.Config)]
|
||||||
public async Task Del(ApiControllerParamsInfo param)
|
public async Task Del(ApiControllerParamsInfo param)
|
||||||
{
|
{
|
||||||
await messengerSender.SendOnly(new MessageRequestWrap
|
await messengerSender.SendOnly(new MessageRequestWrap
|
||||||
|
@@ -8,7 +8,7 @@ namespace linker.messenger.socks5
|
|||||||
{
|
{
|
||||||
public static ServiceCollection AddSocks5Client(this ServiceCollection serviceCollection)
|
public static ServiceCollection AddSocks5Client(this ServiceCollection serviceCollection)
|
||||||
{
|
{
|
||||||
serviceCollection.AddSingleton<Socks5ClientApiController>();
|
serviceCollection.AddSingleton<Socks5ApiController>();
|
||||||
serviceCollection.AddSingleton<TunnelProxy>();
|
serviceCollection.AddSingleton<TunnelProxy>();
|
||||||
|
|
||||||
serviceCollection.AddSingleton<Socks5ClientMessenger>();
|
serviceCollection.AddSingleton<Socks5ClientMessenger>();
|
||||||
@@ -29,7 +29,7 @@ namespace linker.messenger.socks5
|
|||||||
messengerResolver.AddMessenger(new List<IMessenger> { serviceProvider.GetService<Socks5ClientMessenger>() });
|
messengerResolver.AddMessenger(new List<IMessenger> { serviceProvider.GetService<Socks5ClientMessenger>() });
|
||||||
|
|
||||||
IApiServer apiServer = serviceProvider.GetService<IApiServer>();
|
IApiServer apiServer = serviceProvider.GetService<IApiServer>();
|
||||||
apiServer.AddPlugins(new List<libs.api.IApiController> { serviceProvider.GetService<Socks5ClientApiController>() });
|
apiServer.AddPlugins(new List<libs.api.IApiController> { serviceProvider.GetService<Socks5ApiController>() });
|
||||||
|
|
||||||
DecenterClientTransfer decenterClientTransfer = serviceProvider.GetService<DecenterClientTransfer>();
|
DecenterClientTransfer decenterClientTransfer = serviceProvider.GetService<DecenterClientTransfer>();
|
||||||
decenterClientTransfer.AddDecenters(new List<IDecenter> { serviceProvider.GetService<Socks5Decenter>() });
|
decenterClientTransfer.AddDecenters(new List<IDecenter> { serviceProvider.GetService<Socks5Decenter>() });
|
||||||
|
@@ -4,10 +4,11 @@ using System.Collections.Concurrent;
|
|||||||
using linker.tunnel.connection;
|
using linker.tunnel.connection;
|
||||||
using linker.messenger.signin;
|
using linker.messenger.signin;
|
||||||
using linker.libs;
|
using linker.libs;
|
||||||
|
using linker.messenger.api;
|
||||||
|
|
||||||
namespace linker.messenger.socks5
|
namespace linker.messenger.socks5
|
||||||
{
|
{
|
||||||
public sealed class Socks5ClientApiController : IApiController
|
public sealed class Socks5ApiController : IApiController
|
||||||
{
|
{
|
||||||
private readonly IMessengerSender messengerSender;
|
private readonly IMessengerSender messengerSender;
|
||||||
private readonly Socks5Transfer socks5Transfer;
|
private readonly Socks5Transfer socks5Transfer;
|
||||||
@@ -16,7 +17,8 @@ namespace linker.messenger.socks5
|
|||||||
private readonly ISignInClientStore signInClientStore;
|
private readonly ISignInClientStore signInClientStore;
|
||||||
private readonly Socks5Decenter socks5Decenter;
|
private readonly Socks5Decenter socks5Decenter;
|
||||||
private readonly ISerializer serializer;
|
private readonly ISerializer serializer;
|
||||||
public Socks5ClientApiController(IMessengerSender messengerSender, SignInClientState signInClientState, TunnelProxy tunnelProxy, Socks5Transfer socks5Transfer, ISignInClientStore signInClientStore, Socks5Decenter socks5Decenter, ISerializer serializer)
|
private readonly IAccessStore accessStore;
|
||||||
|
public Socks5ApiController(IMessengerSender messengerSender, SignInClientState signInClientState, TunnelProxy tunnelProxy, Socks5Transfer socks5Transfer, ISignInClientStore signInClientStore, Socks5Decenter socks5Decenter, ISerializer serializer, IAccessStore accessStore)
|
||||||
{
|
{
|
||||||
this.messengerSender = messengerSender;
|
this.messengerSender = messengerSender;
|
||||||
this.socks5Transfer = socks5Transfer;
|
this.socks5Transfer = socks5Transfer;
|
||||||
@@ -25,6 +27,7 @@ namespace linker.messenger.socks5
|
|||||||
this.signInClientStore = signInClientStore;
|
this.signInClientStore = signInClientStore;
|
||||||
this.socks5Decenter = socks5Decenter;
|
this.socks5Decenter = socks5Decenter;
|
||||||
this.serializer = serializer;
|
this.serializer = serializer;
|
||||||
|
this.accessStore = accessStore;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ConnectionListInfo Connections(ApiControllerParamsInfo param)
|
public ConnectionListInfo Connections(ApiControllerParamsInfo param)
|
||||||
@@ -41,6 +44,7 @@ namespace linker.messenger.socks5
|
|||||||
return new ConnectionListInfo { HashCode = version };
|
return new ConnectionListInfo { HashCode = version };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Access(AccessValue.TunnelRemove)]
|
||||||
public void RemoveConnection(ApiControllerParamsInfo param)
|
public void RemoveConnection(ApiControllerParamsInfo param)
|
||||||
{
|
{
|
||||||
tunnelProxy.RemoveConnection(param.Content);
|
tunnelProxy.RemoveConnection(param.Content);
|
||||||
@@ -83,10 +87,12 @@ namespace linker.messenger.socks5
|
|||||||
//运行自己的
|
//运行自己的
|
||||||
if (param.Content == signInClientStore.Id)
|
if (param.Content == signInClientStore.Id)
|
||||||
{
|
{
|
||||||
|
if (accessStore.HasAccess(AccessValue.Socks5StatusSelf) == false) return false;
|
||||||
socks5Transfer.Retstart();
|
socks5Transfer.Retstart();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (accessStore.HasAccess(AccessValue.Socks5StatusOther) == false) return false;
|
||||||
//运行别人的
|
//运行别人的
|
||||||
await messengerSender.SendOnly(new MessageRequestWrap
|
await messengerSender.SendOnly(new MessageRequestWrap
|
||||||
{
|
{
|
||||||
@@ -107,10 +113,12 @@ namespace linker.messenger.socks5
|
|||||||
//停止自己的
|
//停止自己的
|
||||||
if (param.Content == signInClientStore.Id)
|
if (param.Content == signInClientStore.Id)
|
||||||
{
|
{
|
||||||
|
if (accessStore.HasAccess(AccessValue.Socks5StatusSelf) == false) return false;
|
||||||
socks5Transfer.Stop();
|
socks5Transfer.Stop();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (accessStore.HasAccess(AccessValue.Socks5StatusOther) == false) return false;
|
||||||
//停止别人的
|
//停止别人的
|
||||||
await messengerSender.SendOnly(new MessageRequestWrap
|
await messengerSender.SendOnly(new MessageRequestWrap
|
||||||
{
|
{
|
||||||
@@ -134,10 +142,12 @@ namespace linker.messenger.socks5
|
|||||||
//更新自己的
|
//更新自己的
|
||||||
if (info.MachineId == signInClientStore.Id)
|
if (info.MachineId == signInClientStore.Id)
|
||||||
{
|
{
|
||||||
|
if (accessStore.HasAccess(AccessValue.Socks5ChangeSelf) == false) return false;
|
||||||
socks5Transfer.UpdateConfig(info);
|
socks5Transfer.UpdateConfig(info);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (accessStore.HasAccess(AccessValue.Socks5ChangeOther) == false) return false;
|
||||||
//更新别人的
|
//更新别人的
|
||||||
await messengerSender.SendOnly(new MessageRequestWrap
|
await messengerSender.SendOnly(new MessageRequestWrap
|
||||||
{
|
{
|
||||||
|
@@ -3,6 +3,7 @@ using linker.libs.extends;
|
|||||||
using System.IO.Compression;
|
using System.IO.Compression;
|
||||||
using linker.libs;
|
using linker.libs;
|
||||||
using linker.messenger.signin;
|
using linker.messenger.signin;
|
||||||
|
using linker.messenger.api;
|
||||||
namespace linker.messenger.store.file
|
namespace linker.messenger.store.file
|
||||||
{
|
{
|
||||||
public sealed class ConfigApiController : IApiController
|
public sealed class ConfigApiController : IApiController
|
||||||
@@ -76,6 +77,7 @@ namespace linker.messenger.store.file
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Access(AccessValue.Export)]
|
||||||
public async Task<bool> Export(ApiControllerParamsInfo param)
|
public async Task<bool> Export(ApiControllerParamsInfo param)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -114,9 +116,10 @@ namespace linker.messenger.store.file
|
|||||||
client.CApi.ApiPassword = configExportInfo.ApiPassword;
|
client.CApi.ApiPassword = configExportInfo.ApiPassword;
|
||||||
}
|
}
|
||||||
|
|
||||||
client.Access = accessTransfer.AssignAccess((ClientApiAccess)configExportInfo.Access);
|
client.Access = config.Data.Client.Access & (AccessValue)configExportInfo.Access;
|
||||||
client.OnlyNode = true;
|
client.OnlyNode = true;
|
||||||
client.Action.Args.Clear();
|
client.Action.Args.Clear();
|
||||||
|
client.Action.Arg = string.Empty;
|
||||||
|
|
||||||
client.Groups = [config.Data.Client.Groups[0]];
|
client.Groups = [config.Data.Client.Groups[0]];
|
||||||
File.WriteAllText(Path.Combine(configPath, $"client.json"), client.Serialize(client));
|
File.WriteAllText(Path.Combine(configPath, $"client.json"), client.Serialize(client));
|
||||||
|
@@ -1,23 +1,34 @@
|
|||||||
using linker.messenger.access;
|
using linker.libs;
|
||||||
using linker.messenger.action;
|
using linker.messenger.action;
|
||||||
using linker.messenger.api;
|
using linker.messenger.api;
|
||||||
|
using linker.messenger.forward;
|
||||||
using linker.messenger.listen;
|
using linker.messenger.listen;
|
||||||
|
using linker.messenger.logger;
|
||||||
using linker.messenger.pcp;
|
using linker.messenger.pcp;
|
||||||
using linker.messenger.relay.client;
|
using linker.messenger.relay.client;
|
||||||
using linker.messenger.relay.server;
|
using linker.messenger.relay.server;
|
||||||
|
using linker.messenger.sforward.client;
|
||||||
|
using linker.messenger.sforward.server;
|
||||||
using linker.messenger.signin;
|
using linker.messenger.signin;
|
||||||
using linker.messenger.socks5;
|
using linker.messenger.socks5;
|
||||||
using linker.messenger.store.file.action;
|
using linker.messenger.store.file.action;
|
||||||
using linker.messenger.store.file.api;
|
using linker.messenger.store.file.api;
|
||||||
|
using linker.messenger.store.file.common;
|
||||||
|
using linker.messenger.store.file.forward;
|
||||||
|
using linker.messenger.store.file.logger;
|
||||||
using linker.messenger.store.file.messenger;
|
using linker.messenger.store.file.messenger;
|
||||||
using linker.messenger.store.file.pcp;
|
using linker.messenger.store.file.pcp;
|
||||||
using linker.messenger.store.file.relay;
|
using linker.messenger.store.file.relay;
|
||||||
using linker.messenger.store.file.server;
|
using linker.messenger.store.file.server;
|
||||||
|
using linker.messenger.store.file.sforward;
|
||||||
using linker.messenger.store.file.signIn;
|
using linker.messenger.store.file.signIn;
|
||||||
using linker.messenger.store.file.socks5;
|
using linker.messenger.store.file.socks5;
|
||||||
using linker.messenger.store.file.tunnel;
|
using linker.messenger.store.file.tunnel;
|
||||||
|
using linker.messenger.store.file.tuntap;
|
||||||
using linker.messenger.store.file.updater;
|
using linker.messenger.store.file.updater;
|
||||||
using linker.messenger.sync;
|
using linker.messenger.sync;
|
||||||
|
using linker.messenger.tuntap;
|
||||||
|
using linker.messenger.tuntap.lease;
|
||||||
using linker.messenger.updater;
|
using linker.messenger.updater;
|
||||||
using linker.plugins.tunnel;
|
using linker.plugins.tunnel;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
@@ -27,8 +38,16 @@ namespace linker.messenger.store.file
|
|||||||
{
|
{
|
||||||
public static ServiceCollection AddStoreFile(this ServiceCollection serviceCollection)
|
public static ServiceCollection AddStoreFile(this ServiceCollection serviceCollection)
|
||||||
{
|
{
|
||||||
|
LoggerHelper.Instance.Info("add store file");
|
||||||
|
|
||||||
|
serviceCollection.AddSingleton<Storefactory>();
|
||||||
|
serviceCollection.AddSingleton<FileConfig>();
|
||||||
|
serviceCollection.AddSingleton<RunningConfig>();
|
||||||
|
|
||||||
serviceCollection.AddSingleton<ConfigApiController>();
|
serviceCollection.AddSingleton<ConfigApiController>();
|
||||||
|
|
||||||
|
serviceCollection.AddSingleton<ICommonStore, CommonStore>();
|
||||||
|
|
||||||
serviceCollection.AddSingleton<IApiStore, ApiStore>();
|
serviceCollection.AddSingleton<IApiStore, ApiStore>();
|
||||||
serviceCollection.AddSingleton<IAccessStore, AccessStore>();
|
serviceCollection.AddSingleton<IAccessStore, AccessStore>();
|
||||||
|
|
||||||
@@ -60,10 +79,25 @@ namespace linker.messenger.store.file
|
|||||||
|
|
||||||
serviceCollection.AddSingleton<ISocks5Store, Socks5Store>();
|
serviceCollection.AddSingleton<ISocks5Store, Socks5Store>();
|
||||||
|
|
||||||
|
serviceCollection.AddSingleton<ISForwardClientStore, SForwardClientStore>();
|
||||||
|
serviceCollection.AddSingleton<ISForwardServerStore, SForwardServerStore>();
|
||||||
|
|
||||||
|
serviceCollection.AddSingleton<ILoggerStore, LoggerStore>();
|
||||||
|
|
||||||
|
serviceCollection.AddSingleton<IForwardClientStore, ForwardClientStore>();
|
||||||
|
|
||||||
|
serviceCollection.AddSingleton<ITuntapClientStore, TuntapClientStore>();
|
||||||
|
serviceCollection.AddSingleton<ILeaseServerStore, LeaseServerStore>();
|
||||||
|
|
||||||
return serviceCollection;
|
return serviceCollection;
|
||||||
}
|
}
|
||||||
public static ServiceProvider UseStoreFile(this ServiceProvider serviceProvider)
|
public static ServiceProvider UseStoreFile(this ServiceProvider serviceProvider)
|
||||||
{
|
{
|
||||||
|
LoggerHelper.Instance.Info("use store file");
|
||||||
|
|
||||||
|
FileConfig fileConfig = serviceProvider.GetService<FileConfig>();
|
||||||
|
RunningConfig runningConfig = serviceProvider.GetService<RunningConfig>();
|
||||||
|
|
||||||
IApiServer apiServer = serviceProvider.GetService<IApiServer>();
|
IApiServer apiServer = serviceProvider.GetService<IApiServer>();
|
||||||
apiServer.AddPlugins(new List<libs.api.IApiController> { serviceProvider.GetService<ConfigApiController>() });
|
apiServer.AddPlugins(new List<libs.api.IApiController> { serviceProvider.GetService<ConfigApiController>() });
|
||||||
|
|
||||||
|
@@ -213,37 +213,12 @@ namespace linker.messenger.store.file
|
|||||||
public sealed partial class ConfigCommonInfo : IConfig
|
public sealed partial class ConfigCommonInfo : IConfig
|
||||||
{
|
{
|
||||||
public ConfigCommonInfo() { }
|
public ConfigCommonInfo() { }
|
||||||
public string[] Modes { get; set; } = new string[] { "client", "server" };
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
private LoggerTypes loggerType { get; set; } = LoggerTypes.DEBUG;
|
|
||||||
public bool Install { get; set; } = false;
|
public bool Install { get; set; } = false;
|
||||||
#else
|
#else
|
||||||
private LoggerTypes loggerType { get; set; } = LoggerTypes.WARNING;
|
|
||||||
public bool Install { get; set; } = false;
|
public bool Install { get; set; } = false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
[JsonIgnore]
|
|
||||||
public string[] Plugins { get; set; } = Array.Empty<string>();
|
|
||||||
|
|
||||||
public LoggerTypes LoggerType
|
|
||||||
{
|
|
||||||
get => loggerType; set
|
|
||||||
{
|
|
||||||
loggerType = value;
|
|
||||||
LoggerHelper.Instance.LoggerLevel = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public int LoggerSize { get; set; } = 100;
|
|
||||||
|
|
||||||
[JsonIgnore]
|
|
||||||
public string[] IncludePlugins { get; set; } = Array.Empty<string>();
|
|
||||||
[JsonIgnore]
|
|
||||||
public string[] ExcludePlugins { get; set; } = Array.Empty<string>();
|
|
||||||
|
|
||||||
|
|
||||||
public ConfigCommonInfo Load(string text)
|
public ConfigCommonInfo Load(string text)
|
||||||
{
|
{
|
||||||
return text.DeJson<ConfigCommonInfo>();
|
return text.DeJson<ConfigCommonInfo>();
|
||||||
|
@@ -1,6 +1,5 @@
|
|||||||
using linker.config;
|
using linker.libs;
|
||||||
using linker.libs;
|
using linker.messenger.api;
|
||||||
using linker.messenger.access;
|
|
||||||
|
|
||||||
namespace linker.messenger.store.file.api
|
namespace linker.messenger.store.file.api
|
||||||
{
|
{
|
||||||
|
@@ -1,6 +1,4 @@
|
|||||||
using linker.config;
|
using linker.messenger.api;
|
||||||
using linker.libs;
|
|
||||||
using linker.messenger.api;
|
|
||||||
|
|
||||||
namespace linker.messenger.store.file.api
|
namespace linker.messenger.store.file.api
|
||||||
{
|
{
|
||||||
|
@@ -3,7 +3,7 @@ using linker.messenger.access;
|
|||||||
using linker.messenger.api;
|
using linker.messenger.api;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
|
||||||
namespace linker.config
|
namespace linker.messenger.store.file
|
||||||
{
|
{
|
||||||
public partial class ConfigClientInfo
|
public partial class ConfigClientInfo
|
||||||
{
|
{
|
||||||
|
28
linker.messenger.store.file/common/CommonStore.cs
Normal file
28
linker.messenger.store.file/common/CommonStore.cs
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
namespace linker.messenger.store.file.common
|
||||||
|
{
|
||||||
|
public sealed class CommonStore : ICommonStore
|
||||||
|
{
|
||||||
|
public CommonModes Modes
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
CommonModes modes = 0;
|
||||||
|
if (fileConfig.Data.Common.Modes.Contains("client"))
|
||||||
|
{
|
||||||
|
modes |= CommonModes.Client;
|
||||||
|
}
|
||||||
|
if (fileConfig.Data.Common.Modes.Contains("server"))
|
||||||
|
{
|
||||||
|
modes |= CommonModes.Server;
|
||||||
|
}
|
||||||
|
return modes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly FileConfig fileConfig;
|
||||||
|
public CommonStore(FileConfig fileConfig)
|
||||||
|
{
|
||||||
|
this.fileConfig = fileConfig;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
9
linker.messenger.store.file/common/Config.cs
Normal file
9
linker.messenger.store.file/common/Config.cs
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
namespace linker.messenger.store.file
|
||||||
|
{
|
||||||
|
|
||||||
|
public sealed partial class ConfigCommonInfo
|
||||||
|
{
|
||||||
|
public string[] Modes { get; set; } = new string[] { "client", "server" };
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
13
linker.messenger.store.file/forward/Config.cs
Normal file
13
linker.messenger.store.file/forward/Config.cs
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
|
||||||
|
using linker.messenger.forward;
|
||||||
|
|
||||||
|
namespace linker.messenger.store.file
|
||||||
|
{
|
||||||
|
public sealed partial class RunningConfigInfo
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 端口转发配置
|
||||||
|
/// </summary>
|
||||||
|
public List<ForwardInfo> Forwards { get; set; } = new List<ForwardInfo>();
|
||||||
|
}
|
||||||
|
}
|
59
linker.messenger.store.file/forward/ForwardClientStore.cs
Normal file
59
linker.messenger.store.file/forward/ForwardClientStore.cs
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
using linker.messenger.forward;
|
||||||
|
|
||||||
|
namespace linker.messenger.store.file.forward
|
||||||
|
{
|
||||||
|
public sealed class ForwardClientStore : IForwardClientStore
|
||||||
|
{
|
||||||
|
private readonly RunningConfig runningConfig;
|
||||||
|
public ForwardClientStore(RunningConfig runningConfig)
|
||||||
|
{
|
||||||
|
this.runningConfig = runningConfig;
|
||||||
|
foreach (var item in runningConfig.Data.Forwards)
|
||||||
|
{
|
||||||
|
item.Proxy = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public int Count()
|
||||||
|
{
|
||||||
|
return runningConfig.Data.SForwards.Count();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ForwardInfo> Get()
|
||||||
|
{
|
||||||
|
return runningConfig.Data.Forwards;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ForwardInfo Get(uint id)
|
||||||
|
{
|
||||||
|
return runningConfig.Data.Forwards.FirstOrDefault(x => x.Id == id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ForwardInfo> Get(string groupid)
|
||||||
|
{
|
||||||
|
return runningConfig.Data.Forwards.Where(x => x.GroupId == groupid).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Add(ForwardInfo info)
|
||||||
|
{
|
||||||
|
runningConfig.Data.Forwards.Add(info);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
public bool Update(ForwardInfo info)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
public bool Remove(uint id)
|
||||||
|
{
|
||||||
|
runningConfig.Data.Forwards.Remove(Get(id));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Confirm()
|
||||||
|
{
|
||||||
|
runningConfig.Data.Update();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@@ -38,12 +38,16 @@
|
|||||||
<ProjectReference Include="..\linker.messenger.access\linker.messenger.access.csproj" />
|
<ProjectReference Include="..\linker.messenger.access\linker.messenger.access.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.action\linker.messenger.action.csproj" />
|
<ProjectReference Include="..\linker.messenger.action\linker.messenger.action.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.api\linker.messenger.api.csproj" />
|
<ProjectReference Include="..\linker.messenger.api\linker.messenger.api.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.forward\linker.messenger.forward.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.listen\linker.messenger.listen.csproj" />
|
<ProjectReference Include="..\linker.messenger.listen\linker.messenger.listen.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.logger\linker.messenger.logger.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.pcp\linker.messenger.pcp.csproj" />
|
<ProjectReference Include="..\linker.messenger.pcp\linker.messenger.pcp.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.relay\linker.messenger.relay.csproj" />
|
<ProjectReference Include="..\linker.messenger.relay\linker.messenger.relay.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.sforward\linker.messenger.sforward.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.signin\linker.messenger.signin.csproj" />
|
<ProjectReference Include="..\linker.messenger.signin\linker.messenger.signin.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.socks5\linker.messenger.socks5.csproj" />
|
<ProjectReference Include="..\linker.messenger.socks5\linker.messenger.socks5.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.tunnel\linker.messenger.tunnel.csproj" />
|
<ProjectReference Include="..\linker.messenger.tunnel\linker.messenger.tunnel.csproj" />
|
||||||
|
<ProjectReference Include="..\linker.messenger.tuntap\linker.messenger.tuntap.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger.updater\linker.messenger.updater.csproj" />
|
<ProjectReference Include="..\linker.messenger.updater\linker.messenger.updater.csproj" />
|
||||||
<ProjectReference Include="..\linker.messenger\linker.messenger.csproj" />
|
<ProjectReference Include="..\linker.messenger\linker.messenger.csproj" />
|
||||||
<ProjectReference Include="..\linker.tunnel\linker.tunnel.csproj" />
|
<ProjectReference Include="..\linker.tunnel\linker.tunnel.csproj" />
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user