Skip to content

Commit c802e2d

Browse files
authored
Merge pull request #7988 from vector-im/yostyle/msc3912
Implement MSC3912 to delete server side all the data of a deleted voice broadcast
2 parents e87d312 + f5f32d3 commit c802e2d

File tree

24 files changed

+221
-72
lines changed

24 files changed

+221
-72
lines changed

changelog.d/7967.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[Voice Broadcast] Use MSC3912 to delete server side all the related events

changelog.d/7988.sdk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Implement [MSC3912](https://github.com/matrix-org/matrix-spec-proposals/pull/3912): Relation-based redactions

matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/homeserver/HomeServerCapabilities.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@ data class HomeServerCapabilities(
7575
* True if the home server supports remote toggle of Pusher for a given device.
7676
*/
7777
val canRemotelyTogglePushNotificationsOfDevices: Boolean = false,
78+
79+
/**
80+
* True if the home server supports event redaction with relations.
81+
*/
82+
var canRedactEventWithRelations: Boolean = false,
7883
) {
7984

8085
enum class RoomCapabilitySupport {

matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/send/SendService.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,11 +156,12 @@ interface SendService {
156156

157157
/**
158158
* Redact (delete) the given event.
159-
* @param event The event to redact
160-
* @param reason Optional reason string
159+
* @param event the event to redact
160+
* @param reason optional reason string
161+
* @param withRelations the list of relation types to redact with this event
161162
* @param additionalContent additional content to put in the event content
162163
*/
163-
fun redactEvent(event: Event, reason: String?, additionalContent: Content? = null): Cancelable
164+
fun redactEvent(event: Event, reason: String?, withRelations: List<String>? = null, additionalContent: Content? = null): Cancelable
164165

165166
/**
166167
* Schedule this message to be resent.

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/version/Versions.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ private const val FEATURE_QR_CODE_LOGIN = "org.matrix.msc3882"
5858
private const val FEATURE_THREADS_MSC3771 = "org.matrix.msc3771"
5959
private const val FEATURE_THREADS_MSC3773 = "org.matrix.msc3773"
6060
private const val FEATURE_REMOTE_TOGGLE_PUSH_NOTIFICATIONS_MSC3881 = "org.matrix.msc3881"
61+
private const val FEATURE_EVENT_REDACTION_WITH_RELATIONS = "org.matrix.msc3912"
62+
private const val FEATURE_EVENT_REDACTION_WITH_RELATIONS_STABLE = "org.matrix.msc3912.stable"
6163

6264
/**
6365
* Return true if the SDK supports this homeserver version.
@@ -153,3 +155,13 @@ private fun Versions.getMaxVersion(): HomeServerVersion {
153155
internal fun Versions.doesServerSupportRemoteToggleOfPushNotifications(): Boolean {
154156
return unstableFeatures?.get(FEATURE_REMOTE_TOGGLE_PUSH_NOTIFICATIONS_MSC3881).orFalse()
155157
}
158+
159+
/**
160+
* Indicate if the server supports MSC3912: https://github.com/matrix-org/matrix-spec-proposals/pull/3912.
161+
*
162+
* @return true if event redaction with relations is supported
163+
*/
164+
internal fun Versions.doesServerSupportRedactEventWithRelations(): Boolean {
165+
return unstableFeatures?.get(FEATURE_EVENT_REDACTION_WITH_RELATIONS).orFalse() ||
166+
unstableFeatures?.get(FEATURE_EVENT_REDACTION_WITH_RELATIONS_STABLE).orFalse()
167+
}

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/RedactEventTask.kt

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,12 @@
1515
*/
1616
package org.matrix.android.sdk.internal.crypto.tasks
1717

18+
import org.matrix.android.sdk.api.extensions.orFalse
1819
import org.matrix.android.sdk.internal.network.GlobalErrorReceiver
1920
import org.matrix.android.sdk.internal.network.executeRequest
21+
import org.matrix.android.sdk.internal.session.homeserver.HomeServerCapabilitiesDataSource
2022
import org.matrix.android.sdk.internal.session.room.RoomAPI
23+
import org.matrix.android.sdk.internal.session.room.send.model.EventRedactBody
2124
import org.matrix.android.sdk.internal.task.Task
2225
import javax.inject.Inject
2326

@@ -26,22 +29,34 @@ internal interface RedactEventTask : Task<RedactEventTask.Params, String> {
2629
val txID: String,
2730
val roomId: String,
2831
val eventId: String,
29-
val reason: String?
32+
val reason: String?,
33+
val withRelations: List<String>?,
3034
)
3135
}
3236

3337
internal class DefaultRedactEventTask @Inject constructor(
3438
private val roomAPI: RoomAPI,
35-
private val globalErrorReceiver: GlobalErrorReceiver
39+
private val globalErrorReceiver: GlobalErrorReceiver,
40+
private val homeServerCapabilitiesDataSource: HomeServerCapabilitiesDataSource,
3641
) : RedactEventTask {
3742

3843
override suspend fun execute(params: RedactEventTask.Params): String {
44+
val withRelations = if (homeServerCapabilitiesDataSource.getHomeServerCapabilities()?.canRedactEventWithRelations.orFalse() &&
45+
!params.withRelations.isNullOrEmpty()) {
46+
params.withRelations
47+
} else {
48+
null
49+
}
50+
3951
val response = executeRequest(globalErrorReceiver) {
4052
roomAPI.redactEvent(
4153
txId = params.txID,
4254
roomId = params.roomId,
4355
eventId = params.eventId,
44-
reason = if (params.reason == null) emptyMap() else mapOf("reason" to params.reason)
56+
body = EventRedactBody(
57+
reason = params.reason,
58+
withRelations = withRelations,
59+
)
4560
)
4661
}
4762
return response.eventId

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmSessionStoreMigration.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ import org.matrix.android.sdk.internal.database.migration.MigrateSessionTo045
6565
import org.matrix.android.sdk.internal.database.migration.MigrateSessionTo046
6666
import org.matrix.android.sdk.internal.database.migration.MigrateSessionTo047
6767
import org.matrix.android.sdk.internal.database.migration.MigrateSessionTo048
68+
import org.matrix.android.sdk.internal.database.migration.MigrateSessionTo049
6869
import org.matrix.android.sdk.internal.util.Normalizer
6970
import org.matrix.android.sdk.internal.util.database.MatrixRealmMigration
7071
import javax.inject.Inject
@@ -73,7 +74,7 @@ internal class RealmSessionStoreMigration @Inject constructor(
7374
private val normalizer: Normalizer
7475
) : MatrixRealmMigration(
7576
dbName = "Session",
76-
schemaVersion = 48L,
77+
schemaVersion = 49L,
7778
) {
7879
/**
7980
* Forces all RealmSessionStoreMigration instances to be equal.
@@ -131,5 +132,6 @@ internal class RealmSessionStoreMigration @Inject constructor(
131132
if (oldVersion < 46) MigrateSessionTo046(realm).perform()
132133
if (oldVersion < 47) MigrateSessionTo047(realm).perform()
133134
if (oldVersion < 48) MigrateSessionTo048(realm).perform()
135+
if (oldVersion < 49) MigrateSessionTo049(realm).perform()
134136
}
135137
}

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/HomeServerCapabilitiesMapper.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ internal object HomeServerCapabilitiesMapper {
4747
canLoginWithQrCode = entity.canLoginWithQrCode,
4848
canUseThreadReadReceiptsAndNotifications = entity.canUseThreadReadReceiptsAndNotifications,
4949
canRemotelyTogglePushNotificationsOfDevices = entity.canRemotelyTogglePushNotificationsOfDevices,
50+
canRedactEventWithRelations = entity.canRedactEventWithRelations,
5051
)
5152
}
5253

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Copyright (c) 2023 The Matrix.org Foundation C.I.C.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.matrix.android.sdk.internal.database.migration
18+
19+
import io.realm.DynamicRealm
20+
import org.matrix.android.sdk.internal.database.model.HomeServerCapabilitiesEntityFields
21+
import org.matrix.android.sdk.internal.extensions.forceRefreshOfHomeServerCapabilities
22+
import org.matrix.android.sdk.internal.util.database.RealmMigrator
23+
24+
internal class MigrateSessionTo049(realm: DynamicRealm) : RealmMigrator(realm, 49) {
25+
26+
override fun doMigrate(realm: DynamicRealm) {
27+
realm.schema.get("HomeServerCapabilitiesEntity")
28+
?.addField(HomeServerCapabilitiesEntityFields.CAN_REDACT_EVENT_WITH_RELATIONS, Boolean::class.java)
29+
?.transform { obj ->
30+
obj.set(HomeServerCapabilitiesEntityFields.CAN_REDACT_EVENT_WITH_RELATIONS, false)
31+
}
32+
?.forceRefreshOfHomeServerCapabilities()
33+
}
34+
}

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/HomeServerCapabilitiesEntity.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ internal open class HomeServerCapabilitiesEntity(
3434
var canLoginWithQrCode: Boolean = false,
3535
var canUseThreadReadReceiptsAndNotifications: Boolean = false,
3636
var canRemotelyTogglePushNotificationsOfDevices: Boolean = false,
37+
var canRedactEventWithRelations: Boolean = false,
3738
) : RealmObject() {
3839

3940
companion object

0 commit comments

Comments
 (0)