diff --git a/syncapi/types/provider.go b/syncapi/types/provider.go index ae35b791f..4c30fce89 100644 --- a/syncapi/types/provider.go +++ b/syncapi/types/provider.go @@ -22,7 +22,7 @@ type SyncRequest struct { // Updated by the PDU stream. Rooms map[string]string // Updated by the PDU stream. - IgnoredUsers map[string]interface{} + IgnoredUsers map[string]interface{} `json:"ignored_users"` } type StreamProvider interface { diff --git a/sytest-whitelist b/sytest-whitelist index 38a057da6..142ed44a6 100644 --- a/sytest-whitelist +++ b/sytest-whitelist @@ -681,4 +681,7 @@ Cannot send tombstone event that points to the same room Room summary counts change when membership changes /upgrade copies >100 power levels to the new room Room state after a rejected message event is the same as before -Room state after a rejected state event is the same as before \ No newline at end of file +Room state after a rejected state event is the same as before +Ignore user in existing room +Ignore invite in full sync +Ignore invite in incremental sync \ No newline at end of file diff --git a/userapi/consumers/syncapi_streamevent.go b/userapi/consumers/syncapi_streamevent.go index 34a67d2ea..1205af268 100644 --- a/userapi/consumers/syncapi_streamevent.go +++ b/userapi/consumers/syncapi_streamevent.go @@ -395,6 +395,10 @@ func (s *OutputStreamEventConsumer) notifyLocal(ctx context.Context, event *goma return nil } +type ignoredUsers struct { + List map[string]interface{} `json:"ignored_users"` +} + // evaluatePushRules fetches and evaluates the push rules of a local // user. Returns actions (including dont_notify). func (s *OutputStreamEventConsumer) evaluatePushRules(ctx context.Context, event *gomatrixserverlib.HeaderedEvent, mem *localMembership, roomSize int) ([]*pushrules.Action, error) { @@ -404,8 +408,24 @@ func (s *OutputStreamEventConsumer) evaluatePushRules(ctx context.Context, event return nil, nil } + // Get accountdata to check if the event.Sender() is ignored by mem.LocalPart + data, err := s.db.GetAccountDataByType(ctx, mem.Localpart, "", "m.ignored_user_list") + if err != nil { + return nil, err + } + if data != nil { + ignored := ignoredUsers{} + err = json.Unmarshal(data, &ignored) + if err != nil { + return nil, err + } + sender := event.Sender() + if _, ok := ignored.List[sender]; ok { + return nil, fmt.Errorf("user %s is ignored", sender) + } + } var res api.QueryPushRulesResponse - if err := s.userAPI.QueryPushRules(ctx, &api.QueryPushRulesRequest{UserID: mem.UserID}, &res); err != nil { + if err = s.userAPI.QueryPushRules(ctx, &api.QueryPushRulesRequest{UserID: mem.UserID}, &res); err != nil { return nil, err }