Skip to content

Commit

Permalink
fix: crash when adding non federated member to a federated conversation
Browse files Browse the repository at this point in the history
  • Loading branch information
MohamadJaara committed Feb 29, 2024
1 parent 1e3ace5 commit b4ce615
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ import com.wire.kalium.network.api.base.model.ConversationId
import com.wire.kalium.network.api.base.model.GenerateGuestLinkRequest
import com.wire.kalium.network.api.base.model.JoinConversationRequestV4
import com.wire.kalium.network.api.v3.authenticated.ConversationApiV3
import com.wire.kalium.network.exceptions.KaliumException
import com.wire.kalium.network.utils.NetworkResponse
import com.wire.kalium.network.utils.handleUnsuccessfulResponse
import com.wire.kalium.network.utils.mapSuccess
Expand All @@ -43,7 +42,6 @@ import io.ktor.client.request.parameter
import io.ktor.client.request.post
import io.ktor.client.request.preparePost
import io.ktor.client.request.setBody
import io.ktor.utils.io.errors.IOException

internal open class ConversationApiV4 internal constructor(
authenticatedNetworkClient: AuthenticatedNetworkClient,
Expand Down Expand Up @@ -88,15 +86,16 @@ internal open class ConversationApiV4 internal constructor(
override suspend fun addMember(
addParticipantRequest: AddConversationMembersRequest,
conversationId: ConversationId
): NetworkResponse<ConversationMemberAddedResponse> = try {
httpClient.post("$PATH_CONVERSATIONS/${conversationId.domain}/${conversationId.value}/$PATH_MEMBERS") {
setBody(addParticipantRequest)
}.let { response ->
wrapFederationResponse(response) { handleConversationMemberAddedResponse(response) }
): NetworkResponse<ConversationMemberAddedResponse> = wrapKaliumResponse(
performRequest = {
httpClient.post("$PATH_CONVERSATIONS/${conversationId.domain}/${conversationId.value}/$PATH_MEMBERS") {
setBody(addParticipantRequest)
}
},
unsuccessfulResponseOverride = {
wrapFederationResponse(it) { handleConversationMemberAddedResponse(it) }
}
} catch (e: IOException) {
NetworkResponse.Error(KaliumException.GenericError(e))
}
)

override suspend fun generateGuestRoomLink(
conversationId: ConversationId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,20 @@ import com.wire.kalium.network.api.base.model.FederationConflictResponse
import com.wire.kalium.network.api.base.model.FederationUnreachableResponse
import com.wire.kalium.network.exceptions.KaliumException
import com.wire.kalium.network.kaliumLogger
import com.wire.kalium.network.tools.KtxSerializer
import io.ktor.client.call.NoTransformationFoundException
import io.ktor.client.call.body
import io.ktor.client.request.HttpRequestBuilder
import io.ktor.client.statement.HttpResponse
import io.ktor.client.statement.bodyAsText
import io.ktor.http.HttpStatusCode
import io.ktor.http.URLProtocol
import io.ktor.http.Url
import io.ktor.http.isSuccess
import io.ktor.serialization.ContentConvertException
import io.ktor.serialization.JsonConvertException
import kotlinx.serialization.MissingFieldException
import kotlinx.serialization.SerializationException

internal fun HttpRequestBuilder.setWSSUrl(baseUrl: Url, vararg path: String) {
url {
Expand Down Expand Up @@ -282,17 +287,21 @@ suspend fun <T : Any> wrapFederationResponse(
* i.e.: '/commit-bundles' 409 for "mls-stale-message" and 409 for "federation-conflict"
*/
private suspend fun resolveStatusCodeBasedFirstOrFederated(response: HttpResponse): NetworkResponse.Error {
val responseString = response.bodyAsText()

val kaliumException = try {
val errorResponse = response.body<ErrorResponse>()
val errorResponse = KtxSerializer.json.decodeFromString<ErrorResponse>(responseString)

toStatusCodeBasedKaliumException(
response.status,
response,
errorResponse
)
} catch (exception: JsonConvertException) {
} catch (exception: SerializationException) {
try {
KaliumException.FederationConflictException(response.body<FederationConflictResponse>())
} catch (_: NoTransformationFoundException) {
val federationConflictResponse = KtxSerializer.json.decodeFromString<FederationConflictResponse>(responseString)
KaliumException.FederationConflictException(federationConflictResponse)
} catch (_: SerializationException) {
KaliumException.FederationConflictException(FederationConflictResponse(emptyList()))
}
}
Expand Down

0 comments on commit b4ce615

Please sign in to comment.