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:
Julian Raufelder 2022-02-12 22:22:00 +01:00
parent d9801662dd
commit 017ab520a2
No known key found for this signature in database
GPG Key ID: 17EE71F6634E381D
4 changed files with 31 additions and 1 deletions

@ -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