Check for unstable prefix in MSC4115

This commit is contained in:
Kegan Dougal 2024-04-25 15:15:42 +01:00
parent abf5aeff82
commit 0af85096aa
2 changed files with 16 additions and 4 deletions

View File

@ -274,6 +274,7 @@ func (h *Handler) Accumulate(ctx context.Context, userID, deviceID, roomID strin
for i := range timeline.Events {
// Delete MSC4115 field as it isn't accurate when we reuse the same event for >1 user
timeline.Events[i], _ = sjson.DeleteBytes(timeline.Events[i], "unsigned.membership")
timeline.Events[i], _ = sjson.DeleteBytes(timeline.Events[i], `unsigned.io\.element\.msc4115\.membership`)
parsed := gjson.ParseBytes(timeline.Events[i])
eventID := parsed.Get("event_id").Str
@ -376,6 +377,7 @@ func (h *Handler) Accumulate(ctx context.Context, userID, deviceID, roomID strin
func (h *Handler) Initialise(ctx context.Context, roomID string, state []json.RawMessage) error {
for i := range state { // Delete MSC4115 field as it isn't accurate when we reuse the same event for >1 user
state[i], _ = sjson.DeleteBytes(state[i], "unsigned.membership")
state[i], _ = sjson.DeleteBytes(state[i], `unsigned.io\.element\.msc4115\.membership`)
}
res, err := h.Store.Initialise(roomID, state)
if err != nil {

View File

@ -2,6 +2,7 @@ package syncv3
import (
"encoding/json"
"strings"
"testing"
"time"
@ -364,6 +365,15 @@ func TestBumpEventTypesOnStartup(t *testing.T) {
}
func TestDeleteMSC4115Field(t *testing.T) {
t.Run("stable prefix", func(t *testing.T) {
testDeleteMSC4115Field(t, "membership")
})
t.Run("unstable prefix", func(t *testing.T) {
testDeleteMSC4115Field(t, "io.element.msc4115.membership")
})
}
func testDeleteMSC4115Field(t *testing.T, fieldName string) {
rig := NewTestRig(t)
defer rig.Finish()
roomID := "!TestDeleteMSC4115Field:localhost"
@ -390,11 +400,11 @@ func TestDeleteMSC4115Field(t *testing.T) {
// ensure live events remove the field.
liveEvent := testutils.NewMessageEvent(t, alice, "live event", testutils.WithUnsigned(map[string]interface{}{
"membership": "join",
fieldName: "join",
}))
liveEventWithoutMembership := make(json.RawMessage, len(liveEvent))
copy(liveEventWithoutMembership, liveEvent)
liveEventWithoutMembership, err := sjson.DeleteBytes(liveEventWithoutMembership, "unsigned.membership")
liveEventWithoutMembership, err := sjson.DeleteBytes(liveEventWithoutMembership, "unsigned."+strings.ReplaceAll(fieldName, ".", `\.`))
if err != nil {
t.Fatalf("failed to delete unsigned.membership field")
}
@ -411,11 +421,11 @@ func TestDeleteMSC4115Field(t *testing.T) {
stateEvent := testutils.NewStateEvent(t, "m.room.name", "", alice, map[string]interface{}{
"name": "Room Name",
}, testutils.WithUnsigned(map[string]interface{}{
"membership": "join",
fieldName: "join",
}))
stateEventWithoutMembership := make(json.RawMessage, len(stateEvent))
copy(stateEventWithoutMembership, stateEvent)
stateEventWithoutMembership, err = sjson.DeleteBytes(stateEventWithoutMembership, "unsigned.membership")
stateEventWithoutMembership, err = sjson.DeleteBytes(stateEventWithoutMembership, "unsigned."+strings.ReplaceAll(fieldName, ".", `\.`))
if err != nil {
t.Fatalf("failed to delete unsigned.membership field")
}