Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: asset restriction [WPB-9947] (#2831) (#2856) 🍒 #2862

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1761,6 +1761,7 @@ class UserSessionScope internal constructor(
messageMetadataRepository,
staleEpochVerifier,
legalHoldHandler,
observeFileSharingStatus,
this,
userScopedLogger,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import com.wire.kalium.cryptography.utils.AES256Key
import com.wire.kalium.cryptography.utils.SHA256Key
import com.wire.kalium.cryptography.utils.generateRandomAES256Key
import com.wire.kalium.logic.CoreFailure
import com.wire.kalium.logic.configuration.FileSharingStatus
import com.wire.kalium.logic.data.asset.AssetRepository
import com.wire.kalium.logic.data.asset.AssetTransferStatus
import com.wire.kalium.logic.data.asset.UploadedAssetId
Expand All @@ -44,6 +45,7 @@ import com.wire.kalium.logic.data.user.UserId
import com.wire.kalium.logic.feature.message.MessageSendFailureHandler
import com.wire.kalium.logic.feature.message.MessageSender
import com.wire.kalium.logic.feature.selfDeletingMessages.ObserveSelfDeletionTimerSettingsForConversationUseCase
import com.wire.kalium.logic.feature.user.ObserveFileSharingStatusUseCase
import com.wire.kalium.logic.functional.Either
import com.wire.kalium.logic.functional.flatMap
import com.wire.kalium.logic.functional.fold
Expand Down Expand Up @@ -108,12 +110,14 @@ internal class ScheduleNewAssetMessageUseCaseImpl(
private val userPropertyRepository: UserPropertyRepository,
private val selfDeleteTimer: ObserveSelfDeletionTimerSettingsForConversationUseCase,
private val scope: CoroutineScope,
private val observeFileSharingStatus: ObserveFileSharingStatusUseCase,
private val validateAssetMimeTypeUseCase: ValidateAssetMimeTypeUseCase,
private val dispatcher: KaliumDispatcher,
) : ScheduleNewAssetMessageUseCase {

private var outGoingAssetUploadJob: Job? = null

@Suppress("LongMethod")
@Suppress("LongMethod", "ReturnCount")
override suspend fun invoke(
conversationId: ConversationId,
assetDataPath: Path,
Expand All @@ -124,6 +128,18 @@ internal class ScheduleNewAssetMessageUseCaseImpl(
assetHeight: Int?,
audioLengthInMs: Long
): ScheduleNewAssetMessageResult {
observeFileSharingStatus().first().also {
when (it.state) {
FileSharingStatus.Value.Disabled -> return ScheduleNewAssetMessageResult.Failure.DisabledByTeam
FileSharingStatus.Value.EnabledAll -> { /* no-op*/ }

is FileSharingStatus.Value.EnabledSome -> if (!validateAssetMimeTypeUseCase(assetMimeType, it.state.allowedType)) {
kaliumLogger.e("The asset message trying to be processed has invalid content data")
return ScheduleNewAssetMessageResult.Failure.RestrictedFileType
}
}
}

slowSyncRepository.slowSyncStatus.first {
it is SlowSyncStatus.Complete
}
Expand Down Expand Up @@ -165,7 +181,7 @@ internal class ScheduleNewAssetMessageUseCaseImpl(
}
}
}.fold({
ScheduleNewAssetMessageResult.Failure(it)
ScheduleNewAssetMessageResult.Failure.Generic(it)
}, { (_, message) ->
ScheduleNewAssetMessageResult.Success(message.id)
})
Expand Down Expand Up @@ -345,9 +361,13 @@ internal class ScheduleNewAssetMessageUseCaseImpl(
}
}

sealed class ScheduleNewAssetMessageResult {
class Success(val messageId: String) : ScheduleNewAssetMessageResult()
class Failure(val coreFailure: CoreFailure) : ScheduleNewAssetMessageResult()
sealed interface ScheduleNewAssetMessageResult {
data class Success(val messageId: String) : ScheduleNewAssetMessageResult
sealed interface Failure : ScheduleNewAssetMessageResult {
data class Generic(val coreFailure: CoreFailure) : Failure
data object DisabledByTeam : Failure
data object RestrictedFileType : Failure
}
}

private data class AssetMessageMetadata(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ import com.wire.kalium.logic.feature.asset.ScheduleNewAssetMessageUseCaseImpl
import com.wire.kalium.logic.feature.asset.UpdateAssetMessageTransferStatusUseCase
import com.wire.kalium.logic.feature.asset.UpdateAssetMessageTransferStatusUseCaseImpl
import com.wire.kalium.logic.feature.message.composite.SendButtonActionConfirmationMessageUseCase
import com.wire.kalium.logic.feature.asset.ValidateAssetMimeTypeUseCase
import com.wire.kalium.logic.feature.asset.ValidateAssetMimeTypeUseCaseImpl
import com.wire.kalium.logic.feature.message.composite.SendButtonActionMessageUseCase
import com.wire.kalium.logic.feature.message.composite.SendButtonMessageUseCase
import com.wire.kalium.logic.feature.message.draft.GetMessageDraftUseCase
Expand All @@ -79,6 +81,7 @@ import com.wire.kalium.logic.feature.message.ephemeral.EphemeralMessageDeletionH
import com.wire.kalium.logic.feature.selfDeletingMessages.ObserveSelfDeletionTimerSettingsForConversationUseCase
import com.wire.kalium.logic.feature.sessionreset.ResetSessionUseCase
import com.wire.kalium.logic.feature.sessionreset.ResetSessionUseCaseImpl
import com.wire.kalium.logic.feature.user.ObserveFileSharingStatusUseCase
import com.wire.kalium.logic.sync.SyncManager
import com.wire.kalium.logic.sync.receiver.handler.legalhold.LegalHoldHandler
import com.wire.kalium.logic.util.MessageContentEncoder
Expand Down Expand Up @@ -115,8 +118,9 @@ class MessageScope internal constructor(
private val messageMetadataRepository: MessageMetadataRepository,
private val staleEpochVerifier: StaleEpochVerifier,
private val legalHoldHandler: LegalHoldHandler,
private val observeFileSharingStatusUseCase: ObserveFileSharingStatusUseCase,
private val scope: CoroutineScope,
private val kaliumLogger: KaliumLogger,
kaliumLogger: KaliumLogger,
internal val dispatcher: KaliumDispatcher = KaliumDispatcherImpl,
private val legalHoldStatusMapper: LegalHoldStatusMapper = LegalHoldStatusMapperImpl
) {
Expand Down Expand Up @@ -152,6 +156,9 @@ class MessageScope internal constructor(
protoContentMapper = protoContentMapper
)

private val validateAssetMimeTypeUseCase: ValidateAssetMimeTypeUseCase
get() = ValidateAssetMimeTypeUseCaseImpl()

private val messageContentEncoder = MessageContentEncoder()
private val messageSendingInterceptor: MessageSendingInterceptor
get() = MessageSendingInterceptorImpl(messageContentEncoder, messageRepository)
Expand Down Expand Up @@ -256,6 +263,8 @@ class MessageScope internal constructor(
userPropertyRepository,
observeSelfDeletingMessages,
scope,
observeFileSharingStatusUseCase,
validateAssetMimeTypeUseCase,
dispatcher
)

Expand Down
Loading
Loading