UNPKG

matrix-react-sdk

Version:
102 lines (96 loc) 15.1 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.USER_RULE_TYPES = exports.SERVER_RULE_TYPES = exports.RULE_USER = exports.RULE_SERVER = exports.RULE_ROOM = exports.ROOM_RULE_TYPES = exports.BanList = exports.ALL_RULE_TYPES = void 0; exports.ruleTypeToStable = ruleTypeToStable; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _matrix = require("matrix-js-sdk/src/matrix"); var _ListRule = require("./ListRule"); var _MatrixClientPeg = require("../MatrixClientPeg"); /* Copyright 2024 New Vector Ltd. Copyright 2019 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ // Inspiration largely taken from Mjolnir itself const RULE_USER = exports.RULE_USER = _matrix.EventType.PolicyRuleUser; const RULE_ROOM = exports.RULE_ROOM = _matrix.EventType.PolicyRuleRoom; const RULE_SERVER = exports.RULE_SERVER = _matrix.EventType.PolicyRuleServer; // m.room.* events are legacy from when MSC2313 changed to m.policy.* last minute. const USER_RULE_TYPES = exports.USER_RULE_TYPES = [RULE_USER, "m.room.rule.user", "org.matrix.mjolnir.rule.user"]; const ROOM_RULE_TYPES = exports.ROOM_RULE_TYPES = [RULE_ROOM, "m.room.rule.room", "org.matrix.mjolnir.rule.room"]; const SERVER_RULE_TYPES = exports.SERVER_RULE_TYPES = [RULE_SERVER, "m.room.rule.server", "org.matrix.mjolnir.rule.server"]; const ALL_RULE_TYPES = exports.ALL_RULE_TYPES = [...USER_RULE_TYPES, ...ROOM_RULE_TYPES, ...SERVER_RULE_TYPES]; function ruleTypeToStable(rule) { if (USER_RULE_TYPES.includes(rule)) { return RULE_USER; } if (ROOM_RULE_TYPES.includes(rule)) { return RULE_ROOM; } if (SERVER_RULE_TYPES.includes(rule)) { return RULE_SERVER; } return null; } class BanList { constructor(roomId) { (0, _defineProperty2.default)(this, "_rules", []); (0, _defineProperty2.default)(this, "_roomId", void 0); this._roomId = roomId; this.updateList(); } get roomId() { return this._roomId; } get serverRules() { return this._rules.filter(r => r.kind === RULE_SERVER); } get userRules() { return this._rules.filter(r => r.kind === RULE_USER); } async banEntity(kind, entity, reason) { const type = ruleTypeToStable(kind); if (!type) return; // unknown rule type await _MatrixClientPeg.MatrixClientPeg.safeGet().sendStateEvent(this._roomId, type, { entity: entity, reason: reason, recommendation: (0, _ListRule.recommendationToStable)(_ListRule.RECOMMENDATION_BAN, true) }, "rule:" + entity); this._rules.push(new _ListRule.ListRule(entity, _ListRule.RECOMMENDATION_BAN, reason, type)); } async unbanEntity(kind, entity) { const type = ruleTypeToStable(kind); if (!type) return; // unknown rule type // Empty state event is effectively deleting it. await _MatrixClientPeg.MatrixClientPeg.safeGet().sendStateEvent(this._roomId, type, {}, "rule:" + entity); this._rules = this._rules.filter(r => { if (r.kind !== ruleTypeToStable(kind)) return true; if (r.entity !== entity) return true; return false; // we just deleted this rule }); } updateList() { this._rules = []; const room = _MatrixClientPeg.MatrixClientPeg.safeGet().getRoom(this._roomId); if (!room) return; for (const eventType of ALL_RULE_TYPES) { const events = room.currentState.getStateEvents(eventType); for (const ev of events) { if (!ev.getStateKey()) continue; const kind = ruleTypeToStable(eventType); if (!kind) continue; // unknown type const entity = ev.getContent()["entity"]; const recommendation = ev.getContent()["recommendation"]; const reason = ev.getContent()["reason"]; if (!entity || !recommendation || !reason) continue; this._rules.push(new _ListRule.ListRule(entity, recommendation, reason, kind)); } } } } exports.BanList = BanList; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0cml4IiwicmVxdWlyZSIsIl9MaXN0UnVsZSIsIl9NYXRyaXhDbGllbnRQZWciLCJSVUxFX1VTRVIiLCJleHBvcnRzIiwiRXZlbnRUeXBlIiwiUG9saWN5UnVsZVVzZXIiLCJSVUxFX1JPT00iLCJQb2xpY3lSdWxlUm9vbSIsIlJVTEVfU0VSVkVSIiwiUG9saWN5UnVsZVNlcnZlciIsIlVTRVJfUlVMRV9UWVBFUyIsIlJPT01fUlVMRV9UWVBFUyIsIlNFUlZFUl9SVUxFX1RZUEVTIiwiQUxMX1JVTEVfVFlQRVMiLCJydWxlVHlwZVRvU3RhYmxlIiwicnVsZSIsImluY2x1ZGVzIiwiQmFuTGlzdCIsImNvbnN0cnVjdG9yIiwicm9vbUlkIiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJfcm9vbUlkIiwidXBkYXRlTGlzdCIsInNlcnZlclJ1bGVzIiwiX3J1bGVzIiwiZmlsdGVyIiwiciIsImtpbmQiLCJ1c2VyUnVsZXMiLCJiYW5FbnRpdHkiLCJlbnRpdHkiLCJyZWFzb24iLCJ0eXBlIiwiTWF0cml4Q2xpZW50UGVnIiwic2FmZUdldCIsInNlbmRTdGF0ZUV2ZW50IiwicmVjb21tZW5kYXRpb24iLCJyZWNvbW1lbmRhdGlvblRvU3RhYmxlIiwiUkVDT01NRU5EQVRJT05fQkFOIiwicHVzaCIsIkxpc3RSdWxlIiwidW5iYW5FbnRpdHkiLCJyb29tIiwiZ2V0Um9vbSIsImV2ZW50VHlwZSIsImV2ZW50cyIsImN1cnJlbnRTdGF0ZSIsImdldFN0YXRlRXZlbnRzIiwiZXYiLCJnZXRTdGF0ZUtleSIsImdldENvbnRlbnQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWpvbG5pci9CYW5MaXN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDE5IFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbi8vIEluc3BpcmF0aW9uIGxhcmdlbHkgdGFrZW4gZnJvbSBNam9sbmlyIGl0c2VsZlxuXG5pbXBvcnQgeyBFdmVudFR5cGUgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5cbmltcG9ydCB7IExpc3RSdWxlLCBSRUNPTU1FTkRBVElPTl9CQU4sIHJlY29tbWVuZGF0aW9uVG9TdGFibGUgfSBmcm9tIFwiLi9MaXN0UnVsZVwiO1xuaW1wb3J0IHsgTWF0cml4Q2xpZW50UGVnIH0gZnJvbSBcIi4uL01hdHJpeENsaWVudFBlZ1wiO1xuXG5leHBvcnQgY29uc3QgUlVMRV9VU0VSID0gRXZlbnRUeXBlLlBvbGljeVJ1bGVVc2VyO1xuZXhwb3J0IGNvbnN0IFJVTEVfUk9PTSA9IEV2ZW50VHlwZS5Qb2xpY3lSdWxlUm9vbTtcbmV4cG9ydCBjb25zdCBSVUxFX1NFUlZFUiA9IEV2ZW50VHlwZS5Qb2xpY3lSdWxlU2VydmVyO1xuXG4vLyBtLnJvb20uKiBldmVudHMgYXJlIGxlZ2FjeSBmcm9tIHdoZW4gTVNDMjMxMyBjaGFuZ2VkIHRvIG0ucG9saWN5LiogbGFzdCBtaW51dGUuXG5leHBvcnQgY29uc3QgVVNFUl9SVUxFX1RZUEVTID0gW1JVTEVfVVNFUiwgXCJtLnJvb20ucnVsZS51c2VyXCIsIFwib3JnLm1hdHJpeC5tam9sbmlyLnJ1bGUudXNlclwiXTtcbmV4cG9ydCBjb25zdCBST09NX1JVTEVfVFlQRVMgPSBbUlVMRV9ST09NLCBcIm0ucm9vbS5ydWxlLnJvb21cIiwgXCJvcmcubWF0cml4Lm1qb2xuaXIucnVsZS5yb29tXCJdO1xuZXhwb3J0IGNvbnN0IFNFUlZFUl9SVUxFX1RZUEVTID0gW1JVTEVfU0VSVkVSLCBcIm0ucm9vbS5ydWxlLnNlcnZlclwiLCBcIm9yZy5tYXRyaXgubWpvbG5pci5ydWxlLnNlcnZlclwiXTtcbmV4cG9ydCBjb25zdCBBTExfUlVMRV9UWVBFUyA9IFsuLi5VU0VSX1JVTEVfVFlQRVMsIC4uLlJPT01fUlVMRV9UWVBFUywgLi4uU0VSVkVSX1JVTEVfVFlQRVNdO1xuXG5leHBvcnQgZnVuY3Rpb24gcnVsZVR5cGVUb1N0YWJsZShcbiAgICBydWxlOiBzdHJpbmcsXG4pOiBFdmVudFR5cGUuUG9saWN5UnVsZVVzZXIgfCBFdmVudFR5cGUuUG9saWN5UnVsZVJvb20gfCBFdmVudFR5cGUuUG9saWN5UnVsZVNlcnZlciB8IG51bGwge1xuICAgIGlmIChVU0VSX1JVTEVfVFlQRVMuaW5jbHVkZXMocnVsZSkpIHtcbiAgICAgICAgcmV0dXJuIFJVTEVfVVNFUjtcbiAgICB9XG4gICAgaWYgKFJPT01fUlVMRV9UWVBFUy5pbmNsdWRlcyhydWxlKSkge1xuICAgICAgICByZXR1cm4gUlVMRV9ST09NO1xuICAgIH1cbiAgICBpZiAoU0VSVkVSX1JVTEVfVFlQRVMuaW5jbHVkZXMocnVsZSkpIHtcbiAgICAgICAgcmV0dXJuIFJVTEVfU0VSVkVSO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIEJhbkxpc3Qge1xuICAgIHByaXZhdGUgX3J1bGVzOiBMaXN0UnVsZVtdID0gW107XG4gICAgcHJpdmF0ZSBfcm9vbUlkOiBzdHJpbmc7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3Iocm9vbUlkOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fcm9vbUlkID0gcm9vbUlkO1xuICAgICAgICB0aGlzLnVwZGF0ZUxpc3QoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvb21JZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm9vbUlkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2VydmVyUnVsZXMoKTogTGlzdFJ1bGVbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ydWxlcy5maWx0ZXIoKHIpID0+IHIua2luZCA9PT0gUlVMRV9TRVJWRVIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdXNlclJ1bGVzKCk6IExpc3RSdWxlW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVsZXMuZmlsdGVyKChyKSA9PiByLmtpbmQgPT09IFJVTEVfVVNFUik7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGJhbkVudGl0eShraW5kOiBzdHJpbmcsIGVudGl0eTogc3RyaW5nLCByZWFzb246IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBydWxlVHlwZVRvU3RhYmxlKGtpbmQpO1xuICAgICAgICBpZiAoIXR5cGUpIHJldHVybjsgLy8gdW5rbm93biBydWxlIHR5cGVcbiAgICAgICAgYXdhaXQgTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKS5zZW5kU3RhdGVFdmVudChcbiAgICAgICAgICAgIHRoaXMuX3Jvb21JZCxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZW50aXR5OiBlbnRpdHksXG4gICAgICAgICAgICAgICAgcmVhc29uOiByZWFzb24sXG4gICAgICAgICAgICAgICAgcmVjb21tZW5kYXRpb246IHJlY29tbWVuZGF0aW9uVG9TdGFibGUoUkVDT01NRU5EQVRJT05fQkFOLCB0cnVlKSEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJydWxlOlwiICsgZW50aXR5LFxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9ydWxlcy5wdXNoKG5ldyBMaXN0UnVsZShlbnRpdHksIFJFQ09NTUVOREFUSU9OX0JBTiwgcmVhc29uLCB0eXBlKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHVuYmFuRW50aXR5KGtpbmQ6IHN0cmluZywgZW50aXR5OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCB0eXBlID0gcnVsZVR5cGVUb1N0YWJsZShraW5kKTtcbiAgICAgICAgaWYgKCF0eXBlKSByZXR1cm47IC8vIHVua25vd24gcnVsZSB0eXBlXG4gICAgICAgIC8vIEVtcHR5IHN0YXRlIGV2ZW50IGlzIGVmZmVjdGl2ZWx5IGRlbGV0aW5nIGl0LlxuICAgICAgICBhd2FpdCBNYXRyaXhDbGllbnRQZWcuc2FmZUdldCgpLnNlbmRTdGF0ZUV2ZW50KHRoaXMuX3Jvb21JZCwgdHlwZSwge30sIFwicnVsZTpcIiArIGVudGl0eSk7XG4gICAgICAgIHRoaXMuX3J1bGVzID0gdGhpcy5fcnVsZXMuZmlsdGVyKChyKSA9PiB7XG4gICAgICAgICAgICBpZiAoci5raW5kICE9PSBydWxlVHlwZVRvU3RhYmxlKGtpbmQpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChyLmVudGl0eSAhPT0gZW50aXR5KSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gd2UganVzdCBkZWxldGVkIHRoaXMgcnVsZVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlTGlzdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcnVsZXMgPSBbXTtcblxuICAgICAgICBjb25zdCByb29tID0gTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKS5nZXRSb29tKHRoaXMuX3Jvb21JZCk7XG4gICAgICAgIGlmICghcm9vbSkgcmV0dXJuO1xuXG4gICAgICAgIGZvciAoY29uc3QgZXZlbnRUeXBlIG9mIEFMTF9SVUxFX1RZUEVTKSB7XG4gICAgICAgICAgICBjb25zdCBldmVudHMgPSByb29tLmN1cnJlbnRTdGF0ZS5nZXRTdGF0ZUV2ZW50cyhldmVudFR5cGUpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBldiBvZiBldmVudHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWV2LmdldFN0YXRlS2V5KCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qga2luZCA9IHJ1bGVUeXBlVG9TdGFibGUoZXZlbnRUeXBlKTtcbiAgICAgICAgICAgICAgICBpZiAoIWtpbmQpIGNvbnRpbnVlOyAvLyB1bmtub3duIHR5cGVcblxuICAgICAgICAgICAgICAgIGNvbnN0IGVudGl0eSA9IGV2LmdldENvbnRlbnQoKVtcImVudGl0eVwiXTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWNvbW1lbmRhdGlvbiA9IGV2LmdldENvbnRlbnQoKVtcInJlY29tbWVuZGF0aW9uXCJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYXNvbiA9IGV2LmdldENvbnRlbnQoKVtcInJlYXNvblwiXTtcbiAgICAgICAgICAgICAgICBpZiAoIWVudGl0eSB8fCAhcmVjb21tZW5kYXRpb24gfHwgIXJlYXNvbikgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9ydWxlcy5wdXNoKG5ldyBMaXN0UnVsZShlbnRpdHksIHJlY29tbWVuZGF0aW9uLCByZWFzb24sIGtpbmQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBVUEsSUFBQUEsT0FBQSxHQUFBQyxPQUFBO0FBRUEsSUFBQUMsU0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsZ0JBQUEsR0FBQUYsT0FBQTtBQWJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQU9PLE1BQU1HLFNBQVMsR0FBQUMsT0FBQSxDQUFBRCxTQUFBLEdBQUdFLGlCQUFTLENBQUNDLGNBQWM7QUFDMUMsTUFBTUMsU0FBUyxHQUFBSCxPQUFBLENBQUFHLFNBQUEsR0FBR0YsaUJBQVMsQ0FBQ0csY0FBYztBQUMxQyxNQUFNQyxXQUFXLEdBQUFMLE9BQUEsQ0FBQUssV0FBQSxHQUFHSixpQkFBUyxDQUFDSyxnQkFBZ0I7O0FBRXJEO0FBQ08sTUFBTUMsZUFBZSxHQUFBUCxPQUFBLENBQUFPLGVBQUEsR0FBRyxDQUFDUixTQUFTLEVBQUUsa0JBQWtCLEVBQUUsOEJBQThCLENBQUM7QUFDdkYsTUFBTVMsZUFBZSxHQUFBUixPQUFBLENBQUFRLGVBQUEsR0FBRyxDQUFDTCxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsOEJBQThCLENB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