Skip to content

Commit ac5180e

Browse files
authored
Do not rely on age, use origin_server_ts (#842)
* Never use age, it's not reliable * Fix types * changelog * Update tests * Further unsigned fixes
1 parent 942f912 commit ac5180e

File tree

4 files changed

+14
-21
lines changed

4 files changed

+14
-21
lines changed

changelog.d/842.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Remove usage of unreliable field `age` on events, allowing the bridge to work with non-Synapse homeserver implementations.

src/matrixeventprocessor.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,9 @@ export class MatrixEventProcessor {
9191
*/
9292
public async OnEvent(event: IMatrixEvent, rooms: IRoomStoreEntry[]): Promise<void> {
9393
const remoteRoom = rooms[0];
94-
if (event.unsigned.age > AGE_LIMIT) {
95-
log.info(`Skipping event due to age ${event.unsigned.age} > ${AGE_LIMIT}`);
96-
// throw new Unstable.EventTooOldError(
97-
// `Skipping event due to age ${event.unsigned.age} > ${AGE_LIMIT}`,
98-
// );
94+
const age = Date.now() - event.origin_server_ts;
95+
if (age > AGE_LIMIT) {
96+
log.info(`Skipping event due to age ${age} > ${AGE_LIMIT}`);
9997
return;
10098
}
10199
if (
@@ -247,8 +245,8 @@ export class MatrixEventProcessor {
247245
} else if (event.type === "m.room.member") {
248246
const membership = event.content!.membership;
249247
const client = this.bridge.botIntent.underlyingClient;
250-
const isNewJoin = event.unsigned.replaces_state === undefined ? true : (
251-
await client.getEvent(event.room_id, event.unsigned.replaces_state)).content.membership !== "join";
248+
const isNewJoin = event.unsigned?.replaces_state === undefined ? true : (
249+
await client.getEvent(event.room_id, event.unsigned?.replaces_state)).content.membership !== "join";
252250
if (membership === "join") {
253251
this.mxUserProfileCache.delete(`${event.room_id}:${event.sender}`);
254252
this.mxUserProfileCache.delete(event.sender);

src/matrixtypes.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,13 @@ export interface IMatrixEvent {
4040
redacts?: string;
4141
replaces_state?: string;
4242
content?: IMatrixEventContent;
43-
unsigned?: any; // tslint:disable-line no-any
44-
origin_server_ts?: number;
43+
origin_server_ts: number;
4544
users?: any; // tslint:disable-line no-any
4645
users_default?: any; // tslint:disable-line no-any
4746
notifications?: any; // tslint:disable-line no-any
47+
unsigned?: {
48+
replaces_state: any; // tslint:disable-line no-any
49+
}
4850
}
4951

5052
export interface IMatrixMessage {

test/test_matrixeventprocessor.ts

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,19 @@ import { MockChannel } from "./mocks/channel";
2525
import { IMatrixEvent } from "../src/matrixtypes";
2626
import { AppserviceMock } from "./mocks/appservicemock";
2727
import { Appservice } from "matrix-bot-sdk";
28-
import { RemoteStoreRoom } from "../src/db/roomstore";
2928

3029
// we are a test file and thus need those
3130
/* tslint:disable:no-unused-expression max-file-line-count no-any */
3231

3332
const TEST_TIMESTAMP = 1337;
3433

3534
function buildRequest(eventData): IMatrixEvent {
36-
if (eventData.unsigned === undefined) {
37-
eventData.unsigned = {age: 0};
38-
}
3935
if (eventData.sender === undefined) {
4036
eventData.sender = "@foobar:localhost";
4137
}
38+
if (!eventData.origin_server_ts) {
39+
eventData.origin_server_ts = Date.now();
40+
}
4241
return eventData;
4342
}
4443

@@ -378,7 +377,6 @@ describe("MatrixEventProcessor", () => {
378377
},
379378
sender: "@user:localhost",
380379
type: "m.room.member",
381-
unsigned: {},
382380
} as IMatrixEvent;
383381
await processor.ProcessStateEvent(event);
384382
expect(STATE_EVENT_MSG).to.equal("`@user:localhost` joined the room on Matrix.");
@@ -407,7 +405,6 @@ describe("MatrixEventProcessor", () => {
407405
sender: "@user:localhost",
408406
state_key: "@user2:localhost",
409407
type: "m.room.member",
410-
unsigned: {},
411408
} as IMatrixEvent;
412409
await processor.ProcessStateEvent(event);
413410
expect(STATE_EVENT_MSG).to.equal("`@user:localhost` invited `@user2:localhost` to the room on Matrix.");
@@ -437,7 +434,6 @@ describe("MatrixEventProcessor", () => {
437434
sender: "@user:localhost",
438435
state_key: "@user2:localhost",
439436
type: "m.room.member",
440-
unsigned: {},
441437
} as IMatrixEvent;
442438
await processor.ProcessStateEvent(event);
443439
expect(STATE_EVENT_MSG).to.equal("`@user:localhost` kicked `@user2:localhost` from the room on Matrix.");
@@ -451,7 +447,6 @@ describe("MatrixEventProcessor", () => {
451447
sender: "@user:localhost",
452448
state_key: "@user:localhost",
453449
type: "m.room.member",
454-
unsigned: {},
455450
} as IMatrixEvent;
456451
await processor.ProcessStateEvent(event);
457452
expect(STATE_EVENT_MSG).to.equal("`@user:localhost` left the room on Matrix.");
@@ -481,7 +476,6 @@ describe("MatrixEventProcessor", () => {
481476
sender: "@user:localhost",
482477
state_key: "@user2:localhost",
483478
type: "m.room.member",
484-
unsigned: {},
485479
} as IMatrixEvent;
486480
await processor.ProcessStateEvent(event);
487481
expect(STATE_EVENT_MSG).to.equal("`@user:localhost` banned `@user2:localhost` from the room on Matrix.");
@@ -971,21 +965,19 @@ This is the reply`,
971965
const {processor} = createMatrixEventProcessor();
972966
let err;
973967
try {
974-
await processor.OnEvent(buildRequest({unsigned: {age: AGE}}), []);
968+
await processor.OnEvent(buildRequest({ origin_server_ts: Date.now() - AGE }), []);
975969
} catch (e) { err = e; }
976970
// TODO: Not supported yet.
977971
// expect(err).to.be.an.instanceof(Unstable.EventTooOldError);
978972
});
979973
it("should reject un-processable events", async () => {
980-
const AGE = 900000; // 15 * 60 * 1000
981974
const {processor} = createMatrixEventProcessor();
982975
let err;
983976
try {
984977
await processor.OnEvent(
985978
buildRequest({
986979
content: {},
987980
type: "m.potato",
988-
unsigned: {age: AGE},
989981
}),
990982
[],
991983
);

0 commit comments

Comments
 (0)