fix: import SIP008 subscriptions with numeric ports (#10575)

This commit is contained in:
shizukunacho
2026-11-13 14:32:18 +08:00
committed by GitHub
parent 0734317f9f
commit 28f8ca7ba1
3 changed files with 36 additions and 3 deletions
@@ -2,6 +2,38 @@ namespace ServiceLib.Tests.Fmt;
public class ShadowsocksFmtTests public class ShadowsocksFmtTests
{ {
[Test]
[Arguments("8388", true)]
[Arguments("\"8388\"", true)]
[Arguments("8388", false)]
[Arguments("\"8388\"", false)]
public async Task ResolveSip008_ObjectAndArrayDocuments_ShouldPreserveServerFields(string port, bool useObject)
{
var server = $$"""
{
"id": "27b8a625-4f4b-4428-9f0f-8a2317db7c79",
"remarks": "SIP008 server",
"server": "example.com",
"server_port": {{port}},
"password": "example",
"method": "chacha20-ietf-poly1305"
}
""";
var document = useObject
? $$"""{"version": 1, "servers": [{{server}}]}"""
: $"[{server}]";
var resolved = ShadowsocksFmt.ResolveSip008(document);
await resolved.Should().NotBeNull();
await resolved!.Should().HaveCount(1);
await resolved[0].Remarks.Should().BeEqualTo("SIP008 server");
await resolved[0].Address.Should().BeEqualTo("example.com");
await resolved[0].Port.Should().BeEqualTo(8388);
await resolved[0].Password.Should().BeEqualTo("example");
await resolved[0].GetProtocolExtra().SsMethod.Should().BeEqualTo("chacha20-ietf-poly1305");
}
// SIP002 user info that is not base64 is "method:password", percent-encoded once. // SIP002 user info that is not base64 is "method:password", percent-encoded once.
[Test] [Test]
[Arguments("ss://2022-blake3-aes-128-gcm:p%2541ss@1.2.3.4:8388#demo", "p%41ss")] [Arguments("ss://2022-blake3-aes-128-gcm:p%2541ss@1.2.3.4:8388#demo", "p%41ss")]
@@ -282,7 +282,7 @@ public class ShadowsocksFmt : BaseFmt
{ {
//SsSIP008 //SsSIP008
var lstSsServer = JsonUtils.Deserialize<List<SsServer>>(result); var lstSsServer = JsonUtils.Deserialize<List<SsServer>>(result);
if (lstSsServer?.Count <= 0) if (lstSsServer == null || lstSsServer.Count == 0)
{ {
var ssSIP008 = JsonUtils.Deserialize<SsSIP008>(result); var ssSIP008 = JsonUtils.Deserialize<SsSIP008>(result);
if (ssSIP008?.servers?.Count > 0) if (ssSIP008?.servers?.Count > 0)
@@ -301,7 +301,7 @@ public class ShadowsocksFmt : BaseFmt
Remarks = it.remarks, Remarks = it.remarks,
Password = it.password, Password = it.password,
Address = it.server, Address = it.server,
Port = it.server_port.ToInt() Port = it.server_port
}; };
ssItem.SetProtocolExtra(new ProtocolExtraItem() { SsMethod = it.method }); ssItem.SetProtocolExtra(new ProtocolExtraItem() { SsMethod = it.method });
lst.Add(ssItem); lst.Add(ssItem);
+2 -1
View File
@@ -9,7 +9,8 @@ public class SsServer
{ {
public string? remarks { get; set; } public string? remarks { get; set; }
public string? server { get; set; } public string? server { get; set; }
public string? server_port { get; set; } [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString)]
public int server_port { get; set; }
public string? method { get; set; } public string? method { get; set; }
public string? password { get; set; } public string? password { get; set; }
public string? plugin { get; set; } public string? plugin { get; set; }