diff --git a/features/contentscanner/impl/src/main/kotlin/io/element/android/features/contentscanner/impl/DefaultContentScannerService.kt b/features/contentscanner/impl/src/main/kotlin/io/element/android/features/contentscanner/impl/DefaultContentScannerService.kt index 2765686f9d..c809179552 100644 --- a/features/contentscanner/impl/src/main/kotlin/io/element/android/features/contentscanner/impl/DefaultContentScannerService.kt +++ b/features/contentscanner/impl/src/main/kotlin/io/element/android/features/contentscanner/impl/DefaultContentScannerService.kt @@ -10,6 +10,7 @@ package io.element.android.features.contentscanner.impl import io.element.android.features.contentscanner.api.ContentScannerService import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.exception.ClientException import io.element.android.libraries.matrix.api.media.MediaSource import io.element.android.libraries.matrix.api.scanner.ContentScanner import io.element.android.libraries.matrix.ui.media.contentvalidation.ContentValidationState @@ -42,12 +43,19 @@ class DefaultContentScannerService( contentValidationState.update(url, contentValidationValue) } .onFailure { exception -> - if (exception is IOException) { - // If it's an IO-related exception, we can retry later, so we don't store the error - contentValidationState.update(url, ContentValidationValue.Unknown) - } else { - // For other exceptions, we cache the failure - contentValidationState.update(url, ContentValidationValue.UnrecoverableError(exception)) + when (exception) { + is IOException -> { + // If it's an IO-related exception, we can retry later, so we don't store the error + contentValidationState.update(url, ContentValidationValue.Unknown) + } + is ClientException.ContentScanner if exception.reason.isDangerous() -> { + // It's a dangerous content (banned mime-type?), we mark it as invalid + contentValidationState.update(url, ContentValidationValue.Invalid) + } + else -> { + // For other exceptions, we cache the failure + contentValidationState.update(url, ContentValidationValue.UnrecoverableError(exception)) + } } } } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/scanner/RustContentScanner.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/scanner/RustContentScanner.kt index ecfa4f0bcd..c07ca94f26 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/scanner/RustContentScanner.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/scanner/RustContentScanner.kt @@ -7,9 +7,11 @@ package io.element.android.libraries.matrix.impl.scanner +import io.element.android.libraries.core.extensions.mapFailure import io.element.android.libraries.core.extensions.runCatchingExceptions import io.element.android.libraries.matrix.api.media.MediaSource import io.element.android.libraries.matrix.api.scanner.ContentScanner +import io.element.android.libraries.matrix.impl.exception.mapClientException import org.matrix.rustcomponents.sdk.Client import org.matrix.rustcomponents.sdk.NoHandle import org.matrix.rustcomponents.sdk.ContentScanner as RustScanner @@ -22,6 +24,8 @@ class RustContentScanner( override suspend fun scan(mediaSource: MediaSource): Result { return runCatchingExceptions { rustScanner.scan(client, mediaSource.toRustMediaSource()).clean + }.mapFailure { + it.mapClientException() } } }