Skip to content

Commit 00706fc

Browse files
authored
fix: crash when adding a nonfederated users to a federated conversation (#2566)
* fix: crash when adding non federated member to a federated conversation (cherry picked from commit b4ce615) * fix: detekt (cherry picked from commit 4f75b54)
1 parent 92e1402 commit 00706fc

File tree

2 files changed

+20
-15
lines changed

2 files changed

+20
-15
lines changed

network/src/commonMain/kotlin/com/wire/kalium/network/api/v4/authenticated/ConversationApiV4.kt

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import com.wire.kalium.network.api.base.model.ConversationId
3232
import com.wire.kalium.network.api.base.model.GenerateGuestLinkRequest
3333
import com.wire.kalium.network.api.base.model.JoinConversationRequestV4
3434
import com.wire.kalium.network.api.v3.authenticated.ConversationApiV3
35-
import com.wire.kalium.network.exceptions.KaliumException
3635
import com.wire.kalium.network.utils.NetworkResponse
3736
import com.wire.kalium.network.utils.handleUnsuccessfulResponse
3837
import com.wire.kalium.network.utils.mapSuccess
@@ -43,7 +42,6 @@ import io.ktor.client.request.parameter
4342
import io.ktor.client.request.post
4443
import io.ktor.client.request.preparePost
4544
import io.ktor.client.request.setBody
46-
import io.ktor.utils.io.errors.IOException
4745

4846
internal open class ConversationApiV4 internal constructor(
4947
authenticatedNetworkClient: AuthenticatedNetworkClient,
@@ -88,15 +86,16 @@ internal open class ConversationApiV4 internal constructor(
8886
override suspend fun addMember(
8987
addParticipantRequest: AddConversationMembersRequest,
9088
conversationId: ConversationId
91-
): NetworkResponse<ConversationMemberAddedResponse> = try {
92-
httpClient.post("$PATH_CONVERSATIONS/${conversationId.domain}/${conversationId.value}/$PATH_MEMBERS") {
93-
setBody(addParticipantRequest)
94-
}.let { response ->
95-
wrapFederationResponse(response) { handleConversationMemberAddedResponse(response) }
89+
): NetworkResponse<ConversationMemberAddedResponse> = wrapKaliumResponse(
90+
performRequest = {
91+
httpClient.post("$PATH_CONVERSATIONS/${conversationId.domain}/${conversationId.value}/$PATH_MEMBERS") {
92+
setBody(addParticipantRequest)
93+
}
94+
},
95+
unsuccessfulResponseOverride = {
96+
wrapFederationResponse(it) { handleConversationMemberAddedResponse(it) }
9697
}
97-
} catch (e: IOException) {
98-
NetworkResponse.Error(KaliumException.GenericError(e))
99-
}
98+
)
10099

101100
override suspend fun generateGuestRoomLink(
102101
conversationId: ConversationId,

network/src/commonMain/kotlin/com/wire/kalium/network/utils/NetworkUtils.kt

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,17 @@ import com.wire.kalium.network.api.base.model.FederationConflictResponse
2424
import com.wire.kalium.network.api.base.model.FederationUnreachableResponse
2525
import com.wire.kalium.network.exceptions.KaliumException
2626
import com.wire.kalium.network.kaliumLogger
27+
import com.wire.kalium.network.tools.KtxSerializer
2728
import io.ktor.client.call.NoTransformationFoundException
2829
import io.ktor.client.call.body
2930
import io.ktor.client.request.HttpRequestBuilder
3031
import io.ktor.client.statement.HttpResponse
32+
import io.ktor.client.statement.bodyAsText
3133
import io.ktor.http.HttpStatusCode
3234
import io.ktor.http.URLProtocol
3335
import io.ktor.http.Url
3436
import io.ktor.http.isSuccess
35-
import io.ktor.serialization.JsonConvertException
37+
import kotlinx.serialization.SerializationException
3638

3739
internal fun HttpRequestBuilder.setWSSUrl(baseUrl: Url, vararg path: String) {
3840
url {
@@ -282,17 +284,21 @@ suspend fun <T : Any> wrapFederationResponse(
282284
* i.e.: '/commit-bundles' 409 for "mls-stale-message" and 409 for "federation-conflict"
283285
*/
284286
private suspend fun resolveStatusCodeBasedFirstOrFederated(response: HttpResponse): NetworkResponse.Error {
287+
val responseString = response.bodyAsText()
288+
285289
val kaliumException = try {
286-
val errorResponse = response.body<ErrorResponse>()
290+
val errorResponse = KtxSerializer.json.decodeFromString<ErrorResponse>(responseString)
291+
287292
toStatusCodeBasedKaliumException(
288293
response.status,
289294
response,
290295
errorResponse
291296
)
292-
} catch (exception: JsonConvertException) {
297+
} catch (exception: SerializationException) {
293298
try {
294-
KaliumException.FederationConflictException(response.body<FederationConflictResponse>())
295-
} catch (_: NoTransformationFoundException) {
299+
val federationConflictResponse = KtxSerializer.json.decodeFromString<FederationConflictResponse>(responseString)
300+
KaliumException.FederationConflictException(federationConflictResponse)
301+
} catch (_: SerializationException) {
296302
KaliumException.FederationConflictException(FederationConflictResponse(emptyList()))
297303
}
298304
}

0 commit comments

Comments
 (0)