aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTill <2353100+S7evinK@users.noreply.github.com>2022-11-29 15:46:28 +0100
committerGitHub <noreply@github.com>2022-11-29 15:46:28 +0100
commitf8d1dc521d401b78163840d8ff978cb2cd2718d7 (patch)
tree011d098dae221b8d688f732812aba53ae8720873
parent1990c154e920a350654d0ae6e02071950e595a01 (diff)
Fix `m.receipt`s causing notifications (#2893)
Fixes https://github.com/matrix-org/dendrite/issues/2353
-rw-r--r--syncapi/streams/stream_receipt.go3
-rw-r--r--syncapi/types/types.go7
-rw-r--r--syncapi/types/types_test.go100
3 files changed, 108 insertions, 2 deletions
diff --git a/syncapi/streams/stream_receipt.go b/syncapi/streams/stream_receipt.go
index 97781507..16a81e83 100644
--- a/syncapi/streams/stream_receipt.go
+++ b/syncapi/streams/stream_receipt.go
@@ -87,8 +87,7 @@ func (p *ReceiptStreamProvider) IncrementalSync(
}
ev := gomatrixserverlib.ClientEvent{
- Type: gomatrixserverlib.MReceipt,
- RoomID: roomID,
+ Type: gomatrixserverlib.MReceipt,
}
content := make(map[string]ReceiptMRead)
for _, receipt := range receipts {
diff --git a/syncapi/types/types.go b/syncapi/types/types.go
index 295187ac..9fbadc06 100644
--- a/syncapi/types/types.go
+++ b/syncapi/types/types.go
@@ -480,6 +480,13 @@ func (jr JoinResponse) MarshalJSON() ([]byte, error) {
if jr.Ephemeral != nil && len(jr.Ephemeral.Events) == 0 {
a.Ephemeral = nil
}
+ if jr.Ephemeral != nil {
+ // Remove the room_id from EDUs, as this seems to cause Element Web
+ // to trigger notifications - https://github.com/vector-im/element-web/issues/17263
+ for i := range jr.Ephemeral.Events {
+ jr.Ephemeral.Events[i].RoomID = ""
+ }
+ }
if jr.AccountData != nil && len(jr.AccountData.Events) == 0 {
a.AccountData = nil
}
diff --git a/syncapi/types/types_test.go b/syncapi/types/types_test.go
index 19fcfc15..74246d96 100644
--- a/syncapi/types/types_test.go
+++ b/syncapi/types/types_test.go
@@ -2,6 +2,7 @@ package types
import (
"encoding/json"
+ "reflect"
"testing"
"github.com/matrix-org/gomatrixserverlib"
@@ -63,3 +64,102 @@ func TestNewInviteResponse(t *testing.T) {
t.Fatalf("Invite response didn't contain correct info")
}
}
+
+func TestJoinResponse_MarshalJSON(t *testing.T) {
+ type fields struct {
+ Summary *Summary
+ State *ClientEvents
+ Timeline *Timeline
+ Ephemeral *ClientEvents
+ AccountData *ClientEvents
+ UnreadNotifications *UnreadNotifications
+ }
+ tests := []struct {
+ name string
+ fields fields
+ want []byte
+ wantErr bool
+ }{
+ {
+ name: "empty state is removed",
+ fields: fields{
+ State: &ClientEvents{},
+ },
+ want: []byte("{}"),
+ },
+ {
+ name: "empty accountdata is removed",
+ fields: fields{
+ AccountData: &ClientEvents{},
+ },
+ want: []byte("{}"),
+ },
+ {
+ name: "empty ephemeral is removed",
+ fields: fields{
+ Ephemeral: &ClientEvents{},
+ },
+ want: []byte("{}"),
+ },
+ {
+ name: "empty timeline is removed",
+ fields: fields{
+ Timeline: &Timeline{},
+ },
+ want: []byte("{}"),
+ },
+ {
+ name: "empty summary is removed",
+ fields: fields{
+ Summary: &Summary{},
+ },
+ want: []byte("{}"),
+ },
+ {
+ name: "unread notifications are removed, if everything else is empty",
+ fields: fields{
+ UnreadNotifications: &UnreadNotifications{},
+ },
+ want: []byte("{}"),
+ },
+ {
+ name: "unread notifications are NOT removed, if state is set",
+ fields: fields{
+ State: &ClientEvents{Events: []gomatrixserverlib.ClientEvent{{Content: []byte("{}")}}},
+ UnreadNotifications: &UnreadNotifications{NotificationCount: 1},
+ },
+ want: []byte(`{"state":{"events":[{"content":{},"type":""}]},"unread_notifications":{"highlight_count":0,"notification_count":1}}`),
+ },
+ {
+ name: "roomID is removed from EDUs",
+ fields: fields{
+ Ephemeral: &ClientEvents{
+ Events: []gomatrixserverlib.ClientEvent{
+ {RoomID: "!someRandomRoomID:test", Content: []byte("{}")},
+ },
+ },
+ },
+ want: []byte(`{"ephemeral":{"events":[{"content":{},"type":""}]}}`),
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ jr := JoinResponse{
+ Summary: tt.fields.Summary,
+ State: tt.fields.State,
+ Timeline: tt.fields.Timeline,
+ Ephemeral: tt.fields.Ephemeral,
+ AccountData: tt.fields.AccountData,
+ UnreadNotifications: tt.fields.UnreadNotifications,
+ }
+ got, err := jr.MarshalJSON()
+ if (err != nil) != tt.wantErr {
+ t.Errorf("MarshalJSON() error = %v, wantErr %v", err, tt.wantErr)
+ return
+ }
+ if !reflect.DeepEqual(got, tt.want) {
+ t.Errorf("MarshalJSON() got = %v, want %v", string(got), string(tt.want))
+ }
+ })
+ }
+}