UNPKG

matrix-react-sdk

Version:
162 lines (133 loc) 15.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.ruleTypeToStable = ruleTypeToStable; exports.BanList = exports.ALL_RULE_TYPES = exports.SERVER_RULE_TYPES = exports.ROOM_RULE_TYPES = exports.USER_RULE_TYPES = exports.RULE_SERVER = exports.RULE_ROOM = exports.RULE_USER = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _ListRule = require("./ListRule"); var _MatrixClientPeg = require("../MatrixClientPeg"); /* Copyright 2019 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // Inspiration largely taken from Mjolnir itself const RULE_USER = "m.room.rule.user"; exports.RULE_USER = RULE_USER; const RULE_ROOM = "m.room.rule.room"; exports.RULE_ROOM = RULE_ROOM; const RULE_SERVER = "m.room.rule.server"; exports.RULE_SERVER = RULE_SERVER; const USER_RULE_TYPES = [RULE_USER, "org.matrix.mjolnir.rule.user"]; exports.USER_RULE_TYPES = USER_RULE_TYPES; const ROOM_RULE_TYPES = [RULE_ROOM, "org.matrix.mjolnir.rule.room"]; exports.ROOM_RULE_TYPES = ROOM_RULE_TYPES; const SERVER_RULE_TYPES = [RULE_SERVER, "org.matrix.mjolnir.rule.server"]; exports.SERVER_RULE_TYPES = SERVER_RULE_TYPES; const ALL_RULE_TYPES = [...USER_RULE_TYPES, ...ROOM_RULE_TYPES, ...SERVER_RULE_TYPES]; exports.ALL_RULE_TYPES = ALL_RULE_TYPES; function ruleTypeToStable(rule /*: string*/ , unstable = true) /*: string*/ { if (USER_RULE_TYPES.includes(rule)) { return unstable ? USER_RULE_TYPES[USER_RULE_TYPES.length - 1] : RULE_USER; } if (ROOM_RULE_TYPES.includes(rule)) { return unstable ? ROOM_RULE_TYPES[ROOM_RULE_TYPES.length - 1] : RULE_ROOM; } if (SERVER_RULE_TYPES.includes(rule)) { return unstable ? SERVER_RULE_TYPES[SERVER_RULE_TYPES.length - 1] : RULE_SERVER; } return null; } class BanList { constructor(roomId /*: string*/ ) { (0, _defineProperty2.default)(this, "_rules", []); (0, _defineProperty2.default)(this, "_roomId", void 0); this._roomId = roomId; this.updateList(); } get roomId() /*: string*/ { return this._roomId; } get serverRules() /*: ListRule[]*/ { return this._rules.filter(r => r.kind === RULE_SERVER); } get userRules() /*: ListRule[]*/ { return this._rules.filter(r => r.kind === RULE_USER); } get roomRules() /*: ListRule[]*/ { return this._rules.filter(r => r.kind === RULE_ROOM); } async banEntity(kind /*: string*/ , entity /*: string*/ , reason /*: string*/ ) /*: Promise<any>*/ { await _MatrixClientPeg.MatrixClientPeg.get().sendStateEvent(this._roomId, ruleTypeToStable(kind, true), { 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, ruleTypeToStable(kind, false))); } async unbanEntity(kind /*: string*/ , entity /*: string*/ ) /*: Promise<any>*/ { // Empty state event is effectively deleting it. await _MatrixClientPeg.MatrixClientPeg.get().sendStateEvent(this._roomId, ruleTypeToStable(kind, true), {}, "rule:" + entity); this._rules = this._rules.filter(r => { if (r.kind !== ruleTypeToStable(kind, false)) return true; if (r.entity !== entity) return true; return false; // we just deleted this rule }); } updateList() { this._rules = []; const room = _MatrixClientPeg.MatrixClientPeg.get().getRoom(this._roomId); if (!room) return; for (const eventType of ALL_RULE_TYPES) { const events = room.currentState.getStateEvents(eventType, undefined); for (const ev of events) { if (!ev.getStateKey()) continue; const kind = ruleTypeToStable(eventType, false); 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tam9sbmlyL0Jhbkxpc3QudHMiXSwibmFtZXMiOlsiUlVMRV9VU0VSIiwiUlVMRV9ST09NIiwiUlVMRV9TRVJWRVIiLCJVU0VSX1JVTEVfVFlQRVMiLCJST09NX1JVTEVfVFlQRVMiLCJTRVJWRVJfUlVMRV9UWVBFUyIsIkFMTF9SVUxFX1RZUEVTIiwicnVsZVR5cGVUb1N0YWJsZSIsInJ1bGUiLCJ1bnN0YWJsZSIsImluY2x1ZGVzIiwibGVuZ3RoIiwiQmFuTGlzdCIsImNvbnN0cnVjdG9yIiwicm9vbUlkIiwiX3Jvb21JZCIsInVwZGF0ZUxpc3QiLCJzZXJ2ZXJSdWxlcyIsIl9ydWxlcyIsImZpbHRlciIsInIiLCJraW5kIiwidXNlclJ1bGVzIiwicm9vbVJ1bGVzIiwiYmFuRW50aXR5IiwiZW50aXR5IiwicmVhc29uIiwiTWF0cml4Q2xpZW50UGVnIiwiZ2V0Iiwic2VuZFN0YXRlRXZlbnQiLCJyZWNvbW1lbmRhdGlvbiIsIlJFQ09NTUVOREFUSU9OX0JBTiIsInB1c2giLCJMaXN0UnVsZSIsInVuYmFuRW50aXR5Iiwicm9vbSIsImdldFJvb20iLCJldmVudFR5cGUiLCJldmVudHMiLCJjdXJyZW50U3RhdGUiLCJnZXRTdGF0ZUV2ZW50cyIsInVuZGVmaW5lZCIsImV2IiwiZ2V0U3RhdGVLZXkiLCJnZXRDb250ZW50Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFrQkE7O0FBQ0E7O0FBbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBS08sTUFBTUEsU0FBUyxHQUFHLGtCQUFsQjs7QUFDQSxNQUFNQyxTQUFTLEdBQUcsa0JBQWxCOztBQUNBLE1BQU1DLFdBQVcsR0FBRyxvQkFBcEI7O0FBRUEsTUFBTUMsZUFBZSxHQUFHLENBQUNILFNBQUQsRUFBWSw4QkFBWixDQUF4Qjs7QUFDQSxNQUFNSSxlQUFlLEdBQUcsQ0FBQ0gsU0FBRCxF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QUgsR0FBZ0IsUUFBaEIsQ0FBZjtBQUNBLFlBQUksQ0FBQ25CLE1BQUQsSUFBVyxDQUFDSyxjQUFaLElBQThCLENBQUNKLE1BQW5DLEVBQTJDOztBQUUzQyxhQUFLUixNQUFMLENBQVljLElBQVosQ0FBaUIsSUFBSUMsa0JBQUosQ0FBYVIsTUFBYixFQUFxQkssY0FBckIsRUFBcUNKLE1BQXJDLEVBQTZDTCxJQUE3QyxDQUFqQjtBQUNIO0FBQ0o7QUFDSjs7QUFqRWdCIiwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDE5IFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuLy8gSW5zcGlyYXRpb24gbGFyZ2VseSB0YWtlbiBmcm9tIE1qb2xuaXIgaXRzZWxmXG5cbmltcG9ydCB7TGlzdFJ1bGUsIFJFQ09NTUVOREFUSU9OX0JBTiwgcmVjb21tZW5kYXRpb25Ub1N0YWJsZX0gZnJvbSBcIi4vTGlzdFJ1bGVcIjtcbmltcG9ydCB7TWF0cml4Q2xpZW50UGVnfSBmcm9tIFwiLi4vTWF0cml4Q2xpZW50UGVnXCI7XG5cbmV4cG9ydCBjb25zdCBSVUxFX1VTRVIgPSBcIm0ucm9vbS5ydWxlLnVzZXJcIjtcbmV4cG9ydCBjb25zdCBSVUxFX1JPT00gPSBcIm0ucm9vbS5ydWxlLnJvb21cIjtcbmV4cG9ydCBjb25zdCBSVUxFX1NFUlZFUiA9IFwibS5yb29tLnJ1bGUuc2VydmVyXCI7XG5cbmV4cG9ydCBjb25zdCBVU0VSX1JVTEVfVFlQRVMgPSBbUlVMRV9VU0VSLCBcIm9yZy5tYXRyaXgubWpvbG5pci5ydWxlLnVzZXJcIl07XG5leHBvcnQgY29uc3QgUk9PTV9SVUxFX1RZUEVTID0gW1JVTEVfUk9PTSwgXCJvcmcubWF0cml4Lm1qb2xuaXIucnVsZS5yb29tXCJdO1xuZXhwb3J0IGNvbnN0IFNFUlZFUl9SVUxFX1RZUEVTID0gW1JVTEVfU0VSVkVSLCBcIm9yZy5tYXRyaXgubWpvbG5pci5ydWxlLnNlcnZlclwiXTtcbmV4cG9ydCBjb25zdCBBTExfUlVMRV9UWVBFUyA9IFsuLi5VU0VSX1JVTEVfVFlQRVMsIC4uLlJPT01fUlVMRV9UWVBFUywgLi4uU0VSVkVSX1JVTEVfVFlQRVNdO1xuXG5leHBvcnQgZnVuY3Rpb24gcnVsZVR5cGVUb1N0YWJsZShydWxlOiBzdHJpbmcsIHVuc3RhYmxlID0gdHJ1ZSk6IHN0cmluZyB7XG4gICAgaWYgKFVTRVJfUlVMRV9UWVBFUy5pbmNsdWRlcyhydWxlKSkge1xuICAgICAgICByZXR1cm4gdW5zdGFibGUgPyBVU0VSX1JVTEVfVFlQRVNbVVNFUl9SVUxFX1RZUEVTLmxlbmd0aCAtIDFdIDogUlVMRV9VU0VSO1xuICAgIH1cbiAgICBpZiAoUk9PTV9SVUxFX1RZUEVTLmluY2x1ZGVzKHJ1bGUpKSB7XG4gICAgICAgIHJldHVybiB1bnN0YWJsZSA/IFJPT01fUlVMRV9UWVBFU1tST09NX1JVTEVfVFlQRVMubGVuZ3RoIC0gMV0gOiBSVUxFX1JPT007XG4gICAgfVxuICAgIGlmIChTRVJWRVJfUlVMRV9UWVBFUy5pbmNsdWRlcyhydWxlKSkge1xuICAgICAgICByZXR1cm4gdW5zdGFibGUgPyBTRVJWRVJfUlVMRV9UWVBFU1tTRVJWRVJfUlVMRV9UWVBFUy5sZW5ndGggLSAxXSA6IFJVTEVfU0VSVkVSO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIEJhbkxpc3Qge1xuICAgIF9ydWxlczogTGlzdFJ1bGVbXSA9IFtdO1xuICAgIF9yb29tSWQ6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHJvb21JZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3Jvb21JZCA9IHJvb21JZDtcbiAgICAgICAgdGhpcy51cGRhdGVMaXN0KCk7XG4gICAgfVxuXG4gICAgZ2V0IHJvb21JZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm9vbUlkO1xuICAgIH1cblxuICAgIGdldCBzZXJ2ZXJSdWxlcygpOiBMaXN0UnVsZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bGVzLmZpbHRlcihyID0+IHIua2luZCA9PT0gUlVMRV9TRVJWRVIpO1xuICAgIH1cblxuICAgIGdldCB1c2VyUnVsZXMoKTogTGlzdFJ1bGVbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ydWxlcy5maWx0ZXIociA9PiByLmtpbmQgPT09IFJVTEVfVVNFUik7XG4gICAgfVxuXG4gICAgZ2V0IHJvb21SdWxlcygpOiBMaXN0UnVsZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bGVzLmZpbHRlcihyID0+IHIua2luZCA9PT0gUlVMRV9ST09NKTtcbiAgICB9XG5cbiAgICBhc3luYyBiYW5FbnRpdHkoa2luZDogc3RyaW5nLCBlbnRpdHk6IHN0cmluZywgcmVhc29uOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBhd2FpdCBNYXRyaXhDbGllbnRQZWcuZ2V0KCkuc2VuZFN0YXRlRXZlbnQodGhpcy5fcm9vbUlkLCBydWxlVHlwZVRvU3RhYmxlKGtpbmQsIHRydWUpLCB7XG4gICAgICAgICAgICBlbnRpdHk6IGVudGl0eSxcbiAgICAgICAgICAgIHJlYXNvbjogcmVhc29uLFxuICAgICAgICAgICAgcmVjb21tZW5kYXRpb246IHJlY29tbWVuZGF0aW9uVG9TdGFibGUoUkVDT01NRU5EQVRJT05fQkFOLCB0cnVlKSxcbiAgICAgICAgfSwgXCJydWxlOlwiICsgZW50aXR5KTtcbiAgICAgICAgdGhpcy5fcnVsZXMucHVzaChuZXcgTGlzdFJ1bGUoZW50aXR5LCBSRUNPTU1FTkRBVElPTl9CQU4sIHJlYXNvbiwgcnVsZVR5cGVUb1N0YWJsZShraW5kLCBmYWxzZSkpKTtcbiAgICB9XG5cbiAgICBhc3luYyB1bmJhbkVudGl0eShraW5kOiBzdHJpbmcsIGVudGl0eTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgLy8gRW1wdHkgc3RhdGUgZXZlbnQgaXMgZWZmZWN0aXZlbHkgZGVsZXRpbmcgaXQuXG4gICAgICAgIGF3YWl0IE1hdHJpeENsaWVudFBlZy5nZXQoKS5zZW5kU3RhdGVFdmVudCh0aGlzLl9yb29tSWQsIHJ1bGVUeXBlVG9TdGFibGUoa2luZCwgdHJ1ZSksIHt9LCBcInJ1bGU6XCIgKyBlbnRpdHkpO1xuICAgICAgICB0aGlzLl9ydWxlcyA9IHRoaXMuX3J1bGVzLmZpbHRlcihyID0+IHtcbiAgICAgICAgICAgIGlmIChyLmtpbmQgIT09IHJ1bGVUeXBlVG9TdGFibGUoa2luZCwgZmFsc2UpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChyLmVudGl0eSAhPT0gZW50aXR5KSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gd2UganVzdCBkZWxldGVkIHRoaXMgcnVsZVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1cGRhdGVMaXN0KCkge1xuICAgICAgICB0aGlzLl9ydWxlcyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IHJvb20gPSBNYXRyaXhDbGllbnRQZWcuZ2V0KCkuZ2V0Um9vbSh0aGlzLl9yb29tSWQpO1xuICAgICAgICBpZiAoIXJvb20pIHJldHVybjtcblxuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50VHlwZSBvZiBBTExfUlVMRV9UWVBFUykge1xuICAgICAgICAgICAgY29uc3QgZXZlbnRzID0gcm9vbS5jdXJyZW50U3RhdGUuZ2V0U3RhdGVFdmVudHMoZXZlbnRUeXBlLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBldiBvZiBldmVudHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWV2LmdldFN0YXRlS2V5KCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qga2luZCA9IHJ1bGVUeXBlVG9TdGFibGUoZXZlbnRUeXBlLCBmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBldi5nZXRDb250ZW50KClbJ2VudGl0eSddO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlY29tbWVuZGF0aW9uID0gZXYuZ2V0Q29udGVudCgpWydyZWNvbW1lbmRhdGlvbiddO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYXNvbiA9IGV2LmdldENvbnRlbnQoKVsncmVhc29uJ107XG4gICAgICAgICAgICAgICAgaWYgKCFlbnRpdHkgfHwgIXJlY29tbWVuZGF0aW9uIHx8ICFyZWFzb24pIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fcnVsZXMucHVzaChuZXcgTGlzdFJ1bGUoZW50aXR5LCByZWNvbW1lbmRhdGlvbiwgcmVhc29uLCBraW5kKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=