From 7c940d209a89310d55266ba008901aa292723ab5 Mon Sep 17 00:00:00 2001 From: Douile <25043847+Douile@users.noreply.github.com> Date: Mon, 22 Aug 2022 16:19:59 +0100 Subject: [PATCH 1/2] Show warning in dialog when using default encryption key --- .../com/geeksville/mesh/ui/ChannelFragment.kt | 85 +++++++++++-------- app/src/main/res/values/strings.xml | 1 + 2 files changed, 49 insertions(+), 37 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/ui/ChannelFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/ChannelFragment.kt index efebd43dd..f38ad009b 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/ChannelFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/ChannelFragment.kt @@ -304,49 +304,60 @@ class ChannelFragment : ScreenFragment("Channel"), Logging { } } else { // User just locked it, we should warn and then apply changes to radio - MaterialAlertDialogBuilder(requireContext()) - .setTitle(R.string.change_channel) - .setMessage(R.string.are_you_sure_channel) - .setNeutralButton(R.string.cancel) { _, _ -> - setGUIfromModel() + + model.channels.value?.primaryChannel?.let { oldPrimary -> + var newSettings = oldPrimary.settings.toBuilder() + val newName = binding.channelNameEdit.text.toString().trim() + + // Find the new modem config + val selectedModemPresetString = + binding.filledExposedDropdown.editableText.toString() + var newModemPreset = getModemPreset(selectedModemPresetString) + if (newModemPreset == ConfigProtos.Config.LoRaConfig.ModemPreset.UNRECOGNIZED) // Huh? didn't find it - keep same + newModemPreset = oldPrimary.loraConfig.modemPreset + + // Generate a new AES256 key if the user changes channel name or the name is non-default and the settings changed + val shouldUseRandomKey = + newName != originalName || (newName.isNotEmpty() && newModemPreset != oldPrimary.loraConfig.modemPreset) + if (shouldUseRandomKey) { + + // Install a new customized channel + debug("ASSIGNING NEW AES256 KEY") + val random = SecureRandom() + val bytes = ByteArray(32) + random.nextBytes(bytes) + newSettings.name = newName.take(11) // proto max_size:12 + newSettings.psk = ByteString.copyFrom(bytes) + } else { + debug("Switching back to default channel") + newSettings = Channel.default.settings.toBuilder() } - .setPositiveButton(getString(R.string.accept)) { _, _ -> - // Generate a new channel with only the changes the user can change in the GUI - model.channels.value?.primaryChannel?.let { oldPrimary -> - var newSettings = oldPrimary.settings.toBuilder() - val newName = binding.channelNameEdit.text.toString().trim() - // Find the new modem config - val selectedModemPresetString = - binding.filledExposedDropdown.editableText.toString() - var newModemPreset = getModemPreset(selectedModemPresetString) - if (newModemPreset == ConfigProtos.Config.LoRaConfig.ModemPreset.UNRECOGNIZED) // Huh? didn't find it - keep same - newModemPreset = oldPrimary.loraConfig.modemPreset + // No matter what apply the speed selection from the user + val newLoRaConfig = ConfigProtos.Config.LoRaConfig.newBuilder() + .setRegion(model.region) + .setModemPreset(newModemPreset) - // Generate a new AES256 key if the user changes channel name or the name is non-default and the settings changed - if (newName != originalName || (newName.isNotEmpty() && newModemPreset != oldPrimary.loraConfig.modemPreset)) { - // Install a new customized channel - debug("ASSIGNING NEW AES256 KEY") - val random = SecureRandom() - val bytes = ByteArray(32) - random.nextBytes(bytes) - newSettings.name = newName.take(11) // proto max_size:12 - newSettings.psk = ByteString.copyFrom(bytes) - } else { - debug("Switching back to default channel") - newSettings = Channel.default.settings.toBuilder() + MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.change_channel) + .setMessage(buildString { + append(getString(R.string.are_you_sure_channel)) + if (!shouldUseRandomKey) { + append("\n\n") + append(getString(R.string.warning_default_channel)) } - - // No matter what apply the speed selection from the user - val newLoRaConfig = ConfigProtos.Config.LoRaConfig.newBuilder() - .setRegion(model.region) - .setModemPreset(newModemPreset) - - installSettings(newSettings.build(),newLoRaConfig.build()) + }) + .setNeutralButton(R.string.cancel) { _, _ -> + setGUIfromModel() } - } - .show() + .setPositiveButton(getString(R.string.accept)) { _, _ -> + // Generate a new channel with only the changes the user can change in the GUI + + installSettings(newSettings.build(), newLoRaConfig.build()) + } + .show() + } } onEditingChanged() // update GUI on what user is allowed to edit/share diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 88a99668b..389abfd46 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -155,4 +155,5 @@ Message Append to message Instantly send + As you have not changed the channel name you are using the default encryption key (any Meshtastic user can read your messages). From f8cec34862dc031e2bf5dd637c577d409ef4ec17 Mon Sep 17 00:00:00 2001 From: Tom <25043847+Douile@users.noreply.github.com> Date: Tue, 23 Aug 2022 10:44:34 +0000 Subject: [PATCH 2/2] Improve warning message Improve wording and add channel name to the default psk warning Co-authored-by: Andre K --- .../com/geeksville/mesh/ui/ChannelFragment.kt | 16 +++++++++------- app/src/main/res/values/strings.xml | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/ui/ChannelFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/ChannelFragment.kt index f38ad009b..bd4fe6a35 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/ChannelFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/ChannelFragment.kt @@ -338,16 +338,18 @@ class ChannelFragment : ScreenFragment("Channel"), Logging { .setRegion(model.region) .setModemPreset(newModemPreset) + val humanName = Channel(newSettings.build(), newLoRaConfig.build()).humanName + binding.channelNameEdit.setText(humanName) + + val message = buildString { + append(getString(R.string.are_you_sure_channel)) + if (!shouldUseRandomKey) + append("\n\n" + getString(R.string.warning_default_psk).format(humanName)) + } MaterialAlertDialogBuilder(requireContext()) .setTitle(R.string.change_channel) - .setMessage(buildString { - append(getString(R.string.are_you_sure_channel)) - if (!shouldUseRandomKey) { - append("\n\n") - append(getString(R.string.warning_default_channel)) - } - }) + .setMessage(message) .setNeutralButton(R.string.cancel) { _, _ -> setGUIfromModel() } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 389abfd46..4cbea2cab 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -155,5 +155,5 @@ Message Append to message Instantly send - As you have not changed the channel name you are using the default encryption key (any Meshtastic user can read your messages). + Empty channel names use the default encryption key (any device on %s can read your messages).