From b1b9fcfd374e71eeed5dfe4d62b586c84ff55d03 Mon Sep 17 00:00:00 2001 From: Qiu Yuzhou Date: Wed, 28 Oct 2026 18:28:58 +0800 Subject: [PATCH] fix(sip008): emit UUID identifiers in lowercase --- .../CatalogWorkflow/CatalogWorkflow+GroupExport.swift | 8 ++++---- ShadowsocksX-NG2/Domain/Catalog/NodeIdentity.swift | 2 +- .../Tests/Catalog/ConfigurationGroupExportTests.swift | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ShadowsocksX-NG2/App/Application/CatalogWorkflow/CatalogWorkflow+GroupExport.swift b/ShadowsocksX-NG2/App/Application/CatalogWorkflow/CatalogWorkflow+GroupExport.swift index 51cc13b1..8c92c6ba 100644 --- a/ShadowsocksX-NG2/App/Application/CatalogWorkflow/CatalogWorkflow+GroupExport.swift +++ b/ShadowsocksX-NG2/App/Application/CatalogWorkflow/CatalogWorkflow+GroupExport.swift @@ -182,19 +182,19 @@ private struct SIP008ExportIdentity { private static let namespace = UUID(uuidString: "0d89e9f8-8f0e-4a55-941a-77d61736eaa3")! func groupID(for nodeID: NodeID) -> String { - Self.version5(name: "group:\(nodeID.rawValue)").uuidString + Self.version5(name: "group:\(nodeID.rawValue)").uuidString.lowercased() } func serverID(for entry: CatalogEntry) -> String { if entry.source == .manual, let id = UUID(uuidString: entry.id.rawValue) { - return id.uuidString + return id.uuidString.lowercased() } if entry.source == .subscription, let providerID = subscriptionServerID(entry.id), let id = UUID(uuidString: providerID) { - return id.uuidString + return id.uuidString.lowercased() } - return Self.version5(name: "server:\(entry.id.rawValue)").uuidString + return Self.version5(name: "server:\(entry.id.rawValue)").uuidString.lowercased() } private func subscriptionServerID(_ nodeID: NodeID) -> String? { diff --git a/ShadowsocksX-NG2/Domain/Catalog/NodeIdentity.swift b/ShadowsocksX-NG2/Domain/Catalog/NodeIdentity.swift index 96add03a..23efcc00 100644 --- a/ShadowsocksX-NG2/Domain/Catalog/NodeIdentity.swift +++ b/ShadowsocksX-NG2/Domain/Catalog/NodeIdentity.swift @@ -15,7 +15,7 @@ struct NodeID: Hashable, Codable, Sendable { init(rawValue: String) { self.rawValue = rawValue } /// 手动新建节点身份。 - static func fresh() -> NodeID { NodeID(rawValue: UUID().uuidString) } + static func fresh() -> NodeID { NodeID(rawValue: UUID().uuidString.lowercased()) } init(from decoder: Decoder) throws { rawValue = try decoder.singleValueContainer().decode(String.self) diff --git a/ShadowsocksX-NG2/Tests/Catalog/ConfigurationGroupExportTests.swift b/ShadowsocksX-NG2/Tests/Catalog/ConfigurationGroupExportTests.swift index 248a7f0e..99417e04 100644 --- a/ShadowsocksX-NG2/Tests/Catalog/ConfigurationGroupExportTests.swift +++ b/ShadowsocksX-NG2/Tests/Catalog/ConfigurationGroupExportTests.swift @@ -104,9 +104,9 @@ final class ConfigurationGroupExportTests: XCTestCase { let rootIDs = rootServers.compactMap { $0["id"] as? String } let nestedIDs = nestedServers.compactMap { $0["id"] as? String } - XCTAssertEqual(rootIDs[0], providerID.uppercased()) - XCTAssertEqual(rootIDs[1], nestedProviderID.uppercased()) - XCTAssertEqual(nestedIDs, [nestedProviderID.uppercased()]) + XCTAssertEqual(rootIDs[0], providerID) + XCTAssertEqual(rootIDs[1], nestedProviderID) + XCTAssertEqual(nestedIDs, [nestedProviderID]) let repeatedRootIDs = try jsonServers(in: repeatedRootDraft).compactMap { $0["id"] as? String } XCTAssertEqual(rootIDs[2], repeatedRootIDs[2], "无 provider UUID 的服务器身份稳定") XCTAssertNotNil(UUID(uuidString: try XCTUnwrap(rootIDs[2])))