diff --git a/sync2/handler2/handler.go b/sync2/handler2/handler.go index 792437b..dd03ab4 100644 --- a/sync2/handler2/handler.go +++ b/sync2/handler2/handler.go @@ -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 { diff --git a/tests-integration/lists_test.go b/tests-integration/lists_test.go index 32562bc..c0ceae9 100644 --- a/tests-integration/lists_test.go +++ b/tests-integration/lists_test.go @@ -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") }