Skip to content

Commit

Permalink
fix: ignore invalid leaf signature error on slow sync [WPB-15737] (#3266
Browse files Browse the repository at this point in the history
)

* fix: ignore invalid leaf signature error on slow sync

* ignore all 400 errors

* update upload artifact
  • Loading branch information
Garzas authored Jan 31, 2025
1 parent ba4e228 commit 1e85447
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 7 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/gradle-android-instrumented-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -89,14 +89,14 @@ jobs:

- name: Archive Test Reports
if: always()
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: test-reports
path: ./**/build/reports/tests/**

- name: Archive Test Results
if: always()
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: test-results
path: |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import com.wire.kalium.logic.functional.flatMapLeft
import com.wire.kalium.logic.functional.foldToEitherWhileRight
import com.wire.kalium.logic.functional.getOrElse
import com.wire.kalium.logic.kaliumLogger
import com.wire.kalium.network.exceptions.KaliumException

/**
* Send an external commit to join all MLS conversations for which the user is a member,
Expand Down Expand Up @@ -61,19 +62,31 @@ internal class JoinExistingMLSConversationsUseCaseImpl(
.flatMapLeft {
when (it) {
is NetworkFailure -> {
kaliumLogger.w(
"Failed to establish mls group for ${conversation.id.toLogString()} " +
"due to network failure"
)
Either.Left(it)
if (it is NetworkFailure.ServerMiscommunication
&& it.kaliumException is KaliumException.InvalidRequestError
) {
kaliumLogger.w(
"Failed to establish mls group for ${conversation.id.toLogString()} " +
"due to invalid request error, skipping."
)
Either.Right(Unit)
} else {
kaliumLogger.w(
"Failed to establish mls group for ${conversation.id.toLogString()} " +
"due to network failure"
)
Either.Left(it)
}
}

is CoreFailure.MissingKeyPackages -> {
kaliumLogger.w(
"Failed to establish mls group for ${conversation.id.toLogString()} " +
"since some participants are out of key packages, skipping."
)
Either.Right(Unit)
}

else -> {
kaliumLogger.w(
"Failed to establish mls group for ${conversation.id.toLogString()} " +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ import com.wire.kalium.logic.framework.TestConversation
import com.wire.kalium.logic.functional.Either
import com.wire.kalium.logic.util.shouldFail
import com.wire.kalium.logic.util.shouldSucceed
import com.wire.kalium.network.api.model.ErrorResponse
import com.wire.kalium.network.exceptions.KaliumException
import com.wire.kalium.util.DateTimeUtil
import io.mockative.Mock
import io.mockative.any
Expand Down Expand Up @@ -129,6 +131,26 @@ class JoinExistingMLSConversationsUseCaseTest {
}.wasInvoked(twice)
}

@Test
fun givenServerMiscommunicationWithInvalidRequestError_WhenJoiningMLSConversation_ThenSkipConversation() = runTest {
val (arrangement, joinExistingMLSConversationsUseCase) = Arrangement()
.withIsMLSSupported(true)
.withHasRegisteredMLSClient(true)
.withGetConversationsByGroupStateSuccessful()
.withJoinExistingMLSConversationReturningServerMiscommunication()
.arrange()

joinExistingMLSConversationsUseCase().shouldSucceed()

coVerify {
arrangement.joinExistingMLSConversationUseCase.invoke(any(), any())
}.wasInvoked(twice)

coVerify {
arrangement.mlsConversationRepository.joinGroupByExternalCommit(any(), any())
}.wasNotInvoked()
}

private class Arrangement {

@Mock
Expand Down Expand Up @@ -195,6 +217,20 @@ class JoinExistingMLSConversationsUseCaseTest {
}.returns(Either.Right(result))
}

suspend fun withJoinExistingMLSConversationReturningServerMiscommunication() = apply {
coEvery {
joinExistingMLSConversationUseCase.invoke(any(), any())
}.returns(
Either.Left(
NetworkFailure.ServerMiscommunication(
KaliumException.InvalidRequestError(
errorResponse = ErrorResponse(400, "Invalid LeafNode signature", "mls-protocol-error")
)
)
)
)
}

companion object {
val GROUP_ID1 = GroupID("group1")
val GROUP_ID2 = GroupID("group2")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ import com.wire.kalium.network.exceptions.NetworkErrorLabel.MISSING_LEGALHOLD_CO
import com.wire.kalium.network.exceptions.NetworkErrorLabel.MLS_CLIENT_MISMATCH
import com.wire.kalium.network.exceptions.NetworkErrorLabel.MLS_COMMIT_MISSING_REFERENCES
import com.wire.kalium.network.exceptions.NetworkErrorLabel.MLS_MISSING_GROUP_INFO
import com.wire.kalium.network.exceptions.NetworkErrorLabel.MLS_PROTOCOL_ERROR
import com.wire.kalium.network.exceptions.NetworkErrorLabel.MLS_STALE_MESSAGE
import com.wire.kalium.network.exceptions.NetworkErrorLabel.NOT_FOUND
import com.wire.kalium.network.exceptions.NetworkErrorLabel.NOT_TEAM_MEMBER
Expand Down Expand Up @@ -224,6 +225,10 @@ fun KaliumException.InvalidRequestError.isAccessDenied(): Boolean {
return errorResponse.label == ACCESS_DENIED
}

fun KaliumException.InvalidRequestError.isMLSProtocol(): Boolean {
return errorResponse.label == MLS_PROTOCOL_ERROR
}

fun KaliumException.InvalidRequestError.isWrongConversationPassword(): Boolean {
return (errorResponse.label == WRONG_CONVERSATION_PASSWORD) ||
(errorResponse.label == BAD_REQUEST && errorResponse.message.contains("password"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ internal object NetworkErrorLabel {
const val MLS_UNSUPPORTED_PROPOSAL = "mls-unsupported-proposal"
const val MLS_KEY_PACKAGE_REF_NOT_FOUND = "mls-key-package-ref-not-found"
const val MLS_MISSING_GROUP_INFO = "mls-missing-group-info"
const val MLS_PROTOCOL_ERROR = "mls-protocol-error"
const val UNKNOWN_CLIENT = "unknown-client"
const val NOT_TEAM_MEMBER = "no-team-member"
const val NO_CONVERSATION = "no-conversation"
Expand Down

0 comments on commit 1e85447

Please sign in to comment.