Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions Lagrange.Core.Runner/InteropSignProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

namespace Lagrange.Core.Runner;

public partial class InteropSignProvider : IBotSignProvider
public partial class InteropSignProvider : BotSignProvider
{
private static readonly HashSet<string> WhiteListCommand =
[
Expand Down Expand Up @@ -71,9 +71,9 @@ public InteropSignProvider()
if (!ok) throw new Exception("Failed to attach to MicroblockSign library.");
}

public bool IsWhiteListCommand(string cmd) => WhiteListCommand.Contains(cmd);
public override bool IsWhiteListCommand(string cmd) => WhiteListCommand.Contains(cmd);

public Task<SsoSecureInfo?> GetSecSign(long uin, string cmd, int seq, ReadOnlyMemory<byte> body)
public override Task<SsoSecureInfo?> GetSecSign(long uin, string cmd, int seq, ReadOnlyMemory<byte> body)
{
nuint extraOutSize = 0u;
nuint tokenOutSize = 0u;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@

namespace Lagrange.Core.Common;

public interface IAndroidBotSignProvider : IBotSignProvider
public abstract class AndroidBotSignProvider : BotSignProvider
{
public Task<byte[]> GetEnergy(long uin, string data);
public abstract Task<byte[]> GetEnergy(long uin, string data);

public Task<byte[]> GetDebugXwid(long uin, string data);
public abstract Task<byte[]> GetDebugXwid(long uin, string data);
}

internal class DefaultAndroidBotSignProvider(BotContext context) : IAndroidBotSignProvider, IDisposable
internal class DefaultAndroidBotSignProvider : AndroidBotSignProvider, IDisposable
{
private const string Tag = nameof(DefaultAndroidBotSignProvider);

Expand Down Expand Up @@ -156,9 +156,9 @@ internal class DefaultAndroidBotSignProvider(BotContext context) : IAndroidBotSi
"OidbSvcTrpcTcp.0xaf6_0", "IncreaseURLSvr.QQHeadUrlReq"
];

public bool IsWhiteListCommand(string cmd) => WhiteListCommand.Contains(cmd);
public override bool IsWhiteListCommand(string cmd) => WhiteListCommand.Contains(cmd);

public async Task<SsoSecureInfo?> GetSecSign(long uin, string cmd, int seq, ReadOnlyMemory<byte> body)
public override async Task<SsoSecureInfo?> GetSecSign(long uin, string cmd, int seq, ReadOnlyMemory<byte> body)
{
try
{
Expand All @@ -168,8 +168,8 @@ internal class DefaultAndroidBotSignProvider(BotContext context) : IAndroidBotSi
["cmd"] = cmd,
["seq"] = seq,
["buffer"] = Convert.ToHexString(body.Span),
["guid"] = Convert.ToHexString(context.Keystore.Guid),
["version"] = context.AppInfo.PtVersion
["guid"] = Convert.ToHexString(Context.Keystore.Guid),
["version"] = Context.AppInfo.PtVersion
};

var response = await _client.PostAsync($"{_url}/sign", new StringContent(payload.ToJsonString(), Encoding.UTF8, "application/json"));
Expand All @@ -187,22 +187,22 @@ internal class DefaultAndroidBotSignProvider(BotContext context) : IAndroidBotSi
}
catch (Exception e)
{
context.LogWarning(Tag, "Failed to get sign: {0}", e, e.Message);
Context.LogWarning(Tag, "Failed to get sign: {0}", e, e.Message);
return null;
}
}

public async Task<byte[]> GetEnergy(long uin, string data)
public override async Task<byte[]> GetEnergy(long uin, string data)
{
try
{
var payload = new JsonObject
{
["uin"] = uin,
["data"] = data,
["guid"] = Convert.ToHexString(context.Keystore.Guid),
["ver"] = context.AppInfo.SdkInfo.SdkVersion,
["version"] = context.AppInfo.PtVersion
["guid"] = Convert.ToHexString(Context.Keystore.Guid),
["ver"] = Context.AppInfo.SdkInfo.SdkVersion,
["version"] = Context.AppInfo.PtVersion
};

var response = await _client.PostAsync($"{_url}/energy", new StringContent(payload.ToJsonString(), Encoding.UTF8, "application/json"));
Expand All @@ -213,21 +213,21 @@ public async Task<byte[]> GetEnergy(long uin, string data)
}
catch (Exception e)
{
context.LogWarning(Tag, "Failed to get energy: {0}", e, e.Message);
Context.LogWarning(Tag, "Failed to get energy: {0}", e, e.Message);
return [];
}
}

public async Task<byte[]> GetDebugXwid(long uin, string data)
public override async Task<byte[]> GetDebugXwid(long uin, string data)
{
try
{
var payload = new JsonObject
{
["uin"] = uin,
["data"] = data,
["guid"] = Convert.ToHexString(context.Keystore.Guid),
["version"] = context.AppInfo.PtVersion
["guid"] = Convert.ToHexString(Context.Keystore.Guid),
["version"] = Context.AppInfo.PtVersion
};

var response = await _client.PostAsync($"{_url}/get_tlv553", new StringContent(payload.ToJsonString(), Encoding.UTF8, "application/json"));
Expand All @@ -238,7 +238,7 @@ public async Task<byte[]> GetDebugXwid(long uin, string data)
}
catch (Exception e)
{
context.LogWarning(Tag, "Failed to get debug_xwid: {0}", e, e.Message);
Context.LogWarning(Tag, "Failed to get debug_xwid: {0}", e, e.Message);
return [];
}
}
Expand Down
2 changes: 1 addition & 1 deletion Lagrange.Core/Common/BotConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public class BotConfig
/// <summary>
/// The Sign Provider for the bot, if null, the bot will use the default sign provider
/// </summary>
public IBotSignProvider? SignProvider { get; set; }
public BotSignProvider? SignProvider { get; set; }
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,22 @@

namespace Lagrange.Core.Common;

public interface IBotSignProvider
public abstract class BotSignProvider
{
bool IsWhiteListCommand(string cmd);
private BotContext? _context;

public BotContext Context
{
get => _context ?? throw new InvalidOperationException("Context is not initialized.");
internal set => _context = value;
}

public abstract bool IsWhiteListCommand(string cmd);

Task<SsoSecureInfo?> GetSecSign(long uin, string cmd, int seq, ReadOnlyMemory<byte> body);
public abstract Task<SsoSecureInfo?> GetSecSign(long uin, string cmd, int seq, ReadOnlyMemory<byte> body);
}

internal class DefaultBotSignProvider(BotContext context) : IBotSignProvider, IDisposable
internal class DefaultBotSignProvider : BotSignProvider, IDisposable
{
private const string Tag = nameof(DefaultBotSignProvider);

Expand Down Expand Up @@ -64,19 +72,19 @@ internal class DefaultBotSignProvider(BotContext context) : IBotSignProvider, ID

private readonly HttpClient _client = new();

private readonly string _url = context.Config.Protocol switch
private string Url => Context.Config.Protocol switch
{
Protocols.Windows => throw new NotSupportedException("Windows is not supported"),
Protocols.MacOs => throw new NotSupportedException("MacOs is not supported"),
Protocols.Linux => $"https://sign.lagrangecore.org/api/sign/{context.AppInfo.AppClientVersion}",
Protocols.Linux => $"https://sign.lagrangecore.org/api/sign/{Context.AppInfo.AppClientVersion}",
Protocols.AndroidPhone => throw new NotSupportedException("AndroidPhone is not supported"),
Protocols.AndroidPad => throw new NotSupportedException("AndroidPad is not supported"),
_ => throw new ArgumentOutOfRangeException()
};

public bool IsWhiteListCommand(string cmd) => WhiteListCommand.Contains(cmd);
public override bool IsWhiteListCommand(string cmd) => WhiteListCommand.Contains(cmd);

public async Task<SsoSecureInfo?> GetSecSign(long uin, string cmd, int seq, ReadOnlyMemory<byte> body)
public override async Task<SsoSecureInfo?> GetSecSign(long uin, string cmd, int seq, ReadOnlyMemory<byte> body)
{
try
{
Expand All @@ -87,7 +95,7 @@ internal class DefaultBotSignProvider(BotContext context) : IBotSignProvider, ID
["src"] = Convert.ToHexString(body.Span),
};

var response = await _client.PostAsync(_url, new StringContent(payload.ToJsonString(), Encoding.UTF8, "application/json"));
var response = await _client.PostAsync(Url, new StringContent(payload.ToJsonString(), Encoding.UTF8, "application/json"));
if (!response.IsSuccessStatusCode) return null;

var content = JsonHelper.Deserialize<Root>(await response.Content.ReadAsStringAsync());
Expand All @@ -102,7 +110,7 @@ internal class DefaultBotSignProvider(BotContext context) : IBotSignProvider, ID
}
catch (Exception e)
{
context.LogWarning(Tag, $"Failed to get sign: {e.Message}");
Context.LogWarning(Tag, $"Failed to get sign: {e.Message}");
return null;
}
}
Expand Down
36 changes: 25 additions & 11 deletions Lagrange.Core/Internal/Context/PacketContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,34 @@

namespace Lagrange.Core.Internal.Context;

internal class PacketContext(BotContext context)
internal class PacketContext
{
private readonly ConcurrentDictionary<int, SsoPacketValueTaskSource> _pendingTasks = new();

private readonly BotKeystore _keystore = context.Keystore;
private readonly SsoPacker _ssoPacker = new(context);
private readonly ServicePacker _servicePacker = new(context);
private readonly BotKeystore _keystore;
private readonly SsoPacker _ssoPacker;
private readonly ServicePacker _servicePacker;

internal readonly IBotSignProvider SignProvider = context.Config.SignProvider ?? context.Config.Protocol switch
internal readonly BotSignProvider SignProvider;

private readonly BotContext _context;

public PacketContext(BotContext context)
{
Protocols.Linux or Protocols.Windows or Protocols.MacOs => new DefaultBotSignProvider(context),
Protocols.AndroidPhone or Protocols.AndroidPad => new DefaultAndroidBotSignProvider(context),
_ => throw new ArgumentOutOfRangeException(nameof(context.Config.Protocol))
};
_context = context;
_keystore = context.Keystore;
_ssoPacker = new SsoPacker(context);
_servicePacker = new ServicePacker(context);

SignProvider = context.Config.SignProvider ?? context.Config.Protocol switch
{
Protocols.Linux or Protocols.Windows or Protocols.MacOs => new DefaultBotSignProvider(),
Protocols.AndroidPhone or Protocols.AndroidPad => new DefaultAndroidBotSignProvider(),
_ => throw new ArgumentOutOfRangeException(nameof(context.Config.Protocol))
};

SignProvider.Context = context; // Initialize the sign provider with the context
}

public ValueTask<SsoPacket> SendPacket(SsoPacket packet, ServiceAttribute options)
{
Expand Down Expand Up @@ -59,7 +73,7 @@ public ValueTask<SsoPacket> SendPacket(SsoPacket packet, ServiceAttribute option
}
}

await context.SocketContext.Send(frame);
await _context.SocketContext.Send(frame);
});

return new ValueTask<SsoPacket>(tcs, 0);
Expand All @@ -84,7 +98,7 @@ public void DispatchPacket(ReadOnlySpan<byte> buffer)
}
else
{
_ = context.EventContext.HandleServerPacket(sso);
_ = _context.EventContext.HandleServerPacket(sso);
}
}
}
12 changes: 6 additions & 6 deletions Lagrange.Core/Internal/Packets/Login/WtLogin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ public ReadOnlyMemory<byte> BuildOicq09()

public async Task<ReadOnlyMemory<byte>> BuildOicq09Android(string password)
{
var sign = (IAndroidBotSignProvider)_context.PacketContext.SignProvider;
var sign = (AndroidBotSignProvider)_context.PacketContext.SignProvider;
var energy = await sign.GetEnergy(_context.BotUin, "810_9");
var attach = await sign.GetDebugXwid(_context.BotUin, "810_9");

Expand Down Expand Up @@ -201,7 +201,7 @@ public async Task<ReadOnlyMemory<byte>> BuildOicq09Android(string password)

public async Task<ReadOnlyMemory<byte>> BuildOicq02Android(string ticket)
{
var sign = (IAndroidBotSignProvider)_context.PacketContext.SignProvider;
var sign = (AndroidBotSignProvider)_context.PacketContext.SignProvider;
var energy = await sign.GetEnergy(_context.BotUin, "810_2");
var attach = await sign.GetDebugXwid(_context.BotUin, "810_2");

Expand All @@ -221,7 +221,7 @@ public async Task<ReadOnlyMemory<byte>> BuildOicq02Android(string ticket)

public async Task<ReadOnlyMemory<byte>> BuildOicq04Android(string qid)
{
var sign = (IAndroidBotSignProvider)_context.PacketContext.SignProvider;
var sign = (AndroidBotSignProvider)_context.PacketContext.SignProvider;
var attach = await sign.GetDebugXwid(_context.BotUin, "810_4");

using var tlvs = new Tlv(0x04, _context);
Expand All @@ -247,7 +247,7 @@ public async Task<ReadOnlyMemory<byte>> BuildOicq04Android(string qid)

public async Task<ReadOnlyMemory<byte>> BuildOicq07Android(string code)
{
var sign = (IAndroidBotSignProvider)_context.PacketContext.SignProvider;
var sign = (AndroidBotSignProvider)_context.PacketContext.SignProvider;
var energy = await sign.GetEnergy(_context.BotUin, "810_7");
var attach = await sign.GetDebugXwid(_context.BotUin, "810_7");

Expand All @@ -268,7 +268,7 @@ public async Task<ReadOnlyMemory<byte>> BuildOicq07Android(string code)

public async Task<ReadOnlyMemory<byte>> BuildOicq08Android()
{
var sign = (IAndroidBotSignProvider)_context.PacketContext.SignProvider;
var sign = (AndroidBotSignProvider)_context.PacketContext.SignProvider;
var attach = await sign.GetDebugXwid(_context.BotUin, "810_8");

using var tlvs = new Tlv(0x08, _context);
Expand All @@ -287,7 +287,7 @@ public async Task<ReadOnlyMemory<byte>> BuildOicq08Android()

public async Task<ReadOnlyMemory<byte>> BuildOicq15Android()
{
var sign = (IAndroidBotSignProvider)_context.PacketContext.SignProvider;
var sign = (AndroidBotSignProvider)_context.PacketContext.SignProvider;
var energy = await sign.GetEnergy(_context.BotUin, "810_f");
var attach = await sign.GetDebugXwid(_context.BotUin, "810_f");

Expand Down
10 changes: 5 additions & 5 deletions Lagrange.Milky/Utility/Signer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

namespace Lagrange.Milky.Utility;

public class Signer : IAndroidBotSignProvider, IDisposable
public class Signer : AndroidBotSignProvider, IDisposable
{
private static readonly HashSet<string> PcWhiteListCommand =
[
Expand Down Expand Up @@ -227,7 +227,7 @@ public Signer(ILogger<Signer> logger, IOptions<CoreConfiguration> options, Lazy<
_semaphore = new(1);
}

public bool IsWhiteListCommand(string cmd)
public override bool IsWhiteListCommand(string cmd)
{
var protocol = _bot.Value.Config.Protocol;

Expand All @@ -237,7 +237,7 @@ public bool IsWhiteListCommand(string cmd)
return false;
}

public async Task<SsoSecureInfo?> GetSecSign(long uin, string cmd, int seq, ReadOnlyMemory<byte> body)
public override async Task<SsoSecureInfo?> GetSecSign(long uin, string cmd, int seq, ReadOnlyMemory<byte> body)
{
try
{
Expand Down Expand Up @@ -294,7 +294,7 @@ private async Task<SsoSecureInfo> GetAndroidSecSign(long uin, string cmd, int se
};
}

public async Task<byte[]> GetEnergy(long uin, string data)
public override async Task<byte[]> GetEnergy(long uin, string data)
{
try
{
Expand All @@ -318,7 +318,7 @@ public async Task<byte[]> GetEnergy(long uin, string data)
}
}

public async Task<byte[]> GetDebugXwid(long uin, string data)
public override async Task<byte[]> GetDebugXwid(long uin, string data)
{
try
{
Expand Down
Loading