Skip to content

Commit e2853ef

Browse files
authored
fix: don't reset federated conversations - WPB-22499 πŸ’ (#4048)
1 parent 3796fbc commit e2853ef

File tree

4 files changed

+47
-8
lines changed

4 files changed

+47
-8
lines changed

β€ŽWireDomain/Sources/WireDomain/Components/ClientSessionComponent.swiftβ€Ž

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -811,7 +811,8 @@ public final class ClientSessionComponent {
811811
mlsService: mlsService,
812812
conversationLocalStore: conversationLocalStore,
813813
conversationRepository: conversationRepository,
814-
lockRepository: resetMLSConversationLockRepository
814+
lockRepository: resetMLSConversationLockRepository,
815+
selfDomain: backendMetadata.domain
815816
)
816817

817818
public lazy var mlsTransport: any WireCoreCryptoUniffi.MlsTransport = MLSTransportImpl(

β€ŽWireDomain/Sources/WireDomain/Helpers/InitiateResetMLSConversationUseCase.swiftβ€Ž

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,34 +37,49 @@ public class InitiateResetMLSConversationUseCase: InitiateResetMLSConversationUs
3737
private let conversationLocalStore: ConversationLocalStoreProtocol
3838
private let conversationRepository: ConversationRepositoryProtocol
3939
private let lockRepository: ResetMLSConversationLockRepositoryProtocol
40+
private let selfDomain: String?
4041

4142
public init(
4243
api: MLSAPI,
4344
mlsService: MLSServiceInterface,
4445
conversationLocalStore: ConversationLocalStoreProtocol,
4546
conversationRepository: ConversationRepositoryProtocol,
46-
lockRepository: ResetMLSConversationLockRepositoryProtocol
47+
lockRepository: ResetMLSConversationLockRepositoryProtocol,
48+
selfDomain: String?
4749
) {
4850
self.api = api
4951
self.mlsService = mlsService
5052
self.conversationLocalStore = conversationLocalStore
5153
self.conversationRepository = conversationRepository
5254
self.lockRepository = lockRepository
55+
self.selfDomain = selfDomain
5356
}
5457

55-
public func invoke(groupID: WireDataModel.MLSGroupID, epoch: UInt64) async {
56-
58+
public func invoke(
59+
groupID: WireDataModel.MLSGroupID,
60+
epoch: UInt64
61+
) async {
5762
var attributes: LogAttributes = [:]
5863

5964
do {
65+
guard let selfDomain else {
66+
WireLogger.mls.error("Can't initiate reset broken MLS conversation failed: self domain unknown")
67+
return
68+
}
6069

61-
guard let conversation = await conversationLocalStore.fetchMLSConversation(groupID: groupID),
62-
let qualifiedID = await conversationLocalStore.qualifiedID(for: conversation)
70+
guard
71+
let conversation = await conversationLocalStore.fetchMLSConversation(groupID: groupID),
72+
let qualifiedID = await conversationLocalStore.qualifiedID(for: conversation)
6373
else {
6474
WireLogger.mls.error("Initiate reset broken MLS conversation failed: no conversation found")
6575
return
6676
}
6777

78+
guard qualifiedID.domain == selfDomain else {
79+
WireLogger.mls.warn("Can't initiate reset broken MLS conversation for other domains")
80+
return
81+
}
82+
6883
attributes = [
6984
.public: true,
7085
.conversationId: qualifiedID.safeForLoggingDescription,

β€ŽWireDomain/Tests/WireDomainTests/UseCases/InitiateResetMLSConversationUseCaseTests.swiftβ€Ž

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ final class InitiateResetMLSConversationUseCaseTests: XCTestCase {
7575
mlsService: mockMLSService,
7676
conversationLocalStore: mockConversationLocalStore,
7777
conversationRepository: mockConversationRepository,
78-
lockRepository: mockResetLockRepository
78+
lockRepository: mockResetLockRepository,
79+
selfDomain: conversationID.domain
7980
)
8081
}
8182

@@ -120,4 +121,25 @@ final class InitiateResetMLSConversationUseCaseTests: XCTestCase {
120121
XCTAssertEqual(mockResetLockRepository.setInitiatedResetConversationID_Invocations.count, 0)
121122
}
122123

124+
func testInvoke_DoNothing_WhenConversationDomainIsNotSelfDomain() async {
125+
126+
// Given - conversation with different domain
127+
let otherDomain = "other.example.com"
128+
let otherDomainConversationID = QualifiedID(uuid: conversationID.uuid, domain: otherDomain)
129+
mockConversationLocalStore.qualifiedIDFor_MockValue = otherDomainConversationID
130+
131+
let groupID = MLSGroupID.random()
132+
// When
133+
await sut.invoke(groupID: groupID, epoch: 99)
134+
135+
// Then
136+
XCTAssertEqual(mockConversationLocalStore.fetchMLSConversationGroupID_Invocations.count, 1)
137+
XCTAssertEqual(mockConversationLocalStore.qualifiedIDFor_Invocations.count, 1)
138+
XCTAssertEqual(mockAPI.resetMLSConversationEpochGroupID_Invocations.count, 0)
139+
XCTAssertEqual(mockMLSService.wipeGroup_Invocations.count, 0)
140+
XCTAssertEqual(mockMLSService.establishPendingGroupGroupID_Invocations.count, 0)
141+
XCTAssertEqual(mockResetLockRepository.setInitiatedResetConversationID_Invocations.count, 0)
142+
XCTAssertEqual(mockConversationRepository.pullConversationIdDomain_Invocations.count, 0)
143+
}
144+
123145
}

β€Žwire-ios-sync-engine/Source/UserSession/ZMUserSession/ZMUserSession.swiftβ€Ž

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1355,7 +1355,8 @@ extension ZMUserSession: SyncAgentDelegate {
13551355
conversationRepository: clientSessionComponent.conversationRepository,
13561356
lockRepository: ResetMLSConversationLockRepository(
13571357
userID: userId
1358-
)
1358+
),
1359+
selfDomain: resolvedBackendMetadata.domain
13591360
)
13601361
}
13611362

0 commit comments

Comments
Β (0)