diff --git a/app/src/main/java/com/bitchat/android/crypto/EncryptionService.kt b/app/src/main/java/com/bitchat/android/crypto/EncryptionService.kt index 2924c70d..ea943305 100644 --- a/app/src/main/java/com/bitchat/android/crypto/EncryptionService.kt +++ b/app/src/main/java/com/bitchat/android/crypto/EncryptionService.kt @@ -92,7 +92,7 @@ class EncryptionService(private val context: Context) { fun encrypt(data: ByteArray, peerID: String): ByteArray { val encrypted = noiseService.encrypt(data, peerID) if (encrypted == null) { - throw Exception("Failed to encrypt for $peerID - no established session") + throw Exception("Failed to encrypt for $peerID") } return encrypted } @@ -104,7 +104,7 @@ class EncryptionService(private val context: Context) { fun decrypt(data: ByteArray, peerID: String): ByteArray { val decrypted = noiseService.decrypt(data, peerID) if (decrypted == null) { - throw Exception("Failed to decrypt from $peerID - no established session") + throw Exception("Failed to decrypt from $peerID") } return decrypted } diff --git a/app/src/main/java/com/bitchat/android/mesh/BluetoothMeshService.kt b/app/src/main/java/com/bitchat/android/mesh/BluetoothMeshService.kt index 70ecac6a..1494b45b 100644 --- a/app/src/main/java/com/bitchat/android/mesh/BluetoothMeshService.kt +++ b/app/src/main/java/com/bitchat/android/mesh/BluetoothMeshService.kt @@ -61,6 +61,9 @@ class BluetoothMeshService(private val context: Context) { init { setupDelegates() + + // Wire up PacketProcessor reference for recursive handling in MessageHandler + messageHandler.packetProcessor = packetProcessor // startPeriodicDebugLogging() } diff --git a/app/src/main/java/com/bitchat/android/mesh/BluetoothPacketBroadcaster.kt b/app/src/main/java/com/bitchat/android/mesh/BluetoothPacketBroadcaster.kt index be56e511..504a342f 100644 --- a/app/src/main/java/com/bitchat/android/mesh/BluetoothPacketBroadcaster.kt +++ b/app/src/main/java/com/bitchat/android/mesh/BluetoothPacketBroadcaster.kt @@ -41,7 +41,7 @@ class BluetoothPacketBroadcaster( fragments.forEach { fragment -> broadcastSinglePacket(RoutedPacket(fragment), gattServer, characteristic) // 20ms delay between fragments (matching iOS/Rust) - delay(20) + delay(200) } } return diff --git a/app/src/main/java/com/bitchat/android/mesh/MessageHandler.kt b/app/src/main/java/com/bitchat/android/mesh/MessageHandler.kt index 4a3e7b68..a96cc2ef 100644 --- a/app/src/main/java/com/bitchat/android/mesh/MessageHandler.kt +++ b/app/src/main/java/com/bitchat/android/mesh/MessageHandler.kt @@ -27,6 +27,9 @@ class MessageHandler(private val myPeerID: String) { // Delegate for callbacks var delegate: MessageHandlerDelegate? = null + // Reference to PacketProcessor for recursive packet handling + var packetProcessor: PacketProcessor? = null + // Coroutines private val handlerScope = CoroutineScope(Dispatchers.IO + SupervisorJob()) @@ -88,14 +91,11 @@ class MessageHandler(private val myPeerID: String) { // Create a new routed packet with the decrypted inner packet val innerRouted = RoutedPacket(innerPacket, peerID, routed.relayAddress) - // Process the decrypted inner packet recursively - when (MessageType.fromValue(innerPacket.type)) { - MessageType.MESSAGE -> handleMessage(innerRouted) - MessageType.DELIVERY_ACK -> handleDeliveryAck(innerRouted) - MessageType.READ_RECEIPT -> handleReadReceipt(innerRouted) - else -> { - Log.w(TAG, "Unexpected inner packet type: ${innerPacket.type}") - } + // Use PacketProcessor to handle the inner packet recursively + if (packetProcessor != null) { + packetProcessor!!.processPacket(innerRouted) + } else { + Log.w(TAG, "PacketProcessor reference is null; cannot recursively process inner packet.") } } else { Log.w(TAG, "Failed to parse decrypted data as packet from $peerID") diff --git a/app/src/main/java/com/bitchat/android/mesh/PacketProcessor.kt b/app/src/main/java/com/bitchat/android/mesh/PacketProcessor.kt index af9e7f89..62038248 100644 --- a/app/src/main/java/com/bitchat/android/mesh/PacketProcessor.kt +++ b/app/src/main/java/com/bitchat/android/mesh/PacketProcessor.kt @@ -39,9 +39,9 @@ class PacketProcessor(private val myPeerID: String) { Log.d(TAG, "🎭 Created packet actor for peer: $peerID") try { for (packet in channel) { - Log.d(TAG, "🔒 Processing packet type ${packet.packet.type} from $peerID (serialized)") + Log.d(TAG, "Processing packet type ${packet.packet.type} from $peerID (serialized)") handleReceivedPacket(packet) - Log.d(TAG, "🔓 Completed packet type ${packet.packet.type} from $peerID") + Log.d(TAG, "Completed packet type ${packet.packet.type} from $peerID") } } finally { Log.d(TAG, "🎭 Packet actor for $peerID terminated") diff --git a/app/src/main/java/com/bitchat/android/noise/NoiseSession.kt b/app/src/main/java/com/bitchat/android/noise/NoiseSession.kt index e4abedb5..b4c44686 100644 --- a/app/src/main/java/com/bitchat/android/noise/NoiseSession.kt +++ b/app/src/main/java/com/bitchat/android/noise/NoiseSession.kt @@ -413,19 +413,17 @@ class NoiseSession( if (receiveCipher == null) { throw IllegalStateException("Receive cipher not available") } - + try { val plaintext = ByteArray(encryptedData.size) // Over-allocate for safety val plaintextLength = receiveCipher!!.decryptWithAd(null, encryptedData, 0, plaintext, 0, encryptedData.size) - messagesReceived++ - + val result = plaintext.copyOf(plaintextLength) - Log.d(TAG, "Real decrypted ${encryptedData.size} bytes to ${result.size} bytes from $peerID (msg #$messagesReceived)") + Log.d(TAG, "Decrypted ${encryptedData.size} bytes to ${result.size} bytes from $peerID (msg #$messagesReceived)") return result - } catch (e: Exception) { - Log.e(TAG, "Real decryption failed - exception: ${e.message}") + Log.e(TAG, "Decryption failed - exception: ${e.message}") // ENHANCED: Log cipher state and session details for debugging if (receiveCipher != null) {