diff --git a/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/domain/UseCasesModule.kt b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/domain/UseCasesModule.kt index c16500c..c990bae 100644 --- a/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/domain/UseCasesModule.kt +++ b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/domain/UseCasesModule.kt @@ -91,9 +91,11 @@ class UseCasesModule { fun provideStorageSyncEngine( vaultsManager: IVaultsManager, groupStore: IStorageSyncGroupStore, + findStorageUseCase: FindStorageUseCase, ): IStorageSyncEngine = StorageSyncEngine( vaultsManager = vaultsManager, groupStore = groupStore, + findStorageUseCase = findStorageUseCase, ) @Provides diff --git a/domain-vault/src/main/java/com/github/nullptroma/wallenc/infrastructure/storages/UnlockManager.kt b/domain-vault/src/main/java/com/github/nullptroma/wallenc/infrastructure/storages/UnlockManager.kt index da8be25..7287221 100644 --- a/domain-vault/src/main/java/com/github/nullptroma/wallenc/infrastructure/storages/UnlockManager.kt +++ b/domain-vault/src/main/java/com/github/nullptroma/wallenc/infrastructure/storages/UnlockManager.kt @@ -33,10 +33,7 @@ class UnlockManager( override fun getOpenedStorageKey(uuid: UUID): EncryptKey? { val opened = _openedStorages.value val direct = opened[uuid] - if (direct != null) { - return direct.getKey() - } - return null + return direct?.getKey() } init { diff --git a/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/sync/StorageSyncViewModel.kt b/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/sync/StorageSyncViewModel.kt index 5b5fc38..f7e1de3 100644 --- a/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/sync/StorageSyncViewModel.kt +++ b/ui/src/main/java/com/github/nullptroma/wallenc/ui/screens/sync/StorageSyncViewModel.kt @@ -15,7 +15,6 @@ import com.github.nullptroma.wallenc.usecases.ManageStorageSyncGroupsUseCase import com.github.nullptroma.wallenc.usecases.RunStorageSyncUseCase import com.github.nullptroma.wallenc.usecases.StorageSyncCompatibilityInput import com.github.nullptroma.wallenc.usecases.isStorageCompatibleWithGroup -import com.github.nullptroma.wallenc.usecases.storageEncryptionSecret import com.github.nullptroma.wallenc.vault.contract.DescribedVault import com.github.nullptroma.wallenc.vault.contract.VaultDescriptor import dagger.hilt.android.lifecycle.HiltViewModel @@ -154,15 +153,12 @@ class StorageSyncViewModel @Inject constructor( return@withGroupMutationBusy UserNotification.TextRes(R.string.sync_storage_not_in_vaults) } val isEncrypted = storage.metaInfo.value.encInfo != null - val secret = vaultsManager.unlockManager - .getOpenedStorageKey(storageUuid) - ?.let(::storageEncryptionSecret) val result = groupsUseCase.addStorageToGroup( groupId = groupId, storageUuid = storageUuid, compatibility = StorageSyncCompatibilityInput( isEncrypted = isEncrypted, - encryptionSecret = secret, + encryptionSecret = null, ), ) when (result) { @@ -173,6 +169,9 @@ class StorageSyncViewModel @Inject constructor( AddStorageToSyncGroupResult.AlreadyInGroup -> UserNotification.TextRes( R.string.sync_msg_storage_already_added, ) + AddStorageToSyncGroupResult.EncryptedStorageNotAllowed -> UserNotification.TextRes( + R.string.sync_msg_only_plain_storage_allowed, + ) AddStorageToSyncGroupResult.MissingEncryptionSecret -> UserNotification.TextRes( R.string.sync_msg_storage_encryption_key_required, ) diff --git a/ui/src/main/res/values/strings.xml b/ui/src/main/res/values/strings.xml index 8a3a1b9..46d79e0 100644 --- a/ui/src/main/res/values/strings.xml +++ b/ui/src/main/res/values/strings.xml @@ -50,6 +50,7 @@ Хранилище добавлено в %1$s Хранилище убрано из %1$s Хранилище уже добавлено в группу + В группы синхронизации можно добавлять только незашифрованные хранилища Для зашифрованного хранилища нужно знать пароль (откройте его перед добавлением) Хранилище не совместимо с политикой шифрования группы Нельзя добавлять открытое виртуальное хранилище: синхронизация работает с исходными raw storage diff --git a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/ManageStorageSyncGroupsUseCase.kt b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/ManageStorageSyncGroupsUseCase.kt index 5fdee67..168e3b1 100644 --- a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/ManageStorageSyncGroupsUseCase.kt +++ b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/ManageStorageSyncGroupsUseCase.kt @@ -14,6 +14,7 @@ sealed interface AddStorageToSyncGroupResult { data object Added : AddStorageToSyncGroupResult data object GroupNotFound : AddStorageToSyncGroupResult data object AlreadyInGroup : AddStorageToSyncGroupResult + data object EncryptedStorageNotAllowed : AddStorageToSyncGroupResult data object IncompatibleEncryption : AddStorageToSyncGroupResult data object MissingEncryptionSecret : AddStorageToSyncGroupResult } @@ -56,14 +57,12 @@ class ManageStorageSyncGroupsUseCase( if (storageUuid in current.storageUuids) { return AddStorageToSyncGroupResult.AlreadyInGroup } - - val encryptedSecret = compatibility.encryptionSecret?.takeIf { it.isNotBlank() } - val effectiveEncryption = when { - !compatibility.isEncrypted -> StorageSyncGroupEncryptionKind.NONE to null - encryptedSecret == null -> return AddStorageToSyncGroupResult.MissingEncryptionSecret - else -> StorageSyncGroupEncryptionKind.PASSWORD to encryptedSecret + if (compatibility.isEncrypted) { + return AddStorageToSyncGroupResult.EncryptedStorageNotAllowed } + val effectiveEncryption = StorageSyncGroupEncryptionKind.NONE to null + val (nextKind, nextSecret) = when (current.encryptionKind) { StorageSyncGroupEncryptionKind.UNSET -> effectiveEncryption StorageSyncGroupEncryptionKind.NONE -> { @@ -74,13 +73,7 @@ class ManageStorageSyncGroupsUseCase( } StorageSyncGroupEncryptionKind.PASSWORD -> { - if ( - effectiveEncryption.first != StorageSyncGroupEncryptionKind.PASSWORD || - current.encryptionSecret != effectiveEncryption.second - ) { - return AddStorageToSyncGroupResult.IncompatibleEncryption - } - StorageSyncGroupEncryptionKind.PASSWORD to current.encryptionSecret + return AddStorageToSyncGroupResult.IncompatibleEncryption } } diff --git a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/StorageSyncEncryptionCompat.kt b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/StorageSyncEncryptionCompat.kt index f27e239..4539b13 100644 --- a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/StorageSyncEncryptionCompat.kt +++ b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/StorageSyncEncryptionCompat.kt @@ -15,16 +15,13 @@ fun isStorageCompatibleWithGroup( group: StorageSyncGroup, resolveStorageKey: (UUID) -> EncryptKey?, ): Boolean { + // Режим упрощён: в sync-группах допускаются только незашифрованные storage. + if (storage.metaInfo.value.encInfo != null) { + return false + } return when (group.encryptionKind) { StorageSyncGroupEncryptionKind.UNSET -> true - StorageSyncGroupEncryptionKind.NONE -> storage.metaInfo.value.encInfo == null - StorageSyncGroupEncryptionKind.PASSWORD -> { - val groupSecret = group.encryptionSecret ?: return false - if (storage.metaInfo.value.encInfo == null) { - return false - } - val currentSecret = resolveStorageKey(storage.uuid)?.let(::storageEncryptionSecret) - currentSecret != null && currentSecret == groupSecret - } + StorageSyncGroupEncryptionKind.NONE -> true + StorageSyncGroupEncryptionKind.PASSWORD -> false } } diff --git a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/StorageSyncEngine.kt b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/StorageSyncEngine.kt index 80ee7f7..71e72ee 100644 --- a/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/StorageSyncEngine.kt +++ b/usecases/src/main/java/com/github/nullptroma/wallenc/usecases/StorageSyncEngine.kt @@ -19,6 +19,7 @@ import java.util.concurrent.atomic.AtomicLong class StorageSyncEngine( private val vaultsManager: IVaultsManager, private val groupStore: IStorageSyncGroupStore, + private val findStorageUseCase: FindStorageUseCase, ) : IStorageSyncEngine { private val holderId: String = UUID.randomUUID().toString() private val groupMutexes = ConcurrentHashMap() @@ -207,8 +208,7 @@ class StorageSyncEngine( } private fun resolveStorages(uuids: Set): List { - val byUuid = vaultsManager.allStorages.value.associateBy { it.uuid } - return uuids.mapNotNull { byUuid[it] } + return uuids.mapNotNull(findStorageUseCase::find) } private fun latestByPath(entries: List): Map {