Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate mfkey32 to new api #1006

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.flipperdevices.bridge.connection.config.api

import com.flipperdevices.bridge.connection.config.api.model.FDeviceBaseModel
import com.flipperdevices.core.preference.pb.SavedDevice
import kotlinx.coroutines.flow.Flow

interface FDevicePersistedStorage {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import com.flipperdevices.core.log.LogTagProvider
import com.flipperdevices.core.log.info
import com.flipperdevices.core.log.warn
import com.flipperdevices.core.preference.pb.FlipperZeroBle
import com.flipperdevices.core.preference.pb.FlipperZeroBle.HardwareColor
import com.flipperdevices.core.preference.pb.NewPairSettings
import com.flipperdevices.core.preference.pb.SavedDevice
import com.squareup.anvil.annotations.ContributesBinding
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,8 @@ import com.flipperdevices.bridge.connection.feature.common.api.FDeviceFeatureApi
import com.flipperdevices.bridge.connection.feature.common.api.FDeviceFeatureQualifier
import com.flipperdevices.bridge.connection.feature.common.api.FUnsafeDeviceFeatureApi
import com.flipperdevices.bridge.connection.feature.getinfo.api.FGetInfoFeatureApi
import com.flipperdevices.bridge.connection.feature.protocolversion.api.FVersionFeatureApi
import com.flipperdevices.bridge.connection.feature.rpc.api.FRpcFeatureApi
import com.flipperdevices.bridge.connection.transport.common.api.FConnectedDeviceApi
import com.flipperdevices.bridge.connection.transport.common.api.meta.FTransportMetaInfoApi
import com.flipperdevices.core.data.SemVer
import com.flipperdevices.core.di.AppGraph
import com.flipperdevices.core.log.error
import com.flipperdevices.core.log.info
import com.squareup.anvil.annotations.ContributesMultibinding
import kotlinx.coroutines.CoroutineScope
import javax.inject.Inject
Expand Down
2 changes: 0 additions & 2 deletions components/nfc/mfkey32/api/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ dependencies {
implementation(projects.components.core.ui.decompose)
implementation(libs.bundles.decompose)

implementation(projects.components.bridge.api)

implementation(projects.components.bridge.connection.feature.storage.api)

implementation(libs.kotlin.coroutines)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.flipperdevices.nfc.mfkey32.api

import com.flipperdevices.bridge.api.manager.FlipperRequestApi
import com.flipperdevices.bridge.connection.feature.storage.api.fm.FFileStorageMD5Api
import kotlinx.coroutines.flow.Flow

Expand All @@ -14,8 +13,5 @@ interface MfKey32Api {

fun hasNotification(): Flow<Boolean>

@Deprecated("Use new api")
suspend fun checkBruteforceFileExist(requestApi: FlipperRequestApi)

suspend fun checkBruteforceFileExist(md5StorageApi: FFileStorageMD5Api)
}
7 changes: 2 additions & 5 deletions components/nfc/mfkey32/screen/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,8 @@ dependencies {
implementation(projects.components.core.markdown)
implementation(projects.components.core.progress)

implementation(projects.components.bridge.api)
implementation(projects.components.bridge.service.api)
implementation(projects.components.bridge.pbutils)
implementation(projects.components.bridge.rpc.api)

implementation(projects.components.bridge.connection.feature.provider.api)
implementation(projects.components.bridge.connection.feature.common.api)
implementation(projects.components.bridge.connection.feature.storage.api)

implementation(projects.components.analytics.metric.api)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,11 @@
package com.flipperdevices.nfc.mfkey32.screen.api

import com.flipperdevices.bridge.api.manager.FlipperRequestApi
import com.flipperdevices.bridge.api.model.wrapToRequest
import com.flipperdevices.bridge.connection.feature.storage.api.fm.FFileStorageMD5Api
import com.flipperdevices.core.di.AppGraph
import com.flipperdevices.nfc.mfkey32.api.MfKey32Api
import com.flipperdevices.nfc.mfkey32.screen.viewmodel.PATH_NONCE_LOG
import com.flipperdevices.protobuf.main
import com.flipperdevices.protobuf.storage.md5sumRequest
import com.squareup.anvil.annotations.ContributesBinding
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.first
import javax.inject.Inject
import javax.inject.Singleton

Expand All @@ -24,26 +19,6 @@ class MfKey32ApiImpl @Inject constructor() : MfKey32Api {
private val hasNotificationFlow = MutableStateFlow(false)
override fun hasNotification() = hasNotificationFlow

@Deprecated("Use new api")
override suspend fun checkBruteforceFileExist(
requestApi: FlipperRequestApi
) {
val response = requestApi.request(
main {
storageMd5SumRequest = md5sumRequest {
path = PATH_NONCE_LOG
}
}.wrapToRequest()
).first()
if (response.hasStorageMd5SumResponse()) {
_isBruteforceFileExist = true
hasNotificationFlow.emit(true)
} else {
_isBruteforceFileExist = false
hasNotificationFlow.emit(false)
}
}

override suspend fun checkBruteforceFileExist(md5StorageApi: FFileStorageMD5Api) {
val isMd5Exists = md5StorageApi.md5(PATH_NONCE_LOG).isSuccess
_isBruteforceFileExist = isMd5Exists
Expand Down
Original file line number Diff line number Diff line change
@@ -1,33 +1,29 @@
package com.flipperdevices.nfc.mfkey32.screen.viewmodel

import com.flipperdevices.bridge.api.manager.FlipperRequestApi
import com.flipperdevices.bridge.api.model.wrapToRequest
import com.flipperdevices.bridge.protobuf.streamToCommandFlow
import com.flipperdevices.bridge.rpc.api.FlipperStorageApi
import com.flipperdevices.bridge.connection.feature.storage.api.exception.FStorageFileNotFoundException
import com.flipperdevices.bridge.connection.feature.storage.api.fm.FFileDownloadApi
import com.flipperdevices.bridge.connection.feature.storage.api.fm.FFileUploadApi
import com.flipperdevices.core.FlipperStorageProvider
import com.flipperdevices.core.ktx.jre.withLock
import com.flipperdevices.core.log.LogTagProvider
import com.flipperdevices.core.log.error
import com.flipperdevices.core.log.info
import com.flipperdevices.core.progress.copyWithProgress
import com.flipperdevices.nfc.mfkey32.screen.model.DuplicatedSource
import com.flipperdevices.nfc.mfkey32.screen.model.FoundedInformation
import com.flipperdevices.nfc.mfkey32.screen.model.FoundedKey
import com.flipperdevices.protobuf.Flipper
import com.flipperdevices.protobuf.storage.file
import com.flipperdevices.protobuf.storage.writeRequest
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.sync.Mutex
import okio.buffer
import okio.source
import java.io.ByteArrayInputStream
import java.io.FileNotFoundException

private const val FLIPPER_DICT_USER_PATH = "/ext/nfc/assets/mf_classic_dict_user.nfc"
private const val FLIPPER_DICT_PATH = "/ext/nfc/assets/mf_classic_dict.nfc"

class ExistedKeysStorage(
private val flipperStorageApi: FlipperStorageApi,
private val storageProvider: FlipperStorageProvider
) : LogTagProvider {
override val TAG = "ExistedKeysStorage"
Expand All @@ -40,27 +36,29 @@ class ExistedKeysStorage(

fun getFoundedInformation(): StateFlow<FoundedInformation> = foundedInformationStateFlow

suspend fun load() {
val foundedUserDict = loadDict(FLIPPER_DICT_USER_PATH)
suspend fun load(fFileDownloadApi: FFileDownloadApi) {
val foundedUserDict = loadDict(fFileDownloadApi, FLIPPER_DICT_USER_PATH)
userDict.addAll(foundedUserDict)
userKeys.addAll(foundedUserDict)
val foundedDict = loadDict(FLIPPER_DICT_PATH)
val foundedDict = loadDict(fFileDownloadApi, FLIPPER_DICT_PATH)
flipperKeys.addAll(foundedDict)
}

suspend fun upload(requestApi: FlipperRequestApi): List<String> {
suspend fun upload(fFileUploadApi: FFileUploadApi): List<String> {
val bytesToWrite = userKeys.joinToString(separator = "\n", postfix = "\n").toByteArray()
val response = ByteArrayInputStream(bytesToWrite).use { stream ->
val commandFlow = streamToCommandFlow(stream, bytesToWrite.size.toLong()) { chunkData ->
storageWriteRequest = writeRequest {
path = FLIPPER_DICT_USER_PATH
file = file { data = chunkData }
try {
ByteArrayInputStream(bytesToWrite).source().buffer().use { source ->
fFileUploadApi.sink(FLIPPER_DICT_USER_PATH).use { sink ->
source.copyWithProgress(
sink = sink,
sourceLength = { bytesToWrite.size.toLong() }
)
}
}
requestApi.request(commandFlow.map { it.wrapToRequest() })
}
if (response.commandStatus != Flipper.CommandStatus.OK) {
throw FileNotFoundException()
} catch (e: FStorageFileNotFoundException) {
throw e
} catch (e: Exception) {
error(e) { "#upload Unhandled exception" }
}
return userKeys.minus(userDict).distinct()
}
Expand Down Expand Up @@ -95,14 +93,14 @@ class ExistedKeysStorage(
}
}

private suspend fun loadDict(path: String): List<String> {
private suspend fun loadDict(fFileDownloadApi: FFileDownloadApi, path: String): List<String> {
return try {
storageProvider.useTemporaryFile { tmpFile ->
flipperStorageApi.download(
fFileDownloadApi.download(
pathOnFlipper = path,
fileOnAndroid = tmpFile.toFile(),
progressListener = { progress ->
info { "Download dict with progress $progress" }
fileOnAndroid = tmpFile,
progressListener = { current, max ->
info { "Download dict with progress $current/$max" }
}
)
tmpFile.toFile().readLines()
Expand Down
Loading
Loading