Preserve Cryptors of the same cloud if the cloud gets updated
If e.g. a cloud gets updated during token refresh while browsing files we authenticate, save the updated cloud, update the vault and now no longer lock other vaults from the same cloud but update them too.
This commit is contained in:
parent
d9801662dd
commit
017ab520a2
data/src/main/java/org/cryptomator/data
@ -78,4 +78,13 @@ public class CryptoCloudContentRepositoryFactory implements CloudContentReposito
|
||||
throw new IllegalStateException(format("Cryptor already registered for vault %s", vault));
|
||||
}
|
||||
}
|
||||
|
||||
public void updateCloudInCryptor(Vault vault, Cloud cloud) {
|
||||
try {
|
||||
Cryptor cryptor = cryptors.get(vault).get();
|
||||
cryptors.replace(vault, Vault.aCopyOf(vault).withCloud(cloud).build(), cryptor);
|
||||
} catch (MissingCryptorException e) {
|
||||
// no-op
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -20,6 +20,8 @@ abstract class Cryptors internal constructor() {
|
||||
|
||||
abstract fun putIfAbsent(vault: Vault, cryptor: Cryptor): Boolean
|
||||
|
||||
abstract fun replace(old: Vault, updated: Vault, cryptor: Cryptor)
|
||||
|
||||
class Delegating : Cryptors() {
|
||||
|
||||
private val fallback = Default()
|
||||
@ -65,6 +67,10 @@ abstract class Cryptors internal constructor() {
|
||||
return delegate().putIfAbsent(vault, cryptor)
|
||||
}
|
||||
|
||||
override fun replace(old: Vault, updated: Vault, cryptor: Cryptor) {
|
||||
return delegate().replace(old, updated, cryptor)
|
||||
}
|
||||
|
||||
@Synchronized
|
||||
private fun delegate(): Cryptors {
|
||||
return delegate ?: fallback
|
||||
@ -108,6 +114,11 @@ abstract class Cryptors internal constructor() {
|
||||
}
|
||||
}
|
||||
|
||||
override fun replace(old: Vault, updated: Vault, cryptor: Cryptor) {
|
||||
cryptors.remove(old)
|
||||
cryptors[updated] = cryptor
|
||||
}
|
||||
|
||||
fun setOnChangeListener(onChangeListener: Runnable) {
|
||||
this.onChangeListener = onChangeListener
|
||||
}
|
||||
|
@ -68,7 +68,7 @@ class CloudRepositoryImpl implements CloudRepository {
|
||||
|
||||
Cloud storedCloud = mapper.fromEntity(database.store(mapper.toEntity(cloud)));
|
||||
|
||||
dispatchingCloudContentRepository.removeCloudContentRepositoryFor(storedCloud);
|
||||
dispatchingCloudContentRepository.updateCloudContentRepositoryFor(storedCloud);
|
||||
database.clearCache();
|
||||
|
||||
return storedCloud;
|
||||
|
@ -204,6 +204,16 @@ class DispatchingCloudContentRepository @Inject constructor(
|
||||
}
|
||||
}
|
||||
|
||||
fun updateCloudContentRepositoryFor(cloud: Cloud) {
|
||||
val clouds = delegates.keys.iterator()
|
||||
while (clouds.hasNext()) {
|
||||
val current = clouds.next()
|
||||
if (cloudIsDelegateOfCryptoCloud(current, cloud)) {
|
||||
cryptoCloudContentRepositoryFactory.updateCloudInCryptor((current as CryptoCloud).vault, cloud)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun cloudIsDelegateOfCryptoCloud(potentialCryptoCloud: Cloud, cloud: Cloud): Boolean {
|
||||
if (potentialCryptoCloud is CryptoCloud) {
|
||||
val delegate = potentialCryptoCloud.vault.cloud
|
||||
|
Loading…
x
Reference in New Issue
Block a user