From c685cc36458396bcdfc3c2020a4dae1ad4d10cc6 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Fri, 3 Dec 2021 16:49:10 +0100 Subject: [PATCH] Re-initialise the client to access the cloud when credentials changes Fixes #395 --- .../cryptomator/data/cloud/dropbox/DropboxClientFactory.kt | 4 ++++ .../data/cloud/dropbox/DropboxCloudContentRepository.kt | 2 +- .../java/org/cryptomator/data/cloud/dropbox/DropboxImpl.kt | 4 ++++ .../cryptomator/data/cloud/onedrive/OnedriveClientFactory.kt | 5 +++++ .../java/org/cryptomator/data/cloud/onedrive/OnedriveImpl.kt | 2 ++ .../org/cryptomator/data/cloud/pcloud/PCloudClientFactory.kt | 5 +++++ .../cryptomator/data/cloud/pcloud/PCloudContentRepository.kt | 2 +- .../java/org/cryptomator/data/cloud/pcloud/PCloudImpl.kt | 4 ++++ .../java/org/cryptomator/data/cloud/s3/S3ClientFactory.kt | 5 +++++ .../cryptomator/data/cloud/s3/S3CloudContentRepository.kt | 2 +- data/src/main/java/org/cryptomator/data/cloud/s3/S3Impl.kt | 4 ++++ .../data/cloud/webdav/network/WebDavCompatibleHttpClient.kt | 5 ++--- .../data/cloud/googledrive/GoogleDriveClientFactory.kt | 4 ++++ .../cloud/googledrive/GoogleDriveCloudContentRepository.kt | 2 +- .../cryptomator/data/cloud/googledrive/GoogleDriveImpl.kt | 4 ++++ 15 files changed, 47 insertions(+), 7 deletions(-) diff --git a/data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxClientFactory.kt b/data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxClientFactory.kt index 6458d4da..f0bc0b0c 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxClientFactory.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxClientFactory.kt @@ -56,5 +56,9 @@ class DropboxClientFactory { return HttpLoggingInterceptor(logger, context) } + fun logout() { + instance = null + } + } } diff --git a/data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxCloudContentRepository.kt b/data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxCloudContentRepository.kt index 1d9f39d1..101330e5 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxCloudContentRepository.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxCloudContentRepository.kt @@ -203,7 +203,7 @@ internal class DropboxCloudContentRepository(private val cloud: DropboxCloud, co @Throws(BackendException::class) override fun logout(cloud: DropboxCloud) { - // empty + this.cloud.logout() } } diff --git a/data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxImpl.kt b/data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxImpl.kt index bb6b6d5b..05555f46 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxImpl.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxImpl.kt @@ -372,6 +372,10 @@ internal class DropboxImpl(cloud: DropboxCloud, context: Context) { return currentAccount.name.displayName } + fun logout() { + DropboxClientFactory.logout() + } + companion object { private const val CHUNKED_UPLOAD_CHUNK_SIZE = 8L shl 20 diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveClientFactory.kt b/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveClientFactory.kt index 684571c9..272071b5 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveClientFactory.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveClientFactory.kt @@ -59,5 +59,10 @@ class OnedriveClientFactory private constructor() { return HttpLoggingInterceptor(logger, context) } + + @Synchronized + fun logout() { + instance = null + } } } diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveImpl.kt b/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveImpl.kt index 692a260a..2e3343ed 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveImpl.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveImpl.kt @@ -481,6 +481,8 @@ internal class OnedriveImpl(cloud: OnedriveCloud, context: Context, nodeInfoCach } catch (e: ExecutionException) { throw FatalBackendException(e) } + + OnedriveClientFactory.logout() } companion object { diff --git a/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudClientFactory.kt b/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudClientFactory.kt index c69d2f3b..29cc8d71 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudClientFactory.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudClientFactory.kt @@ -53,5 +53,10 @@ class PCloudClientFactory { return HttpLoggingInterceptor(logger, context) } + + @Synchronized + fun logout() { + instance = null + } } } diff --git a/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudContentRepository.kt b/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudContentRepository.kt index 4b23cf25..39404bb8 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudContentRepository.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudContentRepository.kt @@ -171,7 +171,7 @@ internal class PCloudContentRepository(private val cloud: PCloud, context: Conte @Throws(BackendException::class) override fun logout(cloud: PCloud) { - // empty + this.cloud.logout() } } diff --git a/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudImpl.kt b/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudImpl.kt index 637a3714..351f174f 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudImpl.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudImpl.kt @@ -359,6 +359,10 @@ internal class PCloudImpl(context: Context, cloud: PCloud) { } } + fun logout() { + PCloudClientFactory.logout() + } + init { if (cloud.accessToken() == null) { throw NoAuthenticationProvidedException(cloud) diff --git a/data/src/main/java/org/cryptomator/data/cloud/s3/S3ClientFactory.kt b/data/src/main/java/org/cryptomator/data/cloud/s3/S3ClientFactory.kt index 501fc6ea..ca0e188a 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/s3/S3ClientFactory.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/s3/S3ClientFactory.kt @@ -85,5 +85,10 @@ class S3ClientFactory private constructor() { val activeNetworkInfo = connectivityManager.activeNetworkInfo return activeNetworkInfo != null && activeNetworkInfo.isConnected } + + @Synchronized + fun logout() { + instance = null + } } } diff --git a/data/src/main/java/org/cryptomator/data/cloud/s3/S3CloudContentRepository.kt b/data/src/main/java/org/cryptomator/data/cloud/s3/S3CloudContentRepository.kt index ce9e038f..071ca589 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/s3/S3CloudContentRepository.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/s3/S3CloudContentRepository.kt @@ -169,7 +169,7 @@ internal class S3CloudContentRepository(private val cloud: S3Cloud, context: Con @Throws(BackendException::class) override fun logout(cloud: S3Cloud) { - // empty + this.cloud.logout() } } diff --git a/data/src/main/java/org/cryptomator/data/cloud/s3/S3Impl.kt b/data/src/main/java/org/cryptomator/data/cloud/s3/S3Impl.kt index f8d4429f..e281f02b 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/s3/S3Impl.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/s3/S3Impl.kt @@ -366,6 +366,10 @@ internal class S3Impl(context: Context, cloud: S3Cloud) { } } + fun logout() { + S3ClientFactory.logout() + } + companion object { private const val DELIMITER = "/" diff --git a/data/src/main/java/org/cryptomator/data/cloud/webdav/network/WebDavCompatibleHttpClient.kt b/data/src/main/java/org/cryptomator/data/cloud/webdav/network/WebDavCompatibleHttpClient.kt index 22d912c2..7ffc8fe4 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/webdav/network/WebDavCompatibleHttpClient.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/webdav/network/WebDavCompatibleHttpClient.kt @@ -110,12 +110,11 @@ internal class WebDavCompatibleHttpClient(cloud: WebDavCloud, context: Context) val credentials = Credentials(webDavCloud.username(), decryptPassword(context, webDavCloud.password())) val basicAuthenticator = BasicAuthenticator(credentials, StandardCharsets.UTF_8) val digestAuthenticator = DigestAuthenticator(credentials) - var result: Authenticator = DispatchingAuthenticator.Builder() // + val authenticator = DispatchingAuthenticator.Builder() // .with("digest", digestAuthenticator) // .with("basic", basicAuthenticator) // .build() - result = CachingAuthenticatorDecorator(result, authCache) - return result + return CachingAuthenticatorDecorator(authenticator, authCache) } @Throws(UnableToDecryptWebdavPasswordException::class) diff --git a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveClientFactory.kt b/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveClientFactory.kt index 66b5a2dc..acc5e6d5 100644 --- a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveClientFactory.kt +++ b/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveClientFactory.kt @@ -61,5 +61,9 @@ class GoogleDriveClientFactory internal constructor() { } .build() } + + fun invalidateClient() { + instance = null + } } } diff --git a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveCloudContentRepository.kt b/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveCloudContentRepository.kt index 85f160d7..e20369f9 100644 --- a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveCloudContentRepository.kt +++ b/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveCloudContentRepository.kt @@ -188,7 +188,7 @@ internal class GoogleDriveCloudContentRepository(context: Context, private val c @Throws(BackendException::class) override fun logout(cloud: GoogleDriveCloud) { - // empty + impl.logout() } } diff --git a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveImpl.kt b/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveImpl.kt index 4365e810..fe021368 100644 --- a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveImpl.kt +++ b/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveImpl.kt @@ -382,6 +382,10 @@ internal class GoogleDriveImpl(context: Context, googleDriveCloud: GoogleDriveCl return about.user.displayName } + fun logout() { + GoogleDriveClientFactory.invalidateClient() + } + companion object { private const val STATUS_REQUEST_RANGE_NOT_SATISFIABLE = 416