mirror of
https://github.com/matrix-org/mjolnir.git
synced 2024-10-01 01:36:06 -04:00
Unbitrotting ruleserver tests (#418)
This commit is contained in:
parent
fb52e3dcb2
commit
81cd91c250
@ -2,8 +2,8 @@ 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 } from "matrix-bot-sdk";
|
||||||
import { createBanList, getFirstReaction } from "./commands/commandUtils";
|
import { createBanList, getFirstReaction } from "./commands/commandUtils";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -11,9 +11,9 @@ import { createBanList, getFirstReaction } from "./commands/commandUtils";
|
|||||||
*/
|
*/
|
||||||
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) => getRequestFn()({
|
||||||
uri: `http://${mjolnir.config.web.address}:${mjolnir.config.web.port}/api/1/ruleserver/updates/`,
|
uri: `http://${mjolnir.config.web.address}:${mjolnir.config.web.port}/api/1/ruleserver/updates/`,
|
||||||
method: "GET"
|
method: "GET"
|
||||||
}, (error, response, body) => {
|
}, (error: object, _response: any, body: string) => {
|
||||||
if (error) {
|
if (error) {
|
||||||
reject(error)
|
reject(error)
|
||||||
} else {
|
} else {
|
||||||
@ -26,7 +26,7 @@ async function currentRules(mjolnir: Mjolnir): Promise<{ start: object, stop: ob
|
|||||||
* Wait for the rules to change as a result of the thunk. The returned promise will resolve when the rules being served have changed.
|
* Wait for the rules to change as a result of the thunk. The returned promise will resolve when the rules being served have changed.
|
||||||
* @param thunk Should cause the rules the RuleServer is serving to change some way.
|
* @param thunk Should cause the rules the RuleServer is serving to change some way.
|
||||||
*/
|
*/
|
||||||
async function waitForRuleChange(mjolnir: Mjolnir, thunk): Promise<void> {
|
async function waitForRuleChange(mjolnir: Mjolnir, thunk: any): Promise<void> {
|
||||||
const initialRules = await currentRules(mjolnir);
|
const initialRules = await currentRules(mjolnir);
|
||||||
let rules = initialRules;
|
let rules = initialRules;
|
||||||
// We use JSON.stringify like this so that it is pretty printed in the log and human readable.
|
// We use JSON.stringify like this so that it is pretty printed in the log and human readable.
|
||||||
@ -48,33 +48,28 @@ async function waitForRuleChange(mjolnir: Mjolnir, thunk): Promise<void> {
|
|||||||
|
|
||||||
describe("Test: that policy lists are consumed by the associated synapse module", function () {
|
describe("Test: that policy lists are consumed by the associated synapse module", function () {
|
||||||
this.afterEach(async function () {
|
this.afterEach(async function () {
|
||||||
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 +77,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 +91,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 +102,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 +118,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 +129,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` });
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
"./test/integration/manualLaunchScript.ts",
|
"./test/integration/manualLaunchScript.ts",
|
||||||
"./test/integration/roomMembersTest.ts",
|
"./test/integration/roomMembersTest.ts",
|
||||||
"./test/integration/banListTest.ts",
|
"./test/integration/banListTest.ts",
|
||||||
"./test/integration/reportPollingTest"
|
"./test/integration/reportPollingTest",
|
||||||
|
"./test/integration/policyConsumptionTest.ts",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user