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 {