diff --git a/localPackages/BitFoundation/Sources/BitFoundation/FileTransferLimits.swift b/localPackages/BitFoundation/Sources/BitFoundation/FileTransferLimits.swift index 4c54f79c..aa6b9932 100644 --- a/localPackages/BitFoundation/Sources/BitFoundation/FileTransferLimits.swift +++ b/localPackages/BitFoundation/Sources/BitFoundation/FileTransferLimits.swift @@ -7,15 +7,9 @@ public enum FileTransferLimits { /// Compressed images after downscaling should comfortably fit under this budget. public static let maxImageBytes: Int = 512 * 1024 // 512 KiB /// Worst-case size once TLV metadata and binary packet framing are included for the largest payloads. - public static let maxFramedFileBytes: Int = { - let maxMetadataBytes = Int(UInt16.max) * 2 // fileName + mimeType TLVs - let tlvEnvelopeOverhead = 18 + maxMetadataBytes // TLV tags + lengths + metadata bytes - let binaryEnvelopeOverhead = BinaryProtocol.v2HeaderSize - + BinaryProtocol.senderIDSize - + BinaryProtocol.recipientIDSize - + BinaryProtocol.signatureSize - return maxPayloadBytes + tlvEnvelopeOverhead + binaryEnvelopeOverhead - }() + /// Note: This is now a hard expanded-size ceiling rather than the old tlv+frame formula. + /// MUST stay in sync with AppConstants.Protocol.MAX_PAYLOAD_LENGTH in the Android repo (issue #1618). + public static let maxFramedFileBytes: Int = 10_485_760 public static func isValidPayload(_ size: Int) -> Bool { size <= maxPayloadBytes diff --git a/localPackages/BitFoundation/Tests/BitFoundationTests/BinaryProtocolTests.swift b/localPackages/BitFoundation/Tests/BitFoundationTests/BinaryProtocolTests.swift index ddf7c8fc..b500afc4 100644 --- a/localPackages/BitFoundation/Tests/BitFoundationTests/BinaryProtocolTests.swift +++ b/localPackages/BitFoundation/Tests/BitFoundationTests/BinaryProtocolTests.swift @@ -350,6 +350,17 @@ struct BinaryProtocolTests { #expect(BinaryProtocol.decode(encoded) == nil) } + @Test("Regression test for issue #1618: decode payload between 1.13 MiB and 10 MiB") + func payloadSizeBetweenOldAndNewLimit() throws { + let payloadSize = 2_000_000 + let payload = Data(repeating: 0x41, count: payloadSize) + let packet = TestHelpers.createTestPacket(payload: payload, version: 2) + + let encodedData = try #require(BinaryProtocol.encode(packet), "Failed to encode packet") + let decodedPacket = try #require(BinaryProtocol.decode(encodedData), "Failed to decode packet") + #expect(decodedPacket.payload == payload) + } + // MARK: - Message Padding Tests @Test func messagePadding() throws { diff --git a/localPackages/BitFoundation/Tests/BitFoundationTests/TestHelpers.swift b/localPackages/BitFoundation/Tests/BitFoundationTests/TestHelpers.swift index 7b2ff6a3..94817a26 100644 --- a/localPackages/BitFoundation/Tests/BitFoundationTests/TestHelpers.swift +++ b/localPackages/BitFoundation/Tests/BitFoundationTests/TestHelpers.swift @@ -56,7 +56,8 @@ final class TestHelpers { recipientID: PeerID? = nil, payload: Data = Data("test payload".utf8), signature: Data? = nil, - ttl: UInt8 = 3 + ttl: UInt8 = 3, + version: UInt8 = 1 ) -> BitchatPacket { return BitchatPacket( type: type, @@ -65,7 +66,8 @@ final class TestHelpers { timestamp: UInt64(Date().timeIntervalSince1970 * 1000), payload: payload, signature: signature, - ttl: ttl + ttl: ttl, + version: version ) }