Meshtastic-Android/app/src/main/java/com/geeksville/mesh/service/MeshRouter.kt

50 lines
1.7 KiB
Kotlin
Raw Normal View History

/*
* Copyright (c) 2025-2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.geeksville.mesh.service
import kotlinx.coroutines.CoroutineScope
import javax.inject.Inject
import javax.inject.Singleton
/**
* Orchestrates the specialized packet handlers for the [MeshService]. This class serves as a central registry and
* lifecycle manager for all routing sub-components.
*/
@Suppress("LongParameterList")
@Singleton
class MeshRouter
@Inject
constructor(
val dataHandler: MeshDataHandler,
val configHandler: MeshConfigHandler,
val tracerouteHandler: MeshTracerouteHandler,
val neighborInfoHandler: MeshNeighborInfoHandler,
val configFlowManager: MeshConfigFlowManager,
val mqttManager: MeshMqttManager,
val actionHandler: MeshActionHandler,
feature: Add TAK passphrase lock/unlock support Implement the client-side TAK passphrase authentication flow for devices running TAK-locked firmware. Key components: - TakPassphraseStore: per-device passphrase persistence using EncryptedSharedPreferences (Android Keystore AES-256-GCM), with boot and hour TTL fields stored alongside the passphrase - TakLockHandler: orchestrates the full lock/unlock lifecycle — auto-unlock on reconnect using stored credentials, passphrase submission, token info parsing, and backoff/failure handling - MeshCommandSender: sendTakPassphrase() and sendTakLockNow() build plain local packets that bypass PKC signing and session_passkey; hour TTL is encoded as an absolute Unix epoch as required by firmware - ServiceRepository: TakLockState sealed class (None, Locked, NeedsProvision, Unlocked, LockNowAcknowledged, UnlockFailed, UnlockBackoff), TakTokenInfo (boots remaining + expiry epoch), and sessionAuthorized flag - TakUnlockDialog: Compose dialog for passphrase entry, shown on Locked and NeedsProvision states; onDismissRequest is a no-op to prevent race conditions with firmware response timing; cancel disconnects the user and navigates to the Connections tab - Lock Now (Security settings): immediately disconnects the client after informing firmware, purges cached config, navigates away without showing a passphrase dialog - ConnectionsScreen: suppress "region unset" prompt while the device is TAK-locked, since pre-auth config is zeroed/redacted and would lead the user to a blank LoRa settings screen - AIDL: sendTakUnlock() and sendTakLockNow() wired through MeshService → MeshActionHandler → TakLockHandler - Security settings: "Lock Now (TAK)" button and token info display showing boots remaining and expiry date
2026-02-27 08:31:05 -05:00
val takLockHandler: TakLockHandler,
) {
fun start(scope: CoroutineScope) {
dataHandler.start(scope)
configHandler.start(scope)
tracerouteHandler.start(scope)
neighborInfoHandler.start(scope)
configFlowManager.start(scope)
actionHandler.start(scope)
}
}