From 5d928f07a05da3f05a54bbec400b7db6775959be Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Tue, 9 Jul 2019 15:06:07 +0200 Subject: [PATCH] don't accept any edit earlier than the server-side set edit. --- src/models/event.js | 6 +++--- src/models/relations.js | 10 ++++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/models/event.js b/src/models/event.js index 01804e6d32f..3a418c60aa5 100644 --- a/src/models/event.js +++ b/src/models/event.js @@ -898,7 +898,7 @@ utils.extend(module.exports.MatrixEvent.prototype, { return this.status; }, - _getServerAggregatedRelation(relType) { + getServerAggregatedRelation(relType) { const relations = this.getUnsigned()["m.relations"]; if (relations) { return relations[relType]; @@ -911,7 +911,7 @@ utils.extend(module.exports.MatrixEvent.prototype, { * @return {string?} */ replacingEventId() { - const replaceRelation = this._getServerAggregatedRelation("m.replace"); + const replaceRelation = this.getServerAggregatedRelation("m.replace"); if (replaceRelation) { return replaceRelation.event_id; } else if (this._replacingEvent) { @@ -936,7 +936,7 @@ utils.extend(module.exports.MatrixEvent.prototype, { * @return {Date?} */ replacingEventDate() { - const replaceRelation = this._getServerAggregatedRelation("m.replace"); + const replaceRelation = this.getServerAggregatedRelation("m.replace"); if (replaceRelation) { const ts = replaceRelation.origin_server_ts; if (Number.isFinite(ts)) { diff --git a/src/models/relations.js b/src/models/relations.js index 22ed41669f5..5b2045a4533 100644 --- a/src/models/relations.js +++ b/src/models/relations.js @@ -301,10 +301,20 @@ export default class Relations extends EventEmitter { // event is known anyway. return null; } + + // the all-knowning server tells us that the event at some point had + // this timestamp for its replacement, so any following replacement should definitely not be less + const replaceRelation = + this._targetEvent.getServerAggregatedRelation("m.replace"); + const minTs = replaceRelation && replaceRelation.origin_server_ts; + return this.getRelations().reduce((last, event) => { if (event.getSender() !== this._targetEvent.getSender()) { return last; } + if (minTs && minTs > event.getTs()) { + return last; + } if (last && last.getTs() > event.getTs()) { return last; }