Skip to content

Commit 4038e2b

Browse files
author
Alfonso Grillo
authored
Merge pull request #7164 from vector-im/alfogrillo/delete_old_account_data
Delete old account data (PSG-635)
2 parents 34159cb + c4219ad commit 4038e2b

File tree

3 files changed

+96
-1
lines changed

3 files changed

+96
-1
lines changed

RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/Service/MatrixSDK/UserSessionsDataProvider.swift

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,16 @@ class UserSessionsDataProvider: UserSessionsDataProviderProtocol {
3737
}
3838

3939
func devices(completion: @escaping (MXResponse<[MXDevice]>) -> Void) {
40-
session.matrixRestClient.devices(completion: completion)
40+
session.matrixRestClient.devices { [weak self] response in
41+
switch response {
42+
case .success(let devices):
43+
self?.deleteAccountDataIfNeeded(deviceList: devices)
44+
case .failure:
45+
break
46+
}
47+
48+
completion(response)
49+
}
4150
}
4251

4352
func device(withDeviceId deviceId: String, ofUser userId: String) -> MXDeviceInfo? {
@@ -66,3 +75,29 @@ class UserSessionsDataProvider: UserSessionsDataProviderProtocol {
6675
return try await service.isServiceAvailable()
6776
}
6877
}
78+
79+
extension UserSessionsDataProvider {
80+
private func deleteAccountDataIfNeeded(deviceList: [MXDevice]) {
81+
let obsoletedDeviceAccountDataKeys = obsoletedDeviceAccountData(deviceList: deviceList,
82+
accountDataEvents: session.accountData.allAccountDataEvents())
83+
84+
for accountDataKey in obsoletedDeviceAccountDataKeys {
85+
session.deleteAccountData(withType: accountDataKey, success: {}, failure: { _ in })
86+
}
87+
}
88+
89+
// internal just to facilitate tests
90+
func obsoletedDeviceAccountData(deviceList: [MXDevice], accountDataEvents: [String: Any]) -> Set<String> {
91+
let deviceAccountDataKeys = Set(
92+
accountDataEvents
93+
.map(\.key)
94+
.filter { $0.hasPrefix(kMXAccountDataTypeClientInformation) }
95+
)
96+
97+
let expectedDeviceAccountDataKeys = Set(deviceList.map {
98+
"\(kMXAccountDataTypeClientInformation).\($0.deviceId)"
99+
})
100+
101+
return deviceAccountDataKeys.subtracting(expectedDeviceAccountDataKeys)
102+
}
103+
}

RiotTests/UserSessionsDataProviderTests.swift

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,69 @@ class UserSessionCardViewDataTests: XCTestCase {
100100

101101
XCTAssertEqual(verificationState, .permanentlyUnverified)
102102
}
103+
104+
func testObsoletedDeviceInformation_someMatch() {
105+
let mxSession = MockSession(canCrossSign: true)
106+
let dataProvider = UserSessionsDataProvider(session: mxSession)
107+
108+
let accountDataEvents: [String: Any] = [
109+
"io.element.matrix_client_information.D": "",
110+
"foo": ""
111+
]
112+
113+
let expectedObsoletedEvents: Set = [
114+
"io.element.matrix_client_information.D"
115+
]
116+
117+
let obsoletedEvents = dataProvider.obsoletedDeviceAccountData(deviceList: .mockDevices, accountDataEvents: accountDataEvents)
118+
119+
XCTAssertEqual(obsoletedEvents, expectedObsoletedEvents)
120+
}
121+
122+
func testObsoletedDeviceInformation_noMatch() {
123+
let mxSession = MockSession(canCrossSign: true)
124+
let dataProvider = UserSessionsDataProvider(session: mxSession)
125+
126+
let accountDataEvents: [String: Any] = [
127+
"io.element.matrix_client_information.C": "",
128+
"foo": ""
129+
]
130+
131+
let expectedObsoletedEvents: Set<String> = []
132+
let obsoletedEvents = dataProvider.obsoletedDeviceAccountData(deviceList: .mockDevices, accountDataEvents: accountDataEvents)
133+
134+
XCTAssertEqual(obsoletedEvents, expectedObsoletedEvents)
135+
}
136+
137+
func testObsoletedDeviceInformation_allMatch() {
138+
let mxSession = MockSession(canCrossSign: true)
139+
let dataProvider = UserSessionsDataProvider(session: mxSession)
140+
141+
let expectedObsoletedEvents = Set(["D", "E", "F"].map { "io.element.matrix_client_information.\($0)"})
142+
143+
let accountDataEvents: [String: Any] = expectedObsoletedEvents.reduce(into: ["foo": ""]) { partialResult, value in
144+
partialResult[value] = ""
145+
}
146+
147+
let obsoletedEvents = dataProvider.obsoletedDeviceAccountData(deviceList: .mockDevices, accountDataEvents: accountDataEvents)
148+
149+
XCTAssertEqual(obsoletedEvents, expectedObsoletedEvents)
150+
}
103151
}
104152

105153
// MARK: Mocks
106154

155+
private extension Array where Element == MXDevice {
156+
static let mockDevices: [MXDevice] = {
157+
["A", "B", "C"]
158+
.map {
159+
let device = MXDevice()
160+
device.deviceId = $0
161+
return device
162+
}
163+
}()
164+
}
165+
107166
// Device ID constants.
108167
private extension String {
109168
static var otherDeviceA: String { "abcdef" }

changelog.d/pr-7164.change

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add old device data from user's account data events.

0 commit comments

Comments
 (0)