Skip to content

Commit c894732

Browse files
authored
fix: asset update handling for unknown content (#3844)
1 parent e670931 commit c894732

File tree

3 files changed

+60
-17
lines changed

3 files changed

+60
-17
lines changed

logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/asset/AssetMessageHandler.kt

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -147,29 +147,33 @@ internal class AssetMessageHandlerImpl(
147147
): Message.Regular? {
148148
val assetMessageContent = when (persistedMessage.content) {
149149
is MessageContent.Asset -> persistedMessage.content as MessageContent.Asset
150-
is MessageContent.RestrictedAsset -> {
151-
// original message was a restricted asset message, ignoring
152-
return null
153-
}
154-
150+
is MessageContent.RestrictedAsset -> null // original message was a restricted asset message, ignoring
155151
is MessageContent.FailedDecryption,
156152
is MessageContent.Knock,
157153
is MessageContent.Location,
158154
is MessageContent.Composite,
159155
is MessageContent.Text,
160156
is MessageContent.Multipart,
161-
is MessageContent.Unknown -> error("Invalid asset message content type ${persistedMessage.content.getType()}")
162-
}
163-
// The message was previously received with just metadata info, so let's update it with the raw data info
164-
return persistedMessage.copy(
165-
content = assetMessageContent.copy(
166-
value = assetMessageContent.value.copy(
167-
remoteData = remoteData
157+
is MessageContent.Unknown -> {
158+
kaliumLogger.e(
159+
"Invalid asset message content type=${persistedMessage.content.getType()} " +
160+
"messageId=${persistedMessage.id} conversationId=${persistedMessage.conversationId}"
168161
)
169-
),
170-
// If update message for any reason has still invalid encryption keys, message can't still be shown
171-
visibility = if (remoteData.hasValidData()) Message.Visibility.VISIBLE else Message.Visibility.HIDDEN
172-
)
162+
null
163+
}
164+
}
165+
return assetMessageContent?.let { asset ->
166+
// The message was previously received with just metadata info, so let's update it with the raw data info
167+
persistedMessage.copy(
168+
content = asset.copy(
169+
value = asset.value.copy(
170+
remoteData = remoteData
171+
)
172+
),
173+
// If update message for any reason has still invalid encryption keys, message can't still be shown
174+
visibility = if (remoteData.hasValidData()) Message.Visibility.VISIBLE else Message.Visibility.HIDDEN
175+
)
176+
}
173177
}
174178
}
175179

logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/message/ApplicationMessageHandler.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,17 @@ internal class ApplicationMessageHandlerImpl(
259259
is MessageContent.Text -> handleTextMessage(message, content)
260260
is MessageContent.FailedDecryption -> persistMessage(message)
261261
is MessageContent.Knock -> persistMessage(message)
262-
is MessageContent.Asset -> assetMessageHandler.handle(message)
262+
is MessageContent.Asset -> {
263+
try {
264+
assetMessageHandler.handle(message)
265+
} catch (exception: IllegalStateException) {
266+
logger.e(
267+
"AssetMessageHandler failed for messageId=${message.id} conversationId=${message.conversationId}",
268+
exception
269+
)
270+
}
271+
}
272+
263273
is MessageContent.RestrictedAsset -> {
264274
/* no-op */
265275
}

logic/src/jvmTest/kotlin/com/wire/kalium/logic/sync/receiver/asset/AssetMessageHandlerTest.kt

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,35 @@ class AssetMessageHandlerTest {
242242
}.wasInvoked(exactly = once)
243243
}
244244

245+
@Test
246+
fun givenUnknownMessageStored_whenHandlingAssetUpdate_itDoesNotCrashOrPersist() = runTest {
247+
// Given
248+
val storedUnknownMessage = COMPLETE_ASSET_MESSAGE.copy(
249+
content = MessageContent.Unknown(typeName = "some-new-type"),
250+
visibility = Message.Visibility.HIDDEN
251+
)
252+
val updateAssetMessage = COMPLETE_ASSET_MESSAGE
253+
val isFileSharingEnabled = FileSharingStatus.Value.EnabledAll
254+
val (arrangement, assetMessageHandler) = Arrangement()
255+
.withSuccessfulFileSharingFlag(isFileSharingEnabled)
256+
.withSuccessfulStoredMessage(storedUnknownMessage)
257+
.arrange()
258+
259+
// When
260+
assetMessageHandler.handle(updateAssetMessage)
261+
262+
// Then
263+
coVerify {
264+
arrangement.messageRepository.getMessageById(
265+
eq(updateAssetMessage.conversationId),
266+
eq(updateAssetMessage.id)
267+
)
268+
}.wasInvoked(exactly = once)
269+
270+
coVerify { arrangement.persistMessage(any()) }
271+
.wasNotInvoked()
272+
}
273+
245274
@Test
246275
fun givenValidPreviewAssetMessageStoredAndExtensionIsAllowed_whenHandlingTheUpdate_itIsCorrectlyProcessedAndVisible() = runTest {
247276
// Given

0 commit comments

Comments
 (0)