De-duplicate reactions by sender to account for faulty/malicious servers (#11340)

* De-duplicate reactions by sender to account for faulty/malicious servers

* Fix copyrights
t3chguy/dedup-icons-17oct
Michael Telatynski 2023-07-31 15:42:23 +01:00 committed by GitHub
parent 1f3d99c25c
commit 053b564d75
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 11 additions and 6 deletions

View File

@ -18,6 +18,7 @@ import React, { SyntheticEvent } from "react";
import classNames from "classnames";
import { MatrixEvent, MatrixEventEvent } from "matrix-js-sdk/src/models/event";
import { Relations, RelationsEvent } from "matrix-js-sdk/src/models/relations";
import { uniqBy } from "lodash";
import { _t } from "../../../languageHandler";
import { isContentActionable } from "../../../utils/EventUtils";
@ -177,6 +178,10 @@ export default class ReactionsRow extends React.PureComponent<IProps, IState> {
if (!count) {
return null;
}
// Deduplicate the events as per the spec https://spec.matrix.org/v1.7/client-server-api/#annotations-client-behaviour
// This isn't done by the underlying data model as applications may still need access to the whole list of events
// for moderation purposes.
const deduplicatedEvents = uniqBy([...events], (e) => e.getSender());
const myReactionEvent = myReactions?.find((mxEvent) => {
if (mxEvent.isRedacted()) {
return false;
@ -187,9 +192,9 @@ export default class ReactionsRow extends React.PureComponent<IProps, IState> {
<ReactionsRowButton
key={content}
content={content}
count={count}
count={deduplicatedEvents.length}
mxEvent={mxEvent}
reactionEvents={events}
reactionEvents={deduplicatedEvents}
myReactionEvent={myReactionEvent}
disabled={
!this.context.canReact ||

View File

@ -31,8 +31,8 @@ interface IProps {
content: string;
// The count of votes for this key
count: number;
// A Set of Matrix reaction events for this key
reactionEvents: Set<MatrixEvent>;
// A list of Matrix reaction events for this key
reactionEvents: MatrixEvent[];
// A possible Matrix event if the current user has voted for this type
myReactionEvent?: MatrixEvent;
// Whether to prevent quick-reactions by clicking on this reaction

View File

@ -27,8 +27,8 @@ interface IProps {
mxEvent: MatrixEvent;
// The reaction content / key / emoji
content: string;
// A Set of Matrix reaction events for this key
reactionEvents: Set<MatrixEvent>;
// A list of Matrix reaction events for this key
reactionEvents: MatrixEvent[];
visible: boolean;
}