From 587c6c91f454224b753cc42cb2b89a4866d1ec7b Mon Sep 17 00:00:00 2001 From: andrekir Date: Sun, 22 Sep 2024 23:01:33 -0300 Subject: [PATCH] refactor: ensure backward compatibility for PKC encryption --- .../com/geeksville/mesh/database/entity/NodeEntity.kt | 2 ++ .../java/com/geeksville/mesh/service/MeshService.kt | 11 ++++++++--- app/src/main/java/com/geeksville/mesh/ui/NodeItem.kt | 3 +-- .../main/java/com/geeksville/mesh/ui/UsersFragment.kt | 3 ++- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/database/entity/NodeEntity.kt b/app/src/main/java/com/geeksville/mesh/database/entity/NodeEntity.kt index 96d7408ee..04f977ba4 100644 --- a/app/src/main/java/com/geeksville/mesh/database/entity/NodeEntity.kt +++ b/app/src/main/java/com/geeksville/mesh/database/entity/NodeEntity.kt @@ -79,6 +79,8 @@ data class NodeEntity( return (if (brightness > 0.5) Color.BLACK else Color.WHITE) to Color.rgb(r, g, b) } + val hasPKC get() = !user.publicKey.isEmpty + val batteryLevel get() = deviceMetrics.batteryLevel val voltage get() = deviceMetrics.voltage val batteryStr get() = if (batteryLevel in 1..100) "$batteryLevel%" else "" diff --git a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt index f39481851..af48162bc 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt @@ -474,8 +474,13 @@ class MeshService : Service(), Logging { /// Admin channel index private val adminChannelIndex: Int - get() = channelSet.settingsList.indexOfFirst { it.name.equals("admin", ignoreCase = true) } - .coerceAtLeast(0) + get() = if (nodeDBbyNodeNum[myNodeNum]?.hasPKC == true) { // TODO use meta.hasPKC + DataPacket.PKC_CHANNEL_INDEX + } else { + channelSet.settingsList + .indexOfFirst { it.name.equals("admin", ignoreCase = true) } + .coerceAtLeast(0) + } /// Generate a new mesh packet builder with our node as the sender, and the specified node num private fun newMeshPacketTo(idNum: Int) = MeshPacket.newBuilder().apply { @@ -513,7 +518,7 @@ class MeshService : Service(), Logging { decoded = MeshProtos.Data.newBuilder().also { initFn(it) }.build() - if (decoded.portnum in setOf(Portnums.PortNum.TEXT_MESSAGE_APP, Portnums.PortNum.ADMIN_APP)) { + if (channel == DataPacket.PKC_CHANNEL_INDEX) { nodeDBbyNodeNum[to]?.user?.publicKey?.let { publicKey -> pkiEncrypted = !publicKey.isEmpty this.publicKey = publicKey diff --git a/app/src/main/java/com/geeksville/mesh/ui/NodeItem.kt b/app/src/main/java/com/geeksville/mesh/ui/NodeItem.kt index e429bf91d..7d50aa218 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/NodeItem.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/NodeItem.kt @@ -75,7 +75,6 @@ fun NodeItem( expanded: Boolean = false, currentTimeMillis: Long, ) { - val hasPublicKey = !thatNode.user.publicKey.isEmpty val isUnknownUser = thatNode.user.hwModel == MeshProtos.HardwareModel.UNSET val unknownShortName = stringResource(id = R.string.unknown_node_short_name) val longName = thatNode.user.longName.ifEmpty { stringResource(id = R.string.unknown_username) } @@ -163,7 +162,7 @@ fun NodeItem( ) Text( modifier = Modifier.weight(1f), - text = if (hasPublicKey) "🔒 $longName" else longName, + text = if (thatNode.hasPKC) "🔒 $longName" else longName, style = style, textDecoration = TextDecoration.LineThrough.takeIf { isIgnored }, softWrap = true, diff --git a/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt index c7d794bde..bcb9bb21c 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt @@ -90,7 +90,8 @@ class UsersFragment : ScreenFragment("Users"), Logging { } private fun navigateToMessages(node: NodeEntity) = node.user.let { user -> - val channel = if (user.publicKey.isEmpty) node.channel else DataPacket.PKC_CHANNEL_INDEX + val hasPKC = model.ourNodeInfo.value?.hasPKC == true && node.hasPKC // TODO use meta.hasPKC + val channel = if (hasPKC) DataPacket.PKC_CHANNEL_INDEX else node.channel val contactKey = "$channel${user.id}" info("calling MessagesFragment filter: $contactKey") parentFragmentManager.navigateToMessages(contactKey, user.longName)