mirror of
https://github.com/permissionlesstech/bitchat-android.git
synced 2026-07-25 04:45:21 +00:00
remove the noise handshake if peer goes offline (#435)
This commit is contained in:
@@ -150,6 +150,13 @@ class BluetoothMeshService(private val context: Context) {
|
|||||||
}
|
}
|
||||||
override fun onPeerRemoved(peerID: String) {
|
override fun onPeerRemoved(peerID: String) {
|
||||||
try { gossipSyncManager.removeAnnouncementForPeer(peerID) } catch (_: Exception) { }
|
try { gossipSyncManager.removeAnnouncementForPeer(peerID) } catch (_: Exception) { }
|
||||||
|
// Also drop any Noise session state for this peer when they go offline
|
||||||
|
try {
|
||||||
|
encryptionService.removePeer(peerID)
|
||||||
|
Log.d(TAG, "Removed Noise session for offline peer $peerID")
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Log.w(TAG, "Failed to remove Noise session for $peerID: ${e.message}")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -101,9 +101,17 @@ class SecurityManager(private val encryptionService: EncryptionService, private
|
|||||||
// Skip our own handshake messages
|
// Skip our own handshake messages
|
||||||
if (peerID == myPeerID) return false
|
if (peerID == myPeerID) return false
|
||||||
|
|
||||||
|
// If we already have an established session but the peer is initiating a new handshake,
|
||||||
|
// drop the existing session so we can re-establish cleanly.
|
||||||
|
var forcedRehandshake = false
|
||||||
if (encryptionService.hasEstablishedSession(peerID)) {
|
if (encryptionService.hasEstablishedSession(peerID)) {
|
||||||
Log.d(TAG, "Handshake already completed with $peerID")
|
Log.d(TAG, "Received new Noise handshake from $peerID with an existing session. Dropping old session to re-handshake.")
|
||||||
return true
|
try {
|
||||||
|
encryptionService.removePeer(peerID)
|
||||||
|
forcedRehandshake = true
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Log.w(TAG, "Failed to remove existing Noise session for $peerID: ${e.message}")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (packet.payload.isEmpty()) {
|
if (packet.payload.isEmpty()) {
|
||||||
@@ -114,7 +122,7 @@ class SecurityManager(private val encryptionService: EncryptionService, private
|
|||||||
// Prevent duplicate handshake processing
|
// Prevent duplicate handshake processing
|
||||||
val exchangeKey = "$peerID-${packet.payload.sliceArray(0 until minOf(16, packet.payload.size)).contentHashCode()}"
|
val exchangeKey = "$peerID-${packet.payload.sliceArray(0 until minOf(16, packet.payload.size)).contentHashCode()}"
|
||||||
|
|
||||||
if (processedKeyExchanges.contains(exchangeKey)) {
|
if (!forcedRehandshake && processedKeyExchanges.contains(exchangeKey)) {
|
||||||
Log.d(TAG, "Already processed handshake: $exchangeKey")
|
Log.d(TAG, "Already processed handshake: $exchangeKey")
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user