Enhance media protections (#516)

This commit is contained in:
Shay 2024-07-29 09:48:36 -07:00 committed by GitHub
parent 77357e46af
commit f526b972a4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 36 additions and 1 deletions

View File

@ -35,7 +35,11 @@ export class MessageIsMedia extends Protection {
public async handleEvent(mjolnir: Mjolnir, roomId: string, event: any): Promise<any> { public async handleEvent(mjolnir: Mjolnir, roomId: string, event: any): Promise<any> {
if (event['type'] === 'm.room.message') { if (event['type'] === 'm.room.message') {
const content = event['content'] || {}; let content = event['content'] || {};
const relation = content["m.relates_to"]
if (relation?.["rel_type"] === "m.replace") {
content = content?.["m.new_content"] ?? content;
}
const msgtype = content['msgtype'] || 'm.text'; const msgtype = content['msgtype'] || 'm.text';
const formattedBody = content['formatted_body'] || ''; const formattedBody = content['formatted_body'] || '';
const isMedia = msgtype === 'm.image' || msgtype === 'm.video' || msgtype === 'm.sticker' || formattedBody.toLowerCase().includes('<img'); const isMedia = msgtype === 'm.image' || msgtype === 'm.video' || msgtype === 'm.sticker' || formattedBody.toLowerCase().includes('<img');

View File

@ -6,12 +6,16 @@ import { ProtectionSettingValidationError } from "../../src/protections/Protecti
import { NumberProtectionSetting, StringProtectionSetting, StringListProtectionSetting } from "../../src/protections/ProtectionSettings"; import { NumberProtectionSetting, StringProtectionSetting, StringListProtectionSetting } from "../../src/protections/ProtectionSettings";
import { newTestUser, noticeListener } from "./clientHelper"; import { newTestUser, noticeListener } from "./clientHelper";
import { matrixClient, mjolnir } from "./mjolnirSetupUtils"; import { matrixClient, mjolnir } from "./mjolnirSetupUtils";
import {MessageIsMedia} from "../../src/protections/MessageIsMedia";
describe("Test: Protection settings", function() { describe("Test: Protection settings", function() {
let client; let client;
let room;
this.beforeEach(async function () { this.beforeEach(async function () {
client = await newTestUser(this.config.homeserverUrl, { name: { contains: "protection-settings" }}); client = await newTestUser(this.config.homeserverUrl, { name: { contains: "protection-settings" }});
await client.start(); await client.start();
room = await client.createRoom();
await client.joinRoom(room)
}) })
this.afterEach(async function () { this.afterEach(async function () {
await client.stop(); await client.stop();
@ -158,5 +162,32 @@ describe("Test: Protection settings", function() {
"Changed d0sNrt.test to asd2 (was asd1)" "Changed d0sNrt.test to asd2 (was asd1)"
) )
}); });
it("Events are checked for new content under media protections", async function() {
this.timeout(20000);
await client.joinRoom(this.config.managementRoom);
await this.mjolnir.protectionManager.registerProtection(new MessageIsMedia());
// send a regular media message to make sure protections are running
await client.sendMessage(room, {msgtype: "m.image", body: ""})
let reply = () => new Promise((resolve, reject) => {
client.on('room.message', noticeListener(this.mjolnir.managementRoomId, (event) => {
if (event.content.body.includes("Redacting event")) {
resolve(event);
}
}))
});
await reply;
await client.sendMessage(room, {body: "", msgtype: "m.text", "m.new_content": {msgtype: "m.image", body: ""}, "m.relates_to": {"rel_type": "m.replace"}})
let reply2 = () => new Promise((resolve, reject) => {
client.on('room.message', noticeListener(this.mjolnir.managementRoomId, (event) => {
if (event.content.body.includes("Redacting event")) {
resolve(event);
}
}))
});
await reply2;
});
}); });