From c5f69f2039d9d81a5dec5a0e760313cc2eaaf418 Mon Sep 17 00:00:00 2001 From: Yoan Pintas Date: Fri, 28 Feb 2025 18:38:37 +0000 Subject: [PATCH 1/3] Support authenticated media with content scanner (#1152) --- changelog.d/1152.sdk | 1 + .../sdk/internal/session/DefaultFileService.kt | 12 +++++++++--- .../session/content/DefaultContentUrlResolver.kt | 13 ++++--------- .../contentscanner/DefaultContentScannerService.kt | 6 ++++++ .../im/vector/app/features/home/AvatarRenderer.kt | 10 ---------- 5 files changed, 20 insertions(+), 22 deletions(-) create mode 100644 changelog.d/1152.sdk diff --git a/changelog.d/1152.sdk b/changelog.d/1152.sdk new file mode 100644 index 0000000000..9692f04eed --- /dev/null +++ b/changelog.d/1152.sdk @@ -0,0 +1 @@ +Support des API de medias authentifiés avec l'anti-virus. diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultFileService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultFileService.kt index ca534f5a65..7467e86e6e 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultFileService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultFileService.kt @@ -39,6 +39,7 @@ import org.matrix.android.sdk.internal.di.UnauthenticatedWithCertificateWithProg import org.matrix.android.sdk.internal.network.httpclient.addAuthenticationHeader import org.matrix.android.sdk.internal.network.token.AccessTokenProvider import org.matrix.android.sdk.internal.session.download.DownloadProgressInterceptor.Companion.DOWNLOAD_PROGRESS_INTERCEPTOR_HEADER +import org.matrix.android.sdk.internal.session.media.IsAuthenticatedMediaSupported import org.matrix.android.sdk.internal.util.file.AtomicFileCreator import org.matrix.android.sdk.internal.util.file.safeFileName import org.matrix.android.sdk.internal.util.time.Clock @@ -55,6 +56,7 @@ internal class DefaultFileService @Inject constructor( private val contentUrlResolver: ContentUrlResolver, @UnauthenticatedWithCertificateWithProgress private val okHttpClient: OkHttpClient, + private val isAuthenticatedMediaSupported: IsAuthenticatedMediaSupported, private val coroutineDispatchers: MatrixCoroutineDispatchers, private val clock: Clock, @Authenticated private val accessTokenProvider: AccessTokenProvider, @@ -144,11 +146,15 @@ internal class DefaultFileService @Inject constructor( } is ContentUrlResolver.ResolvedMethod.POST -> { - Request.Builder() + val requestBuilder = Request.Builder() .url(resolvedMethod.url) .header(DOWNLOAD_PROGRESS_INTERCEPTOR_HEADER, url) - .post(resolvedMethod.jsonBody.toRequestBody("application/json".toMediaType())) - .build() + + if (contentUrlResolver.requiresAuthentication(resolvedMethod.url)) { + val accessToken = accessTokenProvider.getToken() + requestBuilder.addAuthenticationHeader(accessToken) + } + requestBuilder.post(resolvedMethod.jsonBody.toRequestBody("application/json".toMediaType())).build() } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/DefaultContentUrlResolver.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/DefaultContentUrlResolver.kt index dd277f6956..d5aa9eba7b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/DefaultContentUrlResolver.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/DefaultContentUrlResolver.kt @@ -41,13 +41,9 @@ internal class DefaultContentUrlResolver @Inject constructor( override fun resolveForDownload(contentUrl: String?, elementToDecrypt: ElementToDecrypt?): ContentUrlResolver.ResolvedMethod? { return if (scannerService.isScannerEnabled() && elementToDecrypt != null) { - val baseUrl = scannerService.getContentScannerServer() - val sep = if (baseUrl?.endsWith("/") == true) "" else "/" - - val url = baseUrl + sep + NetworkConstants.URI_API_PREFIX_PATH_MEDIA_PROXY_UNSTABLE + "download_encrypted" - + val baseUrl = scannerService.getContentScannerServer()!!.ensureTrailingSlash() ContentUrlResolver.ResolvedMethod.POST( - url = url, + url = "$baseUrl${NetworkConstants.URI_API_PREFIX_PATH_MEDIA_PROXY_UNSTABLE}download_encrypted", jsonBody = ScanEncryptorUtils .getDownloadBodyAndEncryptIfNeeded(scannerService.serverPublicKey, contentUrl ?: "", elementToDecrypt) .toJson() @@ -82,9 +78,8 @@ internal class DefaultContentUrlResolver @Inject constructor( } } - override fun requiresAuthentication(resolvedUrl: String): Boolean { - return resolvedUrl.startsWith(authenticatedMediaApiPath) - } + override fun requiresAuthentication(resolvedUrl: String) = + scannerService.isScannerEnabled() && isAuthenticatedMediaSupported() || resolvedUrl.startsWith(authenticatedMediaApiPath) private fun resolve( contentUrl: String, diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/DefaultContentScannerService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/DefaultContentScannerService.kt index 5aaf058757..abdccbfc5d 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/DefaultContentScannerService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/contentscanner/DefaultContentScannerService.kt @@ -25,6 +25,7 @@ import org.matrix.android.sdk.api.session.contentscanner.ScanState import org.matrix.android.sdk.api.session.contentscanner.ScanStatusInfo import org.matrix.android.sdk.api.session.crypto.attachments.ElementToDecrypt import org.matrix.android.sdk.api.util.Optional +import org.matrix.android.sdk.internal.di.Authenticated import org.matrix.android.sdk.internal.di.Unauthenticated import org.matrix.android.sdk.internal.network.RetrofitFactory import org.matrix.android.sdk.internal.session.SessionScope @@ -32,6 +33,7 @@ import org.matrix.android.sdk.internal.session.contentscanner.data.ContentScanne import org.matrix.android.sdk.internal.session.contentscanner.tasks.GetServerPublicKeyTask import org.matrix.android.sdk.internal.session.contentscanner.tasks.ScanEncryptedTask import org.matrix.android.sdk.internal.session.contentscanner.tasks.ScanMediaTask +import org.matrix.android.sdk.internal.session.media.IsAuthenticatedMediaSupported import org.matrix.android.sdk.internal.task.TaskExecutor import org.matrix.android.sdk.internal.util.time.Clock import timber.log.Timber @@ -42,6 +44,9 @@ internal class DefaultContentScannerService @Inject constructor( private val retrofitFactory: RetrofitFactory, @Unauthenticated private val okHttpClient: Lazy, + @Authenticated + private val authenticatedOkHttpClient: Lazy, + private val isAuthenticatedMediaSupported: IsAuthenticatedMediaSupported, private val contentScannerApiProvider: ContentScannerApiProvider, private val contentScannerStore: ContentScannerStore, private val getServerPublicKeyTask: GetServerPublicKeyTask, @@ -96,6 +101,7 @@ internal class DefaultContentScannerService @Inject constructor( contentScannerApiProvider.contentScannerApi = null serverPublicKey = null } else { + val okHttpClient = if (isAuthenticatedMediaSupported()) authenticatedOkHttpClient else okHttpClient val api = retrofitFactory .create(okHttpClient, url) .create(ContentScannerApi::class.java) diff --git a/vector/src/main/java/im/vector/app/features/home/AvatarRenderer.kt b/vector/src/main/java/im/vector/app/features/home/AvatarRenderer.kt index 52f8979234..c179ec0438 100644 --- a/vector/src/main/java/im/vector/app/features/home/AvatarRenderer.kt +++ b/vector/src/main/java/im/vector/app/features/home/AvatarRenderer.kt @@ -284,16 +284,6 @@ class AvatarRenderer @Inject constructor( } } - @AnyThread - fun getSpacePlaceholderDrawable(matrixItem: MatrixItem): Drawable { - val avatarColor = matrixItemColorProvider.getColor(matrixItem) - return TextDrawable.builder() - .beginConfig() - .bold() - .endConfig() - .buildRoundRect(matrixItem.firstLetterOfDisplayName(), avatarColor, dimensionConverter.dpToPx(8)) - } - // PRIVATE API ********************************************************************************* private fun GlideRequests.loadResolvedUrl(avatarUrl: String?): GlideRequest { From cc61d8ff547ab13e0dccbfb4ce9230703e45a974 Mon Sep 17 00:00:00 2001 From: Yoan Pintas Date: Fri, 28 Feb 2025 18:39:32 +0000 Subject: [PATCH 2/3] Restore rich text editor version 2.37.6 (#1155) --- changelog.d/1155.bugfix | 1 + dependencies.gradle | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 changelog.d/1155.bugfix diff --git a/changelog.d/1155.bugfix b/changelog.d/1155.bugfix new file mode 100644 index 0000000000..6edd44bcdb --- /dev/null +++ b/changelog.d/1155.bugfix @@ -0,0 +1 @@ +Correction du crash sur android 6 et 7 à l'ouverture d'un salon. \ No newline at end of file diff --git a/dependencies.gradle b/dependencies.gradle index a0ac311963..e9f57ab20e 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -101,7 +101,7 @@ ext.libs = [ ], element : [ 'opusencoder' : "io.element.android:opusencoder:1.1.0", - 'wysiwyg' : "io.element.android:wysiwyg:2.38.2" + 'wysiwyg' : "io.element.android:wysiwyg:2.37.6" ], squareup : [ 'moshi' : "com.squareup.moshi:moshi:$moshi", From 615cfeda9d6aa4a7cabc9d51fd5c8a2add92590e Mon Sep 17 00:00:00 2001 From: yostyle Date: Fri, 28 Feb 2025 19:45:38 +0100 Subject: [PATCH 3/3] Update changes --- TCHAP_CHANGES.md | 11 +++++++++++ changelog.d/1152.sdk | 1 - changelog.d/1155.bugfix | 1 - towncrier.toml | 2 +- vector-app/build.gradle | 2 +- .../src/tchap/res/values/config-features.xml | 4 ++-- 6 files changed, 15 insertions(+), 6 deletions(-) delete mode 100644 changelog.d/1152.sdk delete mode 100644 changelog.d/1155.bugfix diff --git a/TCHAP_CHANGES.md b/TCHAP_CHANGES.md index d973e971d8..824e6dfcb0 100644 --- a/TCHAP_CHANGES.md +++ b/TCHAP_CHANGES.md @@ -1,3 +1,14 @@ +Changes in Tchap 2.17.2 (2025-02-28) +==================================== + +Bugfixes 🐛 +---------- + - Correction du crash sur android 6 et 7 à l'ouverture d'un salon. ([#1155](https://github.com/tchapgouv/tchap-android/issues/1155)) + +SDK API changes ⚠️ +------------------ + - Support des API de medias authentifiés avec l'anti-virus. ([#1152](https://github.com/tchapgouv/tchap-android/issues/1152)) + Changes in Tchap 2.17.1 (2025-02-20) ==================================== diff --git a/changelog.d/1152.sdk b/changelog.d/1152.sdk deleted file mode 100644 index 9692f04eed..0000000000 --- a/changelog.d/1152.sdk +++ /dev/null @@ -1 +0,0 @@ -Support des API de medias authentifiés avec l'anti-virus. diff --git a/changelog.d/1155.bugfix b/changelog.d/1155.bugfix deleted file mode 100644 index 6edd44bcdb..0000000000 --- a/changelog.d/1155.bugfix +++ /dev/null @@ -1 +0,0 @@ -Correction du crash sur android 6 et 7 à l'ouverture d'un salon. \ No newline at end of file diff --git a/towncrier.toml b/towncrier.toml index a800123538..69ca705fa6 100644 --- a/towncrier.toml +++ b/towncrier.toml @@ -1,5 +1,5 @@ [tool.towncrier] - version = "2.17.1" + version = "2.17.2" directory = "changelog.d" filename = "TCHAP_CHANGES.md" name = "Changes in Tchap" diff --git a/vector-app/build.gradle b/vector-app/build.gradle index 5e966e8d84..3a8de5100c 100644 --- a/vector-app/build.gradle +++ b/vector-app/build.gradle @@ -37,7 +37,7 @@ ext.versionMinor = 17 // Note: even values are reserved for regular release, odd values for hotfix release. // When creating a hotfix, you should decrease the value, since the current value // is the value for the next regular release. -ext.versionPatch = 1 +ext.versionPatch = 2 static def getGitTimestamp() { def cmd = 'git show -s --format=%ct' diff --git a/vector-config/src/tchap/res/values/config-features.xml b/vector-config/src/tchap/res/values/config-features.xml index c890574e82..9e80107d3a 100755 --- a/vector-config/src/tchap/res/values/config-features.xml +++ b/vector-config/src/tchap/res/values/config-features.xml @@ -3,8 +3,8 @@ true true false - true - true + false + false