Unbitrotting ruleserver tests

This commit is contained in:
David Teller 2022-11-15 12:39:44 +01:00
parent fb52e3dcb2
commit f1720ddb41

View File

@ -2,7 +2,7 @@ import { strict as assert } from "assert";
import { newTestUser } from "./clientHelper"; import { newTestUser } from "./clientHelper";
import { Mjolnir } from "../../src/Mjolnir"; import { Mjolnir } from "../../src/Mjolnir";
import config from "../../src/config"; import { read as configRead } from "../../src/config";
import { getRequestFn, LogService, MatrixClient } from "matrix-bot-sdk"; import { getRequestFn, LogService, MatrixClient } from "matrix-bot-sdk";
import { createBanList, getFirstReaction } from "./commands/commandUtils"; import { createBanList, getFirstReaction } from "./commands/commandUtils";
@ -10,16 +10,17 @@ import { createBanList, getFirstReaction } from "./commands/commandUtils";
* Get a copy of the rules from the ruleserver. * Get a copy of the rules from the ruleserver.
*/ */
async function currentRules(mjolnir: Mjolnir): Promise<{ start: object, stop: object, since: string }> { async function currentRules(mjolnir: Mjolnir): Promise<{ start: object, stop: object, since: string }> {
return await new Promise((resolve, reject) => getRequestFn()({ return await new Promise((resolve, reject) => {
uri: `http://${mjolnir.config.web.address}:${mjolnir.config.web.port}/api/1/ruleserver/updates/`, return getRequestFn()({
method: "GET" uri: `http://${mjolnir.config.web.address}:${mjolnir.config.web.port}/api/1/ruleserver/updates/`,
}, (error, response, body) => { method: "GET"
}, (error, _response, body) => {
if (error) { if (error) {
reject(error) reject(error)
} else { } else {
resolve(JSON.parse(body)) resolve(JSON.parse(body))
} }
})); })});
} }
/** /**
@ -51,30 +52,25 @@ describe("Test: that policy lists are consumed by the associated synapse module"
if(this.config.web.ruleServer.enabled) { if(this.config.web.ruleServer.enabled) {
this.timeout(5000) this.timeout(5000)
LogService.debug('policyConsumptionTest', `Rules at end of test ${JSON.stringify(await currentRules(this.mjolnir), null, 2)}`); LogService.debug('policyConsumptionTest', `Rules at end of test ${JSON.stringify(await currentRules(this.mjolnir), null, 2)}`);
const mjolnir = config.RUNTIME.client!;
// Clear any state associated with the account. // Clear any state associated with the account.
await mjolnir.setAccountData('org.matrix.mjolnir.watched_lists', { await this.mjolnir.client.setAccountData('org.matrix.mjolnir.watched_lists', {
references: [], references: [],
}); });
} }
}) })
this.beforeAll(async function() { this.beforeAll(async function() {
if (!this.config.web.ruleServer.enabled) { let config = configRead();
if (!config?.web?.ruleServer?.enabled) {
LogService.warn("policyConsumptionTest", "Skipping policy consumption test because the ruleServer is not enabled") LogService.warn("policyConsumptionTest", "Skipping policy consumption test because the ruleServer is not enabled")
this.skip(); this.skip();
} }
}) })
this.beforeEach(async function () {
this.timeout(1000);
const mjolnir = this.config.RUNTIME.client!;
})
it('blocks users in antispam when they are banned from sending messages and invites serverwide.', async function() { it('blocks users in antispam when they are banned from sending messages and invites serverwide.', async function() {
this.timeout(20000); this.timeout(20000);
// Create a few users and a room. // Create a few users and a room.
let badUser = await newTestUser(this.config.homeserverUrl, { name: { contains: "spammer" }}); let badUser = await newTestUser(this.config.homeserverUrl, { name: { contains: "spammer" }});
let badUserId = await badUser.getUserId(); let badUserId = await badUser.getUserId();
const mjolnir = config.RUNTIME.client! let mjolnirUserId = await this.mjolnir.client.getUserId();
let mjolnirUserId = await mjolnir.getUserId();
let moderator = await newTestUser(this.config.homeserverUrl, { name: { contains: "moderator" }}); let moderator = await newTestUser(this.config.homeserverUrl, { name: { contains: "moderator" }});
this.moderator = moderator; this.moderator = moderator;
await moderator.joinRoom(this.mjolnir.managementRoomId); await moderator.joinRoom(this.mjolnir.managementRoomId);
@ -82,11 +78,11 @@ describe("Test: that policy lists are consumed by the associated synapse module"
// We do this so the moderator can send invites, no other reason. // We do this so the moderator can send invites, no other reason.
await badUser.setUserPowerLevel(await moderator.getUserId(), unprotectedRoom, 100); await badUser.setUserPowerLevel(await moderator.getUserId(), unprotectedRoom, 100);
await moderator.joinRoom(unprotectedRoom); await moderator.joinRoom(unprotectedRoom);
const banList = await createBanList(this.mjolnir.managementRoomId, mjolnir, moderator); const banList = await createBanList(this.mjolnir.managementRoomId, this.mjolnir.client, moderator);
await badUser.sendMessage(unprotectedRoom, {msgtype: 'm.text', body: 'Something bad and mean'}); await badUser.sendMessage(unprotectedRoom, {msgtype: 'm.text', body: 'Something bad and mean'});
await waitForRuleChange(this.config.web.address, this.mjolnir.config.web.port, async () => { await waitForRuleChange(this.mjolnir, async () => {
await getFirstReaction(mjolnir, this.mjolnir.managementRoomId, '✅', async () => { await getFirstReaction(this.mjolnir.client, this.mjolnir.managementRoomId, '✅', async () => {
return await moderator.sendMessage(this.mjolnir.managementRoomId, { msgtype: 'm.text', body: `!mjolnir ban ${banList} ${badUserId}` }); return await moderator.sendMessage(this.mjolnir.managementRoomId, { msgtype: 'm.text', body: `!mjolnir ban ${banList} ${badUserId}` });
}); });
}); });
@ -96,8 +92,8 @@ describe("Test: that policy lists are consumed by the associated synapse module"
assert.ok(await moderator.sendMessage(unprotectedRoom, { msgtype: 'm.text', body: 'test'}), 'They should be able to send messages still too.'); assert.ok(await moderator.sendMessage(unprotectedRoom, { msgtype: 'm.text', body: 'test'}), 'They should be able to send messages still too.');
// Test we can remove the rules. // Test we can remove the rules.
await waitForRuleChange(this.config.web.address, this.mjolnir.config.web.port, async () => { await waitForRuleChange(this.mjolnir, async () => {
await getFirstReaction(mjolnir, this.mjolnir.managementRoomId, '✅', async () => { await getFirstReaction(this.mjolnir.client, this.mjolnir.managementRoomId, '✅', async () => {
return await moderator.sendMessage(this.mjolnir.managementRoomId, { msgtype: 'm.text', body: `!mjolnir unban ${banList} ${badUserId}` }); return await moderator.sendMessage(this.mjolnir.managementRoomId, { msgtype: 'm.text', body: `!mjolnir unban ${banList} ${badUserId}` });
}); });
}); });
@ -107,15 +103,14 @@ describe("Test: that policy lists are consumed by the associated synapse module"
it('Test: Cannot send message to a room that is listed in a policy list and cannot invite a user to the room either', async function () { it('Test: Cannot send message to a room that is listed in a policy list and cannot invite a user to the room either', async function () {
this.timeout(20000); this.timeout(20000);
let badUser = await newTestUser(this.config.homeserverUrl, { name: { contains: "spammer" }}); let badUser = await newTestUser(this.config.homeserverUrl, { name: { contains: "spammer" }});
const mjolnir = config.RUNTIME.client!
let moderator = await newTestUser(this.config.homeserverUrl, { name: { contains: "moderator" }}); let moderator = await newTestUser(this.config.homeserverUrl, { name: { contains: "moderator" }});
await moderator.joinRoom(this.mjolnir.managementRoomId); await moderator.joinRoom(this.mjolnir.managementRoomId);
const banList = await createBanList(this.mjolnir.managementRoomId, mjolnir, moderator); const banList = await createBanList(this.mjolnir.managementRoomId, this.mjolnir.client, moderator);
let badRoom = await badUser.createRoom(); let badRoom = await badUser.createRoom();
let unrelatedRoom = await badUser.createRoom(); let unrelatedRoom = await badUser.createRoom();
await badUser.sendMessage(badRoom, {msgtype: 'm.text', body: "Very Bad Stuff in this room"}); await badUser.sendMessage(badRoom, {msgtype: 'm.text', body: "Very Bad Stuff in this room"});
await waitForRuleChange(this.config.web.address, this.mjolnir.config.web.port, async () => { await waitForRuleChange(this.mjolnir, async () => {
await getFirstReaction(mjolnir, this.mjolnir.managementRoomId, '✅', async () => { await getFirstReaction(this.mjolnir.client, this.mjolnir.managementRoomId, '✅', async () => {
return await moderator.sendMessage(this.mjolnir.managementRoomId, { msgtype: 'm.text', body: `!mjolnir ban ${banList} ${badRoom}` }); return await moderator.sendMessage(this.mjolnir.managementRoomId, { msgtype: 'm.text', body: `!mjolnir ban ${banList} ${badRoom}` });
}); });
}); });
@ -124,8 +119,8 @@ describe("Test: that policy lists are consumed by the associated synapse module"
assert.ok(await badUser.sendMessage(unrelatedRoom, { msgtype: 'm.text.', body: 'hey'}), 'should be able to send messages to unrelated room'); assert.ok(await badUser.sendMessage(unrelatedRoom, { msgtype: 'm.text.', body: 'hey'}), 'should be able to send messages to unrelated room');
assert.ok(await badUser.inviteUser(await moderator.getUserId(), unrelatedRoom), 'They should still be able to invite to other rooms though'); assert.ok(await badUser.inviteUser(await moderator.getUserId(), unrelatedRoom), 'They should still be able to invite to other rooms though');
// Test we can remove these rules. // Test we can remove these rules.
await waitForRuleChange(this.config.web.address, this.mjolnir.config.web.port, async () => { await waitForRuleChange(this.mjolnir, async () => {
await getFirstReaction(mjolnir, this.mjolnir.managementRoomId, '✅', async () => { await getFirstReaction(this.mjolnir.client, this.mjolnir.managementRoomId, '✅', async () => {
return await moderator.sendMessage(this.mjolnir.managementRoomId, { msgtype: 'm.text', body: `!mjolnir unban ${banList} ${badRoom}` }); return await moderator.sendMessage(this.mjolnir.managementRoomId, { msgtype: 'm.text', body: `!mjolnir unban ${banList} ${badRoom}` });
}); });
}); });
@ -135,21 +130,20 @@ describe("Test: that policy lists are consumed by the associated synapse module"
}) })
it('Test: When a list becomes unwatched, the associated policies are stopped.', async function () { it('Test: When a list becomes unwatched, the associated policies are stopped.', async function () {
this.timeout(20000); this.timeout(20000);
const mjolnir = config.RUNTIME.client!
let moderator = await newTestUser(this.config.homeserverUrl, { name: { contains: "moderator" }}); let moderator = await newTestUser(this.config.homeserverUrl, { name: { contains: "moderator" }});
await moderator.joinRoom(this.mjolnir.managementRoomId); await moderator.joinRoom(this.mjolnir.managementRoomId);
const banList = await createBanList(this.mjolnir.managementRoomId, mjolnir, moderator); const banList = await createBanList(this.mjolnir.managementRoomId, this.mjolnir.client, moderator);
let targetRoom = await moderator.createRoom(); let targetRoom = await moderator.createRoom();
await moderator.sendMessage(targetRoom, {msgtype: 'm.text', body: "Fluffy Foxes."}); await moderator.sendMessage(targetRoom, {msgtype: 'm.text', body: "Fluffy Foxes."});
await waitForRuleChange(this.config.web.address, this.mjolnir.config.web.port, async () => { await waitForRuleChange(this.mjolnir, async () => {
await getFirstReaction(mjolnir, this.mjolnir.managementRoomId, '✅', async () => { await getFirstReaction(this.mjolnir.client, this.mjolnir.managementRoomId, '✅', async () => {
return await moderator.sendMessage(this.mjolnir.managementRoomId, { msgtype: 'm.text', body: `!mjolnir ban ${banList} ${targetRoom}` }); return await moderator.sendMessage(this.mjolnir.managementRoomId, { msgtype: 'm.text', body: `!mjolnir ban ${banList} ${targetRoom}` });
}); });
}); });
await assert.rejects(moderator.sendMessage(targetRoom, { msgtype: 'm.text', body: 'test'}), 'should not be able to send messages to a room which is listed.'); await assert.rejects(moderator.sendMessage(targetRoom, { msgtype: 'm.text', body: 'test'}), 'should not be able to send messages to a room which is listed.');
await waitForRuleChange(this.config.web.address, this.mjolnir.config.web.port, async () => { await waitForRuleChange(this.mjolnir, async () => {
await getFirstReaction(mjolnir, this.mjolnir.managementRoomId, '✅', async () => { await getFirstReaction(this.mjolnir.client, this.mjolnir.managementRoomId, '✅', async () => {
return await moderator.sendMessage(this.mjolnir.managementRoomId, { msgtype: 'm.text', body: `!mjolnir unwatch #${banList}:localhost:9999` }); return await moderator.sendMessage(this.mjolnir.managementRoomId, { msgtype: 'm.text', body: `!mjolnir unwatch #${banList}:localhost:9999` });
}); });
}); });