diff --git a/Sources/XXClient/Helpers/ConvertJsonNumberToString.swift b/Sources/XXClient/Helpers/ConvertJsonNumberToString.swift index 293f1ca640c4c69fc3e3958329b51671ff6b3508..8390ba1ced0f8a0aff92287b899a81fca0247c77 100644 --- a/Sources/XXClient/Helpers/ConvertJsonNumberToString.swift +++ b/Sources/XXClient/Helpers/ConvertJsonNumberToString.swift @@ -17,3 +17,21 @@ func convertJsonNumberToString( } return output } + +func convertJsonNumberToString( + in input: Data, + minNumberLength: Int +) -> Data { + guard var string = String(data: input, encoding: .utf8) else { + return input + } + string = string.replacingOccurrences( + of: #":( *)([0-9]{\#(minNumberLength),})( *)(,*)"#, + with: #":$1"$2"$3$4"#, + options: [.regularExpression] + ) + guard let output = string.data(using: .utf8) else { + return input + } + return output +} diff --git a/Sources/XXClient/Models/DHKey.swift b/Sources/XXClient/Models/DHKey.swift deleted file mode 100644 index 69380ede4069535867cfc0a65a3ca77c6fca5b1f..0000000000000000000000000000000000000000 --- a/Sources/XXClient/Models/DHKey.swift +++ /dev/null @@ -1,23 +0,0 @@ -import Foundation - -public struct DHKey: Equatable { - public init(value: String, fingerprint: UInt64) { - self.value = value - self.fingerprint = fingerprint - } - - public var value: String - public var fingerprint: UInt64 -} - -extension DHKey: Decodable { - enum CodingKeys: String, CodingKey { - case value = "Value" - case fingerprint = "Fingerprint" - } - - public static func decode(_ data: Data) throws -> Self { - let data = convertJsonNumberToString(in: data, at: "Value") - return try JSONDecoder().decode(Self.self, from: data) - } -} diff --git a/Sources/XXClient/Models/GroupMember.swift b/Sources/XXClient/Models/GroupMember.swift index b08d71c250c9af5d4c6ca504dda9fc8586117eb5..8ce7120a58880ab94f9f8a590ad6872565684bfd 100644 --- a/Sources/XXClient/Models/GroupMember.swift +++ b/Sources/XXClient/Models/GroupMember.swift @@ -1,30 +1,27 @@ import Foundation public struct GroupMember: Equatable { - public init(id: Data, dhKey: DHKey) { + public init(id: Data) { self.id = id - self.dhKey = dhKey } public var id: Data - public var dhKey: DHKey } extension GroupMember: Decodable { enum CodingKeys: String, CodingKey { case id = "ID" - case dhKey = "DhKey" } public static func decode(_ data: Data) throws -> Self { - let data = convertJsonNumberToString(in: data, at: "Value") + let data = convertJsonNumberToString(in: data, minNumberLength: 19) return try JSONDecoder().decode(Self.self, from: data) } } extension Array where Element == GroupMember { public static func decode(_ data: Data) throws -> Self { - let data = convertJsonNumberToString(in: data, at: "Value") + let data = convertJsonNumberToString(in: data, minNumberLength: 19) return try JSONDecoder().decode(Self.self, from: data) } } diff --git a/Tests/XXClientTests/Helpers/ConvertJsonNumberToStringTests.swift b/Tests/XXClientTests/Helpers/ConvertJsonNumberToStringTests.swift index db3a4b2edc77a81ae493a03b9294389ff7c6a203..4fc1ecd7f1b729f65f934d11adcac502c0127cf4 100644 --- a/Tests/XXClientTests/Helpers/ConvertJsonNumberToStringTests.swift +++ b/Tests/XXClientTests/Helpers/ConvertJsonNumberToStringTests.swift @@ -59,6 +59,28 @@ final class ConvertJsonNumberToStringTests: XCTestCase { } """ ) + + assert( + input: """ + { + "text": "hello", + "number1": 123456789, + "number2": 1234567890, + "number3": 123456789, + "number4": 1234567890 + } + """, + minNumberLength: 10, + expected: """ + { + "text": "hello", + "number1": 123456789, + "number2": "1234567890", + "number3": 123456789, + "number4": "1234567890" + } + """ + ) } } @@ -82,3 +104,24 @@ private func assert( line: line ) } + +private func assert( + input: String, + minNumberLength: Int, + expected: String, + file: StaticString = #file, + line: UInt = #line +) { + XCTAssertNoDifference( + String( + data: convertJsonNumberToString( + in: input.data(using: .utf8)!, + minNumberLength: minNumberLength + ), + encoding: .utf8 + )!, + expected, + file: file, + line: line + ) +} diff --git a/Tests/XXClientTests/Models/DHKeyTests.swift b/Tests/XXClientTests/Models/DHKeyTests.swift deleted file mode 100644 index 380d69edb5a1536c6277dbc82dd8b01f65388ca3..0000000000000000000000000000000000000000 --- a/Tests/XXClientTests/Models/DHKeyTests.swift +++ /dev/null @@ -1,23 +0,0 @@ -import CustomDump -import XCTest -@testable import XXClient - -final class DHKeyTests: XCTestCase { - func testCoding() throws { - let value = "1759426033802606996617132861414734059978289057332806031357800676138355264622676606691435603603751978195460163638145821347601916259127578968570412642641025630452893097179266022832268525346700655861033031712000288680395716922501450233258587788020541937373196899001184700899008948530359980753630443486308876999029238453979779103124291315202352475056237021681172884599194016245219278368648568458514708567045834427853469072638665888791358582182353417065794210125797368093469194927663862565508608719835557592421245749381164023134450699040591219966988201315627676532245052123725278573237006510683695959381015415110970848376498637637944431576313526294020390694483472829278364602405292767170719547347485307956614210210673321959886410245334772057212077704024337636501108566655549055129066343309591274727538343075929837698653965640646190405582788894021694347212874155979958144038307500444865955516612526623220973497735316081265793063949" - let fingerprint: UInt64 = 15989433043166758754 - let jsonString = """ - { - "Value": \(value), - "Fingerprint": \(fingerprint) - } - """ - let jsonData = jsonString.data(using: .utf8)! - let model = try DHKey.decode(jsonData) - - XCTAssertNoDifference(model, DHKey( - value: value, - fingerprint: fingerprint - )) - } -} diff --git a/Tests/XXClientTests/Models/GroupMemberTests.swift b/Tests/XXClientTests/Models/GroupMemberTests.swift index a682dfe97ca7c707845c678dca6cba006e4adf5a..36e178c08f37b0bec719f4c3b7747043a9920491 100644 --- a/Tests/XXClientTests/Models/GroupMemberTests.swift +++ b/Tests/XXClientTests/Models/GroupMemberTests.swift @@ -5,14 +5,12 @@ import XCTest final class GroupMemberTests: XCTestCase { func testCoding() throws { let idB64 = "U4x/lrFkvxuXu59LtHLon1sUhPJSCcnZND6SugndnVID" - let dhKeyValue = "1759426033802606996617132861414734059978289057332806031357800676138355264622676606691435603603751978195460163638145821347601916259127578968570412642641025630452893097179266022832268525346700655861033031712000288680395716922501450233258587788020541937373196899001184700899008948530359980753630443486308876999029238453979779103124291315202352475056237021681172884599194016245219278368648568458514708567045834427853469072638665888791358582182353417065794210125797368093469194927663862565508608719835557592421245749381164023134450699040591219966988201315627676532245052123725278573237006510683695959381015415110970848376498637637944431576313526294020390694483472829278364602405292767170719547347485307956614210210673321959886410245334772057212077704024337636501108566655549055129066343309591274727538343075929837698653965640646190405582788894021694347212874155979958144038307500444865955516612526623220973497735316081265793063949" - let dhKeyFingerprint: UInt64 = 15989433043166758754 let jsonString = """ { "ID": "\(idB64)", "DhKey": { - "Value": \(dhKeyValue), - "Fingerprint": \(dhKeyFingerprint) + "Value": 1759426033802606996617132861414734059978289057332806031357800676138355264622676606691435603603751978195460163638145821347601916259127578968570412642641025630452893097179266022832268525346700655861033031712000288680395716922501450233258587788020541937373196899001184700899008948530359980753630443486308876999029238453979779103124291315202352475056237021681172884599194016245219278368648568458514708567045834427853469072638665888791358582182353417065794210125797368093469194927663862565508608719835557592421245749381164023134450699040591219966988201315627676532245052123725278573237006510683695959381015415110970848376498637637944431576313526294020390694483472829278364602405292767170719547347485307956614210210673321959886410245334772057212077704024337636501108566655549055129066343309591274727538343075929837698653965640646190405582788894021694347212874155979958144038307500444865955516612526623220973497735316081265793063949, + "Fingerprint": 15989433043166758754 } } """ @@ -20,11 +18,7 @@ final class GroupMemberTests: XCTestCase { let model = try GroupMember.decode(jsonData) XCTAssertNoDifference(model, GroupMember( - id: Data(base64Encoded: idB64)!, - dhKey: DHKey( - value: dhKeyValue, - fingerprint: dhKeyFingerprint - ) + id: Data(base64Encoded: idB64)! )) let jsonArrayString = "[\(jsonString)]"